Index: /issm/oecreview/Archive/18296-19100/Date.tex
===================================================================
--- /issm/oecreview/Archive/18296-19100/Date.tex	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/Date.tex	(revision 19102)
@@ -0,0 +1,1 @@
+Feb-12-2015
Index: /issm/oecreview/Archive/18296-19100/ISSM-18297-18298.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18297-18298.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18297-18298.diff	(revision 19102)
@@ -0,0 +1,12183 @@
+Index: ../trunk-jpl/src/java/Changelog_1.0.0.txt
+===================================================================
+--- ../trunk-jpl/src/java/Changelog_1.0.0.txt	(revision 18297)
++++ ../trunk-jpl/src/java/Changelog_1.0.0.txt	(revision 18298)
+@@ -1,29 +0,0 @@
+-This is the changelog for Inishell release 1.0.0
+-	*editing existing ini file:
+-		+populate the GUI according to the values in an existing ini file
+-		+show progress bar while loading
+-		+Comments are preserved, nested template parameters properly handled, unknown keys are preserved
+-
+-	*usability improvements:
+-		+the file dialogs remember the last path they pointed to
+-		+add ".ini" extension when saving to a config file if necessary
+-		+new icons, hoping to make their meaning clearer
+-		+reset button on the GUI to revert to defaults
+-
+-	*layout improvements:
+-		+fixed help text horizontal alignements issues
+-		+the help text is now verticaly aligned with the top of the widget
+-		+Notion of hierarchy for an easier handling of layout issues
+-		+layout now consistent between Linux and Windows, still some small spacing differences with osX
+-		+possibility to group parameters in a frame with a frame title
+-
+-	*bug fixes:
+-		+default value in comboBox is honored
+-		+mandatory comboBox properly handled on osX
+-		+better help text handling
+-
+-	*others:
+-		+keys are printed in the order they appear on the GUI
+-		+code cleanup and optimizations
+-		+add version information in MANIFEST and title bar
+-		+clean up and reorganization in build.xml, add help and pack targets
+Index: ../trunk-jpl/src/java/dist/inishell.jar
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/doc/examples/min_example.xml
+===================================================================
+--- ../trunk-jpl/src/java/doc/examples/min_example.xml	(revision 18297)
++++ ../trunk-jpl/src/java/doc/examples/min_example.xml	(revision 18298)
+@@ -1,40 +0,0 @@
+-<inishell_config>
+-	<parameter key="SOME_PARAMETER" type="string">
+-		<section name="section1" />
+-		<section name="section2" />
+-		<help>
+-			This is a parameter that asks for a string value and that is present in
+-			both the section "section1" and "section2".
+-		</help>
+-	</parameter>
+-	
+-	<parameter key="NESTED_PARAMETERS" type="alternative" optional="false">
+-		<section name="section1" />
+-		<option value="NONE" type="string" />
+-		<option value="ONE" type="string">
+-			<parameter key="SOME_INTEGER" type="integer" 
+-				minimum="-1" maximum="10" default="2">
+-				<help>
+-					The value for this parameter may be an integer between -1 and 10.
+-					The default value is 2.
+-					The user may use the + and - buttons to increment/decrement 
+-					the number or type the number into the text field.</help>
+-				</parameter>
+-		</option>
+-		<option value="TWO" type="string">
+-			<reference name="a_group_that_can_be_referenced" />
+-			<help>Here is a reference to two parameters.</help>
+-		</option>
+-		<help>
+-			This parameter belongs to section1. 
+-			When the "null" option is selected, the dropdown menu appears
+-			red because this parameter is non-optional.
+-			When the value "ONE" is selected a nested parameter "SOME_INTEGER" appears. 
+-		</help>
+-	</parameter>
+-	
+-	<parametergroup name="a_group_that_can_be_referenced">
+-		<parameter key="SOME_FILE" type="file" />
+-		<parameter key="A_PATH" type="path" />
+-	</parametergroup>
+-</inishell_config>
+\ No newline at end of file
+Index: ../trunk-jpl/src/java/doc/examples/io.ini
+===================================================================
+--- ../trunk-jpl/src/java/doc/examples/io.ini	(revision 18297)
++++ ../trunk-jpl/src/java/doc/examples/io.ini	(revision 18298)
+@@ -1,180 +0,0 @@
+-[General]
+-PLUGINPATH	= ../../lib/plugins ;super
+-BUFF_CHUNK_SIZE = 30
+-BUFF_BEFORE	= 1.5
+-
+-[Input]
+-COORDSYS	= CH1903
+-TIME_ZONE	= 1
+-; COORDSYS	= PROJ4
+-; COORDPARAM	= 21781
+-
+-#reading ARC dem
+-DEM		= ARC
+-DEMFILE  	= ./input/surface-grids/Switzerland_1000m.asc
+-
+-#reading ARPS dem
+-; DEM		= ARPS
+-; DEMFILE 	= ./wgrt10r2_vw4.asc
+-; ARPS_X 	= 653400
+-; ARPS_Y 	= 112204
+-
+-#reading PGM image as dem
+-; DEM		= PGM
+-; DEMFILE	= ./Switzerland.pgm
+-; PGM_XCOORD	= 479500.
+-; PGM_YCOORD	= 73500.
+-; PGM_CELLSIZE	= 1000.
+-; PGM_MIN	= 193.
+-; PGM_MAX	= 4204.
+-
+-; LANDUSE	= ARC
+-; LANDUSEFILE	= ch_as97.asc
+-
+-#Alpine3D traditional inputs -> A3D plugin
+-; METEO		= A3D
+-; METEOPATH	= ./input/meteo
+-
+-#Borma
+-; METEO		= BORMA
+-; METEOPATH	= ./input/xml
+-; NROFSTATIONS	= 1
+-; STATION1	= 00.00.00.2
+-
+-#Snowpack input
+-; METEO		= SNOWPACK
+-; METEOPATH	= input
+-; METAFILE	= IMIS_Extracted_Info.txt ;metadata for all stations
+-; STATION1  	= MST96_RR.inp
+-
+-#SMET meteorological file format
+-METEO		= SMET
+-METEOPATH	= ./input/meteo
+-STATION1	= FLU2.smet
+-STATION2	= FIR2.smet
+-STATION3	= FRA2.smet
+-STATION4	= GLA2.smet
+-STATION5	= ILI2.smet
+-STATION6	= OTT2.smet
+-STATION7	= TUJ3.smet
+-
+-#IMIS network database input -> IMIS plugin
+-; METEO		= IMIS
+-; DBNAME		= sdbo
+-; DBUSER		= XXX
+-; DBPASS		= XXX
+-; NROFSTATIONS	= 4
+-; STATION1	= MORN2
+-; STATION2	= DAV3
+-; STATION3	= KLO2
+-; STATION4	= *SAM0
+-
+-#GEOtop traditional inputs -> GEOTOP plugin
+-; METEO		 = GEOTOP
+-; METEOPATH       = meteo/
+-; METEOPREFIX     = _meteo
+-
+-#GSN direct input -> GSN plugin
+-; METEO		= GSN
+-; ENDPOINT	= http://montblanc.slf.ch:22001/services/A3DWebService
+-; STATION1	= wan_sen14_2008
+-; STATION2	= wan2
+-
+-[Output]
+-COORDSYS	= CH1903
+-TIME_ZONE 	= 1
+-
+-GRID2D		= ARC
+-GRID2DPATH	= ./
+-
+-; GRID2D		= PNG
+-; GRID2DPATH	= ./
+-; PNG_MIN_SIZE	= 800x600
+-; PNG_WORLD_FILE	= true
+-; PNG_AUTOSCALE	= false
+-; PNG_SCALING	= nearest
+-
+-METEO		= SMET
+-METEOPATH	= ./
+-
+-[Filters]
+-TA::filter1	= min_max
+-TA::arg1	= 240 320
+-
+-RH::filter1	= min_max
+-RH::arg1 	= 0.01 1.2
+-RH::filter2	= min_max
+-RH::arg2	= soft 0.05 1.0
+-
+-HNW::filter1	= min
+-HNW::arg1	= -0.1
+-HNW::filter2	= min
+-HNW::arg2	= soft 0.
+-
+-ISWR::filter1	= min_max
+-ISWR::arg1	= -10. 1500.
+-ISWR::filter2	= min
+-ISWR::arg2	= soft 0.
+-
+-RSWR::filter1	= min_max
+-RSWR::arg1 	= -10 1500
+-RSWR::filter2	= min
+-RSWR::arg2	= soft 0
+-
+-#for TA between 240 and 320 K
+-ILWR::filter1	= min_max
+-ILWR::arg1	= 188 600
+-ILWR::filter2	= min_max
+-ILWR::arg2	= soft 200 400
+-
+-#we need to consider time with no snow -> TSS>0
+-#min(TSS) in db since 1998: -50C
+-TSS::filter1	= min_max
+-TSS::arg1	= 200 320
+-
+-#idem
+-TSG::filter1	= min_max
+-TSG::arg1	= 200 320
+-
+-HS::filter1	= min
+-HS::arg1	= soft 0.0
+-HS::filter2	= rate
+-HS::arg2	= 5.55e-5 ;0.20 m/h
+-
+-VW::filter1	= min_max
+-VW::arg1	= -2 70
+-VW::filter2	= min_max
+-VW::arg2	= soft 0.2 50.0
+-
+-[Interpolations1D]
+-WINDOW_SIZE	= 86400
+-
+-TA::resample	= linear
+-
+-RH::resample	= linear
+-
+-HS::resample	= linear
+-
+-VW::resample	= nearest_neighbour
+-VW::args	= extrapolate
+-
+-HNW::resample	= linear
+-
+-[Interpolations2D]
+-TA::algorithms	= IDW_LAPSE CST_LAPSE
+-TA::cst_lapse	= -0.008
+-TA::idw_lapse	= -0.008 soft
+-
+-RH::algorithms	= RH IDW_LAPSE CST
+-
+-HNW::algorithms	= IDW_LAPSE CST_LAPSE CST
+-HNW::cst_lapse	= 0.0005 frac
+-
+-VW::algorithms	= IDW_LAPSE CST
+-
+-P::algorithms	= STD_PRESS
+-
+-ILWR::algorithms = CST_LAPSE
+-ILWR::cst_lapse = -0.03125
+-
+-RSWR::algorithms = IDW CST
+Index: ../trunk-jpl/src/java/doc/examples/meteoio_config.xml
+===================================================================
+--- ../trunk-jpl/src/java/doc/examples/meteoio_config.xml	(revision 18297)
++++ ../trunk-jpl/src/java/doc/examples/meteoio_config.xml	(revision 18298)
+@@ -1,919 +0,0 @@
+-<inishell_config application="Meteo IO">
+-
+-	<!-- General Parameters -->
+-	<parameter key="BUFF_CHUNK_SIZE" type="integer" default="30">
+-		<section name="general" />
+-		<help>Size in days of a chunk of data to read at once.</help>
+-	</parameter>
+-
+-	<parameter key="BUFF_BEFORE" type="decimal" default="1.5">
+-		<section name="general" />
+-		<help>Alternate way of buffer centering: When rebuffering, the new date will be located BUFF_BEFORE days from the
+-		beginning of the buffer (therefore, it takes a value in days).</help>
+-	</parameter>
+-
+-	<!-- Coordinate systems, time zones -->
+-	<parameter key="COORDSYS" type="alternative" optional="false">
+-		<section name="input" />
+-		<section name="output" />
+-		<option value="CH1903" type="string" default="true">
+-			<help>coordinates in the Swiss Grid &lt;a href="http://geomatics.ladetto.ch/ch1903_wgs84_de.pdf"&gt;http://geomatics.ladetto.ch/ch1903_wgs84_de.pdf&lt;/a&gt;</help>
+-		</option>
+-		<option value="UTM" type="string">
+-			<parameter key="COORDPARAM" type="string">
+-				<help>specify the zone with the zone letter (for example, 32T)</help>
+-			</parameter>
+-			<help>UTM coordinates, see &lt;a href="http://www.oc.nps.edu/oc2902w/maps/utmups.pdf"&gt;http://www.oc.nps.edu/oc2902w/maps/utmups.pdf&lt;/a&gt;</help>
+-		</option>
+-		<option value="UPS" type="string">
+-			<parameter key="COORDPARAM" type="string">
+-				<help>specify the hemisphere (either N or S)</help>
+-			</parameter>
+-			<help>Universal Polar Stereographic coordinates, see &lt;a href="https://en.wikipedia.org/wiki/Universal_Polar_Stereographic_coordinate_system"&gt;https://en.wikipedia.org/wiki/Universal_Polar_Stereographic_coordinate_system&lt;/a&gt;</help>
+-		</option>
+-		<option value="PROJ4" type="string">
+-			<parameter key="COORDPARAM" type="string" optional="false" />
+-			<help>external library: see &lt;a href="http://trac.osgeo.org/proj/"&gt;http://trac.osgeo.org/proj/&lt;/a&gt;</help>
+-		</option>
+-		<option value="LOCAL"  type="string">
+-			<help>uses the horizontal and vertical distance from a reference point</help>
+-		</option>
+-		<help>coordinate system</help>
+-	</parameter>
+-
+-	<parameter key="TIME_ZONE" type="integer+" default="+1" maximum="14" minimum="-12" optional="false">
+-		<section name="input" />
+-		<section name="output" />
+-	</parameter>
+-
+-	<!-- Datatypes: special pts -->
+-	<parameter key="SPECIALPTS" type="alternative">
+-		<section name="input" />
+-		<option value="A3D" type="string">
+-			<parameter key="SPECIALPTSFILE" type="file" optional="false">
+-				<help>a path+file name to the a file containing grid coordinates of special points of interest (for special outputs)</help>
+-			</parameter>
+-		</option>
+-		<option value="SMET" type="string">
+-			<parameter key="SPECIALPTSFILE" type="file" optional="false">
+-				<help>a path+file name to the a file containing grid coordinates of special points of interest (for special outputs)</help>
+-			</parameter>
+-		</option>
+-	</parameter>
+-
+-	<!-- Datatypes: Meteo Data -->
+-	<parameter key="METEO" type="alternative">
+-		<section name="input" />
+-		<section name="output" />
+-
+-		<option value="A3D" type="string">
+-			<parameter key="METEOPATH" type="path" optional="false">
+-				<help>string containing the path to the meteorological files</help>
+-			</parameter>
+-		</option>
+-		<option value="BORMA" type="string">
+-			<section name="input" />
+-			<reference name="BORMA" />
+-		</option>
+-		<option value="COSMO" type="string">
+-			<parameter key="METEOPATH" type="path" optional="false">
+-				<help>string containing the path to the meteorological files</help>
+-			</parameter>
+-		</option>
+-		<option value="GEOTOP" type="string">
+-			<section name="input" />
+-			<reference name="GEOTOP_IN" />
+-		</option>
+-		<option value="GEOTOP" type="string">
+-			<section name="output" />
+-			<reference name="GEOTOP_OUT" />
+-		</option>
+-		<option value="GRIB" type="string">
+-			<section name="input" />
+-			<reference name="GRIB_METEO" />
+-		</option>
+-		<option value="GSN" type="string">
+-			<section name="input" />
+-			<reference name="GSN" />
+-		</option>
+-		<option value="IMIS" type="string">
+-			<section name="input" />
+-			<reference name="IMIS" />
+-		</option>
+-		<option value="SMET" type="string">
+-			<section name="input" />
+-			<reference name="SMET_IN" />
+-		</option>
+-		<option value="SMET" type="string">
+-			<section name="output" />
+-			<reference name="SMET_OUT" />
+-		</option>
+-		<option value="SNOWPACK" type="string">
+-			<section name="input" />
+-			<reference name="SNIO_IN" />
+-		</option>
+-		<option value="SNOWPACK" type="string">
+-			<section name="output" />
+-			<parameter key="METEOPATH" type="path" optional="false">
+-				<help>string representing path where SNOWPACK files should be saved</help>
+-			</parameter>
+-		</option>
+-
+-		<help>plugin for METEO data </help>
+-	</parameter>
+-
+-	<parameter key="Add Meteo parameter copy" type="selector">
+-		<section name="input"/>
+-		<parameter key="COPY::%" type="string" optional="false" template="true">
+-		  <help>The name of the parameter to copy (e.g. TA, RH, VW, ISWR, etc)</help>
+-		</parameter>
+-	</parameter>
+-
+-	<!-- Datatypes: DEM -->
+-	<frame key="dem_frame" label="Digital Elevation Model">
+-	<section name="input"/>
+-		<parameter key="DEM" type="alternative">
+-			<section name="input" />
+-			<option value="ARC" type="string">
+-				<parameter key="DEMFILE" type="file" optional="false">
+-					<help>For reading the data as a DEMObject</help>
+-				</parameter>
+-			</option>
+-			<option value="ARPS" type="string">
+-				<parameter key="DEMFILE" type="file" optional="false">
+-					<help>For reading the data as a DEMObject</help>
+-				</parameter>
+-				<parameter key="ARPS_XCOORD" type="decimal" optional="false">
+-					<help>x coordinate of the lower left corner of the grids</help>
+-				</parameter>
+-				<parameter key="ARPS_YCOORD" type="decimal" optional="false">
+-					<help>y coordinate of the lower left corner of the grids</help>
+-				</parameter>
+-			</option>
+-			<option value="GRASS" type="string">
+-				<parameter key="DEMFILE" type="file" optional="false">
+-					<help>For reading the data as a DEMObject</help>
+-				</parameter>
+-			</option>
+-			<option value="GRIB" type="string">
+-				<parameter key="DEMFILE" type="file" optional="false">
+-					<help>For reading the data as a DEMObject</help>
+-				</parameter>
+-				<parameter key="GRIB_DEM_UPDATE" type="alternative" optional="true">
+-					<option value="TRUE" type="string" />
+-					<option value="FALSE" type="string" />
+-					<help>recompute slope/azimuth from the elevations when reading a DEM (default=false, that is we use the slope and azimuth included in the GRIB file)</help>
+-				</parameter>
+-			</option>
+-			<option value="PGM" type="string">
+-				<parameter key="DEMFILE" type="file" optional="false">
+-					<help>For reading the data as a DEMObject</help>
+-				</parameter>
+-				<reference name="PGM_IN" />
+-			</option>
+-
+-			<help>plugin for Digital Elevation Model data </help>
+-		</parameter>
+-	</frame>
+-
+-	<!-- Datatypes: Landuse -->
+-	<parameter key="LANDUSE" type="alternative">
+-		<section name="input" />
+-		<option value="ARC" type="string">
+-			<parameter key="LANDUSEFILE" type="file" optional="false">
+-				<help>File containing a grid of landuse codes</help>
+-			</parameter>
+-		</option>
+-
+-		<help>plugin for land cover data </help>
+-	</parameter>
+-
+-	<!-- Datatypes: Grids -->
+-	<parameter key="GRID2D" type="alternative">
+-		<section name="input" />
+-		<section name="output" />
+-		<option value="ARC" type="string">
+-			<parameter key="GRID2DPATH" type="path" optional="false">
+-				<help>string representing path where grid files should be read from</help>
+-			</parameter>
+-			<reference name="ARC" />
+-		</option>
+-		<option value="ARPS" type="string">
+-			<section name="input" />
+-			<parameter key="GRID2DPATH" type="path" optional="false">
+-				<help>string representing path where grid files should be read from</help>
+-			</parameter>
+-			<reference name="ARPS" />
+-		</option>
+-		<option value="GRASS" type="string">
+-			<section name="input" />
+-			<parameter key="GRID2DPATH" type="path" optional="false">
+-				<help>string representing path where grid files should be read from</help>
+-			</parameter>
+-		</option>
+-		<option value="GRIB" type="string">
+-			<section name="input" />
+-			<parameter key="GRID2DPATH" type="path" optional="false">
+-				<help>string representing path where grid files should be read from</help>
+-			</parameter>
+-			<reference name="GRIB_GRIDS" />
+-		</option>
+-		<option value="PGM" type="string">
+-			<section name="input" />
+-			<parameter key="GRID2DPATH" type="path" optional="false">
+-				<help>string representing path where grid files should be read from</help>
+-			</parameter>
+-			<reference name="PGM_IN" />
+-		</option>
+-		<option value="PGM" type="string">
+-			<section name="output" />
+-			<parameter key="GRID2DPATH" type="path" optional="false">
+-				<help>string representing path where grid files should be read from</help>
+-			</parameter>
+-		</option>
+-		<option value="PNG" type="string">
+-			<section name="output" />
+-			<parameter key="GRID2DPATH" type="path" optional="false">
+-				<help>string representing path where grid files should be read from</help>
+-			</parameter>
+-			<reference name="PNG" />
+-		</option>
+-		<help>plugin for 2D gridded data </help>
+-	</parameter>
+-
+-	<!--Parameter group for list of stations -->
+-	<parametergroup name="stationgroup_files">
+-		<parameter key="STATION#" type="file" counter="1" optional="false">
+-			<help>filename for station number # </help>
+-		</parameter>
+-	</parametergroup>
+-	<parametergroup name="stationgroup_names">
+-		<parameter key="STATION#" type="string" counter="1" optional="false">
+-			<help>station id for the given station number # </help>
+-		</parameter>
+-	</parametergroup>
+-	<parametergroup name="stationgroup_pos">
+-		<parameter key="STATION#" type="string" counter="1">
+-			<help>Coordinates are given as "lat lon" or "xcoord ycoord epsg_code"</help>
+-		</parameter>
+-	</parametergroup>
+-
+-	<!-- Plugins for Meteo Data-->
+-	<parametergroup name="BORMA">
+-		<parameter key="METEOPATH" type="path" optional="false">
+-			<help>string containing the path to the xml files</help>
+-		</parameter>
+-		<reference name="stationgroup_names" />
+-	</parametergroup>
+-
+-	<parametergroup name="IMIS">
+-		<parameter key="DBNAME" type="string" optional="false">
+-			<help>database name, as provided by your database administrator</help>
+-		</parameter>
+-		<parameter key="DBUSER" type="string" optional="false">
+-			<help>database user name</help>
+-		</parameter>
+-		<parameter key="DBPASS" type="string" optional="false">
+-			<help>database password associated with the user name</help>
+-		</parameter>
+-		<parameter key="USEANETZ" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		  <help>OPTIONAL: use ANETZ stations to provide precipitations for normal IMIS stations.
+-		  Each IMIS station is associated with one or two ANETZ stations and does a weighted
+-		  average to get what should be its local precipitations</help>
+-		</parameter>
+-		<parameter key="USE_IMIS_HNW" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		  <help>OPTIONAL: if set to false (default), all IMIS precipitation will be deleted (since IMIS stations don't have heated rain gauges, their precipitation measurements are not good in winter conditions). If set to true, it is strongly advised to use a FilterHNWMelt filter to detect snow melting in the rain gauge and perform winter conditions detection in the application.</help>
+-		</parameter>
+-		<parameter key="USE_SNOWPACK_HNW" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		  <help>if set to true, the SNOWPACK simulated Snow Water Equivalent from the database will be used to compute HNW. Data gaps greater than 3 hours on SWE will lead to unchanged hnw while all data that can properly be computed will overwrite hnw. (default=false)</help>
+-		</parameter>
+-
+-		<reference name="stationgroup_names" />
+-	</parametergroup>
+-
+-	<parametergroup name="GRIB_METEO">
+-		<parameter key="METEOPATH" type="path" optional="false">
+-			<help>string containing the path to the grib files</help>
+-		</parameter>
+-		<parameter key="METEOEXT" type="string" optional="true">
+-			<help>grib file extension, or none for no file extension (default: .grb)</help>
+-		</parameter>
+-
+-		<reference name="stationgroup_pos" />
+-	</parametergroup>
+-
+-	<parametergroup name="GEOTOP_IN">
+-		<parameter key="METEOPATH" type="path" optional="false">
+-			<help>string containing the path to the data files</help>
+-		</parameter>
+-		<parameter key="METAFILE" type="file" optional="false">
+-			<help>absolute filename of the geotop.inpts file</help>
+-		</parameter>
+-		<parameter key="METEOPREFIX" type="string" optional="true">
+-			<help>prefix to append when generating a file name for reading</help>
+-		</parameter>
+-	</parametergroup>
+-
+-	<parametergroup name="GEOTOP_OUT">
+-		<parameter key="METEOPATH" type="path" optional="false">
+-			<help>string containing the path to the data files</help>
+-		</parameter>
+-		<parameter key="METEOSEQ" type="string" optional="false">
+-			<help>specifiy in which order the columns should be printed out</help>
+-		</parameter>
+-	</parametergroup>
+-
+-	<parametergroup name="GSN">
+-		<parameter key="ENDPOINT" type="string" optional="false">
+-			<help>webserver running GSN with its port number and full path. For example:
+-			http://montblanc.slf.ch:22001/services/A3DWebService</help>
+-		</parameter>
+-		<parameter key="PROXY" type="string" optional="true">
+-			<help>Should the connection go through a proxy? This is useful for servers
+-			filtering on domains but usually not necessary.</help>
+-		</parameter>
+-		<parameter key="PROXYPORT" type="string" optional="true" />
+-		<parameter key="PROXYUSER" type="string" optional="true" />
+-		<parameter key="PROXYPASS" type="string" optional="true" />
+-
+-		<reference name="stationgroup_names" />
+-	</parametergroup>
+-
+-	<parametergroup name="SMET_IN">
+-		<parameter key="METEOPATH" type="path" optional="false">
+-			<help>string containing the path to the smet files</help>
+-		</parameter>
+-		<reference name="stationgroup_files" />
+-	</parametergroup>
+-
+-	<parametergroup name="SMET_OUT">
+-		<parameter key="METEOPATH" type="path" optional="false">
+-			<help>string representing path where SMET files should be saved</help>
+-		</parameter>
+-		<parameter key="METEOPARAM" type="alternative">
+-		  <option value="ASCII" type="string" default="true">
+-		    <help>Write ASCII SMET files</help>
+-		  </option>
+-		  <option value="BINARY" type="string">
+-		    <help>Write BINARY SMET files</help>
+-		  </option>
+-		</parameter>
+-	</parametergroup>
+-
+-	<parametergroup name="SNIO_IN">
+-		<parameter key="METEOPATH" type="path" optional="false">
+-			<help>string containing the path to the SNOWPACK files</help>
+-		</parameter>
+-		<parameter key="METAFILE" type="file" optional="true">
+-			<help>filename of the meta data file (in METEOPATH)</help>
+-		</parameter>
+-
+-		<parameter key="NUMBER_MEAS_TEMPERATURES" type="integer+" minimum="0" default="0">
+-		  <help>the number of measured snow temperatures provided</help>
+-		</parameter>
+-
+-		<parameter key="NUMBER_OF_SOLUTES" type="integer+" minimum="0" default="0">
+-		  <help>the number of solutes for which input data are provided</help>
+-		</parameter>
+-
+-		<parameter key="RSWR_INP" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		</parameter>
+-		<parameter key="ISWR_INP" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		</parameter>
+-		<parameter key="VW_DRIFT" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		  <help>OPTIONAL: wind velocity to use for blowing and drifting snow is provided</help>
+-		</parameter>
+-		<parameter key="RHO_HN" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		  <help>OPTIONAL: measured new snow density is provided</help>
+-		</parameter>
+-
+-		<reference name="stationgroup_files" />
+-	</parametergroup>
+-
+-	<!-- Plugins for Gridded Data-->
+-	<parametergroup name="ARC">
+-		<parameter key="A3D_VIEW" type="alternative" optional="true">
+-			<option value="TRUE" type="string" />
+-			<option value="FALSE" type="string" />
+-			<help>generate names compatible with Alpine3D's grid viewer?</help>
+-		</parameter>
+-		<parameter key="GRID2DEXT" type="string" optional="true">
+-			<help>grid file extension, or none for no file extension (default: .asc)</help>
+-		</parameter>
+-	</parametergroup>
+-
+-	<parametergroup name="ARPS">
+-		<parameter key="ARPS_XCOORD" type="decimal" optional="false">
+-			<help>x coordinate of the lower left corner of the grids</help>
+-		</parameter>
+-		<parameter key="ARPS_YCOORD" type="decimal" optional="false">
+-			<help>y coordinate of the lower left corner of the grids</help>
+-		</parameter>
+-		<parameter key="GRID2DEXT" type="string" optional="true">
+-			<help>grid file extension, or none for no file extension (default: .asc)</help>
+-		</parameter>
+-	</parametergroup>
+-
+-	<parametergroup name="GRIB_GRIDS">
+-		<parameter key="GRID2DPREFIX" type="string" optional="true">
+-			<help>prefix to append when generating a file name for reading (ie: something like "laf" for Cosmo-Analysis-full domain)</help>
+-		</parameter>
+-		<parameter key="GRID2DEXT" type="string" optional="true">
+-			<help>grib file extension, or none for no file extension (default: .grb)</help>
+-		</parameter>
+-	</parametergroup>
+-
+-	<parametergroup name="PNG">
+-		<parameter key="PNG_WORLD_FILE" type="alternative" optional="true">
+-			<option value="TRUE" type="string" />
+-			<option value="FALSE" type="string" />
+-			<help>generate a world file for each output file? This file contains the geolocalization information</help>
+-		</parameter>
+-		<parameter key="PNG_LEGEND" type="alternative" optional="true">
+-			<option value="TRUE" type="string" />
+-			<option value="FALSE" type="string" />
+-			<help>generate a legend?</help>
+-		</parameter>
+-		<parameter key="PNG_AUTOSCALE" type="alternative" optional="true">
+-			<option value="TRUE" type="string" />
+-			<option value="FALSE" type="string" />
+-			<help>autoscale color scale?</help>
+-		</parameter>
+-		<parameter key="PNG_SCALING" type="alternative" optional="true">
+-			<option value="nearest" type="string" />
+-			<option value="bilinear" type="string" />
+-			<help>scaling algorithm (default=bilinear)</help>
+-		</parameter>
+-		<parameter key="PNG_MIN_SIZE" type="string" optional="false">
+-			<help>minimum dimensions of the PNG, like 640x480</help>
+-		</parameter>
+-		<parameter key="PNG_MAX_SIZE" type="string" optional="false">
+-			<help>maximum dimensions of the PNG, like 1024x768</help>
+-		</parameter>
+-		<parameter key="PNG_INDEXED" type="alternative" optional="true">
+-			<option value="TRUE" type="string" />
+-			<option value="FALSE" type="string" />
+-			<help>generate a color indexed file (default=true)</help>
+-		</parameter>
+-		<parameter key="PNG_SPEED_OPTIMIZE" type="alternative" optional="true">
+-			<option value="TRUE" type="string" />
+-			<option value="FALSE" type="string" />
+-			<help>optimize for speed (default=false)</help>
+-		</parameter>
+-		<parameter key="PNG_NR_LEVELS" type="integer+" default="+30" maximum="255" minimum="6" optional="true">
+-			<help>number of colors in the palette (default=30)</help>
+-		</parameter>
+-	</parametergroup>
+-
+-	<parametergroup name="PGM_IN">
+-		<parameter key="PGM_XCOORD" type="decimal" optional="false">
+-			<help>lower left x coordinate</help>
+-		</parameter>
+-		<parameter key="PGM_YCOORD" type="decimal" optional="false">
+-			<help>lower left y coordinate</help>
+-		</parameter>
+-		<parameter key="PGM_CELLSIZE" type="decimal" optional="false">
+-			<help>cellsize in meters</help>
+-		</parameter>
+-		<parameter key="PGM_MIN" type="decimal" optional="false">
+-			<help>minimum value in real world coordinates to match with the minimum value read out of the PGM file (such minimum being greater than 0 because 0 is NODATA)</help>
+-		</parameter>
+-		<parameter key="PGM_MAX" type="decimal" optional="false">
+-			<help>maximum value in real world coordinates to match with the maximum value read out of the PGM file</help>
+-		</parameter>
+-	</parametergroup>
+-
+-	<!-- Meteo Parameters for Filters, resampling, spatial interpolations-->
+-	<parametergroup name="METEOIOPARAMETERS">
+-		<option value="TA"/>
+-		<option value="RH"/>
+-		<option value="VW"/>
+-		<option value="DW"/>
+-		<option value="VW_MAX"/>
+-		<option value="ISWR"/>
+-		<option value="RSWR"/>
+-		<option value="ILWR"/>
+-		<option value="HS"/>
+-		<option value="HNW"/>
+-		<option value="TSG"/>
+-		<option value="TSS"/>
+-		<option value="P"/>
+-	</parametergroup>
+-
+-	<!-- Filters -->
+-	<parameter key="Add/Remove Filter" type="selector">
+-		<section name="filters" />
+-
+-		<parameter key="%::filter#" type="alternative" counter="1" template="true">
+-			<section name="filters" />
+-
+-			<option label="MeanAvg" value="mean_avg" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			    </help>
+-			  </parameter>
+-			  <help>Mean average processing. The mean average filter returns the mean value of all values within a user given time window.</help>
+-			</option>
+-
+-			<option label="MedianAvg" value="median_avg" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="decimal" minimum="0" />
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			    </help>
+-			  </parameter>
+-			  <help>Median average processing. The median average filter returns the median value of all values within a user given time window.</help>
+-			</option>
+-
+-			<option label="Std Deviation Filter" value="std_dev" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			    </help>
+-			  </parameter>
+-			  <help>Standard deviation filter. Values outside of mean ± 2 std_dev are rejected.</help>
+-			</option>
+-
+-			<option label="MAD" value="mad" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			    </help>
+-			  </parameter>
+-			  <help>Median Absolute Deviation. Values outside of median ± 3 σ_MAD are rejected. &lt;br&gt;
+-			  See http://en.wikipedia.org/wiki/Median_absolute_deviation for more information.</help>
+-			</option>
+-
+-			<option label="Tukey 53H Filter" value="Tukey" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <help>
+-			      The keyword "soft" maybe added, if the window position is allowed to be adjusted to the data present.
+-			      The two arguments may be preceded by the keywords "left", "center" or "right", indicating the window position.
+-			    </help>
+-			  </parameter>
+-			  <help>Tukey 53H method A smooth time sequence is generated from the median, substracted from the original signal and
+-			  compared with the standard deviation. see "Despiking Acoustic Doppler Velocimeter Data", Derek G. Goring and Vladimir
+-			  L. Nikora, Journal of Hydraulic Engineering, 128, 1, 2002 The deviation factor coeffecient is currently hard-coded as k=1.5. </help>
+-			</option>
+-
+-			<option label="Wind Averaging Filter" value="wind_avg" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			    </help>
+-			  </parameter>
+-			  <help>Wind vector averaging. This calculates the vector average over a user given time period. Each wind vector
+-			  within this period is added and the final sum is normalized by the number of vectors that have been added. </help>
+-			</option>
+-
+-			<option label="Exponential Smoothing" value="exp_smoothing" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <option label="alpha:" value="0.8" type="decimal" minimum="0" maximum="1"/>
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			      Alpha needs to be provided as last argument. Please note that the standard filter works with a left window!
+-			    </help>
+-			  </parameter>
+-			  <help>Exponential smooting processing, exponential moving average s_0 = x_0 s_n = alpha*x_(t-1) + (1-alpha)*s_t-1</help>
+-			</option>
+-
+-			<option label="Weighted Moving Average Smoothing" value="wma_smoothing" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			      Please note that the standard filter works with a left window!
+-			    </help>
+-			  </parameter>
+-			  <help>Weighted moving average smoothing such as: WMA = (1*X1 + 2*X2 + ... + n*Xn) / sum_of_weights</help>
+-			</option>
+-
+-			<option label="Min Range Filter" value="min" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option label="Min:" value="" type="decimal" />
+-			    <option label="Adjust to:" value="" type="decimal" />
+-			    <help>The keyword "soft" maybe added, in such a case all data smaller than the min would be
+-			    assigned the minimum permissible value or another value given as an extra argument</help>
+-			  </parameter>
+-			  <help>Min range filter. Reject all values smaller than the min.</help>
+-			</option>
+-
+-			<option label="Max Range Filter" value="max" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option label="Max:" value="" type="decimal" />
+-			    <option label="Adjust to:" value="" type="decimal" />
+-			    <help>The keyword "soft" maybe added, in such a case all data greater than the max would be
+-			    assigned the maximum permissible value or another value given as an extra argument</help>
+-			  </parameter>
+-			  <help>Max range filter. Reject all values greater than the max.</help>
+-			</option>
+-
+-			<option label="MinMax (2 or 4 arguments)" value="min_max" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option label="Min:" value="" type="decimal" />
+-			    <option label="Max:" value="" type="decimal" />
+-			    <option label="Min adjust to:" value="" type="decimal" />
+-			    <option label="Max adjust to:" value="" type="decimal" />
+-			    <help>The keyword "soft" maybe added, in such a case all data greater than the max would be assigned
+-			    the maximum permissible value and all data smaller than the min would be assigned the minimum
+-			    permissible value or an optional extra set of two user provided values</help>
+-			  </parameter>
+-			  <help>Reject all values greater than the max or smaller than the min. &lt;br&gt;</help>
+-			</option>
+-
+-			<option label="Rate Filter (1 argument)" value="rate" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option label="Max:" value="1.0" type="decimal" minimum="0" maximum="1" />
+-			    <help>the absolute value of the maximum permissible rate of change (per seconds)</help>
+-			  </parameter>
+-			  <help>Rate of change filter. Calculate the change rate (ie: slope) between two points, if it is above a user given value, reject the point.</help>
+-			</option>
+-
+-			<option label="Rate Filter (2 arguments)" value="rate" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option label="Min:" value="0.0" type="decimal" minimum="0" maximum="1" />
+-			    <option label="Max:" value="1.0" type="decimal" minimum="0" maximum="1" />
+-			    <help>the minimum and maximum permissible rate of change (per second)</help>
+-			  </parameter>
+-			  <help>Rate of change filter. Calculate the change rate (ie: slope) between two points, if it is above a user given value, reject the point.</help>
+-			</option>
+-
+-			<option label="Unheated Rain Gauge Filter" value="Unheated_RainGauge" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option label="RH threshold:" value="0.5" type="decimal" minimum="0" maximum="1" />
+-			    <option label="Delta_T threshold:" value="3.0" type="decimal" minimum="0" maximum="20" />
+-			  </parameter>
+-			  <help>Filters out snow melting in an unheated rain gauge. This filter can ONLY be applied to precipitation. Non-zero measurements are accepted only if they take place when the relative humidity is greater than RH_threshold and (TA-TSS) smaller than Delta_T_threshold, otherwise they get reset to 0. If none of these conditions could be tested (for lack of data), then the precipitation is reset to nodata (or left unchanged if "soft" has been selected).</help>
+-			</option>
+-
+-			<option label="WMO Undercatch Filter" value="undercatch_wmo" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-				<option value="Gage type" type="dropdown">
+-					<option value="Nipher" type="string" />
+-					<option value="Tretyakov" type="string" />
+-					<option value="US8sh" type="string" />
+-					<option value="US8unsh" type="string" />
+-					<option value="Hellmann" type="string" />
+-					<option value="Hellmannsh" type="string" />
+-				</option>
+-			  </parameter>
+-			  <help>This implements the standard methods for precipitation correction as described in "WMO Solid Precipitation Measurement Intercomparison", B. Goodison, P. Louie and D. Yang, 872, 1998 as well as the overview given by "Literature Study on the Correction of Precipitation Measurements", Annette Wagner, 2009. The correction parameters for the shielded Hellmann gauge (German version) are from "Wind-induced Precipitation Undercatch of the Hellmann Gauges", Daqing Yang et al, Nordic Hydrology, 30, 1999, pp 57-80.</help>
+-			</option>
+-
+-			<option label="WMO Undercatch Filter - simplified" value="undercatch_wmo" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-				<option value="Kind" type="dropdown">
+-					<option value="Cst" type="string" />
+-				</option>
+-				<option label="Snow factor:" value="1.3" type="decimal" minimum="0" maximum="5" />
+-				<option label="Mixed prec factor:" value="1.1" type="decimal" minimum="0" maximum="5" />
+-			  </parameter>
+-			  <help>This applies a constant correction factor to the precipitation, one for pure snow and one for mixed precipitation. The following thresholds are used: pure snow below -2 C; mixed precipitation between -2 and +2 C; pure rain above 2 C. These threshold can be changed (see online documentation).</help>
+-			</option>
+-
+-			<option label="Unventillated temperature sensor" value="Unventilated_T" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option label="albedo:" value="0.23" type="decimal" />
+-			    <option value="soft" type="choice" />
+-			    <help>If the "soft" option is given, the albedo has a value different according to snow (or no snow) on the ground</help>
+-			  </parameter>
+-			  <help>This implements the correction described in (Reina Nakamura, 2005) with an albedo dependency as introduced in (Huwald, 2009)</help>
+-			</option>
+-
+-			<option label="Add an offset" value="add" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-				<option label="offset:" value="0." type="decimal" />
+-			  </parameter>
+-			  <help>This adds a given offset to the data.</help>
+-			</option>
+-
+-			<option label="Multiply by a factor" value="mult" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-				<option label="factor:" value="1." type="decimal" />
+-			  </parameter>
+-			  <help>This multiplies the data by a given factor.</help>
+-			</option>
+-
+-		</parameter>
+-
+-		<reference name="METEOIOPARAMETERS" />
+-	</parameter>
+-
+-	<!-- 1D Interpolation -->
+-	<parameter key="WINDOW_SIZE" type="integer+" minimum="1" default="43200">
+-		<section name="Interpolations1D" />
+-		<help>Affects resampling: expresses (in seconds) how far a valid point can be
+-		searched for when re-interpolating a missing value</help>
+-	</parameter>
+-
+-	<parameter key="Add/Remove 1D Interpolation" type="selector">
+-		<section name="Interpolations1D" />
+-
+-		<parameter key="%::resample" type="alternative" template="true">
+-			<section name="Interpolations1D" />
+-			<option label="No Interpolation" value="none" type="string" />
+-			<option label="Nearest Neighbour" value="nearest_neighbour" type="string" />
+-			<option label="Linear" value="linear" type="string">
+-			  <parameter key="%::args" type="combination">
+-			    <option value="extrapolate" type="choice" />
+-			    <help>
+-			      If "extrapolate" is added, then data *outside* of the original date range can be interpolated.
+-			      Otherwise, a data point will only be calculated between the original date range.
+-			    </help>
+-			  </parameter>
+-			  <help>Mean average processing. The mean average filter returns the mean value of all values within a user given time window.</help>
+-			</option>
+-			<option label="Accumulate" value="accumulate" type="string">
+-			  <parameter key="%::args" type="combination">
+-			    <option value="strict" type="choice" />
+-			    <option label="Seconds:" value="900" type="integer" minimum="1" />
+-			    <help>Accumulation period (in seconds). This must usually match the model time step. if enabling "strict", nodatas will propagate (ie. a single nodata in the input will force the re-accumulated value to be nodata). Otherwise, all valid values are aggregated and only pure nodata intervals produce a nodata in the output.</help>
+-			  </parameter>
+-			  <help>Accumulation over a user given period (filter argument, in seconds -
+-			  should coincide with your calculation step!).</help>
+-			</option>
+-		</parameter>
+-
+-		<reference name="METEOIOPARAMETERS" />
+-	</parameter>
+-
+-	<!-- 2D Interpolation -->
+-	<parameter key="Add/Remove 2D Interpolation" type="selector">
+-		<section name="Interpolations2D" />
+-
+-		<parameter key="%::algorithms" type="choice" template="true">
+-			<section name="Interpolations2D" />
+-			<option value="STD_PRESS" type="choice">
+-				<help>Generate a standard atmosphere pressure as a function of the cell's elevation</help>
+-			</option>
+-			<option value="CST" type="choice">
+-				<help>Fill the grid with the average over all the stations</help>
+-			</option>
+-			<option value="CST_LAPSE" type="choice">
+-			  <parameter key="%::cst_lapse" type="combination">
+-			    <option label="Lapse Rate:" value="0.008" type="decimal" optional="false" />
+-			    <option value="" type="dropdown">
+-			      <option value="" type="string" />
+-			      <option value="soft" type="string" />
+-			      <option value="frac" type="string" />
+-			    </option>
+-			  </parameter>
+-			  <help>Detrend the measured data, fill the grid with the average over all the stations, reapply the elevation trend</help>
+-			</option>
+-			<option value="IDW" type="choice">
+-				<help>Inverse Distance Weighted average</help>
+-			</option>
+-			<option value="IDW_LAPSE" type="choice">
+-			  <parameter key="%::idw_lapse" type="combination">
+-			    <option label="Lapse Rate:" value="0.008" type="decimal" optional="false" />
+-			    <option value="" type="dropdown">
+-			      <option value="" type="string" />
+-			      <option value="soft" type="string" />
+-			      <option value="frac" type="string" />
+-			    </option>
+-			  </parameter>
+-			  <help>Detrend the measured data, apply Inverse Distance Weighted average, reapply elevation trend</help>
+-			</option>
+-			<option value="LIDW_LAPSE" type="choice">
+-			  <parameter key="%::lidw_lapse" type="combination">
+-			    <option label="Lapse Rate:" value="0.008" type="decimal" optional="false" />
+-			    <option value="" type="dropdown">
+-			      <option value="" type="string" />
+-			      <option value="soft" type="string" />
+-			      <option value="frac" type="string" />
+-			    </option>
+-			  </parameter>
+-			  <help>Same as IDW_LAPSE, but only considering a given number of neighboring stations</help>
+-			</option>
+-			<option value="RH" type="choice">
+-				<help>Computes the dew point temperature, distribute it with IDW_LAPSE, recompute RH at each pixel</help>
+-			</option>
+-			<option value="ILWR" type="choice">
+-				<help>Compute emissivity, distribute it with IDW_LAPSE, recompute ILWR at each pixel</help>
+-			</option>
+-			<option value="WIND_CURV" type="choice">
+-				<help>Distribute wind velocity with IDW_LAPSE, then apply correction factors as a function of local slope and curvature</help>
+-			</option>
+-			<option value="HNW_SNOW" type="choice">
+-				<parameter key="%::hnw_snow" type="combination">
+-				<option value="IDW_LAPSE" type="dropdown">
+-					<option value="CST" type="string" />
+-					<option value="CST_LAPSE" type="string" />
+-					<option value="IDW" type="string" />
+-					<option value="IDW_LAPSE" type="string" />
+-					<option value="ODKRIG" type="string" />
+-				</option>
+-				<help>Base algorithm (do not forget to add the options for the base algorithm)</help>
+-				</parameter>
+-				<help>Distribute precipitation with a base algorithm (IDW_LAPSE by default), then reduce/remove precipitation on
+-				steep slopes and correct with the local curvature. This is to simulate snow redistribution processes.</help>
+-			</option>
+-			<option value="USER" type="choice">
+-			  <parameter key="%::user" type="path" optional="false"/>
+-			  <help>User provided grids, named as {numeric date}_{capitalized meteo parameter}.asc</help>
+-			</option>
+-			<option value="ODKRIG" type="choice">
+-			  <parameter key="%::odkrig" type="combination">
+-			  	<option value="" type="dropdown">
+-					<option value="LINVARIO" type="string" />
+-					<option value="EXPVARIO" type="string" />
+-					<option value="SPHERICVARIO" type="string" />
+-					<option value="RATQUADVARIO" type="string" />
+-				</option>
+-				<help>Variogram model</help>
+-			  </parameter>
+-			  <help>Ordinary kriging (EXPERIMENTAL)</help>
+-			</option>
+-		</parameter>
+-
+-		<reference name="METEOIOPARAMETERS" />
+-	</parameter>
+-</inishell_config>
+\ No newline at end of file
+Index: ../trunk-jpl/src/java/doc/examples/snowpack_config.xml
+===================================================================
+--- ../trunk-jpl/src/java/doc/examples/snowpack_config.xml	(revision 18297)
++++ ../trunk-jpl/src/java/doc/examples/snowpack_config.xml	(revision 18298)
+@@ -1,1084 +0,0 @@
+-<inishell_config application="SNOWPACK">
+-	<!-- <include path="doc/examples/meteoio_config.xml" /> -->
+-
+-	<!-- General Parameters -->
+-	<parameter key="BUFF_CHUNK_SIZE" type="integer" default="30">
+-		<section name="general" />
+-		<help>Size in days of a chunk of data to read at once.</help>
+-	</parameter>
+-
+-	<parameter key="BUFF_BEFORE" type="decimal" default="1.5">
+-		<section name="general" />
+-		<help>Alternate way of buffer centering: When rebuffering, the new date will be located BUFF_BEFORE days from the
+-		beginning of the buffer (therefore, it takes a value in days).</help>
+-	</parameter>
+-
+-	<!-- Coordinate systems, time zones -->
+-	<parameter key="COORDSYS" type="alternative" optional="false">
+-		<section name="input" />
+-		<section name="output" />
+-		<option value="CH1903" type="string">
+-			<help>coordinates in the Swiss Grid &lt;a href="http://geomatics.ladetto.ch/ch1903_wgs84_de.pdf"&gt;http://geomatics.ladetto.ch/ch1903_wgs84_de.pdf&lt;/a&gt;</help>
+-		</option>
+-		<option value="UTM" type="string">
+-			<parameter key="COORDPARAM" type="string">
+-				<help>specify the zone with the zone letter (for example, 32T)</help>
+-			</parameter>
+-			<help>UTM coordinates, see &lt;a href="http://www.oc.nps.edu/oc2902w/maps/utmups.pdf"&gt;http://www.oc.nps.edu/oc2902w/maps/utmups.pdf&lt;/a&gt;</help>
+-		</option>
+-		<option value="UPS" type="string">
+-			<parameter key="COORDPARAM" type="string">
+-				<help>specify the hemisphere (either N or S)</help>
+-			</parameter>
+-			<help>Universal Polar Stereographic coordinates, see &lt;a href="https://en.wikipedia.org/wiki/Universal_Polar_Stereographic_coordinate_system"&gt;https://en.wikipedia.org/wiki/Universal_Polar_Stereographic_coordinate_system&lt;/a&gt;</help>
+-		</option>
+-		<option value="PROJ4" type="string">
+-			<parameter key="COORDPARAM" type="string" optional="false" />
+-			<help>external library: see &lt;a href="http://trac.osgeo.org/proj/"&gt;http://trac.osgeo.org/proj/&lt;/a&gt;</help>
+-		</option>
+-		<option value="LOCAL"  type="string">
+-			<help>uses the horizontal and vertical distance from a reference point</help>
+-		</option>
+-		<help>coordinate system</help>
+-	</parameter>
+-
+-	<parameter key="TIME_ZONE" type="integer+" default="+1" maximum="14" minimum="-12" optional="false">
+-		<section name="input" />
+-		<section name="output" />
+-	</parameter>
+-
+-	<!-- Datatypes: Meteo Data -->
+-	<frame key="meteo_frame" label="Meteorological Data">
+-	<section name="input"/>
+-	<parameter key="METEO" type="alternative" optional="false">
+-		<section name="input" />
+-
+-		<option value="A3D" type="string">
+-			<parameter key="METEOPATH" type="path" optional="false">
+-				<help>string containing the path to the meteorological files</help>
+-			</parameter>
+-		</option>
+-		<option value="BORMA" type="string">
+-			<section name="input" />
+-			<reference name="BORMA" />
+-		</option>
+-		<option value="COSMO" type="string">
+-			<parameter key="METEOPATH" type="path" optional="false">
+-				<help>string containing the path to the meteorological files</help>
+-			</parameter>
+-		</option>
+-		<option value="GEOTOP" type="string">
+-			<section name="input" />
+-			<reference name="GEOTOP_IN" />
+-		</option>
+-		<option value="GRIB" type="string">
+-			<section name="input" />
+-			<reference name="GRIB_METEO" />
+-		</option>
+-		<option value="GSN" type="string">
+-			<section name="input" />
+-			<reference name="GSN" />
+-		</option>
+-		<option value="IMIS" type="string">
+-			<section name="input" />
+-			<reference name="IMIS" />
+-		</option>
+-		<option value="SMET" type="string">
+-			<section name="input" />
+-			<reference name="SMET_IN" />
+-		</option>
+-		<option value="SNOWPACK" type="string">
+-			<section name="input" />
+-			<reference name="SNIO_IN" />
+-		</option>
+-
+-		<help>plugin for METEO data </help>
+-	</parameter>
+-	<parameter key="Add Meteo parameter copy" type="selector">
+-		<section name="input"/>
+-		<parameter key="COPY::%" type="string" optional="false" template="true">
+-			<help>The name of the parameter to copy (e.g. TA, RH, VW, ISWR, etc)</help>
+-		</parameter>
+-		<help>Copy a meteo parameter into a new one (you should not need this)</help>
+-	</parameter>
+-	</frame>
+-
+-	<!-- Extra Input Parameters -->
+-	<frame key="snow_frame" label="Initial Snow Profiles">
+-	<section name="input"/>
+-	<parameter key="SNOWPATH" type="path" default="./current_snow">
+-		<section name="input" />
+-		<help>Path to the land surface and snow input parameters</help>
+-	</parameter>
+-	<parameter key="SNOW" type="alternative" default="SMET" optional="true">
+-		<section name="input" />
+-		<option value="SNOWPACK" type="string" />
+-		<option value="SMET" type="string" />
+-		<help>Plugin to use for reading SNO data</help>
+-	</parameter>
+-	<parameter key="SNOWFILE#" type="file" counter="1" optional="false">
+-		<section name="input" />
+-		<help>file name for the initial profile for station number #</help>
+-	</parameter>
+-	<!-- <parameter key="NUMBER_OF_SOLUTES" type="integer" default="0" minimum="0" maximum="0">
+-		<section name="input" />
+-		<help>SNOWPACK can transport an arbitrary number of trace components in its snow and water phases [special use]</help>
+-	</parameter> -->
+-	</frame>
+-
+-	<!-- Output Parameters -->
+-	<parameter key="METEOPATH" type="path" default="./output">
+-		<section name="output" />
+-		<help>Path to the outputs (this path MUST exist, it won't be created)</help>
+-	</parameter>
+-	<parameter key="EXPERIMENT" type="string" optional="false">
+-		<section name="output" />
+-		<help>Option to give an additional simulation specific output name to the run in addition to "STATION_NAME")</help>
+-	</parameter>
+-	<frame key="TS_frame" label="Time Series">
+-	<section name="output"/>
+-	<parameter key="TS_WRITE" type="alternative" optional="false">
+-		<section name="output" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Write meteo data out?</help>
+-	</parameter>
+-	<parameter key="TS_START" type="decimal" default="0" minimum="0" maximum="360">
+-		<section name="output" />
+-		<help>When to start writing meteo data out (offset, in days)</help>
+-	</parameter>
+-	<parameter key="TS_DAYS_BETWEEN" type="decimal" default="4.1666e-2" minimum="0" maximum="360">
+-		<section name="output" />
+-		<help>How often to write meteo data out (in days: 3 hours=.125, 1 hour=4.1666e-2)</help>
+-	</parameter>
+-	<parameter key="AVGSUM_TIME_SERIES" type="alternative" default="TRUE" optional="true">
+-		<section name="output" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>If AVGSUM_TIME_SERIES is set, mean fluxes and cumulated masses since last dump are written, else current energy fluxes, cumulated masses over last COMPUTATION_STEP_LENGTH (recommended setting in operational mode).</help>
+-	</parameter>
+-	<parameter key="CUMSUM_MASS" type="alternative" default="TRUE" optional="true">
+-		<section name="output" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>If CUMSUM_MASS is set, current value of cumulated masses since begin of run are dumped. Precipitations (rain and snow, rain) are always dumped as rates (kg m-2 h-1).</help>
+-	</parameter>
+-	<parameter key="PRECIP_RATES" type="alternative" optional="true" default="TRUE">
+-		<section name="output" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Write precipitation as rates (kg m-2 h-1, default) or as sums over the output time step. Please note that the units label in the output file and in SN_GUI &lt;b&gt;will remain kg m-2 h-1&lt;/b&gt; and will therefore not match sums.</help>
+-	</parameter>
+-	</frame>
+-	<frame key="profiles_frame" label="Snow Profiles">
+-	<section name="output"/>
+-	<parameter key="PROFILE" type="alternative" default="ASCII" optional="false">
+-		<section name="output" />
+-		<option value="ASCII" type="string" />
+-		<option value="IMIS" type="string" />
+-		<option value="ASCII IMIS" type="string" />
+-		<help>How to write the profiles (default: ASCII)</help>
+-	</parameter>
+-	<parameter key="PROF_WRITE" type="alternative" optional="false">
+-		<section name="output" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Write profile data out?</help>
+-	</parameter>
+-	<parameter key="PROF_START" type="decimal" default="0" minimum="0" maximum="360">
+-		<section name="output" />
+-		<help>When to start writing profile data out (offset, in days)</help>
+-	</parameter>
+-	<parameter key="PROF_DAYS_BETWEEN" type="decimal" default="4.1666e-2" minimum="0" maximum="360">
+-		<section name="output" />
+-		<help>How often to write profile data out (in days: 3 hours=.125, 1 hour=4.1666e-2)</help>
+-	</parameter>
+-	<parameter key="HARDNESS_IN_NEWTON" type="alternative" default="true">
+-		<section name="output" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Write the hand hardness in newtons (default) or as index</help>
+-	</parameter>
+-	<parameter key="CLASSIFY_PROFILE" type="alternative" default="false">
+-		<section name="output" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Classify the profile (default=false)? This is according to Schweizer, J. and M. Luetschg, &lt;i&gt;Characteristics of human-triggered avalanches&lt;/i&gt;, 2001, Cold Reg. Sci. Technol. &lt;b&gt;33&lt;/b&gt;(2-3)</help>
+-	</parameter>
+-	</frame>
+-	<frame key="sno_frame" label="Status files">
+-	<section name="output"/>
+-	<parameter key="SNOW" type="alternative" default="SMET" optional="true">
+-		<section name="output" />
+-		<option value="SNOWPACK" type="string" />
+-		<option value="SMET" type="string" />
+-		<help>Plugin to use for reading SNO data</help>
+-	</parameter>
+-	<parameter key="BACKUP_DAYS_BETWEEN" type="decimal" default="365" minimum="0">
+-		<section name="output" />
+-		<help>Dump snow files every BACKUP_DAYS_BETWEEN days</help>
+-	</parameter>
+-	<parameter key="FIRST_BACKUP" type="decimal" default="400" minimum="0">
+-		<section name="output" />
+-		<help>First dump of sno files happens at end of run or after FIRST_BACKUP days, whichever happens first</help>
+-	</parameter>
+-	</frame>
+-
+-	<frame key="switch_frame" label="Outputs Selection">
+-	<section name="output"/>
+-	<parameter key="OUT_CANOPY" type="alternative" default="FALSE" optional="true">
+-		<section name="output" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Write canopy data out? To be set to TRUE only if CANOPY=TRUE</help>
+-	</parameter>
+-	<parameter key="OUT_HAZ" type="alternative" default="TRUE" optional="true">
+-		<section name="output" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Write hazard data out? This must be FALSE for Alpine3D</help>
+-	</parameter>
+-	<parameter key="OUT_HEAT" type="alternative" default="TRUE" optional="true">
+-		<section name="output" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Write turbulent fluxes out?</help>
+-	</parameter>
+-	<parameter key="OUT_T" type="alternative" default="TRUE" optional="true">
+-		<section name="output" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Write snow/soil temperatures out?</help>
+-	</parameter>
+-	<!-- <parameter key="OUT_LOAD" type="alternative" default="FALSE" optional="true">
+-		<section name="output" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Write solutes load data out?</help>
+-	</parameter> -->
+-	<parameter key="OUT_LW" type="alternative" default="TRUE" optional="true">
+-		<section name="output" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Write long wave radiation out?</help>
+-	</parameter>
+-	<parameter key="OUT_SW" type="alternative" default="TRUE" optional="true">
+-		<section name="output" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Write short wave radiation out?</help>
+-	</parameter>
+-	<parameter key="OUT_MASS" type="alternative" default="TRUE" optional="true">
+-		<section name="output" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Write mass balance terms out?</help>
+-	</parameter>
+-	<parameter key="OUT_METEO" type="alternative" default="TRUE" optional="true">
+-		<section name="output" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Write meteo parameters out?</help>
+-	</parameter>
+-	<parameter key="OUT_STAB" type="alternative" default="TRUE" optional="true">
+-		<section name="output" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Write stability parameters out?</help>
+-	</parameter>
+-	</frame>
+-
+-
+-	<!-- Snowpack Parameters -->
+-	<frame key="sn_parameters_frame" label="Model Parameters">
+-	<section name="Snowpack"/>
+-	<parameter key="CALCULATION_STEP_LENGTH" type="decimal" default="15" minimum="5" maximum="180">
+-		<section name="Snowpack" />
+-		<help>Internal time step (in minutes) used for model simulation. Please note that this MUST be the same as HNW::accumulate (the latter being in seconds) if re-acumulating precipitation, otherwise it would lead to wrong results.</help>
+-	</parameter>
+-	<parameter key="ROUGHNESS_LENGTH" type="decimal" default="0.002">
+-		<section name="Snowpack" />
+-		<help>Aerodynamic roughness length as a parameter for the Monin-Obukhov bulk formulation; A typical value for complex terrain is 0.01 m and for snow covered flat sites 0.001 m.</help>
+-	</parameter>
+-	<parameter key="HEIGHT_OF_METEO_VALUES" type="decimal" default="5.0">
+-		<section name="Snowpack" />
+-		<help>The instrument height (or model layer height) for meteorological input data except for wind, which may be at a different height; note that height is above ground for a standard SNOWPACK application but above surface (snow or ground) for Alpine3D applications.</help>
+-	</parameter>
+-	<parameter key="HEIGHT_OF_WIND_VALUE" type="decimal" default="5.0">
+-		<section name="Snowpack" />
+-		<help>The instrument height (or model layer height) for wind input data; note that height is above ground for a standard SNOWPACK application but above surface (snow or ground) for Alpine3D applications</help>
+-	</parameter>
+-	</frame>
+-	<frame key="sn_switch_frame" label="Models Selection">
+-	<section name="Snowpack"/>
+-	<parameter key="ENFORCE_MEASURED_SNOW_HEIGHTS" type="alternative" optional="false">
+-		<section name="Snowpack" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Input mode by which a measurement of snow depth is used to drive the snow cover mass balance</help>
+-	</parameter>
+-	<parameter key="SW_MODE" type="integer" default="0" minimum="0" maximum="2" optional="false">
+-		<section name="Snowpack" />
+-		<help>Define the shortwave radiation input: &lt;ol&gt; &lt;li value="0"&gt;Incoming shortwave radiation is measured and albedo estimated by the model;&lt;/li&gt; &lt;li&gt;Reflected shortwave radiation is available as input and albedo is estimated by the model (IMIS standard);&lt;/li&gt; &lt;li&gt;Incoming and reflected shortwave radiation are both measured and the albedo is estimated from both measurements subject to plausibility checks.&lt;/li&gt; &lt;/ol&gt;</help>
+-	</parameter>
+-	<parameter key="NEUTRAL" type="integer" default="1" minimum="-1" maximum="1" optional="false">
+-		<section name="Snowpack" />
+-		<help>Select the atmospheric stability correction model:&lt;ol&gt; &lt;li value="-1"&gt; use a simplified Richardson number stability correction;&lt;/li&gt; &lt;li&gt;assume standard Monin-Obukhov bulk formulation for surface exchange iteration with Paulson, Stearns and Weidner (can be used with BC_CHANGE=0); &lt;/li&gt; &lt;li&gt; force Monin-Obukhov formulation to assume neutral conditions regardless of the actual stratification; it has been shown to work well in complex terrain settings. It should be used with BC_CHANGE=1, i.e., Dirichlet bc but also is recommended with Neumann b.c., i.e., BC_CHANGE=0.&lt;/li&gt; &lt;/ol&gt;</help>
+-	</parameter>
+-	<parameter key="CANOPY" type="alternative" default="FALSE" optional="false">
+-		<section name="Snowpack" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Switch to tell the model that canopy is present (note that Canopy parameters should then be provided in the *.sno file)</help>
+-	</parameter>
+-	<parameter key="MEAS_TSS" type="alternative" default="TRUE" optional="false">
+-		<section name="Snowpack" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>A measured surface temperature is available and can be reliably used for various consistency tests (it needs to be set to true if enabling CHANGE_BC).</help>
+-	</parameter>
+-	<parameter key="CHANGE_BC" type="alternative" optional="false">
+-		<section name="Snowpack" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Use measured surface temperature as Dirichlet temperature BC for sub-freezing snowpacks and switch to Neumann only for melting snowpacks. If set to false, assumes Neumann boundary conditions.</help>
+-	</parameter>
+-	<parameter key="THRESH_CHANGE_BC" type="decimal" default="-1.3">
+-		<section name="Snowpack" />
+-		<help>Threshold value (small number below freezing), which switches from Dirichlet to Neumann BCs if CHANGE_BC is selected</help>
+-	</parameter>
+-	</frame>
+-	<frame key="sn_slopes_frame" label="Virtual slopes">
+-	<section name="Snowpack"/>
+-	<parameter key="NUMBER_SLOPES" type="alternative" default="1" optional="false">
+-		<section name="Snowpack" />
+-		<option value="1" type="string" />
+-		<option value="5" type="string" />
+-		<option value="3" type="string" />
+-		<option value="9" type="string" />
+-		<help>Based on meteorological input from a (flat field) automatic station or numerical weather model, up to 8 expositions can be calculated in addition to the flat field if the corresponding *.sno files are provided. For example, if you provide a flat field *.snow file (mandatory), which is named KLO3.sno and you want 4 slopes to be calculated the corresponding slope files should be named KLO21.sno, …,KLO24.sno</help>
+-	</parameter>
+-	<parameter key="INCOMING_LONGWAVE" type="alternative" default="FALSE" optional="false">
+-		<section name="Snowpack" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Use the provided incoming long wave on the virtual slopes?</help>
+-	</parameter>
+-	<parameter key="SNOW_REDISTRIBUTION" type="alternative" default="FALSE" optional="false">
+-		<section name="Snowpack" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Specifies if redistribution of snow is allowed from (upwind) expositions to lee slopes. In case just the flat field is calculated, snow erosion is enabled but only for "ENFORCE_MEASURED_SNOW_HEIGHTS".</help>
+-	</parameter>
+-	</frame>
+-	<frame key="soil_frame" label="Soil Modeling">
+-	<section name="Snowpack"/>
+-	<parameter key="SNP_SOIL" type="alternative" default="TRUE" optional="false">
+-		<section name="Snowpack" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Soil layers as defined by the *.sno files are included in the simulation</help>
+-	</parameter>
+-	<parameter key="SOIL_FLUX" type="alternative" default="FALSE" optional="false">
+-		<section name="Snowpack" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Assume that the lower temperature boundary condition is given by GEO_HEAT (Neumann) and not by a measured temperature</help>
+-	</parameter>
+-	<parameter key="GEO_HEAT" type="decimal" default="0.06">
+-		<section name="Snowpack" />
+-		<help>Constant geothermal heat flux at great) depth W m-2): Lower flux boundary condition for temperature equation if BC is Neumann</help>
+-	</parameter>
+-	</frame>
+-
+-
+-	<!-- SnowpackAdvanced Parameters -->
+-	<parameter key="ASSUME_RESPONSIBILITY" type="alternative" default="AGREE">
+-		<section name="SnowpackAdvanced" />
+-		<option value="AGREE" type="string" />
+-		<help>&lt;font color="FF0000"&gt;The keys in this section deeply affect the operation of the SNOWPACK model. This could lead to unexpected behavior or surprising results. If you are not an experienced Snowpack user, please do NOT change any keys below!&lt;/font&gt;</help>
+-	</parameter>
+-	<parameter key="VARIANT" type="alternative">
+-		<section name="SnowpackAdvanced" />
+-		<option value="DEFAULT" type="string" />
+-		<option value="JAPAN" type="string" />
+-		<option value="ANTARTICA" type="string" />
+-		<!-- <option value="CALIBRATION" type="string" /> -->
+-		<help>variant selection (includes a choice of specific models)</help>
+-	</parameter>
+-	<!-- <parameter key="RESEARCH" type="alternative" optional="true" default="TRUE">
+-		<section name="SnowpackAdvanced" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>research_mode</help>
+-	</parameter> -->
+-	<!-- <parameter key="NUMBER_FIXED_RATES" type="integer" default="0">
+-		<section name="SnowpackAdvanced" />
+-		<help>number_fixed_rates</help>
+-	</parameter> -->
+-	<parameter key="PERP_TO_SLOPE" type="alternative" optional="true" default="FALSE">
+-		<section name="SnowpackAdvanced" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>perp_to_slope</help>
+-	</parameter>
+-	<frame key="wind_frame" label="Wind Handling">
+-	<section name="SnowpackAdvanced"/>
+-	<parameter key="PREVAILING_WIND_DIR" type="decimal" default="0">
+-		<section name="SnowpackAdvanced" />
+-		<help>Shifts the origin of the wind rose for snow redistribution and slope simulations: e.g. choose 45° to have NE/SE/SW/NW</help>
+-	</parameter>
+-	<parameter key="WIND_SCALING_FACTOR" type="decimal" default="1.0" minimum="0" maximum="2">
+-		<section name="SnowpackAdvanced" />
+-		<help>Scaling factor to apply to wind values in case of drifting snow</help>
+-	</parameter>
+-	</frame>
+-	<frame key="hnw_frame" label="Precipitation Handling">
+-	<section name="SnowpackAdvanced"/>
+-	<parameter key="FORCE_RH_WATER" type="alternative" optional="true">
+-		<section name="SnowpackAdvanced" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Tell the model that relative humidity values are with respect to water regardless of the temperature</help>
+-	</parameter>
+-	<parameter key="THRESH_RAIN" type="decimal" default="1.2">
+-		<section name="SnowpackAdvanced" />
+-		<help>Temperature threshold for rain/snow transition</help>
+-	</parameter>
+-	<parameter key="THRESH_RH" type="decimal" default="0.5">
+-		<section name="SnowpackAdvanced" />
+-		<help>If ENFORCE_MEASURED_SNOW_HEIGHTS, relative humidity threshold for precipitation to occur</help>
+-	</parameter>
+-	<parameter key="THRESH_DT_AIR_SNOW" type="decimal" default="3.0">
+-		<section name="SnowpackAdvanced" />
+-		<help>If ENFORCE_MEASURED_SNOW_HEIGHTS, (TA-TSS) threshold for precipitation to occur</help>
+-	</parameter>
+-	</frame>
+-	<frame key="hoar_frame" label="Hoar Handling">
+-	<section name="SnowpackAdvanced"/>
+-	<parameter key="HOAR_THRESH_RH" type="decimal" default="0.97">
+-		<section name="SnowpackAdvanced" />
+-		<help>Relative humidity threshold above which no surface hoar is allowed to form (because at very high humidity, typically no hoar crystals can form)</help>
+-	</parameter>
+-	<parameter key="HOAR_THRESH_VW" type="decimal" default="3.5">
+-		<section name="SnowpackAdvanced" />
+-		<help>Wind speed threshold above which no surface hoar is allowed to form (because it will drift away)</help>
+-	</parameter>
+-	<parameter key="HOAR_DENSITY_BURIED" type="decimal" default="125.0">
+-		<section name="SnowpackAdvanced" />
+-		<help>Define the initial density for surface hoar at the time it gets buried by new snow</help>
+-	</parameter>
+-	<parameter key="HOAR_MIN_SIZE_BURIED" type="decimal" default="2.0">
+-		<section name="SnowpackAdvanced" />
+-		<help>Define a threshold below which any traces of surface hoar will not be given a separate hoar layer when buried.</help>
+-	</parameter>
+-	<parameter key="HOAR_DENSITY_SURF" type="decimal" default="100.0">
+-		<section name="SnowpackAdvanced" />
+-		<help>Assumed density of surface hoar while exposed at the surface and not buried</help>
+-	</parameter>
+-	</frame>
+-	<frame key="temps_frame" label="Temperatures Handling">
+-	<section name="SnowpackAdvanced"/>
+-	<parameter key="FIXED_POSITIONS" type="string" default="">
+-		<section name="SnowpackAdvanced" />
+-		<help>positions of temperatur sensors in snow or soil: positive values refer to heigths measured from the ground surface (snow only), negative values refer to depths measured from either the ground surface or the snow surface in case no soil layers are present. A sensor must at least be covered by MIN_DEPTH_SUBSURF (m) snow for its temperature to be output.</help>
+-	</parameter>
+-	<!-- <parameter key="MAX_NUMBER_MEAS_TEMPERATURES" type="integer" default="5">
+-		<section name="SnowpackAdvanced" />
+-		<help></help>
+-	</parameter> -->
+-	<parameter key="MIN_DEPTH_SUBSURF" type="decimal" default="0.07">
+-		<section name="SnowpackAdvanced" />
+-		<help>Minimum snow depth above a temperature sensor to accept the measurement</help>
+-	</parameter>
+-	<parameter key="T_CRAZY_MIN" type="decimal" default="210.">
+-		<section name="SnowpackAdvanced" />
+-		<help>If you go to Antarctica or the tropics you may expect different reasonable temperatures</help>
+-	</parameter>
+-	<parameter key="T_CRAZY_MAX" type="decimal" default="340.">
+-		<section name="SnowpackAdvanced" />
+-		<help>If you go to Antarctica or the tropics you may expect different reasonable temperatures</help>
+-	</parameter>
+-	</frame>
+-	<frame key="sn_models_frame" label="Models Selection">
+-	<section name="SnowpackAdvanced"/>
+-	<parameter key="HN_DENSITY_MODEL" type="alternative" default="LEHNING_NEW">
+-		<section name="SnowpackAdvanced" />
+-		<option value="LEHNING_NEW" type="string" />
+-		<option value="ZWART" type="string" />
+-		<option value="BELLAIRE" type="string" />
+-		<option value="LEHNING_OLD" type="string" />
+-		<option value="PAHAUT" type="string" />
+-		<help>Choice of new snow density model (diverse statistical models)</help>
+-	</parameter>
+-	<parameter key="HN_DENSITY" type="string" default="PARAMETERIZED">
+-		<section name="SnowpackAdvanced" />
+-		<help>Fixed value to be used as new snow density if a constant density model is chosen, otherwise the choices are "PARAMETERIZED" "EVENT" "MEASURED"</help>
+-	</parameter>
+-	<parameter key="METAMORPHISM_MODEL" type="alternative">
+-		<section name="SnowpackAdvanced" />
+-		<option value="DEFAULT" type="string" />
+-		<option value="NIED" type="string" />
+-		<help>metamorphism_model</help>
+-	</parameter>
+-	<parameter key="NEW_SNOW_GRAIN_RAD" type="decimal" default="0.15">
+-		<section name="SnowpackAdvanced" />
+-		<help>new_snow_grain_rad</help>
+-	</parameter>
+-	<parameter key="STRENGTH_MODEL" type="alternative">
+-		<section name="SnowpackAdvanced" />
+-		<option value="DEFAULT" type="string" />
+-		<option value="NIED" type="string" />
+-		<help>strength_model</help>
+-	</parameter>
+-	<parameter key="VISCOSITY_MODEL" type="alternative">
+-		<section name="SnowpackAdvanced" />
+-		<option value="DEFAULT" type="string" />
+-		<option value="NIED" type="string" />
+-		<help>viscosity_model</help>
+-	</parameter>
+-	<parameter key="HARDNESS_MODEL" type="alternative">
+-		<section name="SnowpackAdvanced" />
+-		<option value="MONTI" type="string" />
+-		<option value="BELLAIRE" type="string" />
+-		<option value="ASARC" type="string" />
+-		<help>hardness_model</help>
+-	</parameter>
+-	<parameter key="DOORSCHOT" type="alternative" optional="true" default="FALSE">
+-		<section name="SnowpackAdvanced" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Choose the Doorschot saltation model over the simple Sorenson parameterization</help>
+-	</parameter>
+-	<parameter key="MULTISTREAM" type="alternative" optional="true">
+-		<section name="SnowpackAdvanced" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Select a multi stream model for shortwave radiation penetration into the snow cover</help>
+-	</parameter>
+-	<parameter key="FIXED_ALBEDO" type="alternative" optional="true">
+-		<section name="SnowpackAdvanced" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Force the model to work with a fixed albedo</help>
+-	</parameter>
+-	<!-- <parameter key="SURFACECODE" type="alternative" optional="true">
+-		<section name="SnowpackAdvanced" />
+-		<option value="NEUMANN_BC" type="string" />
+-		<option value="DIRICHLET_BC" type="string" />
+-		<help>Select the boundary conditions to use</help>
+-	</parameter> -->
+-	</frame>
+-	<frame key="sn_extra_frame" label="Extra Models Selection">
+-	<section name="SnowpackAdvanced"/>
+-	<parameter key="DETECT_GRASS" type="alternative" optional="true" default="TRUE">
+-		<section name="SnowpackAdvanced" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Identify grass growing under the snow height sensor. This usually works well but might sometimes lead to problems</help>
+-	</parameter>
+-	<parameter key="PLASTIC" type="alternative" optional="true" default="FALSE">
+-		<section name="SnowpackAdvanced" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Switch to tell the model that a impermeable layer should be simulated on top of some snow or ice: this requires that the *.sno file contains this layer, which is characterized via the soil parameters; the option has successfully been used to simulate snow and ice protection using geo-textiles and saw dust.</help>
+-	</parameter>
+-	<parameter key="JAM" type="alternative" optional="true" default="FALSE">
+-		<section name="SnowpackAdvanced" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>If switched on, you can also simulate ponding on impermeable ice surfaces below the snow cover</help>
+-	</parameter>
+-	<parameter key="WATER_LAYER" type="alternative" optional="true" default="FALSE">
+-		<section name="SnowpackAdvanced" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Assuming an impermeable surface such as on a road or on geo-textiles (e.g. for snow farming), a liquid water layer is allowed to form on this surface</help>
+-	</parameter>
+-	</frame>
+-	<frame key="elements_frame" label="Elements Handling">
+-	<section name="SnowpackAdvanced"/>
+-	<parameter key="HEIGHT_NEW_ELEM" type="decimal" default="0.02">
+-		<section name="SnowpackAdvanced" />
+-		<help>Standard size of a new element added to the stack of elements (layers) during snowfall events</help>
+-	</parameter>
+-	<parameter key="MINIMUM_L_ELEMENT" type="decimal" default="0">
+-		<section name="SnowpackAdvanced" />
+-		<help>Threshold value for enforcing the layer to be merged with the layer above or below</help>
+-	</parameter>
+-	<parameter key="COMBINE_ELEMENTS" type="alternative" optional="true">
+-		<section name="SnowpackAdvanced" />
+-		<option value="TRUE" type="string" />
+-		<option value="FALSE" type="string" />
+-		<help>Combine neighboring elements based on a set of similarity conditions which are hard-coded</help>
+-	</parameter>
+-	</frame>
+-
+-	<!--Parameter group for list of stations -->
+-	<parametergroup name="stationgroup_files">
+-		<parameter key="STATION#" type="file" counter="1" optional="false">
+-			<help>filename for station number # </help>
+-		</parameter>
+-	</parametergroup>
+-	<parametergroup name="stationgroup_names">
+-		<parameter key="STATION#" type="string" counter="1" optional="false">
+-			<help>station id for the given station number # </help>
+-		</parameter>
+-	</parametergroup>
+-	<parametergroup name="stationgroup_pos">
+-		<parameter key="STATION#" type="string" counter="1">
+-			<help>Coordinates are given as "lat lon" or "xcoord ycoord epsg_code"</help>
+-		</parameter>
+-	</parametergroup>
+-
+-	<!-- Plugins for Meteo Data-->
+-	<parametergroup name="BORMA">
+-		<parameter key="METEOPATH" type="path" optional="false">
+-			<help>string containing the path to the xml files</help>
+-		</parameter>
+-		<reference name="stationgroup_names" />
+-	</parametergroup>
+-
+-	<parametergroup name="IMIS">
+-		<parameter key="DBNAME" type="string" optional="false">
+-			<help>database name, as provided by your database administrator</help>
+-		</parameter>
+-		<parameter key="DBUSER" type="string" optional="false">
+-			<help>database user name</help>
+-		</parameter>
+-		<parameter key="DBPASS" type="string" optional="false">
+-			<help>database password associated with the user name</help>
+-		</parameter>
+-		<parameter key="USEANETZ" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		  <help>OPTIONAL: use ANETZ stations to provide precipitations for normal IMIS stations.
+-		  Each IMIS station is associated with one or two ANETZ stations and does a weighted
+-		  average to get what should be its local precipitations</help>
+-		</parameter>
+-		<parameter key="USE_IMIS_HNW" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		  <help>OPTIONAL: if set to false (default), all IMIS precipitation will be deleted (since IMIS stations don't have heated rain gauges, their precipitation measurements are not good in winter conditions). If set to true, it is strongly advised to use a FilterHNWMelt filter to detect snow melting in the rain gauge and perform winter conditions detection in the application.</help>
+-		</parameter>
+-		<parameter key="USE_SNOWPACK_HNW" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		  <help>if set to true, the SNOWPACK simulated Snow Water Equivalent from the database will be used to compute HNW. Data gaps greater than 3 hours on SWE will lead to unchanged hnw while all data that can properly be computed will overwrite hnw. (default=false)</help>
+-		</parameter>
+-
+-		<reference name="stationgroup_names" />
+-	</parametergroup>
+-
+-	<parametergroup name="GRIB_METEO">
+-		<parameter key="METEOPATH" type="path" optional="false">
+-			<help>string containing the path to the grib files</help>
+-		</parameter>
+-		<parameter key="METEOEXT" type="string" optional="true">
+-			<help>grib file extension, or none for no file extension (default: .grb)</help>
+-		</parameter>
+-
+-		<reference name="stationgroup_pos" />
+-	</parametergroup>
+-
+-	<parametergroup name="GEOTOP_IN">
+-		<parameter key="METEOPATH" type="path" optional="false">
+-			<help>string containing the path to the data files</help>
+-		</parameter>
+-		<parameter key="METAFILE" type="file" optional="false">
+-			<help>absolute filename of the geotop.inpts file</help>
+-		</parameter>
+-		<parameter key="METEOPREFIX" type="string" optional="true">
+-			<help>prefix to append when generating a file name for reading</help>
+-		</parameter>
+-	</parametergroup>
+-
+-	<parametergroup name="GSN">
+-		<parameter key="ENDPOINT" type="string" optional="false">
+-			<help>webserver running GSN with its port number and full path. For example:
+-			http://montblanc.slf.ch:22001/services/A3DWebService</help>
+-		</parameter>
+-		<parameter key="PROXY" type="string" optional="true">
+-			<help>Should the connection go through a proxy? This is useful for servers
+-			filtering on domains but usually not necessary.</help>
+-		</parameter>
+-		<parameter key="PROXYPORT" type="string" optional="true" />
+-		<parameter key="PROXYUSER" type="string" optional="true" />
+-		<parameter key="PROXYPASS" type="string" optional="true" />
+-
+-		<reference name="stationgroup_names" />
+-	</parametergroup>
+-
+-	<parametergroup name="SMET_IN">
+-		<parameter key="METEOPATH" type="path" optional="false">
+-			<help>string containing the path to the smet files</help>
+-		</parameter>
+-		<reference name="stationgroup_files" />
+-	</parametergroup>
+-
+-	<parametergroup name="SNIO_IN">
+-		<parameter key="METEOPATH" type="path" optional="false">
+-			<help>string containing the path to the SNOWPACK files</help>
+-		</parameter>
+-		<parameter key="METAFILE" type="file" optional="true">
+-			<help>filename of the meta data file (in METEOPATH)</help>
+-		</parameter>
+-		<parameter key="NUMBER_MEAS_TEMPERATURES" type="integer+" minimum="0" default="0">
+-		  <help>the number of measured snow temperatures that are provided</help>
+-		</parameter>
+-		<parameter key="NUMBER_OF_SOLUTES" type="integer+" minimum="0" default="0">
+-		  <help>the number of solutes for which input data are provided</help>
+-		</parameter>
+-
+-		<parameter key="RSWR_INP" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		</parameter>
+-		<parameter key="ISWR_INP" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		</parameter>
+-		<parameter key="VW_DRIFT" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		  <help>OPTIONAL: wind velocity to use for blowing and drifting snow is provided</help>
+-		</parameter>
+-		<parameter key="RHO_HN" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		  <help>OPTIONAL: measured new snow density is provided</help>
+-		</parameter>
+-
+-		<reference name="stationgroup_files" />
+-	</parametergroup>
+-
+-	<!-- Meteo Parameters for Filters, resampling, spatial interpolations-->
+-	<parametergroup name="METEOIOPARAMETERS">
+-		<option value="TA"/>
+-		<option value="RH"/>
+-		<option value="VW"/>
+-		<option value="DW"/>
+-		<option value="VW_MAX"/>
+-		<option value="ISWR"/>
+-		<option value="RSWR"/>
+-		<option value="ILWR"/>
+-		<option value="HS"/>
+-		<option value="HNW"/>
+-		<option value="TSG"/>
+-		<option value="TSS"/>
+-		<option value="P"/>
+-	</parametergroup>
+-
+-	<!-- Filters -->
+-	<parameter key="Add/Remove Filter" type="selector">
+-		<section name="filters" />
+-
+-		<parameter key="%::filter#" type="alternative" counter="1" template="true">
+-			<section name="filters" />
+-
+-			<option label="MeanAvg" value="mean_avg" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			    </help>
+-			  </parameter>
+-			  <help>Mean average processing. The mean average filter returns the mean value of all values within a user given time window.</help>
+-			</option>
+-
+-
+-			<option label="MedianAvg" value="median_avg" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="decimal" minimum="0" />
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			    </help>
+-			  </parameter>
+-			  <help>Median average processing. The median average filter returns the median value of all values within a user given time window.</help>
+-			</option>
+-
+-			<option label="Std Deviation Filter" value="std_dev" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			    </help>
+-			  </parameter>
+-			  <help>Standard deviation filter. Values outside of mean ± 2 std_dev are rejected.</help>
+-			</option>
+-
+-			<option label="MAD" value="mad" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			    </help>
+-			  </parameter>
+-			  <help>Median Absolute Deviation. Values outside of median ± 3 σ_MAD are rejected. &lt;br&gt;
+-			  See http://en.wikipedia.org/wiki/Median_absolute_deviation for more information.</help>
+-			</option>
+-
+-			<option label="Tukey 53H Filter" value="Tukey" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <help>
+-			      The keyword "soft" maybe added, if the window position is allowed to be adjusted to the data present.
+-			      The two arguments may be preceded by the keywords "left", "center" or "right", indicating the window position.
+-			    </help>
+-			  </parameter>
+-			  <help>Tukey 53H method A smooth time sequence is generated from the median, substracted from the original signal and
+-			  compared with the standard deviation. see "Despiking Acoustic Doppler Velocimeter Data", Derek G. Goring and Vladimir
+-			  L. Nikora, Journal of Hydraulic Engineering, 128, 1, 2002 The deviation factor coeffecient is currently hard-coded as k=1.5. </help>
+-			</option>
+-
+-			<option label="Wind Averaging Filter" value="wind_avg" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			    </help>
+-			  </parameter>
+-			  <help>Wind vector averaging. This calculates the vector average over a user given time period. Each wind vector
+-			  within this period is added and the final sum is normalized by the number of vectors that have been added. </help>
+-			</option>
+-
+-			<option label="Exponential Smoothing" value="exp_smoothing" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <option label="alpha:" value="0.8" type="decimal" minimum="0" maximum="1"/>
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			      Alpha needs to be provided as last argument. Please note that the standard filter works with a left window!
+-			    </help>
+-			  </parameter>
+-			  <help>Exponential smooting processing, exponential moving average s_0 = x_0 s_n = alpha*x_(t-1) + (1-alpha)*s_t-1</help>
+-			</option>
+-
+-			<option label="Weighted Moving Average Smoothing" value="wma_smoothing" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			      Please note that the standard filter works with a left window!
+-			    </help>
+-			  </parameter>
+-			  <help>Weighted moving average smoothing such as: WMA = (1*X1 + 2*X2 + ... + n*Xn) / sum_of_weights</help>
+-			</option>
+-
+-			<option label="Min Range Filter" value="min" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option label="Min:" value="" type="decimal" />
+-			    <option label="Adjust to:" value="" type="decimal" />
+-			    <help>The keyword "soft" maybe added, in such a case all data smaller than the min would be
+-			    assigned the minimum permissible value or another value given as an extra argument</help>
+-			  </parameter>
+-			  <help>Min range filter. Reject all values smaller than the min.</help>
+-			</option>
+-
+-			<option label="Max Range Filter" value="max" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option label="Max:" value="" type="decimal" />
+-			    <option label="Adjust to:" value="" type="decimal" />
+-			    <help>The keyword "soft" maybe added, in such a case all data greater than the max would be
+-			    assigned the maximum permissible value or another value given as an extra argument</help>
+-			  </parameter>
+-			  <help>Max range filter. Reject all values greater than the max.</help>
+-			</option>
+-
+-			<option label="MinMax (2 or 4 arguments)" value="min_max" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option label="Min:" value="" type="decimal" />
+-			    <option label="Max:" value="" type="decimal" />
+-			    <option label="Min adjust to:" value="" type="decimal" />
+-			    <option label="Max adjust to:" value="" type="decimal" />
+-			    <help>The keyword "soft" maybe added, in such a case all data greater than the max would be assigned
+-			    the maximum permissible value and all data smaller than the min would be assigned the minimum
+-			    permissible value or an optional extra set of two user provided values</help>
+-			  </parameter>
+-			  <help>Reject all values greater than the max or smaller than the min. &lt;br&gt;</help>
+-			</option>
+-
+-			<option label="Rate Filter (1 argument)" value="rate" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option label="Max:" value="1.0" type="decimal" minimum="0" maximum="1" />
+-			    <help>the absolute value of the maximum permissible rate of change (per seconds)</help>
+-			  </parameter>
+-			  <help>Rate of change filter. Calculate the change rate (ie: slope) between two points, if it is above a user given value, reject the point.</help>
+-			</option>
+-
+-			<option label="Rate Filter (2 arguments)" value="rate" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option label="Min:" value="0.0" type="decimal" minimum="0" maximum="1" />
+-			    <option label="Max:" value="1.0" type="decimal" minimum="0" maximum="1" />
+-			    <help>the minimum and maximum permissible rate of change (per second)</help>
+-			  </parameter>
+-			  <help>Rate of change filter. Calculate the change rate (ie: slope) between two points, if it is above a user given value, reject the point.</help>
+-			</option>
+-
+-			<option label="Unheated Rain Gauge Filter" value="Unheated_RainGauge" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option label="RH threshold:" value="0.5" type="decimal" minimum="0" maximum="1" />
+-			    <option label="Delta_T threshold:" value="3.0" type="decimal" minimum="0" maximum="20" />
+-			  </parameter>
+-			  <help>Filters out snow melting in an unheated rain gauge. This filter can ONLY be applied to precipitation. Non-zero measurements are accepted only if they take place when the relative humidity is greater than RH_threshold and (TA-TSS) smaller than Delta_T_threshold, otherwise they get reset to 0. If none of these conditions could be tested (for lack of data), then the precipitation is reset to nodata (or left unchanged if "soft" has been selected).</help>
+-			</option>
+-
+-			<option label="WMO Undercatch Filter" value="undercatch_wmo" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-				<option value="Gage type" type="dropdown">
+-					<option value="Nipher" type="string" />
+-					<option value="Tretyakov" type="string" />
+-					<option value="US8sh" type="string" />
+-					<option value="US8unsh" type="string" />
+-					<option value="Hellmann" type="string" />
+-					<option value="Hellmannsh" type="string" />
+-				</option>
+-			  </parameter>
+-			  <help>This implements the standard methods for precipitation correction as described in "WMO Solid Precipitation Measurement Intercomparison", B. Goodison, P. Louie and D. Yang, 872, 1998 as well as the overview given by "Literature Study on the Correction of Precipitation Measurements", Annette Wagner, 2009. The correction parameters for the shielded Hellmann gauge (German version) are from "Wind-induced Precipitation Undercatch of the Hellmann Gauges", Daqing Yang et al, Nordic Hydrology, 30, 1999, pp 57-80.</help>
+-			</option>
+-
+-			<option label="WMO Undercatch Filter - simplified" value="undercatch_wmo" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-				<option value="Kind" type="dropdown">
+-					<option value="Cst" type="string" />
+-				</option>
+-				<option label="Snow factor:" value="1.3" type="decimal" minimum="0" maximum="5" />
+-				<option label="Mixed precipitation factor:" value="1.1" type="decimal" minimum="0" maximum="5" />
+-			  </parameter>
+-			  <help>This applies a constant correction factor to the precipitation, one for pure snow and one for mixed precipitation. The following thresholds are used: pure snow below -2 C; mixed precipitation between -2 and +2 C; pure rain above 2 C. These threshold can be changed (see online documentation).</help>
+-			</option>
+-
+-			<option label="Unventillated temperature sensor" value="Unventilated_T" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option label="albedo:" value="0.23" type="decimal" />
+-			    <option value="soft" type="choice" />
+-			    <help>If the "soft" option is given, the albedo has a value different according to snow (or no snow) on the ground</help>
+-			  </parameter>
+-			  <help>This implements the correction described in (Reina Nakamura, 2005) with an albedo dependency as introduced in (Huwald, 2009)</help>
+-			</option>
+-
+-			<option label="Add an offset" value="add" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-				<option label="offset:" value="0." type="decimal" />
+-			  </parameter>
+-			  <help>This adds a given offset to the data.</help>
+-			</option>
+-
+-			<option label="Multiply by a factor" value="mult" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-				<option label="factor:" value="1." type="decimal" />
+-			  </parameter>
+-			  <help>This multiplies the data by a given factor.</help>
+-			</option>
+-
+-		</parameter>
+-
+-		<reference name="METEOIOPARAMETERS" />
+-	</parameter>
+-
+-	<!-- 1D Interpolation -->
+-	<parameter key="WINDOW_SIZE" type="integer+" minimum="1" default="43200">
+-		<section name="Interpolations1D" />
+-		<help>Affects resampling: expresses (in seconds) how far a valid point can be
+-		searched for when re-interpolating a missing value</help>
+-	</parameter>
+-
+-	<parameter key="Add/Remove 1D Interpolation" type="selector">
+-		<section name="Interpolations1D" />
+-
+-		<parameter key="%::resample" type="alternative" template="true">
+-			<section name="Interpolations1D" />
+-			<option label="No Interpolation" value="none" type="string" />
+-			<option label="Nearest Neighbour" value="nearest_neighbour" type="string" />
+-			<option label="Linear" value="linear" type="string">
+-			  <parameter key="%::args" type="combination">
+-			    <option value="extrapolate" type="choice" />
+-			    <help>
+-			      If "extrapolate" is added, then data *outside* of the original date range can be interpolated.
+-			      Otherwise, a data point will only be calculated between the original date range.
+-			    </help>
+-			  </parameter>
+-			  <help>Mean average processing. The mean average filter returns the mean value of all values within a user given time window.</help>
+-			</option>
+-			<option label="Accumulate" value="accumulate" type="string">
+-			  <parameter key="%::args" type="combination">
+-			    <option value="strict" type="choice" />
+-			    <option label="Seconds:" value="900" type="integer" minimum="1" />
+-			    <help>Accumulation period (in seconds). This must usually match the model time step. if enabling "strict", nodatas will propagate (ie. a single nodata in the input will force the re-accumulated value to be nodata). Otherwise, all valid values are aggregated and only pure nodata intervals produce a nodata in the output.</help>
+-			  </parameter>
+-			  <help>Accumulation over a user given period (filter argument, in seconds -
+-			  should coincide with your calculation step!).</help>
+-			</option>
+-		</parameter>
+-
+-		<reference name="METEOIOPARAMETERS" />
+-	</parameter>
+-
+-</inishell_config>
+\ No newline at end of file
+Index: ../trunk-jpl/src/java/doc/examples/issm.xml
+===================================================================
+--- ../trunk-jpl/src/java/doc/examples/issm.xml	(revision 18297)
++++ ../trunk-jpl/src/java/doc/examples/issm.xml	(revision 18298)
+@@ -1,1284 +0,0 @@
+-<inishell_config application="ISSM prototype">
+-
+-<!-- mesh -->
+-<parameter key ="Dimension" type="alternative" optional="false">
+-     <section name="mesh" />
+-     <option value="0" type="string" default="true">
+-        <help> dimension is 0 </help>
+-     </option>
+-     <option value="3" type="string">
+-        <help> dimension is 3 </help>
+-       <!-- Elements and vertices of the original 2d mesh -->
+-          <parameter key ="x2d" type="double" default="N/A">
+-              <help> vertices x coordinate [m] </help>
+-          </parameter>
+-          <parameter key ="y2d" type="double" default="N/A">
+-              <help> vertices y coordinate [m] </help>
+-          </parameter>
+-          <parameter key ="elements2d" type="double" default="N/A">
+-              <help> vertex indices of the mesh elements </help>
+-          </parameter>
+-          <parameter key ="numberofvertices2d" type="double" default="0">
+-              <help> number of vertices </help>
+-          </parameter>
+-          <parameter key ="numberofelements2d" type="double" default="0">
+-              <help> number of elements </help>
+-          </parameter>
+-     </option>
+-     <help> select a mesh dimension 0(default) or 3 </help>
+-</parameter>
+-<frame key="1" label="Elements and vertices">
+-<section name="mesh" />
+-  <parameter key ="numberofelements" type="double" default="0">
+-     <section name="mesh" />
+-     <help> number of elements </help>
+-  </parameter>
+-  <parameter key ="numberofvertices" type="double" default="0">
+-     <section name="mesh" />
+-     <help> number of verticies </help>
+-  </parameter>
+-  <parameter key ="elements" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> vertex indices of the mesh elements </help>
+-  </parameter>
+-  <parameter key ="x" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> vertices x coordinate [m] </help>
+-  </parameter>
+-  <parameter key ="y" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> vertices y coordinate [m] </help>
+-  </parameter>
+-  <parameter key ="z" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> vertices z coordinate [m] </help>
+-  </parameter>
+-  <parameter key ="edges" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> edges of the 2d mesh (vertex1 vertex2 element1 element2) </help>
+-  </parameter>
+-  <parameter key ="numberofedges" type="double" default="0">
+-     <section name="mesh" />
+-     <help> number of edges of the 2d mesh </help>
+-  </parameter>
+-</frame>
+-<frame key="2" label="Properties">
+-<section name="mesh" />
+-  <parameter key ="selected dimension" type="double" default="0">
+-     <section name="mesh" />
+-     <help> mesh dimension </help>
+-  </parameter>
+-  <parameter key ="numberoflayers" type="double" default="0">
+-     <section name="mesh" />
+-     <help> number of extrusion layers </help>
+-  </parameter>
+-  <parameter key ="vertexonbed" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> lower vertices flags list </help>
+-  </parameter>
+-  <parameter key ="elementonbed" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> lower elements flags list </help>
+-  </parameter>
+-  <parameter key ="vertexonsurface" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> upper vertices flags list </help>
+-  </parameter>
+-  <parameter key ="elementonsurface" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> upper element flag list </help>
+-  </parameter>
+-  <parameter key ="uppervertex" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> upper vertex list (NaN for vertex on the upper surface) </help>
+-  </parameter>
+-  <parameter key ="upperelements" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> upper element list (NaN for element on the upper layer) </help>
+-  </parameter>
+-  <parameter key ="lowervertex" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> lower vertex list (NaN for vertex on the lower surface) </help>
+-  </parameter>
+-  <parameter key ="lowerelements" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> lower element list (NaN for element on the lower layer </help>
+-  </parameter>
+-  <parameter key ="vertexonboundary" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> vertices on the boundary of the domain flag list </help>
+-  </parameter>
+-  <parameter key ="segments" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> edges on domain boundary (vertex1 vertex2 element) </help>
+-  </parameter>
+-  <parameter key ="segmentmarkers" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> number associated to each segment </help>
+-  </parameter>
+-  <parameter key ="vertexconnectivity" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> list of vertices connected to vertex_i </help>
+-  </parameter>
+-  <parameter key ="elementconnectivity" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> list of vertices connected to element_i </help>
+-  </parameter>
+-  <parameter key ="average_vertex_connectivity" type="double" default="25">
+-     <section name="mesh" />
+-     <help> average number of vertices connected to one vertex </help>
+-  </parameter>
+-</frame>
+-<frame key="3" label="Extracted Model">
+-<section name="mesh" />
+-  <parameter key ="extractedvertices" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> vertices extracted from the model </help>
+-  </parameter>
+-  <parameter key ="extractedelements" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> elements extracted from the model </help>
+-  </parameter>
+-</frame>
+-<frame key="4" label="Projection">
+-<section name="mesh" />
+-  <parameter key ="lat" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> vertices latitude [degrees] </help>
+-  </parameter>
+-  <parameter key ="long" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> verticies longitude [degrees] </help>
+-  </parameter>
+-  <parameter key ="hemisphere" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> Indicate hemisphere 'n' or 's' </help>
+-  </parameter></frame>
+-
+-
+-<!-- mask -->
+-<parameter key ="groundedice_levelset" type="double" default="NaN">
+-     <section name="mask" />
+-     <help> is ice grounded ? grounded ice if > 0, grounding line position if = 0, floating ice if &amp;lt; 0 </help>
+-</parameter>
+-<parameter key ="ice_levelset" type="double" default="NaN">
+-     <section name="mask" />
+-     <help> presence of ice if > 0, icefront position if = 0, no ice if &amp;lt; 0 </help>
+-</parameter>
+-
+-<!-- geometry -->
+-<frame key="1" label="Geometry parameters">
+-<section name="geometry" />
+-<parameter key ="surface" type="path" optional="false">
+-     <section name="geometry" />
+-     <help> surface elevation [m] </help>
+-</parameter>
+-<parameter key ="thickness" type="path" optional="false">
+-     <section name="geometry" />
+-     <help> ice thickness [m] </help>
+-</parameter>
+-<parameter key ="bed" type="path" optional="false">
+-     <section name="geometry" />
+-     <help> bed elevation [m] </help>
+-</parameter>
+-<parameter key ="bathymetry" type="double" default="N/A">
+-     <section name="geometry" />
+-     <help> bathymetry elevation [m] </help>
+-</parameter>
+-<parameter key ="hydrostatic_ratio" type="double" default="N/A">
+-     <section name="geometry" />
+-     <help> coefficient for ice shelves; thickness correction: hydrostatic_ratio H_obs+ (1-hydrostatic_ratio) H_hydro </help>
+-</parameter></frame>
+-
+-
+-<!-- constants -->
+-<parameter key ="g" type="double" default="9.81">
+-     <section name="constants" />
+-     <help> gravitational acceleration [m/s^2] </help>
+-</parameter>
+-<parameter key ="yts" type="double" default="31536000">
+-     <section name="constants" />
+-     <help> number of seconds in a year [s/yr] </help>
+-</parameter>
+-<parameter key ="referencetemperature" type="double" default="223.15">
+-     <section name="constants" />
+-     <help> reference temperature used in the enthalpy model [K] </help>
+-</parameter>
+-
+-<!-- surfaceforcings(SMB) -->
+-<parameter key ="mass_balance" type="double" default="NaN">
+-     <section name="surfaceforcings(SMB)" />
+-     <help> surface mass balance [m/yr ice eq] </help>
+-</parameter>
+-
+-<!-- basalforcings -->
+-<parameter key ="melting_rate" type="double" default="NaN">
+-     <section name="basalforcings" />
+-     <help> basal melting rate (positive if melting) [m/yr] </help>
+-</parameter>
+-<parameter key ="melting_rate_correction" type="double" default="NaN">
+-     <section name="basalforcings" />
+-     <help> additional melting applied to compensate for dh/dt [m/yr] </help>
+-</parameter>
+-<parameter key ="geothermalflux" type="double" default="NaN">
+-     <section name="basalforcings" />
+-     <help> geothermal heat flux [W/m^2] </help>
+-</parameter>
+-
+-<!-- materials -->
+-<parameter key ="rho_ice" type="double" default="917">
+-     <section name="materials" />
+-     <help> ice density [kg/m^3] </help>
+-</parameter>
+-<parameter key ="rho_water" type="double" default="1023">
+-     <section name="materials" />
+-     <help> ocean water density [kg/m^3] </help>
+-</parameter>
+-<parameter key ="rho_freshwater" type="double" default="1000">
+-     <section name="materials" />
+-     <help> fresh water density [kg/m^3] </help>
+-</parameter>
+-<parameter key ="mu_water" type="double" default="0.001787">
+-     <section name="materials" />
+-     <help> water viscosity [N s/m^2] </help>
+-</parameter>
+-<parameter key ="heatcapacity" type="double" default="2093">
+-     <section name="materials" />
+-     <help> heat capacity [J/kg/K] </help>
+-</parameter>
+-<parameter key ="latentheat" type="double" default="334000">
+-     <section name="materials" />
+-     <help> latent heat of fusion [J/kg] </help>
+-</parameter>
+-<parameter key ="thermalconductivity" type="double" default="2.4">
+-     <section name="materials" />
+-     <help> ice thermal conductivity [W/m/K] </help>
+-</parameter>
+-<parameter key ="temperateiceconductivity" type="double" default="0.24">
+-     <section name="materials" />
+-     <help> temperate ice thermal conductivity [W/m/K] </help>
+-</parameter>
+-<parameter key ="meltingpoint" type="double" default="273.15">
+-     <section name="materials" />
+-     <help> melting point of ice at 1atm in K </help>
+-</parameter>
+-<parameter key ="beta" type="double" default="9.8e-08">
+-     <section name="materials" />
+-     <help> rate of change of melting point with pressure [K/Pa] </help>
+-</parameter>
+-<parameter key ="mixed_layer_capacity" type="double" default="3974">
+-     <section name="materials" />
+-     <help> mixed layer capacity [W/kg/K] </help>
+-</parameter>
+-<parameter key ="thermal_exchange_velocity" type="double" default="0.0001">
+-     <section name="materials" />
+-     <help> thermal exchange velocity [m/s] </help>
+-</parameter>
+-<parameter key ="rheology_B" type="double" default="N/A">
+-     <section name="materials" />
+-     <help> flow law parameter [Pa/s^(1/n)] </help>
+-</parameter>
+-<parameter key ="rheology_n" type="double" default="N/A">
+-     <section name="materials" />
+-     <help> Glens flow law exponent </help>
+-</parameter>
+-<parameter key ="rheology_law" type="char" default="'Paterson'">
+-     <section name="materials" />
+-     <help> law for the temperature dependance of the rheology: "None", "Paterson",  "Arrhenius" or "LliboutryDuval" </help>
+-</parameter>
+-<parameter key ="lithosphere_shear_modulus" type="double" default="67000000000">
+-     <section name="materials" />
+-     <help> Lithosphere shear modulus [Pa] </help>
+-</parameter>
+-<parameter key ="lithosphere_density" type="double" default="3.32">
+-     <section name="materials" />
+-     <help> Lithosphere density [g/cm^-3] </help>
+-</parameter>
+-<parameter key ="mantle_shear_modulus" type="double" default="145000000000">
+-     <section name="materials" />
+-     <help> Mantle shear modulus [Pa] </help>
+-</parameter>
+-<parameter key ="mantle_density" type="double" default="3.34">
+-     <section name="materials" />
+-     <help> Mantle density [g/cm^-3] </help>
+-</parameter>
+-
+-
+-<!-- damage -->
+-<!-- Note: this class depends on different input of law -->
+-<parameter key ="law" type="alternative" optional="false">
+-	<section name="damage" />
+-	<option value="undamage" type="string" default="true">
+-		<help> law = undamage </help>
+-	</option>
+-	<option value="pralong" type="string" default="false">
+-		<help> law = pralong </help>
+-		<parameter key ="stress_threshold" type="double" default="0">
+-			<help> damage stress threshold [Pa] </help>
+-		</parameter>
+-		<parameter key ="c1" type="double" default="0">
+-			<help> damage parameter 1 </help>
+-		</parameter>
+-		<parameter key ="c2" type="double" default="0">
+-			<help> damage parameter 2 </help>
+-		</parameter>
+-		<parameter key ="c3" type="double" default="0">
+-			<help> damage parameter 3 [W/m^2] </help>
+-		</parameter>
+-		<parameter key ="c4" type="double" default="0">
+-			<help> damage parameter 4 </help>
+-		</parameter>
+-		<parameter key ="healing" type="double" default="0">
+-			<help> damage healing parameter 1 </help>
+-		</parameter>
+-		<parameter key ="equiv_stress" type="double" default="0">
+-			<help> 0: von Mises </help>
+-		</parameter>
+-		<parameter key ="requested_outputs" type="cell" default="{'default'}">
+-			<help> additional outputs requested </help>
+-		</parameter>
+-	</option>
+-	<help> damage law (string) from {"undamaged","pralong"} </help>
+-</parameter>
+-<parameter key ="D" type="double" default="0">
+-     <section name="damage" />
+-     <help> damage tensor (scalar) </help>
+-</parameter>
+-<parameter key ="law" type="char" default="undamaged">
+-     <section name="damage" />
+-     <help> damage law (string) from {"undamaged","pralong"} </help>
+-</parameter>
+-<parameter key ="spcdamage" type="double" default="NaN">
+-     <section name="damage" />
+-     <help> damage constraints (NaN means no constraint) </help>
+-</parameter>
+-<parameter key ="max_damage" type="double" default="0.99999">
+-     <section name="damage" />
+-     <help> maximum possible damage (0&amp;lt;=max_damage&amp;lt;1) </help>
+-</parameter>
+-<parameter key ="stabilization" type="double" default="2">
+-     <section name="damage" />
+-     <help> 0: no, 1: artificial_diffusivity, 2: SUPG </help>
+-</parameter>
+-<parameter key ="maxiter" type="double" default="100">
+-     <section name="damage" />
+-     <help> maximum number of non linear iterations </help>
+-</parameter>
+-<parameter key ="penalty_lock" type="double" default="0">
+-     <section name="damage" />
+-     <help> stabilize unstable damage constraints that keep zigzagging after n iteration (default is 0, no stabilization) </help>
+-</parameter>
+-<parameter key ="penalty_threshold" type="double" default="0">
+-     <section name="damage" />
+-     <help> threshold to declare convergence of damage evolution solution (default is 0) </help>
+-</parameter>
+-<parameter key ="penalty_factor" type="double" default="3">
+-     <section name="damage" />
+-     <help> scaling exponent (default is 3) </help>
+-</parameter>
+-
+-
+-<!-- Friction: Sigma= drag^2 * Neff ^r * u ^s, with Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p -->
+-<frame key="1" label="Friction: Sigma= drag^2 * Neff ^r * u ^s, with Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p">
+-<section name="friction" />
+-<parameter key ="coefficient" type="double" default="N/A">
+-     <section name="friction" />
+-     <help> friction coefficient [SI] </help>
+-</parameter>
+-<parameter key ="p" type="double" default="N/A">
+-     <section name="friction" />
+-     <help> p exponent </help>
+-</parameter>
+-<parameter key ="q" type="double" default="N/A">
+-     <section name="friction" />
+-     <help> q exponent </help>
+-</parameter></frame>
+-
+-
+-<!-- flowequation -->
+-<frame key="1" label="Flow equation parameters">
+-<section name="flowequation" />
+-<parameter key ="isSIA" type="double" default="0">
+-     <section name="flowequation" />
+-     <help> is the Shallow Ice Approximation (SIA) used ? </help>
+-</parameter>
+-<parameter key ="isSSA" type="double" default="0">
+-     <section name="flowequation" />
+-     <help> is the Shelfy-Stream Approximation (SSA) used ? </help>
+-</parameter>
+-<parameter key ="isL1L2" type="double" default="0">
+-     <section name="flowequation" />
+-     <help> is the L1L2 approximation used ? </help>
+-</parameter>
+-<parameter key ="isHO" type="double" default="0">
+-     <section name="flowequation" />
+-     <help> is the Higher-Order (HO) approximation used ? </help>
+-</parameter>
+-<parameter key ="isFS" type="double" default="0">
+-     <section name="flowequation" />
+-     <help> are the Full-FS (FS) equations used ? </help>
+-</parameter>
+-<parameter key ="fe_SSA" type="char" default="'P1'">
+-     <section name="flowequation" />
+-     <help> Finite Element for SSA  "P1", "P1bubble" "P1bubblecondensed" "P2" </help>
+-</parameter>
+-<parameter key ="fe_HO" type="char" default="'P1'">
+-     <section name="flowequation" />
+-     <help> Finite Element for HO   "P1" "P1bubble" "P1bubblecondensed" "P1xP2" "P2xP1" "P2" </help>
+-</parameter>
+-<parameter key ="fe_FS" type="char" default="'MINIcondensed'">
+-     <section name="flowequation" />
+-     <help> Finite Element for FS   "P1P1" (debugging only) "P1P1GLS" "MINIcondensed" "MINI" "TaylorHood" </help>
+-</parameter>
+-<parameter key ="vertex_equation" type="double" default="N/A">
+-     <section name="flowequation" />
+-     <help> flow equation for each vertex </help>
+-</parameter>
+-<parameter key ="element_equation" type="double" default="N/A">
+-     <section name="flowequation" />
+-     <help> flow equation for each element </help>
+-</parameter>
+-<parameter key ="borderSSA" type="double" default="N/A">
+-     <section name="flowequation" />
+-     <help> vertices on SSAs border (for tiling) </help>
+-</parameter>
+-<parameter key ="borderHO" type="double" default="N/A">
+-     <section name="flowequation" />
+-     <help> vertices on HOs border (for tiling) </help>
+-</parameter>
+-<parameter key ="borderFS" type="double" default="N/A">
+-     <section name="flowequation" />
+-     <help> vertices on FS border (for tiling) </help>
+-</parameter></frame>
+-
+-
+-<!-- Timestepping -->
+-<parameter key ="start_time" type="double" default="0">
+-     <section name="timestepping" />
+-     <help> simulation starting time [yr] </help>
+-</parameter>
+-<parameter key ="final_time" type="double" default="5">
+-     <section name="timestepping" />
+-     <help> final time to stop the simulation [yr] </help>
+-</parameter>
+-<parameter key ="time_step" type="double" default="0.5">
+-     <section name="timestepping" />
+-     <help> length of time steps [yr] </help>
+-</parameter>
+-<parameter key ="time_adapt" type="double" default="0">
+-     <section name="timestepping" />
+-     <help> use cfl condition to define time step ? (0 or 1)  </help>
+-</parameter>
+-<parameter key ="cfl_coefficient" type="double" default="0.5">
+-     <section name="timestepping" />
+-     <help> coefficient applied to cfl condition </help>
+-</parameter>
+-
+-
+-<!-- initialization -->
+-<frame key="1" label="Initial field values">
+-<section name="initialization" />
+-<parameter key ="vx" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> x component of velocity [m/yr] </help>
+-</parameter>
+-<parameter key ="vy" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> y component of velocity [m/yr] </help>
+-</parameter>
+-<parameter key ="vz" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> z component of velocity [m/yr] </help>
+-</parameter>
+-<parameter key ="vel" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> velocity norm [m/yr] </help>
+-</parameter>
+-<parameter key ="pressure" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> pressure field [Pa] </help>
+-</parameter>
+-<parameter key ="temperature" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> fraction of water in the ice </help>
+-</parameter>
+-<parameter key ="waterfraction" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> ice thickness [m] </help>
+-</parameter>
+-<parameter key ="sediment_head" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> sediment water head of subglacial system [m] </help>
+-</parameter>
+-<parameter key ="epl_head" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> epl water head of subglacial system [m] </help>
+-</parameter>
+-<parameter key ="watercolumn" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> thickness of subglacial water [m] </help>
+-</parameter></frame>
+-
+-
+-<!-- rifts -->
+-<parameter key ="riftstruct" type="double" default="NaN">
+-     <section name="rifts" />
+-     <help> structure containing all rift information (vertices coordinates, segments, type of melange, ...) </help>
+-</parameter>
+-<parameter key ="riftproperties" type="double" default="NaN">
+-     <section name="rifts" />
+-     <help> N/A </help>
+-</parameter>
+-
+-
+-<!-- Debug -->
+-<parameter key ="valgrind" type="logical" optional="false">
+-     <section name="debug" />
+-        <option value="false" type="string" default="true"></option>
+-     <help> use Valgrind to debug (0 or 1) </help>
+-</parameter>
+-<parameter key ="gprof" type="logical" optional="false">
+-     <section name="debug" />
+-        <option value="false" type="string" default="true"></option>
+-     <help> use gnu-profiler to find out where the time is spent </help>
+-</parameter>
+-<parameter key ="profiling" type="logical" optional="false">
+-     <section name="debug" />
+-        <option value="false" type="string" default="true"></option>
+-     <help> enables profiling (memory, flops, time) </help>
+-</parameter>
+-
+-<!-- verbose -->
+-<parameter key ="mprocessor" type="logical" optional="false">
+-     <section name="verbose" />
+-        <option value="false" type="string" default="true"></option>
+-     <help>  </help>
+-</parameter>
+-<parameter key ="module" type="logical" optional="false">
+-     <section name="verbose" />
+-        <option value="false" type="string" default="true"></option>
+-     <help>  </help>
+-</parameter>
+-<parameter key ="solution" type="logical" optional="false">
+-     <section name="verbose" />
+-        <option value="true" type="string" default="true"></option>
+-     <help>  </help>
+-</parameter>
+-<parameter key ="solver" type="logical" optional="false">
+-     <section name="verbose" />
+-        <option value="false" type="string" default="true"></option>
+-     <help>  </help>
+-</parameter>
+-<parameter key ="convergence" type="logical" optional="false">
+-     <section name="verbose" />
+-        <option value="false" type="string" default="true"></option>
+-     <help>  </help>
+-</parameter>
+-<parameter key ="control" type="logical" optional="false">
+-     <section name="verbose" />
+-        <option value="true" type="string" default="true"></option>
+-     <help>  </help>
+-</parameter>
+-<parameter key ="qmu" type="logical" optional="false">
+-     <section name="verbose" />
+-        <option value="true" type="string" default="true"></option>
+-     <help>  </help>
+-</parameter>
+-<parameter key ="autodiff" type="logical" optional="false">
+-     <section name="verbose" />
+-        <option value="false" type="string" default="true"></option>
+-     <help>  </help>
+-</parameter>
+-
+-<!-- settings -->
+-<parameter key ="results_on_nodes" type="double" default="0">
+-     <section name="settings" />
+-     <help> results are output for all the nodes of each element </help>
+-</parameter>
+-<parameter key ="io_gather" type="double" default="1">
+-     <section name="settings" />
+-     <help> I/O gathering strategy for result outputs (default 1) </help>
+-</parameter>
+-<parameter key ="lowmem" type="double" default="0">
+-     <section name="settings" />
+-     <help> is the memory limited ? (0 or 1) </help>
+-</parameter>
+-<parameter key ="output_frequency" type="double" default="1">
+-     <section name="settings" />
+-     <help> frequency at which results are saved in all solutions with multiple time_steps </help>
+-</parameter>
+-<parameter key ="waitonlock" type="double" default="Inf">
+-     <section name="settings" />
+-     <help> maximum number of minutes to wait for batch results (NaN to deactivate) </help>
+-</parameter>
+-<parameter key ="upload_server" type="char" default="N/A">
+-     <section name="settings" />
+-     <help> server hostname where model should be uploaded </help>
+-</parameter>
+-<parameter key ="upload_path" type="char" default="N/A">
+-     <section name="settings" />
+-     <help> path on server where model should be uploaded </help>
+-</parameter>
+-<parameter key ="upload_login" type="char" default="N/A">
+-     <section name="settings" />
+-     <help> server login </help>
+-</parameter>
+-<parameter key ="upload_port" type="double" default="0">
+-     <section name="settings" />
+-     <help> port login (default is 0) </help>
+-</parameter>
+-<parameter key ="upload_filename" type="char" default="N/A">
+-     <section name="settings" />
+-     <help> unique id generated when uploading the file to server </help>
+-</parameter>
+-
+-<!-- generic -->
+-<parameter key ="name" type="char" default="'XPS'">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="login" type="char" default="N/A">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="np" type="double" default="1">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="port" type="double" default="0">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="codepath" type="char" default=":/home/casper/work/issm/trunk:/home/casper/work/issm/trunk/bin">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="executionpath" type="char" default=":/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk/execution">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="etcpath" type="char" default=":/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk/etc">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="valgrind" type="char" default=":/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk/externalpackages/valgrind/install/bin/valgrind">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="valgrindlib" type="char" default=":/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk/externalpackages/valgrind/install/lib/libmpidebug.so">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="valgrindsup" type="char" default=":/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk/externalpackages/valgrind/issm.supp">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="verbose" type="double" default="1">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-
+-<!-- balancethickness -->
+-<parameter key ="spcthickness" type="double" default="N/A">
+-     <section name="balancethickness" />
+-     <help> thickness constraints (NaN means no constraint) [m] </help>
+-</parameter>
+-<parameter key ="thickening_rate" type="double" default="N/A">
+-     <section name="balancethickness" />
+-     <help> ice thickening rate used in the mass conservation (dh/dt) [m/yr] </help>
+-</parameter>
+-<parameter key ="stabilization" type="double" default="1">
+-     <section name="balancethickness" />
+-     <help> 0: None, 1: SU, 2: SSAs artificial diffusivity, 3:DG </help>
+-</parameter>
+-
+-<!-- StressBalance solution parameters: -->
+-<frame key="1" label="Convergence criteria">
+-<section name="stressbalance" />
+-<parameter key ="restol" type="double" default="0.0001">
+-     <section name="stressbalance" />
+-     <help> mechanical equilibrium residual convergence criterion </help>
+-</parameter>
+-<parameter key ="reltol" type="double" default="0.01">
+-     <section name="stressbalance" />
+-     <help> velocity relative convergence criterion, NaN: not applied </help>
+-</parameter>
+-<parameter key ="abstol" type="double" default="10">
+-     <section name="stressbalance" />
+-     <help> velocity absolute convergence criterion, NaN: not applied </help>
+-</parameter>
+-<parameter key ="isnewton" type="double" default="0">
+-     <section name="stressbalance" />
+-     <help> 0: Picards fixed point, 1: Newtons method, 2: hybrid </help>
+-</parameter>
+-<parameter key ="maxiter" type="double" default="100">
+-     <section name="stressbalance" />
+-     <help> maximum number of nonlinear iterations </help>
+-</parameter>
+-<parameter key ="viscosity_overshoot" type="double" default="0">
+-     <section name="stressbalance" />
+-     <help> over-shooting constant new=new+C*(new-old) </help>
+-</parameter>
+-</frame>
+-<frame key="2" label="Boundary conditions">
+-<section name="stressbalance" />
+-<parameter key ="spcvx" type="double" default="N/A">
+-     <section name="stressbalance" />
+-     <help> x-axis velocity constraint (NaN means no constraint) [m/yr] </help>
+-</parameter>
+-<parameter key ="spcvy" type="double" default="N/A">
+-     <section name="stressbalance" />
+-     <help> y-axis velocity constraint (NaN means no constraint) [m/yr] </help>
+-</parameter>
+-<parameter key ="spcvz" type="double" default="N/A">
+-     <section name="stressbalance" />
+-     <help> z-axis velocity constraint (NaN means no constraint) [m/yr] </help>
+-</parameter>
+-</frame>
+-<frame key="3" label="Rift options">
+-<section name="stressbalance" />
+-<parameter key ="rift_penalty_threshold" type="double" default="0">
+-     <section name="stressbalance" />
+-     <help> threshold for instability of mechanical constraints </help>
+-</parameter>
+-<parameter key ="rift_penalty_lock" type="double" default="10">
+-     <section name="stressbalance" />
+-     <help> number of iterations before rift penalties are locked </help>
+-</parameter>
+-</frame>
+-<frame key="4" label="Other">
+-<section name="stressbalance" />
+-<parameter key ="shelf_dampening" type="double" default="0">
+-     <section name="stressbalance" />
+-     <help> use dampening for floating ice ? Only for FS model </help>
+-</parameter>
+-<parameter key ="FSreconditioning" type="double" default="10000000000000">
+-     <section name="stressbalance" />
+-     <help> multiplier for incompressibility equation. Only for FS model </help>
+-</parameter>
+-<parameter key ="referential" type="double" default="N/A">
+-     <section name="stressbalance" />
+-     <help> local referential </help>
+-</parameter>
+-<parameter key ="loadingforce" type="double" default="N/A">
+-     <section name="stressbalance" />
+-     <help> loading force applied on each point [N/m^3] </help>
+-</parameter>
+-<parameter key ="requested_outputs" type="cell" default="{'default'}">
+-     <section name="stressbalance" />
+-     <help> additional outputs requested </help>
+-</parameter>
+-</frame>
+-
+-
+-<!-- groundingline -->
+-<frame key="1" label="Grounding line migration parameters">
+-<section name="groundingline" />
+-<parameter key ="migration" type="char" default="'None'">
+-     <section name="groundingline" />
+-     <help> type of grounding line migration: "SoftMigration","AgressiveMigration" or "None" </help>
+-</parameter>
+-<parameter key ="melting_rate" type="double" default="0">
+-     <section name="groundingline" />
+-     <help> melting rate applied when previously grounded parts start floating [m/yr] </help>
+-</parameter></frame>
+-
+-
+-<!-- Hydrology -->
+-<frame key="1" label="Hydrologyshreve solution parameters">
+-<section name="hydrologyshreve" />
+-<parameter key ="spcwatercolumn" type="double" default="N/A">
+-     <section name="hydrologyshreve" />
+-     <help> water thickness constraints (NaN means no constraint) [m] </help>
+-</parameter>
+-<parameter key ="n" type="double" default="0.02">
+-     <section name="hydrologyshreve" />
+-     <help> Manning roughness coefficient </help>
+-</parameter>
+-<parameter key ="CR" type="double" default="0.01">
+-     <section name="hydrologyshreve" />
+-     <help> tortuosity parameter </help>
+-</parameter>
+-<parameter key ="p" type="double" default="2">
+-     <section name="hydrologyshreve" />
+-     <help> dimensionless exponent in Manning velocity formula </help>
+-</parameter>
+-<parameter key ="q" type="double" default="1">
+-     <section name="hydrologyshreve" />
+-     <help> dimensionless exponent in Manning velocity formula </help>
+-</parameter>
+-<parameter key ="kn" type="double" default="0">
+-     <section name="hydrologyshreve" />
+-     <help> parameter in effective pressure formula </help>
+-</parameter>
+-<parameter key ="stabilization" type="double" default="1">
+-     <section name="hydrologyshreve" />
+-     <help> artificial diffusivity (default is 1). can be more than 1 to increase diffusivity. </help>
+-</parameter>
+-</frame>
+-<!-- masstransport -->
+-<frame key="1" label="Masstransport solution parameters">
+-<section name="masstransport" />
+-  <parameter key ="spcthickness" type="double" default="N/A">
+-     <section name="masstransport" />
+-     <help> thickness constraints (NaN means no constraint) [m] </help>
+-  </parameter>
+-  <parameter key ="calvingrate" type="double" default="N/A">
+-     <section name="masstransport" />
+-     <help> calving rate at given location [m/a] </help>
+-  </parameter>
+-  <parameter key ="isfreesurface" type="double" default="0">
+-     <section name="masstransport" />
+-     <help> do we use free surfaces (FS only) are mass conservation </help>
+-  </parameter>
+-  <parameter key ="min_thickness" type="double" default="1">
+-     <section name="masstransport" />
+-     <help> minimum ice thickness allowed [m] </help>
+-  </parameter>
+-  <parameter key ="hydrostatic_adjustment" type="char" default="'Absolute'">
+-     <section name="masstransport" />
+-     <help> adjustment of ice shelves surface and bed elevations: 'Incremental' or 'Absolute'  </help>
+-  </parameter>
+-  <parameter key ="stabilization" type="double" default="1">
+-     <section name="masstransport" />
+-     <help> 0: no, 1:  artificial_diffusivity, 2: streamline upwinding, 3: discontinuous Galerkin </help>
+-  </parameter>
+-</frame>
+-<frame key="2" label="Penalty options">
+-<section name="masstransport" />
+-  <parameter key ="vertex_pairing" type="double" default="N/A">
+-     <section name="masstransport" />
+-     <help> offset used by penalties: penalty = Kmax*10^offset </help>
+-  </parameter>
+-  <parameter key ="penalty_factor" type="double" default="3">
+-     <section name="masstransport" />
+-     <help> pairs of vertices that are penalized </help>
+-  </parameter>
+-  <parameter key ="requested_outputs" type="cell" default="{'default'}">
+-     <section name="masstransport" />
+-     <help> additional outputs requested </help>
+-  </parameter>
+-</frame>
+-<!-- thermal -->
+-<frame key="1" label="Thermal solution parameters">
+-<section name="thermal" />
+-  <parameter key ="spctemperature" type="double" default="N/A">
+-     <section name="thermal" />
+-     <help> temperature constraints (NaN means no constraint) [K] </help>
+-  </parameter>
+-  <parameter key ="penalty_threshold" type="double" default="0">
+-     <section name="thermal" />
+-     <help> 0: no, 1: artificial_diffusivity, 2: SUPG </help>
+-  </parameter>
+-  <parameter key ="stabilization" type="double" default="1">
+-     <section name="thermal" />
+-     <help> maximum number of non linear iterations </help>
+-  </parameter>
+-  <parameter key ="maxiter" type="double" default="100">
+-     <section name="thermal" />
+-     <help> stabilize unstable thermal constraints that keep zigzagging after n iteration (default is 0, no stabilization) </help>
+-  </parameter>
+-  <parameter key ="penalty_lock" type="double" default="0">
+-     <section name="thermal" />
+-     <help> threshold to declare convergence of thermal solution (default is 0)  </help>
+-  </parameter>
+-  <parameter key ="penalty_factor" type="double" default="3">
+-     <section name="thermal" />
+-     <help> scaling exponent (default is 3) </help>
+-  </parameter>
+-  <parameter key ="isenthalpy" type="double" default="0">
+-     <section name="thermal" />
+-     <help> use an enthalpy formulation to include temperate ice (default is 0) </help>
+-  </parameter>
+-  <parameter key ="isdynamicbasalspc" type="double" default="0">
+-     <section name="thermal" />
+-     <help> enable dynamic setting of basal forcing. required for enthalpy formulation (default is 0)  </help>
+-  </parameter>
+-  <parameter key ="requested_outputs" type="cell" default="{'default'}">
+-     <section name="thermal" />
+-     <help> additional outputs requested </help>
+-  </parameter>
+-</frame>
+-<!-- steadystate -->
+-<frame key="1" label="steadystate solution parameters">
+-<section name="steadystate" />
+-  <parameter key ="reltol" type="double" default="0.01">
+-     <section name="steadystate" />
+-     <help> relative tolerance criterion [K] </help>
+-  </parameter>
+-  <parameter key ="maxiter" type="double" default="100">
+-     <section name="steadystate" />
+-     <help> maximum number of iterations </help>
+-  </parameter>
+-  <parameter key ="requested_outputs" type="cell" default="{'default'}">
+-     <section name="steadystate" />
+-     <help> additional requested outputs </help>
+-  </parameter>
+-</frame>
+-<!-- transient -->
+-<frame key="1" label="transient solution parameters">
+-<section name="transient" />
+-  <parameter key ="ismasstransport" type="double" default="1">
+-     <section name="transient" />
+-     <help> indicates whether a masstransport solution is used in the transient </help>
+-  </parameter>
+-  <parameter key ="isstressbalance" type="double" default="1">
+-     <section name="transient" />
+-     <help> indicates whether a stressbalance solution is used in the transient </help>
+-  </parameter>
+-  <parameter key ="isthermal" type="double" default="1">
+-     <section name="transient" />
+-     <help> indicates whether a thermal solution is used in the transient </help>
+-  </parameter>
+-  <parameter key ="isgroundingline" type="double" default="0">
+-     <section name="transient" />
+-     <help> indicates whether a groundingline migration is used in the transient </help>
+-  </parameter>
+-  <parameter key ="isgia" type="double" default="0">
+-     <section name="transient" />
+-     <help> indicates whether a postglacial rebound model is used in the transient </help>
+-  </parameter>
+-  <parameter key ="isdamage" type="double" default="0">
+-     <section name="transient" />
+-     <help> indicates whether damage evolution is used in the transient </help>
+-  </parameter>
+-  <parameter key ="islevelset" type="double" default="0">
+-     <section name="transient" />
+-     <help> LEVEL SET DESCRIPTION...  </help>
+-  </parameter>
+-  <parameter key ="requested_outputs" type="cell" default="{'default'}">
+-     <section name="transient" />
+-     <help> list of additional outputs requested </help>
+-  </parameter>
+-</frame>
+-<!-- gia -->
+-<frame key="1" label="gia parameters">
+-<section name="gia" />
+-  <parameter key ="mantle_viscosity" type="double" default="N/A">
+-     <section name="gia" />
+-     <help> mantle viscosity[Pa s] </help>
+-  </parameter>
+-  <parameter key ="lithosphere_thickness" type="double" default="N/A">
+-     <section name="gia" />
+-     <help> lithosphere thickness (km) </help>
+-  </parameter>
+-  <parameter key ="cross_section_shape" type="double" default="1">
+-     <section name="gia" />
+-     <help> 1: square-edged (default). 2: elliptical.  See iedge in GiaDeflectionCore </help>
+-  </parameter>
+-</frame>
+-<!-- autodiff -->
+-<frame key="1" label="automatic differentiation parameters">
+-<section name="autodiff" />
+-  <parameter key ="isautodiff" type="logical" optional="false">
+-     <section name="autodiff" />
+-         <option value="false" type="string" default="true"></option>
+-     <help> indicates if the automatic differentiation is activated </help>
+-  </parameter>
+-  <parameter key ="dependents" type="cell" default="(0x0)">
+-     <section name="autodiff" />
+-     <help> list of dependent variables </help>
+-  </parameter>
+-  <parameter key ="independents" type="cell" default="(0x0)">
+-     <section name="autodiff" />
+-     <help> list of independent variables </help>
+-  </parameter>
+-  <parameter key ="driver" type="char" default="'fos_forward'">
+-     <section name="autodiff" />
+-     <help> ADOLC driver ('fos_forward' or 'fov_forward') </help>
+-  </parameter>
+-  <parameter key ="obufsize" type="double" default="524288">
+-     <section name="autodiff" />
+-     <help> Number of operations per buffer (==OBUFSIZE in usrparms.h)  </help>
+-  </parameter>
+-  <parameter key ="lbufsize" type="double" default="524288">
+-     <section name="autodiff" />
+-     <help> Number of locations per buffer (==LBUFSIZE in usrparms.h) </help>
+-  </parameter>
+-  <parameter key ="cbufsize" type="double" default="524288">
+-     <section name="autodiff" />
+-     <help> Number of values per buffer (==CBUFSIZE in usrparms.h) </help>
+-  </parameter>
+-  <parameter key ="tbufsize" type="double" default="524288">
+-     <section name="autodiff" />
+-     <help> Number of taylors per buffer (&amp;lt;=TBUFSIZE in usrparms.h) </help>
+-  </parameter>
+-  <parameter key ="gcTriggerRatio" type="double" default="2">
+-     <section name="autodiff" />
+-     <help> free location block sorting/consolidation triggered if the ratio between allocated and used locations exceeds gcTriggerRatio </help>
+-  </parameter>
+-  <parameter key ="gcTriggerRatio" type="double" default="2">
+-     <section name="autodiff" />
+-     <help> free location block sorting/consolidation triggered if the allocated locations exceed gcTriggerMaxSize </help>
+-  </parameter>
+-</frame>
+-<!-- flaim -->
+-<frame key="1" label="Input:">
+-<section name="flaim" />
+-  <parameter key ="targets" type="char" default="N/A">
+-     <section name="flaim" />
+-     <help> name of kml output targets file </help>
+-  </parameter>
+-  <parameter key ="tracks" type="char" default="N/A">
+-     <section name="flaim" />
+-     <help> name of kml input tracks file </help>
+-  </parameter>
+-  <parameter key ="flightreqs" type="struct" default="N/A">
+-     <section name="flaim" />
+-     <help> structure of kml flight requirements (not used yet) </help>
+-  </parameter>
+-  <parameter key ="criterion" type="double" default="N/A">
+-     <section name="flaim" />
+-     <help> element or nodal criterion for flight path evaluation (metric) </help>
+-  </parameter>
+-</frame>
+-<frame key="2" label="Arguments:">
+-<section name="flaim" />
+-  <parameter key ="gridsatequator" type="double" default="200000">
+-     <section name="flaim" />
+-     <help> number of grids at equator (determines resolution) </help>
+-  </parameter>
+-  <parameter key ="usevalueordering" type="logical" optional="false">
+-     <section name="flaim" />
+-         <option value="true" type="string" default="true"></option>
+-     <help> flag to consider target values for flight path evaluation </help>
+-  </parameter>
+-  <parameter key ="split_antimeridian" type="logical" optional="false">
+-     <section name="flaim" />
+-         <option value="true" type="string" default="true"></option>
+-     <help> flag to split polygons on the antimeridian </help>
+-  </parameter>
+-</frame>
+-<frame key="3" label="Optimization:">
+-<section name="flaim" />
+-  <parameter key ="path_optimize" type="logical" optional="false">
+-     <section name="flaim" />
+-         <option value="false" type="string" default="true"></option>
+-     <help> optimize? (default false) </help>
+-  </parameter>
+-  <parameter key ="opt_ndir" type="double" default="1">
+-     <section name="flaim" />
+-     <help> number of directions to test when moving a point.  If this value = 1, a random direction is tested. A value > 1 results in directions equally spaced from [0, 2*PI] being tested. For example, 4 would result in directions [0, PI/2, PI, 3PI/2] </help>
+-  </parameter>
+-  <parameter key ="opt_dist" type="double" default="25">
+-     <section name="flaim" />
+-     <help> specifies the distance in km (default 25) to move a randomly selected path point on each iteration </help>
+-  </parameter>
+-  <parameter key ="opt_niter" type="double" default="30000">
+-     <section name="flaim" />
+-     <help> number of iterations (default 30,000) to run for flightplan optimization, i.e. the number of times to randomly select a point and move it. </help>
+-  </parameter>
+-</frame>
+-<frame key="4" label="Output:">
+-<section name="flaim" />
+-  <parameter key ="solution" type="char" default="N/A">
+-     <section name="flaim" />
+-     <help> name of kml solution file </help>
+-  </parameter>
+-  <parameter key ="quality" type="double" default="0">
+-     <section name="flaim" />
+-     <help> quality of kml solution </help>
+-  </parameter>
+-</frame>
+-<!-- inversion -->
+-<frame key="1" label="inversion parameters">
+-<section name="inversion" />
+-  <parameter key ="iscontrol" type="double" default="0">
+-     <section name="inversion" />
+-     <help> is inversion activated? </help>
+-  </parameter>
+-  <parameter key ="incomplete_adjoint" type="double" default="1">
+-     <section name="inversion" />
+-     <help> 1: linear viscosity, 0: non-linear viscosity </help>
+-  </parameter>
+-  <parameter key ="control_parameters" type="cell" default="{'FrictionCoefficient'}">
+-     <section name="inversion" />
+-     <help> ex: {'FrictionCoefficient'}, or {'MaterialsRheologyBbar'} </help>
+-  </parameter>
+-  <parameter key ="nsteps" type="double" default="20">
+-     <section name="inversion" />
+-     <help> number of optimization searches </help>
+-  </parameter>
+-  <parameter key ="cost_functions" type="double" default="101">
+-     <section name="inversion" />
+-     <help> indicate the type of response for each optimization step  </help>
+-  </parameter>
+-  <parameter key ="cost_functions_coefficients" type="double" default="N/A">
+-     <section name="inversion" />
+-     <help> cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter </help>
+-  </parameter>
+-  <parameter key ="cost_function_threshold" type="double" default="N/A">
+-     <section name="inversion" />
+-     <help> misfit convergence criterion. Default is 1%, NaN if not applied </help>
+-  </parameter>
+-  <parameter key ="maxiter_per_step" type="double" default="(20x1)">
+-     <section name="inversion" />
+-     <help> maximum iterations during each optimization step  </help>
+-  </parameter>
+-  <parameter key ="gradient_scaling" type="double" default="(20x1)">
+-     <section name="inversion" />
+-     <help> scaling factor on gradient direction during optimization, for each optimization step </help>
+-  </parameter>
+-  <parameter key ="step_threshold" type="double" default="(20x1)">
+-     <section name="inversion" />
+-     <help> decrease threshold for misfit, default is 30% </help>
+-  </parameter>
+-  <parameter key ="min_parameters" type="double" default="N/A">
+-     <section name="inversion" />
+-     <help> absolute minimum acceptable value of the inversed parameter on each vertex </help>
+-  </parameter>
+-  <parameter key ="max_parameters" type="double" default="N/A">
+-     <section name="inversion" />
+-     <help> absolute maximum acceptable value of the inversed parameter on each vertex </help>
+-  </parameter>
+-  <parameter key ="vx_obs" type="double" default="N/A">
+-     <section name="inversion" />
+-     <help> observed velocity x component [m/yr] </help>
+-  </parameter>
+-  <parameter key ="vy_obs" type="double" default="N/A">
+-     <section name="inversion" />
+-     <help> observed velocity y component [m/yr]  </help>
+-  </parameter>
+-  <parameter key ="vel_obs" type="double" default="N/A">
+-     <section name="inversion" />
+-     <help> observed velocity magnitude [m/yr] </help>
+-  </parameter>
+-  <parameter key ="thickness_obs" type="double" default="N/A">
+-     <section name="inversion" />
+-     <help> observed thickness [m]) </help>
+-  </parameter>
+-</frame>
+-<frame key="2" label="Available cost functions">
+-<section name="inversion" />
+-  <parameter key ="SurfaceAbsVelMisfit" type="string" default="101">
+-     <section name="inversion" />
+-     <help>  </help>
+-  </parameter>
+-  <parameter key ="SurfaceRelVelMisfit" type="string" default="102">
+-     <section name="inversion" />
+-     <help>   </help>
+-  </parameter>
+-  <parameter key ="SurfaceLogVelMisfit" type="string" default="103">
+-     <section name="inversion" />
+-     <help>  </help>
+-  </parameter>
+-  <parameter key ="SurfaceLogVxVyMisfit" type="string" default="104">
+-     <section name="inversion" />
+-     <help>  </help>
+-  </parameter>
+-  <parameter key ="SurfaceAverageVelMisfit" type="string" default="105">
+-     <section name="inversion" />
+-     <help>   </help>
+-  </parameter>
+-  <parameter key ="ThicknessAbsMisfit" type="string" default="106">
+-     <section name="inversion" />
+-     <help>  </help>
+-  </parameter>
+-  <parameter key ="DragCoefficientAbsGradient" type="string" default="107">
+-     <section name="inversion" />
+-     <help>  </help>
+-  </parameter>
+-  <parameter key ="RheologyBbarAbsGradient" type="string" default="108">
+-     <section name="inversion" />
+-     <help>  </help>
+-  </parameter>
+-  <parameter key ="ThicknessAbsGradient" type="string" default="109">
+-     <section name="inversion" />
+-     <help> </help>
+-  </parameter>
+-</frame>
+-<!-- qmu -->
+-<frame key="1" label="qmu parameters">
+-<section name="qmu" />
+-  <parameter key ="isdakota" type="double" default="0">
+-     <section name="qmu" />
+-     <help> is qmu analysis activated? </help>
+-  </parameter>
+-  <parameter key ="variables" type="struct" default="N/A">
+-     <section name="qmu" />
+-     <help> (arrays of each variable class) </help>
+-  </parameter>
+-  <parameter key ="responses" type="struct" default="N/A">
+-     <section name="qmu" />
+-     <help> (arrays of each response class) </help>
+-  </parameter>
+-  <parameter key ="numberofresponses" type="double" default="0">
+-     <section name="qmu" />
+-     <help> number of responses </help>
+-  </parameter>
+-  <parameter key ="params" type="struct" default="N/A">
+-     <section name="qmu" />
+-     <help> (array of method-independent parameters)  </help>
+-  </parameter>
+-  <parameter key ="results" type="struct" default="N/A">
+-     <section name="qmu" />
+-     <help> (information from dakota files) </help>
+-  </parameter>
+-  <parameter key ="partition" type="double" default="N/A">
+-     <section name="qmu" />
+-     <help> user provided mesh partitioning, defaults to metis if not specified </help>
+-  </parameter>
+-  <parameter key ="numberofpartitions" type="double" default="0">
+-     <section name="qmu" />
+-     <help> number of partitions for semi-discrete qmu  </help>
+-  </parameter>
+-  <parameter key ="variabledescriptors" type="cell" default="(0x0)">
+-     <section name="qmu" />
+-     <help>  </help>
+-  </parameter>
+-  <parameter key ="responsedescriptors" type="cell" default="(0x0)">
+-     <section name="qmu" />
+-     <help> use an enthalpy formulation to include temperate ice (default is 0) </help>
+-  </parameter>
+-  <parameter key ="method" type="struct" default="N/A">
+-     <section name="qmu" />
+-     <help> array of dakota_method class </help>
+-  </parameter>
+-  <parameter key ="mass_flux_profile_directory" type="double" default="N/A">
+-     <section name="qmu" />
+-     <help> directory for mass flux profiles </help>
+-  </parameter>
+-  <parameter key ="mass_flux_profiles" type="double" default="N/A">
+-     <section name="qmu" />
+-     <help>  </help>
+-  </parameter>
+-  <parameter key ="mass_flux_segments" type="cell" default="(0x0)">
+-     <section name="qmu" />
+-     <help>  </help>
+-  </parameter>
+-  <parameter key ="adjacency" type="double" default="N/A">
+-     <section name="qmu" />
+-     <help> additional outputs requested </help>
+-  </parameter>
+-  <parameter key ="vertex_weight" type="double" default="N/A">
+-     <section name="qmu" />
+-     <help> weight applied to each mesh vertex </help>
+-  </parameter>
+-</frame>
+-<!-- outputdefinition -->
+-<frame key="1" label="outputdefinition">
+-<section name="outputdefinition" />
+-  <parameter key ="definitions" type="cell" default="(0x0)">
+-     <section name="outputdefinition" />
+-     <help> list of potential outputs that can be requested, but which need additional data to be defined </help>
+-  </parameter>
+-</frame>
+-<!-- miscellaneous -->
+-<frame key="1" label="miscellaneous parameters">
+-<section name="miscellaneous" />
+-  <parameter key ="notes" type="char" default="N/A">
+-     <section name="miscellaneous" />
+-     <help> notes in a cell of strings </help>
+-  </parameter>
+-  <parameter key ="name" type="char" default="N/A">
+-     <section name="miscellaneous" />
+-     <help> model name </help>
+-  </parameter>
+-  <parameter key ="dummy" type="struct" default="N/A">
+-     <section name="miscellaneous" />
+-     <help> empty field to store some data </help>
+-  </parameter>
+-</frame>
+-
+-
+-</inishell_config>
+\ No newline at end of file
+Index: ../trunk-jpl/src/java/lib/miglayout-4.0.jar
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/MANIFEST.MF
+===================================================================
+--- ../trunk-jpl/src/java/MANIFEST.MF	(revision 18297)
++++ ../trunk-jpl/src/java/MANIFEST.MF	(revision 18298)
+@@ -1,14 +0,0 @@
+-Manifest-Version: 1.0
+-Ant-Version: Apache Ant 1.8.4
+-Created-By: 1.6.0_51-b11-457-11M4509 (Apple Inc.)
+-Built-By: larour
+-Built-On: 2014-04-14
+-Built-At: 14:27:23
+-Main-Class: main/GUIBuilder
+-Specification-Title: INI file generator
+-Specification-Version: 1.0.0-20140414
+-Specification-Vendor: SLF, www.slf.ch
+-Implementation-Title: INIshell ini creator
+-Implementation-Version: 1.0.0
+-Implementation-Vendor: SLF, www.slf.ch
+-
+Index: ../trunk-jpl/src/java/src/gui_elements/OptionPanel.java
+===================================================================
+--- ../trunk-jpl/src/java/src/gui_elements/OptionPanel.java	(revision 18297)
++++ ../trunk-jpl/src/java/src/gui_elements/OptionPanel.java	(revision 18298)
+@@ -1,144 +0,0 @@
+-/***********************************************************************************/
+-/*  Copyright 2012 WSL Institute for Snow and Avalanche Research    SLF-DAVOS      */
+-/***********************************************************************************/
+-/*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*
+-*/
+-
+-package gui_elements;
+-
+-import java.awt.event.ItemEvent;
+-import java.awt.event.ItemListener;
+-import java.util.LinkedList;
+-import java.util.HashMap;
+-import javax.swing.event.EventListenerList;
+-
+-import main.GUIBuilder;
+-import main.XMLHelper;
+-
+-import org.w3c.dom.Element;
+-import org.w3c.dom.Node;
+-
+-/**
+- * A ControlledPanel that maintains a group of choices and invokes panel
+- * creation according to the current choices.
+- *
+- * @author korhammer et egger
+- *
+- */
+-public abstract class OptionPanel extends ControlledPanel implements ItemListener {
+-
+-	private static final long serialVersionUID = 88L;
+-
+-	protected LinkedList<String> defaultTrues;
+-	protected EventListenerList listenerList;
+-
+-	protected String[] values;
+-	protected String[] labels;
+-	protected String[] helptexts;
+-
+-	/**
+-	 * The constructor for an OptionPanel.
+-	 *
+-	 * @param element
+-	 *            : The xml element which the OptionPanel is created for.
+-	 * @throws GUIBuildException
+-	 */
+-	public OptionPanel(Element element, ControlledPanel parent) throws GUIBuildException {
+-		this(element, parent, true);
+-	}
+-
+-	public OptionPanel(Element element, ControlledPanel parent, boolean doLayout) throws GUIBuildException {
+-		super(element, parent, doLayout);
+-		
+-		String elementdefault = "";
+-
+-		if (element.hasAttribute("default"))
+-			elementdefault = element.getAttribute("default");
+-
+-		listenerList = new EventListenerList();
+-
+-		final Element[] options = XMLHelper.getElementArray(element, "option");
+-		defaultTrues = new LinkedList<String>();
+-
+-		values = new String[options.length];
+-		labels = new String[options.length];
+-		helptexts = new String[options.length];
+-
+-		for (int i=0;i<options.length;i++) {
+-			values[i] = options[i].getAttribute("value");
+-			labels[i] = options[i].getAttribute("label");
+-
+-			if (labels[i] == "")
+-				labels[i] = values[i];
+-
+-			if (elementdefault.equals(values[i]))
+-				defaultTrues.add(values[i]);
+-
+-			if (options[i].hasAttribute("default") && options[i].getAttribute("default").equals("true"))
+-				defaultTrues.add(values[i]);
+-
+-			helptexts[i] = XMLHelper.getChildElementContent(options[i],"help");
+-		}
+-	}
+-
+-	@Override
+-	public void set(HashMap hm, String key, String value) {
+-		//System.out.println("Trying to change OptionPanel");
+-		//ControlledPanel child = add("TA2");
+-		//child.set(element);
+-	}
+-
+-
+-	/**
+-	 * Invokes the appropriate build or destruct methods when changes are made
+-	 * to choices.
+-	 *
+-	 * @param arg0
+-	 * @param selectedOption
+-	 */
+-	public void handleItemEvent(ItemEvent arg0, String selectedOption) {
+-		handleItemEvent(arg0, selectedOption, false, null, null, null);
+-	}
+-
+-	public void handleItemEvent(ItemEvent arg0, String selectedOption, boolean doSet, HashMap hm, String setKey, String setValue) {
+-		Element optionElement = XMLHelper.getCertainChildElement(this.element, "option", "label", selectedOption);
+-
+-		if (optionElement == null)
+-			optionElement = XMLHelper.getCertainChildElement(this.element, "option", "value", selectedOption);
+-
+-		//System.out.println("XML of handleItem("+arg0.getItemSelectable().getClass().toString()+"): " + XMLHelper.getString((Node)optionElement));//this.element));
+-
+-		if (arg0.getStateChange() == ItemEvent.SELECTED) {
+-			try {
+-				GUIBuilder.recursiveBuild(optionElement, this, doSet, hm, setKey, setValue);
+-			} catch (final GUIBuildException e) {
+-				// TODO Auto-generated catch block
+-				e.printStackTrace();
+-			}
+-
+-		} else {
+-			try {
+-				GUIBuilder.recursiveDestruct(optionElement, this);
+-			} catch (final GUIBuildException e) {
+-				// TODO Auto-generated catch block
+-				e.printStackTrace();
+-			}
+-		}
+-
+-	}
+-
+-}
+Index: ../trunk-jpl/src/java/src/gui_elements/TextfieldPanel.java
+===================================================================
+--- ../trunk-jpl/src/java/src/gui_elements/TextfieldPanel.java	(revision 18297)
++++ ../trunk-jpl/src/java/src/gui_elements/TextfieldPanel.java	(revision 18298)
+@@ -1,129 +0,0 @@
+-/***********************************************************************************/
+-/*  Copyright 2012 WSL Institute for Snow and Avalanche Research    SLF-DAVOS      */
+-/***********************************************************************************/
+-/*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*
+-*/
+-
+-package gui_elements;
+-
+-import main.GUI;
+-
+-import java.awt.*;
+-import java.awt.event.*;
+-import java.util.HashMap;
+-
+-import javax.swing.JTextField;
+-import javax.swing.JOptionPane;
+-
+-import org.w3c.dom.Element;
+-
+-/**
+- * A panel that contains a textfield.
+- *
+- * @author korhammer et egger
+- *
+- */
+-public class TextfieldPanel extends ControlledPanel implements KeyListener {
+-
+-	private static final long serialVersionUID = 1L;
+-	private String defaultText;
+-
+-	protected JTextField textfield;
+-
+-	/**
+-	 * The constructor for a TextfieldPanel.
+-	 *
+-	 * @param element
+-	 */
+-	public TextfieldPanel(Element element, ControlledPanel parent) {
+-		super(element, parent);
+-		textfield = new JTextField(10);
+-		textfield.setVisible(true);
+-		this.add(textfield, "width 250:100:400, cell 1 0, growx, ay top, gaptop 3");
+-		textfield.addKeyListener(this);
+-
+-		defaultText = "";
+-		if (element.hasAttribute("default")) {
+-			defaultText = element.getAttribute("default");
+-		}
+-		textfield.setText(defaultText);
+-
+-		if (!optional)
+-			textfield.setBackground(GUI.WARNING_BACKGROUND_COLOR);
+-
+-		this.checkBgColor();
+-		textfield.invalidate();
+-	}
+-
+-
+-
+-	@Override
+-	public void close() {
+-		// TODO Auto-generated method stub
+-
+-	}
+-
+-	@Override
+-	public void set(HashMap hm, String key, String value) {
+-		//System.out.println("\tI'm changing the label of the TextField with key '" + this.getKey() + "'");
+-		String val = (String)hm.get(hashKey);
+-		if (val != null) textfield.setText(val);
+-		this.checkBgColor();
+-	}
+-
+-	@Override
+-	public String getValue() {
+-		String thetext = textfield.getText();
+-
+-		if (!isOptional() && thetext.equals("")) {
+-			JOptionPane.showMessageDialog(null, "No value was entered for "
+-									+ getKey() + " (section '" + getSection().toUpperCase() + "')"
+-									+ ".\nA value is required. Your .ini-file is probably incorrect.",
+-									"Problem when building .ini file",
+-									JOptionPane.WARNING_MESSAGE);
+-		}
+-
+-		if (thetext.equals(""))
+-			return null;
+-
+-		return thetext;
+-	}
+-
+-	/** Handle the key typed event from the text field. */
+-	public void keyTyped(KeyEvent e) {}
+-
+-	/** Handle the key-pressed event from the text field. */
+-	public void keyPressed(KeyEvent e) {}
+-
+-	/** Handle the key-released event from the text field. */
+-	public void keyReleased(KeyEvent e) {
+-		checkBgColor();
+-	}
+-
+-	public void checkBgColor() {
+-		String text = textfield.getText();
+-		
+-		if (!optional) {
+-			if (text.length() > 0) {
+-				textfield.setBackground(GUI.NORMAL_BACKGROUND_COLOR);
+-			} else {
+-				textfield.setBackground(GUI.WARNING_BACKGROUND_COLOR);
+-			}
+-			textfield.invalidate();
+-		}
+-	}
+-}
+Index: ../trunk-jpl/src/java/src/gui_elements/FramePanel.java
+===================================================================
+--- ../trunk-jpl/src/java/src/gui_elements/FramePanel.java	(revision 18297)
++++ ../trunk-jpl/src/java/src/gui_elements/FramePanel.java	(revision 18298)
+@@ -1,71 +0,0 @@
+-/***********************************************************************************/
+-/*  Copyright 2012 WSL Institute for Snow and Avalanche Research    SLF-DAVOS      */
+-/***********************************************************************************/
+-/*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*
+-*/
+-
+-package gui_elements;
+-
+-import main.GUIBuilder;
+-import main.XMLHelper;
+-
+-import java.util.HashMap;
+-import javax.swing.JPanel;
+-import javax.swing.border.*;
+-import javax.swing.BorderFactory;
+-
+-import org.w3c.dom.Element;
+-import org.w3c.dom.Node;
+-import org.w3c.dom.NodeList;
+-import net.miginfocom.swing.MigLayout;
+-
+-public class FramePanel extends ControlledPanel {
+-
+-	private static final long serialVersionUID = 1987664773406118295L;
+-	protected String title = "";
+-
+-	/**
+-	 *
+-	 *
+-	 * @param element
+-	 * @throws GUIBuildException
+-	 */
+-	public FramePanel(Element element, ControlledPanel parent) throws GUIBuildException {
+-		super(element, parent, false);
+-		this.setLayout(new MigLayout("wrap 8, top, ins n 5 n n", "[200!][100!][100!][100!][100!][100!][300:400:400]", ""));
+-
+-		if (parent == null)	hierarchy = 1;
+-
+-		title = element.getAttribute("label");
+-
+-		Border mytitledborder = BorderFactory.createTitledBorder(title);
+-		//Border loweredetched = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
+-		this.setBorder(mytitledborder);
+-
+-		this.invalidate();
+-	}
+-
+-	@Override
+-	public String getValue() {
+-		return null;
+-	}
+-	
+-	@Override
+-	public void close() {
+-
+-	}
+-}
+Index: ../trunk-jpl/src/java/src/gui_elements/PathPanel.java
+===================================================================
+--- ../trunk-jpl/src/java/src/gui_elements/PathPanel.java	(revision 18297)
++++ ../trunk-jpl/src/java/src/gui_elements/PathPanel.java	(revision 18298)
+@@ -1,118 +0,0 @@
+-/***********************************************************************************/
+-/*  Copyright 2012 WSL Institute for Snow and Avalanche Research    SLF-DAVOS      */
+-/***********************************************************************************/
+-/*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*
+-*/
+-
+-package gui_elements;
+-
+-import java.awt.event.ActionEvent;
+-import java.awt.event.ActionListener;
+-import java.util.HashMap;
+-
+-import javax.swing.JButton;
+-import javax.swing.JFileChooser;
+-import javax.swing.JPanel;
+-
+-import org.w3c.dom.Element;
+-
+-public class PathPanel extends TextfieldPanel implements ActionListener {
+-
+-	/**
+-	 *
+-	 */
+-	private static final long serialVersionUID = 1486664773406118295L;
+-
+-	JButton select_button;
+-
+-	/**
+-	 * Creates a panel with a text field and a file / path chooser button.
+-	 *
+-	 * @param element
+-	 * @throws GUIBuildException
+-	 */
+-	public PathPanel(Element element, ControlledPanel parent) throws GUIBuildException {
+-		super(element, parent);
+-
+-		if (element.getAttribute("type").equals("path")) {
+-			select_button = new JButton("Select Path");
+-		} else if (element.getAttribute("type").equals("file")) {
+-			select_button = new JButton("Select File");
+-		} else {
+-			throw new GUIBuildException("PathPanel is not applicable for parameter types other than 'file' and 'path'.");
+-		}
+-
+-		this.remove(textfield);
+-		this.add(textfield, "cell 1 0, growx, span2");
+-
+-		select_button.addActionListener(this);
+-		select_button.setActionCommand("open chooser");
+-		select_button.setVisible(true);
+-		this.add(select_button, "cell 3 0, growx, wrap");
+-
+-	}
+-
+-	@Override
+-	public void actionPerformed(ActionEvent event) {
+-		if (event.getActionCommand().equals("open chooser") && event.getSource() == this.select_button) {
+-			try {
+-				chooseFile();
+-			} catch (final GUIBuildException e) {
+-				// TODO Auto-generated catch block
+-				e.printStackTrace();
+-			}
+-		}
+-	}
+-
+-	@Override
+-	public void set(HashMap hm, String key, String value) {
+-		String val = (String)hm.get(hashKey);
+-		if (val != null) textfield.setText(val);
+-		this.checkBgColor();
+-	}
+-
+-	/**
+-	 * Opens the file chooser dialog and writes the path / filepath into the
+-	 * texfield.
+-	 *
+-	 * @throws GUIBuildException
+-	 */
+-	public void chooseFile() throws GUIBuildException {
+-		final JFileChooser filechooser = new JFileChooser(System.getProperty("user.dir"));
+-
+-		if (element.getAttribute("type").equals("path")) {
+-			filechooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+-		} else if (element.getAttribute("type").equals("file")) {
+-			filechooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
+-		} else {
+-			throw new GUIBuildException("PathPanel is not applicable for parameter types other than 'file' and 'path'.");
+-		}
+-
+-		final int returnVal = filechooser.showOpenDialog(new JPanel());
+-
+-		if (returnVal == JFileChooser.APPROVE_OPTION) {
+-			if (element.getAttribute("type").equals("path")) {
+-				textfield.setText(filechooser.getSelectedFile().getAbsolutePath());
+-			} else {
+-				textfield.setText(filechooser.getSelectedFile().getName());
+-			}
+-
+-			checkBgColor();
+-		}
+-	}
+-
+-}
+Index: ../trunk-jpl/src/java/src/gui_elements/IntegerPanel.java
+===================================================================
+--- ../trunk-jpl/src/java/src/gui_elements/IntegerPanel.java	(revision 18297)
++++ ../trunk-jpl/src/java/src/gui_elements/IntegerPanel.java	(revision 18298)
+@@ -1,246 +0,0 @@
+-/***********************************************************************************/
+-/*  Copyright 2012 WSL Institute for Snow and Avalanche Research    SLF-DAVOS      */
+-/***********************************************************************************/
+-/*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*
+-*/
+-
+-package gui_elements;
+-
+-import java.awt.event.*;
+-import java.util.HashMap;
+-
+-import javax.swing.JButton;
+-import javax.swing.JOptionPane;
+-import javax.swing.SwingConstants;
+-
+-import org.w3c.dom.Element;
+-
+-/**
+- * A panel that maintains a number in an editable textfield,
+- * optionally with a maximum and minimum value.
+- * @author korhammer
+- *
+- */
+-/**
+- * @author korhammer
+- *
+- */
+-public class IntegerPanel extends TextfieldPanel implements ActionListener, FocusListener {
+-	/**
+-	 *
+-	 */
+-	private static final long serialVersionUID = -8959578535487185306L;
+-
+-	private int defaultvalue;
+-	private int maximumvalue;
+-	private int minimumvalue;
+-
+-	private boolean printPlus;
+-
+-	private final JButton down;
+-	private final JButton up;
+-
+-	/**
+-	 * Constructor for a NumberPanel.
+-	 *
+-	 * @param element
+-	 * @throws GUIBuildException
+-	 */
+-	public IntegerPanel(Element element, ControlledPanel parent) throws GUIBuildException {
+-		super(element, parent);
+-
+-		setDefaultvalue(0);
+-		minimumvalue = Integer.MIN_VALUE;
+-		maximumvalue = Integer.MAX_VALUE;
+-		printPlus = false;
+-
+-		if (element.getAttribute("type").equals("integer+")) {
+-			setPrintplus(true);
+-		} else {
+-			setPrintplus(false);
+-		}
+-
+-		if (element.hasAttribute("default")) {
+-			setDefaultvalue(element.getAttribute("default"));
+-		}
+-		if (element.hasAttribute("maximum")) {
+-			setMaximumvalue(element.getAttribute("maximum"));
+-		}
+-		if (element.hasAttribute("minimum")) {
+-			setMinimumvalue(element.getAttribute("minimum"));
+-		}
+-
+-		textfield.setColumns(4);
+-		textfield.invalidate();
+-		textfield.setHorizontalAlignment(SwingConstants.RIGHT);
+-
+-		up = new JButton("+");
+-		up.addActionListener(this);
+-		down = new JButton("-");
+-		down.addActionListener(this);
+-		this.add(up, "split 2, growx, ay top");
+-		this.add(down, "growx, ay top");
+-		textfield.addActionListener(this);
+-		textfield.addFocusListener(this);
+-
+-	}
+-
+-	/**
+-	 * Parses a String to an integer. Different from the standard methods as it
+-	 * handles the + sign e.g. in time zones.
+-	 *
+-	 * @param text
+-	 * @return the parsed number
+-	 * @throws NumberFormatException
+-	 */
+-	private static int parse(String text) throws NumberFormatException {
+-
+-		final char first = text.charAt(0);
+-
+-		if (first == '+')
+-			return Integer.parseInt(text.substring(1));
+-		if (first == '-')
+-			return Integer.parseInt(text);
+-		return Integer.parseInt(text);
+-	}
+-
+-	/*
+-	 * (non-Javadoc)
+-	 *
+-	 * @see
+-	 * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+-	 */
+-	@Override
+-	public void actionPerformed(ActionEvent e) {
+-		if (e.getSource() == up) {
+-			manipulateNumber(1);
+-		} else if (e.getSource() == down) {
+-			manipulateNumber(-1);
+-		} else if (e.getSource() == textfield) {
+-			parseTextfield();
+-		}
+-	}
+-
+-	@Override
+-	public void set(HashMap hm, String key, String value) {
+-		String val = (String)hm.get(hashKey);
+-		if (val != null) {
+-			try {
+-				Integer.parseInt(val);
+-				textfield.setText(val);
+-			} catch (Exception e) {} //Do nothing if conversion fails
+-		}
+-	}
+-
+-	@Override
+-	public void focusGained(FocusEvent arg0) {
+-
+-	}
+-
+-	@Override
+-	public void focusLost(FocusEvent arg0) {
+-		parseTextfield();
+-	}
+-
+-	/**
+-	 * Manipulates the number in the text field by parsing it, adding the
+-	 * increment and writing it back into the textfield.
+-	 *
+-	 * @param increment
+-	 */
+-	public void manipulateNumber(int increment) {
+-		int number;
+-
+-		try {
+-			number = parseTextfield();
+-		} catch (final NumberFormatException nfe) {
+-			return;
+-		}
+-
+-		if (number + increment <= maximumvalue
+-				&& number + increment >= minimumvalue) {
+-			number += increment;
+-		} else if (number + increment < minimumvalue) {
+-			number = minimumvalue;
+-		} else if (number + increment > maximumvalue) {
+-			number = maximumvalue;
+-		}
+-
+-		printToTextfield(number);
+-	}
+-
+-	/**
+-	 * Calls the parse method on the textfield.
+-	 *
+-	 * @return
+-	 * @throws NumberFormatException
+-	 */
+-	public int parseTextfield() throws NumberFormatException {
+-		try {
+-			return parse(textfield.getText());
+-		} catch (final NumberFormatException nfe) {
+-			JOptionPane.showMessageDialog(null, "The textfield " + getKey()
+-					+ " does not contain a number.");
+-			throw nfe;
+-		}
+-	}
+-
+-	/**
+-	 * Prints a number to the text field optionally with a plus sign.
+-	 *
+-	 * @param number
+-	 */
+-	public void printToTextfield(int number) {
+-		if (this.printPlus && number > 0) {
+-			textfield.setText("+" + number);
+-		} else {
+-			textfield.setText("" + number);
+-		}
+-		checkBgColor();
+-	}
+-
+-	public void setDefaultvalue(int defaultvalue) {
+-		this.defaultvalue = defaultvalue;
+-		this.printToTextfield(defaultvalue);
+-	}
+-
+-	public void setDefaultvalue(String defaultvalue) {
+-		this.defaultvalue = parse(defaultvalue);
+-		this.printToTextfield(this.defaultvalue);
+-	}
+-
+-	public void setMaximumvalue(int maximumvalue) {
+-		this.maximumvalue = maximumvalue;
+-	}
+-
+-	public void setMaximumvalue(String maximumvalue) {
+-		this.maximumvalue = parse(maximumvalue);
+-	}
+-
+-	public void setMinimumvalue(int minimumvalue) {
+-		this.minimumvalue = minimumvalue;
+-	}
+-
+-	public void setMinimumvalue(String minimumvalue) {
+-		this.minimumvalue = parse(minimumvalue);
+-	}
+-
+-	public void setPrintplus(boolean printPlus) {
+-		this.printPlus = printPlus;
+-		printToTextfield(parse(textfield.getText()));
+-	}
+-}
+Index: ../trunk-jpl/src/java/src/gui_elements/AlternativePanel.java
+===================================================================
+--- ../trunk-jpl/src/java/src/gui_elements/AlternativePanel.java	(revision 18297)
++++ ../trunk-jpl/src/java/src/gui_elements/AlternativePanel.java	(revision 18298)
+@@ -1,177 +0,0 @@
+-/***********************************************************************************/
+-/*  Copyright 2012 WSL Institute for Snow and Avalanche Research    SLF-DAVOS      */
+-/***********************************************************************************/
+-/*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*
+-*/
+-
+-package gui_elements;
+-
+-import java.awt.event.ItemEvent;
+-
+-import javax.swing.JComboBox;
+-import javax.swing.JOptionPane;
+-import java.util.HashMap;
+-import javax.swing.*;
+-import java.awt.*;
+-
+-import main.GUI;
+-
+-import org.w3c.dom.Element;
+-
+-/**
+- * The AlternativePanel contains a dropdown list with alternatives to choose from.
+- *
+- * @author Thomas Egger
+- *
+- */
+-public class AlternativePanel extends OptionPanel {
+-
+-	private static final long serialVersionUID = 4468480774697888798L;
+-	private final JComboBox box;
+-
+-	private String setKey = null, setValue = null;
+-	private boolean doSet = false;
+-	private HashMap setMap;
+-
+-	/**
+-	 * Constructor for the AlternativePanel
+-	 *
+-	 * @param element the <parameter ...> element for which the panel is created.
+-	 * @throws GUIBuildException
+-	 */
+-	public AlternativePanel(Element element, ControlledPanel parent) throws GUIBuildException {
+-		super(element, parent);
+-
+-		box = new JComboBox(labels);
+-		box.insertItemAt("", 0);     //Add an empty label
+-		box.setVisible(true);
+-		box.setSelectedIndex(0);
+-		box.addItemListener(this);
+-
+-		//Issue 263: On OSX the box.setBackground method does not function without this tweak:
+-		if (System.getProperty("os.name").equals("Mac OS X")) 
+-		    box.setRenderer(new ColorCellRenderer(box.getPreferredSize().width));
+-
+-		if (!optional) box.setBackground(GUI.WARNING_BACKGROUND_COLOR);
+-
+-		if (defaultTrues.size() > 1) {
+-			throw new GUIBuildException("Element " + getHashKey() + " has multiple default values");
+-		} else if (defaultTrues.size() == 1) {
+-			box.setSelectedItem(defaultTrues.getFirst());
+-		}
+-
+-		this.add(box, "cell 1 0, growx, ay top, wrap");
+-	}
+-
+-	@Override
+-	public void close() {
+-		this.box.setSelectedIndex(0);
+-	}
+-
+-	@Override
+-	public String getValue() {
+-
+-		if (box.getSelectedIndex() != 0) {
+-			//String selectedString = (String) box.getSelectedItem();
+-			int index = box.getSelectedIndex() - 1;
+-			if (index < 0)
+-				return "";
+-
+-			return values[index];
+-		}
+-
+-		if (!isOptional()) {
+-			JOptionPane.showMessageDialog(null, "No option was selected for "
+-									+ getKey() + " (section '" + getSection().toUpperCase() + "')"
+-									+ ".\nA value is required. Your .ini-file is probably incorrect.",
+-									"Problem when building .ini file",
+-									JOptionPane.WARNING_MESSAGE);
+-		}
+-
+-		return null;
+-	}
+-
+-	@Override
+-	public synchronized void set(HashMap hm, String key, String value) {
+-		doSet = true;
+-		setKey = key;
+-		setValue = value;
+-		setMap = hm;
+-
+-		if (!hm.containsKey(hashKey)) return;
+-		String val = ((String)hm.get(hashKey)).toUpperCase();
+-
+-		//System.out.println("\tAP: Setting AlternativePanel: " + hashKey + " = " + val);
+-
+-		for (int ii=0; ii<values.length; ii++) { //loop through all existant items
+-			if (val.equals(values[ii].toUpperCase())) { //compare to val
+-				this.box.setSelectedIndex(ii+1);
+-				break;
+-			}
+-		}
+-	}
+-
+-	@Override
+-	public synchronized void itemStateChanged(ItemEvent arg0) {
+-		//Deal with help text
+-		help.setText("");
+-
+-		if ((box.getSelectedIndex() > 0) && (helptexts[box.getSelectedIndex()-1] != null)) {
+-			help.setText("<html>" + helptexts[box.getSelectedIndex()-1] + "</html>");
+-		} else {
+-			if (helptext != null) 
+-				help.setText("<html>" + helptext + "</html>");
+-		}
+-
+-		//handle selected Item
+-		final String selectedOption = (String) arg0.getItem();
+-		if (selectedOption == "") {
+-			if (!optional) {
+-				box.setBackground(GUI.WARNING_BACKGROUND_COLOR);
+-			}
+-		} else {
+-			if (!optional) {
+-				box.setBackground(GUI.NORMAL_BACKGROUND_COLOR);
+-			}
+-			//System.out.println("\tDOSET of AlternativePanel: " + doSet);
+-			super.handleItemEvent(arg0, selectedOption, doSet, setMap, setKey, setValue);
+-			doSet = false;
+-			setKey = null;
+-			setMap = null;
+-			setValue = null;
+-		}
+-	}
+-}
+-
+-class ColorCellRenderer implements ListCellRenderer {
+-	protected DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
+-	private Dimension preferredSize = new Dimension(0, 18);
+-
+-	public ColorCellRenderer(int width) {
+-		width -= 50;
+-
+-		if (width < 100) width = 100; //Default size on OSX
+-	
+-		preferredSize = new Dimension(width, 18);
+-	}
+-
+-	public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
+-		JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+-		renderer.setPreferredSize(preferredSize);
+-		return renderer;
+-	}
+-}
+Index: ../trunk-jpl/src/java/src/gui_elements/DecimalPanel.java
+===================================================================
+--- ../trunk-jpl/src/java/src/gui_elements/DecimalPanel.java	(revision 18297)
++++ ../trunk-jpl/src/java/src/gui_elements/DecimalPanel.java	(revision 18298)
+@@ -1,133 +0,0 @@
+-/***********************************************************************************/
+-/*  Copyright 2012 WSL Institute for Snow and Avalanche Research    SLF-DAVOS      */
+-/***********************************************************************************/
+-/*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*
+-*/
+-
+-package gui_elements;
+-
+-import java.awt.event.ActionEvent;
+-import java.awt.event.ActionListener;
+-import java.awt.event.FocusEvent;
+-import java.awt.event.FocusListener;
+-import java.util.HashMap;
+-
+-import java.text.DecimalFormat;
+-import java.text.ParseException;
+-import java.text.DecimalFormatSymbols;
+-import javax.swing.JFormattedTextField;
+-
+-import org.w3c.dom.Element;
+-
+-public class DecimalPanel extends TextfieldPanel implements ActionListener, FocusListener{
+-
+-	/**
+-	 *
+-	 */
+-	private static final long serialVersionUID = 1555742510677354674L;
+-	double defaultvalue;
+-	double maximumvalue;
+-	double minimumvalue;
+-
+-	JFormattedTextField textfield;
+-
+-	public DecimalPanel(Element element, ControlledPanel parent) {
+-		super(element, parent);
+-		this.remove(super.textfield);
+-
+-		DecimalFormat format = (DecimalFormat)DecimalFormat.getInstance();
+-		DecimalFormatSymbols custom = new DecimalFormatSymbols();
+-		custom.setDecimalSeparator('.');
+-		format.setDecimalFormatSymbols(custom);
+-		format.setGroupingUsed(false);
+-
+-		textfield = new JFormattedTextField(format);
+-		textfield.addActionListener(this);
+-		textfield.addFocusListener(this);
+-		this.add(textfield,"cell 1 0, growx, ay top, gaptop 3");
+-		textfield.setVisible(true);
+-		this.invalidate();
+-		defaultvalue = 0.0;
+-		maximumvalue = Double.MAX_VALUE;
+-		minimumvalue = Double.MIN_VALUE;
+-
+-
+-		if(element.hasAttribute("minimum")){
+-			minimumvalue = Double.parseDouble(element.getAttribute("minimum"));
+-		}
+-		if(element.hasAttribute("maximum")){
+-			maximumvalue = Double.parseDouble(element.getAttribute("maximum"));
+-		}
+-		if(element.hasAttribute("default")){
+-			defaultvalue = Double.parseDouble(element.getAttribute("default"));
+-		}
+-		setToDefaultValue();
+-	}
+-
+-	private void setToDefaultValue() {
+-		textfield.setValue(new Double(defaultvalue));
+-		this.invalidate();
+-	}
+-
+-	private void checkValue(){
+-		try {
+-			textfield.commitEdit();
+-		} catch (ParseException e) {
+-			// TODO Auto-generated catch block
+-			e.printStackTrace();
+-		}
+-		double currentvalue = ((Number)textfield.getValue()).doubleValue();
+-		if(currentvalue > maximumvalue){
+-			textfield.setValue(new Double(maximumvalue));
+-		}
+-		else if(currentvalue<minimumvalue){
+-			textfield.setValue(new Double(minimumvalue));
+-		}
+-	}
+-
+-	public String getValue(){
+-		return textfield.getValue().toString();
+-	}
+-
+-	@Override
+-	public void set(HashMap hm, String key, String value) {
+-		String val = (String)hm.get(hashKey);
+-		if (val != null) {
+-			try {
+-				Double.parseDouble(val);
+-				textfield.setText(val);
+-			} catch (Exception e) {} //Do nothing if conversion fails
+-		}
+-	}
+-
+-	@Override
+-	public void focusGained(FocusEvent arg0) {
+-		checkValue();
+-
+-	}
+-
+-	@Override
+-	public void focusLost(FocusEvent arg0) {
+-		checkValue();
+-
+-	}
+-
+-	@Override
+-	public void actionPerformed(ActionEvent arg0) {
+-		checkValue();
+-	}
+-}
+Index: ../trunk-jpl/src/java/src/gui_elements/CombinedPanel.java
+===================================================================
+--- ../trunk-jpl/src/java/src/gui_elements/CombinedPanel.java	(revision 18297)
++++ ../trunk-jpl/src/java/src/gui_elements/CombinedPanel.java	(revision 18298)
+@@ -1,267 +0,0 @@
+-/***********************************************************************************/
+-/*  Copyright 2012 WSL Institute for Snow and Avalanche Research    SLF-DAVOS      */
+-/***********************************************************************************/
+-/*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*
+-*/
+-
+-package gui_elements;
+-
+-import java.awt.event.ItemEvent;
+-import java.text.NumberFormat;
+-import java.util.*;
+-import java.text.DecimalFormat;
+-import java.text.DecimalFormatSymbols;
+-
+-import javax.swing.JCheckBox;
+-import javax.swing.JComponent;
+-import javax.swing.JFormattedTextField;
+-import javax.swing.JTextField;
+-import javax.swing.JLabel;
+-import javax.swing.JComboBox;
+-
+-import main.XMLHelper;
+-
+-import org.w3c.dom.Element;
+-import org.w3c.dom.Node;
+-import org.w3c.dom.NodeList;
+-import net.miginfocom.swing.MigLayout;
+-
+-/**
+- * @brief The CombinedPanel may contain other panels, such as check and drop down boxes and text fields
+- *
+- * @author Thomas Egger
+- */
+-public class CombinedPanel extends OptionPanel {
+-	enum Type { CHOICE, INTEGER, DECIMAL, STRING, DROPDOWN }
+-
+-	/**
+-	 *
+-	 */
+-	private static final long serialVersionUID = -6751282938445852408L;;
+-
+-	private final LinkedList<JComponent> valueComponents;
+-
+-	/**
+-	 * Constructor for a panel that can hold text, numbers and check boxes. It
+-	 * corresponds to the parameter type "combination" in the configuration file
+-	 * and its subcomponents correspond to the option values.
+-	 *
+-	 * @param element
+-	 * @throws GUIBuildException
+-	 */
+-	public CombinedPanel(Element element, ControlledPanel parent) throws GUIBuildException {
+-		super(element, parent, false); //doing layout by itself
+-
+-		//System.out.println("Hierarchy: Parent: " + parent.getKey() + ": "+ parent.getHierarchy() + "  own: " + getHierarchy());
+-
+-		int column1 = 200;
+-		column1 -= getHierarchy() * 5;
+-		this.setLayout(new MigLayout("gapx 6, wrap 8, ins n 5 n n", "["+column1+"!][78!][78!][78!][78!][78!][78!][20!][200:400:400]", ""));
+-
+-		this.add(jlabel, "gapleft " + getHierarchy() * 5);
+-		this.add(help, "cell 8 0, wrap");
+-
+-		valueComponents = new LinkedList<JComponent>();
+-
+-		final Element[] optionElements = XMLHelper.getElementArray(element, "option");
+-
+-		byte lblcounter = 0;
+-
+-		DecimalFormat format = (DecimalFormat)DecimalFormat.getInstance();
+-		DecimalFormatSymbols custom = new DecimalFormatSymbols();
+-		custom.setDecimalSeparator('.');
+-		format.setDecimalFormatSymbols(custom);
+-		format.setGroupingUsed(false);
+-
+-		DecimalFormat integerFormat = (DecimalFormat)DecimalFormat.getIntegerInstance();
+-		integerFormat.setGroupingUsed(false);
+-
+-		int row = 0;
+-		int column = 1;
+-		
+-		for (int i=0;i<optionElements.length;i++) {
+-			final Type optionType = Type.valueOf(optionElements[i].getAttribute("type").toUpperCase());
+-			final String initialValue = optionElements[i].getAttribute("value");
+-			final String label = optionElements[i].getAttribute("label");
+-
+-			JComponent component = null;
+-			JLabel lblcomponent  = null;
+-
+-			NodeList nodelist = optionElements[i].getChildNodes();
+-
+-			switch (optionType) {
+-			case INTEGER:
+-				component = new JFormattedTextField(integerFormat);
+-				((JFormattedTextField)component).setColumns(8);
+-				if ((initialValue != null) && (!initialValue.equals("")))
+-					((JFormattedTextField)component).setValue(new Integer(initialValue));
+-				break;
+-			case DECIMAL:
+-				component = new JFormattedTextField(format);
+-				((JFormattedTextField)component).setColumns(8);
+-				if ((initialValue != null) && (!initialValue.equals("")))
+-					((JFormattedTextField)component).setValue((new Double(initialValue)));
+-				break;
+-			case STRING:
+-				component = new JTextField(10);
+-				((JTextField)component).setText(initialValue);
+-				break;
+-			case CHOICE:
+-				component = new JCheckBox(optionElements[i].getAttribute("value"));
+-				((JCheckBox)component).addItemListener(this);
+-				break;
+-			case DROPDOWN:
+-				component = new JComboBox();
+-
+-				for (int jj = 0; jj < nodelist.getLength(); jj++) {
+-					if (nodelist.item(jj).getNodeType() == Node.ELEMENT_NODE) {
+-						((JComboBox)component).addItem(((Element)nodelist.item(jj)).getAttribute("value"));
+-					}
+-				}
+-
+-				((JComboBox)component).setSelectedItem(optionElements[i].getAttribute("value"));
+-				((JComboBox)component).addItemListener(this);
+-				break;
+-			}
+-			
+-			int width = 1;
+-
+-			if ((label != null) && (!label.equals(""))){
+-				if (label.length() > 12) width = 2; //for oversize labels
+-
+-				if (column+width >= 7) { 
+-					column = 1; 
+-					row++; 
+-				}
+-				lblcomponent = new JLabel(label);
+-				valueComponents.add(lblcomponent);
+-				
+-				//System.out.println("component: " + component.getClass() + ");
+-				//System.out.println("component: " + lblcomponent.getClass() + "  size: " + lblcomponent.getWidth() + "  col: " + column + " row: " + row);
+-				this.add(lblcomponent, "cell " + column + " " + row + " " + width + " 1");
+-				column += width;
+-				width = 1;
+-				lblcomponent.setVisible(true);
+-			}
+-
+-			if (column >= 7) { 
+-				column = 1; 
+-				row++; 
+-			}
+-			//System.out.println("component: " + component.getClass() + "  size: " + component.getWidth() + "  col: " + column + " row: " + row);
+-			this.add(component, "cell " + column + " " + row + " " + width + " 1");
+-			column++;
+-
+-			valueComponents.add(component);
+-			component.setVisible(true);
+-		}
+-		
+-		//System.out.println("\t-->Instantiated one Combined Panel with " + optionElements.length + " components");
+-	}
+-
+-	@Override
+-	public void close() {
+-		// TODO Auto-generated method stub
+-
+-	}
+-
+-	@Override
+-	public void set(HashMap hm, String inkey, String invalue) {
+-		if (!hm.containsKey(hashKey)) return;
+-		String val = (String)hm.get(hashKey);
+-
+-		//System.out.println("\tSetting CombinedPanel: " + hashKey + " = " + val);
+-		//System.out.println("\tThis CombinedPanel has the key: " + this.getKey() + "  should be: " + inkey + " val: " + invalue);
+-
+-		//Now loop through valueComponents and see if the value string can be matched
+-		if (val == null) return;
+-
+-		String[] tokens = val.split("\\s+");
+-		int counter = 0;
+-
+-		//System.out.println("\t\tLooking at VAL param: " + val);
+-		for (final JComponent comp : valueComponents) {
+-			boolean digested = false;
+-			if (tokens.length <= counter) break;
+-			//System.out.println("\t\tLooking at USER param: " + tokens[counter]);
+-
+-			if (comp.getClass() == JCheckBox.class) {
+-				String cbString = ((JCheckBox) comp).getText();
+-				if (tokens[counter].equals(cbString)) {
+-					((JCheckBox) comp).setSelected(true);
+-					digested = true;
+-				}
+-			} else if (comp.getClass() == JComboBox.class) {
+-				JComboBox box = (JComboBox) comp;
+-
+-				for (int ii=0; ii<box.getItemCount(); ii++) {
+-					String itemString = (String) box.getItemAt(ii);
+-					if (itemString.equals(tokens[counter])) {
+-						box.setSelectedIndex(ii);
+-						digested = true;
+-					}
+-				}
+-			} else if (comp.getClass() == JTextField.class) {
+-				((JTextField) comp).setText(tokens[counter]);
+-				digested = true;
+-			} else if (comp.getClass() == JFormattedTextField.class) {
+-				((JFormattedTextField) comp).setText(tokens[counter]);
+-				digested = true;
+-			}
+-
+-			if ((comp.getClass() != JLabel.class) && (digested))
+-				counter++;
+-		}
+-	}
+-
+-	@Override
+-	public String getValue() {
+-		String value = "";
+-
+-		for (final JComponent comp : valueComponents) {
+-			if (comp.getClass() == JTextField.class) {
+-				value += ((JTextField) comp).getText();
+-			} else if (comp.getClass() == JFormattedTextField.class) {
+-				value += ((JFormattedTextField) comp).getText();
+-			} else if (comp.getClass() == JCheckBox.class) {
+-				if (((JCheckBox) comp).isSelected())
+-					value += ((JCheckBox) comp).getText();
+-			} else if (comp.getClass() == JComboBox.class) {
+-				value += ((String)((JComboBox)comp).getSelectedItem());
+-			}
+-
+-			if (value.length() > 0)
+-				value += " ";
+-		}
+-
+-		if (value.equals("")) return null;
+-		else	return value;
+-	}
+-
+-	@Override
+-	public void itemStateChanged(ItemEvent arg0) {
+-		String selectedOption = null;
+-
+-		if (arg0.getItemSelectable().getClass() == JCheckBox.class) {
+-			selectedOption = ((JCheckBox) arg0.getItemSelectable()).getText();
+-			super.handleItemEvent(arg0, selectedOption);
+-		} else if (arg0.getItemSelectable().getClass() == JComboBox.class) {
+-			selectedOption = ((String)((JComboBox)arg0.getItemSelectable()).getSelectedItem());
+-			//HACK: should call super...
+-		}
+-	}
+-}
+Index: ../trunk-jpl/src/java/src/gui_elements/SelectorPanel.java
+===================================================================
+--- ../trunk-jpl/src/java/src/gui_elements/SelectorPanel.java	(revision 18297)
++++ ../trunk-jpl/src/java/src/gui_elements/SelectorPanel.java	(revision 18298)
+@@ -1,233 +0,0 @@
+-/***********************************************************************************/
+-/*  Copyright 2012 WSL Institute for Snow and Avalanche Research    SLF-DAVOS      */
+-/***********************************************************************************/
+-/*	This file is part of INIshell.
+- *
+- *   INIshell 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 3 of the License, or
+- *   (at your option) any later version.
+- *
+- *   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+- *
+- */
+-
+-package gui_elements;
+-
+-import java.awt.event.ActionEvent;
+-import java.awt.event.ActionListener;
+-
+-import javax.swing.JButton;
+-import javax.swing.JOptionPane;
+-
+-
+-import main.GUIBuilder;
+-import main.XMLHelper;
+-
+-import org.w3c.dom.Element;
+-import org.w3c.dom.Node;
+-import org.w3c.dom.NodeList;
+-
+-import java.util.List;
+-import java.util.ArrayList;
+-import java.util.HashMap;
+-
+-/**
+- * This class introduces more flexibility into the inishell interface:
+- * The SelectorPanel offers the user to add a specific parameter to
+- * the interface.
+- *
+- * @author Thomas Egger
+- */
+-public class SelectorPanel extends ControlledPanel implements ActionListener {
+-
+-	private static final long serialVersionUID = 8610877538909126920L;
+-
+-	String[] parameters;
+-
+-	JButton addButton;
+-	JButton removeButton;
+-	Element template;
+-	String  templateKey;
+-	HashMap<String, ControlledPanel> mapOfParameters;
+-	ControlledPanel cp = null;
+-
+-	public SelectorPanel(Element element, ControlledPanel parent) {
+-		super(element, parent);
+-		templateKey = ""; //will store the pattern of the key
+-
+-		addButton = new JButton("+");
+-		this.add(addButton, "cell 1 0, split 2, grow");
+-		addButton.addActionListener(this);
+-
+-		removeButton = new JButton("-");
+-		this.add(removeButton, "cell 1 0, grow, wrap");
+-		removeButton.addActionListener(this);
+-
+-		//The following lines try to extract the template key (e.g. %::filters#, %::resample, COPY::%)
+-		final NodeList nodelist = element.getChildNodes();
+-		for (int ii = 0; ii < nodelist.getLength(); ii++) {
+-			if (nodelist.item(ii).getNodeType() == Node.ELEMENT_NODE) {
+-				Element currentElement = (Element)nodelist.item(ii);
+-				if (currentElement.getAttribute("template").equals("true")){
+-					template = (Element)currentElement.cloneNode(true);
+-					templateKey = template.getAttribute("key");
+-					template.setAttribute("template", "false");
+-				}
+-			}
+-		}
+-
+-		final Element[] options = XMLHelper.getElementArray(element, "option");
+-		parameters = new String[options.length + 1];
+-		for (int ii=0; ii < options.length; ii++) {
+-			parameters[ii] = options[ii].getAttribute("value");
+-		}
+-		parameters[options.length] = "Other...";
+-
+-		key = templateKey; //IMPORTANT: this changes the key only, not the label!
+-		hashKey = this.getSection().toUpperCase() + "::" + this.getKey().toUpperCase();
+-		mapOfParameters  = new HashMap<String, ControlledPanel>();
+-	}
+-
+-	@Override
+-	public void actionPerformed(ActionEvent arg0) {
+-		if (arg0.getSource() == addButton) {
+-			add();
+-		} else if (arg0.getSource() == removeButton) {
+-			remove();
+-		}
+-	}
+-
+-	@Override
+-	public void set(HashMap hm, String key, String value) {
+-		//HACK
+-		//System.out.println("\tKEY: " + key + "  VAL: " + value);
+-
+-		String myKey = this.section.toUpperCase() + "::" + templateKey.toUpperCase().replace("%","([a-zA-Z0-9_]+)");
+-		myKey = myKey.replace("#","[1-9]+[0-9]*"); //all integer numbers from 1 to infinity
+-		//System.out.println("PATTERN: " + myKey);
+-		String myKey2 = key.replaceAll(myKey, "$1");
+-		String myKey3 = key.replaceAll(myKey, "$0");
+-
+-		//System.out.println("HUHUI: " + templateKey + " --- " + myKey2 + " -- " + myKey3);
+-
+-		boolean toAdd = true;
+-		if (mapOfParameters.get(myKey2) != null) toAdd = false; //Parameter already exists
+-
+-		if (toAdd) {
+-			ControlledPanel child = add(myKey2, true, hm, key, value);
+-			cp = child;
+-			if (child != null) child.set(hm, key, value);
+-		} else {
+-			if (cp != null) cp.set(hm, key, value);
+-		}
+-	}
+-
+-	public void add() {
+-		String param = "";
+-		String choice = "Other...";
+-
+-		if (parameters.length > 1)
+-			choice = (String)JOptionPane.showInputDialog(this, "Add a parameter", "Add", JOptionPane.QUESTION_MESSAGE, null, parameters, null);
+-
+-		if (choice == null) return;
+-
+-		if (choice.equals("Other...")) {
+-			param = JOptionPane.showInputDialog(this, "Enter the name of a meteo parameter\n(e.g. VW_AVG, P2");
+-		} else {
+-			param = choice;
+-		}
+-
+-		add(param, false, null, null, null);
+-	}
+-
+-	public ControlledPanel add(String param, boolean doSet, HashMap hm, String key, String value) {
+-		//System.out.println("Trying to add SelectorPanel: " + key + " ... " + value);
+-
+-		if ((param == null) || (param.length() == 0)) return null;
+-		param = param.toUpperCase();
+-
+-		if (mapOfParameters.get(param) != null) return null; //Parameter already exists
+-
+-		Element child = (Element)template.cloneNode(true);
+-		recursiveKeyReplace(child, param);
+-		element.appendChild(child);
+-
+-		ControlledPanel childPanel = null;
+-		try {
+-			childPanel = ControlledPanel.createSingleParameterPanel(child, this);
+-			childPanel.setKey(childPanel.getKey());
+-			GUIBuilder.gui.addToTab(childPanel, section, this);
+-			childPanel.hold();
+-			GUIBuilder.control(childPanel);
+-			GUIBuilder.recursiveBuild(child, this, doSet, hm, key, value);
+-
+-			mapOfParameters.put(param, childPanel);
+-		} catch (final GUIBuildException e1) {
+-			e1.printStackTrace();
+-		}
+-
+-		this.invalidate();
+-
+-		return childPanel;
+-	}
+-
+-	@Override
+-	public void close() {
+-
+-	}
+-
+-	@Override
+-	public String getValue() {
+-		return null;
+-	}
+-
+-	public void remove() {
+-		if (mapOfParameters.size() == 0) return;
+-
+-		String choice = (String)JOptionPane.showInputDialog(this, "Remove a parameter", "Remove", JOptionPane.QUESTION_MESSAGE, null, mapOfParameters.keySet().toArray(), null);
+-
+-		if (choice == null) return; //nothing to do
+-
+-		String childKey = templateKey.replaceAll("%", choice);
+-		final Element child = XMLHelper.getCertainChildElement(element, "parameter", "key", childKey);
+-
+-		if (child == null) return;
+-
+-		try { //this makes sure that all child nodes are destroyed
+-			GUIBuilder.recursiveDestruct(child, this);
+-			element.removeChild(child);
+-			final ControlledPanel childPanel = GUIBuilder.panelControl.get(section, childKey);
+-
+-			childPanel.release();
+-			childPanel.close();
+-
+-			if (!childPanel.isNeeded())
+-				GUIBuilder.gui.removeFromTab(childPanel, section, this);
+-
+-			mapOfParameters.remove(choice);
+-		} catch (final GUIBuildException e) {
+-			e.printStackTrace();
+-		}
+-
+-		this.invalidate();
+-	}
+-
+-	private void recursiveKeyReplace(Element element, String string) {
+-		if (element.hasAttribute("key"))
+-			element.setAttribute("key", element.getAttribute("key").replaceAll("%", string));
+-
+-		final NodeList nodelist = element.getChildNodes();
+-		for (int i = 0; i < nodelist.getLength(); i++) {
+-			if (nodelist.item(i).getNodeType() == Node.ELEMENT_NODE) {
+-				recursiveKeyReplace(((Element) nodelist.item(i)), string);
+-			}
+-		}
+-	}
+-}
+Index: ../trunk-jpl/src/java/src/gui_elements/GUIBuildException.java
+===================================================================
+--- ../trunk-jpl/src/java/src/gui_elements/GUIBuildException.java	(revision 18297)
++++ ../trunk-jpl/src/java/src/gui_elements/GUIBuildException.java	(revision 18298)
+@@ -1,33 +0,0 @@
+-/***********************************************************************************/
+-/*  Copyright 2012 WSL Institute for Snow and Avalanche Research    SLF-DAVOS      */
+-/***********************************************************************************/
+-/*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*
+-*/
+-
+-package gui_elements;
+-
+-public class GUIBuildException extends Exception {
+-
+-	/**
+-	 *
+-	 */
+-	private static final long serialVersionUID = 1L;
+-
+-	public GUIBuildException(String message) {
+-		super(message);
+-	}
+-}
+Index: ../trunk-jpl/src/java/src/gui_elements/ControlledPanel.java
+===================================================================
+--- ../trunk-jpl/src/java/src/gui_elements/ControlledPanel.java	(revision 18297)
++++ ../trunk-jpl/src/java/src/gui_elements/ControlledPanel.java	(revision 18298)
+@@ -1,285 +0,0 @@
+-/***********************************************************************************/
+-/*  Copyright 2012 WSL Institute for Snow and Avalanche Research    SLF-DAVOS      */
+-/***********************************************************************************/
+-/*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*
+-*/
+-
+-package gui_elements;
+-
+-import java.awt.Color;
+-import java.awt.Component;
+-import java.awt.Font;
+-
+-import javax.swing.JEditorPane;
+-import javax.swing.JLabel;
+-import javax.swing.JPanel;
+-import javax.swing.JSeparator;
+-import javax.swing.*;
+-import java.util.HashMap;
+-import javax.swing.border.*;
+-
+-import main.GUI;
+-import main.GUIBuilder;
+-import main.XMLHelper;
+-import net.miginfocom.swing.MigLayout;
+-
+-import org.w3c.dom.Element;
+-import org.w3c.dom.Node;
+-
+-/**
+- * Abstract class for JPanels that are maintained with their key and designated
+- * section and can return their current value.
+- */
+-public abstract class ControlledPanel extends JPanel {
+-
+-	private static final long serialVersionUID = 1L;
+-
+-	private int dependencies;
+-
+-	protected JLabel jlabel;
+-
+-	protected String section;
+-	protected String key;
+-	protected String label;
+-	protected String hashKey;
+-
+-	protected Element element;
+-
+-	protected boolean optional;
+-	protected String replace;
+-
+-	protected int hierarchy;
+-	protected String helptext;
+-	protected JEditorPane help;
+-
+-	/**
+-	 * Constructor for a controlled panel.
+-	 *
+-	 * @param element
+-	 */
+-	public ControlledPanel(Element element, ControlledPanel parent) {
+-		this(element, parent, true);
+-	}
+-
+-	public ControlledPanel(Element element, ControlledPanel parent, boolean doLayout) {
+-		super();
+-		initialize(element, parent);
+-
+-		if (doLayout) {
+-			int column1 = 200;
+-			column1 -= getHierarchy() * 5; //Indentation for the label, 5px per hierarchy level
+-
+-			setLayout(new MigLayout("gapx 6, wrap 8, top, ins n 5 n n", "["+ column1 + "!][100!][100!][100!][100!][100!][300:400:400]", ""));
+-			add(jlabel, "growx, ay top, gaptop 5, gapleft " + getHierarchy() * 5);
+-			add(help, "cell 6 0, wrap");
+-		}
+-	}
+-
+-	private void initialize(Element element, ControlledPanel parent) {
+-		dependencies = 0;
+-
+-		this.element = element;
+-		this.key = element.getAttribute("key");
+-		this.label = this.key;
+-
+-		this.section = element.getAttribute("section");
+-		this.hashKey = this.section.toUpperCase() + "::" + this.key.toUpperCase();
+-		this.optional = element.getAttribute("optional").equals("true");
+-
+-		jlabel = new JLabel(this.label + ":      ");
+-		jlabel.setForeground(GUI.LABEL_COLOR);
+-
+-		this.setBackground(Color.white);
+-		this.setVisible(true);
+-
+-		/* Add help to the right side of the panel. */
+-		helptext = XMLHelper.getChildElementContent(element, "help");
+-		help = ControlledPanel.createHelpPane("<html>"+helptext+"</html>");
+-		if (helptext != null) help.setText(helptext);		
+-
+-		if (parent != null) {
+-			setHierarchy(parent.getHierarchy() + 1);
+-		} else {
+-			setHierarchy(0);
+-		}
+-	}
+-
+-	/**
+-	 * Creates a ControlledPanel for a parameter that matches its type. (i.e.
+-	 * radio buttons for an option parameter, ...
+-	 *
+-	 * @param element
+-	 * @return the Controlled Panel
+-	 * @throws GUIBuildException
+-	 */
+-	public static ControlledPanel createSingleParameterPanel(Element element, ControlledPanel parent) throws GUIBuildException {
+-		ControlledPanel panel;
+-
+-		//System.out.println("IN create: " + XMLHelper.getString((Node)element));
+-
+-		if (element.hasAttribute("counter")) {
+-			panel = new DuplicatorPanel(element, parent);
+-		} else if (element.getTagName().equals("frame")) {
+-			panel = new FramePanel(element, parent);
+-		} else if (element.getAttribute("type").equals("path")	|| element.getAttribute("type").equals("file")) {
+-			panel = new PathPanel(element, parent);
+-		} else if (element.getAttribute("type").equals("alternative") || element.getAttribute("type").equals("logical")) {
+-			panel = new AlternativePanel(element, parent);
+-		} else if (element.getAttribute("type").equals("choice")) {
+-			panel = new CheckBoxPanel(element, parent);
+-		} else if (element.getAttribute("type").equals("integer") || element.getAttribute("type").equals("integer+")){
+-			panel = new IntegerPanel(element, parent);
+-		} else if (element.getAttribute("type").equals("decimal")) {
+-			panel = new DecimalPanel(element, parent);
+-		} else if (element.getAttribute("type").equals("double")) {
+-			panel = new TextfieldPanel(element, parent);
+-		} else if (element.getAttribute("type").equals("string") || element.getAttribute("type").equals("char") || element.getAttribute("type").equals("cell")){
+-			panel = new TextfieldPanel(element, parent);
+-		} else if (element.getAttribute("type").equals("combination")) {
+-			panel = new CombinedPanel(element, parent);
+-		} else if (element.getAttribute("type").equals("selector")) {
+-			panel = new SelectorPanel(element, parent);
+-		} else {
+-			throw new GUIBuildException("Cannot create a GUI panel for a parameter of type " + element.getAttribute("type"));
+-		}
+-
+-		return panel;
+-	}
+-
+-	public static JEditorPane createHelpPane(String helptext){
+-		JEditorPane help = new JEditorPane();
+-		help.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE);
+-		help.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 12));
+-		help.setEditable(false);
+-		help.setContentType("text/html");
+-		help.setForeground(Color.GRAY);
+-		help.addHyperlinkListener(GUIBuilder.gui);
+-
+-		if (helptext!=null) {
+-			help.setText("<html>"+helptext+"</html>");
+-		} else {
+-			help.setText("<html></html>");
+-		}
+-
+-		return help;
+-	}
+-
+-	public void setHierarchy(int val) {
+-		hierarchy = val;		
+-	}
+-
+-	public int getHierarchy() {
+-		return hierarchy;
+-	}
+-
+-	/**
+-	 * This method should be called when the panel is removed.
+-	 */
+-	public abstract void close();
+-
+-	/**
+-	 * @return the GUI component.
+-	 */
+-	public Component getComponent() {
+-		return this;
+-	}
+-
+-	/**
+-	 * @return the number of dependencies on the panel.
+-	 */
+-	public int getDependencies() {
+-		return dependencies;
+-	}
+-
+-	/**
+-	 * @return the key of the corresponding key / value set
+-	 */
+-	public String getKey() {
+-		return key;
+-	}
+-
+-	/**
+-	 * @return the current value of the key / value set null if the key value
+-	 *         set should not be printed
+-	 */
+-	public abstract String getValue();
+-
+-	/**
+-	 * This method should be called when another panel depends needs this panel
+-	 * to exist.
+-	 */
+-	public synchronized void hold() {
+-		this.dependencies++;
+-	}
+-
+-	/**
+-	 * @return true if dependencies on this panel exist
+-	 * @throws GUIBuildException
+-	 */
+-	public synchronized boolean isNeeded() throws GUIBuildException {
+-		if (dependencies == 0) {
+-			return false;
+-		} else if (dependencies > 0) {
+-			return true;
+-		} else {
+-			throw new GUIBuildException("Inplausible number of dependencies on panel");
+-		}
+-	}
+-
+-	/**
+-	 * @return true if a value for the underlying parameter is optional
+-	 */
+-	public boolean isOptional() {
+-		return optional;
+-	}
+-
+-	/**
+-	 * This method should be called when a panel no longer needs this panel to
+-	 * exist. The panel will be removed if no dependency exists.
+-	 */
+-	public synchronized void release() {
+-		this.dependencies--;
+-	}
+-
+-	public void set(HashMap hm, String key, String value) {
+-		System.out.println("Set not implemented for ControlledPanel: " + serialVersionUID);
+-	}
+-
+-	public String getHashKey() {
+-		return hashKey;
+-	}
+-
+-	/**
+-	 * This method sets a new key for a panel and changes its label.
+-	 *
+-	 * @param key
+-	 *            the new key
+-	 */
+-	public void setKey(String key) {
+-		this.key = key;
+-		element.setAttribute("key", key);
+-		jlabel.setText(this.label + ":      ");
+-	}
+-
+-	/**
+-	 * Getter method for the section.
+-	 * @return the section
+-	 */
+-	public String getSection() {
+-		return section;
+-	}
+-}
+Index: ../trunk-jpl/src/java/src/gui_elements/CheckBoxPanel.java
+===================================================================
+--- ../trunk-jpl/src/java/src/gui_elements/CheckBoxPanel.java	(revision 18297)
++++ ../trunk-jpl/src/java/src/gui_elements/CheckBoxPanel.java	(revision 18298)
+@@ -1,139 +0,0 @@
+-/***********************************************************************************/
+-/*  Copyright 2012 WSL Institute for Snow and Avalanche Research    SLF-DAVOS      */
+-/***********************************************************************************/
+-/*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*
+-*/
+-
+-package gui_elements;
+-
+-import main.*;
+-
+-import java.awt.Color;
+-import java.awt.event.ItemEvent;
+-import java.util.HashMap;
+-
+-import javax.swing.JCheckBox;
+-import javax.swing.JOptionPane;
+-import javax.swing.JLabel;
+-
+-import org.w3c.dom.Element;
+-import org.w3c.dom.Node;
+-
+-public class CheckBoxPanel extends OptionPanel {
+-
+-	private static final long serialVersionUID = 552186457208697362L;
+-	private final JCheckBox[] boxes;
+-	String concat;
+-	private String setKey = null, setValue = null;
+-	private boolean doSet = false;
+-	private HashMap setMap;
+-
+-
+-	/**
+-	 * Constructor for a panel that can hold a number of checkboxes to compose
+-	 * the value for a key/value set.
+-	 *
+-	 * @param element
+-	 * @throws GUIBuildException
+-	 */
+-	public CheckBoxPanel(Element element, ControlledPanel parent) throws GUIBuildException {
+-		super(element, parent);
+-
+-		concat = "";
+-		boxes = new JCheckBox[values.length];
+-		for (int i = 0; i < values.length; i++) {
+-			boxes[i] = new JCheckBox(values[i]);
+-
+-			this.add(boxes[i], "cell 1 " + i + ", wrap, ay top");
+-
+-			String extra = "";
+-			if (i > 0)
+-				extra = ", gapleft 12";
+-
+-			this.add(ControlledPanel.createHelpPane(this.helptexts[i]), "cell 6 "+ i +", width 200:400:400, wrap" + extra);
+-
+-			boxes[i].setBackground(Color.white);
+-			boxes[i].setVisible(true);
+-			boxes[i].addItemListener(this);
+-			if (defaultTrues.contains(values[i])) {
+-				boxes[i].setSelected(true);
+-				concat += values[i] + " ";
+-			}
+-		}
+-	}
+-
+-	@Override
+-	public void close() {
+-		for (final JCheckBox box : boxes)
+-			box.setSelected(false);
+-	}
+-
+-	@Override
+-	public String getValue() {
+-		if (!isOptional() && concat.equals("")) {
+-			JOptionPane.showMessageDialog(null, "No option was selected for "
+-									+ getKey() + " (section '" + getSection().toUpperCase() + "')"
+-									+ ".\nA value is required. Your .ini-file is probably incorrect.",
+-									"Problem when building .ini file",
+-									JOptionPane.WARNING_MESSAGE);
+-		}
+-
+-		if (concat.equals("")) return null;
+-		else	return concat.trim();
+-	}
+-
+-	public synchronized void set(HashMap hm, String key, String value) {
+-		String val = ((String)hm.get(hashKey)).toUpperCase();
+-		//System.out.println("\tABOUT TO CHANGE CHECKBOXPANEL KEY: " + key + "  VAL: " + val);
+-
+-		String[] tokens = val.split("\\s+");
+-		for (final JCheckBox box : boxes) {
+-			box.setSelected(false);
+-			
+-			for (final String token : tokens) {
+-				if (token.equals(box.getText())) {
+-					//System.out.println("\t\tSelecting Checkbox: " + token);
+-					doSet = true;
+-					setKey = key;
+-					setValue = value;
+-					setMap = hm;
+-					box.setSelected(true);
+-				}
+-			}
+-		}
+-	}
+-
+-
+-	@Override
+-	public synchronized void itemStateChanged(ItemEvent arg0) {
+-		final String selectedOption = ((JCheckBox) arg0.getItemSelectable()).getText();
+-
+-		if (arg0.getStateChange() == ItemEvent.SELECTED) {
+-			concat += selectedOption + " ";
+-		} else {
+-			concat = concat.replaceAll(new String(" " + selectedOption + " "), " ");
+-			concat = concat.replaceFirst(new String("^" + selectedOption + " "), ""); //at the beginning of the concat
+-		}
+-
+-		//super.handleItemEvent(arg0, selectedOption);
+-		super.handleItemEvent(arg0, selectedOption, doSet, setMap, setKey, setValue);
+-		doSet = false;
+-		setKey = null;
+-		setMap = null;
+-		setValue = null;
+-	}
+-}
+Index: ../trunk-jpl/src/java/src/gui_elements/DuplicatorPanel.java
+===================================================================
+--- ../trunk-jpl/src/java/src/gui_elements/DuplicatorPanel.java	(revision 18297)
++++ ../trunk-jpl/src/java/src/gui_elements/DuplicatorPanel.java	(revision 18298)
+@@ -1,175 +0,0 @@
+-/***********************************************************************************/
+-/*  Copyright 2012 WSL Institute for Snow and Avalanche Research    SLF-DAVOS      */
+-/***********************************************************************************/
+-/*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*
+-*/
+-
+-package gui_elements;
+-
+-import java.awt.event.ActionEvent;
+-import java.awt.event.ActionListener;
+-import java.util.*;
+-
+-import javax.swing.JButton;
+-
+-import main.GUIBuilder;
+-import main.XMLHelper;
+-
+-import org.w3c.dom.Element;
+-import org.w3c.dom.Node;
+-import org.w3c.dom.NodeList;
+-
+-public class DuplicatorPanel extends ControlledPanel implements ActionListener {
+-
+-	/**
+-	 *
+-	 */
+-	private static final long serialVersionUID = 6801877538909126920L;
+-	JButton addButton;
+-	Element clone;
+-
+-	JButton removeButton;
+-
+-	public DuplicatorPanel(Element element, ControlledPanel parent) {
+-		super(element, parent);
+-
+-		addButton = new JButton("+");
+-		this.add(addButton, "cell 1 0, split 2, grow");
+-		addButton.addActionListener(this);
+-
+-		removeButton = new JButton("-");
+-		this.add(removeButton, "cell 1 0, grow, wrap");
+-		removeButton.addActionListener(this);
+-
+-		clone = (Element) element.cloneNode(true);
+-		clone.removeAttribute("counter");
+-		clone.setAttribute("counted", "true");
+-	}
+-
+-	@Override
+-	public void actionPerformed(ActionEvent arg0) {
+-		if (arg0.getSource() == addButton) {
+-			add();
+-		} else if (arg0.getSource() == removeButton) {
+-			remove();
+-		}
+-	}
+-
+-	@Override
+-	public void set(HashMap hm, String key, String value) {
+-		//System.out.println("Trying to add DUPLICATOR Panel: " + key + " ... " + value + "  HashKey: " + this.getHashKey());
+-
+-		if (key.indexOf('#') == -1) {
+-			ControlledPanel child = add(true, hm, key, value);
+-			child.set(hm, key, value);
+-		}
+-	}
+-
+-	public ControlledPanel add() {
+-		return add(false, null, null, null);
+-	}
+-
+-	public ControlledPanel add(boolean doSet, HashMap hm, String key, String value) {
+-
+-		final Element child = (Element) this.clone.cloneNode(true);
+-		final int counter = Integer.parseInt(element.getAttribute("counter"));
+-		element.setAttribute("counter", (counter + 1) + "");
+-
+-		// child.setAttribute("key",element.getAttribute("key").replaceAll("#",counter+""));
+-
+-		//System.out.println("\t-->Adding a child panel to DUPLICATOR with key: " + key + "  val: " + value + "  HASH: " + this.getHashKey() + "  hier: " + this.getHierarchy());
+-
+-		recursiveKeyReplace(child, counter + "");
+-		element.appendChild(child);
+-
+-		ControlledPanel childPanel = null;
+-		try {
+-			childPanel = ControlledPanel.createSingleParameterPanel(child, this);
+-			childPanel.setKey(childPanel.getKey());
+-			GUIBuilder.gui.addToTab(childPanel, section, this);
+-			childPanel.hold();
+-			GUIBuilder.control(childPanel);
+-			GUIBuilder.recursiveBuild(child, this, doSet, hm, key, value);
+-
+-		} catch (final GUIBuildException e1) {
+-			// TODO Auto-generated catch block
+-			e1.printStackTrace();
+-		}
+-
+-		this.invalidate();
+-		
+-		return childPanel;
+-	}
+-
+-	@Override
+-	public void close() {
+-		boolean doRemove = true;
+-
+-		do {
+-			doRemove = remove();
+-		} while (doRemove);
+-	}
+-
+-	@Override
+-	public String getValue() {
+-		return null;
+-	}
+-
+-	public boolean remove() {
+-		final int counter = Integer.parseInt(element.getAttribute("counter")) - 1;
+-		final String childKey = element.getAttribute("key").replace("#", counter + "");
+-		final Element child = XMLHelper.getCertainChildElement(element, "parameter", "key", childKey);
+-
+-		if (child == null) return false;
+-
+-		element.removeChild(child);
+-		element.setAttribute("counter", (counter) + "");
+-
+-		final ControlledPanel childPanel = GUIBuilder.panelControl.get(section, childKey);
+-
+-		if (childPanel != null) {
+-			childPanel.release();
+-			childPanel.close();
+-
+-			try {
+-				if (!childPanel.isNeeded()) {
+-					GUIBuilder.gui.removeFromTab(childPanel, section, this);
+-				}
+-			} catch (final GUIBuildException e) {
+-				// TODO Auto-generated catch block
+-				e.printStackTrace();
+-			}
+-		}
+-
+-		this.invalidate();
+-
+-		return true;
+-	}
+-
+-	private void recursiveKeyReplace(Element element, String string) {
+-		if (element.hasAttribute("key")) {
+-			element.setAttribute("key", element.getAttribute("key").replaceAll("#", string));
+-		}
+-		final NodeList nodelist = element.getChildNodes();
+-		for (int i = 0; i < nodelist.getLength(); i++) {
+-			if (nodelist.item(i).getNodeType() == Node.ELEMENT_NODE) {
+-				recursiveKeyReplace(((Element) nodelist.item(i)), string);
+-			}
+-		}
+-	}
+-
+-}
+Index: ../trunk-jpl/src/java/src/main/GUIBuilder.java
+===================================================================
+--- ../trunk-jpl/src/java/src/main/GUIBuilder.java	(revision 18297)
++++ ../trunk-jpl/src/java/src/main/GUIBuilder.java	(revision 18298)
+@@ -1,391 +0,0 @@
+-/***********************************************************************************/
+-/*  Copyright 2012 WSL Institute for Snow and Avalanche Research    SLF-DAVOS      */
+-/***********************************************************************************/
+-/*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*
+-*/
+-
+-package main;
+-
+-import gui_elements.ControlledPanel;
+-import gui_elements.GUIBuildException;
+-
+-import java.io.IOException;
+-
+-import javax.swing.ProgressMonitor;
+-import javax.swing.JFileChooser;
+-import javax.swing.JOptionPane;
+-import javax.swing.JPanel;
+-import javax.swing.filechooser.FileNameExtensionFilter;
+-
+-import java.util.*;
+-
+-import org.w3c.dom.Document;
+-import org.w3c.dom.Element;
+-
+-/**
+- * The main class to build the .ini file creator. Upon construction it reads an
+- * XML file and creates the corresponding GUI. Maintains an ElementControl
+- * object.
+- *
+- * @author korhammer et egger
+- *
+- */
+-public class GUIBuilder {
+-	public static ProgressMonitor monitor;
+-
+-	public static final String xsd = GUIBuilder.class.getClassLoader().getResource("resources/config_schema-0.1.1.xsd").toString();
+-	public static String res_filepath = GUIBuilder.class.getClassLoader().getResource("resources/default_config.xml").toString(); //the default config to start with
+-	public static Document doc;
+-
+-	public static GUI gui;
+-	public static PanelControl panelControl;
+-
+-	public static String application;
+-	public static String currentConfigFile;
+-
+-	public static String saveFilePath = System.getProperty("user.dir");
+-
+-
+-	private static String getFileExtension(final String file_and_path) {
+-		final String file_sep = System.getProperty("file.separator");
+-
+-		// get filename without path
+-		final int fileSepIndex = file_and_path.lastIndexOf(file_sep);
+-		if (fileSepIndex == -1) {
+-			return "";
+-		}
+-		final String filename = file_and_path.substring(fileSepIndex+1); //remove path
+-
+-		// get the extension from the filename
+-		final int extIndex = filename.lastIndexOf(".");
+-		if (extIndex == -1)
+-			return "";
+-
+-		return filename.substring(extIndex+1);
+-	}
+-
+-	/**
+-	 * The main method. Opens the GUI Builder with a menu bar on the side.
+-	 * If an XML filepath is handed over as an argument,
+-	 * the XML file is opened.
+-	 *
+-	 * @param args
+-	 * @throws GUIBuildException
+-	 */
+-	public static void main(String args[]) throws GUIBuildException {
+-
+-		new GUIBuilder();
+-
+-		if ((args.length != 0) && (args[0].length() > 0))
+-			res_filepath = args[0]; //User may provice xml file as first argument
+-
+-		buildGUI(res_filepath);
+-		//gui.hideOpenButton();
+-	}
+-
+-	/**
+-	 * Builds a GUI from the XML-file specified with validation through
+-	 * the specified schema.
+-	 *
+-	 * @param filepath
+-	 * @param schemapath
+-	 * @throws GUIBuildException
+-	 */
+-	public GUIBuilder()	throws GUIBuildException {
+-		if (System.getProperty("mrj.version") != null) {  //detect if running on mac
+-			System.setProperty("com.apple.mrj.application.apple.menu.about.name", "Inishell");
+-			System.setProperty("apple.awt.brushMetalLook", "true");
+-		}
+-		gui = new GUI();
+-	}
+-
+-	public static void setComments(HashMap<String, String> added_comments, HashMap<String, String> comments) {
+-		panelControl.setComments(added_comments, comments);
+-	}
+-
+-	/**
+-	 * Builds the gui for a filepath that can either be handed over as an argument
+-	 * on application start or chosen by using the open button.
+-	 *
+-	 * @param filepath
+-	 * @throws GUIBuildException
+-	 */
+-	public static void buildGUI(String filepath) throws GUIBuildException{
+-		currentConfigFile = filepath;
+-
+-		doc = XMLHelper.readXML(filepath, xsd);
+-		doc = XMLHelper.resolveReferences(doc);
+-
+-		application = doc.getDocumentElement().getAttribute("application");
+-
+-		gui.setApplicationForTitle(application);
+-
+-		panelControl = new PanelControl();
+-
+-		final Element root = doc.getDocumentElement();
+-		recursiveBuild(root, null, false);
+-	}
+-
+-
+-	public static void setValues(final HashMap<String, String> hm, final HashMap<String, String> added_comments, final HashMap<String, String> comments) {
+-		if (hm == null) return;
+-
+-		monitor = new ProgressMonitor(gui, "Loading INI file", "0 out of " + panelControl.order.size() + " sections loaded", 0, panelControl.order.size());
+-		monitor.setMillisToPopup(0);
+-
+-		Thread myrunner = new Thread() {
+-				public void run() {
+-					int progress_counter = 0; //Effectively counts the sections already parsed into the GUI
+-					try {
+-						final int returnval = GUIBuilder.closeFile();
+-						if (returnval == JOptionPane.CANCEL_OPTION) return;
+-						monitor.setProgress(progress_counter);
+-
+-						GUIBuilder.buildGUI(currentConfigFile);
+-					} catch (GUIBuildException e) {
+-						e.printStackTrace();
+-					}
+-
+-					gui.setEnabled(false); //Disable user interaction while the ProgressMonitor is on
+-
+-					HashSet<String> usedKeys = new HashSet<String>(); //save all keys that were used from the HashMap
+-					HashSet<String> unusedKeys = new HashSet<String>(); //save all keys that were used from the HashMap
+-
+-					Iterator<Map.Entry<String, TreeMap<String, ControlledPanel>>> sectionIterator = panelControl.panels.entrySet().iterator();
+-					while (sectionIterator.hasNext()) {
+-						progress_counter++;
+-						monitor.setProgress(progress_counter);
+-						monitor.setNote(progress_counter + " out of " + panelControl.order.size() + " sections loaded");
+-
+-						if (monitor.isCanceled()) { //user cancelled loading
+-							monitor.close();
+-							gui.setEnabled(true);
+-							break; //HACK, should reset the whole environment before breaking
+-						}
+-
+-						Map.Entry<String, TreeMap<String, ControlledPanel>> entry = sectionIterator.next();
+-						TreeMap<String, ControlledPanel> value = entry.getValue();
+-
+-						List<String> sectionKeys = new ArrayList<String>(hm.keySet()); //all keys as defined in the existing ini
+-						String sectionKey = entry.getKey().toUpperCase() + "::"; //The section string
+-						filterList(sectionKey, sectionKeys); //filter keys for current section only (optimization)
+-
+-						LinkedList<ControlledPanel> todos = new LinkedList<ControlledPanel>();
+-						LinkedList<String> keys = new LinkedList<String>();
+-						LinkedList<String> values = new LinkedList<String>();
+-
+-						do {
+-							todos.clear();
+-							keys.clear();
+-							values.clear();
+-
+-							Iterator<Map.Entry<String, ControlledPanel>> keyIterator = value.entrySet().iterator();
+-							while(keyIterator.hasNext()) { //go through all keys of current section
+-								final ControlledPanel mypanel = keyIterator.next().getValue();
+-								//System.out.println("\t" + mypanel.getKey());
+-
+-								String pattern = mypanel.getHashKey();
+-								pattern = pattern.replace("%","[a-zA-Z0-9_]+");
+-								pattern = pattern.replace("#","[1-9]+[0-9]*"); //all integer numbers from 1 to infinity
+-								//System.out.println("Current pattern: " + pattern);
+-
+-								//Loop through all defined keys of this section and compare them with pattern
+-								Iterator<String> keyit = sectionKeys.iterator();
+-								while (keyit.hasNext()) {
+-									final String currkey = keyit.next();
+-									//System.out.println("sectionKeys contains: " + currkey);
+-
+-									if ((!usedKeys.contains(currkey)) && currkey.matches(pattern)) {
+-										//Add mypanel to list of todos
+-										//System.out.println("Adding panel for " + currkey);
+-										todos.add(mypanel);
+-										keys.add(currkey);
+-										values.add(hm.get(currkey));
+-
+-										usedKeys.add(currkey);
+-									}
+-								}
+-							}
+-
+-							for (int jj = 0; jj < todos.size(); jj++) {
+-								//System.out.println("--> SETTING " + keys.get(jj) + "  = " +values.get(jj));
+-								todos.get(jj).set(hm, keys.get(jj), values.get(jj));
+-							}
+-						} while (todos.size() != 0);
+-
+-						if (progress_counter == panelControl.order.size()) gui.setEnabled(true);
+-					}
+-
+-					//Now find out all keys that were not used in the hashmap
+-					for (String key : hm.keySet()) {
+-						if (!usedKeys.contains(key)) {
+-							//System.out.println("Unknown key = " + key);
+-							unusedKeys.add(key);
+-							panelControl.setUnusedKeys(key, hm.get(key));
+-						}
+-					}
+-
+-					setComments(added_comments, comments);
+-				}
+-			};//thread
+-		myrunner.start();
+-	}
+-
+-	private static void filterList(String filter, List<String> list) {
+-		for (Iterator<String> it=list.iterator(); it.hasNext();) {
+-			final String next = it.next();
+-			if (!next.startsWith(filter)) {
+-				it.remove();
+-			}
+-		}
+-	}
+-
+-	public static int closeFile(){
+-		final int returnval = JOptionPane.showConfirmDialog(new JPanel(),
+-				"You will lose all changes made to the current ini-file. " +
+-				"Do you want this?", "Inishell is already open for " + application, JOptionPane.OK_CANCEL_OPTION);
+-
+-
+-
+-		if (returnval == JOptionPane.OK_OPTION) {
+-			gui.closeAllTabs();
+-			gui.rootNode = new PanelNode("");
+-			application = null;
+-			doc = null;
+-			panelControl = null;
+-		}
+-
+-		return returnval;
+-	}
+-
+-
+-	/**
+-	 * Puts the specified panel into the panel control.
+-	 * @param panel
+-	 */
+-	public static void control(ControlledPanel panel) {
+-		final String section = panel.getSection();
+-		panelControl.put(section, panel);
+-	}
+-
+-
+-	/**
+-	 * Recursively traverses all children of the specified element
+-	 * and builds the corresponding panels.
+-	 *
+-	 * @param parentElement
+-	 * @param parentPanel
+-	 * @throws GUIBuildException
+-	 */
+-	public static void recursiveBuild(Element parentElement, ControlledPanel parentPanel, boolean doSet) throws GUIBuildException {
+-		recursiveBuild(parentElement, parentPanel, doSet, null, null, null);
+-	}
+-
+-
+-	public static void recursiveBuild(Element parentElement, ControlledPanel parentPanel, boolean doSet, HashMap hm, String key, String value) throws GUIBuildException {
+-
+-		/* get all child elements for the root */
+-		final String[] tags = {"parameter", "frame"};
+-		final Element[] parameterElements = XMLHelper.getElementArray(parentElement, tags);
+-
+-		for (final Element element : parameterElements) {
+-			final String section = element.getAttribute("section");
+-			ControlledPanel parameterPanel;
+-
+-			if (!panelControl.contains(section, element.getAttribute("key"))) {
+-				//System.out.println("Adding through recursiveBuild: " + element.getAttribute("key"));
+-				parameterPanel = ControlledPanel.createSingleParameterPanel(element, parentPanel);
+-				parameterPanel.setKey(parameterPanel.getKey());
+-
+-				if (!element.getAttribute("template").equals("true")) {
+-					//if (doSet) System.out.println("\tSETTING component key: " + key + "  value: " + value);
+-					if (doSet) parameterPanel.set(hm, parameterPanel.getKey(), value);
+-
+-					gui.addToTab(parameterPanel, section, parentPanel);
+-					control(parameterPanel);
+-				}
+-			} else {
+-				parameterPanel = panelControl.get(section, element.getAttribute("key"));
+-			}
+-
+-			parameterPanel.hold();
+-			recursiveBuild(element, parameterPanel, doSet);
+-		}
+-
+-		gui.validate();
+-	}
+-
+-	/**
+-	 * Recursively destructs child elements of the specified root.
+-	 *
+-	 * @param rootElement
+-	 * @param rootPanel
+-	 * @throws GUIBuildException
+-	 */
+-	public static void recursiveDestruct(Element rootElement, ControlledPanel rootPanel)
+-		throws GUIBuildException {
+-
+-		/* get all child elements for the root */
+-		final Element[] parameterElements = XMLHelper.getElementArray(rootElement, "parameter");
+-
+-		for (final Element element : parameterElements) {
+-			final String section = element.getAttribute("section");
+-			final ControlledPanel parameterPanel = panelControl.get(section, element.getAttribute("key"));
+-			recursiveDestruct(element, parameterPanel);
+-
+-			parameterPanel.release();
+-			parameterPanel.close();
+-
+-			if (!parameterPanel.isNeeded()) {
+-				gui.removeFromTab(parameterPanel, section, rootPanel);
+-			}
+-
+-		}
+-
+-		gui.validate();
+-	}
+-
+-
+-	/**
+-	 * Opens a prompt for the path to save the ini file to. Then prints the ini
+-	 * to the path specified.
+-	 *
+-	 * @throws IOException
+-	 * @throws GUIBuildException
+-	 */
+-	public static void printIOFile() throws IOException, GUIBuildException {
+-		final FileNameExtensionFilter inifilter = new FileNameExtensionFilter(".ini files", "ini");
+-
+-		final JFileChooser filechooser = new JFileChooser(saveFilePath);
+-		filechooser.setFileFilter(inifilter);
+-
+-		final int returnval = filechooser.showSaveDialog(new JPanel());
+-
+-		if (returnval == JFileChooser.APPROVE_OPTION) {
+-			String path = filechooser.getSelectedFile().getAbsolutePath();
+-			final String ext = getFileExtension(path).toLowerCase();
+-			if(!ext.equals("ini")) {
+-				path += ".ini";
+-			}
+-
+-			if (filechooser.getSelectedFile().isDirectory()) return;
+-			saveFilePath = filechooser.getSelectedFile().getParent();
+-
+-			panelControl.printToFile(path);
+-		}
+-	}
+-}
+Index: ../trunk-jpl/src/java/src/main/PanelControl.java
+===================================================================
+--- ../trunk-jpl/src/java/src/main/PanelControl.java	(revision 18297)
++++ ../trunk-jpl/src/java/src/main/PanelControl.java	(revision 18298)
+@@ -1,248 +0,0 @@
+-/***********************************************************************************/
+-/*  Copyright 2012 WSL Institute for Snow and Avalanche Research    SLF-DAVOS      */
+-/***********************************************************************************/
+-/*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*
+-*/
+-
+-package main;
+-
+-import gui_elements.ControlledPanel;
+-
+-import java.io.File;
+-import java.io.FileWriter;
+-import java.io.IOException;
+-import java.util.HashMap;
+-import java.util.LinkedList;
+-import java.util.Set;
+-import java.util.TreeMap;
+-import java.util.Iterator;
+-
+-/**
+- * Class that maintains all ControlledPanels so that values can be retrieved
+- * from panels, ini-files can be written. And a panel is not multiply created.
+- *
+- * @author korhammer
+- *
+- */
+-public class PanelControl {
+-
+-	LinkedList<String> order;
+-	HashMap<String, TreeMap<String, ControlledPanel>> panels;
+-	HashMap<String, String> comments = null;
+-	HashMap<String, String> added_comments = null;
+-	HashMap<String, HashMap<String, String>> unusedKeys = null;
+-	PanelNode rootNode = null;
+-
+-	/**
+-	 * Constructor for the panel control.
+-	 */
+-	public PanelControl() {
+-		panels = new HashMap<String, TreeMap<String, ControlledPanel>>();
+-		order = new LinkedList<String>();
+-
+-		unusedKeys = new HashMap<String, HashMap<String, String>>();
+-	}
+-
+-	public PanelControl(PanelControl p) {
+-		panels = new HashMap<String, TreeMap<String, ControlledPanel>>(p.panels);
+-		order = new LinkedList<String>(p.order);
+-		if (added_comments != null)
+-			added_comments = new HashMap<String, String>(p.added_comments);
+-
+-		if (comments != null)
+-			comments = new HashMap<String, String>(p.comments);
+-	}
+-
+-	public void setUnusedKeys(String key, String value) {
+-		//Parse key
+-		int offset = key.indexOf("::");
+-		String section = key.substring(0, offset);
+-		String sectionkey = key.substring(offset + 2);
+-
+-		HashMap<String, String> hm = unusedKeys.get(section);
+-		if (hm == null) unusedKeys.put(section, new HashMap<String, String>());
+-
+-		unusedKeys.get(section).put(sectionkey, value);
+-	}
+-
+-	public void setComments(HashMap<String, String> inaddedcomments, HashMap<String, String> incomments) {
+-		this.added_comments = new HashMap<String, String>(inaddedcomments);
+-		this.comments = new HashMap<String, String>(incomments);
+-	}
+-
+-	/**
+-	 * @param section
+-	 * @param key
+-	 * @return true if a panel with such key is maintained in the specified
+-	 *         section
+-	 */
+-	public boolean contains(String section, String key) {
+-		if (!panels.containsKey(section))
+-			return false;
+-
+-		return panels.get(section).containsKey(key);
+-	}
+-
+-	/**
+-	 *
+-	 * @param section
+-	 * @param key
+-	 * @return the panel with the specified section / key pair
+-	 */
+-	public ControlledPanel get(String section, String key) {
+-		return panels.get(section).get(key);
+-	}
+-
+-	/**
+-	 * Prints the ini-file at the specified path.
+-	 *
+-	 * @param path
+-	 */
+-	public void printToFile(String path) {
+-		/* create file */
+-		final File file = new File(path);
+-
+-		try {
+-			final FileWriter writer = new FileWriter(file);
+-
+-			writer.write(this.toString());
+-			writer.close();
+-		} catch (final IOException e) {
+-			// TODO Auto-generated catch block
+-			e.printStackTrace();
+-		}
+-	}
+-
+-	/**
+-	 * Adds the panel to the specified section.
+-	 *
+-	 * @param section
+-	 * @param panel
+-	 */
+-	public void put(String section, ControlledPanel panel) {
+-		final String key = panel.getKey();
+-		if (!panels.containsKey(section)) {
+-			order.add(section);
+-			panels.put(section, new TreeMap<String, ControlledPanel>());
+-		}
+-		panels.get(section).put(key, panel);
+-	}
+-
+-	/**
+-	 * Removes the panel with the specified section and key.
+-	 *
+-	 * @param section
+-	 * @param key
+-	 * @return the panel
+-	 */
+-	public ControlledPanel remove(String section, String key) {
+-		return panels.get(section).remove(key);
+-	}
+-
+-	/**
+-	 * Prints the maintained panels to a string.
+-	 *
+-	 * @return an ini-file-like structure
+-	 */
+-	public void setRootNode(PanelNode inrootNode) {
+-		rootNode = inrootNode;
+-	}
+-
+-	public String extractKey(String instring) {
+-		int offset = instring.indexOf("::");
+-		if (offset == -1) return null;
+-
+-		return instring.substring(offset+2);
+-	}
+-
+-	@Override
+-	public String toString() {
+-		String out = "";
+-
+-		for (final String section : order) {
+-			/* create section */
+-			final String sectionstring = "[" + section.toUpperCase() + "]\n";
+-			String keyvaluestring = "";
+-
+-			/* print section */
+-			LinkedList<String> keys = new LinkedList<String>();
+-			PanelNode sectionNode = rootNode.get(section.toUpperCase());
+-			if (sectionNode != null) sectionNode.getKeyList(keys);
+-
+-			//final Set<String> keys = panels.get(section).keySet();
+-			for (final String hashKey : keys) {
+-				String key = extractKey(hashKey);
+-				if (key == null) continue;
+-
+-				final String value = panels.get(section).get(key).getValue();
+-				if (value != null) {
+-					if ((comments != null) && comments.containsKey(hashKey.toUpperCase())) {
+-						String precomments =  comments.get(hashKey.toUpperCase());
+-						if (!precomments.equals(""))
+-						 	keyvaluestring += precomments;						
+-					}
+-
+-					keyvaluestring += key + "\t=\t" + value;					
+-
+-					if ((added_comments != null) && added_comments.containsKey(hashKey.toUpperCase()))
+-						keyvaluestring += "\t" + added_comments.get(hashKey.toUpperCase());
+-
+-					keyvaluestring += "\n";
+-				}
+-			}
+-
+-			//Add unused keys
+-			HashMap<String, String> extra = unusedKeys.get(section.toUpperCase());
+-			if (extra != null) {
+-				if (!keyvaluestring.equals("")) keyvaluestring += "\n";
+-
+-				for (String extrakey : extra.keySet()) {
+-					String hashKey = section.toUpperCase() + "::" + extrakey.toUpperCase();
+-					if ((comments != null) && comments.containsKey(hashKey)) {
+-						String precomments =  comments.get(hashKey);
+-						if (!precomments.equals(""))
+-						 	keyvaluestring += precomments;						
+-					}
+-				
+-					keyvaluestring += extrakey + "\t=\t" + extra.get(extrakey);
+-
+-					if ((added_comments != null) && added_comments.containsKey(hashKey))
+-					    keyvaluestring += "\t" + added_comments.get(hashKey);
+-
+-					keyvaluestring += "\n";
+-				}
+-			}
+-			
+-			//check if there aren't any comments in that section
+-			String hashKey = section.toUpperCase() + "::";
+-			if ((comments != null) && comments.containsKey(hashKey)) {
+-				String precomments =  comments.get(hashKey);
+-				if (!precomments.equals("")) {
+-					if (precomments.indexOf("\n") == -1) precomments += "\n";
+-					keyvaluestring = precomments + keyvaluestring + "\n";
+-				}
+-			}
+-			
+-			/* add section only if keys / values are printed */
+-			if (!keyvaluestring.equals("")) {
+-				out += sectionstring + keyvaluestring + "\n";
+-			}
+-		}
+-
+-		return out;
+-	}
+-}
+Index: ../trunk-jpl/src/java/src/main/XMLHelper.java
+===================================================================
+--- ../trunk-jpl/src/java/src/main/XMLHelper.java	(revision 18297)
++++ ../trunk-jpl/src/java/src/main/XMLHelper.java	(revision 18298)
+@@ -1,525 +0,0 @@
+-/***********************************************************************************/
+-/*  Copyright 2012 WSL Institute for Snow and Avalanche Research    SLF-DAVOS      */
+-/***********************************************************************************/
+-/*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*
+-*/
+-
+-package main;
+-
+-import gui_elements.GUIBuildException;
+-
+-import java.io.IOException;
+-import java.util.LinkedList;
+-
+-import javax.xml.parsers.DocumentBuilder;
+-import javax.xml.parsers.DocumentBuilderFactory;
+-import javax.xml.parsers.ParserConfigurationException;
+-import javax.xml.transform.TransformerConfigurationException;
+-import javax.xml.transform.TransformerException;
+-import javax.xml.transform.TransformerFactory;
+-
+-import org.w3c.dom.Document;
+-import org.w3c.dom.Element;
+-import org.w3c.dom.Node;
+-import org.w3c.dom.NodeList;
+-import org.xml.sax.SAXException;
+-
+-//for the XML printing
+-import javax.xml.transform.stream.StreamResult;
+-import javax.xml.transform.*;
+-import javax.xml.transform.dom.*;
+-import java.io.StringWriter;
+-
+-public class XMLHelper {
+-
+-	/**
+-	 * Find the parameter values for which the element should be cloned
+-	 * e.g. for section tags.
+-	 *
+-	 * @param element
+-	 * @param tagName
+-	 * @param attributeName
+-	 * @param parentArgument
+-	 * @return the
+-	 */
+-	public static String[] findApplicableValues(Element element,
+-			String tagName, String attributeName, String parentArgument) {
+-
+-		final String[] argumentsFromElement = getAttributesFromChildren(
+-				element, tagName, attributeName);
+-
+-		/*
+-		 * If no such arguments are specified for the current element but there
+-		 * are for the parent element, take that of the parent.
+-		 */
+-		if (argumentsFromElement.length == 0 && parentArgument != null)
+-			return new String[] { parentArgument };
+-		else if ((argumentsFromElement.length > 0 && parentArgument != null)) {
+-			if (getCertainChildElement(element, tagName, attributeName,
+-					parentArgument) != null)
+-				return new String[] { parentArgument };
+-			else
+-				/*
+-				 * The empty intersection is an empty array so that his case can
+-				 * be handled differently from the null case below.
+-				 */
+-				return new String[0];
+-		}
+-
+-		/*
+-		 * If no arguments are specified for the parent use all element
+-		 * arguments.
+-		 */
+-		else if (argumentsFromElement.length > 0 && parentArgument == null)
+-			return argumentsFromElement;
+-		else if (argumentsFromElement.length == 0 && parentArgument == null)
+-			return null;
+-		return null;
+-	}
+-
+-	/**
+-	 * Get all children of an element that have a certain element tag and
+-	 * extract the values for a certain attribute.
+-	 *
+-	 * @param parent
+-	 *            the parent element
+-	 * @param tag
+-	 *            the element tag
+-	 * @param attribute
+-	 *            the attribute name
+-	 *
+-	 * @return a String array with the attribute values
+-	 */
+-	public static String[] getAttributesFromChildren(Element parent, String tag, String attribute) {
+-		final Element[] elements = getElementArray(parent, tag);
+-
+-		final String[] attributes = new String[elements.length];
+-		for (int i = 0; i < elements.length; i++) {
+-			attributes[i] = elements[i].getAttribute(attribute);
+-		}
+-		return attributes;
+-	}
+-
+-	/**
+-	 * Returns the first child element that has the specified element tag and
+-	 * the value for the specified attribute.
+-	 *
+-	 * @param parent
+-	 * @param tag
+-	 * @param attribute
+-	 * @param value
+-	 * @return the first child element that meets the criteria
+-	 */
+-	public static Element getCertainChildElement(Element parent, String tag,
+-			String attribute, String value) {
+-		final Element[] allElements = getElementArray(parent, tag);
+-		for (final Element element : allElements) {
+-			if (element.hasAttribute(attribute)) {
+-				if (element.getAttribute(attribute).equals(value))
+-					return element;
+-			}
+-		}
+-		return null;
+-	}
+-
+-	/**
+-	 * For the specified element gets the text that is contained in the first
+-	 * child that has a certain element name.
+-	 *
+-	 *
+-	 * @param parent
+-	 *            the parent element
+-	 * @param tag
+-	 *            the element tag for the child
+-	 * @return the text content
+-	 */
+-	public static String getChildElementContent(Element parent, String tag) {
+-		final Element[] elements = getElementArray(parent, tag);
+-		if (elements.length == 0)
+-			return null;
+-
+-		return elements[0].getTextContent();
+-	}
+-
+-
+-
+-	/**
+-	 * @param parent
+-	 * @param tag
+-	 * @return all child elements of the parent with the specified tag
+-	 */
+-	public static Element[] getElementArray(Element parent, String tag) {
+-		if (!parent.hasChildNodes())
+-			return new Element[0];
+-
+-		final NodeList nodeList = parent.getChildNodes();
+-		final LinkedList<Element> elementlist = new LinkedList<Element>();
+-		for (int i = 0; i < nodeList.getLength(); i++) {
+-
+-			final Node element = nodeList.item(i);
+-			if (element.getNodeType() == Node.ELEMENT_NODE && ((Element) element).getTagName().equals(tag)) {
+-				elementlist.add((Element) element);
+-			}
+-		}
+-		final Element[] elements = new Element[elementlist.size()];
+-
+-		return elementlist.toArray(elements);
+-	}
+-
+-	public static Element[] getElementArray(Element parent, String[] tags) {
+-		if (!parent.hasChildNodes())
+-			return new Element[0];
+-
+-		final NodeList nodeList = parent.getChildNodes();
+-		final LinkedList<Element> elementlist = new LinkedList<Element>();
+-		for (int ii = 0; ii < nodeList.getLength(); ii++) {
+-
+-			final Node element = nodeList.item(ii);
+-			if (element.getNodeType() == Node.ELEMENT_NODE) {
+-				//Loop through all possible tags
+-				for (int jj=0; jj<tags.length; jj++) {
+-					if (((Element) element).getTagName().equals(tags[jj])) {
+-						elementlist.add((Element) element);
+-						break;
+-					}
+-				}
+-			}
+-		}
+-
+-		final Element[] elements = new Element[elementlist.size()];
+-		return elementlist.toArray(elements);
+-	}
+-
+-	/**
+-	 * Prints the Document object to the console. as XML.
+-	 *
+-	 * @param doc
+-	 */
+-	public static String printToScreen(Document doc) {
+-
+-		final javax.xml.transform.TransformerFactory tfactory = TransformerFactory
+-				.newInstance();
+-
+-		javax.xml.transform.Transformer xform;
+-		try {
+-			xform = tfactory.newTransformer();
+-
+-			final javax.xml.transform.Source src = new javax.xml.transform.dom.DOMSource(
+-					doc);
+-
+-			final java.io.StringWriter writer = new java.io.StringWriter();
+-			final javax.xml.transform.Result result = new javax.xml.transform.stream.StreamResult(
+-					writer);
+-
+-			xform.transform(src, result);
+-
+-			return writer.toString();
+-
+-		} catch (final TransformerConfigurationException e) {
+-			// TODO Auto-generated catch block
+-			e.printStackTrace();
+-		} catch (final TransformerException e) {
+-			// TODO Auto-generated catch block
+-			e.printStackTrace();
+-		}
+-		return null;
+-	}
+-
+-
+-
+-	/**
+-	 * Reads an XML file and writes it into a Document structure.
+-	 *
+-	 * @param filepath
+-	 * @param xsdpath
+-	 *            the path of the W3 XML schema that the file is based on.
+-	 * @throws GUIBuildException
+-	 */
+-	public static Document readXML(String filepath, String xsdpath)
+-			throws GUIBuildException {
+-
+-		/* read XML file and write it into Document structure */
+-
+-		final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+-		dbf.setIgnoringComments(true);
+-		dbf.setValidating(true);
+-		dbf.setIgnoringElementContentWhitespace(true);
+-
+-		dbf.setAttribute(
+-				"http://java.sun.com/xml/jaxp/properties/schemaLanguage",
+-				"http://www.w3.org/2001/XMLSchema");
+-		dbf.setAttribute(
+-				"http://java.sun.com/xml/jaxp/properties/schemaSource", xsdpath);
+-
+-
+-		DocumentBuilder db;
+-		Document doc;
+-
+-		try {
+-
+-			db = dbf.newDocumentBuilder();
+-			doc = db.parse(filepath);
+-		} catch (final ParserConfigurationException e) {
+-			throw new GUIBuildException(e.getMessage());
+-		} catch (final SAXException e) {
+-			throw new GUIBuildException(e.getMessage());
+-		} catch (final IOException e) {
+-			throw new GUIBuildException(e.getMessage());
+-		}
+-
+-		doc.normalize();
+-		doc.normalizeDocument();
+-
+-		resolveIncludes(doc, xsdpath);
+-		resolveReferences(doc);
+-		recursivelyResolveSections(doc.getDocumentElement(), null);
+-		recursivelyResolveReplaces(doc.getDocumentElement(), null);
+-
+-		return doc;
+-	}
+-
+-	/**
+-	 * This method recursively traverses the document tree and replaces all
+-	 * parameters that contain replace elements with the corresponding number of
+-	 * cloned elements.
+-	 *
+-	 * @param current
+-	 *            the current element
+-	 * @param parentReplace
+-	 *
+-	 */
+-	public static void recursivelyResolveReplaces(Element current,
+-			String parentReplace) {
+-
+-		final String[] replacements = XMLHelper.findApplicableValues(
+-				current, "replace", "name", parentReplace);
+-
+-		/* delete replace children */
+-		final Element[] replaceChildren = XMLHelper.getElementArray(current,
+-				"replace");
+-		for (final Element replace : replaceChildren) {
+-			current.removeChild(replace);
+-		}
+-
+-		if (replacements == null) {
+-			final NodeList childNodes = current.getChildNodes();
+-			final Node[] nodes = new Node[childNodes.getLength()];
+-			for (int i = 0; i < childNodes.getLength(); i++) {
+-				nodes[i] = childNodes.item(i);
+-			}
+-
+-			for (final Node node : nodes) {
+-				if (node.getNodeType() == Node.ELEMENT_NODE) {
+-					XMLHelper.recursivelyResolveReplaces((Element) node,
+-							parentReplace);
+-				}
+-			}
+-		} else if (replacements.length == 0) {
+-			current.getParentNode().removeChild(current);
+-		} else if (replacements != null) {
+-			/* clone element */
+-			for (final String replace : replacements) {
+-				final Element clone = (Element) current.cloneNode(true);
+-				clone.setAttribute("key",
+-						clone.getAttribute("key").replaceAll("%", replace));
+-				clone.setAttribute("replaced", replace);
+-				current.getParentNode().appendChild(clone);
+-
+-				/* Recursion: Do not do recursion on NodeList as it is updated */
+-				final NodeList childNodes = clone.getChildNodes();
+-				final Node[] nodes = new Node[childNodes.getLength()];
+-				for (int i = 0; i < childNodes.getLength(); i++) {
+-					nodes[i] = childNodes.item(i);
+-				}
+-
+-				for (final Node node : nodes) {
+-					if (node.getNodeType() == Node.ELEMENT_NODE) {
+-						XMLHelper.recursivelyResolveReplaces((Element) node,
+-								replace);
+-					}
+-				}
+-
+-			}
+-			current.getParentNode().removeChild(current);
+-		}
+-	}
+-
+-	/**
+-	 * This method recursively traverses the document tree and replaces all
+-	 * parameters that contain section elements with the corresponding number of
+-	 * cloned elements.
+-	 *
+-	 * @param current
+-	 */
+-	public static void recursivelyResolveSections(Element current,
+-			String parentSection) {
+-
+-		final String[] sections = XMLHelper.findApplicableValues(current,
+-				"section", "name", parentSection);
+-
+-
+-		final Element[] sectionChildren = XMLHelper.getElementArray(current,
+-				"section");
+-		for (final Element section : sectionChildren) {
+-			current.removeChild(section);
+-		}
+-
+-		if (sections == null) {
+-			final NodeList childNodes = current.getChildNodes();
+-			final Node[] nodes = new Node[childNodes.getLength()];
+-			for (int i = 0; i < childNodes.getLength(); i++) {
+-				nodes[i] = childNodes.item(i);
+-			}
+-
+-			for (final Node node : nodes) {
+-				if (node.getNodeType() == Node.ELEMENT_NODE) {
+-					XMLHelper.recursivelyResolveSections((Element) node,
+-							parentSection);
+-				}
+-			}
+-		} else if (sections != null) {
+-			/* clone element */
+-			for (final String section : sections) {
+-				final Element clone = (Element) current.cloneNode(true);
+-				clone.setAttribute("section", section);
+-
+-				current.getParentNode().appendChild(clone);
+-
+-				/* Recursion: Do not do recursion on NodeList as it is updated */
+-				final NodeList childNodes = clone.getChildNodes();
+-				final Node[] nodes = new Node[childNodes.getLength()];
+-				for (int i = 0; i < childNodes.getLength(); i++) {
+-					nodes[i] = childNodes.item(i);
+-				}
+-
+-				for (final Node node : nodes) {
+-					if (node.getNodeType() == Node.ELEMENT_NODE) {
+-						XMLHelper.recursivelyResolveSections((Element) node,
+-								section);
+-					}
+-				}
+-
+-			}
+-			current.getParentNode().removeChild(current);
+-		}
+-	}
+-
+-	/**
+-	 * Parses an XML file as specified in the path of an "include" element and
+-	 * replaces the include element with the content of the XML file.
+-	 *
+-	 * @param doc
+-	 */
+-	public static Document resolveIncludes(Document doc, String xsdpath) {
+-		final NodeList include = doc.getElementsByTagName("include");
+-
+-		for (int i = 0; i < include.getLength(); i++) {
+-
+-			final String includePath = ((Element) include.item(i))
+-					.getAttribute("path");
+-
+-			try {
+-				final Document partialDocument = readXML(includePath, xsdpath);
+-
+-				final NodeList children = partialDocument.getChildNodes()
+-						.item(0).getChildNodes();
+-				final Node parent = include.item(i).getParentNode();
+-
+-				for (int j = 0; j < children.getLength(); j++) {
+-					final Node imported = doc
+-							.importNode(children.item(j), true);
+-					parent.appendChild(imported);
+-				}
+-
+-				// parent.replaceChild(fragment, include.item(i));
+-			} catch (final GUIBuildException e) {
+-				// TODO Auto-generated catch block
+-				e.printStackTrace();
+-			}
+-
+-		}
+-
+-		return doc;
+-	}
+-
+-	/**
+-	 * Manipulates the document structure, so that "reference" elements are
+-	 * replaced by the corresponding "parametergroup".
+-	 *
+-	 * @param doc
+-	 * @return
+-	 */
+-	public static Document resolveReferences(Document doc) {
+-
+-		final NodeList references = doc.getElementsByTagName("reference");
+-		final NodeList parametergroups = doc.getElementsByTagName("parametergroup");
+-
+-		while (references.getLength() != 0) {
+-
+-			final Element referenceElement = (Element) references.item(0);
+-
+-			final Element parent = (Element) referenceElement.getParentNode();
+-
+-			parent.removeChild(referenceElement);
+-
+-			for (int i = 0; i < parametergroups.getLength(); i++) {
+-
+-				final Node parametergroupElement = parametergroups.item(i);
+-
+-				if (((Element) parametergroupElement).getAttribute("name")
+-						.equals(referenceElement.getAttribute("name"))) {
+-					final NodeList children = parametergroupElement
+-							.getChildNodes();
+-
+-					for (int j = 0; j < children.getLength(); j++) {
+-						final Node clone = children.item(j).cloneNode(true);
+-						parent.appendChild(clone);
+-					}
+-				}
+-			}
+-		}
+-
+-		while (parametergroups.getLength() != 0) {
+-			parametergroups.item(0).getParentNode()
+-					.removeChild(parametergroups.item(0));
+-		}
+-
+-		return doc;
+-	}
+-
+-
+-	/**
+-	 * @brief  The funciton expects a Node element as argument and transform the XML
+-	 *         (sub)tree starting with the given Node into a string
+-	 * @return A string representing the (sub)tree starting with node
+-	 * @author Thomas Egger
+-	 */
+-	public static String getString(Node node){
+-		String str = "";
+-
+-		try {
+-			Transformer transformer = TransformerFactory.newInstance().newTransformer();
+-			StringWriter buffer = new StringWriter();
+-			transformer.transform(new DOMSource(node), new StreamResult(buffer));
+-			str = buffer.toString();
+-		} catch (Exception ex) {
+-			throw new RuntimeException("Error converting to String", ex);
+-		}
+-
+-		return str;
+-	}
+-}
+Index: ../trunk-jpl/src/java/src/main/GUI.java
+===================================================================
+--- ../trunk-jpl/src/java/src/main/GUI.java	(revision 18297)
++++ ../trunk-jpl/src/java/src/main/GUI.java	(revision 18298)
+@@ -1,548 +0,0 @@
+-/***********************************************************************************/
+-/*  Copyright 2012 WSL Institute for Snow and Avalanche Research    SLF-DAVOS      */
+-/***********************************************************************************/
+-/*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*
+-*/
+-
+-package main;
+-
+-import gui_elements.ControlledPanel;
+-import gui_elements.GUIBuildException;
+-
+-import java.awt.BorderLayout;
+-import java.awt.Color;
+-import java.awt.Component;
+-import java.awt.Container;
+-import java.awt.Desktop;
+-import java.awt.*;
+-import java.awt.event.ActionEvent;
+-import java.awt.event.ActionListener;
+-import java.awt.event.WindowEvent;
+-import java.awt.event.WindowListener;
+-import java.io.IOException;
+-import java.net.URISyntaxException;
+-import java.util.HashMap;
+-import java.util.LinkedList;
+-
+-import javax.swing.BoxLayout;
+-import javax.swing.ImageIcon;
+-import javax.swing.JButton;
+-import javax.swing.JEditorPane;
+-import javax.swing.JFileChooser;
+-import javax.swing.JFrame;
+-import javax.swing.JOptionPane;
+-import javax.swing.JPanel;
+-import javax.swing.JScrollPane;
+-import javax.swing.JTabbedPane;
+-import javax.swing.JToolBar;
+-import javax.swing.event.HyperlinkEvent;
+-import javax.swing.event.HyperlinkListener;
+-import javax.swing.filechooser.FileNameExtensionFilter;
+-import java.io.*;
+-import javax.swing.*;
+-import java.awt.*;
+-import java.awt.event.*;
+-
+-import net.miginfocom.swing.MigLayout;
+-
+-/**
+- * The GUI created by the author.
+- *
+- * @author korhammer et egger
+- *
+- */
+-public class GUI extends JFrame implements WindowListener, ActionListener, HyperlinkListener {
+-
+-	/**
+-	 *
+-	 */
+-	private static final long serialVersionUID = -2428732881181670225L;
+-	public static PanelNode rootNode = null;
+-
+-	private static String title = GUI.class.getPackage().getImplementationTitle() + " " + GUI.class.getPackage().getImplementationVersion();
+-
+-	public static final Color LABEL_COLOR = Color.decode("#000080");
+-	public static Color NORMAL_BACKGROUND_COLOR = Color.decode("#EEEEEE");
+-	public static Color WARNING_BACKGROUND_COLOR = Color.decode("#FF0011");
+-
+-	public static ImageIcon openicon = new ImageIcon(GUI.class.getClassLoader().getResource("resources/icons/xml_open.png"));
+-	public static ImageIcon openiniicon = new ImageIcon(GUI.class.getClassLoader().getResource("resources/icons/fileopen.png"));
+-	public static ImageIcon exporticon = new ImageIcon(GUI.class.getClassLoader().getResource("resources/icons/filesave.png"));
+-	public static ImageIcon previewicon = new ImageIcon(GUI.class.getClassLoader().getResource("resources/icons/kghostview.png"));
+-	public static ImageIcon reseticon = new ImageIcon(GUI.class.getClassLoader().getResource("resources/icons/reset.png"));
+-
+-	private final JButton createbutton;
+-	private final JButton previewButton;
+-	private final JButton openbutton;
+-	private final JButton openinibutton;
+-	private final JButton resetbutton;
+-
+-	private final JTabbedPane tabpane;
+-	private final JToolBar toolbar;
+-	private HashMap<String,JPanel> tabpanels;
+-
+-	private String configFilePath, iniFilePath;
+-
+-	/*
+-	 * Creates a window with the static components of the GUI, i.e. components
+-	 * that do not depend on the configuration file.
+-	 */
+-	public GUI() throws GUIBuildException {
+-		super(title);
+-
+-		configFilePath = System.getProperty("user.dir");
+-		iniFilePath = System.getProperty("user.dir");
+-
+-		tabpanels = new HashMap<String,JPanel>();
+-
+-		Dimension screenDim = new Dimension(1280, 800);
+-		Dimension maxDim = null;
+-
+-		if (this.getMaximizedBounds() == null) {
+-			Toolkit tk = Toolkit.getDefaultToolkit();
+-			maxDim = tk.getScreenSize();
+-			this.setMaximizedBounds(new Rectangle(0, 0, (int)maxDim.getWidth(), (int)maxDim.getHeight()));
+-		} else {
+-			maxDim = this.getMaximizedBounds().getSize();
+-		}
+-
+-		if (maxDim.height < screenDim.height) {
+-			screenDim.height = maxDim.height;
+-			if (screenDim.height > 100)
+-				screenDim.height -= 25;
+-		}
+-
+-		if (maxDim.width < screenDim.width) {
+-			screenDim.width = maxDim.width;
+-			if (screenDim.width > 100)
+-				screenDim.width -= 25;
+-		}
+-
+-		this.setSize(screenDim);
+-		//this.setExtendedState(MAXIMIZED_BOTH);
+-		this.setVisible(true);
+-		this.setLayout(new BorderLayout());
+-
+-		this.toolbar = new JToolBar();
+-		toolbar.setLayout(new BoxLayout(toolbar, 1));
+-		toolbar.setFloatable(false);
+-		this.setVisible(true);
+-		this.add(toolbar, BorderLayout.WEST);
+-
+-		this.tabpane = new JTabbedPane();
+-		this.add(tabpane);
+-		tabpane.setVisible(true);
+-
+-		this.openbutton = new JButton(openicon);
+-		this.openbutton.setActionCommand("open config");
+-		this.openbutton.setToolTipText("Open XML-configuration");
+-		openbutton.addActionListener(this);
+-		toolbar.add(this.openbutton);
+-
+-		this.openinibutton = new JButton(openiniicon);
+-		this.openinibutton.setActionCommand("open ini");
+-		this.openinibutton.setToolTipText("Open existing INI file");
+-		openinibutton.addActionListener(this);
+-		toolbar.add(this.openinibutton);
+-
+-		this.resetbutton = new JButton(reseticon);
+-		this.resetbutton.setActionCommand("reset");
+-		this.resetbutton.setToolTipText("Reset Interface");
+-		resetbutton.addActionListener(this);
+-		toolbar.add(this.resetbutton);
+-
+-		this.createbutton = new JButton(exporticon);
+-		this.createbutton.setActionCommand("write config");
+-		this.createbutton.setToolTipText("Write to INI-file");
+-		createbutton.addActionListener(this);
+-		toolbar.add(this.createbutton);
+-
+-		this.previewButton = new JButton(previewicon);
+-		this.previewButton.setActionCommand("preview");
+-		this.previewButton.setToolTipText("Preview INI-file");
+-		previewButton.addActionListener(this);
+-		toolbar.add(previewButton);
+-
+-		this.addWindowListener(this);
+-
+-		rootNode = new PanelNode("");
+-	}
+-
+-	/**
+-	 * Writes the application name into the GUI window title bar.
+-	 *
+-	 * @param application
+-	 */
+-	public void setApplicationForTitle(String application){
+-		if(application.equals("")){
+-			this.setTitle(title);
+-		}
+-		else{
+-			this.setTitle(title + " for "+application);
+-		}
+-	}
+-
+-	public void hideOpenButton(){
+-		openbutton.setVisible(false);
+-	}
+-
+-	/**
+-	 * Closes all tabs.
+-	 */
+-	public void closeAllTabs(){
+-		tabpane.removeAll();
+-	}
+-
+-	/**
+-	 * Adds a component to the tab specified and creates the tab if it does not
+-	 * already exist.
+-	 *
+-	 * @param comp
+-	 * @param tabName
+-	 * @throws GUIBuildException
+-	 */
+-	public void addToTab(ControlledPanel comp, String tabName, ControlledPanel parentPanel) throws GUIBuildException {
+-		tabName = Character.toUpperCase(tabName.charAt(0)) + tabName.substring(1).toLowerCase();
+-
+-		String section = ((ControlledPanel)comp).getSection().toUpperCase();
+-		String key = section + "::" + ((ControlledPanel)comp).getKey();//((ControlledPanel)comp).getHashKey();
+-		//System.out.println("\tPanel: " + ((ControlledPanel)comp).getHashKey() + "   Section: " + ((ControlledPanel)comp).getSection());
+-
+-		PanelNode sectionNode = rootNode.getChild(section);
+-		if (sectionNode == null) {
+-			PanelNode tmp = new PanelNode(section);
+-			//System.out.println("\t--Adding section '" + section + "' to tree");
+-			sectionNode = rootNode.add(tmp);
+-		}
+-
+-		if (parentPanel != null) {
+-			//System.out.println("\tLooking for node: " + parentPanel.getHashKey());
+-			sectionNode = sectionNode.get(parentPanel.getSection().toUpperCase() + "::" + parentPanel.getKey());
+-		}
+-
+-		if (sectionNode != null) {
+-			PanelNode keyNode = sectionNode.get(key);
+-			if (keyNode == null) {
+-				PanelNode tmp = new PanelNode(key);
+-				keyNode = sectionNode.add(tmp);
+-				//System.out.println("\t--Adding key '" + key + "' to tree as leaf to " + sectionNode.getData());
+-			}
+-		}
+-
+-		JPanel tab;
+-		if (tabpane.indexOfTab(tabName) == -1) {
+-
+-			tab = new JPanel();
+-			tab.setBackground(Color.white);
+-			tab.setVisible(true);
+-			tab.setLayout(new MigLayout("wrap 1"));
+-
+-			JScrollPane scrollpane = new JScrollPane(tab);
+-			tabpane.add(tabName, scrollpane);
+-			tabpanels.put(tabName, tab);
+-
+-		} else {
+-			tab = tabpanels.get(tabName);
+-		}
+-
+-		if (parentPanel != null && containsPanel(tab, parentPanel)) {
+-			parentPanel.add(comp, "span");
+-		} else {
+-			tab.add(comp);
+-		}
+-
+-		//JViewport jv = ((JScrollPane)tabpane.getComponentAt(tabpane.indexOfTab(tabName))).getViewport();
+-		//jv.setViewPosition(new Point(0,0));
+-
+-		this.validate();
+-	}
+-
+-	public void removeFromTab(ControlledPanel parameterPanel, String section, ControlledPanel parentPanel) {
+-		final String tabTitle = section.substring(0, 1).toUpperCase() + section.substring(1).toLowerCase();
+-		final int index = tabpane.indexOfTab(tabTitle);
+-
+-		final Container container = (Container) tabpane.getComponentAt(index);
+-
+-		//System.out.println("Removing Panel: " + parameterPanel.getHashKey());
+-		PanelNode tmp = rootNode.get(parameterPanel.getSection().toUpperCase() + "::" + parameterPanel.getKey());
+-		tmp.getParent().remove(tmp);
+-
+-		if (parentPanel != null && containsPanel(container, parentPanel)) {
+-			parentPanel.remove(parameterPanel);
+-		} else {
+-			container.remove(parameterPanel);
+-		}
+-
+-		GUIBuilder.panelControl.remove(section, parameterPanel.getKey());
+-
+-		container.repaint();
+-		this.validate();
+-	}
+-
+-	public boolean containsPanel(Container container, JPanel panel) {
+-
+-		for (final Component component : container.getComponents()) {
+-			if (component == panel)
+-				return true;
+-			if (containsPanel((Container) component, panel))
+-				return true;
+-		}
+-		return false;
+-	}
+-
+-	@Override
+-	public void actionPerformed(ActionEvent e) {
+-		if (e.getActionCommand().equals("write config") && GUIBuilder.application!=null ) {
+-			GUIBuilder.panelControl.setRootNode(rootNode);
+-
+-			try {
+-				GUIBuilder.printIOFile();
+-			} catch (final IOException e1) {
+-				// TODO Auto-generated catch block
+-				e1.printStackTrace();
+-			} catch (final GUIBuildException e2) {
+-				// TODO Auto-generated catch block
+-				e2.printStackTrace();
+-			}
+-		} else if (e.getActionCommand().equals("preview") && GUIBuilder.application!=null) {
+-			GUIBuilder.panelControl.setRootNode(rootNode);
+-			previewINIFile();
+-		} else if (e.getActionCommand().equals("reset") && GUIBuilder.application!=null) {
+-			resetGUI();
+-		} else if( (e.getActionCommand().equals("open config"))) {
+-			openFile();
+-		} else if( (e.getActionCommand().equals("open ini"))) {
+-			openINIFile();
+-		}
+-	}
+-
+-	public void resetGUI() {
+-		try {
+-			int returnval = GUIBuilder.closeFile();
+-			if (returnval == JOptionPane.CANCEL_OPTION) return;
+-			GUIBuilder.buildGUI(GUIBuilder.currentConfigFile);
+-		} catch (GUIBuildException e) {
+-			e.printStackTrace();
+-		}
+-	}
+-
+-	public void previewINIFile(){
+-		JFrame frame = new JFrame();
+-		frame.setSize(600,800);
+-		frame.setVisible(true);
+-		//frame.setLayout(new BorderLayout());
+-
+-		JEditorPane pane = new JEditorPane();
+-
+-		pane.setText(GUIBuilder.panelControl.toString());
+-		pane.setVisible(true);
+-		pane.setEditable(false);
+-
+-		JScrollPane scrollPane = new JScrollPane(pane);
+-		scrollPane.setVisible(true);
+-		frame.add(scrollPane);
+-
+-		frame.validate();
+-		frame.repaint();
+-	}
+-
+-	public void openINIFile(){
+-		final FileNameExtensionFilter inifilter = new FileNameExtensionFilter(".ini files", "ini");
+-		final JFileChooser filechooser = new JFileChooser(iniFilePath);
+-		filechooser.setFileFilter(inifilter);
+-		final int returnval = filechooser.showOpenDialog(new JPanel());
+-
+-		HashMap<String, String> hm = new HashMap<String, String>();
+-		HashMap<String, String> comments = new HashMap<String, String>();
+-		HashMap<String, String> added_comments = new HashMap<String, String>();
+-
+-		if (returnval == JFileChooser.APPROVE_OPTION) {
+-			final String path = filechooser.getSelectedFile().toString();
+-			if (filechooser.getSelectedFile().isDirectory()) return;
+-
+-			iniFilePath = filechooser.getSelectedFile().getParent();
+-
+-			System.out.println("Opening INI file: " + path);
+-
+-			try {
+-				BufferedReader br = new BufferedReader(new FileReader(path));
+-				String line;
+-
+-				String section = "GENERAL::";
+-				String clines = "";
+-
+-				while((line = br.readLine()) != null) {
+-					int offset = line.indexOf(";");
+-					int offset2 = line.indexOf("#");
+-
+-					if ((offset2 != -1) && (offset != -1)) {
+-						if (offset2 < offset) offset = offset2;
+-					} else if ((offset2 != -1) && (offset == -1)) {
+-						offset = offset2;
+-					}
+-
+-					String comment = null;
+-				     //System.out.println("CLINES" + clines);
+-					if (offset != -1) {
+-						//System.out.println("COMMENT: " + line.substring(offset));
+-						comment = line.substring(offset);
+-					} else {
+-						//System.out.println("COMMENTLESS");
+-					}
+-
+-					if (-1 != offset) line = line.substring(0, offset);
+-
+-					offset = line.indexOf("#");
+-					if (-1 != offset) line = line.substring(0, offset);
+-
+-					line = line.trim(); //take away ws
+-
+-					if (line.length()>1) {
+-
+-						if (line.charAt(0) == '[') {
+-							offset = line.indexOf("]");
+-							if ((offset == -1) || (offset <= 1)) continue;
+-
+-							if (!clines.equals("")) {
+-								int lbr = clines.indexOf("\n");
+-								clines = clines.substring(0, lbr);
+-								//System.out.println("Adding the precomment: " + clines);
+-								comments.put(section, clines);
+-								clines = "";
+-							}
+-
+-							section = line.substring(1, offset).toUpperCase() + "::";
+-							//System.out.println("New Section: " + section);
+-
+-						} else {
+-							String[] tokens = line.split("=");
+-							if (tokens.length == 2) {
+-								String key = tokens[0].trim();
+-								String value = tokens[1].trim();
+-								if (key.length() > 0) {
+-									hm.put(section + key.toUpperCase(), value);
+-									if (comment != null) added_comments.put(section + key.toUpperCase(), comment);
+-									if (!clines.equals("")) {
+-										//System.out.println("Adding the precomment: " + clines);
+-										comments.put(section + key.toUpperCase(), clines);
+-										clines = "";
+-									}
+-								}
+-							}
+-						}
+-
+-						//System.out.println(line);
+-					} else {
+-						//it was a comment line only, associate it with the next key
+-						if (comment != null) clines += comment;
+-						clines += "\n";
+-					}
+-				}
+-				br.close();
+-
+-				GUIBuilder.setValues(hm, added_comments, comments);
+-			} catch (Exception e) {
+-					// TODO Auto-generated catch block
+-					e.printStackTrace();
+-			}
+-		}
+-	}
+-
+-	public void openFile(){
+-		/* If a configuration is already open, ask for close. */
+-		final FileNameExtensionFilter xmlfilter = new FileNameExtensionFilter(".xml files", "xml");
+-		final JFileChooser filechooser = new JFileChooser(configFilePath);
+-		filechooser.setFileFilter(xmlfilter);
+-		final int returnval = filechooser.showOpenDialog(new JPanel());
+-		if (returnval == JFileChooser.APPROVE_OPTION) {
+-			if(GUIBuilder.application != null){
+-				final int returnval2 = GUIBuilder.closeFile();
+-				if (returnval2 == JOptionPane.CANCEL_OPTION) return;
+-			}
+-
+-			final String path = filechooser.getSelectedFile().toString();
+-			if (filechooser.getSelectedFile().isDirectory()) return;
+-
+-			configFilePath = filechooser.getSelectedFile().getParent();
+-
+-			try {
+-				GUIBuilder.buildGUI(path);
+-			} catch (GUIBuildException e) {
+-				// TODO Auto-generated catch block
+-				e.printStackTrace();
+-			}
+-		}
+-	}
+-
+-	@Override
+-	public void windowActivated(WindowEvent e) {
+-		// TODO Auto-generated method stub
+-
+-	}
+-
+-	@Override
+-	public void windowClosed(WindowEvent e) {
+-		// TODO Auto-generated method stub
+-
+-	}
+-
+-	@Override
+-	public void windowClosing(WindowEvent e) {
+-		System.exit(NORMAL);
+-
+-	}
+-
+-	@Override
+-	public void windowDeactivated(WindowEvent e) {
+-		// TODO Auto-generated method stub
+-
+-	}
+-
+-	@Override
+-	public void windowDeiconified(WindowEvent e) {
+-		// TODO Auto-generated method stub
+-
+-	}
+-
+-	@Override
+-	public void windowIconified(WindowEvent e) {
+-		// TODO Auto-generated method stub
+-
+-	}
+-
+-	@Override
+-	public void windowOpened(WindowEvent e) {
+-		// TODO Auto-generated method stub
+-
+-	}
+-
+-	@Override
+-	public void hyperlinkUpdate(HyperlinkEvent e) {
+-
+-		if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
+-		      try {
+-				Desktop.getDesktop().browse(e.getURL().toURI());
+-			} catch (IOException e1) {
+-				// TODO Auto-generated catch block
+-				e1.printStackTrace();
+-			} catch (URISyntaxException e1) {
+-				// TODO Auto-generated catch block
+-				e1.printStackTrace();
+-			}
+-		}
+-	}
+-}
+Index: ../trunk-jpl/src/java/src/main/PanelNode.java
+===================================================================
+--- ../trunk-jpl/src/java/src/main/PanelNode.java	(revision 18297)
++++ ../trunk-jpl/src/java/src/main/PanelNode.java	(revision 18298)
+@@ -1,69 +0,0 @@
+-package main;
+-
+-import java.util.List;
+-import java.util.LinkedList;
+-
+-public class PanelNode {
+-	private String data;
+-	private PanelNode parent;
+-	private LinkedList<PanelNode> children = new LinkedList<PanelNode>();
+-
+-	public PanelNode(String indata) {
+-		data = indata;
+-		parent = null;
+-	}
+-
+-	public PanelNode(PanelNode p) {
+-		data = p.data;
+-		parent = p.parent;
+-		children = new LinkedList<PanelNode>(p.children);
+-	}
+-
+-	public String getData() {
+-		return data;
+-	}
+-
+-	public PanelNode getChild(String data) {
+-		for (PanelNode child : children) {
+-			if (child.data.equals(data))
+-				return child;
+-		}
+-
+-		return null;
+-	}
+-
+-	public PanelNode add(PanelNode c) {
+-		c.parent = this;
+-		children.add(c);
+-
+-		return children.getLast();
+-	}
+-
+-	public PanelNode get(String searchstring) {
+-		if (data.equals(searchstring)) return this;
+-
+-		for (PanelNode child : children) {
+-			PanelNode tmp = child.get(searchstring);
+-			if (tmp != null) return tmp;
+-		}
+-
+-		return null; //Nothing found in subtree
+-	}
+-
+-	public boolean remove(PanelNode tmp) {
+-		return children.remove(tmp);
+-	}
+-
+-	public PanelNode getParent() {
+-		return parent;
+-	}
+-
+-	public void getKeyList(LinkedList<String> keyList) {
+-		if ((data.indexOf('#') == -1) && (data.indexOf('%') == -1))
+-			keyList.add(data);
+-
+-		for (PanelNode child : children) {
+-			child.getKeyList(keyList);
+-		}
+-	}
+-}
+Index: ../trunk-jpl/src/java/src/resources/icons/mydocuments.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/src/resources/icons/readme.txt
+===================================================================
+--- ../trunk-jpl/src/java/src/resources/icons/readme.txt	(revision 18297)
++++ ../trunk-jpl/src/java/src/resources/icons/readme.txt	(revision 18298)
+@@ -1,10 +0,0 @@
+-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+-This copyright and license notice covers the images in this directory.
+-************************************************************************
+-
+-TITLE:	Crystal Project Icons
+-AUTHOR:	Everaldo Coelho
+-SITE:	http://www.everaldo.com
+-CONTACT: everaldo@everaldo.com
+-
+-Copyright (c)  2006-2007  Everaldo Coelho.
+Index: ../trunk-jpl/src/java/src/resources/icons/kghostview.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/src/resources/icons/file_ops.xcf
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/src/resources/icons/filesave.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/src/resources/icons/viewmag.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/src/resources/icons/ini_open.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/src/resources/icons/fileopen.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/src/resources/icons/xml_open.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/src/resources/icons/filesaveas.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/src/resources/icons/opensettings.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/src/resources/icons/reset.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/src/resources/icons/advancedsettings.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/src/resources/config_schema-0.1.1.xsd
+===================================================================
+--- ../trunk-jpl/src/java/src/resources/config_schema-0.1.1.xsd	(revision 18297)
++++ ../trunk-jpl/src/java/src/resources/config_schema-0.1.1.xsd	(revision 18298)
+@@ -1,154 +0,0 @@
+-<?xml version="1.0"?>
+-<!-- 
+-*   
+-*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*    	
+-* -->
+-<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+-  <xsd:element name="inishell_config" type="general" />
+-  
+-  <xsd:complexType name="general">
+-    <xsd:choice maxOccurs="unbounded">
+-      <xsd:element name="parameter" type="parametertype" />
+-      <xsd:element name="parametergroup" type="pargroup" />
+-      <xsd:element name="include" type="pathonly" /> 
+-      <xsd:element name="frame" type="framegroup" /> 
+-    </xsd:choice>
+-    <xsd:attribute name="application" />
+-  </xsd:complexType>
+-
+-  <xsd:complexType name="framegroup">
+-    <xsd:choice minOccurs="1" maxOccurs="unbounded">
+-      <xsd:element name="parameter" type="parametertype" />
+-      <xsd:element name="reference" type="nameonly" />
+-      <xsd:element name="section" type="nameonly"/>
+-    </xsd:choice>
+-    <xsd:attribute name="key" />
+-    <xsd:attribute name="label" />
+-  </xsd:complexType>
+-  
+-  <xsd:complexType name="parametertype">
+-    <xsd:complexContent>
+-      <xsd:extension base="parbasetype">
+-		<xsd:attribute name="key" type="xsd:string" use="required"/> 
+-		<xsd:attribute name="default" type="xsd:string" />
+-		<xsd:attribute name="counter" type="xsd:integer" />
+-      </xsd:extension>
+-    </xsd:complexContent>		
+-  </xsd:complexType>
+-  
+-  <xsd:complexType name="nameonly">
+-	<xsd:attribute name="name" />   
+-  </xsd:complexType>
+-
+-  <xsd:complexType name="optionvalue">
+-	<xsd:attribute name="value" />   
+-  </xsd:complexType>
+-
+-  <xsd:complexType name="pathonly">
+-	<xsd:attribute name="path" />   
+-  </xsd:complexType>
+-  
+-  <xsd:complexType name="pargroup">
+-	<xsd:choice minOccurs="1" maxOccurs="unbounded">
+-	  <xsd:element name="parameter" type="parametertype" />
+-	  <xsd:element name="reference" type="nameonly" />
+-	  <xsd:element name="option" type="optionvalue" />
+-	  <xsd:element name="frame" type="framegroup" /> 
+-	</xsd:choice>
+-	<xsd:attribute name="name" />
+-  </xsd:complexType>
+-
+-  <xsd:complexType name="parbasetype">
+-	<xsd:sequence>
+-	  <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-		<xsd:element name="section" type="nameonly"/>
+-	  </xsd:sequence>
+-	  <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-		<xsd:element name="replace" type="nameonly"/>
+-	  </xsd:sequence>
+-	  <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-		<xsd:element name="parameter" type="parametertype" />
+-	  </xsd:sequence>
+-	  <xsd:choice minOccurs="0" maxOccurs="unbounded">				
+-		<xsd:element name="option" minOccurs="0">
+-		  <xsd:complexType>
+-			<xsd:complexContent>
+-			  <xsd:extension base="parbasetype">
+-				<xsd:attribute name="value" type="xsd:string" use="required" />
+-				<xsd:attribute name="label" type="xsd:string" use="optional" />
+-				<xsd:attribute name="default" type="xsd:boolean" use="optional"/>
+-			  </xsd:extension>
+-			</xsd:complexContent>
+-		  </xsd:complexType>
+-		</xsd:element>
+-	  </xsd:choice>
+-	  <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-		<xsd:element name="reference" type="nameonly" />
+-	  </xsd:sequence>
+-	  <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-		<xsd:element name="help" type="helptype"/>	
+-	  </xsd:sequence>
+-	</xsd:sequence>
+-	
+-	<xsd:attribute name="type" use="required">
+-	  <xsd:simpleType>
+-		<xsd:restriction base="xsd:string">
+-		  <xsd:enumeration value="integer" />
+-		  <xsd:enumeration value="integer+" />
+-		  <xsd:enumeration value="decimal" />
+-		  <xsd:enumeration value="path" />
+-		  <xsd:enumeration value="file" />
+-		  <xsd:enumeration value="choice" />
+-		  <xsd:enumeration value="alternative" />
+-		  <xsd:enumeration value="dropdown" />
+-		  <xsd:enumeration value="string" />
+-		  <xsd:enumeration value="combination" />
+-		  <xsd:enumeration value="selector" />
+-		</xsd:restriction>
+-	  </xsd:simpleType>
+-	</xsd:attribute>
+-	
+-	<xsd:attribute name="maximum" type="xsd:integer"/>
+-	<xsd:attribute name="minimum" type="xsd:integer"/>
+-	<xsd:attribute name="template" type="xsd:boolean" default="false" use="optional" />
+-	<xsd:attribute name="optional" type="xsd:boolean" default="true" />
+-  </xsd:complexType>
+-  
+-  <xsd:complexType name="needstype">
+-	<xsd:attribute name="type" type="xsd:string" use="required" />
+-	<xsd:attribute name="name" type="xsd:string" use="required" />
+-	
+-	<xsd:attribute name="value" />
+-	<xsd:attribute name="optional" type="xsd:boolean" />
+-	<xsd:attribute name="minoccur" type="xsd:integer" />
+-	<xsd:attribute name="maxoccur" type="xsd:string" />
+-  </xsd:complexType>
+-  
+-  <xsd:complexType name="baseType">
+-	<xsd:sequence minOccurs="0" maxOccurs="1">
+-	  <xsd:element name="help" type="helptype" />		
+-	</xsd:sequence>
+-	<xsd:attribute name="key" type="xsd:string" use="required" />
+-  </xsd:complexType>
+-  
+-  <xsd:complexType name="helptype" mixed="true">
+-	<xsd:choice minOccurs="0" maxOccurs="unbounded">
+-	  <xsd:element name="section" type="nameonly" />
+-	  <xsd:element name="replace" type="nameonly" />
+-	</xsd:choice>
+-  </xsd:complexType> 
+-</xsd:schema>
+Index: ../trunk-jpl/src/java/src/resources/document-open-2.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/src/resources/document-preview.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/src/resources/document-export-4.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/src/resources/config_schema.xsd
+===================================================================
+--- ../trunk-jpl/src/java/src/resources/config_schema.xsd	(revision 18297)
++++ ../trunk-jpl/src/java/src/resources/config_schema.xsd	(revision 18298)
+@@ -1,141 +0,0 @@
+-<?xml version="1.0"?>
+-<!-- 
+-*   
+-*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*    	
+-* -->
+-
+-<xsd:schema version="1.0"
+-xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+-
+-  <xsd:element name="inishell_config" type="general" />
+-  
+-	<xsd:complexType name="general">
+-      <xsd:choice maxOccurs="unbounded">
+-			<xsd:element name="parameter" type="parametertype" />
+-			<xsd:element name="parametergroup" type="pargroup" />
+-			<xsd:element name="include" type="pathonly" /> 
+-      </xsd:choice>
+-	  <xsd:attribute name="application" />
+-    </xsd:complexType>
+-	
+-	<xsd:complexType name="parametertype">
+-		<xsd:complexContent>
+-			<xsd:extension base="parbasetype">
+-				<xsd:attribute name="key" type="xsd:string" use="required"/> 
+-				<xsd:attribute name="default" type="xsd:string" />
+-				<xsd:attribute name="counter" type="xsd:integer" />
+-			</xsd:extension>
+-		</xsd:complexContent>		
+-	</xsd:complexType>
+-   
+-   <xsd:complexType name="nameonly">
+-		<xsd:attribute name="name" />   
+-   </xsd:complexType>
+-   
+-   <xsd:complexType name="pathonly">
+-		<xsd:attribute name="path" />   
+-   </xsd:complexType>
+-   
+-	<xsd:complexType name="pargroup">
+-		<xsd:choice minOccurs="1" maxOccurs="unbounded">
+-			<xsd:element name="parameter" type="parametertype" />
+-			<xsd:element name="reference" type="nameonly" />
+-		</xsd:choice>
+-		<xsd:attribute name="name" />
+-	</xsd:complexType>
+-  
+-	
+-	<xsd:complexType name="parbasetype">
+-		<xsd:sequence>
+-			<xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-				<xsd:element name="section" type="nameonly"/>
+-			</xsd:sequence>
+-			<xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-				<xsd:element name="replace" type="nameonly"/>
+-			</xsd:sequence>
+-			<xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-				<xsd:element name="parameter" type="parametertype" />
+-			</xsd:sequence>
+-			<xsd:choice minOccurs="0" maxOccurs="unbounded">				
+-				<xsd:element name="option" minOccurs="0">
+-					<xsd:complexType>
+-						<xsd:complexContent>
+-							<xsd:extension base="parbasetype">
+-								<xsd:attribute name="value" type="xsd:string" use="required" />
+-								<xsd:attribute name="label" type="xsd:string" use="optional" />
+-								<xsd:attribute name="default" type="xsd:boolean"/>
+-							</xsd:extension>
+-						</xsd:complexContent>
+-					</xsd:complexType>
+-				</xsd:element>
+-			</xsd:choice>
+-			<xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-				<xsd:element name="reference" type="nameonly" />
+-			</xsd:sequence>
+-			<xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-				<xsd:element name="help" type="helptype"/>	
+-			</xsd:sequence>
+-		</xsd:sequence>
+-		
+-		<xsd:attribute name="type" use="required">
+-		     <xsd:simpleType>
+-				<xsd:restriction base="xsd:string">
+-					<xsd:enumeration value="integer" />
+-					<xsd:enumeration value="integer+" />
+-					<xsd:enumeration value="decimal" />
+-					<xsd:enumeration value="path" />
+-					<xsd:enumeration value="file" />
+-					<xsd:enumeration value="choice" />
+-					<xsd:enumeration value="alternative" />
+-					<xsd:enumeration value="string" />
+-					<xsd:enumeration value="combination" />
+-					<xsd:enumeration value="selector" />
+-				</xsd:restriction>
+-			</xsd:simpleType>
+-		</xsd:attribute>
+-		
+-		<xsd:attribute name="maximum" type="xsd:integer"/>
+-		<xsd:attribute name="minimum" type="xsd:integer"/>
+-		<xsd:attribute name="template" type="xsd:boolean" default="false" use="optional" />
+-		<xsd:attribute name="optional" type="xsd:boolean" default="true" />
+-	</xsd:complexType>
+-	
+-	<xsd:complexType name="needstype">
+-		<xsd:attribute name="type" type="xsd:string" use="required" />
+-		<xsd:attribute name="name" type="xsd:string" use="required" />
+-	
+-		<xsd:attribute name="value" />
+-		<xsd:attribute name="optional" type="xsd:boolean" />
+-		<xsd:attribute name="minoccur" type="xsd:integer" />
+-		<xsd:attribute name="maxoccur" type="xsd:string" />
+-	</xsd:complexType>
+-	
+-	<xsd:complexType name="baseType">
+-		<xsd:sequence minOccurs="0" maxOccurs="1">
+-			<xsd:element name="help" type="helptype" />		
+-		</xsd:sequence>
+-		<xsd:attribute name="key" type="xsd:string" use="required" />
+-	</xsd:complexType>
+-	
+-	<xsd:complexType name="helptype" mixed="true">
+-		<xsd:choice minOccurs="0" maxOccurs="unbounded">
+-			<xsd:element name="section" type="nameonly" />
+-			<xsd:element name="replace" type="nameonly" />
+-		</xsd:choice>
+-	</xsd:complexType>
+-	
+-</xsd:schema>
+Index: ../trunk-jpl/src/java/src/resources/default_config.xml
+===================================================================
+--- ../trunk-jpl/src/java/src/resources/default_config.xml	(revision 18297)
++++ ../trunk-jpl/src/java/src/resources/default_config.xml	(revision 18298)
+@@ -1,919 +0,0 @@
+-<inishell_config application="Meteo IO">
+-
+-	<!-- General Parameters -->
+-	<parameter key="BUFF_CHUNK_SIZE" type="integer" default="30">
+-		<section name="general" />
+-		<help>Size in days of a chunk of data to read at once.</help>
+-	</parameter>
+-
+-	<parameter key="BUFF_BEFORE" type="decimal" default="1.5">
+-		<section name="general" />
+-		<help>Alternate way of buffer centering: When rebuffering, the new date will be located BUFF_BEFORE days from the
+-		beginning of the buffer (therefore, it takes a value in days).</help>
+-	</parameter>
+-
+-	<!-- Coordinate systems, time zones -->
+-	<parameter key="COORDSYS" type="alternative" optional="false">
+-		<section name="input" />
+-		<section name="output" />
+-		<option value="CH1903" type="string" default="true">
+-			<help>coordinates in the Swiss Grid &lt;a href="http://geomatics.ladetto.ch/ch1903_wgs84_de.pdf"&gt;http://geomatics.ladetto.ch/ch1903_wgs84_de.pdf&lt;/a&gt;</help>
+-		</option>
+-		<option value="UTM" type="string">
+-			<parameter key="COORDPARAM" type="string">
+-				<help>specify the zone with the zone letter (for example, 32T)</help>
+-			</parameter>
+-			<help>UTM coordinates, see &lt;a href="http://www.oc.nps.edu/oc2902w/maps/utmups.pdf"&gt;http://www.oc.nps.edu/oc2902w/maps/utmups.pdf&lt;/a&gt;</help>
+-		</option>
+-		<option value="UPS" type="string">
+-			<parameter key="COORDPARAM" type="string">
+-				<help>specify the hemisphere (either N or S)</help>
+-			</parameter>
+-			<help>Universal Polar Stereographic coordinates, see &lt;a href="https://en.wikipedia.org/wiki/Universal_Polar_Stereographic_coordinate_system"&gt;https://en.wikipedia.org/wiki/Universal_Polar_Stereographic_coordinate_system&lt;/a&gt;</help>
+-		</option>
+-		<option value="PROJ4" type="string">
+-			<parameter key="COORDPARAM" type="string" optional="false" />
+-			<help>external library: see &lt;a href="http://trac.osgeo.org/proj/"&gt;http://trac.osgeo.org/proj/&lt;/a&gt;</help>
+-		</option>
+-		<option value="LOCAL"  type="string">
+-			<help>uses the horizontal and vertical distance from a reference point</help>
+-		</option>
+-		<help>coordinate system</help>
+-	</parameter>
+-
+-	<parameter key="TIME_ZONE" type="integer+" default="+1" maximum="14" minimum="-12" optional="false">
+-		<section name="input" />
+-		<section name="output" />
+-	</parameter>
+-
+-	<!-- Datatypes: special pts -->
+-	<parameter key="SPECIALPTS" type="alternative">
+-		<section name="input" />
+-		<option value="A3D" type="string">
+-			<parameter key="SPECIALPTSFILE" type="file" optional="false">
+-				<help>a path+file name to the a file containing grid coordinates of special points of interest (for special outputs)</help>
+-			</parameter>
+-		</option>
+-		<option value="SMET" type="string">
+-			<parameter key="SPECIALPTSFILE" type="file" optional="false">
+-				<help>a path+file name to the a file containing grid coordinates of special points of interest (for special outputs)</help>
+-			</parameter>
+-		</option>
+-	</parameter>
+-
+-	<!-- Datatypes: Meteo Data -->
+-	<parameter key="METEO" type="alternative">
+-		<section name="input" />
+-		<section name="output" />
+-
+-		<option value="A3D" type="string">
+-			<parameter key="METEOPATH" type="path" optional="false">
+-				<help>string containing the path to the meteorological files</help>
+-			</parameter>
+-		</option>
+-		<option value="BORMA" type="string">
+-			<section name="input" />
+-			<reference name="BORMA" />
+-		</option>
+-		<option value="COSMO" type="string">
+-			<parameter key="METEOPATH" type="path" optional="false">
+-				<help>string containing the path to the meteorological files</help>
+-			</parameter>
+-		</option>
+-		<option value="GEOTOP" type="string">
+-			<section name="input" />
+-			<reference name="GEOTOP_IN" />
+-		</option>
+-		<option value="GEOTOP" type="string">
+-			<section name="output" />
+-			<reference name="GEOTOP_OUT" />
+-		</option>
+-		<option value="GRIB" type="string">
+-			<section name="input" />
+-			<reference name="GRIB_METEO" />
+-		</option>
+-		<option value="GSN" type="string">
+-			<section name="input" />
+-			<reference name="GSN" />
+-		</option>
+-		<option value="IMIS" type="string">
+-			<section name="input" />
+-			<reference name="IMIS" />
+-		</option>
+-		<option value="SMET" type="string">
+-			<section name="input" />
+-			<reference name="SMET_IN" />
+-		</option>
+-		<option value="SMET" type="string">
+-			<section name="output" />
+-			<reference name="SMET_OUT" />
+-		</option>
+-		<option value="SNOWPACK" type="string">
+-			<section name="input" />
+-			<reference name="SNIO_IN" />
+-		</option>
+-		<option value="SNOWPACK" type="string">
+-			<section name="output" />
+-			<parameter key="METEOPATH" type="path" optional="false">
+-				<help>string representing path where SNOWPACK files should be saved</help>
+-			</parameter>
+-		</option>
+-
+-		<help>plugin for METEO data </help>
+-	</parameter>
+-
+-	<parameter key="Add Meteo parameter copy" type="selector">
+-		<section name="input"/>
+-		<parameter key="COPY::%" type="string" optional="false" template="true">
+-		  <help>The name of the parameter to copy (e.g. TA, RH, VW, ISWR, etc)</help>
+-		</parameter>
+-	</parameter>
+-
+-	<!-- Datatypes: DEM -->
+-	<frame key="dem_frame" label="Digital Elevation Model">
+-	<section name="input"/>
+-		<parameter key="DEM" type="alternative">
+-			<section name="input" />
+-			<option value="ARC" type="string">
+-				<parameter key="DEMFILE" type="file" optional="false">
+-					<help>For reading the data as a DEMObject</help>
+-				</parameter>
+-			</option>
+-			<option value="ARPS" type="string">
+-				<parameter key="DEMFILE" type="file" optional="false">
+-					<help>For reading the data as a DEMObject</help>
+-				</parameter>
+-				<parameter key="ARPS_XCOORD" type="decimal" optional="false">
+-					<help>x coordinate of the lower left corner of the grids</help>
+-				</parameter>
+-				<parameter key="ARPS_YCOORD" type="decimal" optional="false">
+-					<help>y coordinate of the lower left corner of the grids</help>
+-				</parameter>
+-			</option>
+-			<option value="GRASS" type="string">
+-				<parameter key="DEMFILE" type="file" optional="false">
+-					<help>For reading the data as a DEMObject</help>
+-				</parameter>
+-			</option>
+-			<option value="GRIB" type="string">
+-				<parameter key="DEMFILE" type="file" optional="false">
+-					<help>For reading the data as a DEMObject</help>
+-				</parameter>
+-				<parameter key="GRIB_DEM_UPDATE" type="alternative" optional="true">
+-					<option value="TRUE" type="string" />
+-					<option value="FALSE" type="string" />
+-					<help>recompute slope/azimuth from the elevations when reading a DEM (default=false, that is we use the slope and azimuth included in the GRIB file)</help>
+-				</parameter>
+-			</option>
+-			<option value="PGM" type="string">
+-				<parameter key="DEMFILE" type="file" optional="false">
+-					<help>For reading the data as a DEMObject</help>
+-				</parameter>
+-				<reference name="PGM_IN" />
+-			</option>
+-
+-			<help>plugin for Digital Elevation Model data </help>
+-		</parameter>
+-	</frame>
+-
+-	<!-- Datatypes: Landuse -->
+-	<parameter key="LANDUSE" type="alternative">
+-		<section name="input" />
+-		<option value="ARC" type="string">
+-			<parameter key="LANDUSEFILE" type="file" optional="false">
+-				<help>File containing a grid of landuse codes</help>
+-			</parameter>
+-		</option>
+-
+-		<help>plugin for land cover data </help>
+-	</parameter>
+-
+-	<!-- Datatypes: Grids -->
+-	<parameter key="GRID2D" type="alternative">
+-		<section name="input" />
+-		<section name="output" />
+-		<option value="ARC" type="string">
+-			<parameter key="GRID2DPATH" type="path" optional="false">
+-				<help>string representing path where grid files should be read from</help>
+-			</parameter>
+-			<reference name="ARC" />
+-		</option>
+-		<option value="ARPS" type="string">
+-			<section name="input" />
+-			<parameter key="GRID2DPATH" type="path" optional="false">
+-				<help>string representing path where grid files should be read from</help>
+-			</parameter>
+-			<reference name="ARPS" />
+-		</option>
+-		<option value="GRASS" type="string">
+-			<section name="input" />
+-			<parameter key="GRID2DPATH" type="path" optional="false">
+-				<help>string representing path where grid files should be read from</help>
+-			</parameter>
+-		</option>
+-		<option value="GRIB" type="string">
+-			<section name="input" />
+-			<parameter key="GRID2DPATH" type="path" optional="false">
+-				<help>string representing path where grid files should be read from</help>
+-			</parameter>
+-			<reference name="GRIB_GRIDS" />
+-		</option>
+-		<option value="PGM" type="string">
+-			<section name="input" />
+-			<parameter key="GRID2DPATH" type="path" optional="false">
+-				<help>string representing path where grid files should be read from</help>
+-			</parameter>
+-			<reference name="PGM_IN" />
+-		</option>
+-		<option value="PGM" type="string">
+-			<section name="output" />
+-			<parameter key="GRID2DPATH" type="path" optional="false">
+-				<help>string representing path where grid files should be read from</help>
+-			</parameter>
+-		</option>
+-		<option value="PNG" type="string">
+-			<section name="output" />
+-			<parameter key="GRID2DPATH" type="path" optional="false">
+-				<help>string representing path where grid files should be read from</help>
+-			</parameter>
+-			<reference name="PNG" />
+-		</option>
+-		<help>plugin for 2D gridded data </help>
+-	</parameter>
+-
+-	<!--Parameter group for list of stations -->
+-	<parametergroup name="stationgroup_files">
+-		<parameter key="STATION#" type="file" counter="1" optional="false">
+-			<help>filename for station number # </help>
+-		</parameter>
+-	</parametergroup>
+-	<parametergroup name="stationgroup_names">
+-		<parameter key="STATION#" type="string" counter="1" optional="false">
+-			<help>station id for the given station number # </help>
+-		</parameter>
+-	</parametergroup>
+-	<parametergroup name="stationgroup_pos">
+-		<parameter key="STATION#" type="string" counter="1">
+-			<help>Coordinates are given as "lat lon" or "xcoord ycoord epsg_code"</help>
+-		</parameter>
+-	</parametergroup>
+-
+-	<!-- Plugins for Meteo Data-->
+-	<parametergroup name="BORMA">
+-		<parameter key="METEOPATH" type="path" optional="false">
+-			<help>string containing the path to the xml files</help>
+-		</parameter>
+-		<reference name="stationgroup_names" />
+-	</parametergroup>
+-
+-	<parametergroup name="IMIS">
+-		<parameter key="DBNAME" type="string" optional="false">
+-			<help>database name, as provided by your database administrator</help>
+-		</parameter>
+-		<parameter key="DBUSER" type="string" optional="false">
+-			<help>database user name</help>
+-		</parameter>
+-		<parameter key="DBPASS" type="string" optional="false">
+-			<help>database password associated with the user name</help>
+-		</parameter>
+-		<parameter key="USEANETZ" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		  <help>OPTIONAL: use ANETZ stations to provide precipitations for normal IMIS stations.
+-		  Each IMIS station is associated with one or two ANETZ stations and does a weighted
+-		  average to get what should be its local precipitations</help>
+-		</parameter>
+-		<parameter key="USE_IMIS_HNW" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		  <help>OPTIONAL: if set to false (default), all IMIS precipitation will be deleted (since IMIS stations don't have heated rain gauges, their precipitation measurements are not good in winter conditions). If set to true, it is strongly advised to use a FilterHNWMelt filter to detect snow melting in the rain gauge and perform winter conditions detection in the application.</help>
+-		</parameter>
+-		<parameter key="USE_SNOWPACK_HNW" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		  <help>if set to true, the SNOWPACK simulated Snow Water Equivalent from the database will be used to compute HNW. Data gaps greater than 3 hours on SWE will lead to unchanged hnw while all data that can properly be computed will overwrite hnw. (default=false)</help>
+-		</parameter>
+-
+-		<reference name="stationgroup_names" />
+-	</parametergroup>
+-
+-	<parametergroup name="GRIB_METEO">
+-		<parameter key="METEOPATH" type="path" optional="false">
+-			<help>string containing the path to the grib files</help>
+-		</parameter>
+-		<parameter key="METEOEXT" type="string" optional="true">
+-			<help>grib file extension, or none for no file extension (default: .grb)</help>
+-		</parameter>
+-
+-		<reference name="stationgroup_pos" />
+-	</parametergroup>
+-
+-	<parametergroup name="GEOTOP_IN">
+-		<parameter key="METEOPATH" type="path" optional="false">
+-			<help>string containing the path to the data files</help>
+-		</parameter>
+-		<parameter key="METAFILE" type="file" optional="false">
+-			<help>absolute filename of the geotop.inpts file</help>
+-		</parameter>
+-		<parameter key="METEOPREFIX" type="string" optional="true">
+-			<help>prefix to append when generating a file name for reading</help>
+-		</parameter>
+-	</parametergroup>
+-
+-	<parametergroup name="GEOTOP_OUT">
+-		<parameter key="METEOPATH" type="path" optional="false">
+-			<help>string containing the path to the data files</help>
+-		</parameter>
+-		<parameter key="METEOSEQ" type="string" optional="false">
+-			<help>specifiy in which order the columns should be printed out</help>
+-		</parameter>
+-	</parametergroup>
+-
+-	<parametergroup name="GSN">
+-		<parameter key="ENDPOINT" type="string" optional="false">
+-			<help>webserver running GSN with its port number and full path. For example:
+-			http://montblanc.slf.ch:22001/services/A3DWebService</help>
+-		</parameter>
+-		<parameter key="PROXY" type="string" optional="true">
+-			<help>Should the connection go through a proxy? This is useful for servers
+-			filtering on domains but usually not necessary.</help>
+-		</parameter>
+-		<parameter key="PROXYPORT" type="string" optional="true" />
+-		<parameter key="PROXYUSER" type="string" optional="true" />
+-		<parameter key="PROXYPASS" type="string" optional="true" />
+-
+-		<reference name="stationgroup_names" />
+-	</parametergroup>
+-
+-	<parametergroup name="SMET_IN">
+-		<parameter key="METEOPATH" type="path" optional="false">
+-			<help>string containing the path to the smet files</help>
+-		</parameter>
+-		<reference name="stationgroup_files" />
+-	</parametergroup>
+-
+-	<parametergroup name="SMET_OUT">
+-		<parameter key="METEOPATH" type="path" optional="false">
+-			<help>string representing path where SMET files should be saved</help>
+-		</parameter>
+-		<parameter key="METEOPARAM" type="alternative">
+-		  <option value="ASCII" type="string" default="true">
+-		    <help>Write ASCII SMET files</help>
+-		  </option>
+-		  <option value="BINARY" type="string">
+-		    <help>Write BINARY SMET files</help>
+-		  </option>
+-		</parameter>
+-	</parametergroup>
+-
+-	<parametergroup name="SNIO_IN">
+-		<parameter key="METEOPATH" type="path" optional="false">
+-			<help>string containing the path to the SNOWPACK files</help>
+-		</parameter>
+-		<parameter key="METAFILE" type="file" optional="true">
+-			<help>filename of the meta data file (in METEOPATH)</help>
+-		</parameter>
+-
+-		<parameter key="NUMBER_MEAS_TEMPERATURES" type="integer+" minimum="0" default="0">
+-		  <help>the number of measured snow temperatures provided</help>
+-		</parameter>
+-
+-		<parameter key="NUMBER_OF_SOLUTES" type="integer+" minimum="0" default="0">
+-		  <help>the number of solutes for which input data are provided</help>
+-		</parameter>
+-
+-		<parameter key="RSWR_INP" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		</parameter>
+-		<parameter key="ISWR_INP" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		</parameter>
+-		<parameter key="VW_DRIFT" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		  <help>OPTIONAL: wind velocity to use for blowing and drifting snow is provided</help>
+-		</parameter>
+-		<parameter key="RHO_HN" type="alternative" optional="true">
+-		  <option value="TRUE" type="string" />
+-		  <option value="FALSE" type="string" />
+-		  <help>OPTIONAL: measured new snow density is provided</help>
+-		</parameter>
+-
+-		<reference name="stationgroup_files" />
+-	</parametergroup>
+-
+-	<!-- Plugins for Gridded Data-->
+-	<parametergroup name="ARC">
+-		<parameter key="A3D_VIEW" type="alternative" optional="true">
+-			<option value="TRUE" type="string" />
+-			<option value="FALSE" type="string" />
+-			<help>generate names compatible with Alpine3D's grid viewer?</help>
+-		</parameter>
+-		<parameter key="GRID2DEXT" type="string" optional="true">
+-			<help>grid file extension, or none for no file extension (default: .asc)</help>
+-		</parameter>
+-	</parametergroup>
+-
+-	<parametergroup name="ARPS">
+-		<parameter key="ARPS_XCOORD" type="decimal" optional="false">
+-			<help>x coordinate of the lower left corner of the grids</help>
+-		</parameter>
+-		<parameter key="ARPS_YCOORD" type="decimal" optional="false">
+-			<help>y coordinate of the lower left corner of the grids</help>
+-		</parameter>
+-		<parameter key="GRID2DEXT" type="string" optional="true">
+-			<help>grid file extension, or none for no file extension (default: .asc)</help>
+-		</parameter>
+-	</parametergroup>
+-
+-	<parametergroup name="GRIB_GRIDS">
+-		<parameter key="GRID2DPREFIX" type="string" optional="true">
+-			<help>prefix to append when generating a file name for reading (ie: something like "laf" for Cosmo-Analysis-full domain)</help>
+-		</parameter>
+-		<parameter key="GRID2DEXT" type="string" optional="true">
+-			<help>grib file extension, or none for no file extension (default: .grb)</help>
+-		</parameter>
+-	</parametergroup>
+-
+-	<parametergroup name="PNG">
+-		<parameter key="PNG_WORLD_FILE" type="alternative" optional="true">
+-			<option value="TRUE" type="string" />
+-			<option value="FALSE" type="string" />
+-			<help>generate a world file for each output file? This file contains the geolocalization information</help>
+-		</parameter>
+-		<parameter key="PNG_LEGEND" type="alternative" optional="true">
+-			<option value="TRUE" type="string" />
+-			<option value="FALSE" type="string" />
+-			<help>generate a legend?</help>
+-		</parameter>
+-		<parameter key="PNG_AUTOSCALE" type="alternative" optional="true">
+-			<option value="TRUE" type="string" />
+-			<option value="FALSE" type="string" />
+-			<help>autoscale color scale?</help>
+-		</parameter>
+-		<parameter key="PNG_SCALING" type="alternative" optional="true">
+-			<option value="nearest" type="string" />
+-			<option value="bilinear" type="string" />
+-			<help>scaling algorithm (default=bilinear)</help>
+-		</parameter>
+-		<parameter key="PNG_MIN_SIZE" type="string" optional="false">
+-			<help>minimum dimensions of the PNG, like 640x480</help>
+-		</parameter>
+-		<parameter key="PNG_MAX_SIZE" type="string" optional="false">
+-			<help>maximum dimensions of the PNG, like 1024x768</help>
+-		</parameter>
+-		<parameter key="PNG_INDEXED" type="alternative" optional="true">
+-			<option value="TRUE" type="string" />
+-			<option value="FALSE" type="string" />
+-			<help>generate a color indexed file (default=true)</help>
+-		</parameter>
+-		<parameter key="PNG_SPEED_OPTIMIZE" type="alternative" optional="true">
+-			<option value="TRUE" type="string" />
+-			<option value="FALSE" type="string" />
+-			<help>optimize for speed (default=false)</help>
+-		</parameter>
+-		<parameter key="PNG_NR_LEVELS" type="integer+" default="+30" maximum="255" minimum="6" optional="true">
+-			<help>number of colors in the palette (default=30)</help>
+-		</parameter>
+-	</parametergroup>
+-
+-	<parametergroup name="PGM_IN">
+-		<parameter key="PGM_XCOORD" type="decimal" optional="false">
+-			<help>lower left x coordinate</help>
+-		</parameter>
+-		<parameter key="PGM_YCOORD" type="decimal" optional="false">
+-			<help>lower left y coordinate</help>
+-		</parameter>
+-		<parameter key="PGM_CELLSIZE" type="decimal" optional="false">
+-			<help>cellsize in meters</help>
+-		</parameter>
+-		<parameter key="PGM_MIN" type="decimal" optional="false">
+-			<help>minimum value in real world coordinates to match with the minimum value read out of the PGM file (such minimum being greater than 0 because 0 is NODATA)</help>
+-		</parameter>
+-		<parameter key="PGM_MAX" type="decimal" optional="false">
+-			<help>maximum value in real world coordinates to match with the maximum value read out of the PGM file</help>
+-		</parameter>
+-	</parametergroup>
+-
+-	<!-- Meteo Parameters for Filters, resampling, spatial interpolations-->
+-	<parametergroup name="METEOIOPARAMETERS">
+-		<option value="TA"/>
+-		<option value="RH"/>
+-		<option value="VW"/>
+-		<option value="DW"/>
+-		<option value="VW_MAX"/>
+-		<option value="ISWR"/>
+-		<option value="RSWR"/>
+-		<option value="ILWR"/>
+-		<option value="HS"/>
+-		<option value="HNW"/>
+-		<option value="TSG"/>
+-		<option value="TSS"/>
+-		<option value="P"/>
+-	</parametergroup>
+-
+-	<!-- Filters -->
+-	<parameter key="Add/Remove Filter" type="selector">
+-		<section name="filters" />
+-
+-		<parameter key="%::filter#" type="alternative" counter="1" template="true">
+-			<section name="filters" />
+-
+-			<option label="MeanAvg" value="mean_avg" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			    </help>
+-			  </parameter>
+-			  <help>Mean average processing. The mean average filter returns the mean value of all values within a user given time window.</help>
+-			</option>
+-
+-			<option label="MedianAvg" value="median_avg" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="decimal" minimum="0" />
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			    </help>
+-			  </parameter>
+-			  <help>Median average processing. The median average filter returns the median value of all values within a user given time window.</help>
+-			</option>
+-
+-			<option label="Std Deviation Filter" value="std_dev" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			    </help>
+-			  </parameter>
+-			  <help>Standard deviation filter. Values outside of mean ± 2 std_dev are rejected.</help>
+-			</option>
+-
+-			<option label="MAD" value="mad" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			    </help>
+-			  </parameter>
+-			  <help>Median Absolute Deviation. Values outside of median ± 3 σ_MAD are rejected. &lt;br&gt;
+-			  See http://en.wikipedia.org/wiki/Median_absolute_deviation for more information.</help>
+-			</option>
+-
+-			<option label="Tukey 53H Filter" value="Tukey" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <help>
+-			      The keyword "soft" maybe added, if the window position is allowed to be adjusted to the data present.
+-			      The two arguments may be preceded by the keywords "left", "center" or "right", indicating the window position.
+-			    </help>
+-			  </parameter>
+-			  <help>Tukey 53H method A smooth time sequence is generated from the median, substracted from the original signal and
+-			  compared with the standard deviation. see "Despiking Acoustic Doppler Velocimeter Data", Derek G. Goring and Vladimir
+-			  L. Nikora, Journal of Hydraulic Engineering, 128, 1, 2002 The deviation factor coeffecient is currently hard-coded as k=1.5. </help>
+-			</option>
+-
+-			<option label="Wind Averaging Filter" value="wind_avg" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			    </help>
+-			  </parameter>
+-			  <help>Wind vector averaging. This calculates the vector average over a user given time period. Each wind vector
+-			  within this period is added and the final sum is normalized by the number of vectors that have been added. </help>
+-			</option>
+-
+-			<option label="Exponential Smoothing" value="exp_smoothing" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <option label="alpha:" value="0.8" type="decimal" minimum="0" maximum="1"/>
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			      Alpha needs to be provided as last argument. Please note that the standard filter works with a left window!
+-			    </help>
+-			  </parameter>
+-			  <help>Exponential smooting processing, exponential moving average s_0 = x_0 s_n = alpha*x_(t-1) + (1-alpha)*s_t-1</help>
+-			</option>
+-
+-			<option label="Weighted Moving Average Smoothing" value="wma_smoothing" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option value="center" type="dropdown">
+-			      <option value="left" type="string" />
+-			      <option value="center" type="string" />
+-			      <option value="right" type="string" />
+-			    </option>
+-			    <option label="# of points:" value="1" type="integer" minimum="1" />
+-			    <option label="Duration:" value="0" type="integer" minimum="0" />
+-			    <help>
+-			      Activate "soft" if the window position is allowed to be adjusted, window position maybe left, center or right.
+-			      Minimal number of points in window and minimal time interval spanning the window (seconds) are required.
+-			      Please note that the standard filter works with a left window!
+-			    </help>
+-			  </parameter>
+-			  <help>Weighted moving average smoothing such as: WMA = (1*X1 + 2*X2 + ... + n*Xn) / sum_of_weights</help>
+-			</option>
+-
+-			<option label="Min Range Filter" value="min" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option label="Min:" value="" type="decimal" />
+-			    <option label="Adjust to:" value="" type="decimal" />
+-			    <help>The keyword "soft" maybe added, in such a case all data smaller than the min would be
+-			    assigned the minimum permissible value or another value given as an extra argument</help>
+-			  </parameter>
+-			  <help>Min range filter. Reject all values smaller than the min.</help>
+-			</option>
+-
+-			<option label="Max Range Filter" value="max" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option label="Max:" value="" type="decimal" />
+-			    <option label="Adjust to:" value="" type="decimal" />
+-			    <help>The keyword "soft" maybe added, in such a case all data greater than the max would be
+-			    assigned the maximum permissible value or another value given as an extra argument</help>
+-			  </parameter>
+-			  <help>Max range filter. Reject all values greater than the max.</help>
+-			</option>
+-
+-			<option label="MinMax (2 or 4 arguments)" value="min_max" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option label="Min:" value="" type="decimal" />
+-			    <option label="Max:" value="" type="decimal" />
+-			    <option label="Min adjust to:" value="" type="decimal" />
+-			    <option label="Max adjust to:" value="" type="decimal" />
+-			    <help>The keyword "soft" maybe added, in such a case all data greater than the max would be assigned
+-			    the maximum permissible value and all data smaller than the min would be assigned the minimum
+-			    permissible value or an optional extra set of two user provided values</help>
+-			  </parameter>
+-			  <help>Reject all values greater than the max or smaller than the min. &lt;br&gt;</help>
+-			</option>
+-
+-			<option label="Rate Filter (1 argument)" value="rate" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option label="Max:" value="1.0" type="decimal" minimum="0" maximum="1" />
+-			    <help>the absolute value of the maximum permissible rate of change (per seconds)</help>
+-			  </parameter>
+-			  <help>Rate of change filter. Calculate the change rate (ie: slope) between two points, if it is above a user given value, reject the point.</help>
+-			</option>
+-
+-			<option label="Rate Filter (2 arguments)" value="rate" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option label="Min:" value="0.0" type="decimal" minimum="0" maximum="1" />
+-			    <option label="Max:" value="1.0" type="decimal" minimum="0" maximum="1" />
+-			    <help>the minimum and maximum permissible rate of change (per second)</help>
+-			  </parameter>
+-			  <help>Rate of change filter. Calculate the change rate (ie: slope) between two points, if it is above a user given value, reject the point.</help>
+-			</option>
+-
+-			<option label="Unheated Rain Gauge Filter" value="Unheated_RainGauge" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option value="soft" type="choice" />
+-			    <option label="RH threshold:" value="0.5" type="decimal" minimum="0" maximum="1" />
+-			    <option label="Delta_T threshold:" value="3.0" type="decimal" minimum="0" maximum="20" />
+-			  </parameter>
+-			  <help>Filters out snow melting in an unheated rain gauge. This filter can ONLY be applied to precipitation. Non-zero measurements are accepted only if they take place when the relative humidity is greater than RH_threshold and (TA-TSS) smaller than Delta_T_threshold, otherwise they get reset to 0. If none of these conditions could be tested (for lack of data), then the precipitation is reset to nodata (or left unchanged if "soft" has been selected).</help>
+-			</option>
+-
+-			<option label="WMO Undercatch Filter" value="undercatch_wmo" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-				<option value="Gage type" type="dropdown">
+-					<option value="Nipher" type="string" />
+-					<option value="Tretyakov" type="string" />
+-					<option value="US8sh" type="string" />
+-					<option value="US8unsh" type="string" />
+-					<option value="Hellmann" type="string" />
+-					<option value="Hellmannsh" type="string" />
+-				</option>
+-			  </parameter>
+-			  <help>This implements the standard methods for precipitation correction as described in "WMO Solid Precipitation Measurement Intercomparison", B. Goodison, P. Louie and D. Yang, 872, 1998 as well as the overview given by "Literature Study on the Correction of Precipitation Measurements", Annette Wagner, 2009. The correction parameters for the shielded Hellmann gauge (German version) are from "Wind-induced Precipitation Undercatch of the Hellmann Gauges", Daqing Yang et al, Nordic Hydrology, 30, 1999, pp 57-80.</help>
+-			</option>
+-
+-			<option label="WMO Undercatch Filter - simplified" value="undercatch_wmo" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-				<option value="Kind" type="dropdown">
+-					<option value="Cst" type="string" />
+-				</option>
+-				<option label="Snow factor:" value="1.3" type="decimal" minimum="0" maximum="5" />
+-				<option label="Mixed prec factor:" value="1.1" type="decimal" minimum="0" maximum="5" />
+-			  </parameter>
+-			  <help>This applies a constant correction factor to the precipitation, one for pure snow and one for mixed precipitation. The following thresholds are used: pure snow below -2 C; mixed precipitation between -2 and +2 C; pure rain above 2 C. These threshold can be changed (see online documentation).</help>
+-			</option>
+-
+-			<option label="Unventillated temperature sensor" value="Unventilated_T" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-			    <option label="albedo:" value="0.23" type="decimal" />
+-			    <option value="soft" type="choice" />
+-			    <help>If the "soft" option is given, the albedo has a value different according to snow (or no snow) on the ground</help>
+-			  </parameter>
+-			  <help>This implements the correction described in (Reina Nakamura, 2005) with an albedo dependency as introduced in (Huwald, 2009)</help>
+-			</option>
+-
+-			<option label="Add an offset" value="add" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-				<option label="offset:" value="0." type="decimal" />
+-			  </parameter>
+-			  <help>This adds a given offset to the data.</help>
+-			</option>
+-
+-			<option label="Multiply by a factor" value="mult" type="string">
+-			  <parameter key="%::arg#" type="combination">
+-				<option label="factor:" value="1." type="decimal" />
+-			  </parameter>
+-			  <help>This multiplies the data by a given factor.</help>
+-			</option>
+-
+-		</parameter>
+-
+-		<reference name="METEOIOPARAMETERS" />
+-	</parameter>
+-
+-	<!-- 1D Interpolation -->
+-	<parameter key="WINDOW_SIZE" type="integer+" minimum="1" default="43200">
+-		<section name="Interpolations1D" />
+-		<help>Affects resampling: expresses (in seconds) how far a valid point can be
+-		searched for when re-interpolating a missing value</help>
+-	</parameter>
+-
+-	<parameter key="Add/Remove 1D Interpolation" type="selector">
+-		<section name="Interpolations1D" />
+-
+-		<parameter key="%::resample" type="alternative" template="true">
+-			<section name="Interpolations1D" />
+-			<option label="No Interpolation" value="none" type="string" />
+-			<option label="Nearest Neighbour" value="nearest_neighbour" type="string" />
+-			<option label="Linear" value="linear" type="string">
+-			  <parameter key="%::args" type="combination">
+-			    <option value="extrapolate" type="choice" />
+-			    <help>
+-			      If "extrapolate" is added, then data *outside* of the original date range can be interpolated.
+-			      Otherwise, a data point will only be calculated between the original date range.
+-			    </help>
+-			  </parameter>
+-			  <help>Mean average processing. The mean average filter returns the mean value of all values within a user given time window.</help>
+-			</option>
+-			<option label="Accumulate" value="accumulate" type="string">
+-			  <parameter key="%::args" type="combination">
+-			    <option value="strict" type="choice" />
+-			    <option label="Seconds:" value="900" type="integer" minimum="1" />
+-			    <help>Accumulation period (in seconds). This must usually match the model time step. if enabling "strict", nodatas will propagate (ie. a single nodata in the input will force the re-accumulated value to be nodata). Otherwise, all valid values are aggregated and only pure nodata intervals produce a nodata in the output.</help>
+-			  </parameter>
+-			  <help>Accumulation over a user given period (filter argument, in seconds -
+-			  should coincide with your calculation step!).</help>
+-			</option>
+-		</parameter>
+-
+-		<reference name="METEOIOPARAMETERS" />
+-	</parameter>
+-
+-	<!-- 2D Interpolation -->
+-	<parameter key="Add/Remove 2D Interpolation" type="selector">
+-		<section name="Interpolations2D" />
+-
+-		<parameter key="%::algorithms" type="choice" template="true">
+-			<section name="Interpolations2D" />
+-			<option value="STD_PRESS" type="choice">
+-				<help>Generate a standard atmosphere pressure as a function of the cell's elevation</help>
+-			</option>
+-			<option value="CST" type="choice">
+-				<help>Fill the grid with the average over all the stations</help>
+-			</option>
+-			<option value="CST_LAPSE" type="choice">
+-			  <parameter key="%::cst_lapse" type="combination">
+-			    <option label="Lapse Rate:" value="0.008" type="decimal" optional="false" />
+-			    <option value="" type="dropdown">
+-			      <option value="" type="string" />
+-			      <option value="soft" type="string" />
+-			      <option value="frac" type="string" />
+-			    </option>
+-			  </parameter>
+-			  <help>Detrend the measured data, fill the grid with the average over all the stations, reapply the elevation trend</help>
+-			</option>
+-			<option value="IDW" type="choice">
+-				<help>Inverse Distance Weighted average</help>
+-			</option>
+-			<option value="IDW_LAPSE" type="choice">
+-			  <parameter key="%::idw_lapse" type="combination">
+-			    <option label="Lapse Rate:" value="0.008" type="decimal" optional="false" />
+-			    <option value="" type="dropdown">
+-			      <option value="" type="string" />
+-			      <option value="soft" type="string" />
+-			      <option value="frac" type="string" />
+-			    </option>
+-			  </parameter>
+-			  <help>Detrend the measured data, apply Inverse Distance Weighted average, reapply elevation trend</help>
+-			</option>
+-			<option value="LIDW_LAPSE" type="choice">
+-			  <parameter key="%::lidw_lapse" type="combination">
+-			    <option label="Lapse Rate:" value="0.008" type="decimal" optional="false" />
+-			    <option value="" type="dropdown">
+-			      <option value="" type="string" />
+-			      <option value="soft" type="string" />
+-			      <option value="frac" type="string" />
+-			    </option>
+-			  </parameter>
+-			  <help>Same as IDW_LAPSE, but only considering a given number of neighboring stations</help>
+-			</option>
+-			<option value="RH" type="choice">
+-				<help>Computes the dew point temperature, distribute it with IDW_LAPSE, recompute RH at each pixel</help>
+-			</option>
+-			<option value="ILWR" type="choice">
+-				<help>Compute emissivity, distribute it with IDW_LAPSE, recompute ILWR at each pixel</help>
+-			</option>
+-			<option value="WIND_CURV" type="choice">
+-				<help>Distribute wind velocity with IDW_LAPSE, then apply correction factors as a function of local slope and curvature</help>
+-			</option>
+-			<option value="HNW_SNOW" type="choice">
+-				<parameter key="%::hnw_snow" type="combination">
+-				<option value="IDW_LAPSE" type="dropdown">
+-					<option value="CST" type="string" />
+-					<option value="CST_LAPSE" type="string" />
+-					<option value="IDW" type="string" />
+-					<option value="IDW_LAPSE" type="string" />
+-					<option value="ODKRIG" type="string" />
+-				</option>
+-				<help>Base algorithm (do not forget to add the options for the base algorithm)</help>
+-				</parameter>
+-				<help>Distribute precipitation with a base algorithm (IDW_LAPSE by default), then reduce/remove precipitation on
+-				steep slopes and correct with the local curvature. This is to simulate snow redistribution processes.</help>
+-			</option>
+-			<option value="USER" type="choice">
+-			  <parameter key="%::user" type="path" optional="false"/>
+-			  <help>User provided grids, named as {numeric date}_{capitalized meteo parameter}.asc</help>
+-			</option>
+-			<option value="ODKRIG" type="choice">
+-			  <parameter key="%::odkrig" type="combination">
+-			  	<option value="" type="dropdown">
+-					<option value="LINVARIO" type="string" />
+-					<option value="EXPVARIO" type="string" />
+-					<option value="SPHERICVARIO" type="string" />
+-					<option value="RATQUADVARIO" type="string" />
+-				</option>
+-				<help>Variogram model</help>
+-			  </parameter>
+-			  <help>Ordinary kriging (EXPERIMENTAL)</help>
+-			</option>
+-		</parameter>
+-
+-		<reference name="METEOIOPARAMETERS" />
+-	</parameter>
+-</inishell_config>
+\ No newline at end of file
+Index: ../trunk-jpl/src/java/COPYING
+===================================================================
+--- ../trunk-jpl/src/java/COPYING	(revision 18297)
++++ ../trunk-jpl/src/java/COPYING	(revision 18298)
+@@ -1,674 +0,0 @@
+-                    GNU GENERAL PUBLIC LICENSE
+-                       Version 3, 29 June 2007
+-
+- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+- Everyone is permitted to copy and distribute verbatim copies
+- of this license document, but changing it is not allowed.
+-
+-                            Preamble
+-
+-  The GNU General Public License is a free, copyleft license for
+-software and other kinds of works.
+-
+-  The licenses for most software and other practical works are designed
+-to take away your freedom to share and change the works.  By contrast,
+-the GNU General Public License is intended to guarantee your freedom to
+-share and change all versions of a program--to make sure it remains free
+-software for all its users.  We, the Free Software Foundation, use the
+-GNU General Public License for most of our software; it applies also to
+-any other work released this way by its authors.  You can apply it to
+-your programs, too.
+-
+-  When we speak of free software, we are referring to freedom, not
+-price.  Our General Public Licenses are designed to make sure that you
+-have the freedom to distribute copies of free software (and charge for
+-them if you wish), that you receive source code or can get it if you
+-want it, that you can change the software or use pieces of it in new
+-free programs, and that you know you can do these things.
+-
+-  To protect your rights, we need to prevent others from denying you
+-these rights or asking you to surrender the rights.  Therefore, you have
+-certain responsibilities if you distribute copies of the software, or if
+-you modify it: responsibilities to respect the freedom of others.
+-
+-  For example, if you distribute copies of such a program, whether
+-gratis or for a fee, you must pass on to the recipients the same
+-freedoms that you received.  You must make sure that they, too, receive
+-or can get the source code.  And you must show them these terms so they
+-know their rights.
+-
+-  Developers that use the GNU GPL protect your rights with two steps:
+-(1) assert copyright on the software, and (2) offer you this License
+-giving you legal permission to copy, distribute and/or modify it.
+-
+-  For the developers' and authors' protection, the GPL clearly explains
+-that there is no warranty for this free software.  For both users' and
+-authors' sake, the GPL requires that modified versions be marked as
+-changed, so that their problems will not be attributed erroneously to
+-authors of previous versions.
+-
+-  Some devices are designed to deny users access to install or run
+-modified versions of the software inside them, although the manufacturer
+-can do so.  This is fundamentally incompatible with the aim of
+-protecting users' freedom to change the software.  The systematic
+-pattern of such abuse occurs in the area of products for individuals to
+-use, which is precisely where it is most unacceptable.  Therefore, we
+-have designed this version of the GPL to prohibit the practice for those
+-products.  If such problems arise substantially in other domains, we
+-stand ready to extend this provision to those domains in future versions
+-of the GPL, as needed to protect the freedom of users.
+-
+-  Finally, every program is threatened constantly by software patents.
+-States should not allow patents to restrict development and use of
+-software on general-purpose computers, but in those that do, we wish to
+-avoid the special danger that patents applied to a free program could
+-make it effectively proprietary.  To prevent this, the GPL assures that
+-patents cannot be used to render the program non-free.
+-
+-  The precise terms and conditions for copying, distribution and
+-modification follow.
+-
+-                       TERMS AND CONDITIONS
+-
+-  0. Definitions.
+-
+-  "This License" refers to version 3 of the GNU General Public License.
+-
+-  "Copyright" also means copyright-like laws that apply to other kinds of
+-works, such as semiconductor masks.
+-
+-  "The Program" refers to any copyrightable work licensed under this
+-License.  Each licensee is addressed as "you".  "Licensees" and
+-"recipients" may be individuals or organizations.
+-
+-  To "modify" a work means to copy from or adapt all or part of the work
+-in a fashion requiring copyright permission, other than the making of an
+-exact copy.  The resulting work is called a "modified version" of the
+-earlier work or a work "based on" the earlier work.
+-
+-  A "covered work" means either the unmodified Program or a work based
+-on the Program.
+-
+-  To "propagate" a work means to do anything with it that, without
+-permission, would make you directly or secondarily liable for
+-infringement under applicable copyright law, except executing it on a
+-computer or modifying a private copy.  Propagation includes copying,
+-distribution (with or without modification), making available to the
+-public, and in some countries other activities as well.
+-
+-  To "convey" a work means any kind of propagation that enables other
+-parties to make or receive copies.  Mere interaction with a user through
+-a computer network, with no transfer of a copy, is not conveying.
+-
+-  An interactive user interface displays "Appropriate Legal Notices"
+-to the extent that it includes a convenient and prominently visible
+-feature that (1) displays an appropriate copyright notice, and (2)
+-tells the user that there is no warranty for the work (except to the
+-extent that warranties are provided), that licensees may convey the
+-work under this License, and how to view a copy of this License.  If
+-the interface presents a list of user commands or options, such as a
+-menu, a prominent item in the list meets this criterion.
+-
+-  1. Source Code.
+-
+-  The "source code" for a work means the preferred form of the work
+-for making modifications to it.  "Object code" means any non-source
+-form of a work.
+-
+-  A "Standard Interface" means an interface that either is an official
+-standard defined by a recognized standards body, or, in the case of
+-interfaces specified for a particular programming language, one that
+-is widely used among developers working in that language.
+-
+-  The "System Libraries" of an executable work include anything, other
+-than the work as a whole, that (a) is included in the normal form of
+-packaging a Major Component, but which is not part of that Major
+-Component, and (b) serves only to enable use of the work with that
+-Major Component, or to implement a Standard Interface for which an
+-implementation is available to the public in source code form.  A
+-"Major Component", in this context, means a major essential component
+-(kernel, window system, and so on) of the specific operating system
+-(if any) on which the executable work runs, or a compiler used to
+-produce the work, or an object code interpreter used to run it.
+-
+-  The "Corresponding Source" for a work in object code form means all
+-the source code needed to generate, install, and (for an executable
+-work) run the object code and to modify the work, including scripts to
+-control those activities.  However, it does not include the work's
+-System Libraries, or general-purpose tools or generally available free
+-programs which are used unmodified in performing those activities but
+-which are not part of the work.  For example, Corresponding Source
+-includes interface definition files associated with source files for
+-the work, and the source code for shared libraries and dynamically
+-linked subprograms that the work is specifically designed to require,
+-such as by intimate data communication or control flow between those
+-subprograms and other parts of the work.
+-
+-  The Corresponding Source need not include anything that users
+-can regenerate automatically from other parts of the Corresponding
+-Source.
+-
+-  The Corresponding Source for a work in source code form is that
+-same work.
+-
+-  2. Basic Permissions.
+-
+-  All rights granted under this License are granted for the term of
+-copyright on the Program, and are irrevocable provided the stated
+-conditions are met.  This License explicitly affirms your unlimited
+-permission to run the unmodified Program.  The output from running a
+-covered work is covered by this License only if the output, given its
+-content, constitutes a covered work.  This License acknowledges your
+-rights of fair use or other equivalent, as provided by copyright law.
+-
+-  You may make, run and propagate covered works that you do not
+-convey, without conditions so long as your license otherwise remains
+-in force.  You may convey covered works to others for the sole purpose
+-of having them make modifications exclusively for you, or provide you
+-with facilities for running those works, provided that you comply with
+-the terms of this License in conveying all material for which you do
+-not control copyright.  Those thus making or running the covered works
+-for you must do so exclusively on your behalf, under your direction
+-and control, on terms that prohibit them from making any copies of
+-your copyrighted material outside their relationship with you.
+-
+-  Conveying under any other circumstances is permitted solely under
+-the conditions stated below.  Sublicensing is not allowed; section 10
+-makes it unnecessary.
+-
+-  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+-
+-  No covered work shall be deemed part of an effective technological
+-measure under any applicable law fulfilling obligations under article
+-11 of the WIPO copyright treaty adopted on 20 December 1996, or
+-similar laws prohibiting or restricting circumvention of such
+-measures.
+-
+-  When you convey a covered work, you waive any legal power to forbid
+-circumvention of technological measures to the extent such circumvention
+-is effected by exercising rights under this License with respect to
+-the covered work, and you disclaim any intention to limit operation or
+-modification of the work as a means of enforcing, against the work's
+-users, your or third parties' legal rights to forbid circumvention of
+-technological measures.
+-
+-  4. Conveying Verbatim Copies.
+-
+-  You may convey verbatim copies of the Program's source code as you
+-receive it, in any medium, provided that you conspicuously and
+-appropriately publish on each copy an appropriate copyright notice;
+-keep intact all notices stating that this License and any
+-non-permissive terms added in accord with section 7 apply to the code;
+-keep intact all notices of the absence of any warranty; and give all
+-recipients a copy of this License along with the Program.
+-
+-  You may charge any price or no price for each copy that you convey,
+-and you may offer support or warranty protection for a fee.
+-
+-  5. Conveying Modified Source Versions.
+-
+-  You may convey a work based on the Program, or the modifications to
+-produce it from the Program, in the form of source code under the
+-terms of section 4, provided that you also meet all of these conditions:
+-
+-    a) The work must carry prominent notices stating that you modified
+-    it, and giving a relevant date.
+-
+-    b) The work must carry prominent notices stating that it is
+-    released under this License and any conditions added under section
+-    7.  This requirement modifies the requirement in section 4 to
+-    "keep intact all notices".
+-
+-    c) You must license the entire work, as a whole, under this
+-    License to anyone who comes into possession of a copy.  This
+-    License will therefore apply, along with any applicable section 7
+-    additional terms, to the whole of the work, and all its parts,
+-    regardless of how they are packaged.  This License gives no
+-    permission to license the work in any other way, but it does not
+-    invalidate such permission if you have separately received it.
+-
+-    d) If the work has interactive user interfaces, each must display
+-    Appropriate Legal Notices; however, if the Program has interactive
+-    interfaces that do not display Appropriate Legal Notices, your
+-    work need not make them do so.
+-
+-  A compilation of a covered work with other separate and independent
+-works, which are not by their nature extensions of the covered work,
+-and which are not combined with it such as to form a larger program,
+-in or on a volume of a storage or distribution medium, is called an
+-"aggregate" if the compilation and its resulting copyright are not
+-used to limit the access or legal rights of the compilation's users
+-beyond what the individual works permit.  Inclusion of a covered work
+-in an aggregate does not cause this License to apply to the other
+-parts of the aggregate.
+-
+-  6. Conveying Non-Source Forms.
+-
+-  You may convey a covered work in object code form under the terms
+-of sections 4 and 5, provided that you also convey the
+-machine-readable Corresponding Source under the terms of this License,
+-in one of these ways:
+-
+-    a) Convey the object code in, or embodied in, a physical product
+-    (including a physical distribution medium), accompanied by the
+-    Corresponding Source fixed on a durable physical medium
+-    customarily used for software interchange.
+-
+-    b) Convey the object code in, or embodied in, a physical product
+-    (including a physical distribution medium), accompanied by a
+-    written offer, valid for at least three years and valid for as
+-    long as you offer spare parts or customer support for that product
+-    model, to give anyone who possesses the object code either (1) a
+-    copy of the Corresponding Source for all the software in the
+-    product that is covered by this License, on a durable physical
+-    medium customarily used for software interchange, for a price no
+-    more than your reasonable cost of physically performing this
+-    conveying of source, or (2) access to copy the
+-    Corresponding Source from a network server at no charge.
+-
+-    c) Convey individual copies of the object code with a copy of the
+-    written offer to provide the Corresponding Source.  This
+-    alternative is allowed only occasionally and noncommercially, and
+-    only if you received the object code with such an offer, in accord
+-    with subsection 6b.
+-
+-    d) Convey the object code by offering access from a designated
+-    place (gratis or for a charge), and offer equivalent access to the
+-    Corresponding Source in the same way through the same place at no
+-    further charge.  You need not require recipients to copy the
+-    Corresponding Source along with the object code.  If the place to
+-    copy the object code is a network server, the Corresponding Source
+-    may be on a different server (operated by you or a third party)
+-    that supports equivalent copying facilities, provided you maintain
+-    clear directions next to the object code saying where to find the
+-    Corresponding Source.  Regardless of what server hosts the
+-    Corresponding Source, you remain obligated to ensure that it is
+-    available for as long as needed to satisfy these requirements.
+-
+-    e) Convey the object code using peer-to-peer transmission, provided
+-    you inform other peers where the object code and Corresponding
+-    Source of the work are being offered to the general public at no
+-    charge under subsection 6d.
+-
+-  A separable portion of the object code, whose source code is excluded
+-from the Corresponding Source as a System Library, need not be
+-included in conveying the object code work.
+-
+-  A "User Product" is either (1) a "consumer product", which means any
+-tangible personal property which is normally used for personal, family,
+-or household purposes, or (2) anything designed or sold for incorporation
+-into a dwelling.  In determining whether a product is a consumer product,
+-doubtful cases shall be resolved in favor of coverage.  For a particular
+-product received by a particular user, "normally used" refers to a
+-typical or common use of that class of product, regardless of the status
+-of the particular user or of the way in which the particular user
+-actually uses, or expects or is expected to use, the product.  A product
+-is a consumer product regardless of whether the product has substantial
+-commercial, industrial or non-consumer uses, unless such uses represent
+-the only significant mode of use of the product.
+-
+-  "Installation Information" for a User Product means any methods,
+-procedures, authorization keys, or other information required to install
+-and execute modified versions of a covered work in that User Product from
+-a modified version of its Corresponding Source.  The information must
+-suffice to ensure that the continued functioning of the modified object
+-code is in no case prevented or interfered with solely because
+-modification has been made.
+-
+-  If you convey an object code work under this section in, or with, or
+-specifically for use in, a User Product, and the conveying occurs as
+-part of a transaction in which the right of possession and use of the
+-User Product is transferred to the recipient in perpetuity or for a
+-fixed term (regardless of how the transaction is characterized), the
+-Corresponding Source conveyed under this section must be accompanied
+-by the Installation Information.  But this requirement does not apply
+-if neither you nor any third party retains the ability to install
+-modified object code on the User Product (for example, the work has
+-been installed in ROM).
+-
+-  The requirement to provide Installation Information does not include a
+-requirement to continue to provide support service, warranty, or updates
+-for a work that has been modified or installed by the recipient, or for
+-the User Product in which it has been modified or installed.  Access to a
+-network may be denied when the modification itself materially and
+-adversely affects the operation of the network or violates the rules and
+-protocols for communication across the network.
+-
+-  Corresponding Source conveyed, and Installation Information provided,
+-in accord with this section must be in a format that is publicly
+-documented (and with an implementation available to the public in
+-source code form), and must require no special password or key for
+-unpacking, reading or copying.
+-
+-  7. Additional Terms.
+-
+-  "Additional permissions" are terms that supplement the terms of this
+-License by making exceptions from one or more of its conditions.
+-Additional permissions that are applicable to the entire Program shall
+-be treated as though they were included in this License, to the extent
+-that they are valid under applicable law.  If additional permissions
+-apply only to part of the Program, that part may be used separately
+-under those permissions, but the entire Program remains governed by
+-this License without regard to the additional permissions.
+-
+-  When you convey a copy of a covered work, you may at your option
+-remove any additional permissions from that copy, or from any part of
+-it.  (Additional permissions may be written to require their own
+-removal in certain cases when you modify the work.)  You may place
+-additional permissions on material, added by you to a covered work,
+-for which you have or can give appropriate copyright permission.
+-
+-  Notwithstanding any other provision of this License, for material you
+-add to a covered work, you may (if authorized by the copyright holders of
+-that material) supplement the terms of this License with terms:
+-
+-    a) Disclaiming warranty or limiting liability differently from the
+-    terms of sections 15 and 16 of this License; or
+-
+-    b) Requiring preservation of specified reasonable legal notices or
+-    author attributions in that material or in the Appropriate Legal
+-    Notices displayed by works containing it; or
+-
+-    c) Prohibiting misrepresentation of the origin of that material, or
+-    requiring that modified versions of such material be marked in
+-    reasonable ways as different from the original version; or
+-
+-    d) Limiting the use for publicity purposes of names of licensors or
+-    authors of the material; or
+-
+-    e) Declining to grant rights under trademark law for use of some
+-    trade names, trademarks, or service marks; or
+-
+-    f) Requiring indemnification of licensors and authors of that
+-    material by anyone who conveys the material (or modified versions of
+-    it) with contractual assumptions of liability to the recipient, for
+-    any liability that these contractual assumptions directly impose on
+-    those licensors and authors.
+-
+-  All other non-permissive additional terms are considered "further
+-restrictions" within the meaning of section 10.  If the Program as you
+-received it, or any part of it, contains a notice stating that it is
+-governed by this License along with a term that is a further
+-restriction, you may remove that term.  If a license document contains
+-a further restriction but permits relicensing or conveying under this
+-License, you may add to a covered work material governed by the terms
+-of that license document, provided that the further restriction does
+-not survive such relicensing or conveying.
+-
+-  If you add terms to a covered work in accord with this section, you
+-must place, in the relevant source files, a statement of the
+-additional terms that apply to those files, or a notice indicating
+-where to find the applicable terms.
+-
+-  Additional terms, permissive or non-permissive, may be stated in the
+-form of a separately written license, or stated as exceptions;
+-the above requirements apply either way.
+-
+-  8. Termination.
+-
+-  You may not propagate or modify a covered work except as expressly
+-provided under this License.  Any attempt otherwise to propagate or
+-modify it is void, and will automatically terminate your rights under
+-this License (including any patent licenses granted under the third
+-paragraph of section 11).
+-
+-  However, if you cease all violation of this License, then your
+-license from a particular copyright holder is reinstated (a)
+-provisionally, unless and until the copyright holder explicitly and
+-finally terminates your license, and (b) permanently, if the copyright
+-holder fails to notify you of the violation by some reasonable means
+-prior to 60 days after the cessation.
+-
+-  Moreover, your license from a particular copyright holder is
+-reinstated permanently if the copyright holder notifies you of the
+-violation by some reasonable means, this is the first time you have
+-received notice of violation of this License (for any work) from that
+-copyright holder, and you cure the violation prior to 30 days after
+-your receipt of the notice.
+-
+-  Termination of your rights under this section does not terminate the
+-licenses of parties who have received copies or rights from you under
+-this License.  If your rights have been terminated and not permanently
+-reinstated, you do not qualify to receive new licenses for the same
+-material under section 10.
+-
+-  9. Acceptance Not Required for Having Copies.
+-
+-  You are not required to accept this License in order to receive or
+-run a copy of the Program.  Ancillary propagation of a covered work
+-occurring solely as a consequence of using peer-to-peer transmission
+-to receive a copy likewise does not require acceptance.  However,
+-nothing other than this License grants you permission to propagate or
+-modify any covered work.  These actions infringe copyright if you do
+-not accept this License.  Therefore, by modifying or propagating a
+-covered work, you indicate your acceptance of this License to do so.
+-
+-  10. Automatic Licensing of Downstream Recipients.
+-
+-  Each time you convey a covered work, the recipient automatically
+-receives a license from the original licensors, to run, modify and
+-propagate that work, subject to this License.  You are not responsible
+-for enforcing compliance by third parties with this License.
+-
+-  An "entity transaction" is a transaction transferring control of an
+-organization, or substantially all assets of one, or subdividing an
+-organization, or merging organizations.  If propagation of a covered
+-work results from an entity transaction, each party to that
+-transaction who receives a copy of the work also receives whatever
+-licenses to the work the party's predecessor in interest had or could
+-give under the previous paragraph, plus a right to possession of the
+-Corresponding Source of the work from the predecessor in interest, if
+-the predecessor has it or can get it with reasonable efforts.
+-
+-  You may not impose any further restrictions on the exercise of the
+-rights granted or affirmed under this License.  For example, you may
+-not impose a license fee, royalty, or other charge for exercise of
+-rights granted under this License, and you may not initiate litigation
+-(including a cross-claim or counterclaim in a lawsuit) alleging that
+-any patent claim is infringed by making, using, selling, offering for
+-sale, or importing the Program or any portion of it.
+-
+-  11. Patents.
+-
+-  A "contributor" is a copyright holder who authorizes use under this
+-License of the Program or a work on which the Program is based.  The
+-work thus licensed is called the contributor's "contributor version".
+-
+-  A contributor's "essential patent claims" are all patent claims
+-owned or controlled by the contributor, whether already acquired or
+-hereafter acquired, that would be infringed by some manner, permitted
+-by this License, of making, using, or selling its contributor version,
+-but do not include claims that would be infringed only as a
+-consequence of further modification of the contributor version.  For
+-purposes of this definition, "control" includes the right to grant
+-patent sublicenses in a manner consistent with the requirements of
+-this License.
+-
+-  Each contributor grants you a non-exclusive, worldwide, royalty-free
+-patent license under the contributor's essential patent claims, to
+-make, use, sell, offer for sale, import and otherwise run, modify and
+-propagate the contents of its contributor version.
+-
+-  In the following three paragraphs, a "patent license" is any express
+-agreement or commitment, however denominated, not to enforce a patent
+-(such as an express permission to practice a patent or covenant not to
+-sue for patent infringement).  To "grant" such a patent license to a
+-party means to make such an agreement or commitment not to enforce a
+-patent against the party.
+-
+-  If you convey a covered work, knowingly relying on a patent license,
+-and the Corresponding Source of the work is not available for anyone
+-to copy, free of charge and under the terms of this License, through a
+-publicly available network server or other readily accessible means,
+-then you must either (1) cause the Corresponding Source to be so
+-available, or (2) arrange to deprive yourself of the benefit of the
+-patent license for this particular work, or (3) arrange, in a manner
+-consistent with the requirements of this License, to extend the patent
+-license to downstream recipients.  "Knowingly relying" means you have
+-actual knowledge that, but for the patent license, your conveying the
+-covered work in a country, or your recipient's use of the covered work
+-in a country, would infringe one or more identifiable patents in that
+-country that you have reason to believe are valid.
+-
+-  If, pursuant to or in connection with a single transaction or
+-arrangement, you convey, or propagate by procuring conveyance of, a
+-covered work, and grant a patent license to some of the parties
+-receiving the covered work authorizing them to use, propagate, modify
+-or convey a specific copy of the covered work, then the patent license
+-you grant is automatically extended to all recipients of the covered
+-work and works based on it.
+-
+-  A patent license is "discriminatory" if it does not include within
+-the scope of its coverage, prohibits the exercise of, or is
+-conditioned on the non-exercise of one or more of the rights that are
+-specifically granted under this License.  You may not convey a covered
+-work if you are a party to an arrangement with a third party that is
+-in the business of distributing software, under which you make payment
+-to the third party based on the extent of your activity of conveying
+-the work, and under which the third party grants, to any of the
+-parties who would receive the covered work from you, a discriminatory
+-patent license (a) in connection with copies of the covered work
+-conveyed by you (or copies made from those copies), or (b) primarily
+-for and in connection with specific products or compilations that
+-contain the covered work, unless you entered into that arrangement,
+-or that patent license was granted, prior to 28 March 2007.
+-
+-  Nothing in this License shall be construed as excluding or limiting
+-any implied license or other defenses to infringement that may
+-otherwise be available to you under applicable patent law.
+-
+-  12. No Surrender of Others' Freedom.
+-
+-  If conditions are imposed on you (whether by court order, agreement or
+-otherwise) that contradict the conditions of this License, they do not
+-excuse you from the conditions of this License.  If you cannot convey a
+-covered work so as to satisfy simultaneously your obligations under this
+-License and any other pertinent obligations, then as a consequence you may
+-not convey it at all.  For example, if you agree to terms that obligate you
+-to collect a royalty for further conveying from those to whom you convey
+-the Program, the only way you could satisfy both those terms and this
+-License would be to refrain entirely from conveying the Program.
+-
+-  13. Use with the GNU Affero General Public License.
+-
+-  Notwithstanding any other provision of this License, you have
+-permission to link or combine any covered work with a work licensed
+-under version 3 of the GNU Affero General Public License into a single
+-combined work, and to convey the resulting work.  The terms of this
+-License will continue to apply to the part which is the covered work,
+-but the special requirements of the GNU Affero General Public License,
+-section 13, concerning interaction through a network will apply to the
+-combination as such.
+-
+-  14. Revised Versions of this License.
+-
+-  The Free Software Foundation may publish revised and/or new versions of
+-the GNU General Public License from time to time.  Such new versions will
+-be similar in spirit to the present version, but may differ in detail to
+-address new problems or concerns.
+-
+-  Each version is given a distinguishing version number.  If the
+-Program specifies that a certain numbered version of the GNU General
+-Public License "or any later version" applies to it, you have the
+-option of following the terms and conditions either of that numbered
+-version or of any later version published by the Free Software
+-Foundation.  If the Program does not specify a version number of the
+-GNU General Public License, you may choose any version ever published
+-by the Free Software Foundation.
+-
+-  If the Program specifies that a proxy can decide which future
+-versions of the GNU General Public License can be used, that proxy's
+-public statement of acceptance of a version permanently authorizes you
+-to choose that version for the Program.
+-
+-  Later license versions may give you additional or different
+-permissions.  However, no additional obligations are imposed on any
+-author or copyright holder as a result of your choosing to follow a
+-later version.
+-
+-  15. Disclaimer of Warranty.
+-
+-  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+-APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+-IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+-
+-  16. Limitation of Liability.
+-
+-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+-SUCH DAMAGES.
+-
+-  17. Interpretation of Sections 15 and 16.
+-
+-  If the disclaimer of warranty and limitation of liability provided
+-above cannot be given local legal effect according to their terms,
+-reviewing courts shall apply local law that most closely approximates
+-an absolute waiver of all civil liability in connection with the
+-Program, unless a warranty or assumption of liability accompanies a
+-copy of the Program in return for a fee.
+-
+-                     END OF TERMS AND CONDITIONS
+-
+-            How to Apply These Terms to Your New Programs
+-
+-  If you develop a new program, and you want it to be of the greatest
+-possible use to the public, the best way to achieve this is to make it
+-free software which everyone can redistribute and change under these terms.
+-
+-  To do so, attach the following notices to the program.  It is safest
+-to attach them to the start of each source file to most effectively
+-state the exclusion of warranty; and each file should have at least
+-the "copyright" line and a pointer to where the full notice is found.
+-
+-    <one line to give the program's name and a brief idea of what it does.>
+-    Copyright (C) <year>  <name of author>
+-
+-    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 3 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, see <http://www.gnu.org/licenses/>.
+-
+-Also add information on how to contact you by electronic and paper mail.
+-
+-  If the program does terminal interaction, make it output a short
+-notice like this when it starts in an interactive mode:
+-
+-    <program>  Copyright (C) <year>  <name of author>
+-    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+-    This is free software, and you are welcome to redistribute it
+-    under certain conditions; type `show c' for details.
+-
+-The hypothetical commands `show w' and `show c' should show the appropriate
+-parts of the General Public License.  Of course, your program's commands
+-might be different; for a GUI interface, you would use an "about box".
+-
+-  You should also get your employer (if you work as a programmer) or school,
+-if any, to sign a "copyright disclaimer" for the program, if necessary.
+-For more information on this, and how to apply and follow the GNU GPL, see
+-<http://www.gnu.org/licenses/>.
+-
+-  The GNU General Public License does not permit incorporating your program
+-into proprietary programs.  If your program is a subroutine library, you
+-may consider it more useful to permit linking proprietary applications with
+-the library.  If this is what you want to do, use the GNU Lesser General
+-Public License instead of this License.  But first, please read
+-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+Index: ../trunk-jpl/src/java/build.xml
+===================================================================
+--- ../trunk-jpl/src/java/build.xml	(revision 18297)
++++ ../trunk-jpl/src/java/build.xml	(revision 18298)
+@@ -1,126 +0,0 @@
+-<project name="inishell" default="help" basedir=".">
+-	<description>
+-	Build and run the inishell Application from the command line.
+-	</description>
+-
+-
+-	<!-- set global properties for the build -->
+-	<property name="src" location="src"/>
+-	<property name="examples" location="doc/examples"/>
+-	<property name="build" location="build"/>
+-	<property name="dist"  location="dist"/>
+-	<property name="lib.dir" location="lib"/>
+-	<tstamp prefix="build-info">
+-		<format property="date" pattern="yyyy-MM-dd" locale="en" />
+-		<format property="time" pattern="HH:mm:ss" locale="en" />
+-		<format property="num-date" pattern="yyyyMMdd" locale="en" />
+-	</tstamp>
+-	<property name="version.num" value="1.0.0" />
+-	<!--<buildnumber file="dist/build.num"/>-->
+-	<!--<property name="version-number" value="${version.num}-${build.number}" />-->
+-	<property name="version-number" value="${version.num}" />
+-	<property name="version-full" value="${version.num}-${build-info.num-date}" />
+-
+-	<path id="classpath">
+-		<fileset dir="${lib.dir}" includes="**/*.jar"/>
+-	</path>
+-
+-
+-	<!-- targets -->
+-	<target name="help">
+-		<echo>You can use the following targets:</echo>
+-		<echo> </echo>
+-		<echo>  help     : (default) Prints this message </echo>
+-		<echo>  init     : create necessary directories</echo>
+-		<echo>  clean    : Deletes work directories</echo>
+-		<echo>  compile  : Compiles into class files</echo>
+-		<echo>  dist     : pack all necessary files into a JAR file</echo>
+-		<echo>  issm 	 : create inishell GUI using issm.xml</echo>
+-		<echo>  snowpack : dist tailored for snowpack</echo>
+-		<echo>  meteoio  : dist tailored for meteoio</echo>
+-		<echo>  run      : run the previously compiled version</echo>
+-		<echo>  pack     : pack all in a zip file for a release</echo>
+-		<echo></echo>
+-	</target>
+-
+-	<target name="init">
+-		<mkdir dir="${build}"/>
+-		<mkdir dir="${dist}"/>
+-	</target>
+-
+-	<target name="snowpack" depends="init" description="Make doc/examples/snowpack_config.xml the default XML config">
+-		<copy file="${examples}/snowpack_config.xml" tofile="${build}/resources/default_config.xml" overwrite="true"/>
+-		<antcall target="dist"/>
+-	</target>
+-
+-	<target name="meteoio" depends="init" description="Make doc/examples/meteoio_config.xml the default XML config">
+-		<copy file="${examples}/meteoio_config.xml" tofile="${build}/resources/default_config.xml" overwrite="true"/>
+-		<antcall target="dist"/>
+-	</target>
+-	
+-	<target name="issm" depends="init" description="Make doc/examples/issm.xml the default XML config">
+-		<copy file="./doc/examples/issm.xml" tofile="${build}/resources/default_config.xml" overwrite="true"/>
+-		<antcall target="dist"/>
+-	</target>
+-
+-	<target name="compile" depends="init" description="Compile from ${src} to ${build}">
+-		<javac srcdir="${src}" destdir="${build}" includeantruntime="false">
+-			<classpath>
+-				<fileset dir="lib">
+-				<include name="**/*.jar"/>
+-				</fileset>
+-			</classpath>
+-		</javac>
+-		<copy todir="${build}/resources">
+-		<fileset dir="${src}/resources" includes="**"/>
+-	</copy>
+-	</target>
+-
+-	<target name="dist" depends="compile" description="generate the distribution" >
+-		<!-- Create the distribution directory -->
+-		<delete file="MANIFEST.MF"/>
+-		<manifest file="MANIFEST.MF">
+-			<attribute name="Built-By" value="${user.name}"/>
+-			<attribute name="Built-On" value="${build-info.date}" />
+-			<attribute name="Built-At" value="${build-info.time}" />
+-			<attribute name="Main-Class" value="main/GUIBuilder"/>
+-			<attribute name="Specification-Title" value="INI file generator"/>
+-			<attribute name="Specification-Version" value="${version-full}"/>
+-			<attribute name="Specification-Vendor" value="SLF, www.slf.ch"/>
+-			<attribute name="Implementation-Title" value="INIshell ini creator"/>
+-			<attribute name="Implementation-Version" value="${version-number}"/>
+-			<attribute name="Implementation-Vendor" value="SLF, www.slf.ch"/>
+-		</manifest>
+-
+-		<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
+-		<jar jarfile="${dist}/inishell.jar" basedir="${build}" manifest="MANIFEST.MF" index="true" >
+-			<zipfileset src="${lib.dir}/miglayout-4.0.jar" includes="**/*.class"/>
+-		</jar>
+-	</target>
+-
+-	<target name="run" depends="dist">
+-		<java fork="true" classname="main/GUIBuilder">
+-			<classpath>
+-				<path refid="classpath"/>
+-				<path location="${dist}/inishell.jar"/>
+-			</classpath>
+-		</java>
+-	</target>
+-
+-	<target name="clean" description="clean up" >
+-		<!-- Delete the ${build} and ${dist} directory trees -->
+-		<delete file="MANIFEST.MF"/>
+-		<delete dir="${build}"/>
+-		<delete dir="${dist}"/>
+-	</target>
+-
+-	<target name="pack" depends="dist" description="pack for distribution">
+-		<zip destfile="inishell-${version.num}.zip">
+-			<zipfileset dir="doc/examples" prefix="inishell-${version.num}/doc/examples"/>
+-			<zipfileset dir="dist" prefix="inishell-${version.num}/bin"/>
+-			<zipfileset dir="." includes="inishell.sh" prefix="inishell-${version.num}/bin"/>
+-			<zipfileset dir="." includes="Changelog_${version.num}.txt" prefix="inishell-${version.num}/doc"/>
+-		</zip>
+-	</target>
+-
+-</project>
+Index: ../trunk-jpl/src/java/build/resources/document-open-2.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/resources/document-preview.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/resources/document-export-4.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/resources/config_schema.xsd
+===================================================================
+--- ../trunk-jpl/src/java/build/resources/config_schema.xsd	(revision 18297)
++++ ../trunk-jpl/src/java/build/resources/config_schema.xsd	(revision 18298)
+@@ -1,141 +0,0 @@
+-<?xml version="1.0"?>
+-<!-- 
+-*   
+-*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*    	
+-* -->
+-
+-<xsd:schema version="1.0"
+-xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+-
+-  <xsd:element name="inishell_config" type="general" />
+-  
+-	<xsd:complexType name="general">
+-      <xsd:choice maxOccurs="unbounded">
+-			<xsd:element name="parameter" type="parametertype" />
+-			<xsd:element name="parametergroup" type="pargroup" />
+-			<xsd:element name="include" type="pathonly" /> 
+-      </xsd:choice>
+-	  <xsd:attribute name="application" />
+-    </xsd:complexType>
+-	
+-	<xsd:complexType name="parametertype">
+-		<xsd:complexContent>
+-			<xsd:extension base="parbasetype">
+-				<xsd:attribute name="key" type="xsd:string" use="required"/> 
+-				<xsd:attribute name="default" type="xsd:string" />
+-				<xsd:attribute name="counter" type="xsd:integer" />
+-			</xsd:extension>
+-		</xsd:complexContent>		
+-	</xsd:complexType>
+-   
+-   <xsd:complexType name="nameonly">
+-		<xsd:attribute name="name" />   
+-   </xsd:complexType>
+-   
+-   <xsd:complexType name="pathonly">
+-		<xsd:attribute name="path" />   
+-   </xsd:complexType>
+-   
+-	<xsd:complexType name="pargroup">
+-		<xsd:choice minOccurs="1" maxOccurs="unbounded">
+-			<xsd:element name="parameter" type="parametertype" />
+-			<xsd:element name="reference" type="nameonly" />
+-		</xsd:choice>
+-		<xsd:attribute name="name" />
+-	</xsd:complexType>
+-  
+-	
+-	<xsd:complexType name="parbasetype">
+-		<xsd:sequence>
+-			<xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-				<xsd:element name="section" type="nameonly"/>
+-			</xsd:sequence>
+-			<xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-				<xsd:element name="replace" type="nameonly"/>
+-			</xsd:sequence>
+-			<xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-				<xsd:element name="parameter" type="parametertype" />
+-			</xsd:sequence>
+-			<xsd:choice minOccurs="0" maxOccurs="unbounded">				
+-				<xsd:element name="option" minOccurs="0">
+-					<xsd:complexType>
+-						<xsd:complexContent>
+-							<xsd:extension base="parbasetype">
+-								<xsd:attribute name="value" type="xsd:string" use="required" />
+-								<xsd:attribute name="label" type="xsd:string" use="optional" />
+-								<xsd:attribute name="default" type="xsd:boolean"/>
+-							</xsd:extension>
+-						</xsd:complexContent>
+-					</xsd:complexType>
+-				</xsd:element>
+-			</xsd:choice>
+-			<xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-				<xsd:element name="reference" type="nameonly" />
+-			</xsd:sequence>
+-			<xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-				<xsd:element name="help" type="helptype"/>	
+-			</xsd:sequence>
+-		</xsd:sequence>
+-		
+-		<xsd:attribute name="type" use="required">
+-		     <xsd:simpleType>
+-				<xsd:restriction base="xsd:string">
+-					<xsd:enumeration value="integer" />
+-					<xsd:enumeration value="integer+" />
+-					<xsd:enumeration value="decimal" />
+-					<xsd:enumeration value="path" />
+-					<xsd:enumeration value="file" />
+-					<xsd:enumeration value="choice" />
+-					<xsd:enumeration value="alternative" />
+-					<xsd:enumeration value="string" />
+-					<xsd:enumeration value="combination" />
+-					<xsd:enumeration value="selector" />
+-				</xsd:restriction>
+-			</xsd:simpleType>
+-		</xsd:attribute>
+-		
+-		<xsd:attribute name="maximum" type="xsd:integer"/>
+-		<xsd:attribute name="minimum" type="xsd:integer"/>
+-		<xsd:attribute name="template" type="xsd:boolean" default="false" use="optional" />
+-		<xsd:attribute name="optional" type="xsd:boolean" default="true" />
+-	</xsd:complexType>
+-	
+-	<xsd:complexType name="needstype">
+-		<xsd:attribute name="type" type="xsd:string" use="required" />
+-		<xsd:attribute name="name" type="xsd:string" use="required" />
+-	
+-		<xsd:attribute name="value" />
+-		<xsd:attribute name="optional" type="xsd:boolean" />
+-		<xsd:attribute name="minoccur" type="xsd:integer" />
+-		<xsd:attribute name="maxoccur" type="xsd:string" />
+-	</xsd:complexType>
+-	
+-	<xsd:complexType name="baseType">
+-		<xsd:sequence minOccurs="0" maxOccurs="1">
+-			<xsd:element name="help" type="helptype" />		
+-		</xsd:sequence>
+-		<xsd:attribute name="key" type="xsd:string" use="required" />
+-	</xsd:complexType>
+-	
+-	<xsd:complexType name="helptype" mixed="true">
+-		<xsd:choice minOccurs="0" maxOccurs="unbounded">
+-			<xsd:element name="section" type="nameonly" />
+-			<xsd:element name="replace" type="nameonly" />
+-		</xsd:choice>
+-	</xsd:complexType>
+-	
+-</xsd:schema>
+Index: ../trunk-jpl/src/java/build/resources/default_config.xml
+===================================================================
+--- ../trunk-jpl/src/java/build/resources/default_config.xml	(revision 18297)
++++ ../trunk-jpl/src/java/build/resources/default_config.xml	(revision 18298)
+@@ -1,1284 +0,0 @@
+-<inishell_config application="ISSM prototype">
+-
+-<!-- mesh -->
+-<parameter key ="Dimension" type="alternative" optional="false">
+-     <section name="mesh" />
+-     <option value="0" type="string" default="true">
+-        <help> dimension is 0 </help>
+-     </option>
+-     <option value="3" type="string">
+-        <help> dimension is 3 </help>
+-       <!-- Elements and vertices of the original 2d mesh -->
+-          <parameter key ="x2d" type="double" default="N/A">
+-              <help> vertices x coordinate [m] </help>
+-          </parameter>
+-          <parameter key ="y2d" type="double" default="N/A">
+-              <help> vertices y coordinate [m] </help>
+-          </parameter>
+-          <parameter key ="elements2d" type="double" default="N/A">
+-              <help> vertex indices of the mesh elements </help>
+-          </parameter>
+-          <parameter key ="numberofvertices2d" type="double" default="0">
+-              <help> number of vertices </help>
+-          </parameter>
+-          <parameter key ="numberofelements2d" type="double" default="0">
+-              <help> number of elements </help>
+-          </parameter>
+-     </option>
+-     <help> select a mesh dimension 0(default) or 3 </help>
+-</parameter>
+-<frame key="1" label="Elements and vertices">
+-<section name="mesh" />
+-  <parameter key ="numberofelements" type="double" default="0">
+-     <section name="mesh" />
+-     <help> number of elements </help>
+-  </parameter>
+-  <parameter key ="numberofvertices" type="double" default="0">
+-     <section name="mesh" />
+-     <help> number of verticies </help>
+-  </parameter>
+-  <parameter key ="elements" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> vertex indices of the mesh elements </help>
+-  </parameter>
+-  <parameter key ="x" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> vertices x coordinate [m] </help>
+-  </parameter>
+-  <parameter key ="y" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> vertices y coordinate [m] </help>
+-  </parameter>
+-  <parameter key ="z" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> vertices z coordinate [m] </help>
+-  </parameter>
+-  <parameter key ="edges" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> edges of the 2d mesh (vertex1 vertex2 element1 element2) </help>
+-  </parameter>
+-  <parameter key ="numberofedges" type="double" default="0">
+-     <section name="mesh" />
+-     <help> number of edges of the 2d mesh </help>
+-  </parameter>
+-</frame>
+-<frame key="2" label="Properties">
+-<section name="mesh" />
+-  <parameter key ="selected dimension" type="double" default="0">
+-     <section name="mesh" />
+-     <help> mesh dimension </help>
+-  </parameter>
+-  <parameter key ="numberoflayers" type="double" default="0">
+-     <section name="mesh" />
+-     <help> number of extrusion layers </help>
+-  </parameter>
+-  <parameter key ="vertexonbed" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> lower vertices flags list </help>
+-  </parameter>
+-  <parameter key ="elementonbed" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> lower elements flags list </help>
+-  </parameter>
+-  <parameter key ="vertexonsurface" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> upper vertices flags list </help>
+-  </parameter>
+-  <parameter key ="elementonsurface" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> upper element flag list </help>
+-  </parameter>
+-  <parameter key ="uppervertex" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> upper vertex list (NaN for vertex on the upper surface) </help>
+-  </parameter>
+-  <parameter key ="upperelements" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> upper element list (NaN for element on the upper layer) </help>
+-  </parameter>
+-  <parameter key ="lowervertex" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> lower vertex list (NaN for vertex on the lower surface) </help>
+-  </parameter>
+-  <parameter key ="lowerelements" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> lower element list (NaN for element on the lower layer </help>
+-  </parameter>
+-  <parameter key ="vertexonboundary" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> vertices on the boundary of the domain flag list </help>
+-  </parameter>
+-  <parameter key ="segments" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> edges on domain boundary (vertex1 vertex2 element) </help>
+-  </parameter>
+-  <parameter key ="segmentmarkers" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> number associated to each segment </help>
+-  </parameter>
+-  <parameter key ="vertexconnectivity" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> list of vertices connected to vertex_i </help>
+-  </parameter>
+-  <parameter key ="elementconnectivity" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> list of vertices connected to element_i </help>
+-  </parameter>
+-  <parameter key ="average_vertex_connectivity" type="double" default="25">
+-     <section name="mesh" />
+-     <help> average number of vertices connected to one vertex </help>
+-  </parameter>
+-</frame>
+-<frame key="3" label="Extracted Model">
+-<section name="mesh" />
+-  <parameter key ="extractedvertices" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> vertices extracted from the model </help>
+-  </parameter>
+-  <parameter key ="extractedelements" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> elements extracted from the model </help>
+-  </parameter>
+-</frame>
+-<frame key="4" label="Projection">
+-<section name="mesh" />
+-  <parameter key ="lat" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> vertices latitude [degrees] </help>
+-  </parameter>
+-  <parameter key ="long" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> verticies longitude [degrees] </help>
+-  </parameter>
+-  <parameter key ="hemisphere" type="double" default="N/A">
+-     <section name="mesh" />
+-     <help> Indicate hemisphere 'n' or 's' </help>
+-  </parameter></frame>
+-
+-
+-<!-- mask -->
+-<parameter key ="groundedice_levelset" type="double" default="NaN">
+-     <section name="mask" />
+-     <help> is ice grounded ? grounded ice if > 0, grounding line position if = 0, floating ice if &amp;lt; 0 </help>
+-</parameter>
+-<parameter key ="ice_levelset" type="double" default="NaN">
+-     <section name="mask" />
+-     <help> presence of ice if > 0, icefront position if = 0, no ice if &amp;lt; 0 </help>
+-</parameter>
+-
+-<!-- geometry -->
+-<frame key="1" label="Geometry parameters">
+-<section name="geometry" />
+-<parameter key ="surface" type="path" optional="false">
+-     <section name="geometry" />
+-     <help> surface elevation [m] </help>
+-</parameter>
+-<parameter key ="thickness" type="path" optional="false">
+-     <section name="geometry" />
+-     <help> ice thickness [m] </help>
+-</parameter>
+-<parameter key ="bed" type="path" optional="false">
+-     <section name="geometry" />
+-     <help> bed elevation [m] </help>
+-</parameter>
+-<parameter key ="bathymetry" type="double" default="N/A">
+-     <section name="geometry" />
+-     <help> bathymetry elevation [m] </help>
+-</parameter>
+-<parameter key ="hydrostatic_ratio" type="double" default="N/A">
+-     <section name="geometry" />
+-     <help> coefficient for ice shelves; thickness correction: hydrostatic_ratio H_obs+ (1-hydrostatic_ratio) H_hydro </help>
+-</parameter></frame>
+-
+-
+-<!-- constants -->
+-<parameter key ="g" type="double" default="9.81">
+-     <section name="constants" />
+-     <help> gravitational acceleration [m/s^2] </help>
+-</parameter>
+-<parameter key ="yts" type="double" default="31536000">
+-     <section name="constants" />
+-     <help> number of seconds in a year [s/yr] </help>
+-</parameter>
+-<parameter key ="referencetemperature" type="double" default="223.15">
+-     <section name="constants" />
+-     <help> reference temperature used in the enthalpy model [K] </help>
+-</parameter>
+-
+-<!-- surfaceforcings(SMB) -->
+-<parameter key ="mass_balance" type="double" default="NaN">
+-     <section name="surfaceforcings(SMB)" />
+-     <help> surface mass balance [m/yr ice eq] </help>
+-</parameter>
+-
+-<!-- basalforcings -->
+-<parameter key ="melting_rate" type="double" default="NaN">
+-     <section name="basalforcings" />
+-     <help> basal melting rate (positive if melting) [m/yr] </help>
+-</parameter>
+-<parameter key ="melting_rate_correction" type="double" default="NaN">
+-     <section name="basalforcings" />
+-     <help> additional melting applied to compensate for dh/dt [m/yr] </help>
+-</parameter>
+-<parameter key ="geothermalflux" type="double" default="NaN">
+-     <section name="basalforcings" />
+-     <help> geothermal heat flux [W/m^2] </help>
+-</parameter>
+-
+-<!-- materials -->
+-<parameter key ="rho_ice" type="double" default="917">
+-     <section name="materials" />
+-     <help> ice density [kg/m^3] </help>
+-</parameter>
+-<parameter key ="rho_water" type="double" default="1023">
+-     <section name="materials" />
+-     <help> ocean water density [kg/m^3] </help>
+-</parameter>
+-<parameter key ="rho_freshwater" type="double" default="1000">
+-     <section name="materials" />
+-     <help> fresh water density [kg/m^3] </help>
+-</parameter>
+-<parameter key ="mu_water" type="double" default="0.001787">
+-     <section name="materials" />
+-     <help> water viscosity [N s/m^2] </help>
+-</parameter>
+-<parameter key ="heatcapacity" type="double" default="2093">
+-     <section name="materials" />
+-     <help> heat capacity [J/kg/K] </help>
+-</parameter>
+-<parameter key ="latentheat" type="double" default="334000">
+-     <section name="materials" />
+-     <help> latent heat of fusion [J/kg] </help>
+-</parameter>
+-<parameter key ="thermalconductivity" type="double" default="2.4">
+-     <section name="materials" />
+-     <help> ice thermal conductivity [W/m/K] </help>
+-</parameter>
+-<parameter key ="temperateiceconductivity" type="double" default="0.24">
+-     <section name="materials" />
+-     <help> temperate ice thermal conductivity [W/m/K] </help>
+-</parameter>
+-<parameter key ="meltingpoint" type="double" default="273.15">
+-     <section name="materials" />
+-     <help> melting point of ice at 1atm in K </help>
+-</parameter>
+-<parameter key ="beta" type="double" default="9.8e-08">
+-     <section name="materials" />
+-     <help> rate of change of melting point with pressure [K/Pa] </help>
+-</parameter>
+-<parameter key ="mixed_layer_capacity" type="double" default="3974">
+-     <section name="materials" />
+-     <help> mixed layer capacity [W/kg/K] </help>
+-</parameter>
+-<parameter key ="thermal_exchange_velocity" type="double" default="0.0001">
+-     <section name="materials" />
+-     <help> thermal exchange velocity [m/s] </help>
+-</parameter>
+-<parameter key ="rheology_B" type="double" default="N/A">
+-     <section name="materials" />
+-     <help> flow law parameter [Pa/s^(1/n)] </help>
+-</parameter>
+-<parameter key ="rheology_n" type="double" default="N/A">
+-     <section name="materials" />
+-     <help> Glens flow law exponent </help>
+-</parameter>
+-<parameter key ="rheology_law" type="char" default="'Paterson'">
+-     <section name="materials" />
+-     <help> law for the temperature dependance of the rheology: "None", "Paterson",  "Arrhenius" or "LliboutryDuval" </help>
+-</parameter>
+-<parameter key ="lithosphere_shear_modulus" type="double" default="67000000000">
+-     <section name="materials" />
+-     <help> Lithosphere shear modulus [Pa] </help>
+-</parameter>
+-<parameter key ="lithosphere_density" type="double" default="3.32">
+-     <section name="materials" />
+-     <help> Lithosphere density [g/cm^-3] </help>
+-</parameter>
+-<parameter key ="mantle_shear_modulus" type="double" default="145000000000">
+-     <section name="materials" />
+-     <help> Mantle shear modulus [Pa] </help>
+-</parameter>
+-<parameter key ="mantle_density" type="double" default="3.34">
+-     <section name="materials" />
+-     <help> Mantle density [g/cm^-3] </help>
+-</parameter>
+-
+-
+-<!-- damage -->
+-<!-- Note: this class depends on different input of law -->
+-<parameter key ="law" type="alternative" optional="false">
+-	<section name="damage" />
+-	<option value="undamage" type="string" default="true">
+-		<help> law = undamage </help>
+-	</option>
+-	<option value="pralong" type="string" default="false">
+-		<help> law = pralong </help>
+-		<parameter key ="stress_threshold" type="double" default="0">
+-			<help> damage stress threshold [Pa] </help>
+-		</parameter>
+-		<parameter key ="c1" type="double" default="0">
+-			<help> damage parameter 1 </help>
+-		</parameter>
+-		<parameter key ="c2" type="double" default="0">
+-			<help> damage parameter 2 </help>
+-		</parameter>
+-		<parameter key ="c3" type="double" default="0">
+-			<help> damage parameter 3 [W/m^2] </help>
+-		</parameter>
+-		<parameter key ="c4" type="double" default="0">
+-			<help> damage parameter 4 </help>
+-		</parameter>
+-		<parameter key ="healing" type="double" default="0">
+-			<help> damage healing parameter 1 </help>
+-		</parameter>
+-		<parameter key ="equiv_stress" type="double" default="0">
+-			<help> 0: von Mises </help>
+-		</parameter>
+-		<parameter key ="requested_outputs" type="cell" default="{'default'}">
+-			<help> additional outputs requested </help>
+-		</parameter>
+-	</option>
+-	<help> damage law (string) from {"undamaged","pralong"} </help>
+-</parameter>
+-<parameter key ="D" type="double" default="0">
+-     <section name="damage" />
+-     <help> damage tensor (scalar) </help>
+-</parameter>
+-<parameter key ="law" type="char" default="undamaged">
+-     <section name="damage" />
+-     <help> damage law (string) from {"undamaged","pralong"} </help>
+-</parameter>
+-<parameter key ="spcdamage" type="double" default="NaN">
+-     <section name="damage" />
+-     <help> damage constraints (NaN means no constraint) </help>
+-</parameter>
+-<parameter key ="max_damage" type="double" default="0.99999">
+-     <section name="damage" />
+-     <help> maximum possible damage (0&amp;lt;=max_damage&amp;lt;1) </help>
+-</parameter>
+-<parameter key ="stabilization" type="double" default="2">
+-     <section name="damage" />
+-     <help> 0: no, 1: artificial_diffusivity, 2: SUPG </help>
+-</parameter>
+-<parameter key ="maxiter" type="double" default="100">
+-     <section name="damage" />
+-     <help> maximum number of non linear iterations </help>
+-</parameter>
+-<parameter key ="penalty_lock" type="double" default="0">
+-     <section name="damage" />
+-     <help> stabilize unstable damage constraints that keep zigzagging after n iteration (default is 0, no stabilization) </help>
+-</parameter>
+-<parameter key ="penalty_threshold" type="double" default="0">
+-     <section name="damage" />
+-     <help> threshold to declare convergence of damage evolution solution (default is 0) </help>
+-</parameter>
+-<parameter key ="penalty_factor" type="double" default="3">
+-     <section name="damage" />
+-     <help> scaling exponent (default is 3) </help>
+-</parameter>
+-
+-
+-<!-- Friction: Sigma= drag^2 * Neff ^r * u ^s, with Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p -->
+-<frame key="1" label="Friction: Sigma= drag^2 * Neff ^r * u ^s, with Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p">
+-<section name="friction" />
+-<parameter key ="coefficient" type="double" default="N/A">
+-     <section name="friction" />
+-     <help> friction coefficient [SI] </help>
+-</parameter>
+-<parameter key ="p" type="double" default="N/A">
+-     <section name="friction" />
+-     <help> p exponent </help>
+-</parameter>
+-<parameter key ="q" type="double" default="N/A">
+-     <section name="friction" />
+-     <help> q exponent </help>
+-</parameter></frame>
+-
+-
+-<!-- flowequation -->
+-<frame key="1" label="Flow equation parameters">
+-<section name="flowequation" />
+-<parameter key ="isSIA" type="double" default="0">
+-     <section name="flowequation" />
+-     <help> is the Shallow Ice Approximation (SIA) used ? </help>
+-</parameter>
+-<parameter key ="isSSA" type="double" default="0">
+-     <section name="flowequation" />
+-     <help> is the Shelfy-Stream Approximation (SSA) used ? </help>
+-</parameter>
+-<parameter key ="isL1L2" type="double" default="0">
+-     <section name="flowequation" />
+-     <help> is the L1L2 approximation used ? </help>
+-</parameter>
+-<parameter key ="isHO" type="double" default="0">
+-     <section name="flowequation" />
+-     <help> is the Higher-Order (HO) approximation used ? </help>
+-</parameter>
+-<parameter key ="isFS" type="double" default="0">
+-     <section name="flowequation" />
+-     <help> are the Full-FS (FS) equations used ? </help>
+-</parameter>
+-<parameter key ="fe_SSA" type="char" default="'P1'">
+-     <section name="flowequation" />
+-     <help> Finite Element for SSA  "P1", "P1bubble" "P1bubblecondensed" "P2" </help>
+-</parameter>
+-<parameter key ="fe_HO" type="char" default="'P1'">
+-     <section name="flowequation" />
+-     <help> Finite Element for HO   "P1" "P1bubble" "P1bubblecondensed" "P1xP2" "P2xP1" "P2" </help>
+-</parameter>
+-<parameter key ="fe_FS" type="char" default="'MINIcondensed'">
+-     <section name="flowequation" />
+-     <help> Finite Element for FS   "P1P1" (debugging only) "P1P1GLS" "MINIcondensed" "MINI" "TaylorHood" </help>
+-</parameter>
+-<parameter key ="vertex_equation" type="double" default="N/A">
+-     <section name="flowequation" />
+-     <help> flow equation for each vertex </help>
+-</parameter>
+-<parameter key ="element_equation" type="double" default="N/A">
+-     <section name="flowequation" />
+-     <help> flow equation for each element </help>
+-</parameter>
+-<parameter key ="borderSSA" type="double" default="N/A">
+-     <section name="flowequation" />
+-     <help> vertices on SSAs border (for tiling) </help>
+-</parameter>
+-<parameter key ="borderHO" type="double" default="N/A">
+-     <section name="flowequation" />
+-     <help> vertices on HOs border (for tiling) </help>
+-</parameter>
+-<parameter key ="borderFS" type="double" default="N/A">
+-     <section name="flowequation" />
+-     <help> vertices on FS border (for tiling) </help>
+-</parameter></frame>
+-
+-
+-<!-- Timestepping -->
+-<parameter key ="start_time" type="double" default="0">
+-     <section name="timestepping" />
+-     <help> simulation starting time [yr] </help>
+-</parameter>
+-<parameter key ="final_time" type="double" default="5">
+-     <section name="timestepping" />
+-     <help> final time to stop the simulation [yr] </help>
+-</parameter>
+-<parameter key ="time_step" type="double" default="0.5">
+-     <section name="timestepping" />
+-     <help> length of time steps [yr] </help>
+-</parameter>
+-<parameter key ="time_adapt" type="double" default="0">
+-     <section name="timestepping" />
+-     <help> use cfl condition to define time step ? (0 or 1)  </help>
+-</parameter>
+-<parameter key ="cfl_coefficient" type="double" default="0.5">
+-     <section name="timestepping" />
+-     <help> coefficient applied to cfl condition </help>
+-</parameter>
+-
+-
+-<!-- initialization -->
+-<frame key="1" label="Initial field values">
+-<section name="initialization" />
+-<parameter key ="vx" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> x component of velocity [m/yr] </help>
+-</parameter>
+-<parameter key ="vy" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> y component of velocity [m/yr] </help>
+-</parameter>
+-<parameter key ="vz" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> z component of velocity [m/yr] </help>
+-</parameter>
+-<parameter key ="vel" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> velocity norm [m/yr] </help>
+-</parameter>
+-<parameter key ="pressure" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> pressure field [Pa] </help>
+-</parameter>
+-<parameter key ="temperature" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> fraction of water in the ice </help>
+-</parameter>
+-<parameter key ="waterfraction" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> ice thickness [m] </help>
+-</parameter>
+-<parameter key ="sediment_head" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> sediment water head of subglacial system [m] </help>
+-</parameter>
+-<parameter key ="epl_head" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> epl water head of subglacial system [m] </help>
+-</parameter>
+-<parameter key ="watercolumn" type="double" default="NaN">
+-     <section name="initialization" />
+-     <help> thickness of subglacial water [m] </help>
+-</parameter></frame>
+-
+-
+-<!-- rifts -->
+-<parameter key ="riftstruct" type="double" default="NaN">
+-     <section name="rifts" />
+-     <help> structure containing all rift information (vertices coordinates, segments, type of melange, ...) </help>
+-</parameter>
+-<parameter key ="riftproperties" type="double" default="NaN">
+-     <section name="rifts" />
+-     <help> N/A </help>
+-</parameter>
+-
+-
+-<!-- Debug -->
+-<parameter key ="valgrind" type="logical" optional="false">
+-     <section name="debug" />
+-        <option value="false" type="string" default="true"></option>
+-     <help> use Valgrind to debug (0 or 1) </help>
+-</parameter>
+-<parameter key ="gprof" type="logical" optional="false">
+-     <section name="debug" />
+-        <option value="false" type="string" default="true"></option>
+-     <help> use gnu-profiler to find out where the time is spent </help>
+-</parameter>
+-<parameter key ="profiling" type="logical" optional="false">
+-     <section name="debug" />
+-        <option value="false" type="string" default="true"></option>
+-     <help> enables profiling (memory, flops, time) </help>
+-</parameter>
+-
+-<!-- verbose -->
+-<parameter key ="mprocessor" type="logical" optional="false">
+-     <section name="verbose" />
+-        <option value="false" type="string" default="true"></option>
+-     <help>  </help>
+-</parameter>
+-<parameter key ="module" type="logical" optional="false">
+-     <section name="verbose" />
+-        <option value="false" type="string" default="true"></option>
+-     <help>  </help>
+-</parameter>
+-<parameter key ="solution" type="logical" optional="false">
+-     <section name="verbose" />
+-        <option value="true" type="string" default="true"></option>
+-     <help>  </help>
+-</parameter>
+-<parameter key ="solver" type="logical" optional="false">
+-     <section name="verbose" />
+-        <option value="false" type="string" default="true"></option>
+-     <help>  </help>
+-</parameter>
+-<parameter key ="convergence" type="logical" optional="false">
+-     <section name="verbose" />
+-        <option value="false" type="string" default="true"></option>
+-     <help>  </help>
+-</parameter>
+-<parameter key ="control" type="logical" optional="false">
+-     <section name="verbose" />
+-        <option value="true" type="string" default="true"></option>
+-     <help>  </help>
+-</parameter>
+-<parameter key ="qmu" type="logical" optional="false">
+-     <section name="verbose" />
+-        <option value="true" type="string" default="true"></option>
+-     <help>  </help>
+-</parameter>
+-<parameter key ="autodiff" type="logical" optional="false">
+-     <section name="verbose" />
+-        <option value="false" type="string" default="true"></option>
+-     <help>  </help>
+-</parameter>
+-
+-<!-- settings -->
+-<parameter key ="results_on_nodes" type="double" default="0">
+-     <section name="settings" />
+-     <help> results are output for all the nodes of each element </help>
+-</parameter>
+-<parameter key ="io_gather" type="double" default="1">
+-     <section name="settings" />
+-     <help> I/O gathering strategy for result outputs (default 1) </help>
+-</parameter>
+-<parameter key ="lowmem" type="double" default="0">
+-     <section name="settings" />
+-     <help> is the memory limited ? (0 or 1) </help>
+-</parameter>
+-<parameter key ="output_frequency" type="double" default="1">
+-     <section name="settings" />
+-     <help> frequency at which results are saved in all solutions with multiple time_steps </help>
+-</parameter>
+-<parameter key ="waitonlock" type="double" default="Inf">
+-     <section name="settings" />
+-     <help> maximum number of minutes to wait for batch results (NaN to deactivate) </help>
+-</parameter>
+-<parameter key ="upload_server" type="char" default="N/A">
+-     <section name="settings" />
+-     <help> server hostname where model should be uploaded </help>
+-</parameter>
+-<parameter key ="upload_path" type="char" default="N/A">
+-     <section name="settings" />
+-     <help> path on server where model should be uploaded </help>
+-</parameter>
+-<parameter key ="upload_login" type="char" default="N/A">
+-     <section name="settings" />
+-     <help> server login </help>
+-</parameter>
+-<parameter key ="upload_port" type="double" default="0">
+-     <section name="settings" />
+-     <help> port login (default is 0) </help>
+-</parameter>
+-<parameter key ="upload_filename" type="char" default="N/A">
+-     <section name="settings" />
+-     <help> unique id generated when uploading the file to server </help>
+-</parameter>
+-
+-<!-- generic -->
+-<parameter key ="name" type="char" default="'XPS'">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="login" type="char" default="N/A">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="np" type="double" default="1">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="port" type="double" default="0">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="codepath" type="char" default=":/home/casper/work/issm/trunk:/home/casper/work/issm/trunk/bin">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="executionpath" type="char" default=":/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk/execution">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="etcpath" type="char" default=":/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk/etc">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="valgrind" type="char" default=":/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk/externalpackages/valgrind/install/bin/valgrind">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="valgrindlib" type="char" default=":/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk/externalpackages/valgrind/install/lib/libmpidebug.so">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="valgrindsup" type="char" default=":/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk:/home/casper/work/issm/trunk/externalpackages/valgrind/issm.supp">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-<parameter key ="verbose" type="double" default="1">
+-     <section name="cluster" />
+-     <help> N/A </help>
+-</parameter>
+-
+-<!-- balancethickness -->
+-<parameter key ="spcthickness" type="double" default="N/A">
+-     <section name="balancethickness" />
+-     <help> thickness constraints (NaN means no constraint) [m] </help>
+-</parameter>
+-<parameter key ="thickening_rate" type="double" default="N/A">
+-     <section name="balancethickness" />
+-     <help> ice thickening rate used in the mass conservation (dh/dt) [m/yr] </help>
+-</parameter>
+-<parameter key ="stabilization" type="double" default="1">
+-     <section name="balancethickness" />
+-     <help> 0: None, 1: SU, 2: SSAs artificial diffusivity, 3:DG </help>
+-</parameter>
+-
+-<!-- StressBalance solution parameters: -->
+-<frame key="1" label="Convergence criteria">
+-<section name="stressbalance" />
+-<parameter key ="restol" type="double" default="0.0001">
+-     <section name="stressbalance" />
+-     <help> mechanical equilibrium residual convergence criterion </help>
+-</parameter>
+-<parameter key ="reltol" type="double" default="0.01">
+-     <section name="stressbalance" />
+-     <help> velocity relative convergence criterion, NaN: not applied </help>
+-</parameter>
+-<parameter key ="abstol" type="double" default="10">
+-     <section name="stressbalance" />
+-     <help> velocity absolute convergence criterion, NaN: not applied </help>
+-</parameter>
+-<parameter key ="isnewton" type="double" default="0">
+-     <section name="stressbalance" />
+-     <help> 0: Picards fixed point, 1: Newtons method, 2: hybrid </help>
+-</parameter>
+-<parameter key ="maxiter" type="double" default="100">
+-     <section name="stressbalance" />
+-     <help> maximum number of nonlinear iterations </help>
+-</parameter>
+-<parameter key ="viscosity_overshoot" type="double" default="0">
+-     <section name="stressbalance" />
+-     <help> over-shooting constant new=new+C*(new-old) </help>
+-</parameter>
+-</frame>
+-<frame key="2" label="Boundary conditions">
+-<section name="stressbalance" />
+-<parameter key ="spcvx" type="double" default="N/A">
+-     <section name="stressbalance" />
+-     <help> x-axis velocity constraint (NaN means no constraint) [m/yr] </help>
+-</parameter>
+-<parameter key ="spcvy" type="double" default="N/A">
+-     <section name="stressbalance" />
+-     <help> y-axis velocity constraint (NaN means no constraint) [m/yr] </help>
+-</parameter>
+-<parameter key ="spcvz" type="double" default="N/A">
+-     <section name="stressbalance" />
+-     <help> z-axis velocity constraint (NaN means no constraint) [m/yr] </help>
+-</parameter>
+-</frame>
+-<frame key="3" label="Rift options">
+-<section name="stressbalance" />
+-<parameter key ="rift_penalty_threshold" type="double" default="0">
+-     <section name="stressbalance" />
+-     <help> threshold for instability of mechanical constraints </help>
+-</parameter>
+-<parameter key ="rift_penalty_lock" type="double" default="10">
+-     <section name="stressbalance" />
+-     <help> number of iterations before rift penalties are locked </help>
+-</parameter>
+-</frame>
+-<frame key="4" label="Other">
+-<section name="stressbalance" />
+-<parameter key ="shelf_dampening" type="double" default="0">
+-     <section name="stressbalance" />
+-     <help> use dampening for floating ice ? Only for FS model </help>
+-</parameter>
+-<parameter key ="FSreconditioning" type="double" default="10000000000000">
+-     <section name="stressbalance" />
+-     <help> multiplier for incompressibility equation. Only for FS model </help>
+-</parameter>
+-<parameter key ="referential" type="double" default="N/A">
+-     <section name="stressbalance" />
+-     <help> local referential </help>
+-</parameter>
+-<parameter key ="loadingforce" type="double" default="N/A">
+-     <section name="stressbalance" />
+-     <help> loading force applied on each point [N/m^3] </help>
+-</parameter>
+-<parameter key ="requested_outputs" type="cell" default="{'default'}">
+-     <section name="stressbalance" />
+-     <help> additional outputs requested </help>
+-</parameter>
+-</frame>
+-
+-
+-<!-- groundingline -->
+-<frame key="1" label="Grounding line migration parameters">
+-<section name="groundingline" />
+-<parameter key ="migration" type="char" default="'None'">
+-     <section name="groundingline" />
+-     <help> type of grounding line migration: "SoftMigration","AgressiveMigration" or "None" </help>
+-</parameter>
+-<parameter key ="melting_rate" type="double" default="0">
+-     <section name="groundingline" />
+-     <help> melting rate applied when previously grounded parts start floating [m/yr] </help>
+-</parameter></frame>
+-
+-
+-<!-- Hydrology -->
+-<frame key="1" label="Hydrologyshreve solution parameters">
+-<section name="hydrologyshreve" />
+-<parameter key ="spcwatercolumn" type="double" default="N/A">
+-     <section name="hydrologyshreve" />
+-     <help> water thickness constraints (NaN means no constraint) [m] </help>
+-</parameter>
+-<parameter key ="n" type="double" default="0.02">
+-     <section name="hydrologyshreve" />
+-     <help> Manning roughness coefficient </help>
+-</parameter>
+-<parameter key ="CR" type="double" default="0.01">
+-     <section name="hydrologyshreve" />
+-     <help> tortuosity parameter </help>
+-</parameter>
+-<parameter key ="p" type="double" default="2">
+-     <section name="hydrologyshreve" />
+-     <help> dimensionless exponent in Manning velocity formula </help>
+-</parameter>
+-<parameter key ="q" type="double" default="1">
+-     <section name="hydrologyshreve" />
+-     <help> dimensionless exponent in Manning velocity formula </help>
+-</parameter>
+-<parameter key ="kn" type="double" default="0">
+-     <section name="hydrologyshreve" />
+-     <help> parameter in effective pressure formula </help>
+-</parameter>
+-<parameter key ="stabilization" type="double" default="1">
+-     <section name="hydrologyshreve" />
+-     <help> artificial diffusivity (default is 1). can be more than 1 to increase diffusivity. </help>
+-</parameter>
+-</frame>
+-<!-- masstransport -->
+-<frame key="1" label="Masstransport solution parameters">
+-<section name="masstransport" />
+-  <parameter key ="spcthickness" type="double" default="N/A">
+-     <section name="masstransport" />
+-     <help> thickness constraints (NaN means no constraint) [m] </help>
+-  </parameter>
+-  <parameter key ="calvingrate" type="double" default="N/A">
+-     <section name="masstransport" />
+-     <help> calving rate at given location [m/a] </help>
+-  </parameter>
+-  <parameter key ="isfreesurface" type="double" default="0">
+-     <section name="masstransport" />
+-     <help> do we use free surfaces (FS only) are mass conservation </help>
+-  </parameter>
+-  <parameter key ="min_thickness" type="double" default="1">
+-     <section name="masstransport" />
+-     <help> minimum ice thickness allowed [m] </help>
+-  </parameter>
+-  <parameter key ="hydrostatic_adjustment" type="char" default="'Absolute'">
+-     <section name="masstransport" />
+-     <help> adjustment of ice shelves surface and bed elevations: 'Incremental' or 'Absolute'  </help>
+-  </parameter>
+-  <parameter key ="stabilization" type="double" default="1">
+-     <section name="masstransport" />
+-     <help> 0: no, 1:  artificial_diffusivity, 2: streamline upwinding, 3: discontinuous Galerkin </help>
+-  </parameter>
+-</frame>
+-<frame key="2" label="Penalty options">
+-<section name="masstransport" />
+-  <parameter key ="vertex_pairing" type="double" default="N/A">
+-     <section name="masstransport" />
+-     <help> offset used by penalties: penalty = Kmax*10^offset </help>
+-  </parameter>
+-  <parameter key ="penalty_factor" type="double" default="3">
+-     <section name="masstransport" />
+-     <help> pairs of vertices that are penalized </help>
+-  </parameter>
+-  <parameter key ="requested_outputs" type="cell" default="{'default'}">
+-     <section name="masstransport" />
+-     <help> additional outputs requested </help>
+-  </parameter>
+-</frame>
+-<!-- thermal -->
+-<frame key="1" label="Thermal solution parameters">
+-<section name="thermal" />
+-  <parameter key ="spctemperature" type="double" default="N/A">
+-     <section name="thermal" />
+-     <help> temperature constraints (NaN means no constraint) [K] </help>
+-  </parameter>
+-  <parameter key ="penalty_threshold" type="double" default="0">
+-     <section name="thermal" />
+-     <help> 0: no, 1: artificial_diffusivity, 2: SUPG </help>
+-  </parameter>
+-  <parameter key ="stabilization" type="double" default="1">
+-     <section name="thermal" />
+-     <help> maximum number of non linear iterations </help>
+-  </parameter>
+-  <parameter key ="maxiter" type="double" default="100">
+-     <section name="thermal" />
+-     <help> stabilize unstable thermal constraints that keep zigzagging after n iteration (default is 0, no stabilization) </help>
+-  </parameter>
+-  <parameter key ="penalty_lock" type="double" default="0">
+-     <section name="thermal" />
+-     <help> threshold to declare convergence of thermal solution (default is 0)  </help>
+-  </parameter>
+-  <parameter key ="penalty_factor" type="double" default="3">
+-     <section name="thermal" />
+-     <help> scaling exponent (default is 3) </help>
+-  </parameter>
+-  <parameter key ="isenthalpy" type="double" default="0">
+-     <section name="thermal" />
+-     <help> use an enthalpy formulation to include temperate ice (default is 0) </help>
+-  </parameter>
+-  <parameter key ="isdynamicbasalspc" type="double" default="0">
+-     <section name="thermal" />
+-     <help> enable dynamic setting of basal forcing. required for enthalpy formulation (default is 0)  </help>
+-  </parameter>
+-  <parameter key ="requested_outputs" type="cell" default="{'default'}">
+-     <section name="thermal" />
+-     <help> additional outputs requested </help>
+-  </parameter>
+-</frame>
+-<!-- steadystate -->
+-<frame key="1" label="steadystate solution parameters">
+-<section name="steadystate" />
+-  <parameter key ="reltol" type="double" default="0.01">
+-     <section name="steadystate" />
+-     <help> relative tolerance criterion [K] </help>
+-  </parameter>
+-  <parameter key ="maxiter" type="double" default="100">
+-     <section name="steadystate" />
+-     <help> maximum number of iterations </help>
+-  </parameter>
+-  <parameter key ="requested_outputs" type="cell" default="{'default'}">
+-     <section name="steadystate" />
+-     <help> additional requested outputs </help>
+-  </parameter>
+-</frame>
+-<!-- transient -->
+-<frame key="1" label="transient solution parameters">
+-<section name="transient" />
+-  <parameter key ="ismasstransport" type="double" default="1">
+-     <section name="transient" />
+-     <help> indicates whether a masstransport solution is used in the transient </help>
+-  </parameter>
+-  <parameter key ="isstressbalance" type="double" default="1">
+-     <section name="transient" />
+-     <help> indicates whether a stressbalance solution is used in the transient </help>
+-  </parameter>
+-  <parameter key ="isthermal" type="double" default="1">
+-     <section name="transient" />
+-     <help> indicates whether a thermal solution is used in the transient </help>
+-  </parameter>
+-  <parameter key ="isgroundingline" type="double" default="0">
+-     <section name="transient" />
+-     <help> indicates whether a groundingline migration is used in the transient </help>
+-  </parameter>
+-  <parameter key ="isgia" type="double" default="0">
+-     <section name="transient" />
+-     <help> indicates whether a postglacial rebound model is used in the transient </help>
+-  </parameter>
+-  <parameter key ="isdamage" type="double" default="0">
+-     <section name="transient" />
+-     <help> indicates whether damage evolution is used in the transient </help>
+-  </parameter>
+-  <parameter key ="islevelset" type="double" default="0">
+-     <section name="transient" />
+-     <help> LEVEL SET DESCRIPTION...  </help>
+-  </parameter>
+-  <parameter key ="requested_outputs" type="cell" default="{'default'}">
+-     <section name="transient" />
+-     <help> list of additional outputs requested </help>
+-  </parameter>
+-</frame>
+-<!-- gia -->
+-<frame key="1" label="gia parameters">
+-<section name="gia" />
+-  <parameter key ="mantle_viscosity" type="double" default="N/A">
+-     <section name="gia" />
+-     <help> mantle viscosity[Pa s] </help>
+-  </parameter>
+-  <parameter key ="lithosphere_thickness" type="double" default="N/A">
+-     <section name="gia" />
+-     <help> lithosphere thickness (km) </help>
+-  </parameter>
+-  <parameter key ="cross_section_shape" type="double" default="1">
+-     <section name="gia" />
+-     <help> 1: square-edged (default). 2: elliptical.  See iedge in GiaDeflectionCore </help>
+-  </parameter>
+-</frame>
+-<!-- autodiff -->
+-<frame key="1" label="automatic differentiation parameters">
+-<section name="autodiff" />
+-  <parameter key ="isautodiff" type="logical" optional="false">
+-     <section name="autodiff" />
+-         <option value="false" type="string" default="true"></option>
+-     <help> indicates if the automatic differentiation is activated </help>
+-  </parameter>
+-  <parameter key ="dependents" type="cell" default="(0x0)">
+-     <section name="autodiff" />
+-     <help> list of dependent variables </help>
+-  </parameter>
+-  <parameter key ="independents" type="cell" default="(0x0)">
+-     <section name="autodiff" />
+-     <help> list of independent variables </help>
+-  </parameter>
+-  <parameter key ="driver" type="char" default="'fos_forward'">
+-     <section name="autodiff" />
+-     <help> ADOLC driver ('fos_forward' or 'fov_forward') </help>
+-  </parameter>
+-  <parameter key ="obufsize" type="double" default="524288">
+-     <section name="autodiff" />
+-     <help> Number of operations per buffer (==OBUFSIZE in usrparms.h)  </help>
+-  </parameter>
+-  <parameter key ="lbufsize" type="double" default="524288">
+-     <section name="autodiff" />
+-     <help> Number of locations per buffer (==LBUFSIZE in usrparms.h) </help>
+-  </parameter>
+-  <parameter key ="cbufsize" type="double" default="524288">
+-     <section name="autodiff" />
+-     <help> Number of values per buffer (==CBUFSIZE in usrparms.h) </help>
+-  </parameter>
+-  <parameter key ="tbufsize" type="double" default="524288">
+-     <section name="autodiff" />
+-     <help> Number of taylors per buffer (&amp;lt;=TBUFSIZE in usrparms.h) </help>
+-  </parameter>
+-  <parameter key ="gcTriggerRatio" type="double" default="2">
+-     <section name="autodiff" />
+-     <help> free location block sorting/consolidation triggered if the ratio between allocated and used locations exceeds gcTriggerRatio </help>
+-  </parameter>
+-  <parameter key ="gcTriggerRatio" type="double" default="2">
+-     <section name="autodiff" />
+-     <help> free location block sorting/consolidation triggered if the allocated locations exceed gcTriggerMaxSize </help>
+-  </parameter>
+-</frame>
+-<!-- flaim -->
+-<frame key="1" label="Input:">
+-<section name="flaim" />
+-  <parameter key ="targets" type="char" default="N/A">
+-     <section name="flaim" />
+-     <help> name of kml output targets file </help>
+-  </parameter>
+-  <parameter key ="tracks" type="char" default="N/A">
+-     <section name="flaim" />
+-     <help> name of kml input tracks file </help>
+-  </parameter>
+-  <parameter key ="flightreqs" type="struct" default="N/A">
+-     <section name="flaim" />
+-     <help> structure of kml flight requirements (not used yet) </help>
+-  </parameter>
+-  <parameter key ="criterion" type="double" default="N/A">
+-     <section name="flaim" />
+-     <help> element or nodal criterion for flight path evaluation (metric) </help>
+-  </parameter>
+-</frame>
+-<frame key="2" label="Arguments:">
+-<section name="flaim" />
+-  <parameter key ="gridsatequator" type="double" default="200000">
+-     <section name="flaim" />
+-     <help> number of grids at equator (determines resolution) </help>
+-  </parameter>
+-  <parameter key ="usevalueordering" type="logical" optional="false">
+-     <section name="flaim" />
+-         <option value="true" type="string" default="true"></option>
+-     <help> flag to consider target values for flight path evaluation </help>
+-  </parameter>
+-  <parameter key ="split_antimeridian" type="logical" optional="false">
+-     <section name="flaim" />
+-         <option value="true" type="string" default="true"></option>
+-     <help> flag to split polygons on the antimeridian </help>
+-  </parameter>
+-</frame>
+-<frame key="3" label="Optimization:">
+-<section name="flaim" />
+-  <parameter key ="path_optimize" type="logical" optional="false">
+-     <section name="flaim" />
+-         <option value="false" type="string" default="true"></option>
+-     <help> optimize? (default false) </help>
+-  </parameter>
+-  <parameter key ="opt_ndir" type="double" default="1">
+-     <section name="flaim" />
+-     <help> number of directions to test when moving a point.  If this value = 1, a random direction is tested. A value > 1 results in directions equally spaced from [0, 2*PI] being tested. For example, 4 would result in directions [0, PI/2, PI, 3PI/2] </help>
+-  </parameter>
+-  <parameter key ="opt_dist" type="double" default="25">
+-     <section name="flaim" />
+-     <help> specifies the distance in km (default 25) to move a randomly selected path point on each iteration </help>
+-  </parameter>
+-  <parameter key ="opt_niter" type="double" default="30000">
+-     <section name="flaim" />
+-     <help> number of iterations (default 30,000) to run for flightplan optimization, i.e. the number of times to randomly select a point and move it. </help>
+-  </parameter>
+-</frame>
+-<frame key="4" label="Output:">
+-<section name="flaim" />
+-  <parameter key ="solution" type="char" default="N/A">
+-     <section name="flaim" />
+-     <help> name of kml solution file </help>
+-  </parameter>
+-  <parameter key ="quality" type="double" default="0">
+-     <section name="flaim" />
+-     <help> quality of kml solution </help>
+-  </parameter>
+-</frame>
+-<!-- inversion -->
+-<frame key="1" label="inversion parameters">
+-<section name="inversion" />
+-  <parameter key ="iscontrol" type="double" default="0">
+-     <section name="inversion" />
+-     <help> is inversion activated? </help>
+-  </parameter>
+-  <parameter key ="incomplete_adjoint" type="double" default="1">
+-     <section name="inversion" />
+-     <help> 1: linear viscosity, 0: non-linear viscosity </help>
+-  </parameter>
+-  <parameter key ="control_parameters" type="cell" default="{'FrictionCoefficient'}">
+-     <section name="inversion" />
+-     <help> ex: {'FrictionCoefficient'}, or {'MaterialsRheologyBbar'} </help>
+-  </parameter>
+-  <parameter key ="nsteps" type="double" default="20">
+-     <section name="inversion" />
+-     <help> number of optimization searches </help>
+-  </parameter>
+-  <parameter key ="cost_functions" type="double" default="101">
+-     <section name="inversion" />
+-     <help> indicate the type of response for each optimization step  </help>
+-  </parameter>
+-  <parameter key ="cost_functions_coefficients" type="double" default="N/A">
+-     <section name="inversion" />
+-     <help> cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter </help>
+-  </parameter>
+-  <parameter key ="cost_function_threshold" type="double" default="N/A">
+-     <section name="inversion" />
+-     <help> misfit convergence criterion. Default is 1%, NaN if not applied </help>
+-  </parameter>
+-  <parameter key ="maxiter_per_step" type="double" default="(20x1)">
+-     <section name="inversion" />
+-     <help> maximum iterations during each optimization step  </help>
+-  </parameter>
+-  <parameter key ="gradient_scaling" type="double" default="(20x1)">
+-     <section name="inversion" />
+-     <help> scaling factor on gradient direction during optimization, for each optimization step </help>
+-  </parameter>
+-  <parameter key ="step_threshold" type="double" default="(20x1)">
+-     <section name="inversion" />
+-     <help> decrease threshold for misfit, default is 30% </help>
+-  </parameter>
+-  <parameter key ="min_parameters" type="double" default="N/A">
+-     <section name="inversion" />
+-     <help> absolute minimum acceptable value of the inversed parameter on each vertex </help>
+-  </parameter>
+-  <parameter key ="max_parameters" type="double" default="N/A">
+-     <section name="inversion" />
+-     <help> absolute maximum acceptable value of the inversed parameter on each vertex </help>
+-  </parameter>
+-  <parameter key ="vx_obs" type="double" default="N/A">
+-     <section name="inversion" />
+-     <help> observed velocity x component [m/yr] </help>
+-  </parameter>
+-  <parameter key ="vy_obs" type="double" default="N/A">
+-     <section name="inversion" />
+-     <help> observed velocity y component [m/yr]  </help>
+-  </parameter>
+-  <parameter key ="vel_obs" type="double" default="N/A">
+-     <section name="inversion" />
+-     <help> observed velocity magnitude [m/yr] </help>
+-  </parameter>
+-  <parameter key ="thickness_obs" type="double" default="N/A">
+-     <section name="inversion" />
+-     <help> observed thickness [m]) </help>
+-  </parameter>
+-</frame>
+-<frame key="2" label="Available cost functions">
+-<section name="inversion" />
+-  <parameter key ="SurfaceAbsVelMisfit" type="string" default="101">
+-     <section name="inversion" />
+-     <help>  </help>
+-  </parameter>
+-  <parameter key ="SurfaceRelVelMisfit" type="string" default="102">
+-     <section name="inversion" />
+-     <help>   </help>
+-  </parameter>
+-  <parameter key ="SurfaceLogVelMisfit" type="string" default="103">
+-     <section name="inversion" />
+-     <help>  </help>
+-  </parameter>
+-  <parameter key ="SurfaceLogVxVyMisfit" type="string" default="104">
+-     <section name="inversion" />
+-     <help>  </help>
+-  </parameter>
+-  <parameter key ="SurfaceAverageVelMisfit" type="string" default="105">
+-     <section name="inversion" />
+-     <help>   </help>
+-  </parameter>
+-  <parameter key ="ThicknessAbsMisfit" type="string" default="106">
+-     <section name="inversion" />
+-     <help>  </help>
+-  </parameter>
+-  <parameter key ="DragCoefficientAbsGradient" type="string" default="107">
+-     <section name="inversion" />
+-     <help>  </help>
+-  </parameter>
+-  <parameter key ="RheologyBbarAbsGradient" type="string" default="108">
+-     <section name="inversion" />
+-     <help>  </help>
+-  </parameter>
+-  <parameter key ="ThicknessAbsGradient" type="string" default="109">
+-     <section name="inversion" />
+-     <help> </help>
+-  </parameter>
+-</frame>
+-<!-- qmu -->
+-<frame key="1" label="qmu parameters">
+-<section name="qmu" />
+-  <parameter key ="isdakota" type="double" default="0">
+-     <section name="qmu" />
+-     <help> is qmu analysis activated? </help>
+-  </parameter>
+-  <parameter key ="variables" type="struct" default="N/A">
+-     <section name="qmu" />
+-     <help> (arrays of each variable class) </help>
+-  </parameter>
+-  <parameter key ="responses" type="struct" default="N/A">
+-     <section name="qmu" />
+-     <help> (arrays of each response class) </help>
+-  </parameter>
+-  <parameter key ="numberofresponses" type="double" default="0">
+-     <section name="qmu" />
+-     <help> number of responses </help>
+-  </parameter>
+-  <parameter key ="params" type="struct" default="N/A">
+-     <section name="qmu" />
+-     <help> (array of method-independent parameters)  </help>
+-  </parameter>
+-  <parameter key ="results" type="struct" default="N/A">
+-     <section name="qmu" />
+-     <help> (information from dakota files) </help>
+-  </parameter>
+-  <parameter key ="partition" type="double" default="N/A">
+-     <section name="qmu" />
+-     <help> user provided mesh partitioning, defaults to metis if not specified </help>
+-  </parameter>
+-  <parameter key ="numberofpartitions" type="double" default="0">
+-     <section name="qmu" />
+-     <help> number of partitions for semi-discrete qmu  </help>
+-  </parameter>
+-  <parameter key ="variabledescriptors" type="cell" default="(0x0)">
+-     <section name="qmu" />
+-     <help>  </help>
+-  </parameter>
+-  <parameter key ="responsedescriptors" type="cell" default="(0x0)">
+-     <section name="qmu" />
+-     <help> use an enthalpy formulation to include temperate ice (default is 0) </help>
+-  </parameter>
+-  <parameter key ="method" type="struct" default="N/A">
+-     <section name="qmu" />
+-     <help> array of dakota_method class </help>
+-  </parameter>
+-  <parameter key ="mass_flux_profile_directory" type="double" default="N/A">
+-     <section name="qmu" />
+-     <help> directory for mass flux profiles </help>
+-  </parameter>
+-  <parameter key ="mass_flux_profiles" type="double" default="N/A">
+-     <section name="qmu" />
+-     <help>  </help>
+-  </parameter>
+-  <parameter key ="mass_flux_segments" type="cell" default="(0x0)">
+-     <section name="qmu" />
+-     <help>  </help>
+-  </parameter>
+-  <parameter key ="adjacency" type="double" default="N/A">
+-     <section name="qmu" />
+-     <help> additional outputs requested </help>
+-  </parameter>
+-  <parameter key ="vertex_weight" type="double" default="N/A">
+-     <section name="qmu" />
+-     <help> weight applied to each mesh vertex </help>
+-  </parameter>
+-</frame>
+-<!-- outputdefinition -->
+-<frame key="1" label="outputdefinition">
+-<section name="outputdefinition" />
+-  <parameter key ="definitions" type="cell" default="(0x0)">
+-     <section name="outputdefinition" />
+-     <help> list of potential outputs that can be requested, but which need additional data to be defined </help>
+-  </parameter>
+-</frame>
+-<!-- miscellaneous -->
+-<frame key="1" label="miscellaneous parameters">
+-<section name="miscellaneous" />
+-  <parameter key ="notes" type="char" default="N/A">
+-     <section name="miscellaneous" />
+-     <help> notes in a cell of strings </help>
+-  </parameter>
+-  <parameter key ="name" type="char" default="N/A">
+-     <section name="miscellaneous" />
+-     <help> model name </help>
+-  </parameter>
+-  <parameter key ="dummy" type="struct" default="N/A">
+-     <section name="miscellaneous" />
+-     <help> empty field to store some data </help>
+-  </parameter>
+-</frame>
+-
+-
+-</inishell_config>
+\ No newline at end of file
+Index: ../trunk-jpl/src/java/build/resources/icons/kghostview.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/resources/icons/file_ops.xcf
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/resources/icons/filesave.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/resources/icons/viewmag.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/resources/icons/ini_open.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/resources/icons/fileopen.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/resources/icons/xml_open.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/resources/icons/filesaveas.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/resources/icons/opensettings.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/resources/icons/reset.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/resources/icons/advancedsettings.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/resources/icons/mydocuments.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/resources/icons/readme.txt
+===================================================================
+--- ../trunk-jpl/src/java/build/resources/icons/readme.txt	(revision 18297)
++++ ../trunk-jpl/src/java/build/resources/icons/readme.txt	(revision 18298)
+@@ -1,10 +0,0 @@
+-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+-This copyright and license notice covers the images in this directory.
+-************************************************************************
+-
+-TITLE:	Crystal Project Icons
+-AUTHOR:	Everaldo Coelho
+-SITE:	http://www.everaldo.com
+-CONTACT: everaldo@everaldo.com
+-
+-Copyright (c)  2006-2007  Everaldo Coelho.
+Index: ../trunk-jpl/src/java/build/resources/config_schema-0.1.1.xsd
+===================================================================
+--- ../trunk-jpl/src/java/build/resources/config_schema-0.1.1.xsd	(revision 18297)
++++ ../trunk-jpl/src/java/build/resources/config_schema-0.1.1.xsd	(revision 18298)
+@@ -1,154 +0,0 @@
+-<?xml version="1.0"?>
+-<!-- 
+-*   
+-*	This file is part of INIshell.
+-*
+-*   INIshell 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 3 of the License, or
+-*   (at your option) any later version.
+-*
+-*   INIshell 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 INIshell.  If not, see <http://www.gnu.org/licenses/>.
+-*    	
+-* -->
+-<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+-  <xsd:element name="inishell_config" type="general" />
+-  
+-  <xsd:complexType name="general">
+-    <xsd:choice maxOccurs="unbounded">
+-      <xsd:element name="parameter" type="parametertype" />
+-      <xsd:element name="parametergroup" type="pargroup" />
+-      <xsd:element name="include" type="pathonly" /> 
+-      <xsd:element name="frame" type="framegroup" /> 
+-    </xsd:choice>
+-    <xsd:attribute name="application" />
+-  </xsd:complexType>
+-
+-  <xsd:complexType name="framegroup">
+-    <xsd:choice minOccurs="1" maxOccurs="unbounded">
+-      <xsd:element name="parameter" type="parametertype" />
+-      <xsd:element name="reference" type="nameonly" />
+-      <xsd:element name="section" type="nameonly"/>
+-    </xsd:choice>
+-    <xsd:attribute name="key" />
+-    <xsd:attribute name="label" />
+-  </xsd:complexType>
+-  
+-  <xsd:complexType name="parametertype">
+-    <xsd:complexContent>
+-      <xsd:extension base="parbasetype">
+-		<xsd:attribute name="key" type="xsd:string" use="required"/> 
+-		<xsd:attribute name="default" type="xsd:string" />
+-		<xsd:attribute name="counter" type="xsd:integer" />
+-      </xsd:extension>
+-    </xsd:complexContent>		
+-  </xsd:complexType>
+-  
+-  <xsd:complexType name="nameonly">
+-	<xsd:attribute name="name" />   
+-  </xsd:complexType>
+-
+-  <xsd:complexType name="optionvalue">
+-	<xsd:attribute name="value" />   
+-  </xsd:complexType>
+-
+-  <xsd:complexType name="pathonly">
+-	<xsd:attribute name="path" />   
+-  </xsd:complexType>
+-  
+-  <xsd:complexType name="pargroup">
+-	<xsd:choice minOccurs="1" maxOccurs="unbounded">
+-	  <xsd:element name="parameter" type="parametertype" />
+-	  <xsd:element name="reference" type="nameonly" />
+-	  <xsd:element name="option" type="optionvalue" />
+-	  <xsd:element name="frame" type="framegroup" /> 
+-	</xsd:choice>
+-	<xsd:attribute name="name" />
+-  </xsd:complexType>
+-
+-  <xsd:complexType name="parbasetype">
+-	<xsd:sequence>
+-	  <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-		<xsd:element name="section" type="nameonly"/>
+-	  </xsd:sequence>
+-	  <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-		<xsd:element name="replace" type="nameonly"/>
+-	  </xsd:sequence>
+-	  <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-		<xsd:element name="parameter" type="parametertype" />
+-	  </xsd:sequence>
+-	  <xsd:choice minOccurs="0" maxOccurs="unbounded">				
+-		<xsd:element name="option" minOccurs="0">
+-		  <xsd:complexType>
+-			<xsd:complexContent>
+-			  <xsd:extension base="parbasetype">
+-				<xsd:attribute name="value" type="xsd:string" use="required" />
+-				<xsd:attribute name="label" type="xsd:string" use="optional" />
+-				<xsd:attribute name="default" type="xsd:boolean" use="optional"/>
+-			  </xsd:extension>
+-			</xsd:complexContent>
+-		  </xsd:complexType>
+-		</xsd:element>
+-	  </xsd:choice>
+-	  <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-		<xsd:element name="reference" type="nameonly" />
+-	  </xsd:sequence>
+-	  <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+-		<xsd:element name="help" type="helptype"/>	
+-	  </xsd:sequence>
+-	</xsd:sequence>
+-	
+-	<xsd:attribute name="type" use="required">
+-	  <xsd:simpleType>
+-		<xsd:restriction base="xsd:string">
+-		  <xsd:enumeration value="integer" />
+-		  <xsd:enumeration value="integer+" />
+-		  <xsd:enumeration value="decimal" />
+-		  <xsd:enumeration value="path" />
+-		  <xsd:enumeration value="file" />
+-		  <xsd:enumeration value="choice" />
+-		  <xsd:enumeration value="alternative" />
+-		  <xsd:enumeration value="dropdown" />
+-		  <xsd:enumeration value="string" />
+-		  <xsd:enumeration value="combination" />
+-		  <xsd:enumeration value="selector" />
+-		</xsd:restriction>
+-	  </xsd:simpleType>
+-	</xsd:attribute>
+-	
+-	<xsd:attribute name="maximum" type="xsd:integer"/>
+-	<xsd:attribute name="minimum" type="xsd:integer"/>
+-	<xsd:attribute name="template" type="xsd:boolean" default="false" use="optional" />
+-	<xsd:attribute name="optional" type="xsd:boolean" default="true" />
+-  </xsd:complexType>
+-  
+-  <xsd:complexType name="needstype">
+-	<xsd:attribute name="type" type="xsd:string" use="required" />
+-	<xsd:attribute name="name" type="xsd:string" use="required" />
+-	
+-	<xsd:attribute name="value" />
+-	<xsd:attribute name="optional" type="xsd:boolean" />
+-	<xsd:attribute name="minoccur" type="xsd:integer" />
+-	<xsd:attribute name="maxoccur" type="xsd:string" />
+-  </xsd:complexType>
+-  
+-  <xsd:complexType name="baseType">
+-	<xsd:sequence minOccurs="0" maxOccurs="1">
+-	  <xsd:element name="help" type="helptype" />		
+-	</xsd:sequence>
+-	<xsd:attribute name="key" type="xsd:string" use="required" />
+-  </xsd:complexType>
+-  
+-  <xsd:complexType name="helptype" mixed="true">
+-	<xsd:choice minOccurs="0" maxOccurs="unbounded">
+-	  <xsd:element name="section" type="nameonly" />
+-	  <xsd:element name="replace" type="nameonly" />
+-	</xsd:choice>
+-  </xsd:complexType> 
+-</xsd:schema>
+Index: ../trunk-jpl/src/java/build/gui_elements/CheckBoxPanel.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/gui_elements/CombinedPanel$Type.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/gui_elements/TextfieldPanel.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/gui_elements/FramePanel.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/gui_elements/PathPanel.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/gui_elements/IntegerPanel.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/gui_elements/DecimalPanel.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/gui_elements/GUIBuildException.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/gui_elements/CombinedPanel$1.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/gui_elements/ControlledPanel.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/gui_elements/DuplicatorPanel.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/gui_elements/OptionPanel.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/gui_elements/AlternativePanel.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/gui_elements/CombinedPanel.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/gui_elements/SelectorPanel.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/gui_elements/ColorCellRenderer.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/main/GUIBuilder$1.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/main/PanelControl.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/main/XMLHelper.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/main/GUI.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/main/PanelNode.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/build/main/GUIBuilder.class
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/java/License.txt
+===================================================================
+--- ../trunk-jpl/src/java/License.txt	(revision 18297)
++++ ../trunk-jpl/src/java/License.txt	(revision 18298)
+@@ -1,674 +0,0 @@
+-                    GNU GENERAL PUBLIC LICENSE
+-                       Version 3, 29 June 2007
+-
+- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+- Everyone is permitted to copy and distribute verbatim copies
+- of this license document, but changing it is not allowed.
+-
+-                            Preamble
+-
+-  The GNU General Public License is a free, copyleft license for
+-software and other kinds of works.
+-
+-  The licenses for most software and other practical works are designed
+-to take away your freedom to share and change the works.  By contrast,
+-the GNU General Public License is intended to guarantee your freedom to
+-share and change all versions of a program--to make sure it remains free
+-software for all its users.  We, the Free Software Foundation, use the
+-GNU General Public License for most of our software; it applies also to
+-any other work released this way by its authors.  You can apply it to
+-your programs, too.
+-
+-  When we speak of free software, we are referring to freedom, not
+-price.  Our General Public Licenses are designed to make sure that you
+-have the freedom to distribute copies of free software (and charge for
+-them if you wish), that you receive source code or can get it if you
+-want it, that you can change the software or use pieces of it in new
+-free programs, and that you know you can do these things.
+-
+-  To protect your rights, we need to prevent others from denying you
+-these rights or asking you to surrender the rights.  Therefore, you have
+-certain responsibilities if you distribute copies of the software, or if
+-you modify it: responsibilities to respect the freedom of others.
+-
+-  For example, if you distribute copies of such a program, whether
+-gratis or for a fee, you must pass on to the recipients the same
+-freedoms that you received.  You must make sure that they, too, receive
+-or can get the source code.  And you must show them these terms so they
+-know their rights.
+-
+-  Developers that use the GNU GPL protect your rights with two steps:
+-(1) assert copyright on the software, and (2) offer you this License
+-giving you legal permission to copy, distribute and/or modify it.
+-
+-  For the developers' and authors' protection, the GPL clearly explains
+-that there is no warranty for this free software.  For both users' and
+-authors' sake, the GPL requires that modified versions be marked as
+-changed, so that their problems will not be attributed erroneously to
+-authors of previous versions.
+-
+-  Some devices are designed to deny users access to install or run
+-modified versions of the software inside them, although the manufacturer
+-can do so.  This is fundamentally incompatible with the aim of
+-protecting users' freedom to change the software.  The systematic
+-pattern of such abuse occurs in the area of products for individuals to
+-use, which is precisely where it is most unacceptable.  Therefore, we
+-have designed this version of the GPL to prohibit the practice for those
+-products.  If such problems arise substantially in other domains, we
+-stand ready to extend this provision to those domains in future versions
+-of the GPL, as needed to protect the freedom of users.
+-
+-  Finally, every program is threatened constantly by software patents.
+-States should not allow patents to restrict development and use of
+-software on general-purpose computers, but in those that do, we wish to
+-avoid the special danger that patents applied to a free program could
+-make it effectively proprietary.  To prevent this, the GPL assures that
+-patents cannot be used to render the program non-free.
+-
+-  The precise terms and conditions for copying, distribution and
+-modification follow.
+-
+-                       TERMS AND CONDITIONS
+-
+-  0. Definitions.
+-
+-  "This License" refers to version 3 of the GNU General Public License.
+-
+-  "Copyright" also means copyright-like laws that apply to other kinds of
+-works, such as semiconductor masks.
+-
+-  "The Program" refers to any copyrightable work licensed under this
+-License.  Each licensee is addressed as "you".  "Licensees" and
+-"recipients" may be individuals or organizations.
+-
+-  To "modify" a work means to copy from or adapt all or part of the work
+-in a fashion requiring copyright permission, other than the making of an
+-exact copy.  The resulting work is called a "modified version" of the
+-earlier work or a work "based on" the earlier work.
+-
+-  A "covered work" means either the unmodified Program or a work based
+-on the Program.
+-
+-  To "propagate" a work means to do anything with it that, without
+-permission, would make you directly or secondarily liable for
+-infringement under applicable copyright law, except executing it on a
+-computer or modifying a private copy.  Propagation includes copying,
+-distribution (with or without modification), making available to the
+-public, and in some countries other activities as well.
+-
+-  To "convey" a work means any kind of propagation that enables other
+-parties to make or receive copies.  Mere interaction with a user through
+-a computer network, with no transfer of a copy, is not conveying.
+-
+-  An interactive user interface displays "Appropriate Legal Notices"
+-to the extent that it includes a convenient and prominently visible
+-feature that (1) displays an appropriate copyright notice, and (2)
+-tells the user that there is no warranty for the work (except to the
+-extent that warranties are provided), that licensees may convey the
+-work under this License, and how to view a copy of this License.  If
+-the interface presents a list of user commands or options, such as a
+-menu, a prominent item in the list meets this criterion.
+-
+-  1. Source Code.
+-
+-  The "source code" for a work means the preferred form of the work
+-for making modifications to it.  "Object code" means any non-source
+-form of a work.
+-
+-  A "Standard Interface" means an interface that either is an official
+-standard defined by a recognized standards body, or, in the case of
+-interfaces specified for a particular programming language, one that
+-is widely used among developers working in that language.
+-
+-  The "System Libraries" of an executable work include anything, other
+-than the work as a whole, that (a) is included in the normal form of
+-packaging a Major Component, but which is not part of that Major
+-Component, and (b) serves only to enable use of the work with that
+-Major Component, or to implement a Standard Interface for which an
+-implementation is available to the public in source code form.  A
+-"Major Component", in this context, means a major essential component
+-(kernel, window system, and so on) of the specific operating system
+-(if any) on which the executable work runs, or a compiler used to
+-produce the work, or an object code interpreter used to run it.
+-
+-  The "Corresponding Source" for a work in object code form means all
+-the source code needed to generate, install, and (for an executable
+-work) run the object code and to modify the work, including scripts to
+-control those activities.  However, it does not include the work's
+-System Libraries, or general-purpose tools or generally available free
+-programs which are used unmodified in performing those activities but
+-which are not part of the work.  For example, Corresponding Source
+-includes interface definition files associated with source files for
+-the work, and the source code for shared libraries and dynamically
+-linked subprograms that the work is specifically designed to require,
+-such as by intimate data communication or control flow between those
+-subprograms and other parts of the work.
+-
+-  The Corresponding Source need not include anything that users
+-can regenerate automatically from other parts of the Corresponding
+-Source.
+-
+-  The Corresponding Source for a work in source code form is that
+-same work.
+-
+-  2. Basic Permissions.
+-
+-  All rights granted under this License are granted for the term of
+-copyright on the Program, and are irrevocable provided the stated
+-conditions are met.  This License explicitly affirms your unlimited
+-permission to run the unmodified Program.  The output from running a
+-covered work is covered by this License only if the output, given its
+-content, constitutes a covered work.  This License acknowledges your
+-rights of fair use or other equivalent, as provided by copyright law.
+-
+-  You may make, run and propagate covered works that you do not
+-convey, without conditions so long as your license otherwise remains
+-in force.  You may convey covered works to others for the sole purpose
+-of having them make modifications exclusively for you, or provide you
+-with facilities for running those works, provided that you comply with
+-the terms of this License in conveying all material for which you do
+-not control copyright.  Those thus making or running the covered works
+-for you must do so exclusively on your behalf, under your direction
+-and control, on terms that prohibit them from making any copies of
+-your copyrighted material outside their relationship with you.
+-
+-  Conveying under any other circumstances is permitted solely under
+-the conditions stated below.  Sublicensing is not allowed; section 10
+-makes it unnecessary.
+-
+-  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+-
+-  No covered work shall be deemed part of an effective technological
+-measure under any applicable law fulfilling obligations under article
+-11 of the WIPO copyright treaty adopted on 20 December 1996, or
+-similar laws prohibiting or restricting circumvention of such
+-measures.
+-
+-  When you convey a covered work, you waive any legal power to forbid
+-circumvention of technological measures to the extent such circumvention
+-is effected by exercising rights under this License with respect to
+-the covered work, and you disclaim any intention to limit operation or
+-modification of the work as a means of enforcing, against the work's
+-users, your or third parties' legal rights to forbid circumvention of
+-technological measures.
+-
+-  4. Conveying Verbatim Copies.
+-
+-  You may convey verbatim copies of the Program's source code as you
+-receive it, in any medium, provided that you conspicuously and
+-appropriately publish on each copy an appropriate copyright notice;
+-keep intact all notices stating that this License and any
+-non-permissive terms added in accord with section 7 apply to the code;
+-keep intact all notices of the absence of any warranty; and give all
+-recipients a copy of this License along with the Program.
+-
+-  You may charge any price or no price for each copy that you convey,
+-and you may offer support or warranty protection for a fee.
+-
+-  5. Conveying Modified Source Versions.
+-
+-  You may convey a work based on the Program, or the modifications to
+-produce it from the Program, in the form of source code under the
+-terms of section 4, provided that you also meet all of these conditions:
+-
+-    a) The work must carry prominent notices stating that you modified
+-    it, and giving a relevant date.
+-
+-    b) The work must carry prominent notices stating that it is
+-    released under this License and any conditions added under section
+-    7.  This requirement modifies the requirement in section 4 to
+-    "keep intact all notices".
+-
+-    c) You must license the entire work, as a whole, under this
+-    License to anyone who comes into possession of a copy.  This
+-    License will therefore apply, along with any applicable section 7
+-    additional terms, to the whole of the work, and all its parts,
+-    regardless of how they are packaged.  This License gives no
+-    permission to license the work in any other way, but it does not
+-    invalidate such permission if you have separately received it.
+-
+-    d) If the work has interactive user interfaces, each must display
+-    Appropriate Legal Notices; however, if the Program has interactive
+-    interfaces that do not display Appropriate Legal Notices, your
+-    work need not make them do so.
+-
+-  A compilation of a covered work with other separate and independent
+-works, which are not by their nature extensions of the covered work,
+-and which are not combined with it such as to form a larger program,
+-in or on a volume of a storage or distribution medium, is called an
+-"aggregate" if the compilation and its resulting copyright are not
+-used to limit the access or legal rights of the compilation's users
+-beyond what the individual works permit.  Inclusion of a covered work
+-in an aggregate does not cause this License to apply to the other
+-parts of the aggregate.
+-
+-  6. Conveying Non-Source Forms.
+-
+-  You may convey a covered work in object code form under the terms
+-of sections 4 and 5, provided that you also convey the
+-machine-readable Corresponding Source under the terms of this License,
+-in one of these ways:
+-
+-    a) Convey the object code in, or embodied in, a physical product
+-    (including a physical distribution medium), accompanied by the
+-    Corresponding Source fixed on a durable physical medium
+-    customarily used for software interchange.
+-
+-    b) Convey the object code in, or embodied in, a physical product
+-    (including a physical distribution medium), accompanied by a
+-    written offer, valid for at least three years and valid for as
+-    long as you offer spare parts or customer support for that product
+-    model, to give anyone who possesses the object code either (1) a
+-    copy of the Corresponding Source for all the software in the
+-    product that is covered by this License, on a durable physical
+-    medium customarily used for software interchange, for a price no
+-    more than your reasonable cost of physically performing this
+-    conveying of source, or (2) access to copy the
+-    Corresponding Source from a network server at no charge.
+-
+-    c) Convey individual copies of the object code with a copy of the
+-    written offer to provide the Corresponding Source.  This
+-    alternative is allowed only occasionally and noncommercially, and
+-    only if you received the object code with such an offer, in accord
+-    with subsection 6b.
+-
+-    d) Convey the object code by offering access from a designated
+-    place (gratis or for a charge), and offer equivalent access to the
+-    Corresponding Source in the same way through the same place at no
+-    further charge.  You need not require recipients to copy the
+-    Corresponding Source along with the object code.  If the place to
+-    copy the object code is a network server, the Corresponding Source
+-    may be on a different server (operated by you or a third party)
+-    that supports equivalent copying facilities, provided you maintain
+-    clear directions next to the object code saying where to find the
+-    Corresponding Source.  Regardless of what server hosts the
+-    Corresponding Source, you remain obligated to ensure that it is
+-    available for as long as needed to satisfy these requirements.
+-
+-    e) Convey the object code using peer-to-peer transmission, provided
+-    you inform other peers where the object code and Corresponding
+-    Source of the work are being offered to the general public at no
+-    charge under subsection 6d.
+-
+-  A separable portion of the object code, whose source code is excluded
+-from the Corresponding Source as a System Library, need not be
+-included in conveying the object code work.
+-
+-  A "User Product" is either (1) a "consumer product", which means any
+-tangible personal property which is normally used for personal, family,
+-or household purposes, or (2) anything designed or sold for incorporation
+-into a dwelling.  In determining whether a product is a consumer product,
+-doubtful cases shall be resolved in favor of coverage.  For a particular
+-product received by a particular user, "normally used" refers to a
+-typical or common use of that class of product, regardless of the status
+-of the particular user or of the way in which the particular user
+-actually uses, or expects or is expected to use, the product.  A product
+-is a consumer product regardless of whether the product has substantial
+-commercial, industrial or non-consumer uses, unless such uses represent
+-the only significant mode of use of the product.
+-
+-  "Installation Information" for a User Product means any methods,
+-procedures, authorization keys, or other information required to install
+-and execute modified versions of a covered work in that User Product from
+-a modified version of its Corresponding Source.  The information must
+-suffice to ensure that the continued functioning of the modified object
+-code is in no case prevented or interfered with solely because
+-modification has been made.
+-
+-  If you convey an object code work under this section in, or with, or
+-specifically for use in, a User Product, and the conveying occurs as
+-part of a transaction in which the right of possession and use of the
+-User Product is transferred to the recipient in perpetuity or for a
+-fixed term (regardless of how the transaction is characterized), the
+-Corresponding Source conveyed under this section must be accompanied
+-by the Installation Information.  But this requirement does not apply
+-if neither you nor any third party retains the ability to install
+-modified object code on the User Product (for example, the work has
+-been installed in ROM).
+-
+-  The requirement to provide Installation Information does not include a
+-requirement to continue to provide support service, warranty, or updates
+-for a work that has been modified or installed by the recipient, or for
+-the User Product in which it has been modified or installed.  Access to a
+-network may be denied when the modification itself materially and
+-adversely affects the operation of the network or violates the rules and
+-protocols for communication across the network.
+-
+-  Corresponding Source conveyed, and Installation Information provided,
+-in accord with this section must be in a format that is publicly
+-documented (and with an implementation available to the public in
+-source code form), and must require no special password or key for
+-unpacking, reading or copying.
+-
+-  7. Additional Terms.
+-
+-  "Additional permissions" are terms that supplement the terms of this
+-License by making exceptions from one or more of its conditions.
+-Additional permissions that are applicable to the entire Program shall
+-be treated as though they were included in this License, to the extent
+-that they are valid under applicable law.  If additional permissions
+-apply only to part of the Program, that part may be used separately
+-under those permissions, but the entire Program remains governed by
+-this License without regard to the additional permissions.
+-
+-  When you convey a copy of a covered work, you may at your option
+-remove any additional permissions from that copy, or from any part of
+-it.  (Additional permissions may be written to require their own
+-removal in certain cases when you modify the work.)  You may place
+-additional permissions on material, added by you to a covered work,
+-for which you have or can give appropriate copyright permission.
+-
+-  Notwithstanding any other provision of this License, for material you
+-add to a covered work, you may (if authorized by the copyright holders of
+-that material) supplement the terms of this License with terms:
+-
+-    a) Disclaiming warranty or limiting liability differently from the
+-    terms of sections 15 and 16 of this License; or
+-
+-    b) Requiring preservation of specified reasonable legal notices or
+-    author attributions in that material or in the Appropriate Legal
+-    Notices displayed by works containing it; or
+-
+-    c) Prohibiting misrepresentation of the origin of that material, or
+-    requiring that modified versions of such material be marked in
+-    reasonable ways as different from the original version; or
+-
+-    d) Limiting the use for publicity purposes of names of licensors or
+-    authors of the material; or
+-
+-    e) Declining to grant rights under trademark law for use of some
+-    trade names, trademarks, or service marks; or
+-
+-    f) Requiring indemnification of licensors and authors of that
+-    material by anyone who conveys the material (or modified versions of
+-    it) with contractual assumptions of liability to the recipient, for
+-    any liability that these contractual assumptions directly impose on
+-    those licensors and authors.
+-
+-  All other non-permissive additional terms are considered "further
+-restrictions" within the meaning of section 10.  If the Program as you
+-received it, or any part of it, contains a notice stating that it is
+-governed by this License along with a term that is a further
+-restriction, you may remove that term.  If a license document contains
+-a further restriction but permits relicensing or conveying under this
+-License, you may add to a covered work material governed by the terms
+-of that license document, provided that the further restriction does
+-not survive such relicensing or conveying.
+-
+-  If you add terms to a covered work in accord with this section, you
+-must place, in the relevant source files, a statement of the
+-additional terms that apply to those files, or a notice indicating
+-where to find the applicable terms.
+-
+-  Additional terms, permissive or non-permissive, may be stated in the
+-form of a separately written license, or stated as exceptions;
+-the above requirements apply either way.
+-
+-  8. Termination.
+-
+-  You may not propagate or modify a covered work except as expressly
+-provided under this License.  Any attempt otherwise to propagate or
+-modify it is void, and will automatically terminate your rights under
+-this License (including any patent licenses granted under the third
+-paragraph of section 11).
+-
+-  However, if you cease all violation of this License, then your
+-license from a particular copyright holder is reinstated (a)
+-provisionally, unless and until the copyright holder explicitly and
+-finally terminates your license, and (b) permanently, if the copyright
+-holder fails to notify you of the violation by some reasonable means
+-prior to 60 days after the cessation.
+-
+-  Moreover, your license from a particular copyright holder is
+-reinstated permanently if the copyright holder notifies you of the
+-violation by some reasonable means, this is the first time you have
+-received notice of violation of this License (for any work) from that
+-copyright holder, and you cure the violation prior to 30 days after
+-your receipt of the notice.
+-
+-  Termination of your rights under this section does not terminate the
+-licenses of parties who have received copies or rights from you under
+-this License.  If your rights have been terminated and not permanently
+-reinstated, you do not qualify to receive new licenses for the same
+-material under section 10.
+-
+-  9. Acceptance Not Required for Having Copies.
+-
+-  You are not required to accept this License in order to receive or
+-run a copy of the Program.  Ancillary propagation of a covered work
+-occurring solely as a consequence of using peer-to-peer transmission
+-to receive a copy likewise does not require acceptance.  However,
+-nothing other than this License grants you permission to propagate or
+-modify any covered work.  These actions infringe copyright if you do
+-not accept this License.  Therefore, by modifying or propagating a
+-covered work, you indicate your acceptance of this License to do so.
+-
+-  10. Automatic Licensing of Downstream Recipients.
+-
+-  Each time you convey a covered work, the recipient automatically
+-receives a license from the original licensors, to run, modify and
+-propagate that work, subject to this License.  You are not responsible
+-for enforcing compliance by third parties with this License.
+-
+-  An "entity transaction" is a transaction transferring control of an
+-organization, or substantially all assets of one, or subdividing an
+-organization, or merging organizations.  If propagation of a covered
+-work results from an entity transaction, each party to that
+-transaction who receives a copy of the work also receives whatever
+-licenses to the work the party's predecessor in interest had or could
+-give under the previous paragraph, plus a right to possession of the
+-Corresponding Source of the work from the predecessor in interest, if
+-the predecessor has it or can get it with reasonable efforts.
+-
+-  You may not impose any further restrictions on the exercise of the
+-rights granted or affirmed under this License.  For example, you may
+-not impose a license fee, royalty, or other charge for exercise of
+-rights granted under this License, and you may not initiate litigation
+-(including a cross-claim or counterclaim in a lawsuit) alleging that
+-any patent claim is infringed by making, using, selling, offering for
+-sale, or importing the Program or any portion of it.
+-
+-  11. Patents.
+-
+-  A "contributor" is a copyright holder who authorizes use under this
+-License of the Program or a work on which the Program is based.  The
+-work thus licensed is called the contributor's "contributor version".
+-
+-  A contributor's "essential patent claims" are all patent claims
+-owned or controlled by the contributor, whether already acquired or
+-hereafter acquired, that would be infringed by some manner, permitted
+-by this License, of making, using, or selling its contributor version,
+-but do not include claims that would be infringed only as a
+-consequence of further modification of the contributor version.  For
+-purposes of this definition, "control" includes the right to grant
+-patent sublicenses in a manner consistent with the requirements of
+-this License.
+-
+-  Each contributor grants you a non-exclusive, worldwide, royalty-free
+-patent license under the contributor's essential patent claims, to
+-make, use, sell, offer for sale, import and otherwise run, modify and
+-propagate the contents of its contributor version.
+-
+-  In the following three paragraphs, a "patent license" is any express
+-agreement or commitment, however denominated, not to enforce a patent
+-(such as an express permission to practice a patent or covenant not to
+-sue for patent infringement).  To "grant" such a patent license to a
+-party means to make such an agreement or commitment not to enforce a
+-patent against the party.
+-
+-  If you convey a covered work, knowingly relying on a patent license,
+-and the Corresponding Source of the work is not available for anyone
+-to copy, free of charge and under the terms of this License, through a
+-publicly available network server or other readily accessible means,
+-then you must either (1) cause the Corresponding Source to be so
+-available, or (2) arrange to deprive yourself of the benefit of the
+-patent license for this particular work, or (3) arrange, in a manner
+-consistent with the requirements of this License, to extend the patent
+-license to downstream recipients.  "Knowingly relying" means you have
+-actual knowledge that, but for the patent license, your conveying the
+-covered work in a country, or your recipient's use of the covered work
+-in a country, would infringe one or more identifiable patents in that
+-country that you have reason to believe are valid.
+-
+-  If, pursuant to or in connection with a single transaction or
+-arrangement, you convey, or propagate by procuring conveyance of, a
+-covered work, and grant a patent license to some of the parties
+-receiving the covered work authorizing them to use, propagate, modify
+-or convey a specific copy of the covered work, then the patent license
+-you grant is automatically extended to all recipients of the covered
+-work and works based on it.
+-
+-  A patent license is "discriminatory" if it does not include within
+-the scope of its coverage, prohibits the exercise of, or is
+-conditioned on the non-exercise of one or more of the rights that are
+-specifically granted under this License.  You may not convey a covered
+-work if you are a party to an arrangement with a third party that is
+-in the business of distributing software, under which you make payment
+-to the third party based on the extent of your activity of conveying
+-the work, and under which the third party grants, to any of the
+-parties who would receive the covered work from you, a discriminatory
+-patent license (a) in connection with copies of the covered work
+-conveyed by you (or copies made from those copies), or (b) primarily
+-for and in connection with specific products or compilations that
+-contain the covered work, unless you entered into that arrangement,
+-or that patent license was granted, prior to 28 March 2007.
+-
+-  Nothing in this License shall be construed as excluding or limiting
+-any implied license or other defenses to infringement that may
+-otherwise be available to you under applicable patent law.
+-
+-  12. No Surrender of Others' Freedom.
+-
+-  If conditions are imposed on you (whether by court order, agreement or
+-otherwise) that contradict the conditions of this License, they do not
+-excuse you from the conditions of this License.  If you cannot convey a
+-covered work so as to satisfy simultaneously your obligations under this
+-License and any other pertinent obligations, then as a consequence you may
+-not convey it at all.  For example, if you agree to terms that obligate you
+-to collect a royalty for further conveying from those to whom you convey
+-the Program, the only way you could satisfy both those terms and this
+-License would be to refrain entirely from conveying the Program.
+-
+-  13. Use with the GNU Affero General Public License.
+-
+-  Notwithstanding any other provision of this License, you have
+-permission to link or combine any covered work with a work licensed
+-under version 3 of the GNU Affero General Public License into a single
+-combined work, and to convey the resulting work.  The terms of this
+-License will continue to apply to the part which is the covered work,
+-but the special requirements of the GNU Affero General Public License,
+-section 13, concerning interaction through a network will apply to the
+-combination as such.
+-
+-  14. Revised Versions of this License.
+-
+-  The Free Software Foundation may publish revised and/or new versions of
+-the GNU General Public License from time to time.  Such new versions will
+-be similar in spirit to the present version, but may differ in detail to
+-address new problems or concerns.
+-
+-  Each version is given a distinguishing version number.  If the
+-Program specifies that a certain numbered version of the GNU General
+-Public License "or any later version" applies to it, you have the
+-option of following the terms and conditions either of that numbered
+-version or of any later version published by the Free Software
+-Foundation.  If the Program does not specify a version number of the
+-GNU General Public License, you may choose any version ever published
+-by the Free Software Foundation.
+-
+-  If the Program specifies that a proxy can decide which future
+-versions of the GNU General Public License can be used, that proxy's
+-public statement of acceptance of a version permanently authorizes you
+-to choose that version for the Program.
+-
+-  Later license versions may give you additional or different
+-permissions.  However, no additional obligations are imposed on any
+-author or copyright holder as a result of your choosing to follow a
+-later version.
+-
+-  15. Disclaimer of Warranty.
+-
+-  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+-APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+-IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+-
+-  16. Limitation of Liability.
+-
+-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+-SUCH DAMAGES.
+-
+-  17. Interpretation of Sections 15 and 16.
+-
+-  If the disclaimer of warranty and limitation of liability provided
+-above cannot be given local legal effect according to their terms,
+-reviewing courts shall apply local law that most closely approximates
+-an absolute waiver of all civil liability in connection with the
+-Program, unless a warranty or assumption of liability accompanies a
+-copy of the Program in return for a fee.
+-
+-                     END OF TERMS AND CONDITIONS
+-
+-            How to Apply These Terms to Your New Programs
+-
+-  If you develop a new program, and you want it to be of the greatest
+-possible use to the public, the best way to achieve this is to make it
+-free software which everyone can redistribute and change under these terms.
+-
+-  To do so, attach the following notices to the program.  It is safest
+-to attach them to the start of each source file to most effectively
+-state the exclusion of warranty; and each file should have at least
+-the "copyright" line and a pointer to where the full notice is found.
+-
+-    <one line to give the program's name and a brief idea of what it does.>
+-    Copyright (C) <year>  <name of author>
+-
+-    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 3 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, see <http://www.gnu.org/licenses/>.
+-
+-Also add information on how to contact you by electronic and paper mail.
+-
+-  If the program does terminal interaction, make it output a short
+-notice like this when it starts in an interactive mode:
+-
+-    <program>  Copyright (C) <year>  <name of author>
+-    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+-    This is free software, and you are welcome to redistribute it
+-    under certain conditions; type `show c' for details.
+-
+-The hypothetical commands `show w' and `show c' should show the appropriate
+-parts of the General Public License.  Of course, your program's commands
+-might be different; for a GUI interface, you would use an "about box".
+-
+-  You should also get your employer (if you work as a programmer) or school,
+-if any, to sign a "copyright disclaimer" for the program, if necessary.
+-For more information on this, and how to apply and follow the GNU GPL, see
+-<http://www.gnu.org/licenses/>.
+-
+-  The GNU General Public License does not permit incorporating your program
+-into proprietary programs.  If your program is a subroutine library, you
+-may consider it more useful to permit linking proprietary applications with
+-the library.  If this is what you want to do, use the GNU Lesser General
+-Public License instead of this License.  But first, please read
+-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+Index: ../trunk-jpl/src/java/inishell.sh
+===================================================================
+--- ../trunk-jpl/src/java/inishell.sh	(revision 18297)
++++ ../trunk-jpl/src/java/inishell.sh	(revision 18298)
+@@ -1,8 +0,0 @@
+-#/bin/bash
+-#This is just the necessary command line to run a jar file
+-
+-#recover file name: 
+-xmlfilename=$1
+-
+-#call inishell
+-java -jar dist/inishell.jar $xmlfilename
Index: /issm/oecreview/Archive/18296-19100/ISSM-18302-18303.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18302-18303.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18302-18303.diff	(revision 19102)
@@ -0,0 +1,33 @@
+Index: ../trunk-jpl/src/m/classes/groundingline.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/groundingline.py	(revision 18302)
++++ ../trunk-jpl/src/m/classes/groundingline.py	(revision 18303)
+@@ -43,9 +43,9 @@
+ 				md.checkmessage("requesting grounding line migration, but bathymetry is absent!")
+ 			pos=numpy.nonzero(md.mask.groundedice_levelset>0.)[0]
+ 			if any(numpy.abs(md.geometry.base[pos]-md.geometry.bed[pos])>10**-10):
+-				md.checkmessage("bathymetry not equal to bed on grounded ice!")
++				md.checkmessage("base not equal to bed on grounded ice!")
+ 			if any(md.geometry.bed - md.geometry.base > 10**-9):
+-				md.checkmessage("bathymetry superior to bed on floating ice!")
++				md.checkmessage("bed superior to base on floating ice!")
+ 
+ 		return md
+ 	# }}}
+Index: ../trunk-jpl/src/m/classes/groundingline.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/groundingline.m	(revision 18302)
++++ ../trunk-jpl/src/m/classes/groundingline.m	(revision 18303)
+@@ -47,10 +47,10 @@
+ 				end
+ 				pos=find(md.mask.groundedice_levelset>0.);
+ 				if any(abs(md.geometry.base(pos)-md.geometry.bed(pos))>10^-10),
+-					md = checkmessage(md,['bathymetry not equal to bed on grounded ice!']);
++					md = checkmessage(md,['baase not equal to bed on grounded ice!']);
+ 				end
+ 				if any(md.geometry.bed - md.geometry.base > 10^-9),
+-					md = checkmessage(md,['bathymetry superior to bed on floating ice!']);
++					md = checkmessage(md,['bed superior to base on floating ice!']);
+ 				end
+ 			end
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18303-18304.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18303-18304.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18303-18304.diff	(revision 19102)
@@ -0,0 +1,72 @@
+Index: ../trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64.sh	(revision 18303)
++++ ../trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64.sh	(revision 18304)
+@@ -22,8 +22,9 @@
+ export DAK_SRC=$ISSM_DIR/externalpackages/dakota/src
+ export DAK_BUILD=$ISSM_DIR/externalpackages/dakota/build
+ cp $DAK_SRC/cmake/BuildDakotaTemplate.cmake $DAK_SRC/cmake/BuildDakotaCustom.cmake
+-patch $DAK_SRC/cmake/BuildDakotaCustom.cmake configs/5.3.1/BuildDakotaCustom.cmake.patch
++patch $DAK_SRC/cmake/BuildDakotaCustom.cmake configs/5.3.1/BuildDakotaCustom.cmake.mac.patch
+ patch $DAK_SRC/cmake/DakotaDev.cmake configs/5.3.1/DakotaDev.cmake.patch
++patch $DAK_SRC/CMakeLists.txt configs/5.3.1/CMakeLists.txt.patch
+ 
+ #Apply patches
+ patch src/src/ParallelLibrary.cpp configs/5.3.1/ParallelLibrary.cpp.patch
+@@ -32,9 +33,20 @@
+ patch src/src/NonDLocalReliability.cpp configs/5.3.1/NonDLocalReliability.cpp.patch
+ patch src/packages/pecos/src/pecos_global_defs.hpp configs/5.3.1/pecos_global_defs.hpp.patch
+ 
++export BOOST_ROOT=$ISSM_DIR/externalpackages/boost/install
++
+ #Configure dakota
++# Set your local gcc compiler here
+ cd $DAK_BUILD
+-cmake -D CMAKE_C_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-gcc -D CMAKE_CXX_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-g++ -D CMAKE_Fortran_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-gfortran -C $DAK_SRC/cmake/BuildDakotaCustom.cmake -C $DAK_SRC/cmake/DakotaDev.cmake $DAK_SRC
++cmake -DBoost_NO_BOOST_CMAKE=TRUE \
++    -DBoost_NO_SYSTEM_PATHS=TRUE \
++    -DBOOST_ROOT:PATHNAME=$BOOST_ROOT \
++    -DBoost_LIBRARY_DIRS:FILEPATH=${BOOST_ROOT}/lib \
++	 -DCMAKE_CXX_COMPILER=g++ -DCMAKE_CC_COMPILER=gcc \
++    -C $DAK_SRC/cmake/BuildDakotaCustom.cmake -C $DAK_SRC/cmake/DakotaDev.cmake $DAK_SRC
++
++#-DCMAKE_CXX_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-g++ -DCMAKE_Fortran_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-gfortran
++
+ cd ..
+ 
+ #Compile and install dakota
+Index: ../trunk-jpl/externalpackages/dakota/configs/5.3.1/BuildDakotaCustom.cmake.mac.patch
+===================================================================
+--- ../trunk-jpl/externalpackages/dakota/configs/5.3.1/BuildDakotaCustom.cmake.mac.patch	(revision 0)
++++ ../trunk-jpl/externalpackages/dakota/configs/5.3.1/BuildDakotaCustom.cmake.mac.patch	(revision 18304)
+@@ -0,0 +1,14 @@
++64,65c64,65
++< #set( DAKOTA_HAVE MPI ON
++< #     CACHE BOOL "Build with MPI enabled" FORCE)
++---
++> set( DAKOTA_HAVE MPI OFF
++>      CACHE BOOL "Build with MPI disabled" FORCE)
++91,93c91,93
++< #set( CMAKE_INSTALL_PREFIX
++< #     "/path/to/Dakota/installation"
++< #     CACHE PATH "Path to Dakota installation" )
++---
++> set( CMAKE_INSTALL_PREFIX
++>      "$ENV{ISSM_DIR}/externalpackages/dakota/install"
++>      CACHE PATH "Path to Dakota installation" )
+
+Property changes on: ../trunk-jpl/externalpackages/dakota/configs/5.3.1/BuildDakotaCustom.cmake.mac.patch
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/externalpackages/dakota/configs/5.3.1/CMakeLists.txt.patch
+===================================================================
+--- ../trunk-jpl/externalpackages/dakota/configs/5.3.1/CMakeLists.txt.patch	(revision 0)
++++ ../trunk-jpl/externalpackages/dakota/configs/5.3.1/CMakeLists.txt.patch	(revision 18304)
+@@ -0,0 +1,4 @@
++47a48,50
++> set(BUILD_STATIC_LIBS ON CACHE BOOL "Set to ON to build static libraries" FORCE)
++> set(BUILD_SHARED_LIBS OFF CACHE BOOL "Set to ON to build DSO libraries" FORCE)
++> 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18304-18305.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18304-18305.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18304-18305.diff	(revision 19102)
@@ -0,0 +1,42 @@
+Index: ../trunk-jpl/src/m/classes/groundingline.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/groundingline.m	(revision 18304)
++++ ../trunk-jpl/src/m/classes/groundingline.m	(revision 18305)
+@@ -47,7 +47,7 @@
+ 				end
+ 				pos=find(md.mask.groundedice_levelset>0.);
+ 				if any(abs(md.geometry.base(pos)-md.geometry.bed(pos))>10^-10),
+-					md = checkmessage(md,['baase not equal to bed on grounded ice!']);
++					md = checkmessage(md,['base not equal to bed on grounded ice!']);
+ 				end
+ 				if any(md.geometry.bed - md.geometry.base > 10^-9),
+ 					md = checkmessage(md,['bed superior to base on floating ice!']);
+Index: ../trunk-jpl/src/m/classes/clusters/greenplanet.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/greenplanet.m	(revision 18304)
++++ ../trunk-jpl/src/m/classes/clusters/greenplanet.m	(revision 18305)
+@@ -86,7 +86,9 @@
+ 			 fprintf(fid,'#PBS -M mmorligh@uci.edu\n');
+ 			 fprintf(fid,'#PBS -o %s.outlog \n',modelname);
+ 			 fprintf(fid,'#PBS -e %s.errlog \n\n',modelname);
+-			 %fprintf(fid,'cd %s/%s\n\n',cluster.executionpath,dirname);
++			 fprintf(fid,'export ISSM_DIR="%s/../"\n',cluster.codepath); %FIXME
++			 fprintf(fid,'source $ISSM_DIR/etc/environment.sh\n');       %FIXME
++			 fprintf(fid,'cd %s/%s\n\n',cluster.executionpath,modelname);
+ 			 fprintf(fid,'mpiexec -np %i %s/kriging.exe %s %s\n',cluster.np,cluster.codepath,[cluster.executionpath '/' modelname],modelname);
+ 			 if ~io_gather, %concatenate the output files:
+ 				 fprintf(fid,'cat %s.outbin.* > %s.outbin',modelname,modelname);
+Index: ../trunk-jpl/src/m/classes/clusters/pfe.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/pfe.m	(revision 18304)
++++ ../trunk-jpl/src/m/classes/clusters/pfe.m	(revision 18305)
+@@ -128,7 +128,8 @@
+ 			 fprintf(fid,'#PBS -o %s.outlog \n',modelname);
+ 			 fprintf(fid,'#PBS -e %s.errlog \n\n',modelname);
+ 			 fprintf(fid,'. /usr/share/modules/init/bash\n\n');
+-			 fprintf(fid,'module load comp-intel/2013.1.117\n');
++			 fprintf(fid,'module load comp-intel/11.1.046\n');
++			 fprintf(fid,'module load math/intel_mkl_64_10.0.011\n');
+ 			 fprintf(fid,'module load mpi-sgi/mpt.2.06rp16\n');
+ 			 fprintf(fid,'export PATH="$PATH:."\n\n');
+ 			 fprintf(fid,'export MPI_GROUP_MAX=64\n\n');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18305-18306.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18305-18306.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18305-18306.diff	(revision 19102)
@@ -0,0 +1,69 @@
+Index: ../trunk-jpl/externalpackages/boost/install-1.55-macosx-mavericks.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/boost/install-1.55-macosx-mavericks.sh	(revision 18305)
++++ ../trunk-jpl/externalpackages/boost/install-1.55-macosx-mavericks.sh	(revision 18306)
+@@ -21,20 +21,25 @@
+ mv boost_1_55_0/* src
+ rm -rf boost_1_55_0
+ 
+-patch src/boost/atomic/detail/cas128strong.hpp ./configs/1.55/cas128strong.hpp.patch
+-patch src/boost/atomic/detail/gcc-atomic.hpp ./configs/1.55/gcc-atomic.hpp.patch
++#patch src/boost/atomic/detail/cas128strong.hpp ./configs/1.55/cas128strong.hpp.patch
++#patch src/boost/atomic/detail/gcc-atomic.hpp ./configs/1.55/gcc-atomic.hpp.patch
++patch src/tools/build/v2/user-config.jam ./configs/1.55/user-config.jam.patch
++patch src/tools/build/v2/tools/darwin.jam ./configs/1.55/darwin.jam.patch
++patch src/tools/build/v2/tools/darwin.py ./configs/1.55/darwin.py.patch
+ 
+ #Configure and compile
+ cd src 
+ ./bootstrap.sh \
+ 	--prefix="$ISSM_DIR/externalpackages/boost/install" \
+-	--with-python=python3.2 \
++	--with-python=python2.7 \
+ 	--with-python-root="$ISSM_DIR/externalpackages/python/install" 
+ 
+ #Compile boost
+-./b2 toolset=clang cxxflags=-stdlib=libstdc++ linkflags=-stdlib=libstdc++ -j2 variant=release link=static threading=multi install
+-#./bjam install
++# Need gcc with iconv installed in a location that has been added to your path
++./bjam toolset=darwin-std0x link=static install
+ 
++#./b2 toolset=clang cxxflags=-stdlib=libstdc++ linkflags=-stdlib=libstdc++ -j2 variant=release link=static threading=multi instal
++
+ #put bjam into install also: 
+ mkdir ../install/bin
+ cp bjam ../install/bin
+Index: ../trunk-jpl/externalpackages/boost/configs/1.55/user-config.jam.patch
+===================================================================
+--- ../trunk-jpl/externalpackages/boost/configs/1.55/user-config.jam.patch	(revision 0)
++++ ../trunk-jpl/externalpackages/boost/configs/1.55/user-config.jam.patch	(revision 18306)
+@@ -0,0 +1,4 @@
++42c42
++< # using gcc ;
++---
++> using darwin : std0x : "/usr/local/gfortran/bin/x86_64-apple-darwin10-g++" : <cxxflags>-std=gnu++0x;  
+Index: ../trunk-jpl/externalpackages/boost/configs/1.55/darwin.jam.patch
+===================================================================
+--- ../trunk-jpl/externalpackages/boost/configs/1.55/darwin.jam.patch	(revision 0)
++++ ../trunk-jpl/externalpackages/boost/configs/1.55/darwin.jam.patch	(revision 18306)
+@@ -0,0 +1,4 @@
++587c587
++<     "$(.LIBTOOL)" -static -o "$(<:T)"  $(ARFLAGS)  "$(>:T)"
++---
++>     /usr/bin/libtool -static -o "$(<:T)"  $(ARFLAGS)  "$(>:T)"
+
+Property changes on: ../trunk-jpl/externalpackages/boost/configs/1.55/darwin.jam.patch
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/externalpackages/boost/configs/1.55/darwin.py.patch
+===================================================================
+--- ../trunk-jpl/externalpackages/boost/configs/1.55/darwin.py.patch	(revision 0)
++++ ../trunk-jpl/externalpackages/boost/configs/1.55/darwin.py.patch	(revision 18306)
+@@ -0,0 +1,4 @@
++40c40
++< toolset.flags ('darwin.compile', 'OPTIONS', None, ['-Wno-long-double', '-no-cpp-precomp'])
++---
++> toolset.flags ('darwin.compile', 'OPTIONS', None, ['-Wno-long-double'])
Index: /issm/oecreview/Archive/18296-19100/ISSM-18308-18309.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18308-18309.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18308-18309.diff	(revision 19102)
@@ -0,0 +1,147 @@
+Index: ../trunk-jpl/src/m/classes/flowequation.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/flowequation.py	(revision 18308)
++++ ../trunk-jpl/src/m/classes/flowequation.py	(revision 18309)
+@@ -72,34 +72,37 @@
+ 	#}}}
+ 	def checkconsistency(self,md,solution,analyses):    # {{{
+ 
+-		if StressbalanceAnalysisEnum() in analyses:
+-			md = checkfield(md,'fieldname','flowequation.isSIA','numel',[1],'values',[0,1])
+-			md = checkfield(md,'fieldname','flowequation.isSSA','numel',[1],'values',[0,1])
+-			md = checkfield(md,'fieldname','flowequation.isL1L2','numel',[1],'values',[0,1])
+-			md = checkfield(md,'fieldname','flowequation.isHO','numel',[1],'values',[0,1])
+-			md = checkfield(md,'fieldname','flowequation.isFS','numel',[1],'values',[0,1])
+-			md = checkfield(md,'fieldname','flowequation.fe_SSA','values',['P1','P1bubble','P1bubblecondensed','P2','P2bubble'])
+-			md = checkfield(md,'fieldname','flowequation.fe_HO' ,'values',['P1','P1bubble','P1bubblecondensed','P1xP2','P2xP1','P2','P2bubble','P1xP3','P2xP4'])
+-			md = checkfield(md,'fieldname','flowequation.fe_FS' ,'values',['P1P1','P1P1GLS','MINIcondensed','MINI','TaylorHood','XTaylorHood','OneLayerP4z','CrouzeixRaviart'])
+-			md = checkfield(md,'fieldname','flowequation.borderSSA','size',[md.mesh.numberofvertices],'values',[0,1])
+-			md = checkfield(md,'fieldname','flowequation.borderHO','size',[md.mesh.numberofvertices],'values',[0,1])
+-			md = checkfield(md,'fieldname','flowequation.borderFS','size',[md.mesh.numberofvertices],'values',[0,1])
+-			md = checkfield(md,'fieldname','flowequation.augmented_lagrangian_r','numel',[1],'>',0.)
+-			md = checkfield(md,'fieldname','flowequation.augmented_lagrangian_rhop','numel',[1],'>',0.)
+-			md = checkfield(md,'fieldname','flowequation.augmented_lagrangian_rlambda','numel',[1],'>',0.)
+-			md = checkfield(md,'fieldname','flowequation.augmented_lagrangian_rholambda','numel',[1],'>',0.)
+-			md = checkfield(md,'fieldname','flowequation.XTH_theta','numel',[1],'>=',0.,'<',.5)
+-			if m.strcmp(md.mesh.domaintype(),'2Dhorizontal'):
+-				md = checkfield(md,'fieldname','flowequation.vertex_equation','size',[md.mesh.numberofvertices],'values',[1,2])
+-				md = checkfield(md,'fieldname','flowequation.element_equation','size',[md.mesh.numberofelements],'values',[1,2])
+-			elif m.strcmp(md.mesh.domaintype(),'3D'):
+-				md = checkfield(md,'fieldname','flowequation.vertex_equation','size',[md.mesh.numberofvertices],'values',numpy.arange(0,8+1))
+-				md = checkfield(md,'fieldname','flowequation.element_equation','size',[md.mesh.numberofelements],'values',numpy.arange(0,8+1))
+-			else:
+-				raise RuntimeError('mesh type not supported yet')
+-			if not (self.isSIA or self.isSSA or self.isL1L2 or self.isHO or self.isFS):
+-				md.checkmessage("no element types set for this model")
++		#Early return
++		if (StressbalanceAnalysisEnum() not in analyses and StressbalanceSIAAnalysisEnum() not in analyses) or (solution==TransientSolutionEnum() and not md.transient.isstressbalance):
++			return md
+ 
++		md = checkfield(md,'fieldname','flowequation.isSIA','numel',[1],'values',[0,1])
++		md = checkfield(md,'fieldname','flowequation.isSSA','numel',[1],'values',[0,1])
++		md = checkfield(md,'fieldname','flowequation.isL1L2','numel',[1],'values',[0,1])
++		md = checkfield(md,'fieldname','flowequation.isHO','numel',[1],'values',[0,1])
++		md = checkfield(md,'fieldname','flowequation.isFS','numel',[1],'values',[0,1])
++		md = checkfield(md,'fieldname','flowequation.fe_SSA','values',['P1','P1bubble','P1bubblecondensed','P2','P2bubble'])
++		md = checkfield(md,'fieldname','flowequation.fe_HO' ,'values',['P1','P1bubble','P1bubblecondensed','P1xP2','P2xP1','P2','P2bubble','P1xP3','P2xP4'])
++		md = checkfield(md,'fieldname','flowequation.fe_FS' ,'values',['P1P1','P1P1GLS','MINIcondensed','MINI','TaylorHood','XTaylorHood','OneLayerP4z','CrouzeixRaviart'])
++		md = checkfield(md,'fieldname','flowequation.borderSSA','size',[md.mesh.numberofvertices],'values',[0,1])
++		md = checkfield(md,'fieldname','flowequation.borderHO','size',[md.mesh.numberofvertices],'values',[0,1])
++		md = checkfield(md,'fieldname','flowequation.borderFS','size',[md.mesh.numberofvertices],'values',[0,1])
++		md = checkfield(md,'fieldname','flowequation.augmented_lagrangian_r','numel',[1],'>',0.)
++		md = checkfield(md,'fieldname','flowequation.augmented_lagrangian_rhop','numel',[1],'>',0.)
++		md = checkfield(md,'fieldname','flowequation.augmented_lagrangian_rlambda','numel',[1],'>',0.)
++		md = checkfield(md,'fieldname','flowequation.augmented_lagrangian_rholambda','numel',[1],'>',0.)
++		md = checkfield(md,'fieldname','flowequation.XTH_theta','numel',[1],'>=',0.,'<',.5)
++		if m.strcmp(md.mesh.domaintype(),'2Dhorizontal'):
++			md = checkfield(md,'fieldname','flowequation.vertex_equation','size',[md.mesh.numberofvertices],'values',[1,2])
++			md = checkfield(md,'fieldname','flowequation.element_equation','size',[md.mesh.numberofelements],'values',[1,2])
++		elif m.strcmp(md.mesh.domaintype(),'3D'):
++			md = checkfield(md,'fieldname','flowequation.vertex_equation','size',[md.mesh.numberofvertices],'values',numpy.arange(0,8+1))
++			md = checkfield(md,'fieldname','flowequation.element_equation','size',[md.mesh.numberofelements],'values',numpy.arange(0,8+1))
++		else:
++			raise RuntimeError('mesh type not supported yet')
++		if not (self.isSIA or self.isSSA or self.isL1L2 or self.isHO or self.isFS):
++			md.checkmessage("no element types set for this model")
++
+ 		if StressbalanceSIAAnalysisEnum() in analyses:
+ 			if any(self.element_equation==1):
+ 				if numpy.any(numpy.logical_and(self.vertex_equation,md.mask.groundedice_levelset)):
+Index: ../trunk-jpl/src/m/classes/flowequation.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/flowequation.m	(revision 18308)
++++ ../trunk-jpl/src/m/classes/flowequation.m	(revision 18309)
+@@ -127,40 +127,41 @@
+ 		end % }}}
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+ 
+-			if ismember(StressbalanceAnalysisEnum(),analyses),
+ 
+-				md = checkfield(md,'fieldname','flowequation.isSIA','numel',[1],'values',[0 1]);
+-				md = checkfield(md,'fieldname','flowequation.isSSA','numel',[1],'values',[0 1]);
+-				md = checkfield(md,'fieldname','flowequation.isL1L2','numel',[1],'values',[0 1]);
+-				md = checkfield(md,'fieldname','flowequation.isHO','numel',[1],'values',[0 1]);
+-				md = checkfield(md,'fieldname','flowequation.isFS','numel',[1],'values',[0 1]);
+-				md = checkfield(md,'fieldname','flowequation.fe_SSA','values',{'P1','P1bubble','P1bubblecondensed','P2','P2bubble'});
+-				md = checkfield(md,'fieldname','flowequation.fe_HO' ,'values',{'P1','P1bubble','P1bubblecondensed','P1xP2','P2xP1','P2','P2bubble','P1xP3','P2xP4'});
+-				md = checkfield(md,'fieldname','flowequation.fe_FS' ,'values',{'P1P1','P1P1GLS','MINIcondensed','MINI','TaylorHood','LATaylorHood','XTaylorHood','OneLayerP4z','CrouzeixRaviart'});
+-				md = checkfield(md,'fieldname','flowequation.augmented_lagrangian_r','numel',[1],'>',0.);
+-				md = checkfield(md,'fieldname','flowequation.augmented_lagrangian_rlambda','numel',[1],'>',0.);
+-				md = checkfield(md,'fieldname','flowequation.augmented_lagrangian_rhop','numel',[1],'>',0.);
+-				md = checkfield(md,'fieldname','flowequation.augmented_lagrangian_rholambda','numel',[1],'>',0.);
+-				md = checkfield(md,'fieldname','flowequation.XTH_theta','numel',[1],'>=',0.,'<',0.5);
+-				md = checkfield(md,'fieldname','flowequation.borderSSA','size',[md.mesh.numberofvertices 1],'values',[0 1]);
+-				md = checkfield(md,'fieldname','flowequation.borderHO','size',[md.mesh.numberofvertices 1],'values',[0 1]);
+-				md = checkfield(md,'fieldname','flowequation.borderFS','size',[md.mesh.numberofvertices 1],'values',[0 1]);
+-				if strcmp(domaintype(md.mesh),'2Dhorizontal')
+-					md = checkfield(md,'fieldname','flowequation.vertex_equation','size',[md.mesh.numberofvertices 1],'values',[1:2]);
+-					md = checkfield(md,'fieldname','flowequation.element_equation','size',[md.mesh.numberofelements 1],'values',[1:2]);
+-				elseif strcmp(domaintype(md.mesh),'2Dvertical')
+-					md = checkfield(md,'fieldname','flowequation.vertex_equation','size',[md.mesh.numberofvertices 1],'values',[2,4,5]);
+-					md = checkfield(md,'fieldname','flowequation.element_equation','size',[md.mesh.numberofelements 1],'values',[2,4,5]);
+-				elseif strcmp(domaintype(md.mesh),'3D'),
+-					md = checkfield(md,'fieldname','flowequation.vertex_equation','size',[md.mesh.numberofvertices 1],'values',[0:8]);
+-					md = checkfield(md,'fieldname','flowequation.element_equation','size',[md.mesh.numberofelements 1],'values',[0:8]);
+-				else
+-					error('Case not supported yet');
+-				end
+-				if ~(obj.isSIA || obj.isSSA || obj.isL1L2 || obj.isHO || obj.isFS),
+-					md = checkmessage(md,['no element types set for this model']);
+-				end
++			%Early return
++			if (~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(StressbalanceSIAAnalysisEnum(),analyses)) | (solution==TransientSolutionEnum() & md.transient.isstressbalance==0), return; end
++
++			md = checkfield(md,'fieldname','flowequation.isSIA','numel',[1],'values',[0 1]);
++			md = checkfield(md,'fieldname','flowequation.isSSA','numel',[1],'values',[0 1]);
++			md = checkfield(md,'fieldname','flowequation.isL1L2','numel',[1],'values',[0 1]);
++			md = checkfield(md,'fieldname','flowequation.isHO','numel',[1],'values',[0 1]);
++			md = checkfield(md,'fieldname','flowequation.isFS','numel',[1],'values',[0 1]);
++			md = checkfield(md,'fieldname','flowequation.fe_SSA','values',{'P1','P1bubble','P1bubblecondensed','P2','P2bubble'});
++			md = checkfield(md,'fieldname','flowequation.fe_HO' ,'values',{'P1','P1bubble','P1bubblecondensed','P1xP2','P2xP1','P2','P2bubble','P1xP3','P2xP4'});
++			md = checkfield(md,'fieldname','flowequation.fe_FS' ,'values',{'P1P1','P1P1GLS','MINIcondensed','MINI','TaylorHood','LATaylorHood','XTaylorHood','OneLayerP4z','CrouzeixRaviart'});
++			md = checkfield(md,'fieldname','flowequation.augmented_lagrangian_r','numel',[1],'>',0.);
++			md = checkfield(md,'fieldname','flowequation.augmented_lagrangian_rlambda','numel',[1],'>',0.);
++			md = checkfield(md,'fieldname','flowequation.augmented_lagrangian_rhop','numel',[1],'>',0.);
++			md = checkfield(md,'fieldname','flowequation.augmented_lagrangian_rholambda','numel',[1],'>',0.);
++			md = checkfield(md,'fieldname','flowequation.XTH_theta','numel',[1],'>=',0.,'<',0.5);
++			md = checkfield(md,'fieldname','flowequation.borderSSA','size',[md.mesh.numberofvertices 1],'values',[0 1]);
++			md = checkfield(md,'fieldname','flowequation.borderHO','size',[md.mesh.numberofvertices 1],'values',[0 1]);
++			md = checkfield(md,'fieldname','flowequation.borderFS','size',[md.mesh.numberofvertices 1],'values',[0 1]);
++			if strcmp(domaintype(md.mesh),'2Dhorizontal')
++				md = checkfield(md,'fieldname','flowequation.vertex_equation','size',[md.mesh.numberofvertices 1],'values',[1:2]);
++				md = checkfield(md,'fieldname','flowequation.element_equation','size',[md.mesh.numberofelements 1],'values',[1:2]);
++			elseif strcmp(domaintype(md.mesh),'2Dvertical')
++				md = checkfield(md,'fieldname','flowequation.vertex_equation','size',[md.mesh.numberofvertices 1],'values',[2,4,5]);
++				md = checkfield(md,'fieldname','flowequation.element_equation','size',[md.mesh.numberofelements 1],'values',[2,4,5]);
++			elseif strcmp(domaintype(md.mesh),'3D'),
++				md = checkfield(md,'fieldname','flowequation.vertex_equation','size',[md.mesh.numberofvertices 1],'values',[0:8]);
++				md = checkfield(md,'fieldname','flowequation.element_equation','size',[md.mesh.numberofelements 1],'values',[0:8]);
++			else
++				error('Case not supported yet');
+ 			end
++			if ~(obj.isSIA || obj.isSSA || obj.isL1L2 || obj.isHO || obj.isFS),
++				md = checkmessage(md,['no element types set for this model']);
++			end
+ 			if ismember(StressbalanceSIAAnalysisEnum(),analyses),
+ 				if any(obj.element_equation==1),
+ 					if(obj.vertex_equation & md.mask.groundedice_levelset<0.),
Index: /issm/oecreview/Archive/18296-19100/ISSM-18309-18310.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18309-18310.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18309-18310.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/classes/taoinversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/taoinversion.m	(revision 18309)
++++ ../trunk-jpl/src/m/classes/taoinversion.m	(revision 18310)
+@@ -87,7 +87,7 @@
+ 			md = checkfield(md,'fieldname','inversion.gatol','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.grtol','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.gttol','numel',1,'>=',0);
+-			md = checkfield(md,'fieldname','inversion.algorithm','values',{'tao_blmvm','tao_cg','tao_lmvm'});
++			md = checkfield(md,'fieldname','inversion.algorithm','values',{'tao_blmvm','tao_cg','tao_lmvm','blmvm','cg','lmvm'});
+ 			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:506]);
+ 			md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18310-18311.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18310-18311.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18310-18311.diff	(revision 19102)
@@ -0,0 +1,36 @@
+Index: ../trunk-jpl/src/c/analyses/MeltingAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/MeltingAnalysis.cpp	(revision 18310)
++++ ../trunk-jpl/src/c/analyses/MeltingAnalysis.cpp	(revision 18311)
+@@ -39,7 +39,6 @@
+ 		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
+ 		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
+ 	}
+-	iomodel->FetchDataToInput(elements,FlowequationElementEquationEnum);
+ 	iomodel->FetchDataToInput(elements,MaterialsRheologyBEnum);
+ 	iomodel->FetchDataToInput(elements,MaterialsRheologyNEnum);
+ 	iomodel->FetchDataToInput(elements,BasalforcingsGroundediceMeltingRateEnum);
+Index: ../trunk-jpl/src/c/analyses/ThermalAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/ThermalAnalysis.cpp	(revision 18310)
++++ ../trunk-jpl/src/c/analyses/ThermalAnalysis.cpp	(revision 18311)
+@@ -60,7 +60,6 @@
+ 		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
+ 		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
+ 	}
+-	iomodel->FetchDataToInput(elements,FlowequationElementEquationEnum);
+ 	iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
+ 	iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
+ 	iomodel->FetchDataToInput(elements,MaterialsRheologyBEnum);
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18310)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18311)
+@@ -61,7 +61,6 @@
+ 		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
+ 		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
+ 	}
+-	iomodel->FetchDataToInput(elements,FlowequationElementEquationEnum);
+ 	iomodel->FetchDataToInput(elements,MaterialsRheologyBEnum);
+ 	iomodel->FetchDataToInput(elements,MaterialsRheologyNEnum);
+ 	iomodel->FetchDataToInput(elements,PressureEnum);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18313-18314.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18313-18314.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18313-18314.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 18313)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 18314)
+@@ -864,7 +864,7 @@
+ libISSMModules_la_SOURCES += $(kml_sources)
+ endif
+ libISSMModules_la_CXXFLAGS = $(ALLCXXFLAGS)
+-libISSMModules_la_LIBADD = ./libISSMCore.la
++libISSMModules_la_LIBADD = ./libISSMCore.la $(TRIANGLELIB)
+ endif
+ 
+ if VERSION
Index: /issm/oecreview/Archive/18296-19100/ISSM-18314-18315.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18314-18315.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18314-18315.diff	(revision 19102)
@@ -0,0 +1,16 @@
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 18314)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 18315)
+@@ -713,9 +713,9 @@
+ 					./classes/kriging/Observation.h\
+ 					./classes/kriging/Observation.cpp\
+ 					./modules/Krigingx/Krigingx.cpp\
+-					./modules/Krigingx/Krigingx.h
++					./modules/Krigingx/Krigingx.h\
++					./modules/Krigingx/pKrigingx.cpp
+ issm_sources +=$(kriging_sources)
+-#issm_sources +=./modules/Krigingx/pKrigingx.cpp
+ endif
+ #}}}
+ #Kml sources  {{{
Index: /issm/oecreview/Archive/18296-19100/ISSM-18315-18316.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18315-18316.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18315-18316.diff	(revision 19102)
@@ -0,0 +1,15 @@
+Index: ../trunk-jpl/src/wrappers/matlab/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/wrappers/matlab/Makefile.am	(revision 18315)
++++ ../trunk-jpl/src/wrappers/matlab/Makefile.am	(revision 18316)
+@@ -97,6 +97,10 @@
+ deps += $(ADOLCLIB)
+ endif
+ 
++if FORTRAN
++deps += $(FLIBS) $(FORTRANLIB)
++endif
++
+ #MEXLIB needs to be the last (undefined references on larsen)
+ deps += ${MEXLIB}
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18316-18317.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18316-18317.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18316-18317.diff	(revision 19102)
@@ -0,0 +1,26 @@
+Index: ../trunk-jpl/test/NightlyRun/test513.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test513.py	(revision 18316)
++++ ../trunk-jpl/test/NightlyRun/test513.py	(revision 18317)
+@@ -35,7 +35,7 @@
+ 
+ # Fields and tolerances to track changes
+ field_names     =['Gradient','Misfits','FrictionCoefficient','Pressure','Vel','Vx','Vy','Vz','Temperature','BasalforcingsGroundediceMeltingRate']
+-field_tolerances=[1e-09,2e-10,1e-10,1e-10,3e-6,3e-6,3e-6,3e-6,2e-6,2e-06]
++field_tolerances=[5e-08,2e-10,1e-10,1e-10,3e-6,3e-6,3e-6,3e-6,2e-6,2e-06]
+ field_values=[\
+ 	md.results.SteadystateSolution.Gradient1,\
+ 	md.results.SteadystateSolution.J,\
+Index: ../trunk-jpl/test/NightlyRun/test513.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test513.m	(revision 18316)
++++ ../trunk-jpl/test/NightlyRun/test513.m	(revision 18317)
+@@ -24,7 +24,7 @@
+ 
+ %Fields and tolerances to track changes
+ field_names     ={'Gradient','Misfits','FrictionCoefficient','Pressure','Vel','Vx','Vy','Vz','Temperature','BasalforcingsGroundediceMeltingRate'};
+-field_tolerances={1e-09,2e-10,1e-10,1e-10,3e-6,3e-6,3e-6,3e-6,2e-6,2e-06};
++field_tolerances={5e-08,2e-10,1e-10,1e-10,3e-6,3e-6,3e-6,3e-6,2e-6,2e-06};
+ field_values={...
+ 	(md.results.SteadystateSolution.Gradient1),...
+ 	md.results.SteadystateSolution.J,...
Index: /issm/oecreview/Archive/18296-19100/ISSM-18317-18318.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18317-18318.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18317-18318.diff	(revision 19102)
@@ -0,0 +1,236 @@
+Index: ../trunk-jpl/m4/issm_options.m4
+===================================================================
+--- ../trunk-jpl/m4/issm_options.m4	(revision 18317)
++++ ../trunk-jpl/m4/issm_options.m4	(revision 18318)
+@@ -1622,6 +1622,20 @@
+ 	dnl }}}
+ 
+ 	dnl Capabilities
++	dnl with-bamg{{{
++	AC_ARG_WITH([bamg],
++		AS_HELP_STRING([--with-bamg = YES],[compile with bamg capabilities (default is yes)]),
++		[BAMG=$withval],[BAMG=yes]) 
++	AC_MSG_CHECKING(for bamg capability compilation)
++
++	HAVE_BAMG=no
++	if test "x$BAMG" = "xyes"; then
++		HAVE_BAMG=yes
++		AC_DEFINE([_HAVE_BAMG_],[1],[with bamg meshing capability])
++	fi
++	AM_CONDITIONAL([BAMG], [test x$HAVE_BAMG = xyes])
++	AC_MSG_RESULT($HAVE_BAMG)
++	dnl }}}
+ 	dnl with-kml{{{
+ 	AC_ARG_WITH([kml],
+ 		AS_HELP_STRING([--with-kml = YES],[compile with kml capabilities (default is yes)]),
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 18317)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 18318)
+@@ -458,6 +458,75 @@
+ 					  ./cores/DakotaSpawnCore.cpp
+ endif
+ #}}}
++#BAMG sources  {{{
++if BAMG
++issm_sources += ./bamg/bamgobjects.h\
++					 ./bamg/BamgGeom.h\
++					 ./bamg/BamgGeom.cpp\
++					 ./bamg/BamgMesh.h\
++					 ./bamg/BamgMesh.cpp\
++					 ./bamg/BamgOpts.h\
++					 ./bamg/BamgOpts.cpp\
++					 ./bamg/CrackedEdge.h\
++					 ./bamg/CrackedEdge.cpp\
++					 ./bamg/Curve.h\
++					 ./bamg/Curve.cpp\
++					 ./bamg/Direction.h\
++					 ./bamg/Direction.cpp\
++					 ./bamg/DoubleAndInt.h\
++					 ./bamg/Edge.h\
++					 ./bamg/Edge.cpp\
++					 ./bamg/GeomEdge.h\
++					 ./bamg/GeomEdge.cpp\
++					 ./bamg/GeomSubDomain.h\
++					 ./bamg/GeomSubDomain.cpp\
++					 ./bamg/GeomVertex.h\
++					 ./bamg/GeomVertex.cpp\
++					 ./bamg/Geometry.cpp\
++					 ./bamg/Geometry.h\
++					 ./bamg/ListofIntersectionTriangles.cpp\
++					 ./bamg/ListofIntersectionTriangles.h\
++					 ./bamg/EigenMetric.cpp\
++					 ./bamg/Metric.cpp\
++					 ./bamg/Metric.h\
++					 ./bamg/BamgQuadtree.cpp\
++					 ./bamg/BamgQuadtree.h\
++					 ./bamg/R2.h\
++					 ./bamg/SetOfE4.cpp\
++					 ./bamg/SetOfE4.h\
++					 ./bamg/SubDomain.h\
++					 ./bamg/SubDomain.cpp\
++					 ./bamg/AdjacentTriangle.h\
++					 ./bamg/AdjacentTriangle.cpp\
++					 ./bamg/Triangle.cpp\
++					 ./bamg/det.h \
++					 ./bamg/Triangle.h\
++					 ./bamg/BamgVertex.cpp\
++					 ./bamg/BamgVertex.h\
++					 ./bamg/VertexOnEdge.h\
++					 ./bamg/VertexOnEdge.cpp\
++					 ./bamg/VertexOnGeom.h\
++					 ./bamg/VertexOnGeom.cpp\
++					 ./bamg/VertexOnVertex.h\
++					 ./bamg/VertexOnVertex.cpp\
++					 ./bamg/Mesh.cpp\
++					 ./bamg/Mesh.h\
++					 ./shared/Bamg/Abs.h \
++					 ./shared/Bamg/BigPrimeNumber.h\
++					 ./shared/Bamg/BigPrimeNumber.cpp\
++					 ./shared/Bamg/BinaryRand.h \
++					 ./shared/Bamg/Exchange.h \
++					 ./shared/Bamg/extrema.h \
++					 ./shared/Bamg/HeapSort.h \
++					 ./shared/Bamg/OppositeAngle.h \
++					 ./modules/Bamgx/Bamgx.cpp\
++					 ./modules/Bamgx/Bamgx.h\
++					 ./modules/BamgConvertMeshx/BamgConvertMeshx.cpp\
++					 ./modules/BamgConvertMeshx/BamgConvertMeshx.h\
++					 ./modules/BamgTriangulatex/BamgTriangulatex.cpp\
++					 ./modules/BamgTriangulatex/BamgTriangulatex.h
++endif
++#}}}
+ #Petsc sources  {{{
+ if PETSC
+ issm_sources += ./toolkits/petsc\
+@@ -629,95 +698,8 @@
+ 
+ #Wrapper sources
+ #Bamg sources  {{{
+-bamg_sources =  ./bamg/bamgobjects.h\
+-					 ./bamg/BamgGeom.h\
+-					 ./bamg/BamgGeom.cpp\
+-					 ./bamg/BamgMesh.h\
+-					 ./bamg/BamgMesh.cpp\
+-					 ./bamg/BamgOpts.h\
+-					 ./bamg/BamgOpts.cpp\
+-					 ./bamg/CrackedEdge.h\
+-					 ./bamg/CrackedEdge.cpp\
+-					 ./bamg/Curve.h\
+-					 ./bamg/Curve.cpp\
+-					 ./bamg/Direction.h\
+-					 ./bamg/Direction.cpp\
+-					 ./bamg/DoubleAndInt.h\
+-					 ./bamg/Edge.h\
+-					 ./bamg/Edge.cpp\
+-					 ./bamg/GeomEdge.h\
+-					 ./bamg/GeomEdge.cpp\
+-					 ./bamg/GeomSubDomain.h\
+-					 ./bamg/GeomSubDomain.cpp\
+-					 ./bamg/GeomVertex.h\
+-					 ./bamg/GeomVertex.cpp\
+-					 ./bamg/Geometry.cpp\
+-					 ./bamg/Geometry.h\
+-					 ./bamg/ListofIntersectionTriangles.cpp\
+-					 ./bamg/ListofIntersectionTriangles.h\
+-					 ./bamg/EigenMetric.cpp\
+-					 ./bamg/Metric.cpp\
+-					 ./bamg/Metric.h\
+-					 ./bamg/BamgQuadtree.cpp\
+-					 ./bamg/BamgQuadtree.h\
+-					 ./bamg/R2.h\
+-					 ./bamg/SetOfE4.cpp\
+-					 ./bamg/SetOfE4.h\
+-					 ./bamg/SubDomain.h\
+-					 ./bamg/SubDomain.cpp\
+-					 ./bamg/AdjacentTriangle.h\
+-					 ./bamg/AdjacentTriangle.cpp\
+-					 ./bamg/Triangle.cpp\
+-					 ./bamg/det.h \
+-					 ./bamg/Triangle.h\
+-					 ./bamg/BamgVertex.cpp\
+-					 ./bamg/BamgVertex.h\
+-					 ./bamg/VertexOnEdge.h\
+-					 ./bamg/VertexOnEdge.cpp\
+-					 ./bamg/VertexOnGeom.h\
+-					 ./bamg/VertexOnGeom.cpp\
+-					 ./bamg/VertexOnVertex.h\
+-					 ./bamg/VertexOnVertex.cpp\
+-					 ./bamg/Mesh.cpp\
+-					 ./bamg/Mesh.h\
+-					 ./shared/Bamg/Abs.h \
+-					 ./shared/Bamg/BigPrimeNumber.h\
+-					 ./shared/Bamg/BigPrimeNumber.cpp\
+-					 ./shared/Bamg/BinaryRand.h \
+-					 ./shared/Bamg/Exchange.h \
+-					 ./shared/Bamg/extrema.h \
+-					 ./shared/Bamg/HeapSort.h \
+-					 ./shared/Bamg/OppositeAngle.h \
+-					 ./modules/Bamgx/Bamgx.cpp\
+-					 ./modules/Bamgx/Bamgx.h\
+-					 ./modules/BamgConvertMeshx/BamgConvertMeshx.cpp\
+-					 ./modules/BamgConvertMeshx/BamgConvertMeshx.h\
+-					 ./modules/BamgTriangulatex/BamgTriangulatex.cpp\
+-					 ./modules/BamgTriangulatex/BamgTriangulatex.h
++
+ #}}}
+-#Kriging sources  {{{
+-if KRIGING
+-kriging_sources = ./classes/kriging/Observations.h\
+-					./classes/kriging/Observations.cpp\
+-					./classes/kriging/Variogram.h \
+-					./classes/kriging/GaussianVariogram.h\
+-					./classes/kriging/GaussianVariogram.cpp\
+-					./classes/kriging/ExponentialVariogram.h\
+-					./classes/kriging/ExponentialVariogram.cpp\
+-					./classes/kriging/SphericalVariogram.h\
+-					./classes/kriging/SphericalVariogram.cpp\
+-					./classes/kriging/PowerVariogram.h\
+-					./classes/kriging/PowerVariogram.cpp\
+-					./classes/kriging/Quadtree.h\
+-					./classes/kriging/Quadtree.cpp\
+-					./classes/kriging/Observation.h\
+-					./classes/kriging/Observation.cpp\
+-					./modules/Krigingx/Krigingx.cpp\
+-					./modules/Krigingx/Krigingx.h\
+-					./modules/Krigingx/pKrigingx.cpp
+-issm_sources +=$(kriging_sources)
+-endif
+-#}}}
+ #Kml sources  {{{
+ kml_sources = ./modules/Exp2Kmlx/Exp2Kmlx.h\
+ 				  ./modules/Exp2Kmlx/Exp2Kmlx.cpp\
+@@ -844,7 +826,33 @@
+ 						./modules/Scotchx/Scotchx.h
+ endif
+ #}}}
++
++#kriging (WRAPPER and executable)
++#Kriging sources  {{{
++if KRIGING
++issm_sources +=./classes/kriging/Observations.h\
++					./classes/kriging/Observations.cpp\
++					./classes/kriging/Variogram.h \
++					./classes/kriging/GaussianVariogram.h\
++					./classes/kriging/GaussianVariogram.cpp\
++					./classes/kriging/ExponentialVariogram.h\
++					./classes/kriging/ExponentialVariogram.cpp\
++					./classes/kriging/SphericalVariogram.h\
++					./classes/kriging/SphericalVariogram.cpp\
++					./classes/kriging/PowerVariogram.h\
++					./classes/kriging/PowerVariogram.cpp\
++					./classes/kriging/Quadtree.h\
++					./classes/kriging/Quadtree.cpp\
++					./classes/kriging/Observation.h\
++					./classes/kriging/Observation.cpp\
++					./modules/Krigingx/pKrigingx.cpp
++
++modules_sources +=./modules/Krigingx/Krigingx.cpp\
++						./modules/Krigingx/Krigingx.h\
++						./modules/Krigingx/pKrigingx.cpp
++endif
+ #}}}
++#}}}
+ #Library flags and sources {{{
+ ALLCXXFLAGS= -fPIC -D_GNU_SOURCE -fno-omit-frame-pointer -pthread -D_CPP_  $(CXXFLAGS) $(CXXOPTFLAGS) 
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18318-18319.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18318-18319.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18318-18319.diff	(revision 19102)
@@ -0,0 +1,48 @@
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 18318)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 18319)
+@@ -854,7 +854,7 @@
+ #}}}
+ #}}}
+ #Library flags and sources {{{
+-ALLCXXFLAGS= -fPIC -D_GNU_SOURCE -fno-omit-frame-pointer -pthread -D_CPP_  $(CXXFLAGS) $(CXXOPTFLAGS) 
++ALLCXXFLAGS= -fPIC $(CXXFLAGS) $(CXXOPTFLAGS) 
+ 
+ libISSMCore_la_SOURCES  = $(issm_sources)
+ libISSMCore_la_CXXFLAGS = $(ALLCXXFLAGS) $(DAKOTAFLAGS)
+Index: ../trunk-jpl/src/wrappers/python/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/wrappers/python/Makefile.am	(revision 18318)
++++ ../trunk-jpl/src/wrappers/python/Makefile.am	(revision 18319)
+@@ -15,7 +15,7 @@
+ 				./io/CheckNumPythonArguments.cpp\
+ 				./io/FetchPythonData.cpp
+ 
+-ALLCXXFLAGS= -fPIC -D_GNU_SOURCE -fno-omit-frame-pointer -pthread -D_CPP_  -D_WRAPPERS_ $(CXXFLAGS) $(CXXOPTFLAGS) 
++ALLCXXFLAGS= -fPIC -D_WRAPPERS_ $(CXXFLAGS) $(CXXOPTFLAGS) 
+ libISSMPython_la_SOURCES = $(io_sources)
+ libISSMPython_la_CXXFLAGS= $(ALLCXXFLAGS)
+ #}}}
+Index: ../trunk-jpl/src/wrappers/matlab/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/wrappers/matlab/Makefile.am	(revision 18318)
++++ ../trunk-jpl/src/wrappers/matlab/Makefile.am	(revision 18319)
+@@ -15,7 +15,7 @@
+ 				./io/WriteMatlabData.cpp\
+ 				./io/FetchMatlabData.cpp
+ 
+-ALLCXXFLAGS= -fPIC -D_GNU_SOURCE -fno-omit-frame-pointer -pthread -D_CPP_ -D_WRAPPERS_ $(CXXFLAGS) $(CXXOPTFLAGS) 
++ALLCXXFLAGS= -fPIC -D_WRAPPERS_ $(CXXFLAGS) $(CXXOPTFLAGS) 
+ 
+ libISSMMatlab_la_SOURCES = $(io_sources)
+ libISSMMatlab_la_CXXFLAGS= $(ALLCXXFLAGS)
+@@ -89,7 +89,7 @@
+ AM_LDFLAGS += -Wl,-static
+ endif
+ 
+-AM_CXXFLAGS +=  -D_HAVE_MATLAB_MODULES_  -D_GNU_SOURCE -fPIC -fno-omit-frame-pointer -pthread
++AM_CXXFLAGS +=  -D_HAVE_MATLAB_MODULES_ -fPIC
+ 
+ deps += ./libISSMMatlab.la ../../c/libISSMModules.la ../../c/libISSMCore.la ./libISSMApi.la
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18319-18320.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18319-18320.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18319-18320.diff	(revision 19102)
@@ -0,0 +1,17 @@
+Index: ../trunk-jpl/src/m/plot/plot_section.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/plot_section.m	(revision 18319)
++++ ../trunk-jpl/src/m/plot/plot_section.m	(revision 18320)
+@@ -52,7 +52,11 @@
+ 		if exist(options,'resolution'),
+ 			resolution=getfieldvalue(options,'resolution');
+ 		else %Default resolution
+-			resolution=[1000 10*md.mesh.numberoflayers];
++			if is2d,
++				resolution=[1000 1];
++			else
++				resolution=[1000 10*md.mesh.numberoflayers];
++			end
+ 			disp(['plot_section warning: no resolution specified, use default resolution: [horizontal_resolution vertical_resolution]=[' num2str(resolution)  ']']);
+ 		end
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18320-18321.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18320-18321.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18320-18321.diff	(revision 19102)
@@ -0,0 +1,92 @@
+Index: ../trunk-jpl/jenkins/linux64_murdo
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_murdo	(revision 18320)
++++ ../trunk-jpl/jenkins/linux64_murdo	(revision 18321)
+@@ -8,9 +8,6 @@
+ #Nightly run name
+ NAME="ISSM matlab tests on Linux64 (murdo)"
+ 
+-#ISSM Architecture
+-ISSM_ARCH="linux-gnu-amd64"
+-
+ #ISSM CONFIGURATION 
+ ISSM_CONFIG='--prefix=$ISSM_DIR\
+ 	--with-matlab-dir=$MATLAB_DIR \
+Index: ../trunk-jpl/jenkins/linux64_murdo_ad
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_murdo_ad	(revision 18320)
++++ ../trunk-jpl/jenkins/linux64_murdo_ad	(revision 18321)
+@@ -7,9 +7,6 @@
+ #Nightly run name
+ NAME="ISSM tests on Linux64 (murdo). Automatic differentiation validation tests"
+ 
+-#ISSM Architecture
+-ISSM_ARCH="linux-gnu-amd64"
+-
+ #ISSM CONFIGURATION 
+ ISSM_CONFIG='--prefix=$ISSM_DIR\
+ 				--prefix=$ISSM_DIR \
+Index: ../trunk-jpl/jenkins/linux64_murdo_ampi
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_murdo_ampi	(revision 18320)
++++ ../trunk-jpl/jenkins/linux64_murdo_ampi	(revision 18321)
+@@ -8,9 +8,6 @@
+ #Nightly run name
+ NAME="ISSM tests on Linux64 (murdo). Automatic differentiation validation tests with ampi"
+ 
+-#ISSM Architecture
+-ISSM_ARCH="linux-gnu-amd64"
+-
+ #ISSM CONFIGURATION 
+ ISSM_CONFIG='--prefix=$ISSM_DIR\
+ 				  --without-kriging \
+Index: ../trunk-jpl/jenkins/imac-012301-gil
+===================================================================
+--- ../trunk-jpl/jenkins/imac-012301-gil	(revision 18320)
++++ ../trunk-jpl/jenkins/imac-012301-gil	(revision 18321)
+@@ -8,9 +8,6 @@
+ #Nightly run name
+ NAME="ISSM matlab tests on MacOSX"
+ 
+-#ISSM Architecture
+-ISSM_ARCH="macosx-gnu"
+-
+ #ISSM CONFIGURATION 
+ ISSM_CONFIG='--prefix=$ISSM_DIR \
+ 	--with-matlab-dir=$MATLAB_DIR \
+Index: ../trunk-jpl/jenkins/windows
+===================================================================
+--- ../trunk-jpl/jenkins/windows	(revision 18320)
++++ ../trunk-jpl/jenkins/windows	(revision 18321)
+@@ -8,9 +8,6 @@
+ #Nightly run name
+ NAME="ISSM matlab tests on Windows"
+ 
+-#ISSM Architecture
+-ISSM_ARCH="cygwin-intel"
+-
+ #ISSM CONFIGURATION 
+ ISSM_CONFIG='--prefix=$ISSM_DIR \
+    --disable-static \
+@@ -20,7 +17,6 @@
+ 	--with-triangle-dir="$ISSM_DIR/externalpackages/triangle/install" \
+ 	--with-metis-dir="$ISSM_DIR/externalpackages/metis/install" \
+ 	--with-petsc-dir="$ISSM_DIR/externalpackages/petsc/install" \
+-	--with-petsc-arch=$ISSM_ARCH  \
+ 	--with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install/lib/  \
+ 	--with-mpi-libdir="$ISSM_DIR/externalpackages/petsc/install/lib" \
+ 	--with-mpi-libflags="-Wl,libpetsc.lib" \
+Index: ../trunk-jpl/jenkins/linux64_larsen
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_larsen	(revision 18320)
++++ ../trunk-jpl/jenkins/linux64_larsen	(revision 18321)
+@@ -8,9 +8,6 @@
+ #Nightly run name
+ NAME="ISSM matlab tests on Linux64 (murdo)"
+ 
+-#ISSM Architecture
+-ISSM_ARCH="linux-gnu-amd64"
+-
+ #ISSM CONFIGURATION 
+ ISSM_CONFIG='--prefix=$ISSM_DIR\
+ 	--with-matlab-dir=$MATLAB_DIR \
Index: /issm/oecreview/Archive/18296-19100/ISSM-18321-18322.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18321-18322.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18321-18322.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/m4/issm_options.m4
+===================================================================
+--- ../trunk-jpl/m4/issm_options.m4	(revision 18321)
++++ ../trunk-jpl/m4/issm_options.m4	(revision 18322)
+@@ -666,7 +666,7 @@
+ 		if test "x$HAVE_ATLAS" = "xyes" ; then
+ 			GSLLIB="-dy -L$GSL_ROOT/lib -lgsl -L$ATLAS_ROOT/lib -lcblas -latlas -lm"
+ 		else
+-			GSLLIB="-dy -L$GSL_ROOT/lib -lgsl -lgslcblas -lm"
++			GSLLIB="-L$GSL_ROOT/lib -lgsl -lgslcblas -lm"
+ 		fi
+ 		AC_DEFINE([_HAVE_GSL_],[1],[with gsl in ISSM src])
+ 		AC_SUBST([GSLINCL])
Index: /issm/oecreview/Archive/18296-19100/ISSM-18327-18328.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18327-18328.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18327-18328.diff	(revision 19102)
@@ -0,0 +1,22 @@
+Index: ../trunk-jpl/externalpackages/m1qn3/install.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/m1qn3/install.sh	(revision 18327)
++++ ../trunk-jpl/externalpackages/m1qn3/install.sh	(revision 18328)
+@@ -31,7 +31,7 @@
+ 	ar -r libm1qn3.\$(LIB_EXT) \$(OBJECTS) 
+ 	ranlib libm1qn3.\$(LIB_EXT) 
+ %.o: %.f
+-	\$(FC) \$(FFLAGS) -c $< -o \$@
++	\$(FC) \$(FFLAGS) -fPIC -c $< -o \$@
+ clean: 
+ 	rm -rf *.o *.\$(LIB_EXT)
+ EOF
+@@ -51,7 +51,7 @@
+ 	ar -r libddot.\$(LIB_EXT) \$(OBJECTS) 
+ 	ranlib libddot.\$(LIB_EXT) 
+ %.o: %.f
+-	\$(FC) \$(FFLAGS) -c $< -o \$@
++	\$(FC) \$(FFLAGS) -fPIC -c $< -o \$@
+ clean: 
+ 	rm -rf *.o *.\$(LIB_EXT)
+ EOF
Index: /issm/oecreview/Archive/18296-19100/ISSM-18328-18329.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18328-18329.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18328-18329.diff	(revision 19102)
@@ -0,0 +1,66 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh	(revision 0)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh	(revision 18329)
+@@ -0,0 +1,54 @@
++#!/bin/bash
++set -eu
++
++#WARNING: make sure you have the right mpi:
++#mpi-selector --query
++#default:openmpi_intel-1.5.4_psm
++
++#Some cleanup
++rm -rf install petsc-3.5.1 src
++mkdir install src
++
++#Download from ISSM server
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.1.tar.gz' 'petsc-3.5.1.tar.gz'
++
++#Untar and move petsc to install directory
++tar -zxvf  petsc-3.5.1.tar.gz
++mv petsc-3.5.1/* src/
++rm -rf petsc-3.5.1
++
++#configure
++cd src
++./config/configure.py \
++ --prefix="$ISSM_DIR/externalpackages/petsc/install" \
++ --PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
++ --with-blas-lapack-dir="/opt/intel/mkl/10.2.4.032/" \
++ --with-mpi-dir="/sopt/mpi/openmpi-1.5.4_psm/intel/" \
++ --known-mpi-shared-libraries=1 \
++ --with-debugging=0 \
++ --with-valgrind=0 \
++ --with-batch=1  \
++ --with-shared-libraries=1 \
++ --download-metis=1 \
++ --download-parmetis=1 \
++ --download-scalapack=1 \
++ --download-mumps=1 \
++ --COPTFLAGS="-lmpi -O3" \
++ --FOPTFLAGS="-lmpi -O3" \
++ --CXXOPTFLAGS="-lmpi -O3"
++
++#prepare script to reconfigure petsc
++cat > script.queue << EOF
++#PBS -S /bin/bash
++#PBS -l nodes=1:ppn=1
++#PBS -q c6145
++#PBS -l walltime=10
++
++cd $(echo $ISSM_DIR)/externalpackages/petsc/src/
++mpiexec -np 1 ./conftest-arch-linux2-c-opt
++EOF
++
++#print instructions
++echo "== Now: cd src/ "
++echo "== qsub script.queue "
++echo "== Then run reconfigure script generated by PETSc and follow instructions"
+
+Property changes on: ../trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18329-18330.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18329-18330.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18329-18330.diff	(revision 19102)
@@ -0,0 +1,30 @@
+Index: ../trunk-jpl/etc/environment.csh
+===================================================================
+--- ../trunk-jpl/etc/environment.csh	(revision 18329)
++++ ../trunk-jpl/etc/environment.csh	(revision 18330)
+@@ -42,10 +42,17 @@
+ #Dakota
+ set DAKOTA_DIR="$ISSM_DIR/externalpackages/dakota/install"
+ if (-d $DAKOTA_DIR) then
+-	setenv PATH {$PATH}:{$DAKOTA_DIR}/bin
++	setenv PATH {$DAKOTA_DIR}/bin:{$PATH}
+ 	setenv MANPATH {$MANPATH}:{$MPI_DIR}/man:{$DAKOTA_DIR}/docs/man:{$DAKOTA_DIR}/docs/man-ref
+ endif
+ 
++#Boost
++set BOOST_DIR="$ISSM_DIR/externalpackages/boost/install"
++set BOOSTROOT="$ISSM_DIR/externalpackages/boost/install"
++if (-d $BOOST_DIR) then
++   setenv PATH {$BOOST_DIR}/bin:{$PATH}
++endif
++
+ #Doxygen
+ set DOXYGEN_DIR="$ISSM_DIR/externalpackages/doxygen/install"
+ if (-d $DOXYGEN_DIR) then
+@@ -99,5 +106,5 @@
+ #SHELL2JUNIT
+ set SHELL2JUNIT_DIR="$ISSM_DIR/externalpackages/shell2junit"
+ if (-d $SHELL2JUNIT_DIR) then
+-	setenv PATH {$PATH}:{$SHELL2JUNIT_DIR}/install
++	setenv PATH {$SHELL2JUNIT_DIR}/install:{$PATH}
+ endif
Index: /issm/oecreview/Archive/18296-19100/ISSM-18330-18331.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18330-18331.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18330-18331.diff	(revision 19102)
@@ -0,0 +1,63 @@
+Index: ../trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64-snowleopard.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64-snowleopard.sh	(revision 0)
++++ ../trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64-snowleopard.sh	(revision 18331)
+@@ -0,0 +1,51 @@
++#!/bin/bash
++set -eu
++
++#Some cleanup
++rm -rf Dakota
++rm -rf src 
++rm -rf build 
++rm -rf install 
++mkdir src build install 
++
++#Download from ISSM server
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/dakota-5.3.1-public-src.tar.gz' 'dakota-5.3.1-public-src.tar.gz'
++
++#Untar 
++tar -zxvf dakota-5.3.1-public-src.tar.gz
++
++#Move Dakota to src directory
++mv dakota-5.3.1.src/* src
++rm -rf dakota-5.3.1.src
++
++#Set up Dakota cmake variables and config
++export DAK_SRC=$ISSM_DIR/externalpackages/dakota/src
++export DAK_BUILD=$ISSM_DIR/externalpackages/dakota/build
++cp $DAK_SRC/cmake/BuildDakotaTemplate.cmake $DAK_SRC/cmake/BuildDakotaCustom.cmake
++patch $DAK_SRC/cmake/BuildDakotaCustom.cmake configs/5.3.1/BuildDakotaCustom.cmake.patch
++patch $DAK_SRC/cmake/DakotaDev.cmake configs/5.3.1/DakotaDev.cmake.patch
++
++#Apply patches
++patch src/src/ParallelLibrary.cpp configs/5.3.1/ParallelLibrary.cpp.patch
++patch src/src/ParallelLibrary.hpp configs/5.3.1/ParallelLibrary.hpp.patch
++patch src/src/NonDSampling.cpp configs/5.3.1/NonDSampling.cpp.patch
++patch src/src/NonDLocalReliability.cpp configs/5.3.1/NonDLocalReliability.cpp.patch
++patch src/packages/pecos/src/pecos_global_defs.hpp configs/5.3.1/pecos_global_defs.hpp.patch
++
++#Configure dakota
++cd $DAK_BUILD
++#cmake -D CMAKE_C_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-gcc -D CMAKE_CXX_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-g++ -D CMAKE_Fortran_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-gfortran -D BOOST_ROOT=/opt/local -D Boost_INCLUDE_DIR=/opt/local/include -C $DAK_SRC/cmake/BuildDakotaCustom.cmake -C $DAK_SRC/cmake/DakotaDev.cmake $DAK_SRC
++cmake -D CMAKE_C_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-gcc -D CMAKE_CXX_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-g++ -D CMAKE_Fortran_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-gfortran -D LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH -D LDFLAGS="-L/usr/lib -lstdc++" -C $DAK_SRC/cmake/BuildDakotaCustom.cmake -C $DAK_SRC/cmake/DakotaDev.cmake $DAK_SRC
++cd ..
++
++#Compile and install dakota
++cd $DAK_BUILD
++if [ $# -eq 0 ];
++then
++	make
++	make install
++else
++	make -j $1
++	make -j $1 install
++fi
++cd ..
+
+Property changes on: ../trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64-snowleopard.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18331-18332.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18331-18332.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18331-18332.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 18331)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 18332)
+@@ -852,7 +852,6 @@
+ 						./modules/Krigingx/pKrigingx.cpp
+ endif
+ #}}}
+-#}}}
+ #Library flags and sources {{{
+ ALLCXXFLAGS= -fPIC $(CXXFLAGS) $(CXXOPTFLAGS) 
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18332-18333.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18332-18333.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18332-18333.diff	(revision 19102)
@@ -0,0 +1,16 @@
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 18332)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 18333)
+@@ -911,7 +911,10 @@
+ endif
+ 
+ #Standard libraries
+-LDADD = ./libISSMCore.la ./libISSMOverload.la ./libISSMModules.la $(TRIANGLELIB)
++LDADD = ./libISSMCore.la ./libISSMOverload.la
++if WRAPPERS
++LDADD += ./libISSMModules.la $(TRIANGLELIB)
++endif
+ 
+ #External packages
+ LDADD += $(PETSCLIB) $(TAOLIB) $(M1QN3LIB) $(PLAPACKLIB) $(MUMPSLIB) $(SUPERLULIB) $(SPOOLESLIB) $(SCALAPACKLIB) $(BLACSLIB) $(HYPRELIB) $(SPAILIB) $(PROMETHEUSLIB) $(PASTIXLIB) $(MLLIB) $(DAKOTALIB) $(METISLIB) $(CHACOLIB) $(SCOTCHLIB) $(BLASLAPACKLIB) $(MKLLIB) $(MPILIB)  $(MATHLIB) $(GRAPHICSLIB) $(MULTITHREADINGLIB) $(OSLIBS) $(GSLLIB) $(AMPILIB) $(ADOLCLIB) $(MPILIB) $(METEOIOLIB) $(SNOWPACKLIB)
Index: /issm/oecreview/Archive/18296-19100/ISSM-18333-18334.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18333-18334.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18333-18334.diff	(revision 19102)
@@ -0,0 +1,25 @@
+Index: ../trunk-jpl/m4/issm_options.m4
+===================================================================
+--- ../trunk-jpl/m4/issm_options.m4	(revision 18333)
++++ ../trunk-jpl/m4/issm_options.m4	(revision 18334)
+@@ -126,6 +126,11 @@
+ 			export CXX=icpc
+ 			export CFLAGS=" -D_INTEL_LINUX_"
+ 			export CXXFLAGS=" -D_INTEL_LINUX_"
++		elif test $VENDOR = intel-gp; then
++			export CC=icc
++			export CXX=icpc
++			export CFLAGS=" -D_INTEL_LINUX_"
++			export CXXFLAGS=" -D_INTEL_LINUX_"
+ 		elif test $VENDOR = intel-discover; then
+ 			export CC=icc
+ 			export CXX=icpc
+@@ -1150,6 +1155,8 @@
+ 			MKLLIB=-L"$MKL_ROOT -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread"
+ 		elif test x$VENDOR = xintel-acenet; then
+ 			MKLLIB=-L"$MKL_ROOT -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -lm"
++		elif test x$VENDOR = xintel-gp; then
++			MKLLIB=-L"$MKL_ROOT -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -lm"
+ 		else
+ 			MKLLIB=-L"$MKL_ROOT -lmkl -lmkl_lapack -lmkl_scalapack_ilp64 -lmkl_blacs_sgimpt_ilp64 -lguide -lpthread"
+ 		fi
Index: /issm/oecreview/Archive/18296-19100/ISSM-18334-18335.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18334-18335.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18334-18335.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/jenkins/linux64_murdo_ampi
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_murdo_ampi	(revision 18334)
++++ ../trunk-jpl/jenkins/linux64_murdo_ampi	(revision 18335)
+@@ -97,7 +97,7 @@
+ 
+ #number of cpus used in ISSM installation and compilation (one is usually
+ #safer as some packages are very sensitive to parallel compilation)
+-NUMCPUS_INSTALL=8
++NUMCPUS_INSTALL=1
+ 
+ #number of cpus used in the nightly runs.
+ NUMCPUS_RUN=8
Index: /issm/oecreview/Archive/18296-19100/ISSM-18335-18336.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18335-18336.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18335-18336.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/plot/processdata.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/processdata.m	(revision 18335)
++++ ../trunk-jpl/src/m/plot/processdata.m	(revision 18336)
+@@ -24,7 +24,7 @@
+ 		disp(['   ' num2str(i) ': ' F{i} ]);
+ 	end
+ 	choice=input(['please enter the field number? (between 1 and ' num2str(numel(F)) ')  ']);
+-	[data datatype]=processdata(md,data.(F{choice}),options);
++	[data datatype]=processdata(md,data(1).(F{choice}),options);
+ end
+ 
+ %Process NaN if any (do not know before mask is applied)
Index: /issm/oecreview/Archive/18296-19100/ISSM-18336-18337.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18336-18337.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18336-18337.diff	(revision 19102)
@@ -0,0 +1,67 @@
+Index: ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18336)
++++ ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18337)
+@@ -14,7 +14,6 @@
+ 	char**  requestedoutputs = NULL;
+ 
+ 	parameters->AddObject(iomodel->CopyConstantObject(FlowequationIsFSEnum));
+-
+ 	parameters->AddObject(iomodel->CopyConstantObject(MasstransportIsfreesurfaceEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(MasstransportHydrostaticAdjustmentEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(MasstransportStabilizationEnum));
+@@ -361,27 +360,34 @@
+ 					Bprime,dim,numnodes,0,
+ 					&Ke->values[0],1);
+ 
+-		if(stabilization==2){
+-			if(dim==1){
+-				vel=fabs(vx)+1.e-8;
+-				D[0]=h/(2*vel)*vx*vx;
+-			}
+-			else{
+-				/*Streamline upwinding*/
+-				vel=sqrt(vx*vx+vy*vy)+1.e-8;
+-				D[0*dim+0]=h/(2*vel)*vx*vx;
+-				D[1*dim+0]=h/(2*vel)*vy*vx;
+-				D[0*dim+1]=h/(2*vel)*vx*vy;
+-				D[1*dim+1]=h/(2*vel)*vy*vy;
+-			}
++		switch(stabilization){
++			case 0:
++				/*Nothing to be onde*/
++				break;
++			case 1:
++				/*SSA*/
++				vxaverage_input->GetInputAverage(&vx);
++				if(dim==2) vyaverage_input->GetInputAverage(&vy);
++				D[0*dim+0]=h/2.0*fabs(vx);
++				if(dim==2) D[1*dim+1]=h/2.0*fabs(vy);
++				break;
++			case 2:
++				if(dim==1){
++					vel=fabs(vx)+1.e-8;
++					D[0]=h/(2*vel)*vx*vx;
++				}
++				else{
++					/*Streamline upwinding*/
++					vel=sqrt(vx*vx+vy*vy)+1.e-8;
++					D[0*dim+0]=h/(2*vel)*vx*vx;
++					D[1*dim+0]=h/(2*vel)*vy*vx;
++					D[0*dim+1]=h/(2*vel)*vx*vy;
++					D[1*dim+1]=h/(2*vel)*vy*vy;
++				}
++				break;
++			default:
++				_error_("Stabilization "<<stabilization<<" not supported yet");
+ 		}
+-		else if(stabilization==1){
+-			/*SSA*/
+-			vxaverage_input->GetInputAverage(&vx);
+-			if(dim==2) vyaverage_input->GetInputAverage(&vy);
+-			D[0*dim+0]=h/2.0*fabs(vx);
+-			if(dim==2) D[1*dim+1]=h/2.0*fabs(vy);
+-		}
+ 		if(stabilization==1 || stabilization==2){
+ 			if(dim==1) D[0]=D_scalar*D[0];
+ 			else{
Index: /issm/oecreview/Archive/18296-19100/ISSM-18339-18340.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18339-18340.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18339-18340.diff	(revision 19102)
@@ -0,0 +1,346 @@
+Index: ../trunk-jpl/externalpackages/dakota/configs/5.3.1/CMakeLists.txt.pfe.patch
+===================================================================
+--- ../trunk-jpl/externalpackages/dakota/configs/5.3.1/CMakeLists.txt.pfe.patch	(revision 0)
++++ ../trunk-jpl/externalpackages/dakota/configs/5.3.1/CMakeLists.txt.pfe.patch	(revision 18340)
+@@ -0,0 +1,6 @@
++156c153,155
++< # TODO: Can't this be integrated into the following logic?
++---
++> # TODO: Can't this be integrated into the following logic?
++> set(BLAS_LIBS "-L/nasa/intel/mkl/10.0.011/lib/em64t/ -lmkl -lmkl_lapack -liomp5 -lpthread")
++> set(LAPACK_LIBS "-L/nasa/intel/mkl/10.0.011/lib/em64t/ -lmkl -lmkl_lapack -liomp5 -lpthread")
+Index: ../trunk-jpl/externalpackages/dakota/install-5.3.1-pleiades.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/dakota/install-5.3.1-pleiades.sh	(revision 0)
++++ ../trunk-jpl/externalpackages/dakota/install-5.3.1-pleiades.sh	(revision 18340)
+@@ -0,0 +1,51 @@
++#!/bin/bash
++set -eu
++
++#Some cleanup
++rm -rf Dakota
++rm -rf src 
++rm -rf build 
++rm -rf install 
++mkdir src build install 
++
++#Download from ISSM server
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/dakota-5.3.1-public-src.tar.gz' 'dakota-5.3.1-public-src.tar.gz'
++
++#Untar 
++tar -zxvf dakota-5.3.1-public-src.tar.gz
++
++#Move Dakota to src directory
++mv dakota-5.3.1.src/* src
++rm -rf dakota-5.3.1.src
++
++#Set up Dakota cmake variables and config
++export DAK_SRC=$ISSM_DIR/externalpackages/dakota/src
++export DAK_BUILD=$ISSM_DIR/externalpackages/dakota/build
++cp $DAK_SRC/cmake/BuildDakotaTemplate.cmake $DAK_SRC/cmake/BuildDakotaCustom.cmake
++patch $DAK_SRC/cmake/BuildDakotaCustom.cmake configs/5.3.1/BuildDakotaCustom.cmake.patch
++patch $DAK_SRC/cmake/DakotaDev.cmake configs/5.3.1/DakotaDev.cmake.patch
++patch $DAK_SRC/CMakeLists.txt configs/5.3.1/CMakeLists.txt.pfe.patch
++
++#Apply patches
++patch src/src/ParallelLibrary.cpp configs/5.3.1/ParallelLibrary.cpp.patch
++patch src/src/ParallelLibrary.hpp configs/5.3.1/ParallelLibrary.hpp.patch
++patch src/src/NonDSampling.cpp configs/5.3.1/NonDSampling.cpp.patch
++patch src/src/NonDLocalReliability.cpp configs/5.3.1/NonDLocalReliability.cpp.patch
++patch src/packages/pecos/src/pecos_global_defs.hpp configs/5.3.1/pecos_global_defs.hpp.patch
++
++#Configure dakota
++cd $DAK_BUILD
++cmake -C $DAK_SRC/cmake/BuildDakotaCustom.cmake -C $DAK_SRC/cmake/DakotaDev.cmake $DAK_SRC
++cd ..
++
++#Compile and install dakota
++cd $DAK_BUILD
++if [ $# -eq 0 ];
++then
++	make
++	make install
++else
++	make -j $1
++	make -j $1 install
++fi
++cd ..
+
+Property changes on: ../trunk-jpl/externalpackages/dakota/install-5.3.1-pleiades.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/externalpackages/petsc/install-3.4-pleiades-intel2012.0.032-mpt.2.06rp16
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.4-pleiades-intel2012.0.032-mpt.2.06rp16	(revision 18339)
++++ ../trunk-jpl/externalpackages/petsc/install-3.4-pleiades-intel2012.0.032-mpt.2.06rp16	(revision 18340)
+@@ -1,61 +0,0 @@
+-#!/bin/bash
+-
+-#Some cleanup
+-rm -rf install petsc-3.4.2 src
+-mkdir install src
+-
+-#Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.4.2.tar.gz' 'petsc-3.4.2.tar.gz'
+-
+-#Untar and move petsc to install directory
+-tar -zxvf  petsc-3.4.2.tar.gz
+-mv petsc-3.4.2/* src/
+-rm -rf petsc-3.4.2
+-
+-#configure
+-cd src
+-./config/configure.py \
+- --prefix="$ISSM_DIR/externalpackages/petsc/install" \
+- --PETSC_ARCH="$ISSM_ARCH" \
+- --PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
+- --with-batch=1  \
+- --with-debugging=0 \
+- --with-shared-libraries=1 \
+- --known-mpi-shared-libraries=1 \
+- --with-mpi=1 \
+- --with-mpi-lib="/nasa/sgi/mpt/2.06rp16/lib/libmpi.so" \
+- --with-mpi-include="/nasa/sgi/mpt/2.06rp16/include" \
+- --with-blas-lapack-dir="/nasa/intel/Compiler/2012.0.032/composer_xe_2011_sp1/mkl/lib/intel64" \
+- --download-scalapack=yes \
+- --download-blacs=yes \
+- --download-mumps=yes \
+- --download-metis=yes \
+- --download-parmetis=yes \
+- --download-trilinos=yes \
+- --download-euclid=yes \
+- --download-hypre=yes \
+- --COPTFLAGS="-lmpi -O3" \
+- --FOPTFLAGS="-lmpi -O3" \
+- --CXXOPTFLAGS="-lmpi -O3"
+-
+-#prepare script to reconfigure petsc
+-cat > script.queue << EOF
+-#PBS -S /bin/bash
+-#PBS -l select=1:ncpus=1:model=wes 
+-#PBS -l walltime=200 
+-#PBS -W group_list=s1010
+-#PBS -m e 
+-
+-. /usr/share/modules/init/bash 
+-module load comp-intel/2012.0.032
+-module load mpi-sgi/mpt.2.06rp16
+-
+-export PATH="$PATH:." 
+-export MPI_GROUP_MAX=64 
+-mpiexec -np 1 ./conftest-linux-gnu-ia64-intel.py
+-EOF
+-
+-#print instructions
+-echo "== Now: cd src/ "
+-echo "== qsub -q devel script.queue "
+-echo "== Then run reconfigure script generated by PETSc and follow instructions"
+Index: ../trunk-jpl/externalpackages/petsc/install-3.4-pleiades-intel2012.0.032-mpt.2.06rp16.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.4-pleiades-intel2012.0.032-mpt.2.06rp16.sh	(revision 0)
++++ ../trunk-jpl/externalpackages/petsc/install-3.4-pleiades-intel2012.0.032-mpt.2.06rp16.sh	(revision 18340)
+@@ -0,0 +1,61 @@
++#!/bin/bash
++
++#Some cleanup
++rm -rf install petsc-3.4.2 src
++mkdir install src
++
++#Download from ISSM server
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.4.2.tar.gz' 'petsc-3.4.2.tar.gz'
++
++#Untar and move petsc to install directory
++tar -zxvf  petsc-3.4.2.tar.gz
++mv petsc-3.4.2/* src/
++rm -rf petsc-3.4.2
++
++#configure
++cd src
++./config/configure.py \
++ --prefix="$ISSM_DIR/externalpackages/petsc/install" \
++ --PETSC_ARCH="$ISSM_ARCH" \
++ --PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
++ --with-batch=1  \
++ --with-debugging=0 \
++ --with-shared-libraries=1 \
++ --known-mpi-shared-libraries=1 \
++ --with-mpi=1 \
++ --with-mpi-lib="/nasa/sgi/mpt/2.06rp16/lib/libmpi.so" \
++ --with-mpi-include="/nasa/sgi/mpt/2.06rp16/include" \
++ --with-blas-lapack-dir="/nasa/intel/Compiler/2012.0.032/composer_xe_2011_sp1/mkl/lib/intel64" \
++ --download-scalapack=yes \
++ --download-blacs=yes \
++ --download-mumps=yes \
++ --download-metis=yes \
++ --download-parmetis=yes \
++ --download-trilinos=yes \
++ --download-euclid=yes \
++ --download-hypre=yes \
++ --COPTFLAGS="-lmpi -O3" \
++ --FOPTFLAGS="-lmpi -O3" \
++ --CXXOPTFLAGS="-lmpi -O3"
++
++#prepare script to reconfigure petsc
++cat > script.queue << EOF
++#PBS -S /bin/bash
++#PBS -l select=1:ncpus=1:model=wes 
++#PBS -l walltime=200 
++#PBS -W group_list=s1010
++#PBS -m e 
++
++. /usr/share/modules/init/bash 
++module load comp-intel/2012.0.032
++module load mpi-sgi/mpt.2.06rp16
++
++export PATH="$PATH:." 
++export MPI_GROUP_MAX=64 
++mpiexec -np 1 ./conftest-linux-gnu-ia64-intel.py
++EOF
++
++#print instructions
++echo "== Now: cd src/ "
++echo "== qsub -q devel script.queue "
++echo "== Then run reconfigure script generated by PETSc and follow instructions"
+
+Property changes on: ../trunk-jpl/externalpackages/petsc/install-3.4-pleiades-intel2012.0.032-mpt.2.06rp16.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh	(revision 0)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh	(revision 18340)
+@@ -0,0 +1,62 @@
++#!/bin/bash
++set -eu
++
++#Some cleanup
++rm -rf install petsc-3.5.1 src
++mkdir install src
++
++#Download from ISSM server
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.1.tar.gz' 'petsc-3.5.1.tar.gz'
++
++#Untar and move petsc to install directory
++tar -zxvf  petsc-3.5.1.tar.gz
++mv petsc-3.5.1/* src/
++rm -rf petsc-3.5.1
++
++#configure
++cd src
++./config/configure.py \
++  --prefix="$ISSM_DIR/externalpackages/petsc/install" \
++  --PETSC_ARCH="$ISSM_ARCH" \
++  --PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
++  --with-batch=1  \
++  --with-debugging=0 \
++  --with-shared-libraries=1 \
++  --known-mpi-shared-libraries=1 \
++  --with-mpi=1 \
++  --with-mpi-lib="/nasa/sgi/mpt/2.06rp16/lib/libmpi.so" \
++  --with-mpi-include="/nasa/sgi/mpt/2.06rp16/include" \
++  --with-blas-lapack-dir="/nasa/intel/Compiler/2012.0.032/composer_xe_2011_sp1/mkl/lib/intel64" \
++  --download-scalapack=yes \
++  --download-mumps=yes \
++  --download-metis=yes \
++  --download-parmetis=yes \
++  --download-trilinos=yes \
++  --download-euclid=yes \
++  --download-hypre=yes \
++  --COPTFLAGS="-lmpi -O3" \
++  --FOPTFLAGS="-lmpi -O3" \
++  --CXXOPTFLAGS="-lmpi -O3"
++
++#prepare script to reconfigure petsc
++cat > script.queue << EOF
++#PBS -S /bin/bash
++#PBS -l select=1:ncpus=1:model=wes 
++#PBS -l walltime=200 
++#PBS -W group_list=s1010
++#PBS -m e 
++
++. /usr/share/modules/init/bash 
++module load comp-intel/2012.0.032
++module load math/intel_mkl_64_10.0.011
++module load mpi-sgi/mpt.2.06rp16
++
++export PATH="$PATH:." 
++export MPI_GROUP_MAX=64 
++mpiexec -np 1 ./conftest-linux-gnu-ia64-intel.py
++EOF
++
++#print instructions
++echo "== Now: cd src/ "
++echo "== qsub -q devel script.queue "
++echo "== Then run reconfigure script generated by PETSc and follow instructions"
+
+Property changes on: ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/externalpackages/boost/install-1.55-pleiades.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/boost/install-1.55-pleiades.sh	(revision 0)
++++ ../trunk-jpl/externalpackages/boost/install-1.55-pleiades.sh	(revision 18340)
+@@ -0,0 +1,47 @@
++#!/bin/bash
++set -eu
++
++#Note of caution:  stop after boostrap phase, and run 
++#bjam --debug-configuration, to figure out which paths boost is using to include 
++#python. make sure everyone of these paths is covered by python. If not, just make 
++#symlinks in externalpackages/python to what boost is expecting. Ther is NO WAY 
++#to get the boost library to include python support without doing that. 
++
++#Some cleanup
++rm -rf install boost_1_55_0 src
++mkdir install src
++
++#Download from ISSM server
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/boost_1_55_0.tar.gz' 'boost_1_55_0.tar.gz'
++
++#Untar 
++tar -zxvf  boost_1_55_0.tar.gz
++
++#Move boost into install directory
++mv boost_1_55_0/* src
++rm -rf boost_1_55_0
++
++#patch src/boost/atomic/detail/cas128strong.hpp ./configs/1.55/cas128strong.hpp.patch
++#patch src/boost/atomic/detail/gcc-atomic.hpp ./configs/1.55/gcc-atomic.hpp.patch
++#patch src/tools/build/v2/user-config.jam ./configs/1.55/user-config.jam.patch
++#patch src/tools/build/v2/tools/darwin.jam ./configs/1.55/darwin.jam.patch
++#patch src/tools/build/v2/tools/darwin.py ./configs/1.55/darwin.py.patch
++
++#Configure and compile
++cd src 
++./bootstrap.sh \
++	--prefix="$ISSM_DIR/externalpackages/boost/install" \
++	--with-python=python2.7 \
++	--with-python-root="$ISSM_DIR/externalpackages/python/install" \
++	--with-toolset=intel-linux
++
++#Compile boost
++# Need gcc with iconv installed in a location that has been added to your path
++./b2 toolset=intel-linux cxxflags=-static-libstdc++ linkflags=-static-libstdc++ threading=multi install
++#./bjam install
++
++#./b2 toolset=clang cxxflags=-stdlib=libstdc++ linkflags=-stdlib=libstdc++ -j2 variant=release link=static threading=multi instal
++
++#put bjam into install also: 
++mkdir ../install/bin
++cp bjam ../install/bin
+
+Property changes on: ../trunk-jpl/externalpackages/boost/install-1.55-pleiades.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18340-18341.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18340-18341.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18340-18341.diff	(revision 19102)
@@ -0,0 +1,54 @@
+Index: ../trunk-jpl/externalpackages/triangle/install.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/triangle/install.sh	(revision 0)
++++ ../trunk-jpl/externalpackages/triangle/install.sh	(revision 18341)
+@@ -0,0 +1,27 @@
++#!/bin/bash
++set -eu
++
++#Some cleanup 
++rm -rf install src triangle
++mkdir install src
++
++#Download from ISSM server
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/triangle.zip' 'triangle.zip'
++
++#Untar 
++cd src
++mkdir src
++cp ../triangle.zip ./
++unzip triangle.zip
++
++mv ./*.c ./src
++mv ./*.h ./src
++
++cp ../configs/triangle-libtool.tar.gz ./
++tar -xvf ./triangle-libtool.tar.gz
++
++autoreconf -ivf
++./configure.sh --prefix="${ISSM_DIR}/externalpackages/triangle/install"
++
++make 
++make install
+
+Property changes on: ../trunk-jpl/externalpackages/triangle/install.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/externalpackages/triangle/configs/triangle-libtool.tar.gz
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/externalpackages/triangle/configs/triangle-libtool.tar.gz
+===================================================================
+--- ../trunk-jpl/externalpackages/triangle/configs/triangle-libtool.tar.gz	(revision 18340)
++++ ../trunk-jpl/externalpackages/triangle/configs/triangle-libtool.tar.gz	(revision 18341)
+
+Property changes on: ../trunk-jpl/externalpackages/triangle/configs/triangle-libtool.tar.gz
+___________________________________________________________________
+Added: svn:mime-type
+## -0,0 +1 ##
++application/octet-stream
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18341-18342.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18341-18342.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18341-18342.diff	(revision 19102)
@@ -0,0 +1,30 @@
+Index: ../trunk-jpl/externalpackages/triangle/install.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/triangle/install.sh	(revision 18341)
++++ ../trunk-jpl/externalpackages/triangle/install.sh	(revision 18342)
+@@ -3,7 +3,7 @@
+ 
+ #Some cleanup 
+ rm -rf install src triangle
+-mkdir install src
++mkdir install src ./src/m4
+ 
+ #Download from ISSM server
+ $ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/triangle.zip' 'triangle.zip'
+@@ -14,6 +14,7 @@
+ cp ../triangle.zip ./
+ unzip triangle.zip
+ 
++rm ./makefile
+ mv ./*.c ./src
+ mv ./*.h ./src
+ 
+@@ -21,7 +22,7 @@
+ tar -xvf ./triangle-libtool.tar.gz
+ 
+ autoreconf -ivf
+-./configure.sh --prefix="${ISSM_DIR}/externalpackages/triangle/install"
++./configure --prefix="${ISSM_DIR}/externalpackages/triangle/install"
+ 
+ make 
+ make install
Index: /issm/oecreview/Archive/18296-19100/ISSM-18342-18343.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18342-18343.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18342-18343.diff	(revision 19102)
@@ -0,0 +1,11 @@
+Index: ../trunk-jpl/externalpackages/triangle/install.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/triangle/install.sh	(revision 18342)
++++ ../trunk-jpl/externalpackages/triangle/install.sh	(revision 18343)
+@@ -26,3 +26,6 @@
+ 
+ make 
+ make install
++
++#Patch triangle.h
++patch ../install/include/triangle.h ../triangle.h.patch
Index: /issm/oecreview/Archive/18296-19100/ISSM-18343-18344.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18343-18344.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18343-18344.diff	(revision 19102)
@@ -0,0 +1,698 @@
+Index: ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18343)
++++ ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18344)
+@@ -70,6 +70,9 @@
+ 	if(stabilization==3){
+ 		iomodel->FetchDataToInput(elements,MasstransportSpcthicknessEnum); //for DG, we need the spc in the element
+ 	}
++	if(stabilization==4){
++		iomodel->FetchDataToInput(elements,MasstransportSpcthicknessEnum); //for FCT, we need the spc in the element (penlaties)
++	}
+ 
+ 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
+ 		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
+@@ -147,10 +150,11 @@
+ 	int stabilization;
+ 	iomodel->Constant(&stabilization,MasstransportStabilizationEnum);
+ 
+-	/*Do not add constraints in DG, they are weakly imposed*/
++	/*Do not add constraints in DG,  they are weakly imposed*/
+ 	if(stabilization!=3){
+ 		IoModelToConstraintsx(constraints,iomodel,MasstransportSpcthicknessEnum,MasstransportAnalysisEnum,P1Enum);
+ 	}
++	/*Do not add constraints in FCT, they are imposed using penalties*/
+ }/*}}}*/
+ void MasstransportAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+ 
+@@ -674,7 +678,7 @@
+ 
+ }/*}}}*/
+ void MasstransportAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+-	   _error_("not implemented yet");
++	element->GetSolutionFromInputsOneDof(solution,ThicknessEnum);
+ }/*}}}*/
+ void MasstransportAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+@@ -772,3 +776,148 @@
+ 	}
+ 	return;
+ }/*}}}*/
++
++/*Flux Correction Transport*/
++void           MasstransportAnalysis::LumpedMassMatrix(Vector<IssmDouble>** pMlff,FemModel* femmodel){/*{{{*/
++
++	/*Intermediaries*/
++	int  configuration_type;
++
++	/*Initialize Lumped mass matrix (actually we just save its diagonal)*/
++	femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
++	int fsize      = femmodel->nodes->NumberOfDofs(configuration_type,FsetEnum);
++	int flocalsize = femmodel->nodes->NumberOfDofsLocal(configuration_type,FsetEnum);
++	Vector<IssmDouble>* Mlff = new Vector<IssmDouble>(flocalsize,fsize);
++
++	/*Create and assemble matrix*/
++	for(int i=0;i<femmodel->elements->Size();i++){
++		Element*       element = dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		ElementMatrix* MLe     = this->CreateMassMatrix(element);
++		if(MLe){
++			MLe->Lump();
++			MLe->AddDiagonalToGlobal(Mlff);
++		}
++		delete MLe;
++	}
++	Mlff->Assemble();
++
++	/*Assign output pointer*/
++	*pMlff=Mlff;
++}/*}}}*/
++ElementMatrix* MasstransportAnalysis::CreateMassMatrix(Element* element){/*{{{*/
++
++	/* Check if ice in element */
++	if(!element->IsIceInElement()) return NULL;
++
++	/*Intermediaries*/
++	IssmDouble  D,Jdet;
++	IssmDouble* xyz_list = NULL;
++
++	/*Fetch number of nodes and dof for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++
++	/*Initialize Element vector and other vectors*/
++	ElementMatrix* Me     = element->NewElementMatrix();
++	IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
++
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinates(&xyz_list);
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGauss(2);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		element->NodalFunctions(basis,gauss);
++
++		D=gauss->weight*Jdet;
++		TripleMultiply(basis,1,numnodes,1,
++					&D,1,1,0,
++					basis,1,numnodes,0,
++					&Me->values[0],1);
++	}
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(basis);
++	delete gauss;
++	return Me;
++}/*}}}*/
++void           MasstransportAnalysis::FctKMatrix(Matrix<IssmDouble>** pKff,Matrix<IssmDouble>** pKfs,FemModel* femmodel){/*{{{*/
++
++	/*Output*/
++	Matrix<IssmDouble>* Kff = NULL;
++	Matrix<IssmDouble>* Kfs = NULL;
++
++	/*Initialize Jacobian Matrix*/
++	AllocateSystemMatricesx(&Kff,&Kfs,NULL,NULL,femmodel);
++
++	/*Create and assemble matrix*/
++	for(int i=0;i<femmodel->elements->Size();i++){
++		Element*       element = dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		ElementMatrix* Ke     = this->CreateFctKMatrix(element);
++		if(Ke) Ke->AddToGlobal(Kff,Kfs);
++		delete Ke;
++	}
++	Kff->Assemble();
++	Kfs->Assemble();
++
++	/*Assign output pointer*/
++	*pKff=Kff;
++	*pKfs=Kfs;
++}/*}}}*/
++ElementMatrix* MasstransportAnalysis::CreateFctKMatrix(Element* element){/*{{{*/
++
++	/* Check if ice in element */
++	if(!element->IsIceInElement()) return NULL;
++
++	/*Intermediaries */
++	IssmDouble Jdet;
++	IssmDouble vx,vy;
++	IssmDouble* xyz_list = NULL;
++
++	/*Fetch number of nodes and dof for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++	int dim      = 2;
++
++	/*Initialize Element vector and other vectors*/
++	ElementMatrix* Ke     = element->NewElementMatrix();
++	IssmDouble*    B      = xNew<IssmDouble>(dim*numnodes);
++	IssmDouble*    Bprime = xNew<IssmDouble>(dim*numnodes);
++	IssmDouble*    D      = xNewZeroInit<IssmDouble>(dim*dim);
++
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinates(&xyz_list);
++	Input* vxaverage_input=element->GetInput(VxEnum); _assert_(vxaverage_input);
++	Input* vyaverage_input=element->GetInput(VyEnum); _assert_(vyaverage_input);
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGauss(2);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		GetB(B,element,dim,xyz_list,gauss);
++		GetBprime(Bprime,element,dim,xyz_list,gauss);
++		vxaverage_input->GetInputValue(&vx,gauss);
++		vyaverage_input->GetInputValue(&vy,gauss);
++
++		D[0*dim+0] = -gauss->weight*vx*Jdet;
++		D[1*dim+1] = -gauss->weight*vy*Jdet;
++
++		TripleMultiply(B,dim,numnodes,1,
++					D,dim,dim,0,
++					Bprime,dim,numnodes,0,
++					&Ke->values[0],1);
++
++	}
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(B);
++	xDelete<IssmDouble>(Bprime);
++	xDelete<IssmDouble>(D);
++	delete gauss;
++	return Ke;
++}/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/MasstransportAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/MasstransportAnalysis.h	(revision 18343)
++++ ../trunk-jpl/src/c/analyses/MasstransportAnalysis.h	(revision 18344)
+@@ -35,5 +35,11 @@
+ 		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+ 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+ 		void UpdateConstraints(FemModel* femmodel);
++
++		/*FCT*/
++		void           LumpedMassMatrix(Vector<IssmDouble>** pMLff,FemModel* femmodel);
++		void           FctKMatrix(Matrix<IssmDouble>** pKff,Matrix<IssmDouble>** pKfs,FemModel* femmodel);
++		ElementMatrix* CreateMassMatrix(Element* element);
++		ElementMatrix* CreateFctKMatrix(Element* element);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 0)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18344)
+@@ -0,0 +1,161 @@
++/*!\file: solutionsequence_linear.cpp
++ * \brief: numerical core of linear solutions
++ */ 
++
++#include "../toolkits/toolkits.h"
++#include "../classes/classes.h"
++#include "../shared/shared.h"
++#include "../modules/modules.h"
++
++void solutionsequence_fct(FemModel* femmodel){
++
++	/*intermediary: */
++	Vector<IssmDouble>*  Mlf = NULL;
++	Matrix<IssmDouble>*  Kff = NULL;
++	Matrix<IssmDouble>*  Kfs = NULL;
++	Vector<IssmDouble>*  ug  = NULL;
++	Vector<IssmDouble>*  uf  = NULL;
++	Vector<IssmDouble>*  ys  = NULL;
++
++	IssmDouble theta,deltat;
++	int        dof,ncols,ncols2,ncols3,rstart,rend;
++	int        configuration_type,analysis_type;
++	double     d,diagD,mi;
++	double     dmax = 0.;
++	int*       cols  = NULL;
++	int*       cols2 = NULL;
++	int*       cols3 = NULL;
++	double*    vals  = NULL;
++	double*    vals2 = NULL;
++	double*    vals3 = NULL;
++
++	/*Create analysis*/
++	MasstransportAnalysis* analysis = new MasstransportAnalysis();
++
++	/*Recover parameters: */
++	femmodel->parameters->FindParam(&deltat,TimesteppingTimeStepEnum);
++	femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
++	femmodel->parameters->FindParam(&analysis_type,AnalysisTypeEnum);
++	femmodel->UpdateConstraintsx();
++	theta = 0.5;
++
++	/*Create lumped mass matrix*/
++	analysis->LumpedMassMatrix(&Mlf,femmodel);
++	analysis->FctKMatrix(&Kff,&Kfs,femmodel);
++
++	/*Create Dff Matrix*/
++	#ifdef _HAVE_PETSC_
++	Mat Kff_transp = NULL;
++	Mat Dff_petsc  = NULL;
++	Mat LHS        = NULL;
++	Mat Kff_petsc  = Kff->pmatrix->matrix;
++	Vec Mlf_petsc  = Mlf->pvector->vector;
++	MatTranspose(Kff_petsc,MAT_INITIAL_MATRIX,&Kff_transp);
++	MatDuplicate(Kff_petsc,MAT_SHARE_NONZERO_PATTERN,&Dff_petsc);
++	MatGetOwnershipRange(Kff_transp,&rstart,&rend);
++	for(int row=rstart; row<rend; row++){
++		diagD = 0.;
++		MatGetRow(Kff_petsc ,row,&ncols, (const int**)&cols, (const double**)&vals);
++		MatGetRow(Kff_transp,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
++		_assert_(ncols==ncols2);
++		for(int j=0; j<ncols; j++) {
++			_assert_(cols[j]==cols2[j]);
++			d = max(max(-vals[j],-vals2[j]),0.);
++			MatSetValues(Dff_petsc,1,&row,1,&cols[j],(const double*)&d,INSERT_VALUES);
++			if(cols[j]!=row) diagD -= d;
++		}
++		MatSetValues(Dff_petsc,1,&row,1,&row,(const double*)&diagD,INSERT_VALUES);
++		MatRestoreRow(Kff_petsc, row,&ncols, (const int**)&cols, (const double**)&vals);
++		MatRestoreRow(Kff_transp,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
++	}
++	MatAssemblyBegin(Dff_petsc,MAT_FINAL_ASSEMBLY);
++	MatAssemblyEnd(  Dff_petsc,MAT_FINAL_ASSEMBLY);
++	MatFree(&Kff_transp);
++
++	/*Create LHS: [ML − theta*detlat *(K+D)^n+1]*/
++	MatDuplicate(Kff_petsc,MAT_SHARE_NONZERO_PATTERN,&LHS);
++	for(int row=rstart; row<rend; row++){
++		MatGetRow(Kff_petsc,row,&ncols, (const int**)&cols, (const double**)&vals);
++		MatGetRow(Dff_petsc,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
++		_assert_(ncols==ncols2);
++		for(int j=0; j<ncols; j++) {
++			_assert_(cols[j]==cols2[j]);
++			d = -theta*deltat*(vals[j] + vals2[j]);
++			if(cols[j]==row){
++				VecGetValues(Mlf_petsc,1,(const int*)&cols[j],&mi);
++				d += mi;
++			}
++			if(fabs(d)>dmax) dmax = fabs(d);
++			MatSetValues(LHS,1,&row,1,&cols[j],(const double*)&d,INSERT_VALUES);
++		}
++		MatRestoreRow(Kff_petsc,row,&ncols, (const int**)&cols, (const double**)&vals);
++		MatRestoreRow(Dff_petsc,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
++	}
++
++	/*Penalize Dirichlet boundary*/
++	dmax = dmax * 1.e+3;
++	for(int i=0;i<femmodel->constraints->Size();i++){
++		Constraint* constraint=(Constraint*)femmodel->constraints->GetObjectByOffset(i);
++		if(constraint->InAnalysis(analysis_type)){
++			constraint->PenaltyDofAndValue(&dof,&d,femmodel->nodes,femmodel->parameters);
++			if(dof!=-1){
++				MatSetValues(LHS,1,&dof,1,&dof,(const double*)&dmax,INSERT_VALUES);
++			}
++		}
++	}
++	MatAssemblyBegin(LHS,MAT_FINAL_ASSEMBLY);
++	MatAssemblyEnd(  LHS,MAT_FINAL_ASSEMBLY);
++
++	/*Create RHS: [ML + (1 − theta) deltaT L^n] u^n */
++	GetSolutionFromInputsx(&ug,femmodel);
++	Reducevectorgtofx(&uf, ug, femmodel->nodes,femmodel->parameters);
++	delete ug;
++	Vec u  = uf->pvector->vector;
++	Vec Ku = NULL;
++	Vec Du = NULL;
++	Vec RHS = NULL;
++	VecDuplicate(u,&Ku);
++	VecDuplicate(u,&Du);
++	VecDuplicate(u,&RHS);
++	MatMult(Kff_petsc,u,Ku);
++	MatMult(Dff_petsc,u,Du);
++	VecPointwiseMult(RHS,Mlf_petsc,u);
++	VecAXPBYPCZ(RHS,(1-theta)*deltat,(1-theta)*deltat,1,Ku,Du);// RHS = M*u + (1-theta)*deltat*K*u + (1-theta)*deltat*D*u
++	VecFree(&Ku);
++	VecFree(&Du);
++	MatFree(&Dff_petsc);
++	delete uf;
++
++	/*Penalize Dirichlet boundary*/
++	for(int i=0;i<femmodel->constraints->Size();i++){
++		Constraint* constraint=(Constraint*)femmodel->constraints->GetObjectByOffset(i);
++		if(constraint->InAnalysis(analysis_type)){
++			constraint->PenaltyDofAndValue(&dof,&d,femmodel->nodes,femmodel->parameters);
++			d = d*dmax;
++			if(dof!=-1){
++				VecSetValues(RHS,1,&dof,(const double*)&d,INSERT_VALUES);
++			}
++		}
++	}
++
++	/*Go solve!*/
++	SolverxPetsc(&u,LHS,RHS,NULL,NULL, femmodel->parameters); 
++	MatFree(&LHS);
++	VecFree(&RHS);
++	uf =new Vector<IssmDouble>(u);
++	VecFree(&u);
++
++	Mergesolutionfromftogx(&ug, uf,ys,femmodel->nodes,femmodel->parameters);delete uf; delete ys;
++	InputUpdateFromSolutionx(femmodel,ug); 
++	delete ug;  
++
++	#else
++	_error_("PETSc needs to be installed");
++	#endif
++
++	delete Mlf;
++	delete Kff;
++	delete Kfs;
++	delete analysis;
++
++}
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequences.h
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequences.h	(revision 18343)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequences.h	(revision 18344)
+@@ -15,6 +15,7 @@
+ void solutionsequence_hydro_nonlinear(FemModel* femmodel);
+ void solutionsequence_nonlinear(FemModel* femmodel,bool conserve_loads);
+ void solutionsequence_newton(FemModel* femmodel);
++void solutionsequence_fct(FemModel* femmodel);
+ void solutionsequence_FScoupling_nonlinear(FemModel* femmodel,bool conserve_loads);
+ void solutionsequence_linear(FemModel* femmodel);
+ void solutionsequence_la(FemModel* femmodel);
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 18343)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 18344)
+@@ -353,6 +353,7 @@
+ 					./solutionsequences/solutionsequence_linear.cpp\
+ 					./solutionsequences/solutionsequence_nonlinear.cpp\
+ 					./solutionsequences/solutionsequence_newton.cpp\
++					./solutionsequences/solutionsequence_fct.cpp\
+ 					./solutionsequences/convergence.cpp\
+ 					./classes/Options/Options.h\
+ 					./classes/Options/Options.cpp\
+Index: ../trunk-jpl/src/c/cores/masstransport_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/masstransport_core.cpp	(revision 18343)
++++ ../trunk-jpl/src/c/cores/masstransport_core.cpp	(revision 18344)
+@@ -15,7 +15,7 @@
+ 	int    numoutputs,domaintype;
+ 	bool   save_results;
+ 	bool   isFS,isfreesurface,dakota_analysis;
+-	int    solution_type;
++	int    solution_type,stabilization;
+ 	char** requested_outputs = NULL;
+ 
+ 	/*activate configuration*/
+@@ -28,6 +28,7 @@
+ 	femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
+ 	femmodel->parameters->FindParam(&domaintype,DomainTypeEnum);
+ 	femmodel->parameters->FindParam(&numoutputs,MasstransportNumRequestedOutputsEnum);
++	femmodel->parameters->FindParam(&stabilization,MasstransportStabilizationEnum);
+ 	if(numoutputs) femmodel->parameters->FindParam(&requested_outputs,&numoutputs,MasstransportRequestedOutputsEnum);
+ 
+ 	/*Calculate new Surface Mass Balance (SMB)*/
+@@ -48,7 +49,12 @@
+ 	}
+ 	else{
+ 		if(VerboseSolution()) _printf0_("   call computational core\n");
+-		solutionsequence_linear(femmodel);
++		if(stabilization==4){
++			solutionsequence_fct(femmodel);
++		}
++		else{
++			solutionsequence_linear(femmodel);
++		}
+ 		femmodel->parameters->SetParam(ThicknessEnum,InputToExtrudeEnum);
+ 		extrudefrombase_core(femmodel);
+ 		femmodel->parameters->SetParam(BaseEnum,InputToExtrudeEnum);
+Index: ../trunk-jpl/src/c/classes/matrix/ElementMatrix.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/matrix/ElementMatrix.cpp	(revision 18343)
++++ ../trunk-jpl/src/c/classes/matrix/ElementMatrix.cpp	(revision 18344)
+@@ -328,6 +328,39 @@
+ 
+ }
+ /*}}}*/
++void ElementMatrix::AddDiagonalToGlobal(Vector<IssmDouble>* pf){/*{{{*/
++
++	IssmDouble* localvalues=NULL;
++
++	/*Check that pf is not NULL*/
++	_assert_(pf); 
++
++	/*In debugging mode, check consistency (no NaN, and values not too big)*/
++	this->CheckConsistency();
++
++	if(this->dofsymmetrical){
++		/*only use row dofs to add values into global matrices: */
++
++		if(this->row_fsize){
++			/*first, retrieve values that are in the f-set from the g-set values matrix: */
++			localvalues=xNew<IssmDouble>(this->row_fsize);
++			for(int i=0;i<this->row_fsize;i++){
++				localvalues[i] = this->values[this->ncols*this->row_flocaldoflist[i]+ this->row_flocaldoflist[i]];
++			}
++
++			/*add local values into global  matrix, using the fglobaldoflist: */
++			pf->SetValues(this->row_fsize,this->row_fglobaldoflist,localvalues,ADD_VAL);
++
++			/*Free ressources:*/
++			xDelete<IssmDouble>(localvalues);
++		}
++	}
++	else{
++		_error_("non dofsymmetrical matrix AddToGlobal routine not support yet!");
++	}
++
++}
++/*}}}*/
+ void ElementMatrix::CheckConsistency(void){/*{{{*/
+ 	/*Check element matrix values, only in debugging mode*/
+ 	#ifdef _ISSM_DEBUG_ 
+Index: ../trunk-jpl/src/c/classes/matrix/ElementMatrix.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/matrix/ElementMatrix.h	(revision 18343)
++++ ../trunk-jpl/src/c/classes/matrix/ElementMatrix.h	(revision 18344)
+@@ -59,6 +59,7 @@
+ 		/*ElementMatrix specific routines*/
+ 		void AddToGlobal(Matrix<IssmDouble>* Kff, Matrix<IssmDouble>* Kfs);
+ 		void AddToGlobal(Matrix<IssmDouble>* Jff);
++		void AddDiagonalToGlobal(Vector<IssmDouble>* pf);
+ 		void Echo(void);
+ 		void CheckConsistency(void);
+ 		void StaticCondensation(int numindices,int* indices);
+Index: ../trunk-jpl/src/c/classes/Constraints/SpcDynamic.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/SpcDynamic.h	(revision 18343)
++++ ../trunk-jpl/src/c/classes/Constraints/SpcDynamic.h	(revision 18344)
+@@ -37,6 +37,7 @@
+ 		/*Constraint virtual functions definitions: {{{*/
+ 		void   ConstrainNode(Nodes* nodes,Parameters* parameters);
+ 		bool   InAnalysis(int analysis_type);
++		void   PenaltyDofAndValue(int* dof,IssmDouble* value,Nodes* nodes,Parameters* parameters){_error_("not implemented yet");};
+ 		/*}}}*/
+ 		/*SpcDynamic management:{{{ */
+ 		int    GetNodeId();
+Index: ../trunk-jpl/src/c/classes/Constraints/SpcStatic.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/SpcStatic.h	(revision 18343)
++++ ../trunk-jpl/src/c/classes/Constraints/SpcStatic.h	(revision 18344)
+@@ -36,6 +36,7 @@
+ 		/*Constraint virtual functions definitions: {{{*/
+ 		void   ConstrainNode(Nodes* nodes,Parameters* parameters);
+ 		bool   InAnalysis(int analysis_type);
++		void   PenaltyDofAndValue(int* dof,IssmDouble* value,Nodes* nodes,Parameters* parameters){_error_("not implemented yet");};
+ 		/*}}}*/
+ 		/*SpcStatic management:{{{ */
+ 		int    GetNodeId();
+Index: ../trunk-jpl/src/c/classes/Constraints/SpcTransient.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/SpcTransient.h	(revision 18343)
++++ ../trunk-jpl/src/c/classes/Constraints/SpcTransient.h	(revision 18344)
+@@ -13,13 +13,14 @@
+ class SpcTransient: public Constraint{
+ 
+ 	private: 
+-		int	sid; /*! id, to track it*/
+-		int	nodeid; /*!node id*/
+-		int dof; /*!component*/
+-		IssmDouble* values; /*different values in time*/
+-		IssmDouble* times; /*different time steps*/
+-		int nsteps; /*number of time steps*/
+-		int analysis_type;
++		bool        penalty;         /*Is this a penalty constraint */
++		int         sid;             /* id, to track it             */
++		int         nodeid;          /*node id                      */
++		int         dof;             /*component                    */
++		IssmDouble *values;          /*different values in time     */
++		IssmDouble *times;           /*different time steps         */
++		int         nsteps;          /*number of time steps         */
++		int         analysis_type;
+ 
+ 	public:
+ 
+@@ -38,6 +39,7 @@
+ 		/*Constraint virtual functions definitions: {{{*/
+ 		void   ConstrainNode(Nodes* nodes,Parameters* parameters);
+ 		bool   InAnalysis(int analysis_type);
++		void   PenaltyDofAndValue(int* dof,IssmDouble* value,Nodes* nodes,Parameters* parameters);
+ 		/*}}}*/
+ 		/*SpcTransient management:{{{ */
+ 		int    GetNodeId();
+Index: ../trunk-jpl/src/c/classes/Constraints/Constraint.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/Constraint.h	(revision 18343)
++++ ../trunk-jpl/src/c/classes/Constraints/Constraint.h	(revision 18344)
+@@ -20,6 +20,7 @@
+ 
+ 		virtual      ~Constraint(){};
+ 		virtual void ConstrainNode(Nodes* nodes,Parameters* parameters)=0;
++		virtual void PenaltyDofAndValue(int* dof,IssmDouble* value,Nodes* nodes,Parameters* parameters)=0;
+ 		virtual bool InAnalysis(int analysis_type)=0;
+ 
+ };
+Index: ../trunk-jpl/src/c/classes/Constraints/SpcTransient.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/SpcTransient.cpp	(revision 18343)
++++ ../trunk-jpl/src/c/classes/Constraints/SpcTransient.cpp	(revision 18344)
+@@ -14,25 +14,27 @@
+ 
+ /*SpcTransient constructors and destructor*/
+ SpcTransient::SpcTransient(){/*{{{*/
+-	sid=-1;
+-	nodeid=-1;
+-	dof=-1;
+-	values=NULL;
+-	times=NULL;
+-	nsteps=-1;
+-	analysis_type=-1;
++	penalty       = false;
++	sid           = -1;
++	nodeid        = -1;
++	dof           = -1;
++	values        = NULL;
++	times         = NULL;
++	nsteps        = -1;
++	analysis_type = -1;
+ 	return;
+ }
+ /*}}}*/
+ SpcTransient::SpcTransient(int spc_sid,int spc_nodeid, int spc_dof,int spc_nsteps, IssmDouble* spc_times, IssmDouble* spc_values,int spc_analysis_type){/*{{{*/
+ 
+-	sid=spc_sid;
+-	nodeid=spc_nodeid;
+-	dof=spc_dof;
+-	nsteps=spc_nsteps;
++	penalty= false;
++	sid    = spc_sid;
++	nodeid = spc_nodeid;
++	dof    = spc_dof;
++	nsteps = spc_nsteps;
+ 	if(spc_nsteps){
+-		values=xNew<IssmDouble>(spc_nsteps);
+-		times=xNew<IssmDouble>(spc_nsteps);
++		values = xNew<IssmDouble>(spc_nsteps);
++		times  = xNew<IssmDouble>(spc_nsteps);
+ 		xMemCpy<IssmDouble>(values,spc_values,nsteps);
+ 		xMemCpy<IssmDouble>(times,spc_times,nsteps);
+ 	}
+@@ -68,7 +70,9 @@
+ 	this->Echo();
+ }		
+ /*}}}*/
+-int    SpcTransient::Id(void){ return sid; }/*{{{*/
++int  SpcTransient::Id(void){/*{{{*/
++	return sid;
++}
+ /*}}}*/
+ int SpcTransient::ObjectEnum(void){/*{{{*/
+ 
+@@ -100,7 +104,7 @@
+ 	/*Chase through nodes and find the node to which this SpcTransient applys: */
+ 	node=(Node*)nodes->GetObjectById(NULL,nodeid);
+ 
+-	if(node){ //in case the spc is dealing with a node on another cpu
++	if(!this->penalty && node){ //in case the spc is dealing with a node on another cpu
+ 
+ 		/*Retrieve time in parameters: */
+ 		parameters->FindParam(&time,TimeEnum);
+@@ -136,7 +140,63 @@
+ 	}
+ }
+ /*}}}*/
++void SpcTransient::PenaltyDofAndValue(int* pdof,IssmDouble* pvalue,Nodes* nodes,Parameters* parameters){/*{{{*/
+ 
++	if(!this->penalty) _error_("cannot return dof and value for non penalty constraint");
++
++	Node       *node  = NULL;
++	IssmDouble  time  = 0.;
++	int         i,gdof;
++	IssmDouble  alpha = -1.;
++	IssmDouble  value;
++	bool        found = false;
++
++	/*Chase through nodes and find the node to which this SpcTransient applys: */
++	node=(Node*)nodes->GetObjectById(NULL,nodeid);
++
++	if(node){ //in case the spc is dealing with a node on another cpu
++
++		/*Retrieve time in parameters: */
++		parameters->FindParam(&time,TimeEnum);
++
++		/*Now, go fetch value for this time: */
++		if (time<=times[0]){
++			value=values[0];
++			found=true;
++		}
++		else if (time>=times[nsteps-1]){
++			value=values[nsteps-1];
++			found=true;
++		}
++		else{
++			for(i=0;i<nsteps-1;i++){
++				if (times[i]<=time && time<times[i+1]){
++					alpha=(time-times[i])/(times[i+1]-times[i]);
++					value=(1-alpha)*values[i]+alpha*values[i+1];
++					found=true;
++					break;
++				}
++			}
++		}
++		if(!found)_error_("could not find time segment for constraint");
++
++		/*Get gdof */
++		gdof = node->GetDof(dof,GsetEnum);
++		if(xIsNan<IssmDouble>(value)){
++			gdof = -1;
++		}
++	}
++	else{
++		value = NAN;
++		gdof = -1;
++	}
++
++	/*Assign output pointers*/
++	*pdof   = gdof;
++	*pvalue = value;
++}
++/*}}}*/
++
+ /*SpcTransient functions*/
+ int SpcTransient::GetDof(){/*{{{*/
+ 	return dof;
+Index: ../trunk-jpl/src/c
+===================================================================
+--- ../trunk-jpl/src/c	(revision 18343)
++++ ../trunk-jpl/src/c	(revision 18344)
+
+Property changes on: ../trunk-jpl/src/c
+___________________________________________________________________
+Modified: svn:ignore
+## -4,6 +4,8 ##
+ *.o
+ *.obj
+ *.exe
++issm
++kriging
+ appscan.*
+ ouncemake*
+ list
Index: /issm/oecreview/Archive/18296-19100/ISSM-18344-18345.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18344-18345.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18344-18345.diff	(revision 19102)
@@ -0,0 +1,274 @@
+Index: ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18344)
++++ ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18345)
+@@ -804,6 +804,26 @@
+ 	/*Assign output pointer*/
+ 	*pMlff=Mlff;
+ }/*}}}*/
++void           MasstransportAnalysis::MassMatrix(Matrix<IssmDouble>** pMff,FemModel* femmodel){/*{{{*/
++
++	/*Initialize Mass matrix*/
++	Matrix<IssmDouble> *Mff = NULL;
++	AllocateSystemMatricesx(&Mff,NULL,NULL,NULL,femmodel);
++
++	/*Create and assemble matrix*/
++	for(int i=0;i<femmodel->elements->Size();i++){
++		Element*       element = dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		ElementMatrix* MLe     = this->CreateMassMatrix(element);
++		if(MLe){
++			MLe->AddToGlobal(Mff);
++		}
++		delete MLe;
++	}
++	Mff->Assemble();
++
++	/*Assign output pointer*/
++	*pMff=Mff;
++}/*}}}*/
+ ElementMatrix* MasstransportAnalysis::CreateMassMatrix(Element* element){/*{{{*/
+ 
+ 	/* Check if ice in element */
+@@ -865,7 +885,12 @@
+ 
+ 	/*Assign output pointer*/
+ 	*pKff=Kff;
+-	*pKfs=Kfs;
++	if(pKfs){
++		*pKfs=Kfs;
++	}
++	else{
++		delete Kfs;
++	}
+ }/*}}}*/
+ ElementMatrix* MasstransportAnalysis::CreateFctKMatrix(Element* element){/*{{{*/
+ 
+Index: ../trunk-jpl/src/c/analyses/MasstransportAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/MasstransportAnalysis.h	(revision 18344)
++++ ../trunk-jpl/src/c/analyses/MasstransportAnalysis.h	(revision 18345)
+@@ -38,6 +38,7 @@
+ 
+ 		/*FCT*/
+ 		void           LumpedMassMatrix(Vector<IssmDouble>** pMLff,FemModel* femmodel);
++		void           MassMatrix(Matrix<IssmDouble>** pMff,FemModel* femmodel);
+ 		void           FctKMatrix(Matrix<IssmDouble>** pKff,Matrix<IssmDouble>** pKfs,FemModel* femmodel);
+ 		ElementMatrix* CreateMassMatrix(Element* element);
+ 		ElementMatrix* CreateFctKMatrix(Element* element);
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18344)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18345)
+@@ -10,12 +10,12 @@
+ void solutionsequence_fct(FemModel* femmodel){
+ 
+ 	/*intermediary: */
+-	Vector<IssmDouble>*  Mlf = NULL;
+-	Matrix<IssmDouble>*  Kff = NULL;
+-	Matrix<IssmDouble>*  Kfs = NULL;
+-	Vector<IssmDouble>*  ug  = NULL;
+-	Vector<IssmDouble>*  uf  = NULL;
+-	Vector<IssmDouble>*  ys  = NULL;
++	Vector<IssmDouble>*  Ml = NULL;
++	Matrix<IssmDouble>*  K  = NULL;
++	Matrix<IssmDouble>*  Mc = NULL;
++	Vector<IssmDouble>*  ug = NULL;
++	Vector<IssmDouble>*  uf = NULL;
++	Vector<IssmDouble>*  ys = NULL;
+ 
+ 	IssmDouble theta,deltat;
+ 	int        dof,ncols,ncols2,ncols3,rstart,rend;
+@@ -40,56 +40,58 @@
+ 	theta = 0.5;
+ 
+ 	/*Create lumped mass matrix*/
+-	analysis->LumpedMassMatrix(&Mlf,femmodel);
+-	analysis->FctKMatrix(&Kff,&Kfs,femmodel);
++	analysis->LumpedMassMatrix(&Ml,femmodel);
++	analysis->MassMatrix(&Mc,femmodel);
++	analysis->FctKMatrix(&K,NULL,femmodel);
+ 
+-	/*Create Dff Matrix*/
++	/*Create D Matrix*/
+ 	#ifdef _HAVE_PETSC_
+-	Mat Kff_transp = NULL;
+-	Mat Dff_petsc  = NULL;
+-	Mat LHS        = NULL;
+-	Mat Kff_petsc  = Kff->pmatrix->matrix;
+-	Vec Mlf_petsc  = Mlf->pvector->vector;
+-	MatTranspose(Kff_petsc,MAT_INITIAL_MATRIX,&Kff_transp);
+-	MatDuplicate(Kff_petsc,MAT_SHARE_NONZERO_PATTERN,&Dff_petsc);
+-	MatGetOwnershipRange(Kff_transp,&rstart,&rend);
++	Mat K_transp = NULL;
++	Mat D_petsc  = NULL;
++	Mat LHS      = NULL;
++	Mat K_petsc  = K->pmatrix->matrix;
++	Vec Ml_petsc = Ml->pvector->vector;
++	Mat Mc_petsc = Mc->pmatrix->matrix;
++	MatTranspose(K_petsc,MAT_INITIAL_MATRIX,&K_transp);
++	MatDuplicate(K_petsc,MAT_SHARE_NONZERO_PATTERN,&D_petsc);
++	MatGetOwnershipRange(K_transp,&rstart,&rend);
+ 	for(int row=rstart; row<rend; row++){
+ 		diagD = 0.;
+-		MatGetRow(Kff_petsc ,row,&ncols, (const int**)&cols, (const double**)&vals);
+-		MatGetRow(Kff_transp,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
++		MatGetRow(K_petsc ,row,&ncols, (const int**)&cols, (const double**)&vals);
++		MatGetRow(K_transp,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+ 		_assert_(ncols==ncols2);
+ 		for(int j=0; j<ncols; j++) {
+ 			_assert_(cols[j]==cols2[j]);
+ 			d = max(max(-vals[j],-vals2[j]),0.);
+-			MatSetValues(Dff_petsc,1,&row,1,&cols[j],(const double*)&d,INSERT_VALUES);
++			MatSetValues(D_petsc,1,&row,1,&cols[j],(const double*)&d,INSERT_VALUES);
+ 			if(cols[j]!=row) diagD -= d;
+ 		}
+-		MatSetValues(Dff_petsc,1,&row,1,&row,(const double*)&diagD,INSERT_VALUES);
+-		MatRestoreRow(Kff_petsc, row,&ncols, (const int**)&cols, (const double**)&vals);
+-		MatRestoreRow(Kff_transp,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
++		MatSetValues(D_petsc,1,&row,1,&row,(const double*)&diagD,INSERT_VALUES);
++		MatRestoreRow(K_petsc, row,&ncols, (const int**)&cols, (const double**)&vals);
++		MatRestoreRow(K_transp,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+ 	}
+-	MatAssemblyBegin(Dff_petsc,MAT_FINAL_ASSEMBLY);
+-	MatAssemblyEnd(  Dff_petsc,MAT_FINAL_ASSEMBLY);
+-	MatFree(&Kff_transp);
++	MatAssemblyBegin(D_petsc,MAT_FINAL_ASSEMBLY);
++	MatAssemblyEnd(  D_petsc,MAT_FINAL_ASSEMBLY);
++	MatFree(&K_transp);
+ 
+ 	/*Create LHS: [ML − theta*detlat *(K+D)^n+1]*/
+-	MatDuplicate(Kff_petsc,MAT_SHARE_NONZERO_PATTERN,&LHS);
++	MatDuplicate(K_petsc,MAT_SHARE_NONZERO_PATTERN,&LHS);
+ 	for(int row=rstart; row<rend; row++){
+-		MatGetRow(Kff_petsc,row,&ncols, (const int**)&cols, (const double**)&vals);
+-		MatGetRow(Dff_petsc,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
++		MatGetRow(K_petsc,row,&ncols, (const int**)&cols, (const double**)&vals);
++		MatGetRow(D_petsc,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+ 		_assert_(ncols==ncols2);
+ 		for(int j=0; j<ncols; j++) {
+ 			_assert_(cols[j]==cols2[j]);
+ 			d = -theta*deltat*(vals[j] + vals2[j]);
+ 			if(cols[j]==row){
+-				VecGetValues(Mlf_petsc,1,(const int*)&cols[j],&mi);
++				VecGetValues(Ml_petsc,1,(const int*)&cols[j],&mi);
+ 				d += mi;
+ 			}
+ 			if(fabs(d)>dmax) dmax = fabs(d);
+ 			MatSetValues(LHS,1,&row,1,&cols[j],(const double*)&d,INSERT_VALUES);
+ 		}
+-		MatRestoreRow(Kff_petsc,row,&ncols, (const int**)&cols, (const double**)&vals);
+-		MatRestoreRow(Dff_petsc,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
++		MatRestoreRow(K_petsc,row,&ncols, (const int**)&cols, (const double**)&vals);
++		MatRestoreRow(D_petsc,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+ 	}
+ 
+ 	/*Penalize Dirichlet boundary*/
+@@ -117,13 +119,12 @@
+ 	VecDuplicate(u,&Ku);
+ 	VecDuplicate(u,&Du);
+ 	VecDuplicate(u,&RHS);
+-	MatMult(Kff_petsc,u,Ku);
+-	MatMult(Dff_petsc,u,Du);
+-	VecPointwiseMult(RHS,Mlf_petsc,u);
++	MatMult(K_petsc,u,Ku);
++	MatMult(D_petsc,u,Du);
++	VecPointwiseMult(RHS,Ml_petsc,u);
+ 	VecAXPBYPCZ(RHS,(1-theta)*deltat,(1-theta)*deltat,1,Ku,Du);// RHS = M*u + (1-theta)*deltat*K*u + (1-theta)*deltat*D*u
+ 	VecFree(&Ku);
+ 	VecFree(&Du);
+-	MatFree(&Dff_petsc);
+ 	delete uf;
+ 
+ 	/*Penalize Dirichlet boundary*/
+@@ -137,11 +138,79 @@
+ 			}
+ 		}
+ 	}
++	VecAssemblyBegin(RHS);
++	VecAssemblyEnd(  RHS);
+ 
+ 	/*Go solve!*/
+ 	SolverxPetsc(&u,LHS,RHS,NULL,NULL, femmodel->parameters); 
+ 	MatFree(&LHS);
+ 	VecFree(&RHS);
++
++	/*Richardson to calculate udot*/
++	Vec udot = NULL;
++	VecDuplicate(u,&udot);
++	VecZeroEntries(udot);
++	Vec temp1 = NULL; VecDuplicate(u,&temp1);
++	Vec temp2 = NULL; VecDuplicate(u,&temp2);
++	for(int i=0;i<5;i++){
++		/*udot_new = udot_old + Ml^-1 (K^(n+1) u -- Mc udot_old)*/
++		MatMult(Mc_petsc,udot,temp1);
++		MatMult(K_petsc, u,   temp2);
++		VecAXPBY(temp2,-1.,1.,temp1); // temp2 = (K^(n+1) u -- Mc udot_old)
++		VecPointwiseDivide(temp1,temp2,Ml_petsc); //temp1 = Ml^-1 temp2
++		VecAXPBY(udot,1.,1.,temp1);
++	}
++	VecFree(&temp1);
++	VecFree(&temp2);
++
++	/*Serialize u and udot*/
++	IssmDouble* udot_serial = NULL;
++	IssmDouble* u_serial    = NULL;
++	VecToMPISerial(&udot_serial,udot,IssmComm::GetComm());
++	VecToMPISerial(&u_serial   ,u   ,IssmComm::GetComm());
++
++
++	/*Anti diffusive fluxes*/
++	Mat F    = NULL;
++	Vec Fbar = NULL;
++	VecDuplicate(u,&Fbar);
++	MatDuplicate(D_petsc,MAT_SHARE_NONZERO_PATTERN,&F);
++	for(int row=rstart; row<rend; row++){
++		MatGetRow(Mc_petsc,row,&ncols, (const int**)&cols, (const double**)&vals);
++		MatGetRow(D_petsc ,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
++		_assert_(ncols==ncols2);
++		mi = 0.;
++		for(int j=0; j<ncols; j++) {
++			_assert_(cols[j]==cols2[j]);
++			d = vals[j]*(udot_serial[row] - udot_serial[cols[j]]) + vals2[j]*(u_serial[row] - u_serial[cols[j]]);
++			if(row!=cols[j]) mi += d;
++			MatSetValues(F,1,&row,1,&cols[j],(const double*)&d,INSERT_VALUES);
++
++		}
++		VecSetValue(Fbar,row,(const double)mi,INSERT_VALUES);
++		MatRestoreRow(Mc_petsc, row,&ncols, (const int**)&cols, (const double**)&vals);
++		MatRestoreRow(D_petsc,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
++	}
++	MatAssemblyBegin(F,MAT_FINAL_ASSEMBLY);
++	MatAssemblyEnd(  F,MAT_FINAL_ASSEMBLY);
++	VecAssemblyBegin(Fbar);
++	VecAssemblyEnd(  Fbar);
++
++	MatFree(&D_petsc);
++	MatFree(&F);
++	delete Mc;
++	xDelete<IssmDouble>(udot_serial);
++	xDelete<IssmDouble>(u_serial);
++
++	/*Compute solution u^n+1 = u_L + deltat Ml^-1 fbar*/
++	VecDuplicate(u,&temp1);
++	VecPointwiseDivide(temp1,Fbar,Ml_petsc); //temp1 = Ml^-1 temp2
++	VecAXPBY(udot,1.,1.,temp1);
++	VecAXPY(u,deltat,temp1);
++	VecFree(&Fbar);
++	VecFree(&udot);
++	VecFree(&temp1);
++
+ 	uf =new Vector<IssmDouble>(u);
+ 	VecFree(&u);
+ 
+@@ -153,9 +222,8 @@
+ 	_error_("PETSc needs to be installed");
+ 	#endif
+ 
+-	delete Mlf;
+-	delete Kff;
+-	delete Kfs;
++	delete Ml;
++	delete K;
+ 	delete analysis;
+ 
+ }
Index: /issm/oecreview/Archive/18296-19100/ISSM-18345-18346.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18345-18346.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18345-18346.diff	(revision 19102)
@@ -0,0 +1,44 @@
+Index: ../trunk-jpl/src/m/classes/masstransport.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/masstransport.py	(revision 18345)
++++ ../trunk-jpl/src/m/classes/masstransport.py	(revision 18346)
+@@ -34,7 +34,7 @@
+ 		string="%s\n%s"%(string,fielddisplay(self,'isfreesurface','do we use free surfaces (FS only) are mass conservation'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'min_thickness','minimum ice thickness allowed [m]'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'hydrostatic_adjustment','adjustment of ice shelves surface and bed elevations: ''Incremental'' or ''Absolute'' '))
+-		string="%s\n%s"%(string,fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding, 3: discontinuous Galerkin'))
++		string="%s\n%s"%(string,fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding, 3: discontinuous Galerkin, 4: Flux Correction Transport'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'requested_outputs','additional outputs requested'))
+ 
+ 		return string
+@@ -73,7 +73,7 @@
+ 			md = checkfield(md,'fieldname','masstransport.calvingrate','NaN',1,'size',[md.mesh.numberofvertices],'>=',0)
+ 		md = checkfield(md,'fieldname','masstransport.isfreesurface','values',[0,1])
+ 		md = checkfield(md,'fieldname','masstransport.hydrostatic_adjustment','values',['Absolute','Incremental'])
+-		md = checkfield(md,'fieldname','masstransport.stabilization','values',[0,1,2,3])
++		md = checkfield(md,'fieldname','masstransport.stabilization','values',[0,1,2,3,4])
+ 		md = checkfield(md,'fieldname','masstransport.min_thickness','>',0)
+ 		md = checkfield(md,'fieldname','masstransport.requested_outputs','stringrow',1)
+ 
+Index: ../trunk-jpl/src/m/classes/masstransport.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/masstransport.m	(revision 18345)
++++ ../trunk-jpl/src/m/classes/masstransport.m	(revision 18346)
+@@ -126,7 +126,7 @@
+ 
+ 			md = checkfield(md,'fieldname','masstransport.isfreesurface','values',[0 1]);
+ 			md = checkfield(md,'fieldname','masstransport.hydrostatic_adjustment','values',{'Absolute' 'Incremental'});
+-			md = checkfield(md,'fieldname','masstransport.stabilization','values',[0 1 2 3]);
++			md = checkfield(md,'fieldname','masstransport.stabilization','values',[0 1 2 3 4]);
+ 			md = checkfield(md,'fieldname','masstransport.min_thickness','>',0);
+ 			md = checkfield(md,'fieldname','masstransport.requested_outputs','stringrow',1);
+ 
+@@ -138,7 +138,7 @@
+ 			fielddisplay(obj,'isfreesurface','do we use free surfaces (FS only) are mass conservation');
+ 			fielddisplay(obj,'min_thickness','minimum ice thickness allowed [m]');
+ 			fielddisplay(obj,'hydrostatic_adjustment','adjustment of ice shelves surface and bed elevations: ''Incremental'' or ''Absolute'' ');
+-			fielddisplay(obj,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding, 3: discontinuous Galerkin');
++			fielddisplay(obj,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding, 3: discontinuous Galerkin, 4: Flux Correction Transport');
+ 
+ 			disp(sprintf('\n      %s','Penalty options:'));
+ 			fielddisplay(obj,'penalty_factor','offset used by penalties: penalty = Kmax*10^offset');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18346-18347.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18346-18347.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18346-18347.diff	(revision 19102)
@@ -0,0 +1,115 @@
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18346)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18347)
+@@ -166,41 +166,96 @@
+ 	/*Serialize u and udot*/
+ 	IssmDouble* udot_serial = NULL;
+ 	IssmDouble* u_serial    = NULL;
+-	VecToMPISerial(&udot_serial,udot,IssmComm::GetComm());
+-	VecToMPISerial(&u_serial   ,u   ,IssmComm::GetComm());
++	IssmDouble* ml_serial    = NULL;
++	VecToMPISerial(&udot_serial,udot    ,IssmComm::GetComm());
++	VecToMPISerial(&u_serial   ,u       ,IssmComm::GetComm());
++	VecToMPISerial(&ml_serial  ,Ml_petsc,IssmComm::GetComm());
+ 
++	/*Anti diffusive fluxes*/
++	Vec Ri_plus  = NULL;
++	Vec Ri_minus = NULL;
++	double uiLmax = 3.;
++	double uiLmin = 2.;
++	VecDuplicate(u,&Ri_plus);
++	VecDuplicate(u,&Ri_minus);
++	for(int row=rstart; row<rend; row++){
++		double Pi_plus  = 0.;
++		double Pi_minus = 0.;
++		MatGetRow(Mc_petsc,row,&ncols, (const int**)&cols, (const double**)&vals);
++		MatGetRow(D_petsc ,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
++		_assert_(ncols==ncols2);
++		for(int j=0; j<ncols; j++) {
++			_assert_(cols[j]==cols2[j]);
++			d = vals[j]*(udot_serial[row] - udot_serial[cols[j]]) + vals2[j]*(u_serial[row] - u_serial[cols[j]]);
++			if(row!=cols[j]){
++				if(d>0.){
++					Pi_plus  += d;
++				}
++				else{
++					Pi_minus += d;
++				}
++			}
++		}
+ 
+-	/*Anti diffusive fluxes*/
+-	Mat F    = NULL;
++		/*Compute Qis and Ris*/
++		double Qi_plus  = ml_serial[row]/deltat*(uiLmax - u_serial[row]);
++		double Qi_minus = ml_serial[row]/deltat*(uiLmin - u_serial[row]);
++		d = 1.;
++		if(Pi_plus!=0.) d = min(1.,Qi_plus/Pi_plus);
++		VecSetValue(Ri_plus,row,(const double)d,INSERT_VALUES);
++		d = 1.;
++		if(Pi_minus!=0.) d = min(1.,Qi_minus/Pi_minus);
++		VecSetValue(Ri_minus,row,(const double)d,INSERT_VALUES);
++
++		MatRestoreRow(Mc_petsc, row,&ncols, (const int**)&cols, (const double**)&vals);
++		MatRestoreRow(D_petsc,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
++	}
++	VecAssemblyBegin(Ri_plus);
++	VecAssemblyEnd(  Ri_plus);
++	VecAssemblyBegin(Ri_minus);
++	VecAssemblyEnd(  Ri_minus);
++
++	/*Serialize Ris*/
++	IssmDouble* Ri_plus_serial  = NULL;
++	IssmDouble* Ri_minus_serial = NULL;
++	VecToMPISerial(&Ri_plus_serial,Ri_plus,IssmComm::GetComm());
++	VecToMPISerial(&Ri_minus_serial,Ri_minus,IssmComm::GetComm());
++	VecFree(&Ri_plus);
++	VecFree(&Ri_minus);
++
++	/*Build fbar*/
+ 	Vec Fbar = NULL;
+ 	VecDuplicate(u,&Fbar);
+-	MatDuplicate(D_petsc,MAT_SHARE_NONZERO_PATTERN,&F);
+ 	for(int row=rstart; row<rend; row++){
+ 		MatGetRow(Mc_petsc,row,&ncols, (const int**)&cols, (const double**)&vals);
+ 		MatGetRow(D_petsc ,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+ 		_assert_(ncols==ncols2);
+-		mi = 0.;
++		d = 0.;
+ 		for(int j=0; j<ncols; j++) {
+ 			_assert_(cols[j]==cols2[j]);
+-			d = vals[j]*(udot_serial[row] - udot_serial[cols[j]]) + vals2[j]*(u_serial[row] - u_serial[cols[j]]);
+-			if(row!=cols[j]) mi += d;
+-			MatSetValues(F,1,&row,1,&cols[j],(const double*)&d,INSERT_VALUES);
+-
++			if(row==cols[j]) continue;
++			double f_ij = vals[j]*(udot_serial[row] - udot_serial[cols[j]]) + vals2[j]*(u_serial[row] - u_serial[cols[j]]);
++			if(f_ij>0){
++				d += min(Ri_plus_serial[row],Ri_minus_serial[cols[j]]) * f_ij;
++			}
++			else{
++				d += min(Ri_minus_serial[row],Ri_plus_serial[cols[j]]) * f_ij;
++			}
+ 		}
+-		VecSetValue(Fbar,row,(const double)mi,INSERT_VALUES);
++		VecSetValue(Fbar,row,(const double)d,INSERT_VALUES);
+ 		MatRestoreRow(Mc_petsc, row,&ncols, (const int**)&cols, (const double**)&vals);
+ 		MatRestoreRow(D_petsc,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+ 	}
+-	MatAssemblyBegin(F,MAT_FINAL_ASSEMBLY);
+-	MatAssemblyEnd(  F,MAT_FINAL_ASSEMBLY);
+ 	VecAssemblyBegin(Fbar);
+ 	VecAssemblyEnd(  Fbar);
+ 
+ 	MatFree(&D_petsc);
+-	MatFree(&F);
+ 	delete Mc;
+ 	xDelete<IssmDouble>(udot_serial);
+ 	xDelete<IssmDouble>(u_serial);
++	xDelete<IssmDouble>(ml_serial);
++	xDelete<IssmDouble>(Ri_plus_serial);
++	xDelete<IssmDouble>(Ri_minus_serial);
+ 
+ 	/*Compute solution u^n+1 = u_L + deltat Ml^-1 fbar*/
+ 	VecDuplicate(u,&temp1);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18347-18348.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18347-18348.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18347-18348.diff	(revision 19102)
@@ -0,0 +1,270 @@
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18347)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18348)
+@@ -7,6 +7,111 @@
+ #include "../shared/shared.h"
+ #include "../modules/modules.h"
+ 
++#ifdef _HAVE_PETSC_
++void CreateDMatrix(Mat* pD,Mat K){/*{{{*/
++	/*Create D matrix such that:
++	 *
++	 * d_ij = max( -k_ij,0,-k_ji) off diagonal
++	 *
++	 * d_ii = - sum_{i!=j} d_ij for the diagonal
++	 *
++	 */
++
++	/*Intermediaries*/
++	int        ncols,ncols2,rstart,rend;
++	double     d,diagD;
++	Mat        D        = NULL;
++	Mat        K_transp = NULL;
++	int*       cols  = NULL;
++	int*       cols2 = NULL;
++	double*    vals  = NULL;
++	double*    vals2 = NULL;
++
++	/*First, we need to transpose K so that we access both k_ij and k_ji*/
++	MatTranspose(K,MAT_INITIAL_MATRIX,&K_transp);
++
++	/*Initialize output (D has the same non zero pattern as K)*/
++	MatDuplicate(K,MAT_SHARE_NONZERO_PATTERN,&D);
++
++	/*Go through the rows of K an K' and build D*/
++	MatGetOwnershipRange(K,&rstart,&rend);
++	for(int row=rstart; row<rend; row++){
++		diagD = 0.;
++		MatGetRow(K       ,row,&ncols, (const int**)&cols, (const double**)&vals);
++		MatGetRow(K_transp,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
++		_assert_(ncols==ncols2);
++		for(int j=0; j<ncols; j++) {
++			_assert_(cols[j]==cols2[j]);
++			d = max(max(-vals[j],-vals2[j]),0.);
++			MatSetValue(D,row,cols[j],(const double)d,INSERT_VALUES);
++			if(cols[j]!=row) diagD -= d;
++		}
++		MatSetValue(D,row,row,(const double)diagD,INSERT_VALUES);
++		MatRestoreRow(K       ,row,&ncols, (const int**)&cols, (const double**)&vals);
++		MatRestoreRow(K_transp,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
++	}
++	MatAssemblyBegin(D,MAT_FINAL_ASSEMBLY);
++	MatAssemblyEnd(  D,MAT_FINAL_ASSEMBLY);
++
++	/*Clean up and assign output pointer*/
++	MatFree(&K_transp);
++	*pD = D;
++}/*}}}*/
++void CreateLHS(Mat* pLHS,IssmDouble* pdmax,Mat K,Mat D,Vec Ml,IssmDouble theta,IssmDouble deltat,FemModel* femmodel,int configuration_type){/*{{{*/
++	/*Create Left Hand side of Lower order solution
++	 *
++	 * LHS = [ML − theta*detlat *(K+D)^n+1]
++	 *
++	 */
++
++	/*Intermediaries*/
++	int        dof,ncols,ncols2,rstart,rend;
++	double     d,mi,dmax = 0.;
++	Mat        LHS   = NULL;
++	int*       cols  = NULL;
++	int*       cols2 = NULL;
++	double*    vals  = NULL;
++	double*    vals2 = NULL;
++
++	MatDuplicate(K,MAT_SHARE_NONZERO_PATTERN,&LHS);
++	MatGetOwnershipRange(K,&rstart,&rend);
++	for(int row=rstart; row<rend; row++){
++		MatGetRow(K,row,&ncols, (const int**)&cols, (const double**)&vals);
++		MatGetRow(D,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
++		_assert_(ncols==ncols2);
++		for(int j=0; j<ncols; j++) {
++			_assert_(cols[j]==cols2[j]);
++			d = -theta*deltat*(vals[j] + vals2[j]);
++			if(cols[j]==row){
++				VecGetValues(Ml,1,(const int*)&cols[j],&mi);
++				d += mi;
++			}
++			if(fabs(d)>dmax) dmax = fabs(d);
++			MatSetValue(LHS,row,cols[j],(const double)d,INSERT_VALUES);
++		}
++		MatRestoreRow(K,row,&ncols, (const int**)&cols, (const double**)&vals);
++		MatRestoreRow(D,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
++	}
++
++	/*Penalize Dirichlet boundary*/
++	dmax = dmax * 1.e+3;
++	for(int i=0;i<femmodel->constraints->Size();i++){
++		Constraint* constraint=(Constraint*)femmodel->constraints->GetObjectByOffset(i);
++		if(constraint->InAnalysis(configuration_type)){
++			constraint->PenaltyDofAndValue(&dof,&d,femmodel->nodes,femmodel->parameters);
++			if(dof!=-1){
++				MatSetValue(LHS,dof,dof,(const double)dmax,INSERT_VALUES);
++			}
++		}
++	}
++	MatAssemblyBegin(LHS,MAT_FINAL_ASSEMBLY);
++	MatAssemblyEnd(  LHS,MAT_FINAL_ASSEMBLY);
++
++	/*Clean up and assign output pointer*/
++	*pdmax = dmax;
++	*pLHS  = LHS;
++}/*}}}*/
++#endif
+ void solutionsequence_fct(FemModel* femmodel){
+ 
+ 	/*intermediary: */
+@@ -17,11 +122,10 @@
+ 	Vector<IssmDouble>*  uf = NULL;
+ 	Vector<IssmDouble>*  ys = NULL;
+ 
+-	IssmDouble theta,deltat;
++	IssmDouble theta,deltat,dmax=0.;
+ 	int        dof,ncols,ncols2,ncols3,rstart,rend;
+ 	int        configuration_type,analysis_type;
+-	double     d,diagD,mi;
+-	double     dmax = 0.;
++	double     d,mi;
+ 	int*       cols  = NULL;
+ 	int*       cols2 = NULL;
+ 	int*       cols3 = NULL;
+@@ -44,38 +148,20 @@
+ 	analysis->MassMatrix(&Mc,femmodel);
+ 	analysis->FctKMatrix(&K,NULL,femmodel);
+ 
+-	/*Create D Matrix*/
+-	#ifdef _HAVE_PETSC_
+-	Mat K_transp = NULL;
++	/*Convert matrices to PETSc matrices*/
+ 	Mat D_petsc  = NULL;
+ 	Mat LHS      = NULL;
+ 	Mat K_petsc  = K->pmatrix->matrix;
+ 	Vec Ml_petsc = Ml->pvector->vector;
+ 	Mat Mc_petsc = Mc->pmatrix->matrix;
+-	MatTranspose(K_petsc,MAT_INITIAL_MATRIX,&K_transp);
+-	MatDuplicate(K_petsc,MAT_SHARE_NONZERO_PATTERN,&D_petsc);
+-	MatGetOwnershipRange(K_transp,&rstart,&rend);
+-	for(int row=rstart; row<rend; row++){
+-		diagD = 0.;
+-		MatGetRow(K_petsc ,row,&ncols, (const int**)&cols, (const double**)&vals);
+-		MatGetRow(K_transp,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+-		_assert_(ncols==ncols2);
+-		for(int j=0; j<ncols; j++) {
+-			_assert_(cols[j]==cols2[j]);
+-			d = max(max(-vals[j],-vals2[j]),0.);
+-			MatSetValues(D_petsc,1,&row,1,&cols[j],(const double*)&d,INSERT_VALUES);
+-			if(cols[j]!=row) diagD -= d;
+-		}
+-		MatSetValues(D_petsc,1,&row,1,&row,(const double*)&diagD,INSERT_VALUES);
+-		MatRestoreRow(K_petsc, row,&ncols, (const int**)&cols, (const double**)&vals);
+-		MatRestoreRow(K_transp,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+-	}
+-	MatAssemblyBegin(D_petsc,MAT_FINAL_ASSEMBLY);
+-	MatAssemblyEnd(  D_petsc,MAT_FINAL_ASSEMBLY);
+-	MatFree(&K_transp);
+ 
++	/*Create D Matrix*/
++	#ifdef _HAVE_PETSC_
++	CreateDMatrix(&D_petsc,K_petsc);
++
+ 	/*Create LHS: [ML − theta*detlat *(K+D)^n+1]*/
+ 	MatDuplicate(K_petsc,MAT_SHARE_NONZERO_PATTERN,&LHS);
++	MatGetOwnershipRange(K_petsc,&rstart,&rend);
+ 	for(int row=rstart; row<rend; row++){
+ 		MatGetRow(K_petsc,row,&ncols, (const int**)&cols, (const double**)&vals);
+ 		MatGetRow(D_petsc,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18347)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18348)
+@@ -1124,6 +1124,39 @@
+ 	*pdiv=total_divergence;
+ 
+ }/*}}}*/
++void FemModel::GetInputLocalMinMaxOnNodesx(IssmDouble** pmin,IssmDouble** pmax,int input_enum){/*{{{*/
++
++	/*Get vector sizes for current configuration*/
++	int configuration_type;
++	this->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
++	int numnodes = this->nodes->NumberOfNodes(configuration_type);
++
++	/*Initialize output vectors*/
++	IssmDouble* uLmin_local = xNew<IssmDouble>(numnodes);
++	IssmDouble* uLmax_local = xNew<IssmDouble>(numnodes);
++	IssmDouble* uLmin = xNew<IssmDouble>(numnodes);
++	IssmDouble* uLmax = xNew<IssmDouble>(numnodes);
++	for(int i=0;i<numnodes;i++){
++		uLmin_local[i] = +1.e+50;
++		uLmax_local[i] = -1.e+50;
++	}
++
++	for(int i=0;i<this->elements->Size();i++){
++		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		element->GetInputLocalMinMaxOnNodes(uLmin_local,uLmax_local,input_enum);
++	}
++
++	/*Synchronize all CPUs*/
++	ISSM_MPI_Allreduce((void*)uLmin_local,(void*)uLmin,numnodes,ISSM_MPI_DOUBLE,ISSM_MPI_MIN,IssmComm::GetComm());
++	ISSM_MPI_Allreduce((void*)uLmax_local,(void*)uLmax,numnodes,ISSM_MPI_DOUBLE,ISSM_MPI_MAX,IssmComm::GetComm());
++	xDelete<IssmDouble>(uLmin_local);
++	xDelete<IssmDouble>(uLmax_local);
++
++	/*Assign output pointers: */
++	*pmin=uLmin;
++	*pmax=uLmax;
++
++}/*}}}*/
+ void FemModel::IceVolumex(IssmDouble* pV){/*{{{*/
+ 
+ 	IssmDouble local_ice_volume = 0;
+Index: ../trunk-jpl/src/c/classes/Elements/Element.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18347)
++++ ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18348)
+@@ -84,6 +84,7 @@
+ 		void       GetInputListOnNodesVelocity(IssmDouble* pvalue,int enumtype);
+ 		void       GetInputListOnVertices(IssmDouble* pvalue,int enumtype);
+ 		void       GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue);
++		void       GetInputLocalMinMaxOnNodes(IssmDouble* min,IssmDouble* max,int input_enum);
+ 		void       GetInputValue(bool* pvalue,int enum_type);
+ 		void       GetInputValue(int* pvalue,int enum_type);
+ 		void       GetInputValue(IssmDouble* pvalue,int enum_type);
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18347)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18348)
+@@ -723,6 +723,22 @@
+ 	delete gauss;
+ }
+ /*}}}*/
++void       Element::GetInputLocalMinMaxOnNodes(IssmDouble* min,IssmDouble* max,int input_enum){/*{{{*/
++
++	Input* input = GetInput(input_enum);
++	if(!input){
++		_error_("Input "<<EnumToStringx(input_enum)<<" not found");
++	}
++
++	int numnodes = this->GetNumberOfNodes();
++	IssmDouble input_min = input->Min();
++	IssmDouble input_max = input->Max();
++	for(int i=0;i<numnodes;i++){
++		if(min[nodes[i]->Sid()]>input_min) min[nodes[i]->Sid()] = input_min;
++		if(max[nodes[i]->Sid()]<input_max) max[nodes[i]->Sid()] = input_max;
++	}
++}
++/*}}}*/
+ void       Element::GetInputValue(bool* pvalue,int inputenum){/*{{{*/
+ 
+ 	Input* input=inputs->GetInput(inputenum);
+Index: ../trunk-jpl/src/c/classes/FemModel.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.h	(revision 18347)
++++ ../trunk-jpl/src/c/classes/FemModel.h	(revision 18348)
+@@ -60,6 +60,7 @@
+ 		void SetCurrentConfiguration(int configuration_type,int analysis_type);
+ 
+ 		/*Modules*/ 
++		void GetInputLocalMinMaxOnNodesx(IssmDouble** pmin,IssmDouble** pmax,int input_enum);
+ 		void MassFluxx(IssmDouble* presponse);
+ 		void MaxAbsVxx(IssmDouble* presponse);
+ 		void MaxAbsVyx(IssmDouble* presponse);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18348-18349.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18348-18349.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18348-18349.diff	(revision 19102)
@@ -0,0 +1,54 @@
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18348)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18349)
+@@ -160,40 +160,8 @@
+ 	CreateDMatrix(&D_petsc,K_petsc);
+ 
+ 	/*Create LHS: [ML − theta*detlat *(K+D)^n+1]*/
+-	MatDuplicate(K_petsc,MAT_SHARE_NONZERO_PATTERN,&LHS);
+-	MatGetOwnershipRange(K_petsc,&rstart,&rend);
+-	for(int row=rstart; row<rend; row++){
+-		MatGetRow(K_petsc,row,&ncols, (const int**)&cols, (const double**)&vals);
+-		MatGetRow(D_petsc,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+-		_assert_(ncols==ncols2);
+-		for(int j=0; j<ncols; j++) {
+-			_assert_(cols[j]==cols2[j]);
+-			d = -theta*deltat*(vals[j] + vals2[j]);
+-			if(cols[j]==row){
+-				VecGetValues(Ml_petsc,1,(const int*)&cols[j],&mi);
+-				d += mi;
+-			}
+-			if(fabs(d)>dmax) dmax = fabs(d);
+-			MatSetValues(LHS,1,&row,1,&cols[j],(const double*)&d,INSERT_VALUES);
+-		}
+-		MatRestoreRow(K_petsc,row,&ncols, (const int**)&cols, (const double**)&vals);
+-		MatRestoreRow(D_petsc,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+-	}
++	CreateLHS(&LHS,&dmax,K_petsc,D_petsc,Ml_petsc,theta,deltat,femmodel,configuration_type);
+ 
+-	/*Penalize Dirichlet boundary*/
+-	dmax = dmax * 1.e+3;
+-	for(int i=0;i<femmodel->constraints->Size();i++){
+-		Constraint* constraint=(Constraint*)femmodel->constraints->GetObjectByOffset(i);
+-		if(constraint->InAnalysis(analysis_type)){
+-			constraint->PenaltyDofAndValue(&dof,&d,femmodel->nodes,femmodel->parameters);
+-			if(dof!=-1){
+-				MatSetValues(LHS,1,&dof,1,&dof,(const double*)&dmax,INSERT_VALUES);
+-			}
+-		}
+-	}
+-	MatAssemblyBegin(LHS,MAT_FINAL_ASSEMBLY);
+-	MatAssemblyEnd(  LHS,MAT_FINAL_ASSEMBLY);
+-
+ 	/*Create RHS: [ML + (1 − theta) deltaT L^n] u^n */
+ 	GetSolutionFromInputsx(&ug,femmodel);
+ 	Reducevectorgtofx(&uf, ug, femmodel->nodes,femmodel->parameters);
+@@ -264,6 +232,7 @@
+ 	double uiLmin = 2.;
+ 	VecDuplicate(u,&Ri_plus);
+ 	VecDuplicate(u,&Ri_minus);
++	MatGetOwnershipRange(K_petsc,&rstart,&rend);
+ 	for(int row=rstart; row<rend; row++){
+ 		double Pi_plus  = 0.;
+ 		double Pi_minus = 0.;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18349-18350.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18349-18350.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18349-18350.diff	(revision 19102)
@@ -0,0 +1,147 @@
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18349)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18350)
+@@ -111,6 +111,53 @@
+ 	*pdmax = dmax;
+ 	*pLHS  = LHS;
+ }/*}}}*/
++void CreateRHS(Vec* pRHS,Mat K,Mat D,Vec Ml,Vec u,IssmDouble theta,IssmDouble deltat,IssmDouble dmax,FemModel* femmodel,int configuration_type){/*{{{*/
++	/*Create Left Hand side of Lower order solution
++	 *
++	 * RHS = [ML + (1 − theta) deltaT L^n] u^n
++	 *
++	 * where L = K + D
++	 *
++	 */
++
++	/*Intermediaries*/
++	Vec         Ku  = NULL;
++	Vec         Du  = NULL;
++	Vec         RHS = NULL;
++	int         dof;
++	IssmDouble  d;
++
++	/*Initialize vectors*/
++	VecDuplicate(u,&Ku);
++	VecDuplicate(u,&Du);
++	VecDuplicate(u,&RHS);
++
++	/*Create RHS = M*u + (1-theta)*deltat*K*u + (1-theta)*deltat*D*u*/
++	MatMult(K,u,Ku);
++	MatMult(D,u,Du);
++	VecPointwiseMult(RHS,Ml,u);
++	VecAXPBYPCZ(RHS,(1-theta)*deltat,(1-theta)*deltat,1,Ku,Du);
++	VecFree(&Ku);
++	VecFree(&Du);
++
++	/*Penalize Dirichlet boundary*/
++	for(int i=0;i<femmodel->constraints->Size();i++){
++		Constraint* constraint=(Constraint*)femmodel->constraints->GetObjectByOffset(i);
++		if(constraint->InAnalysis(configuration_type)){
++			constraint->PenaltyDofAndValue(&dof,&d,femmodel->nodes,femmodel->parameters);
++			d = d*dmax;
++			if(dof!=-1){
++				VecSetValues(RHS,1,&dof,(const double*)&d,INSERT_VALUES);
++			}
++		}
++	}
++	VecAssemblyBegin(RHS);
++	VecAssemblyEnd(  RHS);
++
++	/*Assign output pointer*/
++	*pRHS = RHS;
++
++}/*}}}*/
+ #endif
+ void solutionsequence_fct(FemModel* femmodel){
+ 
+@@ -120,18 +167,15 @@
+ 	Matrix<IssmDouble>*  Mc = NULL;
+ 	Vector<IssmDouble>*  ug = NULL;
+ 	Vector<IssmDouble>*  uf = NULL;
+-	Vector<IssmDouble>*  ys = NULL;
+ 
+-	IssmDouble theta,deltat,dmax=0.;
+-	int        dof,ncols,ncols2,ncols3,rstart,rend;
+-	int        configuration_type,analysis_type;
+-	double     d,mi;
++	IssmDouble theta,deltat,dmax;
++	int        dof,ncols,ncols2,rstart,rend;
++	int        configuration_type;
++	double     d;
+ 	int*       cols  = NULL;
+ 	int*       cols2 = NULL;
+-	int*       cols3 = NULL;
+ 	double*    vals  = NULL;
+ 	double*    vals2 = NULL;
+-	double*    vals3 = NULL;
+ 
+ 	/*Create analysis*/
+ 	MasstransportAnalysis* analysis = new MasstransportAnalysis();
+@@ -139,7 +183,6 @@
+ 	/*Recover parameters: */
+ 	femmodel->parameters->FindParam(&deltat,TimesteppingTimeStepEnum);
+ 	femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
+-	femmodel->parameters->FindParam(&analysis_type,AnalysisTypeEnum);
+ 	femmodel->UpdateConstraintsx();
+ 	theta = 0.5;
+ 
+@@ -151,6 +194,8 @@
+ 	/*Convert matrices to PETSc matrices*/
+ 	Mat D_petsc  = NULL;
+ 	Mat LHS      = NULL;
++	Vec RHS      = NULL;
++	Vec u        = NULL;
+ 	Mat K_petsc  = K->pmatrix->matrix;
+ 	Vec Ml_petsc = Ml->pvector->vector;
+ 	Mat Mc_petsc = Mc->pmatrix->matrix;
+@@ -166,35 +211,9 @@
+ 	GetSolutionFromInputsx(&ug,femmodel);
+ 	Reducevectorgtofx(&uf, ug, femmodel->nodes,femmodel->parameters);
+ 	delete ug;
+-	Vec u  = uf->pvector->vector;
+-	Vec Ku = NULL;
+-	Vec Du = NULL;
+-	Vec RHS = NULL;
+-	VecDuplicate(u,&Ku);
+-	VecDuplicate(u,&Du);
+-	VecDuplicate(u,&RHS);
+-	MatMult(K_petsc,u,Ku);
+-	MatMult(D_petsc,u,Du);
+-	VecPointwiseMult(RHS,Ml_petsc,u);
+-	VecAXPBYPCZ(RHS,(1-theta)*deltat,(1-theta)*deltat,1,Ku,Du);// RHS = M*u + (1-theta)*deltat*K*u + (1-theta)*deltat*D*u
+-	VecFree(&Ku);
+-	VecFree(&Du);
++	CreateRHS(&RHS,K_petsc,D_petsc,Ml_petsc,uf->pvector->vector,theta,deltat,dmax,femmodel,configuration_type);
+ 	delete uf;
+ 
+-	/*Penalize Dirichlet boundary*/
+-	for(int i=0;i<femmodel->constraints->Size();i++){
+-		Constraint* constraint=(Constraint*)femmodel->constraints->GetObjectByOffset(i);
+-		if(constraint->InAnalysis(analysis_type)){
+-			constraint->PenaltyDofAndValue(&dof,&d,femmodel->nodes,femmodel->parameters);
+-			d = d*dmax;
+-			if(dof!=-1){
+-				VecSetValues(RHS,1,&dof,(const double*)&d,INSERT_VALUES);
+-			}
+-		}
+-	}
+-	VecAssemblyBegin(RHS);
+-	VecAssemblyEnd(  RHS);
+-
+ 	/*Go solve!*/
+ 	SolverxPetsc(&u,LHS,RHS,NULL,NULL, femmodel->parameters); 
+ 	MatFree(&LHS);
+@@ -324,9 +343,8 @@
+ 	uf =new Vector<IssmDouble>(u);
+ 	VecFree(&u);
+ 
+-	Mergesolutionfromftogx(&ug, uf,ys,femmodel->nodes,femmodel->parameters);delete uf; delete ys;
+-	InputUpdateFromSolutionx(femmodel,ug); 
+-	delete ug;  
++	InputUpdateFromSolutionx(femmodel,uf); 
++	delete uf;
+ 
+ 	#else
+ 	_error_("PETSc needs to be installed");
Index: /issm/oecreview/Archive/18296-19100/ISSM-18350-18351.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18350-18351.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18350-18351.diff	(revision 19102)
@@ -0,0 +1,398 @@
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18350)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18351)
+@@ -158,200 +158,225 @@
+ 	*pRHS = RHS;
+ 
+ }/*}}}*/
++void RichardsonUdot(Vec* pudot,Vec u,Vec Ml,Mat K,Mat Mc){/*{{{*/
++	/*Use Richardson's formulato get udot using 5 steps and an initial guess of 0
++	 *
++	 * udot_new = udot_old + Ml^-1 (K^(n+1) u - Mc udot_old)
++	 *
++	 * */
++
++	/*Intermediaries*/
++	Vec udot  = NULL;
++	Vec temp1 = NULL;
++	Vec temp2 = NULL;
++
++	/*Initialize vectors*/
++	VecDuplicate(u,&udot);
++	VecDuplicate(u,&temp1);
++	VecDuplicate(u,&temp2);
++
++	/*Initial guess*/
++	VecZeroEntries(udot);
++	
++	/*Richardson's iterations*/
++	for(int i=0;i<5;i++){
++		MatMult(Mc,udot,temp1);
++		MatMult(K, u,   temp2);
++		VecAXPBY(temp2,-1.,1.,temp1);       // temp2 = (K^(n+1) u -- Mc udot_old)
++		VecPointwiseDivide(temp1,temp2,Ml); // temp1 = Ml^-1 temp2
++		VecAXPBY(udot,1.,1.,temp1);
++	}
++
++	/*Clean up and assign output pointer*/
++	VecFree(&temp1);
++	VecFree(&temp2);
++	*pudot=udot;
++
++}/*}}}*/
+ #endif
+-void solutionsequence_fct(FemModel* femmodel){
++	void solutionsequence_fct(FemModel* femmodel){
+ 
+-	/*intermediary: */
+-	Vector<IssmDouble>*  Ml = NULL;
+-	Matrix<IssmDouble>*  K  = NULL;
+-	Matrix<IssmDouble>*  Mc = NULL;
+-	Vector<IssmDouble>*  ug = NULL;
+-	Vector<IssmDouble>*  uf = NULL;
++		/*intermediary: */
++		Vector<IssmDouble>*  Ml = NULL;
++		Matrix<IssmDouble>*  K  = NULL;
++		Matrix<IssmDouble>*  Mc = NULL;
++		Vector<IssmDouble>*  ug = NULL;
++		Vector<IssmDouble>*  uf = NULL;
+ 
+-	IssmDouble theta,deltat,dmax;
+-	int        dof,ncols,ncols2,rstart,rend;
+-	int        configuration_type;
+-	double     d;
+-	int*       cols  = NULL;
+-	int*       cols2 = NULL;
+-	double*    vals  = NULL;
+-	double*    vals2 = NULL;
++		IssmDouble theta,deltat,dmax;
++		int        dof,ncols,ncols2,rstart,rend;
++		int        configuration_type;
++		double     d;
++		int*       cols  = NULL;
++		int*       cols2 = NULL;
++		double*    vals  = NULL;
++		double*    vals2 = NULL;
+ 
+-	/*Create analysis*/
+-	MasstransportAnalysis* analysis = new MasstransportAnalysis();
++		/*Create analysis*/
++		MasstransportAnalysis* analysis = new MasstransportAnalysis();
+ 
+-	/*Recover parameters: */
+-	femmodel->parameters->FindParam(&deltat,TimesteppingTimeStepEnum);
+-	femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
+-	femmodel->UpdateConstraintsx();
+-	theta = 0.5;
++		/*Recover parameters: */
++		femmodel->parameters->FindParam(&deltat,TimesteppingTimeStepEnum);
++		femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
++		femmodel->UpdateConstraintsx();
++		theta = 0.5;
+ 
+-	/*Create lumped mass matrix*/
+-	analysis->LumpedMassMatrix(&Ml,femmodel);
+-	analysis->MassMatrix(&Mc,femmodel);
+-	analysis->FctKMatrix(&K,NULL,femmodel);
++		/*Create lumped mass matrix*/
++		analysis->LumpedMassMatrix(&Ml,femmodel);
++		analysis->MassMatrix(&Mc,femmodel);
++		analysis->FctKMatrix(&K,NULL,femmodel);
+ 
+-	/*Convert matrices to PETSc matrices*/
+-	Mat D_petsc  = NULL;
+-	Mat LHS      = NULL;
+-	Vec RHS      = NULL;
+-	Vec u        = NULL;
+-	Mat K_petsc  = K->pmatrix->matrix;
+-	Vec Ml_petsc = Ml->pvector->vector;
+-	Mat Mc_petsc = Mc->pmatrix->matrix;
++		/*Convert matrices to PETSc matrices*/
++		Mat D_petsc  = NULL;
++		Mat LHS      = NULL;
++		Vec RHS      = NULL;
++		Vec u        = NULL;
++		Vec udot     = NULL;
++		Mat K_petsc  = K->pmatrix->matrix;
++		Vec Ml_petsc = Ml->pvector->vector;
++		Mat Mc_petsc = Mc->pmatrix->matrix;
+ 
+-	/*Create D Matrix*/
+-	#ifdef _HAVE_PETSC_
+-	CreateDMatrix(&D_petsc,K_petsc);
++		/*Create D Matrix*/
++		#ifdef _HAVE_PETSC_
++		CreateDMatrix(&D_petsc,K_petsc);
+ 
+-	/*Create LHS: [ML − theta*detlat *(K+D)^n+1]*/
+-	CreateLHS(&LHS,&dmax,K_petsc,D_petsc,Ml_petsc,theta,deltat,femmodel,configuration_type);
++		/*Create LHS: [ML − theta*detlat *(K+D)^n+1]*/
++		CreateLHS(&LHS,&dmax,K_petsc,D_petsc,Ml_petsc,theta,deltat,femmodel,configuration_type);
+ 
+-	/*Create RHS: [ML + (1 − theta) deltaT L^n] u^n */
+-	GetSolutionFromInputsx(&ug,femmodel);
+-	Reducevectorgtofx(&uf, ug, femmodel->nodes,femmodel->parameters);
+-	delete ug;
+-	CreateRHS(&RHS,K_petsc,D_petsc,Ml_petsc,uf->pvector->vector,theta,deltat,dmax,femmodel,configuration_type);
+-	delete uf;
++		/*Get previous solution u^n*/
++		GetSolutionFromInputsx(&ug,femmodel);
++		Reducevectorgtofx(&uf, ug, femmodel->nodes,femmodel->parameters);
++		delete ug;
+ 
+-	/*Go solve!*/
+-	SolverxPetsc(&u,LHS,RHS,NULL,NULL, femmodel->parameters); 
+-	MatFree(&LHS);
+-	VecFree(&RHS);
++		/*Create RHS: [ML + (1 − theta) deltaT L^n] u^n */
++		CreateRHS(&RHS,K_petsc,D_petsc,Ml_petsc,uf->pvector->vector,theta,deltat,dmax,femmodel,configuration_type);
++		delete uf;
+ 
+-	/*Richardson to calculate udot*/
+-	Vec udot = NULL;
+-	VecDuplicate(u,&udot);
+-	VecZeroEntries(udot);
+-	Vec temp1 = NULL; VecDuplicate(u,&temp1);
+-	Vec temp2 = NULL; VecDuplicate(u,&temp2);
+-	for(int i=0;i<5;i++){
+-		/*udot_new = udot_old + Ml^-1 (K^(n+1) u -- Mc udot_old)*/
+-		MatMult(Mc_petsc,udot,temp1);
+-		MatMult(K_petsc, u,   temp2);
+-		VecAXPBY(temp2,-1.,1.,temp1); // temp2 = (K^(n+1) u -- Mc udot_old)
+-		VecPointwiseDivide(temp1,temp2,Ml_petsc); //temp1 = Ml^-1 temp2
+-		VecAXPBY(udot,1.,1.,temp1);
+-	}
+-	VecFree(&temp1);
+-	VecFree(&temp2);
++		/*Go solve!*/
++		SolverxPetsc(&u,LHS,RHS,NULL,NULL, femmodel->parameters); 
++		MatFree(&LHS);
++		VecFree(&RHS);
+ 
+-	/*Serialize u and udot*/
+-	IssmDouble* udot_serial = NULL;
+-	IssmDouble* u_serial    = NULL;
+-	IssmDouble* ml_serial    = NULL;
+-	VecToMPISerial(&udot_serial,udot    ,IssmComm::GetComm());
+-	VecToMPISerial(&u_serial   ,u       ,IssmComm::GetComm());
+-	VecToMPISerial(&ml_serial  ,Ml_petsc,IssmComm::GetComm());
++		/*Richardson to calculate udot*/
++		RichardsonUdot(&udot,u,Ml_petsc,K_petsc,Mc_petsc);
+ 
+-	/*Anti diffusive fluxes*/
+-	Vec Ri_plus  = NULL;
+-	Vec Ri_minus = NULL;
+-	double uiLmax = 3.;
+-	double uiLmin = 2.;
+-	VecDuplicate(u,&Ri_plus);
+-	VecDuplicate(u,&Ri_minus);
+-	MatGetOwnershipRange(K_petsc,&rstart,&rend);
+-	for(int row=rstart; row<rend; row++){
+-		double Pi_plus  = 0.;
+-		double Pi_minus = 0.;
+-		MatGetRow(Mc_petsc,row,&ncols, (const int**)&cols, (const double**)&vals);
+-		MatGetRow(D_petsc ,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+-		_assert_(ncols==ncols2);
+-		for(int j=0; j<ncols; j++) {
+-			_assert_(cols[j]==cols2[j]);
+-			d = vals[j]*(udot_serial[row] - udot_serial[cols[j]]) + vals2[j]*(u_serial[row] - u_serial[cols[j]]);
+-			if(row!=cols[j]){
+-				if(d>0.){
+-					Pi_plus  += d;
++		/*Serialize u and udot*/
++		IssmDouble* udot_serial = NULL;
++		IssmDouble* u_serial    = NULL;
++		IssmDouble* ml_serial    = NULL;
++		VecToMPISerial(&udot_serial,udot    ,IssmComm::GetComm());
++		VecToMPISerial(&u_serial   ,u       ,IssmComm::GetComm());
++		VecToMPISerial(&ml_serial  ,Ml_petsc,IssmComm::GetComm());
++
++		/*Anti diffusive fluxes*/
++		Vec Ri_plus  = NULL;
++		Vec Ri_minus = NULL;
++		double uiLmax = 3.;
++		double uiLmin = 2.;
++		VecDuplicate(u,&Ri_plus);
++		VecDuplicate(u,&Ri_minus);
++		MatGetOwnershipRange(K_petsc,&rstart,&rend);
++		for(int row=rstart; row<rend; row++){
++			double Pi_plus  = 0.;
++			double Pi_minus = 0.;
++			MatGetRow(Mc_petsc,row,&ncols, (const int**)&cols, (const double**)&vals);
++			MatGetRow(D_petsc ,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
++			_assert_(ncols==ncols2);
++			for(int j=0; j<ncols; j++) {
++				_assert_(cols[j]==cols2[j]);
++				d = vals[j]*(udot_serial[row] - udot_serial[cols[j]]) + vals2[j]*(u_serial[row] - u_serial[cols[j]]);
++				if(row!=cols[j]){
++					if(d>0.){
++						Pi_plus  += d;
++					}
++					else{
++						Pi_minus += d;
++					}
+ 				}
+-				else{
+-					Pi_minus += d;
+-				}
+ 			}
+-		}
+ 
+-		/*Compute Qis and Ris*/
+-		double Qi_plus  = ml_serial[row]/deltat*(uiLmax - u_serial[row]);
+-		double Qi_minus = ml_serial[row]/deltat*(uiLmin - u_serial[row]);
+-		d = 1.;
+-		if(Pi_plus!=0.) d = min(1.,Qi_plus/Pi_plus);
+-		VecSetValue(Ri_plus,row,(const double)d,INSERT_VALUES);
+-		d = 1.;
+-		if(Pi_minus!=0.) d = min(1.,Qi_minus/Pi_minus);
+-		VecSetValue(Ri_minus,row,(const double)d,INSERT_VALUES);
++			/*Compute Qis and Ris*/
++			double Qi_plus  = ml_serial[row]/deltat*(uiLmax - u_serial[row]);
++			double Qi_minus = ml_serial[row]/deltat*(uiLmin - u_serial[row]);
++			d = 1.;
++			if(Pi_plus!=0.) d = min(1.,Qi_plus/Pi_plus);
++			VecSetValue(Ri_plus,row,(const double)d,INSERT_VALUES);
++			d = 1.;
++			if(Pi_minus!=0.) d = min(1.,Qi_minus/Pi_minus);
++			VecSetValue(Ri_minus,row,(const double)d,INSERT_VALUES);
+ 
+-		MatRestoreRow(Mc_petsc, row,&ncols, (const int**)&cols, (const double**)&vals);
+-		MatRestoreRow(D_petsc,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+-	}
+-	VecAssemblyBegin(Ri_plus);
+-	VecAssemblyEnd(  Ri_plus);
+-	VecAssemblyBegin(Ri_minus);
+-	VecAssemblyEnd(  Ri_minus);
++			MatRestoreRow(Mc_petsc, row,&ncols, (const int**)&cols, (const double**)&vals);
++			MatRestoreRow(D_petsc,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
++		}
++		VecAssemblyBegin(Ri_plus);
++		VecAssemblyEnd(  Ri_plus);
++		VecAssemblyBegin(Ri_minus);
++		VecAssemblyEnd(  Ri_minus);
+ 
+-	/*Serialize Ris*/
+-	IssmDouble* Ri_plus_serial  = NULL;
+-	IssmDouble* Ri_minus_serial = NULL;
+-	VecToMPISerial(&Ri_plus_serial,Ri_plus,IssmComm::GetComm());
+-	VecToMPISerial(&Ri_minus_serial,Ri_minus,IssmComm::GetComm());
+-	VecFree(&Ri_plus);
+-	VecFree(&Ri_minus);
++		/*Serialize Ris*/
++		IssmDouble* Ri_plus_serial  = NULL;
++		IssmDouble* Ri_minus_serial = NULL;
++		VecToMPISerial(&Ri_plus_serial,Ri_plus,IssmComm::GetComm());
++		VecToMPISerial(&Ri_minus_serial,Ri_minus,IssmComm::GetComm());
++		VecFree(&Ri_plus);
++		VecFree(&Ri_minus);
+ 
+-	/*Build fbar*/
+-	Vec Fbar = NULL;
+-	VecDuplicate(u,&Fbar);
+-	for(int row=rstart; row<rend; row++){
+-		MatGetRow(Mc_petsc,row,&ncols, (const int**)&cols, (const double**)&vals);
+-		MatGetRow(D_petsc ,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+-		_assert_(ncols==ncols2);
+-		d = 0.;
+-		for(int j=0; j<ncols; j++) {
+-			_assert_(cols[j]==cols2[j]);
+-			if(row==cols[j]) continue;
+-			double f_ij = vals[j]*(udot_serial[row] - udot_serial[cols[j]]) + vals2[j]*(u_serial[row] - u_serial[cols[j]]);
+-			if(f_ij>0){
+-				d += min(Ri_plus_serial[row],Ri_minus_serial[cols[j]]) * f_ij;
++		/*Build fbar*/
++		Vec Fbar = NULL;
++		VecDuplicate(u,&Fbar);
++		for(int row=rstart; row<rend; row++){
++			MatGetRow(Mc_petsc,row,&ncols, (const int**)&cols, (const double**)&vals);
++			MatGetRow(D_petsc ,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
++			_assert_(ncols==ncols2);
++			d = 0.;
++			for(int j=0; j<ncols; j++) {
++				_assert_(cols[j]==cols2[j]);
++				if(row==cols[j]) continue;
++				double f_ij = vals[j]*(udot_serial[row] - udot_serial[cols[j]]) + vals2[j]*(u_serial[row] - u_serial[cols[j]]);
++				if(f_ij>0){
++					d += min(Ri_plus_serial[row],Ri_minus_serial[cols[j]]) * f_ij;
++				}
++				else{
++					d += min(Ri_minus_serial[row],Ri_plus_serial[cols[j]]) * f_ij;
++				}
+ 			}
+-			else{
+-				d += min(Ri_minus_serial[row],Ri_plus_serial[cols[j]]) * f_ij;
+-			}
++			VecSetValue(Fbar,row,(const double)d,INSERT_VALUES);
++			MatRestoreRow(Mc_petsc, row,&ncols, (const int**)&cols, (const double**)&vals);
++			MatRestoreRow(D_petsc,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+ 		}
+-		VecSetValue(Fbar,row,(const double)d,INSERT_VALUES);
+-		MatRestoreRow(Mc_petsc, row,&ncols, (const int**)&cols, (const double**)&vals);
+-		MatRestoreRow(D_petsc,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+-	}
+-	VecAssemblyBegin(Fbar);
+-	VecAssemblyEnd(  Fbar);
++		VecAssemblyBegin(Fbar);
++		VecAssemblyEnd(  Fbar);
+ 
+-	MatFree(&D_petsc);
+-	delete Mc;
+-	xDelete<IssmDouble>(udot_serial);
+-	xDelete<IssmDouble>(u_serial);
+-	xDelete<IssmDouble>(ml_serial);
+-	xDelete<IssmDouble>(Ri_plus_serial);
+-	xDelete<IssmDouble>(Ri_minus_serial);
++		MatFree(&D_petsc);
++		delete Mc;
++		xDelete<IssmDouble>(udot_serial);
++		xDelete<IssmDouble>(u_serial);
++		xDelete<IssmDouble>(ml_serial);
++		xDelete<IssmDouble>(Ri_plus_serial);
++		xDelete<IssmDouble>(Ri_minus_serial);
+ 
+-	/*Compute solution u^n+1 = u_L + deltat Ml^-1 fbar*/
+-	VecDuplicate(u,&temp1);
+-	VecPointwiseDivide(temp1,Fbar,Ml_petsc); //temp1 = Ml^-1 temp2
+-	VecAXPBY(udot,1.,1.,temp1);
+-	VecAXPY(u,deltat,temp1);
+-	VecFree(&Fbar);
+-	VecFree(&udot);
+-	VecFree(&temp1);
++		/*Compute solution u^n+1 = u_L + deltat Ml^-1 fbar*/
++		Vec temp1 = NULL; VecDuplicate(u,&temp1);
++		VecDuplicate(u,&temp1);
++		VecPointwiseDivide(temp1,Fbar,Ml_petsc); //temp1 = Ml^-1 temp2
++		VecAXPBY(udot,1.,1.,temp1);
++		VecAXPY(u,deltat,temp1);
++		VecFree(&Fbar);
++		VecFree(&udot);
++		VecFree(&temp1);
+ 
+-	uf =new Vector<IssmDouble>(u);
+-	VecFree(&u);
++		uf =new Vector<IssmDouble>(u);
++		VecFree(&u);
+ 
+-	InputUpdateFromSolutionx(femmodel,uf); 
+-	delete uf;
++		InputUpdateFromSolutionx(femmodel,uf); 
++		delete uf;
+ 
+-	#else
+-	_error_("PETSc needs to be installed");
+-	#endif
++		#else
++		_error_("PETSc needs to be installed");
++		#endif
+ 
+-	delete Ml;
+-	delete K;
+-	delete analysis;
++		delete Ml;
++		delete K;
++		delete analysis;
+ 
+-}
++	}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18353-18354.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18353-18354.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18353-18354.diff	(revision 19102)
@@ -0,0 +1,21 @@
+Index: ../trunk-jpl/externalpackages/triangle/install.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/triangle/install.sh	(revision 18353)
++++ ../trunk-jpl/externalpackages/triangle/install.sh	(revision 18354)
+@@ -22,10 +22,10 @@
+ tar -xvf ./triangle-libtool.tar.gz
+ 
+ autoreconf -ivf
+-./configure --prefix="${ISSM_DIR}/externalpackages/triangle/install"
++./configure --prefix="${ISSM_DIR}/externalpackages/triangle/install" --disable-executables
+ 
+ make 
+ make install
+ 
+ #Patch triangle.h
+-patch ../install/include/triangle.h ../triangle.h.patch
++patch ${ISSM_DIR}/externalpackages/triangle/install/include/triangle.h ${ISSM_DIR}/externalpackages/triangle/triangle.h.patch
+Index: ../trunk-jpl/externalpackages/triangle/configs/triangle-libtool.tar.gz
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
Index: /issm/oecreview/Archive/18296-19100/ISSM-18354-18355.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18354-18355.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18354-18355.diff	(revision 19102)
@@ -0,0 +1,253 @@
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18354)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18355)
+@@ -193,13 +193,11 @@
+ 	*pudot=udot;
+ 
+ }/*}}}*/
+-void CreateRis(IssmDouble** pRi_plus_serial,IssmDouble** pRi_minus_serial,Mat Mc,Mat D,IssmDouble* ml_serial,Vec uvec,IssmDouble* u,IssmDouble* udot,IssmDouble deltat){/*{{{*/
++void CreateRis(IssmDouble** pRi_plus_serial,IssmDouble** pRi_minus_serial,Mat Mc,Mat D,IssmDouble* ml_serial,Vec uvec,IssmDouble* u,IssmDouble* udot,IssmDouble* ulmin,IssmDouble* ulmax,IssmDouble deltat){/*{{{*/
+ 
+ 	/*Intermediaries*/
+ 	Vec         Ri_plus  = NULL;
+ 	Vec         Ri_minus = NULL;
+-	IssmDouble  uiLmax   = 3.;
+-	IssmDouble  uiLmin   = 2.;
+ 	int         ncols,ncols2,rstart,rend;
+ 	double      d;
+ 	int        *cols     = NULL;
+@@ -233,8 +231,10 @@
+ 		}
+ 
+ 		/*Compute Qis and Ris*/
+-		double Qi_plus  = ml_serial[row]/deltat*(uiLmax - u[row]);
+-		double Qi_minus = ml_serial[row]/deltat*(uiLmin - u[row]);
++		double Qi_plus  = ml_serial[row]/deltat*(3. - u[row]);
++		double Qi_minus = ml_serial[row]/deltat*(2. - u[row]);
++		//double Qi_plus  = ml_serial[row]/deltat*(ulmax[row] - u[row]);
++		//double Qi_minus = ml_serial[row]/deltat*(ulmin[row] - u[row]);
+ 		d = 1.;
+ 		if(Pi_plus!=0.) d = min(1.,Qi_plus/Pi_plus);
+ 		VecSetValue(Ri_plus,row,(const double)d,INSERT_VALUES);
+@@ -302,119 +302,124 @@
+ 	/*Assign output pointer*/
+ 	*pFbar = Fbar;
+ }/*}}}*/
+-#endif
+-	void solutionsequence_fct(FemModel* femmodel){
++void UpdateSolution(Vec u,Vec udot,Vec Ml,Vec Fbar,IssmDouble deltat){/*{{{*/
+ 
+-		/*intermediary: */
+-		Vector<IssmDouble>*  Ml = NULL;
+-		Matrix<IssmDouble>*  K  = NULL;
+-		Matrix<IssmDouble>*  Mc = NULL;
+-		Vector<IssmDouble>*  ug = NULL;
+-		Vector<IssmDouble>*  uf = NULL;
++	/*Intermediary*/
++	Vec temp1 = NULL;
+ 
+-		IssmDouble theta,deltat,dmax;
+-		int        dof,ncols,ncols2,rstart,rend;
+-		int        configuration_type;
+-		double     d;
+-		int*       cols  = NULL;
+-		int*       cols2 = NULL;
+-		double*    vals  = NULL;
+-		double*    vals2 = NULL;
++	/*Compute solution u^n+1 = u_L + deltat Ml^-1 fbar*/
++	VecDuplicate(u,&temp1);
++	VecPointwiseDivide(temp1,Fbar,Ml); //temp1 = Ml^-1 temp2
++	VecAXPBY(udot,1.,1.,temp1);
++	VecAXPY(u,deltat,temp1);
+ 
+-		/*Create analysis*/
+-		MasstransportAnalysis* analysis = new MasstransportAnalysis();
++	/*CLean up and return*/
++	VecFree(&temp1);
++}/*}}}*/
++#endif
++void solutionsequence_fct(FemModel* femmodel){
+ 
+-		/*Recover parameters: */
+-		femmodel->parameters->FindParam(&deltat,TimesteppingTimeStepEnum);
+-		femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
+-		femmodel->UpdateConstraintsx();
+-		theta = 0.5;
++	/*intermediary: */
++	IssmDouble           theta,deltat,dmax;
++	int                  configuration_type;
++	Vector<IssmDouble>*  Ml = NULL;
++	Matrix<IssmDouble>*  K  = NULL;
++	Matrix<IssmDouble>*  Mc = NULL;
++	Vector<IssmDouble>*  ug = NULL;
++	Vector<IssmDouble>*  uf = NULL;
+ 
+-		/*Create lumped mass matrix*/
+-		analysis->LumpedMassMatrix(&Ml,femmodel);
+-		analysis->MassMatrix(&Mc,femmodel);
+-		analysis->FctKMatrix(&K,NULL,femmodel);
++	/*Create analysis*/
++	MasstransportAnalysis* analysis = new MasstransportAnalysis();
+ 
+-		/*Convert matrices to PETSc matrices*/
+-		Mat D_petsc  = NULL;
+-		Mat LHS      = NULL;
+-		Vec RHS      = NULL;
+-		Vec u        = NULL;
+-		Vec udot     = NULL;
+-		Mat K_petsc  = K->pmatrix->matrix;
+-		Vec Ml_petsc = Ml->pvector->vector;
+-		Mat Mc_petsc = Mc->pmatrix->matrix;
++	/*Recover parameters: */
++	femmodel->parameters->FindParam(&deltat,TimesteppingTimeStepEnum);
++	femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
++	femmodel->UpdateConstraintsx();
++	theta = 0.5;
+ 
+-		/*Create D Matrix*/
+-		#ifdef _HAVE_PETSC_
+-		CreateDMatrix(&D_petsc,K_petsc);
++	/*Create lumped mass matrix*/
++	analysis->LumpedMassMatrix(&Ml,femmodel);
++	analysis->MassMatrix(&Mc,femmodel);
++	analysis->FctKMatrix(&K,NULL,femmodel);
++	delete analysis;
+ 
+-		/*Create LHS: [ML − theta*detlat *(K+D)^n+1]*/
+-		CreateLHS(&LHS,&dmax,K_petsc,D_petsc,Ml_petsc,theta,deltat,femmodel,configuration_type);
++	/*Convert matrices to PETSc matrices*/
++	Mat D_petsc  = NULL;
++	Mat LHS      = NULL;
++	Vec RHS      = NULL;
++	Vec u        = NULL;
++	Vec udot     = NULL;
++	Mat K_petsc  = K->pmatrix->matrix;
++	Vec Ml_petsc = Ml->pvector->vector;
++	Mat Mc_petsc = Mc->pmatrix->matrix;
+ 
+-		/*Get previous solution u^n*/
+-		GetSolutionFromInputsx(&ug,femmodel);
+-		Reducevectorgtofx(&uf, ug, femmodel->nodes,femmodel->parameters);
+-		delete ug;
++	/*Create D Matrix*/
++	#ifdef _HAVE_PETSC_
++	CreateDMatrix(&D_petsc,K_petsc);
+ 
+-		/*Create RHS: [ML + (1 − theta) deltaT L^n] u^n */
+-		CreateRHS(&RHS,K_petsc,D_petsc,Ml_petsc,uf->pvector->vector,theta,deltat,dmax,femmodel,configuration_type);
+-		delete uf;
++	/*Create LHS: [ML − theta*detlat *(K+D)^n+1]*/
++	CreateLHS(&LHS,&dmax,K_petsc,D_petsc,Ml_petsc,theta,deltat,femmodel,configuration_type);
+ 
+-		/*Go solve lower order solution*/
+-		SolverxPetsc(&u,LHS,RHS,NULL,NULL, femmodel->parameters); 
+-		MatFree(&LHS);
+-		VecFree(&RHS);
++	/*Get previous solution u^n*/
++	GetSolutionFromInputsx(&ug,femmodel);
++	Reducevectorgtofx(&uf, ug, femmodel->nodes,femmodel->parameters);
++	delete ug;
+ 
+-		/*Richardson to calculate udot*/
+-		RichardsonUdot(&udot,u,Ml_petsc,K_petsc,Mc_petsc);
++	/*Create RHS: [ML + (1 − theta) deltaT L^n] u^n */
++	CreateRHS(&RHS,K_petsc,D_petsc,Ml_petsc,uf->pvector->vector,theta,deltat,dmax,femmodel,configuration_type);
++	delete uf;
+ 
+-		/*Serialize u and udot*/
+-		IssmDouble* udot_serial = NULL;
+-		IssmDouble* u_serial    = NULL;
+-		IssmDouble* ml_serial   = NULL;
+-		VecToMPISerial(&udot_serial,udot    ,IssmComm::GetComm());
+-		VecToMPISerial(&u_serial   ,u       ,IssmComm::GetComm());
+-		VecToMPISerial(&ml_serial  ,Ml_petsc,IssmComm::GetComm());
++	/*Go solve lower order solution*/
++	SolverxPetsc(&u,LHS,RHS,NULL,NULL, femmodel->parameters); 
++	MatFree(&LHS);
++	VecFree(&RHS);
+ 
+-		/*Anti diffusive fluxes*/
+-		Vec         Fbar            = NULL;
+-		IssmDouble* Ri_minus_serial = NULL;
+-		IssmDouble* Ri_plus_serial  = NULL;
+-		CreateRis(&Ri_plus_serial,&Ri_minus_serial,Mc_petsc,D_petsc,ml_serial,u,u_serial,udot_serial,deltat);
+-		CreateFbar(&Fbar,Ri_plus_serial,Ri_minus_serial,Mc_petsc,D_petsc,udot_serial,u_serial,u);
++	/*Richardson to calculate udot*/
++	RichardsonUdot(&udot,u,Ml_petsc,K_petsc,Mc_petsc);
++	delete K;
+ 
+-		/*Clean up*/
+-		MatFree(&D_petsc);
+-		delete Mc;
+-		xDelete<IssmDouble>(udot_serial);
+-		xDelete<IssmDouble>(u_serial);
+-		xDelete<IssmDouble>(ml_serial);
+-		xDelete<IssmDouble>(Ri_plus_serial);
+-		xDelete<IssmDouble>(Ri_minus_serial);
++	/*Serialize u and udot*/
++	IssmDouble* udot_serial = NULL;
++	IssmDouble* u_serial    = NULL;
++	IssmDouble* ml_serial   = NULL;
++	VecToMPISerial(&udot_serial,udot    ,IssmComm::GetComm());
++	VecToMPISerial(&u_serial   ,u       ,IssmComm::GetComm());
++	VecToMPISerial(&ml_serial  ,Ml_petsc,IssmComm::GetComm());
+ 
+-		/*Compute solution u^n+1 = u_L + deltat Ml^-1 fbar*/
+-		Vec temp1 = NULL;
+-		VecDuplicate(u,&temp1);
+-		VecPointwiseDivide(temp1,Fbar,Ml_petsc); //temp1 = Ml^-1 temp2
+-		VecAXPBY(udot,1.,1.,temp1);
+-		VecAXPY(u,deltat,temp1);
+-		VecFree(&Fbar);
+-		VecFree(&udot);
+-		VecFree(&temp1);
++	/*Anti diffusive fluxes*/
++	Vec         Fbar            = NULL;
++	IssmDouble *Ri_minus_serial = NULL;
++	IssmDouble *Ri_plus_serial  = NULL;
++	IssmDouble *ulmin           = NULL;
++	IssmDouble *ulmax           = NULL;
++	femmodel->GetInputLocalMinMaxOnNodesx(&ulmin,&ulmax,ThicknessEnum);
++	CreateRis(&Ri_plus_serial,&Ri_minus_serial,Mc_petsc,D_petsc,ml_serial,u,u_serial,udot_serial,ulmin,ulmax,deltat);
++	CreateFbar(&Fbar,Ri_plus_serial,Ri_minus_serial,Mc_petsc,D_petsc,udot_serial,u_serial,u);
++	xDelete<IssmDouble>(Ri_plus_serial);
++	xDelete<IssmDouble>(Ri_minus_serial);
++	xDelete<IssmDouble>(ulmin);
++	xDelete<IssmDouble>(ulmax);
+ 
+-		uf =new Vector<IssmDouble>(u);
+-		VecFree(&u);
++	/*Clean up*/
++	MatFree(&D_petsc);
++	delete Mc;
++	xDelete<IssmDouble>(udot_serial);
++	xDelete<IssmDouble>(u_serial);
++	xDelete<IssmDouble>(ml_serial);
+ 
+-		InputUpdateFromSolutionx(femmodel,uf); 
+-		delete uf;
++	/*Compute solution u^n+1 = u_L + deltat Ml^-1 fbar*/
++	UpdateSolution(u,udot,Ml_petsc,Fbar,deltat);
++	uf =new Vector<IssmDouble>(u);
++	VecFree(&u);
++	VecFree(&Fbar);
++	VecFree(&udot);
++	delete Ml;
+ 
+-		#else
+-		_error_("PETSc needs to be installed");
+-		#endif
++	/*Update Element inputs*/
++	InputUpdateFromSolutionx(femmodel,uf); 
++	delete uf;
+ 
+-		delete Ml;
+-		delete K;
+-		delete analysis;
+-
+-	}
++	#else
++	_error_("PETSc needs to be installed");
++	#endif
++}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18357-18358.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18357-18358.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18357-18358.diff	(revision 19102)
@@ -0,0 +1,15 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18357)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18358)
+@@ -734,8 +734,8 @@
+ 	IssmDouble input_min = input->Min();
+ 	IssmDouble input_max = input->Max();
+ 	for(int i=0;i<numnodes;i++){
+-		if(min[nodes[i]->Sid()]>input_min) min[nodes[i]->Sid()] = input_min;
+-		if(max[nodes[i]->Sid()]<input_max) max[nodes[i]->Sid()] = input_max;
++		if(min[nodes[i]->GetDof(0,GSetEnum)]>input_min) min[nodes[i]->GetDof(0,GSetEnum)] = input_min;
++		if(max[nodes[i]->GetDof(0,GSetEnum)]<input_max) max[nodes[i]->GetDof(0,GSetEnum)] = input_max;
+ 	}
+ }
+ /*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18358-18359.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18358-18359.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18358-18359.diff	(revision 19102)
@@ -0,0 +1,37 @@
+Index: ../trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64-snowleopard.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64-snowleopard.sh	(revision 18358)
++++ ../trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64-snowleopard.sh	(revision 18359)
+@@ -22,7 +22,7 @@
+ export DAK_SRC=$ISSM_DIR/externalpackages/dakota/src
+ export DAK_BUILD=$ISSM_DIR/externalpackages/dakota/build
+ cp $DAK_SRC/cmake/BuildDakotaTemplate.cmake $DAK_SRC/cmake/BuildDakotaCustom.cmake
+-patch $DAK_SRC/cmake/BuildDakotaCustom.cmake configs/5.3.1/BuildDakotaCustom.cmake.patch
++patch $DAK_SRC/cmake/BuildDakotaCustom.cmake configs/5.3.1/BuildDakotaCustom.cmake.mac.patch
+ patch $DAK_SRC/cmake/DakotaDev.cmake configs/5.3.1/DakotaDev.cmake.patch
+ 
+ #Apply patches
+@@ -32,10 +32,21 @@
+ patch src/src/NonDLocalReliability.cpp configs/5.3.1/NonDLocalReliability.cpp.patch
+ patch src/packages/pecos/src/pecos_global_defs.hpp configs/5.3.1/pecos_global_defs.hpp.patch
+ 
++export BOOST_ROOT=$ISSM_DIR/externalpackages/boost/install
++
+ #Configure dakota
++# Set your local gcc compiler here
+ cd $DAK_BUILD
+-#cmake -D CMAKE_C_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-gcc -D CMAKE_CXX_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-g++ -D CMAKE_Fortran_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-gfortran -D BOOST_ROOT=/opt/local -D Boost_INCLUDE_DIR=/opt/local/include -C $DAK_SRC/cmake/BuildDakotaCustom.cmake -C $DAK_SRC/cmake/DakotaDev.cmake $DAK_SRC
+-cmake -D CMAKE_C_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-gcc -D CMAKE_CXX_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-g++ -D CMAKE_Fortran_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-gfortran -D LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH -D LDFLAGS="-L/usr/lib -lstdc++" -C $DAK_SRC/cmake/BuildDakotaCustom.cmake -C $DAK_SRC/cmake/DakotaDev.cmake $DAK_SRC
++cmake -DBoost_NO_BOOST_CMAKE=TRUE \
++    -DBoost_NO_SYSTEM_PATHS=TRUE \
++    -DBOOST_ROOT:PATHNAME=$BOOST_ROOT \
++    -DBoost_LIBRARY_DIRS:FILEPATH=${BOOST_ROOT}/lib \
++	 -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DCMAKE_CC_COMPILER=/usr/bin/gcc \
++	 -DCMAKE_Fortran_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-gfortran \
++    -C $DAK_SRC/cmake/BuildDakotaCustom.cmake -C $DAK_SRC/cmake/DakotaDev.cmake $DAK_SRC
++
++#-DCMAKE_CXX_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-g++ -DCMAKE_Fortran_COMPILER=/usr/local/gfortran/bin/x86_64-apple-darwin10-gfortran
++
+ cd ..
+ 
+ #Compile and install dakota
Index: /issm/oecreview/Archive/18296-19100/ISSM-18359-18360.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18359-18360.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18359-18360.diff	(revision 19102)
@@ -0,0 +1,15 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18359)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18360)
+@@ -734,8 +734,8 @@
+ 	IssmDouble input_min = input->Min();
+ 	IssmDouble input_max = input->Max();
+ 	for(int i=0;i<numnodes;i++){
+-		if(min[nodes[i]->GetDof(0,GSetEnum)]>input_min) min[nodes[i]->GetDof(0,GSetEnum)] = input_min;
+-		if(max[nodes[i]->GetDof(0,GSetEnum)]<input_max) max[nodes[i]->GetDof(0,GSetEnum)] = input_max;
++		if(min[nodes[i]->GetDof(0,GsetEnum)]>input_min) min[nodes[i]->GetDof(0,GsetEnum)] = input_min;
++		if(max[nodes[i]->GetDof(0,GsetEnum)]<input_max) max[nodes[i]->GetDof(0,GsetEnum)] = input_max;
+ 	}
+ }
+ /*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18360-18361.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18360-18361.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18360-18361.diff	(revision 19102)
@@ -0,0 +1,29 @@
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18360)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18361)
+@@ -231,10 +231,10 @@
+ 		}
+ 
+ 		/*Compute Qis and Ris*/
+-		double Qi_plus  = ml_serial[row]/deltat*(3. - u[row]);
+-		double Qi_minus = ml_serial[row]/deltat*(2. - u[row]);
+-		//double Qi_plus  = ml_serial[row]/deltat*(ulmax[row] - u[row]);
+-		//double Qi_minus = ml_serial[row]/deltat*(ulmin[row] - u[row]);
++		//double Qi_plus  = ml_serial[row]/deltat*(3. - u[row]);
++		//double Qi_minus = ml_serial[row]/deltat*(2. - u[row]);
++		double Qi_plus  = ml_serial[row]/deltat*(ulmax[row] - u[row]);
++		double Qi_minus = ml_serial[row]/deltat*(ulmin[row] - u[row]);
+ 		_assert_(Qi_plus  >= 0.);
+ 		_assert_(Qi_minus <= 0.);
+ 		d = 1.;
+@@ -388,6 +388,9 @@
+ 	VecToMPISerial(&u_serial   ,u       ,IssmComm::GetComm());
+ 	VecToMPISerial(&ml_serial  ,Ml_petsc,IssmComm::GetComm());
+ 
++	/*Push uL to elements*/
++	InputUpdateFromSolutionx(femmodel,u_serial);
++
+ 	/*Anti diffusive fluxes*/
+ 	Vec         Fbar            = NULL;
+ 	IssmDouble *Ri_minus_serial = NULL;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18361-18362.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18361-18362.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18361-18362.diff	(revision 19102)
@@ -0,0 +1,21 @@
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18361)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18362)
+@@ -345,6 +345,8 @@
+ 	analysis->FctKMatrix(&K,NULL,femmodel);
+ 	delete analysis;
+ 
++	#ifdef _HAVE_PETSC_
++
+ 	/*Convert matrices to PETSc matrices*/
+ 	Mat D_petsc  = NULL;
+ 	Mat LHS      = NULL;
+@@ -356,7 +358,6 @@
+ 	Mat Mc_petsc = Mc->pmatrix->matrix;
+ 
+ 	/*Create D Matrix*/
+-	#ifdef _HAVE_PETSC_
+ 	CreateDMatrix(&D_petsc,K_petsc);
+ 
+ 	/*Create LHS: [ML − theta*detlat *(K+D)^n+1]*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18362-18363.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18362-18363.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18362-18363.diff	(revision 19102)
@@ -0,0 +1,109 @@
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18362)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18363)
+@@ -389,16 +389,13 @@
+ 	VecToMPISerial(&u_serial   ,u       ,IssmComm::GetComm());
+ 	VecToMPISerial(&ml_serial  ,Ml_petsc,IssmComm::GetComm());
+ 
+-	/*Push uL to elements*/
+-	InputUpdateFromSolutionx(femmodel,u_serial);
+-
+ 	/*Anti diffusive fluxes*/
+ 	Vec         Fbar            = NULL;
+ 	IssmDouble *Ri_minus_serial = NULL;
+ 	IssmDouble *Ri_plus_serial  = NULL;
+ 	IssmDouble *ulmin           = NULL;
+ 	IssmDouble *ulmax           = NULL;
+-	femmodel->GetInputLocalMinMaxOnNodesx(&ulmin,&ulmax,ThicknessEnum);
++	femmodel->GetInputLocalMinMaxOnNodesx(&ulmin,&ulmax,u_serial);
+ 	CreateRis(&Ri_plus_serial,&Ri_minus_serial,Mc_petsc,D_petsc,ml_serial,u,u_serial,udot_serial,ulmin,ulmax,deltat);
+ 	CreateFbar(&Fbar,Ri_plus_serial,Ri_minus_serial,Mc_petsc,D_petsc,udot_serial,u_serial,u);
+ 	xDelete<IssmDouble>(Ri_plus_serial);
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18362)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18363)
+@@ -1124,7 +1124,7 @@
+ 	*pdiv=total_divergence;
+ 
+ }/*}}}*/
+-void FemModel::GetInputLocalMinMaxOnNodesx(IssmDouble** pmin,IssmDouble** pmax,int input_enum){/*{{{*/
++void FemModel::GetInputLocalMinMaxOnNodesx(IssmDouble** pmin,IssmDouble** pmax,IssmDouble* ug){/*{{{*/
+ 
+ 	/*Get vector sizes for current configuration*/
+ 	int configuration_type;
+@@ -1143,7 +1143,7 @@
+ 
+ 	for(int i=0;i<this->elements->Size();i++){
+ 		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
+-		element->GetInputLocalMinMaxOnNodes(uLmin_local,uLmax_local,input_enum);
++		element->GetInputLocalMinMaxOnNodes(uLmin_local,uLmax_local,ug);
+ 	}
+ 
+ 	/*Synchronize all CPUs*/
+Index: ../trunk-jpl/src/c/classes/Elements/Element.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18362)
++++ ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18363)
+@@ -84,7 +84,7 @@
+ 		void       GetInputListOnNodesVelocity(IssmDouble* pvalue,int enumtype);
+ 		void       GetInputListOnVertices(IssmDouble* pvalue,int enumtype);
+ 		void       GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue);
+-		void       GetInputLocalMinMaxOnNodes(IssmDouble* min,IssmDouble* max,int input_enum);
++		void       GetInputLocalMinMaxOnNodes(IssmDouble* min,IssmDouble* max,IssmDouble* ug);
+ 		void       GetInputValue(bool* pvalue,int enum_type);
+ 		void       GetInputValue(int* pvalue,int enum_type);
+ 		void       GetInputValue(IssmDouble* pvalue,int enum_type);
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18362)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18363)
+@@ -723,16 +723,27 @@
+ 	delete gauss;
+ }
+ /*}}}*/
+-void       Element::GetInputLocalMinMaxOnNodes(IssmDouble* min,IssmDouble* max,int input_enum){/*{{{*/
++void       Element::GetInputLocalMinMaxOnNodes(IssmDouble* min,IssmDouble* max,IssmDouble* ug){/*{{{*/
+ 
+-	Input* input = GetInput(input_enum);
+-	if(!input){
+-		_error_("Input "<<EnumToStringx(input_enum)<<" not found");
++
++	/*Get number of nodes for this element*/
++	int numnodes = this->GetNumberOfNodes();
++
++	/*Some checks to avoid segmentation faults*/
++	_assert_(ug);
++	_assert_(numnodes>0);
++	_assert_(nodes);
++
++	/*Get element minimum/maximum*/
++	IssmDouble input_min = ug[nodes[0]->GetDof(0,GsetEnum)];
++	IssmDouble input_max = input_min;
++	for(int i=1;i<numnodes;i++){
++		if(ug[nodes[i]->GetDof(0,GsetEnum)] < input_min) input_min = ug[nodes[i]->GetDof(0,GsetEnum)];
++		if(ug[nodes[i]->GetDof(0,GsetEnum)] > input_max) input_max = ug[nodes[i]->GetDof(0,GsetEnum)];
+ 	}
+ 
+-	int numnodes = this->GetNumberOfNodes();
+-	IssmDouble input_min = input->Min();
+-	IssmDouble input_max = input->Max();
++
++	/*Second loop to reassign min and max with local extrema*/
+ 	for(int i=0;i<numnodes;i++){
+ 		if(min[nodes[i]->GetDof(0,GsetEnum)]>input_min) min[nodes[i]->GetDof(0,GsetEnum)] = input_min;
+ 		if(max[nodes[i]->GetDof(0,GsetEnum)]<input_max) max[nodes[i]->GetDof(0,GsetEnum)] = input_max;
+Index: ../trunk-jpl/src/c/classes/FemModel.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.h	(revision 18362)
++++ ../trunk-jpl/src/c/classes/FemModel.h	(revision 18363)
+@@ -60,7 +60,7 @@
+ 		void SetCurrentConfiguration(int configuration_type,int analysis_type);
+ 
+ 		/*Modules*/ 
+-		void GetInputLocalMinMaxOnNodesx(IssmDouble** pmin,IssmDouble** pmax,int input_enum);
++		void GetInputLocalMinMaxOnNodesx(IssmDouble** pmin,IssmDouble** pmax,IssmDouble* ug);
+ 		void MassFluxx(IssmDouble* presponse);
+ 		void MaxAbsVxx(IssmDouble* presponse);
+ 		void MaxAbsVyx(IssmDouble* presponse);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18363-18364.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18363-18364.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18363-18364.diff	(revision 19102)
@@ -0,0 +1,22 @@
+Index: ../trunk-jpl/test/Exp/SquareOne.exp
+===================================================================
+--- ../trunk-jpl/test/Exp/SquareOne.exp	(revision 0)
++++ ../trunk-jpl/test/Exp/SquareOne.exp	(revision 18364)
+@@ -0,0 +1,10 @@
++## Name:domainoutline
++## Icon:0
++# Points Count  Value
++5 1.
++# X pos Y pos
++0 0
++1 0
++1 1
++0 1
++0 0
+
+Property changes on: ../trunk-jpl/test/Exp/SquareOne.exp
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18364-18365.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18364-18365.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18364-18365.diff	(revision 19102)
@@ -0,0 +1,54 @@
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18364)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18365)
+@@ -93,6 +93,12 @@
+ 		MatRestoreRow(D,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+ 	}
+ 
++	/*Broadcast max(dmax)*/
++	IssmDouble dmax_all;
++	ISSM_MPI_Reduce(&dmax,&dmax_all,1,ISSM_MPI_DOUBLE,ISSM_MPI_MAX,0,IssmComm::GetComm() );
++	ISSM_MPI_Bcast(&dmax_all,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
++	dmax = dmax_all;
++
+ 	/*Penalize Dirichlet boundary*/
+ 	dmax = dmax * 1.e+3;
+ 	for(int i=0;i<femmodel->constraints->Size();i++){
+@@ -209,6 +215,14 @@
+ 	VecDuplicate(uvec,&Ri_plus);
+ 	VecDuplicate(uvec,&Ri_minus);
+ 
++	/*Get global extremas*/
++	IssmDouble uLmin_global =  ulmin[0];
++	IssmDouble uLmax_global =  ulmax[0];
++	VecGetSize(uvec,&ncols);
++	for(int i=1;i<ncols;i++) if(ulmin[i]<uLmin_global) uLmin_global = ulmin[i];
++	for(int i=1;i<ncols;i++) if(ulmax[i]>uLmax_global) uLmax_global = ulmax[i];
++	//printf("%g %g\n",uLmin_global,uLmax_global);
++
+ 	/*Go through D and calculate Ris*/
+ 	MatGetOwnershipRange(D,&rstart,&rend);
+ 	for(int row=rstart; row<rend; row++){
+@@ -233,8 +247,10 @@
+ 		/*Compute Qis and Ris*/
+ 		//double Qi_plus  = ml_serial[row]/deltat*(3. - u[row]);
+ 		//double Qi_minus = ml_serial[row]/deltat*(2. - u[row]);
+-		double Qi_plus  = ml_serial[row]/deltat*(ulmax[row] - u[row]);
+-		double Qi_minus = ml_serial[row]/deltat*(ulmin[row] - u[row]);
++		//double Qi_plus  = ml_serial[row]/deltat*(ulmax[row] - u[row]);
++		//double Qi_minus = ml_serial[row]/deltat*(ulmin[row] - u[row]);
++		double Qi_plus  = ml_serial[row]/deltat*(uLmax_global - u[row]);
++		double Qi_minus = ml_serial[row]/deltat*(uLmin_global - u[row]);
+ 		_assert_(Qi_plus  >= 0.);
+ 		_assert_(Qi_minus <= 0.);
+ 		d = 1.;
+@@ -371,7 +387,7 @@
+ 	/*Create RHS: [ML + (1 − theta) deltaT L^n] u^n */
+ 	CreateRHS(&RHS,K_petsc,D_petsc,Ml_petsc,uf->pvector->vector,theta,deltat,dmax,femmodel,configuration_type);
+ 	delete uf;
+-
++	
+ 	/*Go solve lower order solution*/
+ 	SolverxPetsc(&u,LHS,RHS,NULL,NULL, femmodel->parameters); 
+ 	MatFree(&LHS);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18365-18366.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18365-18366.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18365-18366.diff	(revision 19102)
@@ -0,0 +1,97 @@
+Index: ../trunk-jpl/src/m/classes/clusters/generic_static.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/generic_static.m	(revision 0)
++++ ../trunk-jpl/src/m/classes/clusters/generic_static.m	(revision 18366)
+@@ -0,0 +1,85 @@
++%GENERIC cluster class definition
++%
++%   Usage:
++%      cluster=generic_static.m('name','astrid','np',3);
++
++classdef generic_static.m
++	properties (SetAccess=public) 
++		% {{{
++		name='';
++		np=1;
++		codepath=fileparts(which('issm.exe'));
++		shell='/bin/sh';
++		%}}}
++	end
++	methods
++		function cluster=generic_static.m(varargin) % {{{
++
++			%use provided options to change fields
++			options=pairoptions(varargin{:});
++
++			%get name
++			cluster.name=getfieldvalue(options,'name',oshostname());
++
++			%initialize cluster using user settings if provided
++			if (exist([cluster.name '_settings'])==2), eval([cluster.name '_settings']); end
++
++			%OK get other fields
++			cluster=AssignObjectFields(pairoptions(varargin{:}),cluster);
++		end
++		%}}}
++		function disp(cluster) % {{{
++			%  display the object
++			disp(sprintf('class ''%s'' object ''%s'' = ',class(cluster),inputname(1)));
++			disp(sprintf('    name: %s',cluster.name));
++			disp(sprintf('    np: %i',cluster.np));
++			disp(sprintf('    codepath: %s',cluster.codepath));
++			disp(sprintf('    shell: %s',cluster.shell));
++		end
++		%}}}
++		function md = checkconsistency(cluster,md,solution,analyses) % {{{
++			if cluster.np<1
++				md = checkmessage(md,['number of processors should be at least 1']);
++			end
++			if isnan(cluster.np),
++				md = checkmessage(md,'number of processors should not be NaN!');
++			end
++		end
++		%}}}
++		function BuildQueueScript(cluster,dirname,modelname,solution,io_gather,isvalgrind,isgprof) % {{{
++
++			%write queuing script 
++			fid=fopen([modelname '.queue'],'w');
++			fprintf(fid,'#!%s\n',cluster.shell);
++			fprintf(fid,[cluster.codepath '/mpiexec -np %i %s/issm.exe %s %s %s \n'],cluster.np,cluster.codepath,EnumToString(solution),'./',modelname);
++			fclose(fid);
++
++			%in interactive mode, create a run file, and errlog and outlog file
++			fid=fopen([modelname '.errlog'],'w'); fclose(fid);
++			fid=fopen([modelname '.outlog'],'w'); fclose(fid);
++		end
++		%}}}
++		function LaunchQueueJob(cluster,modelname,dirname,filelist)% {{{
++
++			if ~ispc,
++
++				%figure out what shell extension we will use:
++				if isempty(strfind(cluster.shell,'csh')),
++					shellext='sh';
++				else
++					shellext='csh';
++				end
++
++				disp('launching solution sequence');
++				launchcommand=['source  ' modelname '.queue '];
++				issmssh(cluster.name,'',0,launchcommand);
++			else
++				system([modelname '.bat']);
++			end
++		end %}}}
++		function Download(cluster,dirname,filelist)% {{{
++				%do nothing
++				return;
++		end %}}}
++	end
++end
+
+Property changes on: ../trunk-jpl/src/m/classes/clusters/generic_static.m
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18366-18367.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18366-18367.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18366-18367.diff	(revision 19102)
@@ -0,0 +1,19 @@
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18366)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18367)
+@@ -247,10 +247,10 @@
+ 		/*Compute Qis and Ris*/
+ 		//double Qi_plus  = ml_serial[row]/deltat*(3. - u[row]);
+ 		//double Qi_minus = ml_serial[row]/deltat*(2. - u[row]);
+-		//double Qi_plus  = ml_serial[row]/deltat*(ulmax[row] - u[row]);
+-		//double Qi_minus = ml_serial[row]/deltat*(ulmin[row] - u[row]);
+-		double Qi_plus  = ml_serial[row]/deltat*(uLmax_global - u[row]);
+-		double Qi_minus = ml_serial[row]/deltat*(uLmin_global - u[row]);
++		double Qi_plus  = ml_serial[row]/deltat*(ulmax[row] - u[row]);
++		double Qi_minus = ml_serial[row]/deltat*(ulmin[row] - u[row]);
++		//double Qi_plus  = ml_serial[row]/deltat*(uLmax_global - u[row]);
++		//double Qi_minus = ml_serial[row]/deltat*(uLmin_global - u[row]);
+ 		_assert_(Qi_plus  >= 0.);
+ 		_assert_(Qi_minus <= 0.);
+ 		d = 1.;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18367-18368.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18367-18368.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18367-18368.diff	(revision 19102)
@@ -0,0 +1,42 @@
+Index: ../trunk-jpl/src/m/solve/waitonlock.m
+===================================================================
+--- ../trunk-jpl/src/m/solve/waitonlock.m	(revision 18367)
++++ ../trunk-jpl/src/m/solve/waitonlock.m	(revision 18368)
+@@ -26,7 +26,7 @@
+ 
+ 
+ %If we are using the generic cluster in interactive mode, job is already complete
+-if isa(cluster,'generic') & cluster.interactive
++if (isa(cluster,'generic') & cluster.interactive) | isa(cluster,'generic_static'),
+ 	%We are in interactive mode, no need to check for job completion
+ 	ispresent=1;
+ 	return;
+Index: ../trunk-jpl/src/m/classes/clusters/generic_static.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/generic_static.m	(revision 18367)
++++ ../trunk-jpl/src/m/classes/clusters/generic_static.m	(revision 18368)
+@@ -1,19 +1,21 @@
+ %GENERIC cluster class definition
+ %
+ %   Usage:
+-%      cluster=generic_static.m('name','astrid','np',3);
++%      cluster=generic_static('name','astrid','np',3);
+ 
+-classdef generic_static.m
++classdef generic_static
+ 	properties (SetAccess=public) 
+ 		% {{{
+ 		name='';
+ 		np=1;
+ 		codepath=fileparts(which('issm.exe'));
++		executionpath = '.';
++		interactive = 1;
+ 		shell='/bin/sh';
+ 		%}}}
+ 	end
+ 	methods
+-		function cluster=generic_static.m(varargin) % {{{
++		function cluster=generic_static(varargin) % {{{
+ 
+ 			%use provided options to change fields
+ 			options=pairoptions(varargin{:});
Index: /issm/oecreview/Archive/18296-19100/ISSM-18368-18369.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18368-18369.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18368-18369.diff	(revision 19102)
@@ -0,0 +1,89 @@
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18368)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18369)
+@@ -99,16 +99,6 @@
+ 		vbarobs  = sqrt(vbarobs2);
+ 		hu2 = hobs*hobs*vbarobs2;
+ 
+-		/*H^2 - Hobs^2*/
+-		NUMxH2 = 2.*dbasis[0]*dphi[0]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
+-		NUMyH2 = 2.*dbasis[1]*dphi[1]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
+-		DENH2 = vbarobs2*vbarobs2+1.e-14;
+-
+-		/*Ubar-Ubar_obs*/
+-		NUMxUbar = (vyobsbar*dphi[0]*dphi[1] - vxobsbar*dphi[1]*dphi[1])*vbarobs*dbasis[0];
+-		NUMyUbar = (vyobsbar*dphi[0]*dphi[0] - vxobsbar*dphi[0]*dphi[1])*vbarobs*dbasis[1];
+-		DENUbar  = pow(dphi[0]*dphi[0] + dphi[1]*dphi[1],3./2.)+1.e-14;
+-
+ 		/*Loop over all requested responses*/
+ 		for(int resp=0;resp<num_responses;resp++){
+ 			weights_input->GetInputValue(&weight,gauss,responses[resp]);
+@@ -116,11 +106,26 @@
+ 			switch(responses[resp]){
+ 				case Balancethickness2MisfitEnum:
+ 					/*J = (H^2 - Hobs^2)^2*/
+-					//for(i=0;i<numnodes;i++) pe->values[i]+=(NUMxH2+NUMyH2)/DENH2 *weight*Jdet*gauss->weight; NOT WORKING
++					for(i=0;i<numnodes;i++){
++
++						/*H^2 - Hobs^2*/
++						NUMxH2 = 2.*dbasis[0*numnodes+i]*dphi[0]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
++						NUMyH2 = 2.*dbasis[1*numnodes+i]*dphi[1]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
++						DENH2 = vbarobs2*vbarobs2+1.e-14;
++
++						/*Ubar-Ubar_obs*/
++						NUMxUbar = (vyobsbar*dphi[0]*dphi[1] - vxobsbar*dphi[1]*dphi[1])*vbarobs*dbasis[0*numnodes+i];
++						NUMyUbar = (vyobsbar*dphi[0]*dphi[0] - vxobsbar*dphi[0]*dphi[1])*vbarobs*dbasis[1*numnodes+i];
++						DENUbar  = pow(dphi[0]*dphi[0] + dphi[1]*dphi[1],3./2.)+1.e-14;
++
++						pe->values[i]+=(NUMxH2+NUMyH2)/DENH2 *weight*Jdet*gauss->weight;
++					}
+ 					/*J = phi^2*/
+-					//for(i=0;i<numnodes;i++) pe->values[i]+= phi*basis[i]*weight*Jdet*gauss->weight; OK
++					//for(i=0;i<numnodes;i++) pe->values[i]+= phi*basis[i]*weight*Jdet*gauss->weight; //OK
++					/*J = grad J ^2*/
++					//for(i=0;i<numnodes;i++) pe->values[i]+= (dphi[0]*dbasis[0*numnodes+i] + dphi[1]*dbasis[1*numnodes+i])*weight*Jdet*gauss->weight; //OK
+ 					/*J = (ubar - nux*uobs)^2*/
+-					for(i=0;i<numnodes;i++) pe->values[i]+=(NUMxUbar-NUMyUbar)/DENUbar *weight*Jdet*gauss->weight;
++					//for(i=0;i<numnodes;i++) pe->values[i]+=(NUMxUbar-NUMyUbar)/DENUbar *weight*Jdet*gauss->weight;
+ 					break;
+ 				default:
+ 					_error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18368)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18369)
+@@ -1303,7 +1303,7 @@
+ 	IssmDouble J=0.;
+ 	IssmDouble J_sum;
+ 
+-	IssmDouble  weight,thicknessobs,thickness,potential;
++	IssmDouble  weight,thicknessobs,thickness,potential,dpotential[2];
+ 	IssmDouble  vx,vy,vxbar,vybar,vxobs,vyobs,vxbarobs,vybarobs,nux,nuy;
+ 	IssmDouble  Jdet;
+ 	IssmDouble* xyz_list = NULL;
+@@ -1342,6 +1342,7 @@
+ 			thickness_input->GetInputValue(&thickness,gauss);
+ 			thicknessobs_input->GetInputValue(&thicknessobs,gauss);
+ 			potential_input->GetInputValue(&potential,gauss);
++			potential_input->GetInputDerivativeValue(&dpotential[0],xyz_list,gauss);
+ 			vxobs_input->GetInputValue(&vxobs,gauss);
+ 			vyobs_input->GetInputValue(&vyobs,gauss);
+ 			vx_input->GetInputValue(&vxbar,gauss);
+@@ -1353,11 +1354,13 @@
+ 			vybarobs = nuy*vyobs;
+ 
+ 			/*J = (H^2 - Hobs^2)^2*/
+-			//J +=0.5*(thickness*thickness - thicknessobs*thicknessobs)*(thickness*thickness - thicknessobs*thicknessobs)*weight*Jdet*gauss->weight;
++			J +=0.5*(thickness*thickness - thicknessobs*thicknessobs)*(thickness*thickness - thicknessobs*thicknessobs)*weight*Jdet*gauss->weight;
+ 			/*J = phi^2*/
+-			//J +=.5*potential*potential*weight*Jdet*gauss->weight; OK
++			//J +=.5*potential*potential*weight*Jdet*gauss->weight;// OK
++			/*J = grad phi^2*/
++			//J +=.5*(dpotential[0]*dpotential[0] + dpotential[1]*dpotential[1])*weight*Jdet*gauss->weight;
+ 			/*J = (ubar - nux*uobs)^2*/
+-			J +=0.5*((vxbarobs - vxbar)*(vxbarobs - vxbar) + (vybarobs - vybar)*(vybarobs - vybar))*weight*Jdet*gauss->weight;
++			//J +=0.5*((vxbarobs - vxbar)*(vxbarobs - vxbar) + (vybarobs - vybar)*(vybarobs - vybar))*weight*Jdet*gauss->weight;
+ 		}
+ 
+ 		/*clean up and Return: */
Index: /issm/oecreview/Archive/18296-19100/ISSM-18369-18370.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18369-18370.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18369-18370.diff	(revision 19102)
@@ -0,0 +1,37 @@
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 18369)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 18370)
+@@ -872,8 +872,12 @@
+ libISSMModules_la_SOURCES += $(kml_sources)
+ endif
+ libISSMModules_la_CXXFLAGS = $(ALLCXXFLAGS)
++if STANDALONE_LIBRARIES
++libISSMModules_la_LIBADD = ./libISSMCore.la
++else
+ libISSMModules_la_LIBADD = ./libISSMCore.la $(TRIANGLELIB)
+ endif
++endif
+ 
+ if VERSION
+ AM_LDFLAGS =
+Index: ../trunk-jpl/configure.ac
+===================================================================
+--- ../trunk-jpl/configure.ac	(revision 18369)
++++ ../trunk-jpl/configure.ac	(revision 18370)
+@@ -14,7 +14,6 @@
+ AC_PROG_F77([ifort g77 gfortran])
+ 
+ #Libraries and linking
+-AC_F77_LIBRARY_LDFLAGS
+ AC_PATH_XTRA      #figure out X library and include paths
+ 
+ #AUTOMAKE
+@@ -22,7 +21,6 @@
+ AM_INIT_AUTOMAKE([foreign])
+ AC_CONFIG_HEADERS([./config.h])   #Config file must be config.h
+ AM_SILENT_RULES([yes])           #Do not show compilation command by default
+-AM_PROG_CC_C_O
+ AM_PROG_AR
+ 
+ #Libtool
Index: /issm/oecreview/Archive/18296-19100/ISSM-18370-18371.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18370-18371.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18370-18371.diff	(revision 19102)
@@ -0,0 +1,79 @@
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18370)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18371)
+@@ -106,26 +106,31 @@
+ 			switch(responses[resp]){
+ 				case Balancethickness2MisfitEnum:
+ 					/*J = (H^2 - Hobs^2)^2*/
+-					for(i=0;i<numnodes;i++){
++					//for(i=0;i<numnodes;i++){
+ 
+-						/*H^2 - Hobs^2*/
+-						NUMxH2 = 2.*dbasis[0*numnodes+i]*dphi[0]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
+-						NUMyH2 = 2.*dbasis[1*numnodes+i]*dphi[1]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
+-						DENH2 = vbarobs2*vbarobs2+1.e-14;
++					//	/*H^2 - Hobs^2*/
++					//	NUMxH2 = 2.*dbasis[0*numnodes+i]*dphi[0]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
++					//	NUMyH2 = 2.*dbasis[1*numnodes+i]*dphi[1]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
++					//	DENH2 = vbarobs2*vbarobs2+1.e-14;
+ 
+-						/*Ubar-Ubar_obs*/
+-						NUMxUbar = (vyobsbar*dphi[0]*dphi[1] - vxobsbar*dphi[1]*dphi[1])*vbarobs*dbasis[0*numnodes+i];
+-						NUMyUbar = (vyobsbar*dphi[0]*dphi[0] - vxobsbar*dphi[0]*dphi[1])*vbarobs*dbasis[1*numnodes+i];
+-						DENUbar  = pow(dphi[0]*dphi[0] + dphi[1]*dphi[1],3./2.)+1.e-14;
++					//	/*Ubar-Ubar_obs*/
++					//	NUMxUbar = (vyobsbar*dphi[0]*dphi[1] - vxobsbar*dphi[1]*dphi[1])*vbarobs*dbasis[0*numnodes+i];
++					//	NUMyUbar = (vyobsbar*dphi[0]*dphi[0] - vxobsbar*dphi[0]*dphi[1])*vbarobs*dbasis[1*numnodes+i];
++					//	DENUbar  = pow(dphi[0]*dphi[0] + dphi[1]*dphi[1],3./2.)+1.e-14;
+ 
+-						pe->values[i]+=(NUMxH2+NUMyH2)/DENH2 *weight*Jdet*gauss->weight;
+-					}
++					//	pe->values[i]+=(NUMxH2+NUMyH2)/DENH2 *weight*Jdet*gauss->weight;
++					//}
+ 					/*J = phi^2*/
+ 					//for(i=0;i<numnodes;i++) pe->values[i]+= phi*basis[i]*weight*Jdet*gauss->weight; //OK
+ 					/*J = grad J ^2*/
+ 					//for(i=0;i<numnodes;i++) pe->values[i]+= (dphi[0]*dbasis[0*numnodes+i] + dphi[1]*dbasis[1*numnodes+i])*weight*Jdet*gauss->weight; //OK
+ 					/*J = (ubar - nux*uobs)^2*/
+-					//for(i=0;i<numnodes;i++) pe->values[i]+=(NUMxUbar-NUMyUbar)/DENUbar *weight*Jdet*gauss->weight;
++					for(i=0;i<numnodes;i++){
++						NUMxUbar = (vyobsbar*dphi[0]*dphi[1] - vxobsbar*dphi[1]*dphi[1])*vbarobs*dbasis[0*numnodes+i];
++						NUMyUbar = (vyobsbar*dphi[0]*dphi[0] - vxobsbar*dphi[0]*dphi[1])*vbarobs*dbasis[1*numnodes+i];
++						DENUbar  = pow(dphi[0]*dphi[0] + dphi[1]*dphi[1],3./2.)+1.e-14;
++						pe->values[i]+=(NUMxUbar-NUMyUbar)/DENUbar *weight*Jdet*gauss->weight;
++					}
+ 					break;
+ 				default:
+ 					_error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
+Index: ../trunk-jpl/src/c/modules/FloatingiceMeltingRatex
+===================================================================
+--- ../trunk-jpl/src/c/modules/FloatingiceMeltingRatex	(revision 18370)
++++ ../trunk-jpl/src/c/modules/FloatingiceMeltingRatex	(revision 18371)
+
+Property changes on: ../trunk-jpl/src/c/modules/FloatingiceMeltingRatex
+___________________________________________________________________
+Modified: svn:ignore
+## -1 +1,2 ##
+ .deps
++.dirstamp
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18370)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18371)
+@@ -1354,13 +1354,13 @@
+ 			vybarobs = nuy*vyobs;
+ 
+ 			/*J = (H^2 - Hobs^2)^2*/
+-			J +=0.5*(thickness*thickness - thicknessobs*thicknessobs)*(thickness*thickness - thicknessobs*thicknessobs)*weight*Jdet*gauss->weight;
++			//J +=0.5*(thickness*thickness - thicknessobs*thicknessobs)*(thickness*thickness - thicknessobs*thicknessobs)*weight*Jdet*gauss->weight;
+ 			/*J = phi^2*/
+ 			//J +=.5*potential*potential*weight*Jdet*gauss->weight;// OK
+ 			/*J = grad phi^2*/
+ 			//J +=.5*(dpotential[0]*dpotential[0] + dpotential[1]*dpotential[1])*weight*Jdet*gauss->weight;
+ 			/*J = (ubar - nux*uobs)^2*/
+-			//J +=0.5*((vxbarobs - vxbar)*(vxbarobs - vxbar) + (vybarobs - vybar)*(vybarobs - vybar))*weight*Jdet*gauss->weight;
++			J +=0.5*((vxbarobs - vxbar)*(vxbarobs - vxbar) + (vybarobs - vybar)*(vybarobs - vybar))*weight*Jdet*gauss->weight;
+ 		}
+ 
+ 		/*clean up and Return: */
Index: /issm/oecreview/Archive/18296-19100/ISSM-18371-18372.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18371-18372.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18371-18372.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/configure.ac
+===================================================================
+--- ../trunk-jpl/configure.ac	(revision 18371)
++++ ../trunk-jpl/configure.ac	(revision 18372)
+@@ -13,6 +13,8 @@
+ AC_PROG_CXX([icpc cccl cl icl g++])
+ AC_PROG_F77([ifort g77 gfortran])
+ 
++AC_F77_LIBRARY_LDFLAGS
++
+ #Libraries and linking
+ AC_PATH_XTRA      #figure out X library and include paths
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18372-18373.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18372-18373.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18372-18373.diff	(revision 19102)
@@ -0,0 +1,91 @@
+Index: ../trunk-jpl/m4/issm_options.m4
+===================================================================
+--- ../trunk-jpl/m4/issm_options.m4	(revision 18372)
++++ ../trunk-jpl/m4/issm_options.m4	(revision 18373)
+@@ -8,9 +8,10 @@
+ 
+ 	dnl ISSM's internal options
+ 	dnl Build info{{{
++	
++	dnl build date
+ 	AC_PATH_PROGS(DATE, date)
+ 	AC_MSG_CHECKING(for build date)
+-	dnl system checks require uname
+ 	if test "$DATE" ; then
+ 		PACKAGE_DATE=`date`
+ 	else
+@@ -18,6 +19,74 @@
+ 	fi
+ 	AC_DEFINE_UNQUOTED(PACKAGE_BUILD_DATE,"$PACKAGE_DATE", Build date)
+ 	AC_MSG_RESULT($PACKAGE_DATE)
++
++	dnl user name
++	AC_MSG_CHECKING([user name])
++	if test -n "$USER"
++	then
++		user_name="$USER"
++	else
++		if test -n "$LOGNAME"
++		then
++			user_name="$LOGNAME"
++		else
++		   user_name=`(whoami) 2>/dev/null` || user_name=unknown
++		fi
++	fi
++	AC_DEFINE_UNQUOTED(USER_NAME, "$user_name", Build user name)
++	AC_MSG_RESULT($user_name)
++
++	AC_MSG_CHECKING([host full OS name and version])
++	dnl normalize some host OS names
++	case ${host_os} in
++	  dnl linux is linux is linux, regardless of RMS.
++	  linux-gnu* | lignux* )	host_os=linux ;;
++	esac
++	AC_DEFINE_UNQUOTED(HOST_OS, "$host_os", Host full OS name and version)
++	AC_MSG_RESULT($host_os)
++
++  AC_MSG_CHECKING([host cpu])
++  AC_DEFINE_UNQUOTED(HOST_CPU, "$host_cpu",Host cpu)
++  AC_MSG_RESULT($host_cpu)
++
++  AC_MSG_CHECKING([vendor])
++  AC_DEFINE_UNQUOTED(HOST_VENDOR, "$host_vendor",Host vendor)
++  AC_MSG_RESULT($host_vendor)
++
++  AC_MSG_CHECKING([host OS name])
++  host_os_name=`echo $host_os | sed 's/\..*//g'`
++  dnl normalize some OS names
++  case ${host_os_name} in
++	dnl linux is linux is linux, regardless of RMS.
++	linux-gnu* | lignux* )	host_os_name=linux ;;
++  esac
++  AC_DEFINE_UNQUOTED(HOST_OS_NAME, "$host_os_name", Host OS name)
++  AC_MSG_RESULT($host_os_name)
++
++	dnl parse out the OS version of the host
++  AC_MSG_CHECKING([host OS version])
++  host_os_version=`echo $host_os | sed 's/^[[^0-9]]*//g'`
++  if test -z "$host_os_version"
++  then
++	host_os_version=`(uname -r) 2>/dev/null` || host_os_version=unknown
++  fi
++  AC_DEFINE_UNQUOTED(HOST_OS_VERSION, "$host_os_version", Host OS version)
++  AC_MSG_RESULT($host_os_version)
++
++
++	dnl figure out host architecture (different than CPU)
++  AC_MSG_CHECKING([host OS architecture])
++  host_arch=`(uname -m) 2>/dev/null` || host_arch=unknown
++  dnl normalize some names
++  case ${host_arch} in
++	sun4* )	host_arch=sun4 ;;
++	sun3x )	host_arch=sun3 ;;
++	sun )	host_arch=`(arch) 2>/dev/null` || host_arch=unknown ;;
++	i?86 )	host_arch=i386 ;; # all x86 should show up as i386
++  esac
++  AC_DEFINE_UNQUOTED(HOST_ARCH, "$host_arch",Host Archictecture)
++  AC_MSG_RESULT($host_arch)
++
+ 	dnl }}}
+ 	dnl Debugging {{{
+ 	AC_ARG_ENABLE([debugging],                                        dnl feature
Index: /issm/oecreview/Archive/18296-19100/ISSM-18373-18374.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18373-18374.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18373-18374.diff	(revision 19102)
@@ -0,0 +1,36 @@
+Index: ../trunk-jpl/src/wrappers/IssmConfig/IssmConfig.cpp
+===================================================================
+--- ../trunk-jpl/src/wrappers/IssmConfig/IssmConfig.cpp	(revision 18373)
++++ ../trunk-jpl/src/wrappers/IssmConfig/IssmConfig.cpp	(revision 18374)
+@@ -114,6 +114,31 @@
+ 		svalue =xNew<char>(strlen(PACKAGE_BUILD_DATE)+1);
+ 		xMemCpy<char>(svalue,PACKAGE_BUILD_DATE,(strlen(PACKAGE_BUILD_DATE)+1));
+ 	}
++	else if(strcmp(name,"HOST_OS")==0){
++		isstring = true;
++		svalue =xNew<char>(strlen(HOST_OS)+1);
++		xMemCpy<char>(svalue,HOST_OS,(strlen(HOST_OS)+1));
++	}
++	else if(strcmp(name,"USER_NAME")==0){
++		isstring = true;
++		svalue =xNew<char>(strlen(USER_NAME)+1);
++		xMemCpy<char>(svalue,USER_NAME,(strlen(USER_NAME)+1));
++	}
++	else if(strcmp(name,"HOST_VENDOR")==0){
++		isstring = true;
++		svalue =xNew<char>(strlen(HOST_VENDOR)+1);
++		xMemCpy<char>(svalue,HOST_VENDOR,(strlen(HOST_VENDOR)+1));
++	}
++	else if(strcmp(name,"HOST_OS")==0){
++		isstring = true;
++		svalue =xNew<char>(strlen(HOST_OS)+1);
++		xMemCpy<char>(svalue,HOST_OS,(strlen(HOST_OS)+1));
++	}
++	else if(strcmp(name,"HOST_ARCH")==0){
++		isstring = true;
++		svalue =xNew<char>(strlen(HOST_ARCH)+1);
++		xMemCpy<char>(svalue,HOST_ARCH,(strlen(HOST_ARCH)+1));
++	}
+ 	else{
+ 		_error_("variable " << name << " not supported yet");
+ 	}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18374-18375.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18374-18375.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18374-18375.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/dev/issmversion.m
+===================================================================
+--- ../trunk-jpl/src/m/dev/issmversion.m	(revision 18374)
++++ ../trunk-jpl/src/m/dev/issmversion.m	(revision 18375)
+@@ -14,6 +14,8 @@
+ disp(['(website: ' IssmConfig('PACKAGE_URL') ' contact:' IssmConfig('PACKAGE_BUGREPORT') ')']);
+ disp([' ']);
+ disp(['Build date: ' IssmConfig('PACKAGE_BUILD_DATE')]);
++disp(['Compiled on ' IssmConfig('HOST_VENDOR') ' ' IssmConfig('HOST_OS') ' ' IssmConfig('HOST_ARCH') ' by ' IssmConfig('USER_NAME')]);
++disp([' ']);
+ disp(['Copyright (c) 2009-2014 California Institute of Technology']);
+ disp([' ']);
+ disp(['    to get started type: issmdoc']);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18375-18376.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18375-18376.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18375-18376.diff	(revision 19102)
@@ -0,0 +1,60 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh	(revision 18375)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh	(revision 18376)
+@@ -27,6 +27,7 @@
+  --known-mpi-shared-libraries=1 \
+  --with-debugging=0 \
+  --with-valgrind=0 \
++ --with-x=0 \
+  --with-batch=1  \
+  --with-shared-libraries=1 \
+  --download-metis=1 \
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh	(revision 18375)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh	(revision 18376)
+@@ -21,6 +21,7 @@
+ 	--PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
+ 	--with-debugging=0 \
+ 	--with-valgrind=0 \
++	--with-x=0 \
+ 	--with-shared-libraries=1 \
+ 	--download-metis=1 \
+ 	--download-parmetis=1 \
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-linux64.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-linux64.sh	(revision 18375)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-linux64.sh	(revision 18376)
+@@ -21,6 +21,7 @@
+ 	--PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
+ 	--with-debugging=0 \
+ 	--with-valgrind=0 \
++	--with-x=0 \
+ 	--with-shared-libraries=1 \
+ 	--download-metis=1 \
+ 	--download-parmetis=1 \
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh	(revision 18375)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh	(revision 18376)
+@@ -24,6 +24,7 @@
+ 	--known-mpi-shared-libraries=1 \
+ 	--with-debugging=0 \
+ 	--with-valgrind=0 \
++	--with-x=0 \
+ 	--with-batch=1  \
+ 	--with-shared-libraries=1 \
+ 	--download-metis=1 \
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh	(revision 18375)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh	(revision 18376)
+@@ -21,6 +21,7 @@
+   --PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
+   --with-batch=1  \
+   --with-debugging=0 \
++  --with-x=0 \
+   --with-shared-libraries=1 \
+   --known-mpi-shared-libraries=1 \
+   --with-mpi=1 \
Index: /issm/oecreview/Archive/18296-19100/ISSM-18376-18377.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18376-18377.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18376-18377.diff	(revision 19102)
@@ -0,0 +1,639 @@
+Index: ../trunk-jpl/externalpackages/vim/addons/vim/syntax/c.vim
+===================================================================
+--- ../trunk-jpl/externalpackages/vim/addons/vim/syntax/c.vim	(revision 18376)
++++ ../trunk-jpl/externalpackages/vim/addons/vim/syntax/c.vim	(revision 18377)
+@@ -547,6 +547,7 @@
+ syn keyword cType StressbalanceSIAAnalysis
+ syn keyword cType StressbalanceVerticalAnalysis
+ syn keyword cType ThermalAnalysis
++syn keyword cType UzawaPressureAnalysis
+ "ISSM's objects end
+ "ISSM's Enums begin
+ syn keyword cConstant AutodiffIsautodiffEnum
+@@ -707,7 +708,6 @@
+ syn keyword cConstant InversionVyObsEnum
+ syn keyword cConstant InversionVzObsEnum
+ syn keyword cConstant MaskIceLevelsetEnum
+-syn keyword cConstant QmuMaskIceLevelsetEnum
+ syn keyword cConstant MaterialsBetaEnum
+ syn keyword cConstant MaterialsHeatcapacityEnum
+ syn keyword cConstant MaterialsLatentheatEnum
+@@ -720,7 +720,6 @@
+ syn keyword cConstant DamageIsdamageEnum
+ syn keyword cConstant DamageDEnum
+ syn keyword cConstant DamageFEnum
+-syn keyword cConstant QmuDamageDEnum
+ syn keyword cConstant DamageDbarEnum
+ syn keyword cConstant DamageLawEnum
+ syn keyword cConstant DamageC1Enum
+@@ -740,6 +739,7 @@
+ syn keyword cConstant DamageEquivStressEnum
+ syn keyword cConstant DamageEvolutionNumRequestedOutputsEnum
+ syn keyword cConstant DamageEvolutionRequestedOutputsEnum
++syn keyword cConstant NewDamageEnum
+ syn keyword cConstant MaterialsRhoIceEnum
+ syn keyword cConstant MaterialsRhoSeawaterEnum
+ syn keyword cConstant MaterialsRhoFreshwaterEnum
+@@ -793,7 +793,6 @@
+ syn keyword cConstant QmuPartitionEnum
+ syn keyword cConstant QmuResponsedescriptorsEnum
+ syn keyword cConstant QmuVariabledescriptorsEnum
+-syn keyword cConstant QmuMaterialsRheologyBEnum
+ syn keyword cConstant RiftsNumriftsEnum
+ syn keyword cConstant RiftsRiftstructEnum
+ syn keyword cConstant SettingsResultsOnNodesEnum
+@@ -925,6 +924,7 @@
+ syn keyword cConstant ThermalAnalysisEnum
+ syn keyword cConstant ThermalSolutionEnum
+ syn keyword cConstant TransientSolutionEnum
++syn keyword cConstant UzawaPressureAnalysisEnum
+ syn keyword cConstant GiaSolutionEnum
+ syn keyword cConstant GiaAnalysisEnum
+ syn keyword cConstant MeshdeformationSolutionEnum
+@@ -1034,17 +1034,6 @@
+ syn keyword cConstant MisfitEnum
+ syn keyword cConstant PressureEnum
+ syn keyword cConstant PressurePicardEnum
+-syn keyword cConstant QmuPressureEnum
+-syn keyword cConstant QmuVxEnum
+-syn keyword cConstant QmuVyEnum
+-syn keyword cConstant QmuVzEnum
+-syn keyword cConstant QmuThicknessEnum
+-syn keyword cConstant QmuBaseEnum
+-syn keyword cConstant QmuSurfaceEnum
+-syn keyword cConstant QmuMeltingEnum
+-syn keyword cConstant QmuVxMeshEnum
+-syn keyword cConstant QmuVyMeshEnum
+-syn keyword cConstant QmuVzMeshEnum
+ syn keyword cConstant AndroidFrictionCoefficientEnum
+ syn keyword cConstant ResetPenaltiesEnum
+ syn keyword cConstant SegmentOnIceShelfEnum
+@@ -1088,7 +1077,6 @@
+ syn keyword cConstant WatercolumnEnum
+ syn keyword cConstant BasalFrictionEnum
+ syn keyword cConstant ViscousHeatingEnum
+-syn keyword cConstant QmuTemperatureEnum
+ syn keyword cConstant HydrologyWaterVxEnum
+ syn keyword cConstant HydrologyWaterVyEnum
+ syn keyword cConstant SigmaNNEnum
+@@ -1106,6 +1094,13 @@
+ syn keyword cConstant DeviatoricStressyyEnum
+ syn keyword cConstant DeviatoricStressyzEnum
+ syn keyword cConstant DeviatoricStresszzEnum
++syn keyword cConstant StressEnum
++syn keyword cConstant StressxxEnum
++syn keyword cConstant StressxyEnum
++syn keyword cConstant StressxzEnum
++syn keyword cConstant StressyyEnum
++syn keyword cConstant StressyzEnum
++syn keyword cConstant StresszzEnum
+ syn keyword cConstant StrainRateEnum
+ syn keyword cConstant StrainRatexxEnum
+ syn keyword cConstant StrainRatexyEnum
+@@ -1134,6 +1129,7 @@
+ syn keyword cConstant MINIEnum
+ syn keyword cConstant MINIcondensedEnum
+ syn keyword cConstant TaylorHoodEnum
++syn keyword cConstant LATaylorHoodEnum
+ syn keyword cConstant XTaylorHoodEnum
+ syn keyword cConstant OneLayerP4zEnum
+ syn keyword cConstant CrouzeixRaviartEnum
+@@ -1178,6 +1174,9 @@
+ syn keyword cConstant AbsoluteEnum
+ syn keyword cConstant IncrementalEnum
+ syn keyword cConstant AugmentedLagrangianREnum
++syn keyword cConstant AugmentedLagrangianRhopEnum
++syn keyword cConstant AugmentedLagrangianRlambdaEnum
++syn keyword cConstant AugmentedLagrangianRholambdaEnum
+ syn keyword cConstant AugmentedLagrangianThetaEnum
+ syn keyword cConstant NoneEnum
+ syn keyword cConstant AggressiveMigrationEnum
+@@ -1186,7 +1185,6 @@
+ syn keyword cConstant SubelementMigration2Enum
+ syn keyword cConstant ContactEnum
+ syn keyword cConstant MaskGroundediceLevelsetEnum
+-syn keyword cConstant QmuMaskGroundediceLevelsetEnum
+ syn keyword cConstant GaussSegEnum
+ syn keyword cConstant GaussTriaEnum
+ syn keyword cConstant GaussTetraEnum
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18376)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18377)
+@@ -569,6 +569,13 @@
+ 	DeviatoricStressyyEnum,
+ 	DeviatoricStressyzEnum,
+ 	DeviatoricStresszzEnum,
++	StressEnum,
++	StressxxEnum,
++	StressxyEnum,
++	StressxzEnum,
++	StressyyEnum,
++	StressyzEnum,
++	StresszzEnum,
+ 	StrainRateEnum,
+ 	StrainRatexxEnum,
+ 	StrainRatexyEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18376)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18377)
+@@ -560,6 +560,13 @@
+ 		case DeviatoricStressyyEnum : return "DeviatoricStressyy";
+ 		case DeviatoricStressyzEnum : return "DeviatoricStressyz";
+ 		case DeviatoricStresszzEnum : return "DeviatoricStresszz";
++		case StressEnum : return "Stress";
++		case StressxxEnum : return "Stressxx";
++		case StressxyEnum : return "Stressxy";
++		case StressxzEnum : return "Stressxz";
++		case StressyyEnum : return "Stressyy";
++		case StressyzEnum : return "Stressyz";
++		case StresszzEnum : return "Stresszz";
+ 		case StrainRateEnum : return "StrainRate";
+ 		case StrainRatexxEnum : return "StrainRatexx";
+ 		case StrainRatexyEnum : return "StrainRatexy";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18376)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18377)
+@@ -572,6 +572,13 @@
+ 	      else if (strcmp(name,"DeviatoricStressyy")==0) return DeviatoricStressyyEnum;
+ 	      else if (strcmp(name,"DeviatoricStressyz")==0) return DeviatoricStressyzEnum;
+ 	      else if (strcmp(name,"DeviatoricStresszz")==0) return DeviatoricStresszzEnum;
++	      else if (strcmp(name,"Stress")==0) return StressEnum;
++	      else if (strcmp(name,"Stressxx")==0) return StressxxEnum;
++	      else if (strcmp(name,"Stressxy")==0) return StressxyEnum;
++	      else if (strcmp(name,"Stressxz")==0) return StressxzEnum;
++	      else if (strcmp(name,"Stressyy")==0) return StressyyEnum;
++	      else if (strcmp(name,"Stressyz")==0) return StressyzEnum;
++	      else if (strcmp(name,"Stresszz")==0) return StresszzEnum;
+ 	      else if (strcmp(name,"StrainRate")==0) return StrainRateEnum;
+ 	      else if (strcmp(name,"StrainRatexx")==0) return StrainRatexxEnum;
+ 	      else if (strcmp(name,"StrainRatexy")==0) return StrainRatexyEnum;
+@@ -621,17 +628,17 @@
+ 	      else if (strcmp(name,"MassfluxatgateSegments")==0) return MassfluxatgateSegmentsEnum;
+ 	      else if (strcmp(name,"MisfitName")==0) return MisfitNameEnum;
+ 	      else if (strcmp(name,"MisfitModelEnum")==0) return MisfitModelEnumEnum;
+-	      else if (strcmp(name,"MisfitObservation")==0) return MisfitObservationEnum;
++         else stage=6;
++   }
++   if(stage==6){
++	      if (strcmp(name,"MisfitObservation")==0) return MisfitObservationEnum;
+ 	      else if (strcmp(name,"MisfitObservationEnum")==0) return MisfitObservationEnumEnum;
+ 	      else if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
+ 	      else if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
+ 	      else if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
+ 	      else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
+ 	      else if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
+-         else stage=6;
+-   }
+-   if(stage==6){
+-	      if (strcmp(name,"MinVel")==0) return MinVelEnum;
++	      else if (strcmp(name,"MinVel")==0) return MinVelEnum;
+ 	      else if (strcmp(name,"MaxVel")==0) return MaxVelEnum;
+ 	      else if (strcmp(name,"MinVx")==0) return MinVxEnum;
+ 	      else if (strcmp(name,"MaxVx")==0) return MaxVxEnum;
+Index: ../trunk-jpl/src/m/enum/QmuVzMeshEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/QmuVzMeshEnum.m	(revision 18376)
++++ ../trunk-jpl/src/m/enum/QmuVzMeshEnum.m	(revision 18377)
+@@ -1,11 +0,0 @@
+-function macro=QmuVzMeshEnum()
+-%QMUVZMESHENUM - Enum of QmuVzMesh
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=QmuVzMeshEnum()
+-
+-macro=StringToEnum('QmuVzMesh');
+Index: ../trunk-jpl/src/m/enum/QmuMeltingEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/QmuMeltingEnum.m	(revision 18376)
++++ ../trunk-jpl/src/m/enum/QmuMeltingEnum.m	(revision 18377)
+@@ -1,11 +0,0 @@
+-function macro=QmuMeltingEnum()
+-%QMUMELTINGENUM - Enum of QmuMelting
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=QmuMeltingEnum()
+-
+-macro=StringToEnum('QmuMelting');
+Index: ../trunk-jpl/src/m/enum/QmuMaskGroundediceLevelsetEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/QmuMaskGroundediceLevelsetEnum.m	(revision 18376)
++++ ../trunk-jpl/src/m/enum/QmuMaskGroundediceLevelsetEnum.m	(revision 18377)
+@@ -1,11 +0,0 @@
+-function macro=QmuMaskGroundediceLevelsetEnum()
+-%QMUMASKGROUNDEDICELEVELSETENUM - Enum of QmuMaskGroundediceLevelset
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=QmuMaskGroundediceLevelsetEnum()
+-
+-macro=StringToEnum('QmuMaskGroundediceLevelset');
+Index: ../trunk-jpl/src/m/enum/QmuMaskIceLevelsetEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/QmuMaskIceLevelsetEnum.m	(revision 18376)
++++ ../trunk-jpl/src/m/enum/QmuMaskIceLevelsetEnum.m	(revision 18377)
+@@ -1,11 +0,0 @@
+-function macro=QmuMaskIceLevelsetEnum()
+-%QMUMASKICELEVELSETENUM - Enum of QmuMaskIceLevelset
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=QmuMaskIceLevelsetEnum()
+-
+-macro=StringToEnum('QmuMaskIceLevelset');
+Index: ../trunk-jpl/src/m/enum/QmuDamageDEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/QmuDamageDEnum.m	(revision 18376)
++++ ../trunk-jpl/src/m/enum/QmuDamageDEnum.m	(revision 18377)
+@@ -1,11 +0,0 @@
+-function macro=QmuDamageDEnum()
+-%QMUDAMAGEDENUM - Enum of QmuDamageD
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=QmuDamageDEnum()
+-
+-macro=StringToEnum('QmuDamageD');
+Index: ../trunk-jpl/src/m/enum/QmuBaseEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/QmuBaseEnum.m	(revision 18376)
++++ ../trunk-jpl/src/m/enum/QmuBaseEnum.m	(revision 18377)
+@@ -1,11 +0,0 @@
+-function macro=QmuBaseEnum()
+-%QMUBASEENUM - Enum of QmuBase
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=QmuBaseEnum()
+-
+-macro=StringToEnum('QmuBase');
+Index: ../trunk-jpl/src/m/enum/QmuMaterialsRheologyBEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/QmuMaterialsRheologyBEnum.m	(revision 18376)
++++ ../trunk-jpl/src/m/enum/QmuMaterialsRheologyBEnum.m	(revision 18377)
+@@ -1,11 +0,0 @@
+-function macro=QmuMaterialsRheologyBEnum()
+-%QMUMATERIALSRHEOLOGYBENUM - Enum of QmuMaterialsRheologyB
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=QmuMaterialsRheologyBEnum()
+-
+-macro=StringToEnum('QmuMaterialsRheologyB');
+Index: ../trunk-jpl/src/m/enum/QmuVxEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/QmuVxEnum.m	(revision 18376)
++++ ../trunk-jpl/src/m/enum/QmuVxEnum.m	(revision 18377)
+@@ -1,11 +0,0 @@
+-function macro=QmuVxEnum()
+-%QMUVXENUM - Enum of QmuVx
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=QmuVxEnum()
+-
+-macro=StringToEnum('QmuVx');
+Index: ../trunk-jpl/src/m/enum/QmuVxMeshEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/QmuVxMeshEnum.m	(revision 18376)
++++ ../trunk-jpl/src/m/enum/QmuVxMeshEnum.m	(revision 18377)
+@@ -1,11 +0,0 @@
+-function macro=QmuVxMeshEnum()
+-%QMUVXMESHENUM - Enum of QmuVxMesh
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=QmuVxMeshEnum()
+-
+-macro=StringToEnum('QmuVxMesh');
+Index: ../trunk-jpl/src/m/enum/QmuVyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/QmuVyEnum.m	(revision 18376)
++++ ../trunk-jpl/src/m/enum/QmuVyEnum.m	(revision 18377)
+@@ -1,11 +0,0 @@
+-function macro=QmuVyEnum()
+-%QMUVYENUM - Enum of QmuVy
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=QmuVyEnum()
+-
+-macro=StringToEnum('QmuVy');
+Index: ../trunk-jpl/src/m/enum/QmuPressureEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/QmuPressureEnum.m	(revision 18376)
++++ ../trunk-jpl/src/m/enum/QmuPressureEnum.m	(revision 18377)
+@@ -1,11 +0,0 @@
+-function macro=QmuPressureEnum()
+-%QMUPRESSUREENUM - Enum of QmuPressure
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=QmuPressureEnum()
+-
+-macro=StringToEnum('QmuPressure');
+Index: ../trunk-jpl/src/m/enum/QmuThicknessEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/QmuThicknessEnum.m	(revision 18376)
++++ ../trunk-jpl/src/m/enum/QmuThicknessEnum.m	(revision 18377)
+@@ -1,11 +0,0 @@
+-function macro=QmuThicknessEnum()
+-%QMUTHICKNESSENUM - Enum of QmuThickness
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=QmuThicknessEnum()
+-
+-macro=StringToEnum('QmuThickness');
+Index: ../trunk-jpl/src/m/enum/QmuVzEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/QmuVzEnum.m	(revision 18376)
++++ ../trunk-jpl/src/m/enum/QmuVzEnum.m	(revision 18377)
+@@ -1,11 +0,0 @@
+-function macro=QmuVzEnum()
+-%QMUVZENUM - Enum of QmuVz
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=QmuVzEnum()
+-
+-macro=StringToEnum('QmuVz');
+Index: ../trunk-jpl/src/m/enum/QmuVyMeshEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/QmuVyMeshEnum.m	(revision 18376)
++++ ../trunk-jpl/src/m/enum/QmuVyMeshEnum.m	(revision 18377)
+@@ -1,11 +0,0 @@
+-function macro=QmuVyMeshEnum()
+-%QMUVYMESHENUM - Enum of QmuVyMesh
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=QmuVyMeshEnum()
+-
+-macro=StringToEnum('QmuVyMesh');
+Index: ../trunk-jpl/src/m/enum/QmuTemperatureEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/QmuTemperatureEnum.m	(revision 18376)
++++ ../trunk-jpl/src/m/enum/QmuTemperatureEnum.m	(revision 18377)
+@@ -1,11 +0,0 @@
+-function macro=QmuTemperatureEnum()
+-%QMUTEMPERATUREENUM - Enum of QmuTemperature
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=QmuTemperatureEnum()
+-
+-macro=StringToEnum('QmuTemperature');
+Index: ../trunk-jpl/src/m/enum/QmuSurfaceEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/QmuSurfaceEnum.m	(revision 18376)
++++ ../trunk-jpl/src/m/enum/QmuSurfaceEnum.m	(revision 18377)
+@@ -1,11 +0,0 @@
+-function macro=QmuSurfaceEnum()
+-%QMUSURFACEENUM - Enum of QmuSurface
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=QmuSurfaceEnum()
+-
+-macro=StringToEnum('QmuSurface');
+Index: ../trunk-jpl/src/m/enum/StressxyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressxyEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/StressxyEnum.m	(revision 18377)
+@@ -0,0 +1,11 @@
++function macro=StressxyEnum()
++%STRESSXYENUM - Enum of Stressxy
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=StressxyEnum()
++
++macro=StringToEnum('Stressxy');
+Index: ../trunk-jpl/src/m/enum/StressxzEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressxzEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/StressxzEnum.m	(revision 18377)
+@@ -0,0 +1,11 @@
++function macro=StressxzEnum()
++%STRESSXZENUM - Enum of Stressxz
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=StressxzEnum()
++
++macro=StringToEnum('Stressxz');
+Index: ../trunk-jpl/src/m/enum/StressyyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressyyEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/StressyyEnum.m	(revision 18377)
+@@ -0,0 +1,11 @@
++function macro=StressyyEnum()
++%STRESSYYENUM - Enum of Stressyy
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=StressyyEnum()
++
++macro=StringToEnum('Stressyy');
+Index: ../trunk-jpl/src/m/enum/StressyzEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressyzEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/StressyzEnum.m	(revision 18377)
+@@ -0,0 +1,11 @@
++function macro=StressyzEnum()
++%STRESSYZENUM - Enum of Stressyz
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=StressyzEnum()
++
++macro=StringToEnum('Stressyz');
+Index: ../trunk-jpl/src/m/enum/StressEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/StressEnum.m	(revision 18377)
+@@ -0,0 +1,11 @@
++function macro=StressEnum()
++%STRESSENUM - Enum of Stress
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=StressEnum()
++
++macro=StringToEnum('Stress');
+Index: ../trunk-jpl/src/m/enum/StresszzEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StresszzEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/StresszzEnum.m	(revision 18377)
+@@ -0,0 +1,11 @@
++function macro=StresszzEnum()
++%STRESSZZENUM - Enum of Stresszz
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=StresszzEnum()
++
++macro=StringToEnum('Stresszz');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18376)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18377)
+@@ -166,7 +166,6 @@
+ def InversionVyObsEnum(): return StringToEnum("InversionVyObs")[0]
+ def InversionVzObsEnum(): return StringToEnum("InversionVzObs")[0]
+ def MaskIceLevelsetEnum(): return StringToEnum("MaskIceLevelset")[0]
+-def QmuMaskIceLevelsetEnum(): return StringToEnum("QmuMaskIceLevelset")[0]
+ def MaterialsBetaEnum(): return StringToEnum("MaterialsBeta")[0]
+ def MaterialsHeatcapacityEnum(): return StringToEnum("MaterialsHeatcapacity")[0]
+ def MaterialsLatentheatEnum(): return StringToEnum("MaterialsLatentheat")[0]
+@@ -179,7 +178,6 @@
+ def DamageIsdamageEnum(): return StringToEnum("DamageIsdamage")[0]
+ def DamageDEnum(): return StringToEnum("DamageD")[0]
+ def DamageFEnum(): return StringToEnum("DamageF")[0]
+-def QmuDamageDEnum(): return StringToEnum("QmuDamageD")[0]
+ def DamageDbarEnum(): return StringToEnum("DamageDbar")[0]
+ def DamageLawEnum(): return StringToEnum("DamageLaw")[0]
+ def DamageC1Enum(): return StringToEnum("DamageC1")[0]
+@@ -253,7 +251,6 @@
+ def QmuPartitionEnum(): return StringToEnum("QmuPartition")[0]
+ def QmuResponsedescriptorsEnum(): return StringToEnum("QmuResponsedescriptors")[0]
+ def QmuVariabledescriptorsEnum(): return StringToEnum("QmuVariabledescriptors")[0]
+-def QmuMaterialsRheologyBEnum(): return StringToEnum("QmuMaterialsRheologyB")[0]
+ def RiftsNumriftsEnum(): return StringToEnum("RiftsNumrifts")[0]
+ def RiftsRiftstructEnum(): return StringToEnum("RiftsRiftstruct")[0]
+ def SettingsResultsOnNodesEnum(): return StringToEnum("SettingsResultsOnNodes")[0]
+@@ -495,17 +492,6 @@
+ def MisfitEnum(): return StringToEnum("Misfit")[0]
+ def PressureEnum(): return StringToEnum("Pressure")[0]
+ def PressurePicardEnum(): return StringToEnum("PressurePicard")[0]
+-def QmuPressureEnum(): return StringToEnum("QmuPressure")[0]
+-def QmuVxEnum(): return StringToEnum("QmuVx")[0]
+-def QmuVyEnum(): return StringToEnum("QmuVy")[0]
+-def QmuVzEnum(): return StringToEnum("QmuVz")[0]
+-def QmuThicknessEnum(): return StringToEnum("QmuThickness")[0]
+-def QmuBaseEnum(): return StringToEnum("QmuBase")[0]
+-def QmuSurfaceEnum(): return StringToEnum("QmuSurface")[0]
+-def QmuMeltingEnum(): return StringToEnum("QmuMelting")[0]
+-def QmuVxMeshEnum(): return StringToEnum("QmuVxMesh")[0]
+-def QmuVyMeshEnum(): return StringToEnum("QmuVyMesh")[0]
+-def QmuVzMeshEnum(): return StringToEnum("QmuVzMesh")[0]
+ def AndroidFrictionCoefficientEnum(): return StringToEnum("AndroidFrictionCoefficient")[0]
+ def ResetPenaltiesEnum(): return StringToEnum("ResetPenalties")[0]
+ def SegmentOnIceShelfEnum(): return StringToEnum("SegmentOnIceShelf")[0]
+@@ -549,7 +535,6 @@
+ def WatercolumnEnum(): return StringToEnum("Watercolumn")[0]
+ def BasalFrictionEnum(): return StringToEnum("BasalFriction")[0]
+ def ViscousHeatingEnum(): return StringToEnum("ViscousHeating")[0]
+-def QmuTemperatureEnum(): return StringToEnum("QmuTemperature")[0]
+ def HydrologyWaterVxEnum(): return StringToEnum("HydrologyWaterVx")[0]
+ def HydrologyWaterVyEnum(): return StringToEnum("HydrologyWaterVy")[0]
+ def SigmaNNEnum(): return StringToEnum("SigmaNN")[0]
+@@ -567,6 +552,13 @@
+ def DeviatoricStressyyEnum(): return StringToEnum("DeviatoricStressyy")[0]
+ def DeviatoricStressyzEnum(): return StringToEnum("DeviatoricStressyz")[0]
+ def DeviatoricStresszzEnum(): return StringToEnum("DeviatoricStresszz")[0]
++def StressEnum(): return StringToEnum("Stress")[0]
++def StressxxEnum(): return StringToEnum("Stressxx")[0]
++def StressxyEnum(): return StringToEnum("Stressxy")[0]
++def StressxzEnum(): return StringToEnum("Stressxz")[0]
++def StressyyEnum(): return StringToEnum("Stressyy")[0]
++def StressyzEnum(): return StringToEnum("Stressyz")[0]
++def StresszzEnum(): return StringToEnum("Stresszz")[0]
+ def StrainRateEnum(): return StringToEnum("StrainRate")[0]
+ def StrainRatexxEnum(): return StringToEnum("StrainRatexx")[0]
+ def StrainRatexyEnum(): return StringToEnum("StrainRatexy")[0]
+@@ -651,7 +643,6 @@
+ def SubelementMigration2Enum(): return StringToEnum("SubelementMigration2")[0]
+ def ContactEnum(): return StringToEnum("Contact")[0]
+ def MaskGroundediceLevelsetEnum(): return StringToEnum("MaskGroundediceLevelset")[0]
+-def QmuMaskGroundediceLevelsetEnum(): return StringToEnum("QmuMaskGroundediceLevelset")[0]
+ def GaussSegEnum(): return StringToEnum("GaussSeg")[0]
+ def GaussTriaEnum(): return StringToEnum("GaussTria")[0]
+ def GaussTetraEnum(): return StringToEnum("GaussTetra")[0]
+Index: ../trunk-jpl/src/m/enum/StressxxEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressxxEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/StressxxEnum.m	(revision 18377)
+@@ -0,0 +1,11 @@
++function macro=StressxxEnum()
++%STRESSXXENUM - Enum of Stressxx
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=StressxxEnum()
++
++macro=StringToEnum('Stressxx');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18377-18378.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18377-18378.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18377-18378.diff	(revision 19102)
@@ -0,0 +1,45 @@
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 18377)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 18378)
+@@ -220,8 +220,12 @@
+ 			end
+ 
+ 			%special for thermal modeling:
+-			md.basalforcings.groundedice_melting_rate=project2d(md,md.basalforcings.groundedice_melting_rate,1); 
+-			md.basalforcings.floatingice_melting_rate=project2d(md,md.basalforcings.floatingice_melting_rate,1); 
++			if ~isnan(md.basalforcings.groundedice_melting_rate),
++				md.basalforcings.groundedice_melting_rate=project2d(md,md.basalforcings.groundedice_melting_rate,1); 
++			end
++			if ~isnan(md.basalforcings.floatingice_melting_rate),
++				md.basalforcings.floatingice_melting_rate=project2d(md,md.basalforcings.floatingice_melting_rate,1); 
++			end
+ 			md.basalforcings.geothermalflux=project2d(md,md.basalforcings.geothermalflux,1); %bedrock only gets geothermal flux
+ 
+ 			%update of connectivity matrix
+@@ -237,8 +241,12 @@
+ 			md.geometry.base=project2d(md,md.geometry.base,1);
+ 			md.geometry.bed=project2d(md,md.geometry.bed,1);
+ 
+-			md.mask.groundedice_levelset=project2d(md,md.mask.groundedice_levelset,1);
+-			md.mask.ice_levelset=project2d(md,md.mask.ice_levelset,1);
++			if ~isnan(md.mask.groundedice_levelset),
++				md.mask.groundedice_levelset=project2d(md,md.mask.groundedice_levelset,1);
++			end
++			if ~isnan(md.mask.ice_levelset),
++				md.mask.ice_levelset=project2d(md,md.mask.ice_levelset,1);
++			end
+ 
+ 			%lat long
+ 			if numel(md.mesh.lat) ==md.mesh.numberofvertices,  md.mesh.lat=project2d(md,md.mesh.lat,1); end
+@@ -824,8 +832,9 @@
+ 			if isfield(structmd,'drag'), md.friction.coefficient=structmd.drag; end
+ 			if isfield(structmd,'p'), md.friction.p=structmd.p; end
+ 			if isfield(structmd,'q'), md.friction.q=structmd.p; end
+-			if isfield(structmd,'melting'), md.basalforcings.melting_rate=structmd.melting; end
++			if isfield(structmd,'melting'), md.basalforcings.floatingice_melting_rate=structmd.melting; end
+ 			if isfield(structmd,'melting_rate'), md.basalforcings.floatingice_melting_rate=structmd.melting_rate; end
++			if isfield(structmd,'melting_rate'), md.basalforcings.groundedice_melting_rate=structmd.melting_rate; end
+ 			if isfield(structmd,'accumulation'), md.surfaceforcings.mass_balance=structmd.accumulation; end
+ 			if isfield(structmd,'numberofgrids'), md.mesh.numberofvertices=structmd.numberofgrids; end
+ 			if isfield(structmd,'numberofgrids2d'), md.mesh.numberofvertices2d=structmd.numberofgrids2d; end
Index: /issm/oecreview/Archive/18296-19100/ISSM-18378-18379.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18378-18379.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18378-18379.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/contrib/bamg/gmsh3d.m
+===================================================================
+--- ../trunk-jpl/src/m/contrib/bamg/gmsh3d.m	(revision 18378)
++++ ../trunk-jpl/src/m/contrib/bamg/gmsh3d.m	(revision 18379)
+@@ -96,7 +96,7 @@
+ 
+ %call gmsh
+ fprintf('%s\n','      call gmsh...');
+-system([issmdir() '/externalpackages/gmsh/install/gmsh -3 model.geo']);
++system([issmdir() '/externalpackages/gmsh/install/gmsh -3 -v 0 model.geo']);
+ 
+ %plug new mesh
+ t1=clock; fprintf('\n%s','      reading final mesh files...');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18379-18380.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18379-18380.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18379-18380.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/m/exp/masktoexp.m
+===================================================================
+--- ../trunk-jpl/src/m/exp/masktoexp.m	(revision 18379)
++++ ../trunk-jpl/src/m/exp/masktoexp.m	(revision 18380)
+@@ -23,6 +23,7 @@
+ 
+ %Create exp structure
+ A=struct();
++if(j-1<1), error('no contour found'); end
+ for i=1:j-1,
+ 	A(i).x=s(i).x;
+ 	A(i).y=s(i).y;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18380-18381.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18380-18381.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18380-18381.diff	(revision 19102)
@@ -0,0 +1,49 @@
+Index: ../trunk-jpl/src/m/miscellaneous/vorticity.m
+===================================================================
+--- ../trunk-jpl/src/m/miscellaneous/vorticity.m	(revision 18380)
++++ ../trunk-jpl/src/m/miscellaneous/vorticity.m	(revision 18381)
+@@ -28,6 +28,6 @@
+ dvxdy=(vx(index).*beta)*summation;
+ rot=dvxdy - dvydx;
+ 
+-if strcmpi(meshtype(md.mesh),'3D'),
++if strcmpi(domaintype(md.mesh),'3D'),
+ 	rot=project3d(md,'vector',rot,'type','element');
+ end
+Index: ../trunk-jpl/src/m/miscellaneous/colinearity.m
+===================================================================
+--- ../trunk-jpl/src/m/miscellaneous/colinearity.m	(revision 0)
++++ ../trunk-jpl/src/m/miscellaneous/colinearity.m	(revision 18381)
+@@ -0,0 +1,32 @@
++function theta = colinearity(md)
++
++%load some variables (it is much faster if the variab;es are loaded from md once for all) 
++if ~strcmpi(meshtype(md.mesh),'3D'),
++	numberofelements=md.mesh.numberofelements;
++	numberofnodes=md.mesh.numberofvertices;
++	index=md.mesh.elements;
++	x=md.mesh.x; y=md.mesh.y;
++else
++	numberofelements=md.mesh.numberofelements2d;
++	numberofnodes=md.mesh.numberofvertices2d;
++	index=md.mesh.elements2d;
++	x=md.mesh.x2d; y=md.mesh.y2d;
++end
++
++%compute nodal functions coefficients N(x,y)=alpha x + beta y + gamma
++[alpha beta]=GetNodalFunctionsCoeff(index,x,y);
++
++s = averaging(md,md.geometry.surface,2);
++
++summation=[1;1;1];
++dsdx=(s(index).*alpha)*summation;
++dsdy=(s(index).*beta)*summation;
++dsdx = -averaging(md,dsdx,0);
++dsdy = -averaging(md,dsdy,0);
++
++vx = md.inversion.vx_obs;
++vy = md.inversion.vy_obs;
++v  = md.inversion.vel_obs;
++v2 = sqrt(dsdx.^2 + dsdy.^2);
++
++theta = acos((vx.*dsdx + vy.*dsdy)./(v.*v2+eps));
Index: /issm/oecreview/Archive/18296-19100/ISSM-18381-18382.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18381-18382.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18381-18382.diff	(revision 19102)
@@ -0,0 +1,33 @@
+Index: ../trunk-jpl/src/m/contrib/gslib/gslib.m
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gslib/gslib.m	(revision 18381)
++++ ../trunk-jpl/src/m/contrib/gslib/gslib.m	(revision 18382)
+@@ -1,18 +1,21 @@
+-function [B E] = gslib(x,y,data,xmin,ymin,nx,ny,deltax,deltay)
++function [B E] = gslib(x,y,data,xmin,ymin,nx,ny,deltax,deltay,varargin)
+ %GSLIB - use gslib for Kriging
+ %
+ %   Usage:
+ %      output = gslib(x,y,data,varargin)
+ 
++%process options
++options = pairoptions(varargin{:});
++
+ %Variogram
+-nugget=10;
+-sill  =164;
+-range =25763;
++nugget= getfieldvalue(options,'nugget',10);
++sill  = getfieldvalue(options,'sill',164);
++range = getfieldvalue(options,'range',25763);
+ 
+ %Kriging options
+-mindata = 1;
+-maxdata = 50;
+-maxsearchradius = 50000;
++mindata = getfieldvalue(options,'mindata',1);
++maxdata = getfieldvalue(options,'maxdata',50);
++maxsearchradius = getfieldvalue(options,'searchrange',50000);
+ 
+ %Some intermediaries (Convert to gslib's parameters);
+ c = (sill-nugget);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18382-18383.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18382-18383.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18382-18383.diff	(revision 19102)
@@ -0,0 +1,207 @@
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18382)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18383)
+@@ -569,13 +569,6 @@
+ 	DeviatoricStressyyEnum,
+ 	DeviatoricStressyzEnum,
+ 	DeviatoricStresszzEnum,
+-	StressEnum,
+-	StressxxEnum,
+-	StressxyEnum,
+-	StressxzEnum,
+-	StressyyEnum,
+-	StressyzEnum,
+-	StresszzEnum,
+ 	StrainRateEnum,
+ 	StrainRatexxEnum,
+ 	StrainRatexyEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18382)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18383)
+@@ -560,13 +560,6 @@
+ 		case DeviatoricStressyyEnum : return "DeviatoricStressyy";
+ 		case DeviatoricStressyzEnum : return "DeviatoricStressyz";
+ 		case DeviatoricStresszzEnum : return "DeviatoricStresszz";
+-		case StressEnum : return "Stress";
+-		case StressxxEnum : return "Stressxx";
+-		case StressxyEnum : return "Stressxy";
+-		case StressxzEnum : return "Stressxz";
+-		case StressyyEnum : return "Stressyy";
+-		case StressyzEnum : return "Stressyz";
+-		case StresszzEnum : return "Stresszz";
+ 		case StrainRateEnum : return "StrainRate";
+ 		case StrainRatexxEnum : return "StrainRatexx";
+ 		case StrainRatexyEnum : return "StrainRatexy";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18382)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18383)
+@@ -572,13 +572,6 @@
+ 	      else if (strcmp(name,"DeviatoricStressyy")==0) return DeviatoricStressyyEnum;
+ 	      else if (strcmp(name,"DeviatoricStressyz")==0) return DeviatoricStressyzEnum;
+ 	      else if (strcmp(name,"DeviatoricStresszz")==0) return DeviatoricStresszzEnum;
+-	      else if (strcmp(name,"Stress")==0) return StressEnum;
+-	      else if (strcmp(name,"Stressxx")==0) return StressxxEnum;
+-	      else if (strcmp(name,"Stressxy")==0) return StressxyEnum;
+-	      else if (strcmp(name,"Stressxz")==0) return StressxzEnum;
+-	      else if (strcmp(name,"Stressyy")==0) return StressyyEnum;
+-	      else if (strcmp(name,"Stressyz")==0) return StressyzEnum;
+-	      else if (strcmp(name,"Stresszz")==0) return StresszzEnum;
+ 	      else if (strcmp(name,"StrainRate")==0) return StrainRateEnum;
+ 	      else if (strcmp(name,"StrainRatexx")==0) return StrainRatexxEnum;
+ 	      else if (strcmp(name,"StrainRatexy")==0) return StrainRatexyEnum;
+@@ -628,17 +621,17 @@
+ 	      else if (strcmp(name,"MassfluxatgateSegments")==0) return MassfluxatgateSegmentsEnum;
+ 	      else if (strcmp(name,"MisfitName")==0) return MisfitNameEnum;
+ 	      else if (strcmp(name,"MisfitModelEnum")==0) return MisfitModelEnumEnum;
+-         else stage=6;
+-   }
+-   if(stage==6){
+-	      if (strcmp(name,"MisfitObservation")==0) return MisfitObservationEnum;
++	      else if (strcmp(name,"MisfitObservation")==0) return MisfitObservationEnum;
+ 	      else if (strcmp(name,"MisfitObservationEnum")==0) return MisfitObservationEnumEnum;
+ 	      else if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
+ 	      else if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
+ 	      else if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
+ 	      else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
+ 	      else if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
+-	      else if (strcmp(name,"MinVel")==0) return MinVelEnum;
++         else stage=6;
++   }
++   if(stage==6){
++	      if (strcmp(name,"MinVel")==0) return MinVelEnum;
+ 	      else if (strcmp(name,"MaxVel")==0) return MaxVelEnum;
+ 	      else if (strcmp(name,"MinVx")==0) return MinVxEnum;
+ 	      else if (strcmp(name,"MaxVx")==0) return MaxVxEnum;
+Index: ../trunk-jpl/src/m/enum/StressxyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressxyEnum.m	(revision 18382)
++++ ../trunk-jpl/src/m/enum/StressxyEnum.m	(revision 18383)
+@@ -1,11 +0,0 @@
+-function macro=StressxyEnum()
+-%STRESSXYENUM - Enum of Stressxy
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=StressxyEnum()
+-
+-macro=StringToEnum('Stressxy');
+Index: ../trunk-jpl/src/m/enum/StressxzEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressxzEnum.m	(revision 18382)
++++ ../trunk-jpl/src/m/enum/StressxzEnum.m	(revision 18383)
+@@ -1,11 +0,0 @@
+-function macro=StressxzEnum()
+-%STRESSXZENUM - Enum of Stressxz
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=StressxzEnum()
+-
+-macro=StringToEnum('Stressxz');
+Index: ../trunk-jpl/src/m/enum/StressyyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressyyEnum.m	(revision 18382)
++++ ../trunk-jpl/src/m/enum/StressyyEnum.m	(revision 18383)
+@@ -1,11 +0,0 @@
+-function macro=StressyyEnum()
+-%STRESSYYENUM - Enum of Stressyy
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=StressyyEnum()
+-
+-macro=StringToEnum('Stressyy');
+Index: ../trunk-jpl/src/m/enum/StressyzEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressyzEnum.m	(revision 18382)
++++ ../trunk-jpl/src/m/enum/StressyzEnum.m	(revision 18383)
+@@ -1,11 +0,0 @@
+-function macro=StressyzEnum()
+-%STRESSYZENUM - Enum of Stressyz
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=StressyzEnum()
+-
+-macro=StringToEnum('Stressyz');
+Index: ../trunk-jpl/src/m/enum/StressEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressEnum.m	(revision 18382)
++++ ../trunk-jpl/src/m/enum/StressEnum.m	(revision 18383)
+@@ -1,11 +0,0 @@
+-function macro=StressEnum()
+-%STRESSENUM - Enum of Stress
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=StressEnum()
+-
+-macro=StringToEnum('Stress');
+Index: ../trunk-jpl/src/m/enum/StresszzEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StresszzEnum.m	(revision 18382)
++++ ../trunk-jpl/src/m/enum/StresszzEnum.m	(revision 18383)
+@@ -1,11 +0,0 @@
+-function macro=StresszzEnum()
+-%STRESSZZENUM - Enum of Stresszz
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=StresszzEnum()
+-
+-macro=StringToEnum('Stresszz');
+Index: ../trunk-jpl/src/m/enum/StressxxEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressxxEnum.m	(revision 18382)
++++ ../trunk-jpl/src/m/enum/StressxxEnum.m	(revision 18383)
+@@ -1,11 +0,0 @@
+-function macro=StressxxEnum()
+-%STRESSXXENUM - Enum of Stressxx
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=StressxxEnum()
+-
+-macro=StringToEnum('Stressxx');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18382)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18383)
+@@ -552,13 +552,6 @@
+ def DeviatoricStressyyEnum(): return StringToEnum("DeviatoricStressyy")[0]
+ def DeviatoricStressyzEnum(): return StringToEnum("DeviatoricStressyz")[0]
+ def DeviatoricStresszzEnum(): return StringToEnum("DeviatoricStresszz")[0]
+-def StressEnum(): return StringToEnum("Stress")[0]
+-def StressxxEnum(): return StringToEnum("Stressxx")[0]
+-def StressxyEnum(): return StringToEnum("Stressxy")[0]
+-def StressxzEnum(): return StringToEnum("Stressxz")[0]
+-def StressyyEnum(): return StringToEnum("Stressyy")[0]
+-def StressyzEnum(): return StringToEnum("Stressyz")[0]
+-def StresszzEnum(): return StringToEnum("Stresszz")[0]
+ def StrainRateEnum(): return StringToEnum("StrainRate")[0]
+ def StrainRatexxEnum(): return StringToEnum("StrainRatexx")[0]
+ def StrainRatexyEnum(): return StringToEnum("StrainRatexy")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18383-18384.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18383-18384.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18383-18384.diff	(revision 19102)
@@ -0,0 +1,26 @@
+Index: ../trunk-jpl/externalpackages/vim/addons/vim/syntax/c.vim
+===================================================================
+--- ../trunk-jpl/externalpackages/vim/addons/vim/syntax/c.vim	(revision 18383)
++++ ../trunk-jpl/externalpackages/vim/addons/vim/syntax/c.vim	(revision 18384)
+@@ -1087,6 +1087,7 @@
+ syn keyword cConstant StressTensoryyEnum
+ syn keyword cConstant StressTensoryzEnum
+ syn keyword cConstant StressTensorzzEnum
++syn keyword cConstant StressMaxPrincipalEnum
+ syn keyword cConstant DeviatoricStressEnum
+ syn keyword cConstant DeviatoricStressxxEnum
+ syn keyword cConstant DeviatoricStressxyEnum
+@@ -1094,13 +1095,6 @@
+ syn keyword cConstant DeviatoricStressyyEnum
+ syn keyword cConstant DeviatoricStressyzEnum
+ syn keyword cConstant DeviatoricStresszzEnum
+-syn keyword cConstant StressEnum
+-syn keyword cConstant StressxxEnum
+-syn keyword cConstant StressxyEnum
+-syn keyword cConstant StressxzEnum
+-syn keyword cConstant StressyyEnum
+-syn keyword cConstant StressyzEnum
+-syn keyword cConstant StresszzEnum
+ syn keyword cConstant StrainRateEnum
+ syn keyword cConstant StrainRatexxEnum
+ syn keyword cConstant StrainRatexyEnum
Index: /issm/oecreview/Archive/18296-19100/ISSM-18384-18385.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18384-18385.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18384-18385.diff	(revision 19102)
@@ -0,0 +1,227 @@
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18384)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18385)
+@@ -562,6 +562,7 @@
+ 	StressTensoryyEnum,
+ 	StressTensoryzEnum,
+ 	StressTensorzzEnum,
++	StressMaxPrincipalEnum,
+ 	DeviatoricStressEnum,
+ 	DeviatoricStressxxEnum,
+ 	DeviatoricStressxyEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18384)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18385)
+@@ -553,6 +553,7 @@
+ 		case StressTensoryyEnum : return "StressTensoryy";
+ 		case StressTensoryzEnum : return "StressTensoryz";
+ 		case StressTensorzzEnum : return "StressTensorzz";
++		case StressMaxPrincipalEnum : return "StressMaxPrincipal";
+ 		case DeviatoricStressEnum : return "DeviatoricStress";
+ 		case DeviatoricStressxxEnum : return "DeviatoricStressxx";
+ 		case DeviatoricStressxyEnum : return "DeviatoricStressxy";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18384)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18385)
+@@ -565,6 +565,7 @@
+ 	      else if (strcmp(name,"StressTensoryy")==0) return StressTensoryyEnum;
+ 	      else if (strcmp(name,"StressTensoryz")==0) return StressTensoryzEnum;
+ 	      else if (strcmp(name,"StressTensorzz")==0) return StressTensorzzEnum;
++	      else if (strcmp(name,"StressMaxPrincipal")==0) return StressMaxPrincipalEnum;
+ 	      else if (strcmp(name,"DeviatoricStress")==0) return DeviatoricStressEnum;
+ 	      else if (strcmp(name,"DeviatoricStressxx")==0) return DeviatoricStressxxEnum;
+ 	      else if (strcmp(name,"DeviatoricStressxy")==0) return DeviatoricStressxyEnum;
+@@ -627,11 +628,11 @@
+ 	      else if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
+ 	      else if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
+ 	      else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
+-	      else if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"MinVel")==0) return MinVelEnum;
++	      if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
++	      else if (strcmp(name,"MinVel")==0) return MinVelEnum;
+ 	      else if (strcmp(name,"MaxVel")==0) return MaxVelEnum;
+ 	      else if (strcmp(name,"MinVx")==0) return MinVxEnum;
+ 	      else if (strcmp(name,"MaxVx")==0) return MaxVxEnum;
+Index: ../trunk-jpl/src/c/classes/Elements/Element.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18384)
++++ ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18385)
+@@ -148,6 +148,7 @@
+ 		void       TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);
+ 		void       TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array);
+ 		void       ViscousHeatingCreateInput(void);
++		void       StressMaxPrincipalCreateInput(void);
+ 		void       ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
+ 		void       ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
+ 		void       ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* surf);
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18384)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18385)
+@@ -244,15 +244,15 @@
+ /*}}}*/
+ void       Penta::ComputeStressTensor(){/*{{{*/
+ 
+-	IssmDouble      xyz_list[NUMVERTICES][3];
+-	IssmDouble      pressure,viscosity;
+-	IssmDouble      epsilon[6]; /* epsilon=[exx,eyy,exy];*/
+-	IssmDouble      sigma_xx[NUMVERTICES];
+-	IssmDouble		sigma_yy[NUMVERTICES];
+-	IssmDouble		sigma_zz[NUMVERTICES];
+-	IssmDouble      sigma_xy[NUMVERTICES];
+-	IssmDouble		sigma_xz[NUMVERTICES];
+-	IssmDouble		sigma_yz[NUMVERTICES];
++	IssmDouble  xyz_list[NUMVERTICES][3];
++	IssmDouble  pressure,viscosity;
++	IssmDouble  epsilon[6]; /* epsilon=[exx,eyy,exy];*/
++	IssmDouble  sigma_xx[NUMVERTICES];
++	IssmDouble	sigma_yy[NUMVERTICES];
++	IssmDouble	sigma_zz[NUMVERTICES];
++	IssmDouble  sigma_xy[NUMVERTICES];
++	IssmDouble	sigma_xz[NUMVERTICES];
++	IssmDouble	sigma_yz[NUMVERTICES];
+ 	GaussPenta* gauss=NULL;
+ 
+ 	/* Get node coordinates and dof list: */
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18384)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18385)
+@@ -1157,6 +1157,10 @@
+ 				this->ViscousHeatingCreateInput();
+ 				input=this->inputs->GetInput(output_enum);
+ 				break;
++			case StressMaxPrincipalEnum:
++				this->StressMaxPrincipalCreateInput();
++				input=this->inputs->GetInput(output_enum);
++				break;
+ 			case StressTensorxxEnum: 
+ 			case StressTensorxyEnum: 
+ 			case StressTensorxzEnum: 
+@@ -1337,6 +1341,92 @@
+ 	_assert_(matpar);
+ 	return this->matpar->TMeltingPoint(pressure);
+ }/*}}}*/
++void       Element::StressMaxPrincipalCreateInput(void){/*{{{*/
++
++	/*Intermediaries*/
++	IssmDouble *xyz_list = NULL;
++	IssmDouble  sigma_xx,sigma_yy,sigma_zz,sigma_xy,sigma_xz,sigma_yz;
++	IssmDouble  a,b,c,d,x[3],max;
++	int         dim,numroots;
++
++	/*First: get stress tensor*/
++	this->ComputeStressTensor();
++
++	/*Get domain dimension*/
++	this->FindParam(&dim,DomainDimensionEnum);
++
++	/*Fetch number vertices and allocate memory*/
++	int         numvertices  = this->GetNumberOfVertices();
++	IssmDouble* maxprincipal = xNew<IssmDouble>(numvertices);
++
++	/*Retrieve all inputs and parameters*/
++	this->GetVerticesCoordinatesBase(&xyz_list);
++	Input* sigma_xx_input  = this->GetInput(StressTensorxxEnum); _assert_(sigma_xx_input);
++	Input* sigma_yy_input  = this->GetInput(StressTensoryyEnum); _assert_(sigma_yy_input);
++	Input* sigma_xy_input  = this->GetInput(StressTensorxyEnum); _assert_(sigma_xy_input);
++	Input* sigma_xz_input  = NULL;
++	Input* sigma_yz_input  = NULL;
++	Input* sigma_zz_input  = NULL;
++	if(dim==3){
++		sigma_xz_input  = this->GetInput(StressTensorxzEnum); _assert_(sigma_xz_input);
++		sigma_yz_input  = this->GetInput(StressTensoryzEnum); _assert_(sigma_yz_input);
++		sigma_zz_input  = this->GetInput(StressTensorzzEnum); _assert_(sigma_zz_input);
++	}
++
++	/*loop over vertices: */
++	Gauss* gauss=this->NewGauss();
++	for (int iv=0;iv<numvertices;iv++){
++		gauss->GaussVertex(iv);
++
++		sigma_xx_input->GetInputValue(&sigma_xx,gauss);
++		sigma_yy_input->GetInputValue(&sigma_yy,gauss);
++		sigma_xy_input->GetInputValue(&sigma_xy,gauss);
++		if(dim==3){
++			sigma_xz_input->GetInputValue(&sigma_xz,gauss);
++			sigma_yz_input->GetInputValue(&sigma_yz,gauss);
++			sigma_zz_input->GetInputValue(&sigma_zz,gauss);
++		}
++
++		if(dim==2){
++			a = 0.;
++			b = 1.;
++			c = -sigma_yy -sigma_xx;
++			d = sigma_xx*sigma_yy - sigma_xy*sigma_xy;
++		}
++		else{
++			a = -1.;
++			b = sigma_xx+sigma_yy+sigma_zz;
++			c = -sigma_xx*sigma_yy -sigma_xx*sigma_zz -sigma_yy*sigma_zz + sigma_xy*sigma_xy +sigma_xz*sigma_xz +sigma_yz*sigma_yz;
++			d = sigma_xx*sigma_yy*sigma_zz - sigma_xx*sigma_yz*sigma_yz -sigma_yy*sigma_xz*sigma_xz - sigma_zz*sigma_xy*sigma_xy + 2.*sigma_xy*sigma_xz*sigma_yz;
++		}
++
++		/*Get roots of polynomials*/
++		cubic(a,b,c,d,x,&numroots);
++
++		/*Initialize maximum eigne value*/
++		if(numroots>0){
++			max = x[0];
++		}
++		else{
++			_error_("No eigen value found");
++		}
++
++		/*Get max*/
++		for(int i=1;i<numroots;i++){
++			if(x[i]>max) max = x[i];
++		}
++
++		maxprincipal[iv]=max;
++	}
++
++	/*Create input*/
++	this->AddInput(StressMaxPrincipalEnum,maxprincipal,P1Enum);
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(maxprincipal);
++	delete gauss;
++}
++/*}}}*/
+ void       Element::ViscousHeatingCreateInput(void){/*{{{*/
+ 
+ 	/*Intermediaries*/
+Index: ../trunk-jpl/src/m/enum/StressMaxPrincipalEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressMaxPrincipalEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/StressMaxPrincipalEnum.m	(revision 18385)
+@@ -0,0 +1,11 @@
++function macro=StressMaxPrincipalEnum()
++%STRESSMAXPRINCIPALENUM - Enum of StressMaxPrincipal
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=StressMaxPrincipalEnum()
++
++macro=StringToEnum('StressMaxPrincipal');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18384)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18385)
+@@ -545,6 +545,7 @@
+ def StressTensoryyEnum(): return StringToEnum("StressTensoryy")[0]
+ def StressTensoryzEnum(): return StringToEnum("StressTensoryz")[0]
+ def StressTensorzzEnum(): return StringToEnum("StressTensorzz")[0]
++def StressMaxPrincipalEnum(): return StringToEnum("StressMaxPrincipal")[0]
+ def DeviatoricStressEnum(): return StringToEnum("DeviatoricStress")[0]
+ def DeviatoricStressxxEnum(): return StringToEnum("DeviatoricStressxx")[0]
+ def DeviatoricStressxyEnum(): return StringToEnum("DeviatoricStressxy")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18385-18386.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18385-18386.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18385-18386.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/shared/Numerics/numerics.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Numerics/numerics.h	(revision 18385)
++++ ../trunk-jpl/src/c/shared/Numerics/numerics.h	(revision 18386)
+@@ -32,7 +32,7 @@
+ void        BrentSearch(IssmDouble** pJ,OptPars optpars,IssmDouble* X0,IssmDouble (*f)(IssmDouble*,void*),IssmDouble (*g)(IssmDouble**,IssmDouble*,void*),void* usr);
+ void        cross(IssmDouble *result,IssmDouble*vector1,IssmDouble*vector2);
+ void        XZvectorsToCoordinateSystem(IssmDouble *T,IssmDouble*xzvectors);
+-int         cubic(IssmDouble a, IssmDouble b, IssmDouble c, IssmDouble d, double X[3], int *num);
++int         cubic(IssmDouble a, IssmDouble b, IssmDouble c, IssmDouble d,IssmDouble X[3], int *num);
+ 
+ int         NewtonSolveDnorm(IssmDouble* pdnorm,IssmDouble c1,IssmDouble c2,IssmDouble c3,IssmDouble n,IssmDouble dnorm);
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18386-18387.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18386-18387.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18386-18387.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/jenkins/imac-012301-gil
+===================================================================
+--- ../trunk-jpl/jenkins/imac-012301-gil	(revision 18386)
++++ ../trunk-jpl/jenkins/imac-012301-gil	(revision 18387)
+@@ -55,7 +55,7 @@
+ 						matlab    install.sh                
+ 						mpich     install-3.0-macosx64.sh    
+ 						cmake     install.sh                
+-						petsc     install-3.5-macosx64.sh    
++						petsc     install-3.4-macosx64.sh    
+ 						triangle  install-macosx64.sh 
+ 						shell2junit  install.sh "
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18387-18388.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18387-18388.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18387-18388.diff	(revision 19102)
@@ -0,0 +1,270 @@
+Index: ../trunk-jpl/src/c/classes/Constraints/SpcDynamic.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/SpcDynamic.h	(revision 18387)
++++ ../trunk-jpl/src/c/classes/Constraints/SpcDynamic.h	(revision 18388)
+@@ -13,38 +13,39 @@
+ class SpcDynamic: public Constraint{
+ 
+ 	private: 
+-		int	sid; /*! id, to track it*/
+-		int	nodeid; /*!node id*/
+-		int dof; /*!component*/
+-		IssmDouble value; /*value*/
+-		bool isset;
+-		int analysis_type;
++		int        sid;             /*! id, to track it */
++		int        nodeid;          /*!node id          */
++		int        dof;             /*!component        */
++		IssmDouble value;           /*value             */
++		bool       isset;
++		int        analysis_type;
++		bool       penalty;         /*Is this a penalty constraint */
+ 
+ 	public:
+ 
+-		/*SpcDynamic constructors, destructors:{{{*/
++		/*SpcDynamic constructors, destructors*/
+ 		SpcDynamic();
+ 		SpcDynamic(int sid,int nodeid, int dof,int analysis_type);
+ 		~SpcDynamic();
+-		/*}}}*/
+-		/*Object virtual functions definitions:{{{ */
+-		void  Echo();
+-		void  DeepEcho();
+-		int   Id(); 
+-		int   ObjectEnum();
+-		Object* copy();
+-		/*}}}*/
+-		/*Constraint virtual functions definitions: {{{*/
+-		void   ConstrainNode(Nodes* nodes,Parameters* parameters);
+-		bool   InAnalysis(int analysis_type);
+-		void   PenaltyDofAndValue(int* dof,IssmDouble* value,Nodes* nodes,Parameters* parameters){_error_("not implemented yet");};
+-		/*}}}*/
+-		/*SpcDynamic management:{{{ */
+-		int    GetNodeId();
+-		int    GetDof();
++
++		/*Object virtual functions definitions*/
++		void    Echo();
++		void    DeepEcho();
++		int     Id();
++		int     ObjectEnum();
++		Object *copy();
++
++		/*Constraint virtual functions definitions*/
++		void ConstrainNode(Nodes* nodes,Parameters* parameters);
++		bool InAnalysis(int analysis_type);
++		void ActivatePenaltyMethod(void);
++		void PenaltyDofAndValue(int* dof,IssmDouble* value,Nodes* nodes,Parameters* parameters){_error_("not implemented yet");};
++
++		/*SpcDynamic management*/
++		int        GetNodeId();
++		int        GetDof();
+ 		IssmDouble GetValue();
+-		void   SetDynamicConstraint(Nodes* nodes,IssmDouble *yg_serial);
+-		/*}}}*/
++		void       SetDynamicConstraint(Nodes  *nodes,IssmDouble *yg_serial);
+ 
+ };
+ 
+Index: ../trunk-jpl/src/c/classes/Constraints/SpcStatic.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/SpcStatic.h	(revision 18387)
++++ ../trunk-jpl/src/c/classes/Constraints/SpcStatic.h	(revision 18388)
+@@ -13,11 +13,12 @@
+ class SpcStatic: public Constraint{
+ 
+ 	private: 
+-		int	sid; /*! id, to track it*/
+-		int	nodeid; /*!node id*/
+-		int dof; /*!component*/
+-		IssmDouble value; /*value*/
+-		int analysis_type;
++		int        sid;             /*! id, to track it */
++		int        nodeid;          /*!node id          */
++		int        dof;             /*!component        */
++		IssmDouble value;           /*value             */
++		int        analysis_type;
++		bool       penalty;         /*Is this a penalty constraint */
+ 
+ 	public:
+ 
+@@ -34,6 +35,7 @@
+ 		Object* copy();
+ 		/*}}}*/
+ 		/*Constraint virtual functions definitions: {{{*/
++		void ActivatePenaltyMethod(void);
+ 		void   ConstrainNode(Nodes* nodes,Parameters* parameters);
+ 		bool   InAnalysis(int analysis_type);
+ 		void   PenaltyDofAndValue(int* dof,IssmDouble* value,Nodes* nodes,Parameters* parameters){_error_("not implemented yet");};
+Index: ../trunk-jpl/src/c/classes/Constraints/SpcTransient.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/SpcTransient.h	(revision 18387)
++++ ../trunk-jpl/src/c/classes/Constraints/SpcTransient.h	(revision 18388)
+@@ -13,7 +13,6 @@
+ class SpcTransient: public Constraint{
+ 
+ 	private: 
+-		bool        penalty;         /*Is this a penalty constraint */
+ 		int         sid;             /* id, to track it             */
+ 		int         nodeid;          /*node id                      */
+ 		int         dof;             /*component                    */
+@@ -21,6 +20,7 @@
+ 		IssmDouble *times;           /*different time steps         */
+ 		int         nsteps;          /*number of time steps         */
+ 		int         analysis_type;
++		bool        penalty;         /*Is this a penalty constraint */
+ 
+ 	public:
+ 
+@@ -37,6 +37,7 @@
+ 		Object* copy();
+ 		/*}}}*/
+ 		/*Constraint virtual functions definitions: {{{*/
++		void ActivatePenaltyMethod(void);
+ 		void   ConstrainNode(Nodes* nodes,Parameters* parameters);
+ 		bool   InAnalysis(int analysis_type);
+ 		void   PenaltyDofAndValue(int* dof,IssmDouble* value,Nodes* nodes,Parameters* parameters);
+Index: ../trunk-jpl/src/c/classes/Constraints/Constraints.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/Constraints.cpp	(revision 18387)
++++ ../trunk-jpl/src/c/classes/Constraints/Constraints.cpp	(revision 18388)
+@@ -11,6 +11,7 @@
+ #endif
+ 
+ #include "./Constraints.h"
++#include "./Constraint.h"
+ #include "../../shared/shared.h"
+ #include "../../toolkits/toolkits.h"
+ 
+@@ -33,3 +34,14 @@
+ 	return numberofconstraints;
+ }
+ /*}}}*/
++void Constraints::ActivatePenaltyMethod(int in_analysis){/*{{{*/
++
++	for(int i=0;i<this->Size();i++){
++		Constraint* constraint=(Constraint*)this->GetObjectByOffset(i);
++		if(constraint->InAnalysis(in_analysis)){
++			constraint->ActivatePenaltyMethod();
++		}
++	}
++
++}
++/*}}}*/
+Index: ../trunk-jpl/src/c/classes/Constraints/Constraint.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/Constraint.h	(revision 18387)
++++ ../trunk-jpl/src/c/classes/Constraints/Constraint.h	(revision 18388)
+@@ -22,6 +22,7 @@
+ 		virtual void ConstrainNode(Nodes* nodes,Parameters* parameters)=0;
+ 		virtual void PenaltyDofAndValue(int* dof,IssmDouble* value,Nodes* nodes,Parameters* parameters)=0;
+ 		virtual bool InAnalysis(int analysis_type)=0;
++		virtual void ActivatePenaltyMethod(void)=0;
+ 
+ };
+ #endif
+Index: ../trunk-jpl/src/c/classes/Constraints/SpcDynamic.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/SpcDynamic.cpp	(revision 18387)
++++ ../trunk-jpl/src/c/classes/Constraints/SpcDynamic.cpp	(revision 18388)
+@@ -19,12 +19,13 @@
+ /*}}}*/
+ SpcDynamic::SpcDynamic(int spc_sid,int spc_nodeid, int spc_dof,int spc_analysis_type){/*{{{*/
+ 
+-	sid=spc_sid;
+-	nodeid=spc_nodeid;
+-	dof=spc_dof;
+-	value=0;
+-	analysis_type=spc_analysis_type;
+-	isset=false;
++	sid           = spc_sid;
++	nodeid        = spc_nodeid;
++	dof           = spc_dof;
++	value         = 0;
++	analysis_type = spc_analysis_type;
++	isset         = false;
++	penalty       = false;
+ 
+ 	return;
+ }
+@@ -77,6 +78,10 @@
+ /*}}}*/
+ 
+ /*Constraint virtual functions definitions: */
++void SpcDynamic::ActivatePenaltyMethod(void){/*{{{*/
++	this->penalty = true;
++}
++/*}}}*/
+ bool SpcDynamic::InAnalysis(int in_analysis_type){/*{{{*/
+ 	if (in_analysis_type==this->analysis_type) return true;
+ 	else return false;
+Index: ../trunk-jpl/src/c/classes/Constraints/Constraints.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/Constraints.h	(revision 18387)
++++ ../trunk-jpl/src/c/classes/Constraints/Constraints.h	(revision 18388)
+@@ -26,7 +26,8 @@
+ 		/*}}}*/
+ 
+ 		/*numerics*/
+-		int   NumberOfConstraints(void);
++		int  NumberOfConstraints(void);
++		void ActivatePenaltyMethod(int in_analysis);
+ 
+ };
+ 
+Index: ../trunk-jpl/src/c/classes/Constraints/SpcStatic.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/SpcStatic.cpp	(revision 18387)
++++ ../trunk-jpl/src/c/classes/Constraints/SpcStatic.cpp	(revision 18388)
+@@ -24,6 +24,7 @@
+ 	dof           = spc_dof;
+ 	value         = spc_value;
+ 	analysis_type = spc_analysis_type;
++	penalty       = false;
+ 
+ 	return;
+ }
+@@ -79,6 +80,10 @@
+ /*}}}*/
+ 
+ /*Constraint virtual functions definitions: */
++void SpcStatic::ActivatePenaltyMethod(void){/*{{{*/
++	   this->penalty = true;
++}
++/*}}}*/
+ bool SpcStatic::InAnalysis(int in_analysis_type){/*{{{*/
+ 	if (in_analysis_type==this->analysis_type) return true;
+ 	else return false;
+Index: ../trunk-jpl/src/c/classes/Constraints/SpcTransient.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/SpcTransient.cpp	(revision 18387)
++++ ../trunk-jpl/src/c/classes/Constraints/SpcTransient.cpp	(revision 18388)
+@@ -27,11 +27,11 @@
+ /*}}}*/
+ SpcTransient::SpcTransient(int spc_sid,int spc_nodeid, int spc_dof,int spc_nsteps, IssmDouble* spc_times, IssmDouble* spc_values,int spc_analysis_type){/*{{{*/
+ 
+-	penalty= false;
+-	sid    = spc_sid;
+-	nodeid = spc_nodeid;
+-	dof    = spc_dof;
+-	nsteps = spc_nsteps;
++	penalty = false;
++	sid     = spc_sid;
++	nodeid  = spc_nodeid;
++	dof     = spc_dof;
++	nsteps  = spc_nsteps;
+ 	if(spc_nsteps){
+ 		values = xNew<IssmDouble>(spc_nsteps);
+ 		times  = xNew<IssmDouble>(spc_nsteps);
+@@ -86,6 +86,10 @@
+ /*}}}*/
+ 
+ /*Constraint virtual functions definitions:*/
++void SpcTransient::ActivatePenaltyMethod(void){/*{{{*/
++	   this->penalty = true;
++}
++/*}}}*/
+ bool SpcTransient::InAnalysis(int in_analysis_type){/*{{{*/
+ 
+ 	if (in_analysis_type==this->analysis_type) return true;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18388-18389.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18388-18389.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18388-18389.diff	(revision 19102)
@@ -0,0 +1,17 @@
+Index: ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18388)
++++ ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18389)
+@@ -154,7 +154,11 @@
+ 	if(stabilization!=3){
+ 		IoModelToConstraintsx(constraints,iomodel,MasstransportSpcthicknessEnum,MasstransportAnalysisEnum,P1Enum);
+ 	}
+-	/*Do not add constraints in FCT, they are imposed using penalties*/
++
++	/*FCT, constraints are imposed using penalties*/
++	if(stabilization==4){
++		constraints->ActivatePenaltyMethod(MasstransportAnalysisEnum);
++	}
+ }/*}}}*/
+ void MasstransportAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18389-18390.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18389-18390.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18389-18390.diff	(revision 19102)
@@ -0,0 +1,213 @@
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18389)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18390)
+@@ -107,30 +107,29 @@
+ 				case Balancethickness2MisfitEnum:
+ 					/*J = (H^2 - Hobs^2)^2*/
+ 					//for(i=0;i<numnodes;i++){
+-
+-					//	/*H^2 - Hobs^2*/
+ 					//	NUMxH2 = 2.*dbasis[0*numnodes+i]*dphi[0]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
+ 					//	NUMyH2 = 2.*dbasis[1*numnodes+i]*dphi[1]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
+ 					//	DENH2 = vbarobs2*vbarobs2+1.e-14;
+-
+-					//	/*Ubar-Ubar_obs*/
+-					//	NUMxUbar = (vyobsbar*dphi[0]*dphi[1] - vxobsbar*dphi[1]*dphi[1])*vbarobs*dbasis[0*numnodes+i];
+-					//	NUMyUbar = (vyobsbar*dphi[0]*dphi[0] - vxobsbar*dphi[0]*dphi[1])*vbarobs*dbasis[1*numnodes+i];
+-					//	DENUbar  = pow(dphi[0]*dphi[0] + dphi[1]*dphi[1],3./2.)+1.e-14;
+-
+ 					//	pe->values[i]+=(NUMxH2+NUMyH2)/DENH2 *weight*Jdet*gauss->weight;
+ 					//}
+ 					/*J = phi^2*/
+ 					//for(i=0;i<numnodes;i++) pe->values[i]+= phi*basis[i]*weight*Jdet*gauss->weight; //OK
+-					/*J = grad J ^2*/
++					/*J = grad phi ^2*/
+ 					//for(i=0;i<numnodes;i++) pe->values[i]+= (dphi[0]*dbasis[0*numnodes+i] + dphi[1]*dbasis[1*numnodes+i])*weight*Jdet*gauss->weight; //OK
+ 					/*J = (ubar - nux*uobs)^2*/
++					//for(i=0;i<numnodes;i++){
++					//	NUMxUbar = (vyobsbar*dphi[0]*dphi[1] - vxobsbar*dphi[1]*dphi[1])*vbarobs*dbasis[0*numnodes+i];
++					//	NUMyUbar = (vyobsbar*dphi[0]*dphi[0] - vxobsbar*dphi[0]*dphi[1])*vbarobs*dbasis[1*numnodes+i];
++					//	DENUbar  = pow(dphi[0]*dphi[0] + dphi[1]*dphi[1],3./2.)+1.e-14;
++					//	pe->values[i]+=(NUMxUbar-NUMyUbar)/DENUbar *weight*Jdet*gauss->weight;
++					//}
++					/*J = 1/2 (vbar ^ gard(phi))^2*/
+ 					for(i=0;i<numnodes;i++){
+-						NUMxUbar = (vyobsbar*dphi[0]*dphi[1] - vxobsbar*dphi[1]*dphi[1])*vbarobs*dbasis[0*numnodes+i];
+-						NUMyUbar = (vyobsbar*dphi[0]*dphi[0] - vxobsbar*dphi[0]*dphi[1])*vbarobs*dbasis[1*numnodes+i];
+-						DENUbar  = pow(dphi[0]*dphi[0] + dphi[1]*dphi[1],3./2.)+1.e-14;
+-						pe->values[i]+=(NUMxUbar-NUMyUbar)/DENUbar *weight*Jdet*gauss->weight;
++						pe->values[i]+= weight*Jdet*gauss->weight*
++						  (nuy*vyobs*dphi[0] - nux*vxobs*dphi[1])*
++						  (nuy*vyobs*dbasis[0*numnodes+i] - nux*vxobs*dbasis[1*numnodes+i]);
+ 					}
++
+ 					break;
+ 				default:
+ 					_error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
+@@ -167,11 +166,6 @@
+ 	element->FindParam(&num_responses,InversionNumCostFunctionsEnum);
+ 	element->FindParam(&responses,NULL,InversionCostFunctionsEnum);
+ 
+-	/*Check that control_type is supported*/
+-	if(control_type!=BalancethicknessApparentMassbalanceEnum){
+-		_error_("Control "<<EnumToStringx(control_type)<<" not supported");
+-	}
+-
+ 	/*Deal with first part (partial derivative a J with respect to k)*/
+ 	for(resp=0;resp<num_responses;resp++) switch(responses[resp]){
+ 		case Balancethickness2MisfitEnum: /*Nothing, \partial J/\partial k = 0*/ break;
+@@ -181,6 +175,8 @@
+ 	/*Deal with second term*/
+ 	switch(control_type){
+ 		case BalancethicknessApparentMassbalanceEnum: GradientJAdot(element,gradient,control_index); break;
++		case BalancethicknessNuxEnum: GradientJNux(element,gradient,control_index); break;
++		case BalancethicknessNuyEnum: GradientJNuy(element,gradient,control_index); break;
+ 		default: _error_("control type not supported yet: " << EnumToStringx(control_type));
+ 	}
+ 
+@@ -233,6 +229,116 @@
+ 	xDelete<int>(vertexpidlist);
+ 	delete gauss;
+ }/*}}}*/
++void AdjointBalancethickness2Analysis::GradientJNux(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++
++	/*Intermediaries*/
++	IssmDouble Jdet,weight;
++	IssmDouble vxobs,vyobs;
++	IssmDouble nux,nuy,dphi[2];
++	IssmDouble *xyz_list= NULL;
++
++	/*Fetch number of vertices for this finite element*/
++	int numvertices = element->GetNumberOfVertices();
++
++	/*Initialize some vectors*/
++	IssmDouble* basis         = xNew<IssmDouble>(numvertices);
++	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
++	int*        vertexpidlist = xNew<int>(numvertices);
++
++	/*Retrieve all inputs we will be needing: */
++	element->GetVerticesCoordinates(&xyz_list);
++	element->GradientIndexing(&vertexpidlist[0],control_index);
++	Input* weights_input   = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
++	Input* vxobs_input     = element->GetInput(BalancethicknessVxObsEnum); _assert_(vxobs_input);
++	Input* vyobs_input     = element->GetInput(BalancethicknessVyObsEnum); _assert_(vyobs_input);
++	Input* nux_input       = element->GetInput(BalancethicknessNuxEnum);   _assert_(nux_input);
++	Input* nuy_input       = element->GetInput(BalancethicknessNuyEnum);   _assert_(nuy_input);
++	Input* potential_input = element->GetInput(PotentialEnum);             _assert_(potential_input);
++
++
++	Gauss* gauss=element->NewGauss(2);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		element->NodalFunctionsP1(basis,gauss);
++		weights_input->GetInputValue(&weight,gauss,Balancethickness2MisfitEnum);
++		vxobs_input->GetInputValue(&vxobs,gauss);
++		vyobs_input->GetInputValue(&vyobs,gauss);
++		nux_input->GetInputValue(&nux,gauss);
++		nuy_input->GetInputValue(&nuy,gauss);
++		potential_input->GetInputDerivativeValue(&dphi[0],xyz_list,gauss);
++
++		/*Build gradient vector (actually -dJ/da): */
++		for(int i=0;i<numvertices;i++){
++			ge[i]+= - weight*Jdet*gauss->weight*(-vxobs)*dphi[1]*(nuy*vyobs*dphi[0] - nux*vxobs*dphi[1])*basis[i];
++			_assert_(!xIsNan<IssmDouble>(ge[i]));
++		}
++	}
++	gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(ge);
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(basis);
++	xDelete<int>(vertexpidlist);
++	delete gauss;
++}/*}}}*/
++void AdjointBalancethickness2Analysis::GradientJNuy(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++
++	/*Intermediaries*/
++	IssmDouble Jdet,weight;
++	IssmDouble vxobs,vyobs;
++	IssmDouble nux,nuy,dphi[2];
++	IssmDouble *xyz_list= NULL;
++
++	/*Fetch number of vertices for this finite element*/
++	int numvertices = element->GetNumberOfVertices();
++
++	/*Initialize some vectors*/
++	IssmDouble* basis         = xNew<IssmDouble>(numvertices);
++	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
++	int*        vertexpidlist = xNew<int>(numvertices);
++
++	/*Retrieve all inputs we will be needing: */
++	element->GetVerticesCoordinates(&xyz_list);
++	element->GradientIndexing(&vertexpidlist[0],control_index);
++	Input* weights_input   = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
++	Input* vxobs_input     = element->GetInput(BalancethicknessVxObsEnum); _assert_(vxobs_input);
++	Input* vyobs_input     = element->GetInput(BalancethicknessVyObsEnum); _assert_(vyobs_input);
++	Input* nux_input       = element->GetInput(BalancethicknessNuxEnum);   _assert_(nux_input);
++	Input* nuy_input       = element->GetInput(BalancethicknessNuyEnum);   _assert_(nuy_input);
++	Input* potential_input = element->GetInput(PotentialEnum);             _assert_(potential_input);
++
++
++	Gauss* gauss=element->NewGauss(2);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		element->NodalFunctionsP1(basis,gauss);
++		weights_input->GetInputValue(&weight,gauss,Balancethickness2MisfitEnum);
++		vxobs_input->GetInputValue(&vxobs,gauss);
++		vyobs_input->GetInputValue(&vyobs,gauss);
++		nux_input->GetInputValue(&nux,gauss);
++		nuy_input->GetInputValue(&nuy,gauss);
++		potential_input->GetInputDerivativeValue(&dphi[0],xyz_list,gauss);
++
++		/*Build gradient vector (actually -dJ/da): */
++		for(int i=0;i<numvertices;i++){
++			ge[i]+= - weight*Jdet*gauss->weight*(+vyobs)*dphi[0]*(nuy*vyobs*dphi[0] - nux*vxobs*dphi[1])*basis[i];
++			_assert_(!xIsNan<IssmDouble>(ge[i]));
++		}
++	}
++	gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(ge);
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(basis);
++	xDelete<int>(vertexpidlist);
++	delete gauss;
++}/*}}}*/
+ void AdjointBalancethickness2Analysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 	element->InputUpdateFromSolutionOneDof(solution,AdjointEnum);
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h	(revision 18389)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h	(revision 18390)
+@@ -28,6 +28,8 @@
+ 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+ 		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+ 		void GradientJAdot(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void GradientJNux(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void GradientJNuy(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+ 		void UpdateConstraints(FemModel* femmodel);
+ };
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18389)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18390)
+@@ -1360,7 +1360,9 @@
+ 			/*J = grad phi^2*/
+ 			//J +=.5*(dpotential[0]*dpotential[0] + dpotential[1]*dpotential[1])*weight*Jdet*gauss->weight;
+ 			/*J = (ubar - nux*uobs)^2*/
+-			J +=0.5*((vxbarobs - vxbar)*(vxbarobs - vxbar) + (vybarobs - vybar)*(vybarobs - vybar))*weight*Jdet*gauss->weight;
++			//J +=0.5*((vxbarobs - vxbar)*(vxbarobs - vxbar) + (vybarobs - vybar)*(vybarobs - vybar))*weight*Jdet*gauss->weight;
++			/*J = 1/2 (vbar ^ gard(phi))^2*/
++			J += 0.5*(nuy*vyobs*dpotential[0] - nux*vxobs*dpotential[1])*(nuy*vyobs*dpotential[0] - nux*vxobs*dpotential[1])*weight*Jdet*gauss->weight;
+ 		}
+ 
+ 		/*clean up and Return: */
Index: /issm/oecreview/Archive/18296-19100/ISSM-18390-18391.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18390-18391.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18390-18391.diff	(revision 19102)
@@ -0,0 +1,46 @@
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18390)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18391)
+@@ -175,8 +175,8 @@
+ 	/*Deal with second term*/
+ 	switch(control_type){
+ 		case BalancethicknessApparentMassbalanceEnum: GradientJAdot(element,gradient,control_index); break;
+-		case BalancethicknessNuxEnum: GradientJNux(element,gradient,control_index); break;
+-		case BalancethicknessNuyEnum: GradientJNuy(element,gradient,control_index); break;
++		case BalancethicknessNuxEnum: GradientJNux(element,gradient,control_index); break;//should be in first part....
++		case BalancethicknessNuyEnum: GradientJNuy(element,gradient,control_index); break;//should be in first part....
+ 		default: _error_("control type not supported yet: " << EnumToStringx(control_type));
+ 	}
+ 
+@@ -255,7 +255,6 @@
+ 	Input* nuy_input       = element->GetInput(BalancethicknessNuyEnum);   _assert_(nuy_input);
+ 	Input* potential_input = element->GetInput(PotentialEnum);             _assert_(potential_input);
+ 
+-
+ 	Gauss* gauss=element->NewGauss(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 		gauss->GaussPoint(ig);
+@@ -275,6 +274,9 @@
+ 			_assert_(!xIsNan<IssmDouble>(ge[i]));
+ 		}
+ 	}
++	if(element->Id()==1){
++		printarray(ge,3);
++	}
+ 	gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
+ 
+ 	/*Clean up and return*/
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18390)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18391)
+@@ -1053,6 +1053,8 @@
+ 				name==BedEnum ||
+ 				name==BalancethicknessThickeningRateEnum ||
+ 				name==BalancethicknessApparentMassbalanceEnum ||
++				name==BalancethicknessNuxEnum ||
++				name==BalancethicknessNuyEnum ||
+ 				name==SigmaNNEnum ||
+ 				name==SurfaceSlopeXEnum ||
+ 				name==SurfaceSlopeYEnum ||
Index: /issm/oecreview/Archive/18296-19100/ISSM-18391-18392.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18391-18392.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18391-18392.diff	(revision 19102)
@@ -0,0 +1,76 @@
+Index: ../trunk-jpl/externalpackages/mpich/install-3.0-macosx64.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/mpich/install-3.0-macosx64.sh	(revision 18391)
++++ ../trunk-jpl/externalpackages/mpich/install-3.0-macosx64.sh	(revision 18392)
+@@ -19,7 +19,6 @@
+ cd src
+ ./configure \
+ 	--prefix="$ISSM_DIR/externalpackages/mpich/install" \
+-	--enable-shared
+ 
+ 	#CC=llvm-gcc \
+ 
+Index: ../trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64.sh	(revision 18391)
++++ ../trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64.sh	(revision 18392)
+@@ -24,7 +24,6 @@
+ cp $DAK_SRC/cmake/BuildDakotaTemplate.cmake $DAK_SRC/cmake/BuildDakotaCustom.cmake
+ patch $DAK_SRC/cmake/BuildDakotaCustom.cmake configs/5.3.1/BuildDakotaCustom.cmake.mac.patch
+ patch $DAK_SRC/cmake/DakotaDev.cmake configs/5.3.1/DakotaDev.cmake.patch
+-patch $DAK_SRC/CMakeLists.txt configs/5.3.1/CMakeLists.txt.patch
+ 
+ #Apply patches
+ patch src/src/ParallelLibrary.cpp configs/5.3.1/ParallelLibrary.cpp.patch
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh	(revision 18391)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh	(revision 18392)
+@@ -22,7 +22,9 @@
+ 	--with-debugging=0 \
+ 	--with-valgrind=0 \
+ 	--with-x=0 \
+-	--with-shared-libraries=1 \
++	--with-ssl=0 \
++	--with-shared-libraries=0 \
++   --download-fblaslapack=1 \
+ 	--download-metis=1 \
+ 	--download-parmetis=1 \
+ 	--download-mumps=1 \
+Index: ../trunk-jpl/packagers/macosx/package.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/package.sh	(revision 18391)
++++ ../trunk-jpl/packagers/macosx/package.sh	(revision 18392)
+@@ -1,25 +1,13 @@
+ #/bin/bash
+ 
+ #Package using the Package Maker from OSX, driven by command line.
+-echo "Cleanup first" 
+-sudo sh -c "rm -rf ISSM-MacOSX.pkg bin test"
++tarball_name='issm-mac-static_build.tar.gz'
+ 
+-#We need to copy all the relevant files and set the permissions, as PackageMaker 
+-#is not good at that. 
+-echo "Copy bin" 
+-cp -Rf $ISSM_TIER/bin ./
+-echo "Copy test" 
+-cp -Rf $ISSM_TIER/test ./
+-cp matlabissm startup.m ./bin
++cd $ISSM_DIR
+ 
+-#Now change group and ownership: 
+-echo "Change group and ownership" 
+-sudo sh -c "chown -R root ./bin && chgrp -R admin ./bin"
+-sudo sh -c "chown -R root ./test && chgrp -R admin ./test"
++echo "Cleanup first" 
++ 
++rm $tarball_name
+ 
+-echo "Launch packagemaker" 
+-PackageMaker -d ISSM.pmdoc -o ISSM-MacOSX.pkg
+-
+-#cleanup
+-echo "Final cleanup"
+-sudo sh -c "rm -rf ./bin && rm -rf ./test"
++echo "Creating tarball: ${tarball_name}"
++tar -czf $tarball_name ./bin ./lib ./test ./examples
Index: /issm/oecreview/Archive/18296-19100/ISSM-18392-18393.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18392-18393.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18392-18393.diff	(revision 19102)
@@ -0,0 +1,119 @@
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18392)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18393)
+@@ -233,8 +233,8 @@
+ 
+ 	/*Intermediaries*/
+ 	IssmDouble Jdet,weight;
+-	IssmDouble vxobs,vyobs;
+-	IssmDouble nux,nuy,dphi[2];
++	IssmDouble vxobs,vyobs,thicknessobs;
++	IssmDouble nux,nuy,dphi[2],dphinorm2,nuvobs2;
+ 	IssmDouble *xyz_list= NULL;
+ 
+ 	/*Fetch number of vertices for this finite element*/
+@@ -254,6 +254,7 @@
+ 	Input* nux_input       = element->GetInput(BalancethicknessNuxEnum);   _assert_(nux_input);
+ 	Input* nuy_input       = element->GetInput(BalancethicknessNuyEnum);   _assert_(nuy_input);
+ 	Input* potential_input = element->GetInput(PotentialEnum);             _assert_(potential_input);
++	Input* thicknessobs_input=element->GetInput(InversionThicknessObsEnum);_assert_(thicknessobs_input);
+ 
+ 	Gauss* gauss=element->NewGauss(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+@@ -267,10 +268,19 @@
+ 		nux_input->GetInputValue(&nux,gauss);
+ 		nuy_input->GetInputValue(&nuy,gauss);
+ 		potential_input->GetInputDerivativeValue(&dphi[0],xyz_list,gauss);
++		thicknessobs_input->GetInputValue(&thicknessobs,gauss);
+ 
++		dphinorm2 = dphi[0]*dphi[0] + dphi[1]*dphi[1];
++		nuvobs2   = nux*vxobs*nux*vxobs + nuy*vyobs*nuy*vyobs;
++
+ 		/*Build gradient vector (actually -dJ/da): */
+ 		for(int i=0;i<numvertices;i++){
+-			ge[i]+= - weight*Jdet*gauss->weight*(-vxobs)*dphi[1]*(nuy*vyobs*dphi[0] - nux*vxobs*dphi[1])*basis[i];
++			//ge[i]+= - weight*Jdet*gauss->weight*(-vxobs)*dphi[1]*(nuy*vyobs*dphi[0] - nux*vxobs*dphi[1])*basis[i]; //THIS IS FOR Q//V
++			ge[i]+= - weight*Jdet*gauss->weight*basis[i]*(
++						-2.*nux*vxobs*vxobs*(
++							dphinorm2*dphinorm2 - thicknessobs*thicknessobs*dphinorm2*nuvobs2
++							)/ ( (pow(nux,6)+pow(nuy,6))*pow(vxobs,6) + 3*(nux*vxobs*nuy*vyobs)*(nux*vxobs*nuy*vyobs)*nuvobs2)
++						);
+ 			_assert_(!xIsNan<IssmDouble>(ge[i]));
+ 		}
+ 	}
+@@ -290,8 +300,8 @@
+ 
+ 	/*Intermediaries*/
+ 	IssmDouble Jdet,weight;
+-	IssmDouble vxobs,vyobs;
+-	IssmDouble nux,nuy,dphi[2];
++	IssmDouble vxobs,vyobs,thicknessobs;
++	IssmDouble nux,nuy,dphi[2],dphinorm2,nuvobs2;
+ 	IssmDouble *xyz_list= NULL;
+ 
+ 	/*Fetch number of vertices for this finite element*/
+@@ -305,12 +315,13 @@
+ 	/*Retrieve all inputs we will be needing: */
+ 	element->GetVerticesCoordinates(&xyz_list);
+ 	element->GradientIndexing(&vertexpidlist[0],control_index);
+-	Input* weights_input   = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+-	Input* vxobs_input     = element->GetInput(BalancethicknessVxObsEnum); _assert_(vxobs_input);
+-	Input* vyobs_input     = element->GetInput(BalancethicknessVyObsEnum); _assert_(vyobs_input);
+-	Input* nux_input       = element->GetInput(BalancethicknessNuxEnum);   _assert_(nux_input);
+-	Input* nuy_input       = element->GetInput(BalancethicknessNuyEnum);   _assert_(nuy_input);
+-	Input* potential_input = element->GetInput(PotentialEnum);             _assert_(potential_input);
++	Input* weights_input      = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
++	Input* vxobs_input        = element->GetInput(BalancethicknessVxObsEnum); _assert_(vxobs_input);
++	Input* vyobs_input        = element->GetInput(BalancethicknessVyObsEnum); _assert_(vyobs_input);
++	Input* nux_input          = element->GetInput(BalancethicknessNuxEnum);   _assert_(nux_input);
++	Input* nuy_input          = element->GetInput(BalancethicknessNuyEnum);   _assert_(nuy_input);
++	Input* potential_input    = element->GetInput(PotentialEnum);             _assert_(potential_input);
++	Input* thicknessobs_input = element->GetInput(InversionThicknessObsEnum);_assert_(thicknessobs_input);
+ 
+ 
+ 	Gauss* gauss=element->NewGauss(2);
+@@ -325,10 +336,20 @@
+ 		nux_input->GetInputValue(&nux,gauss);
+ 		nuy_input->GetInputValue(&nuy,gauss);
+ 		potential_input->GetInputDerivativeValue(&dphi[0],xyz_list,gauss);
++		thicknessobs_input->GetInputValue(&thicknessobs,gauss);
+ 
++		dphinorm2 = dphi[0]*dphi[0] + dphi[1]*dphi[1];
++		nuvobs2   = nux*vxobs*nux*vxobs + nuy*vyobs*nuy*vyobs;
++
++
+ 		/*Build gradient vector (actually -dJ/da): */
+ 		for(int i=0;i<numvertices;i++){
+-			ge[i]+= - weight*Jdet*gauss->weight*(+vyobs)*dphi[0]*(nuy*vyobs*dphi[0] - nux*vxobs*dphi[1])*basis[i];
++			//ge[i]+= - weight*Jdet*gauss->weight*(+vyobs)*dphi[0]*(nuy*vyobs*dphi[0] - nux*vxobs*dphi[1])*basis[i];
++			ge[i]+= - weight*Jdet*gauss->weight*basis[i]*(
++						-2.*nuy*vyobs*vyobs*(
++							dphinorm2*dphinorm2 - thicknessobs*thicknessobs*dphinorm2*nuvobs2
++							)/ ( (pow(nux,6)+pow(nuy,6))*pow(vyobs,6) + 3*(nux*vxobs*nuy*vyobs)*(nux*vxobs*nuy*vyobs)*nuvobs2)
++						);
+ 			_assert_(!xIsNan<IssmDouble>(ge[i]));
+ 		}
+ 	}
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18392)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18393)
+@@ -1354,7 +1354,7 @@
+ 			vybarobs = nuy*vyobs;
+ 
+ 			/*J = (H^2 - Hobs^2)^2*/
+-			//J +=0.5*(thickness*thickness - thicknessobs*thicknessobs)*(thickness*thickness - thicknessobs*thicknessobs)*weight*Jdet*gauss->weight;
++			J +=0.5*(thickness*thickness - thicknessobs*thicknessobs)*(thickness*thickness - thicknessobs*thicknessobs)*weight*Jdet*gauss->weight;
+ 			/*J = phi^2*/
+ 			//J +=.5*potential*potential*weight*Jdet*gauss->weight;// OK
+ 			/*J = grad phi^2*/
+@@ -1362,7 +1362,7 @@
+ 			/*J = (ubar - nux*uobs)^2*/
+ 			//J +=0.5*((vxbarobs - vxbar)*(vxbarobs - vxbar) + (vybarobs - vybar)*(vybarobs - vybar))*weight*Jdet*gauss->weight;
+ 			/*J = 1/2 (vbar ^ gard(phi))^2*/
+-			J += 0.5*(nuy*vyobs*dpotential[0] - nux*vxobs*dpotential[1])*(nuy*vyobs*dpotential[0] - nux*vxobs*dpotential[1])*weight*Jdet*gauss->weight;
++			//J += 0.5*(nuy*vyobs*dpotential[0] - nux*vxobs*dpotential[1])*(nuy*vyobs*dpotential[0] - nux*vxobs*dpotential[1])*weight*Jdet*gauss->weight;
+ 		}
+ 
+ 		/*clean up and Return: */
Index: /issm/oecreview/Archive/18296-19100/ISSM-18393-18394.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18393-18394.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18393-18394.diff	(revision 19102)
@@ -0,0 +1,14 @@
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18393)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18394)
+@@ -284,9 +284,6 @@
+ 			_assert_(!xIsNan<IssmDouble>(ge[i]));
+ 		}
+ 	}
+-	if(element->Id()==1){
+-		printarray(ge,3);
+-	}
+ 	gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
+ 
+ 	/*Clean up and return*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18394-18395.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18394-18395.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18394-18395.diff	(revision 19102)
@@ -0,0 +1,39 @@
+Index: ../trunk-jpl/externalpackages/mpich/install-3.0-macosx64.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/mpich/install-3.0-macosx64.sh	(revision 18394)
++++ ../trunk-jpl/externalpackages/mpich/install-3.0-macosx64.sh	(revision 18395)
+@@ -19,6 +19,7 @@
+ cd src
+ ./configure \
+ 	--prefix="$ISSM_DIR/externalpackages/mpich/install" \
++	--enable-shared
+ 
+ 	#CC=llvm-gcc \
+ 
+Index: ../trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64.sh	(revision 18394)
++++ ../trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64.sh	(revision 18395)
+@@ -24,6 +24,7 @@
+ cp $DAK_SRC/cmake/BuildDakotaTemplate.cmake $DAK_SRC/cmake/BuildDakotaCustom.cmake
+ patch $DAK_SRC/cmake/BuildDakotaCustom.cmake configs/5.3.1/BuildDakotaCustom.cmake.mac.patch
+ patch $DAK_SRC/cmake/DakotaDev.cmake configs/5.3.1/DakotaDev.cmake.patch
++patch $DAK_SRC/CMakeLists.txt configs/5.3.1/CMakeLists.txt.patch
+ 
+ #Apply patches
+ patch src/src/ParallelLibrary.cpp configs/5.3.1/ParallelLibrary.cpp.patch
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh	(revision 18394)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh	(revision 18395)
+@@ -22,9 +22,7 @@
+ 	--with-debugging=0 \
+ 	--with-valgrind=0 \
+ 	--with-x=0 \
+-	--with-ssl=0 \
+-	--with-shared-libraries=0 \
+-   --download-fblaslapack=1 \
++	--with-shared-libraries=1 \
+ 	--download-metis=1 \
+ 	--download-parmetis=1 \
+ 	--download-mumps=1 \
Index: /issm/oecreview/Archive/18296-19100/ISSM-18395-18396.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18395-18396.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18395-18396.diff	(revision 19102)
@@ -0,0 +1,242 @@
+Index: ../trunk-jpl/packagers/macosx/ISSM.appscript
+===================================================================
+--- ../trunk-jpl/packagers/macosx/ISSM.appscript	(revision 18395)
++++ ../trunk-jpl/packagers/macosx/ISSM.appscript	(revision 18396)
+@@ -1 +0,0 @@
+-do shell script "open ~/ISSM/bin/matlabissm"
+Index: ../trunk-jpl/packagers/macosx/package_incomplete.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/package_incomplete.sh	(revision 18395)
++++ ../trunk-jpl/packagers/macosx/package_incomplete.sh	(revision 18396)
+@@ -1,16 +0,0 @@
+-#/bin/bash
+-
+-#Package using the Package Maker from OSX, driven by command line.
+-sudo sh -c "rm -rf ISSM-MacOSX.pkg bin test"
+-
+-#We need to copy all the relevant files and set the permissions, as PackageMaker 
+-#is not good at that. 
+-cp -Rf $ISSM_TIER/bin ./
+-cp -Rf $ISSM_TIER/test ./
+-cp matlabissm startup.m ./bin
+-
+-#Now change group and ownership: 
+-sudo sh -c "chown -R root ./bin && chgrp -R admin ./bin"
+-sudo sh -c "chown -R root ./test && chgrp -R admin ./test"
+-
+-#Run PackageMaker now, using the ISSM.pmdoc project
+Index: ../trunk-jpl/packagers/macosx/issm.icns
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/packagers/macosx/ISSM.app/Contents/MacOS/applet
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/packagers/macosx/ISSM.app/Contents/Info.plist
+===================================================================
+--- ../trunk-jpl/packagers/macosx/ISSM.app/Contents/Info.plist	(revision 18395)
++++ ../trunk-jpl/packagers/macosx/ISSM.app/Contents/Info.plist	(revision 18396)
+@@ -1,44 +0,0 @@
+-<?xml version="1.0" encoding="UTF-8"?>
+-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+-<plist version="1.0">
+-<dict>
+-	<key>CFBundleAllowMixedLocalizations</key>
+-	<true/>
+-	<key>CFBundleDevelopmentRegion</key>
+-	<string>English</string>
+-	<key>CFBundleExecutable</key>
+-	<string>applet</string>
+-	<key>CFBundleIconFile</key>
+-	<string>applet</string>
+-	<key>CFBundleInfoDictionaryVersion</key>
+-	<string>6.0</string>
+-	<key>CFBundleName</key>
+-	<string>ISSM</string>
+-	<key>CFBundlePackageType</key>
+-	<string>APPL</string>
+-	<key>CFBundleSignature</key>
+-	<string>aplt</string>
+-	<key>LSMinimumSystemVersionByArchitecture</key>
+-	<dict>
+-		<key>x86_64</key>
+-		<string>10.6</string>
+-	</dict>
+-	<key>LSRequiresCarbon</key>
+-	<true/>
+-	<key>WindowState</key>
+-	<dict>
+-		<key>dividerCollapsed</key>
+-		<false/>
+-		<key>eventLogLevel</key>
+-		<integer>-1</integer>
+-		<key>name</key>
+-		<string>ScriptWindowState</string>
+-		<key>positionOfDivider</key>
+-		<real>333</real>
+-		<key>savedFrame</key>
+-		<string>3 428 602 597 0 0 1680 1028 </string>
+-		<key>selectedTabView</key>
+-		<string>result</string>
+-	</dict>
+-</dict>
+-</plist>
+Index: ../trunk-jpl/packagers/macosx/ISSM.app/Contents/Resources/applet.rsrc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/packagers/macosx/ISSM.app/Contents/Resources/applet.icns
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/packagers/macosx/ISSM.app/Contents/Resources/description.rtfd/TXT.rtf
+===================================================================
+--- ../trunk-jpl/packagers/macosx/ISSM.app/Contents/Resources/description.rtfd/TXT.rtf	(revision 18395)
++++ ../trunk-jpl/packagers/macosx/ISSM.app/Contents/Resources/description.rtfd/TXT.rtf	(revision 18396)
+@@ -1,4 +0,0 @@
+-{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+-{\fonttbl}
+-{\colortbl;\red255\green255\blue255;}
+-}
+\ No newline at end of file
+Index: ../trunk-jpl/packagers/macosx/ISSM.app/Contents/Resources/Scripts/main.scpt
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/packagers/macosx/ISSM.app/Contents/PkgInfo
+===================================================================
+--- ../trunk-jpl/packagers/macosx/ISSM.app/Contents/PkgInfo	(revision 18395)
++++ ../trunk-jpl/packagers/macosx/ISSM.app/Contents/PkgInfo	(revision 18396)
+@@ -1 +0,0 @@
+-APPLaplt
+\ No newline at end of file
+Index: ../trunk-jpl/packagers/macosx/ISSM.pmdoc/02bin.xml
+===================================================================
+--- ../trunk-jpl/packagers/macosx/ISSM.pmdoc/02bin.xml	(revision 18395)
++++ ../trunk-jpl/packagers/macosx/ISSM.pmdoc/02bin.xml	(revision 18396)
+@@ -1 +0,0 @@
+-<pkgref spec="1.12" uuid="18E7DF11-93BD-47ED-B9FE-56870B61EB72"><config><identifier>issm.bin.pkg</identifier><version>1.0</version><description></description><post-install type="none"/><requireAuthorization/><installFrom mod="true">/Users/larour/issm-uci/trunk-jpl/packagers/macosx/bin</installFrom><installTo mod="true">/ISSM/bin</installTo><flags><followSymbolicLinks/></flags><packageStore type="internal"></packageStore><mod>installTo.path</mod><mod>parent</mod><mod>installFrom.path</mod><mod>includeRoot</mod><mod>identifier</mod><mod>installTo</mod></config><contents><file-list>02bin-contents.xml</file-list><filter>/CVS$</filter><filter>/\.svn$</filter><filter>/\.cvsignore$</filter><filter>/\.cvspass$</filter><filter>/\.DS_Store$</filter></contents></pkgref>
+\ No newline at end of file
+Index: ../trunk-jpl/packagers/macosx/ISSM.pmdoc/01issm.xml
+===================================================================
+--- ../trunk-jpl/packagers/macosx/ISSM.pmdoc/01issm.xml	(revision 18395)
++++ ../trunk-jpl/packagers/macosx/ISSM.pmdoc/01issm.xml	(revision 18396)
+@@ -1 +0,0 @@
+-<pkgref spec="1.12" uuid="280C4FF1-FB54-447F-B616-1EB3C56397F9"><config><identifier>ISSM.pkg</identifier><version>1.0</version><description></description><post-install type="none"/><requireAuthorization/><installFrom mod="true" includeRoot="true">/Users/larour/issm-uci/trunk-jpl/packagers/macosx/ISSM.app</installFrom><installTo mod="true">/ISSM/</installTo><flags><followSymbolicLinks/></flags><packageStore type="internal"></packageStore><mod>installTo</mod><mod>relocatable</mod><mod>installFrom.path</mod><mod>identifier</mod><mod>parent</mod><mod>includeRoot</mod><mod>requireAuthorization</mod><mod>installTo.path</mod></config><contents><file-list>01issm-contents.xml</file-list><filter>/CVS$</filter><filter>/\.svn$</filter><filter>/\.cvsignore$</filter><filter>/\.cvspass$</filter><filter>/\.DS_Store$</filter></contents></pkgref>
+\ No newline at end of file
+Index: ../trunk-jpl/packagers/macosx/ISSM.pmdoc/03test-contents.xml
+===================================================================
+--- ../trunk-jpl/packagers/macosx/ISSM.pmdoc/03test-contents.xml	(revision 18395)
++++ ../trunk-jpl/packagers/macosx/ISSM.pmdoc/03test-contents.xml	(revision 18396)
+@@ -1 +0,0 @@
+-<pkg-contents spec="1.12"><f n="test" o="root" g="admin" p="16877" pt="/Users/larour/issm-uci/trunk-jpl/packagers/macosx/test" m="false" t="file"><f n=".svn" o="root" g="admin" p="16893"><f n="all-wcprops" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="entries" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="prop-base" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="props" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="tmp" o="root" g="admin" p="16893"><f n="prop-base" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="props" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="root" g="admin" p="16893"><mod>mode</mod></f><mod>mode</mod></f><mod>mode</mod></f><f n="Archives" o="root" g="admin" p="16893"><f n=".svn" o="root" g="admin" p="16893"><f n="all-wcprops" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="entries" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="prop-base" o="root" g="admin" p="16893"><f n="Archive101.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive102.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive103.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive104.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive105.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive106.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive107.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive108.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive109.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive110.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1101.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1102.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1103.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1104.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1105.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1106.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1107.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1108.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1109.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive111.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1110.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive112.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive113.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive114.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive115.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive116.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive117.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive118.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive119.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive120.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1201.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1202.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1203.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1204.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1205.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1206.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1207.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1208.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive121.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive122.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive123.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive124.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive125.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive126.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive127.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive128.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive129.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive130.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1301.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1302.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1303.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1304.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive131.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive132.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive133.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive134.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive135.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive136.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive137.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive139.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive140.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1401.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1402.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive141.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive142.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive143.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive144.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1501.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1502.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1601.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1602.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive201.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive202.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive203.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive204.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive205.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive206.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive207.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive208.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive209.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive210.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive211.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive212.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive213.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive214.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive215.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive216.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive217.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive218.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive219.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive220.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive221.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive222.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive223.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive224.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive225.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive226.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive227.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive228.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive229.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive230.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive232.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive233.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive234.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive235.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive236.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive237.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive238.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive239.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive240.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive241.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive242.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive243.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive244.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive245.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive246.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive247.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive248.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive249.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive250.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive251.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive252.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive253.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive254.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive255.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive256.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive257.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive258.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive259.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive260.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive261.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive262.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive263.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive264.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive265.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive266.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive267.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive268.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive301.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive302.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive303.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive304.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive305.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive306.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive307.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive308.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive309.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive310.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive311.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive312.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive313.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive314.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive315.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive316.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive317.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive318.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive319.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive320.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive321.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive322.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive323.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive324.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive325.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive326.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive327.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive328.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive329.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive330.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive331.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive332.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive333.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive334.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive335.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive336.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive337.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive338.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive339.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive340.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive341.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive342.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive343.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive344.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive345.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive346.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive347.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive348.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive349.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive350.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive351.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive352.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive353.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive354.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive401.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive402.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive403.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive404.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive405.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive406.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive407.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive408.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive409.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive410.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive411.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive412.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive413.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive414.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive415.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive416.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive417.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive418.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive419.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive420.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive421.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive422.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive423.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive424.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive425.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive426.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive427.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive428.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive429.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive430.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive431.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive432.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive434.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive435.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive437.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive438.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive439.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive440.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive441.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive442.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive443.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive444.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive445.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive446.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive447.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive448.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive449.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive450.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive451.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive452.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive453.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive454.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive501.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive502.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive503.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive504.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive505.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive506.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive507.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive508.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive509.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive510.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive511.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive512.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive513.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive514.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive515.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive516.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive517.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive518.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive519.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive520.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive521.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive522.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive523.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive524.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive525.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive526.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive527.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive529.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive530.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive531.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive532.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive601.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive602.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive603.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive604.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive605.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive606.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive607.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive608.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive609.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive610.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive611.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive612.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive613.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive614.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive615.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive616.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive617.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive618.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive619.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive620.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive621.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive622.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive623.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive624.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive625.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive626.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="props" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="root" g="admin" p="16893"><f n="Archive101.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive102.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive103.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive104.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive105.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive106.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive107.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive108.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive109.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive110.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1101.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1102.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1103.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1104.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1105.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1106.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1107.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1108.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1109.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive111.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1110.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive112.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive113.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive114.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive115.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive116.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive117.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive118.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive119.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive120.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1201.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1202.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1203.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1204.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1205.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1206.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1207.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1208.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive121.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive122.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive123.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive124.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive125.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive126.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive127.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive128.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive129.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive130.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1301.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1302.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1303.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1304.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive131.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive132.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive133.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive134.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive135.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive136.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive137.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive139.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive140.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1401.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1402.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive141.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive142.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive143.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive144.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1501.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1502.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1601.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1602.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive201.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive202.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive203.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive204.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive205.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive206.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive207.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive208.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive209.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive210.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive211.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive212.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive213.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive214.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive215.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive216.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive217.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive218.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive219.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive220.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive221.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive222.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive223.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive224.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive225.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive226.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive227.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive228.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive229.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive230.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive232.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive233.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive234.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive235.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive236.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive237.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive238.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive239.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive240.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive241.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive242.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive243.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive244.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive245.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive246.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive247.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive248.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive249.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive250.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive251.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive252.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive253.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive254.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive255.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive256.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive257.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive258.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive259.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive260.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive261.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive262.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive263.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive264.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive265.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive266.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive267.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive268.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive301.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive302.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive303.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive304.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive305.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive306.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive307.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive308.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive309.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive310.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive311.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive312.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive313.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive314.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive315.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive316.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive317.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive318.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive319.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive320.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive321.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive322.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive323.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive324.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive325.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive326.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive327.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive328.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive329.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive330.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive331.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive332.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive333.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive334.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive335.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive336.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive337.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive338.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive339.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive340.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive341.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive342.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive343.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive344.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive345.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive346.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive347.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive348.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive349.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive350.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive351.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive352.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive353.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive354.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive401.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive402.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive403.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive404.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive405.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive406.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive407.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive408.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive409.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive410.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive411.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive412.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive413.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive414.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive415.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive416.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive417.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive418.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive419.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive420.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive421.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive422.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive423.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive424.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive425.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive426.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive427.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive428.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive429.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive430.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive431.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive432.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive434.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive435.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive437.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive438.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive439.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive440.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive441.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive442.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive443.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive444.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive445.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive446.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive447.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive448.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive449.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive450.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive451.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive452.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive453.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive454.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive501.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive502.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive503.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive504.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive505.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive506.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive507.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive508.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive509.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive510.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive511.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive512.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive513.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive514.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive515.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive516.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive517.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive518.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive519.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive520.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive521.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive522.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive523.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive524.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive525.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive526.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive527.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive529.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive530.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive531.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive532.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive601.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive602.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive603.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive604.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive605.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive606.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive607.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive608.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive609.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive610.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive611.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive612.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive613.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive614.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive615.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive616.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive617.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive618.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive619.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive620.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive621.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive622.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive623.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive624.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive625.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive626.mat.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="tmp" o="root" g="admin" p="16893"><f n="prop-base" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="props" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="root" g="admin" p="16893"><mod>mode</mod></f><mod>mode</mod></f><mod>mode</mod></f><f n="Archive101.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive102.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive103.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive104.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive105.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive106.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive107.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive108.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive109.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive110.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1101.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1102.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1103.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1104.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1105.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1106.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1107.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1108.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1109.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive111.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1110.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive112.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive113.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive114.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive115.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive116.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive117.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive118.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive119.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive120.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1201.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1202.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1203.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1204.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1205.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1206.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1207.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1208.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive121.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive122.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive123.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive124.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive125.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive126.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive127.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive128.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive129.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive130.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1301.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1302.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1303.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1304.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive131.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive132.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive133.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive134.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive135.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive136.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive137.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive139.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive140.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1401.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1402.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive141.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive142.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive143.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive144.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1501.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1502.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1601.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive1602.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive201.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive202.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive203.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive204.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive205.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive206.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive207.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive208.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive209.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive210.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive211.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive212.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive213.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive214.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive215.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive216.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive217.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive218.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive219.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive220.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive221.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive222.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive223.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive224.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive225.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive226.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive227.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive228.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive229.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive230.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive232.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive233.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive234.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive235.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive236.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive237.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive238.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive239.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive240.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive241.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive242.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive243.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive244.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive245.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive246.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive247.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive248.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive249.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive250.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive251.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive252.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive253.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive254.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive255.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive256.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive257.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive258.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive259.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive260.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive261.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive262.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive263.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive264.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive265.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive266.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive267.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive268.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive301.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive302.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive303.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive304.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive305.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive306.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive307.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive308.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive309.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive310.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive311.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive312.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive313.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive314.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive315.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive316.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive317.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive318.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive319.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive320.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive321.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive322.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive323.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive324.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive325.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive326.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive327.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive328.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive329.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive330.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive331.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive332.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive333.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive334.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive335.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive336.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive337.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive338.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive339.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive340.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive341.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive342.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive343.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive344.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive345.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive346.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive347.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive348.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive349.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive350.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive351.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive352.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive353.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive354.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive401.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive402.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive403.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive404.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive405.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive406.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive407.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive408.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive409.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive410.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive411.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive412.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive413.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive414.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive415.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive416.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive417.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive418.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive419.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive420.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive421.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive422.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive423.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive424.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive425.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive426.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive427.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive428.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive429.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive430.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive431.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive432.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive434.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive435.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive437.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive438.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive439.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive440.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive441.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive442.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive443.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive444.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive445.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive446.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive447.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive448.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive449.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive450.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive451.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive452.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive453.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive454.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive501.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive502.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive503.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive504.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive505.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive506.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive507.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive508.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive509.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive510.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive511.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive512.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive513.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive514.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive515.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive516.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive517.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive518.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive519.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive520.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive521.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive522.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive523.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive524.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive525.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive526.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive527.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive529.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive530.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive531.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive532.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive601.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive602.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive603.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive604.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive605.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive606.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive607.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive608.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive609.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive610.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive611.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive612.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive613.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive614.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive615.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive616.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive617.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive618.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive619.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive620.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive621.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive622.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive623.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive624.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive625.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Archive626.mat" o="root" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="Data" o="root" g="admin" p="16893"><f n=".svn" o="root" g="admin" p="16893"><f n="all-wcprops" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="entries" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="prop-base" o="root" g="admin" p="16893"><f n="79North.data.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIPE.data.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Pig.data.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareSheetConstrained.data.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareSheetShelf.data.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareShelf.data.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareShelfConstrained.data.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="props" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="root" g="admin" p="16893"><f n="79North.data.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIPE.data.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Pig.data.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareSheetConstrained.data.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareSheetShelf.data.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareShelf.data.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareShelfConstrained.data.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="tmp" o="root" g="admin" p="16893"><f n="prop-base" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="props" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="root" g="admin" p="16893"><mod>mode</mod></f><mod>mode</mod></f><mod>mode</mod></f><f n="79North.data" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIPE.data" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Pig.data" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareSheetConstrained.data" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareSheetShelf.data" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareShelf.data" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareShelfConstrained.data" o="root" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="Exp" o="root" g="admin" p="16893"><f n=".svn" o="root" g="admin" p="16893"><f n="all-wcprops" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="entries" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="prop-base" o="root" g="admin" p="16893"><f n="ISMIP10000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIP100000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIP160000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIP20000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIP40000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIP5000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIP80000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIPE.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Square.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Square_10000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Square_160000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Square_20000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Square_40000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Square_5000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Square_80000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareFront.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareHalfRight.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareHole.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareISMIP.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareShelf.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="props" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="root" g="admin" p="16893"><f n="79North.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="79NorthShelf.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="CrossLineEISMINT.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIP10000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIP100000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIP160000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIP20000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIP40000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIP5000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIP80000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIPE.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="MassFlux1.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="MassFlux2.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="MassFlux3.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="MassFlux4.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="MassFlux5.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="MassFlux6.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Pig.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="PigIslands.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="PigShelves.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Rifts.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="RoundFrontEISMINT.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Square.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Square_10000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Square_160000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Square_20000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Square_40000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Square_5000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Square_80000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareEISMINT.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareEISMINT750000.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareFront.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareFrontEISMINT.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareHalfRight.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareHole.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareISMIP.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareRifts.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareRiftsLateral.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareShelf.exp.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="tmp" o="root" g="admin" p="16893"><f n="prop-base" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="props" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="root" g="admin" p="16893"><mod>mode</mod></f><mod>mode</mod></f><mod>mode</mod></f><f n="79North.exp" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="79NorthShelf.exp" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="CrossLineEISMINT.exp" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIP10000.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="ISMIP100000.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="ISMIP160000.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="ISMIP20000.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="ISMIP40000.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="ISMIP5000.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="ISMIP80000.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="ISMIPE.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="MassFlux1.exp" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="MassFlux2.exp" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="MassFlux3.exp" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="MassFlux4.exp" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="MassFlux5.exp" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="MassFlux6.exp" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Pig.exp" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="PigIslands.exp" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="PigShelves.exp" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Rifts.exp" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="RoundFrontEISMINT.exp" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Square.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="Square_10000.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="Square_160000.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="Square_20000.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="Square_40000.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="Square_5000.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="Square_80000.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="SquareEISMINT.exp" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareEISMINT750000.exp" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareFront.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="SquareFrontEISMINT.exp" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareHalfRight.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="SquareHole.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="SquareISMIP.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="SquareRifts.exp" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareRiftsLateral.exp" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareShelf.exp" o="root" g="admin" p="33277"><mod>mode</mod></f><mod>mode</mod></f><f n="NightlyRun" o="root" g="admin" p="16893"><f n=".svn" o="root" g="admin" p="16893"><f n="all-wcprops" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="dir-prop-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="entries" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="prop-base" o="root" g="admin" p="16893"><f n="IdToName.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="runme.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1205.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1206.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1207.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1208.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1301.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1302.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1303.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1304.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="props" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="root" g="admin" p="16893"><f n="dak.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="IdFromString.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="IdToName.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Makefile.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="README.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="runme.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test101.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test102.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test103.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test104.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test105.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test106.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test107.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test108.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test109.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test110.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1101.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1102.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1103.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1104.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1105.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1106.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1107.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1108.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1109.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test111.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1110.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test112.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test113.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test114.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test115.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test116.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test117.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test118.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test119.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test120.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1201.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1202.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1203.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1204.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1205.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1206.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1207.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1208.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test121.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test122.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test123.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test124.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test125.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test126.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test127.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test128.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test129.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test130.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1301.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1302.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1303.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1304.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test131.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test132.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test133.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test134.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test135.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test136.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test137.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test139.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test140.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1401.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1402.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test141.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test142.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test143.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test144.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1501.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1502.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1601.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1602.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test201.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test202.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test203.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test204.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test205.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test206.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test207.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test208.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test209.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test210.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test211.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test212.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test213.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test214.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test215.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test216.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test217.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test218.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test219.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test220.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test221.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test222.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test223.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test224.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test225.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test226.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test227.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test228.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test229.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test230.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test232.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test233.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test234.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test235.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test236.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test237.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test238.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test239.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test240.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test241.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test242.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test243.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test244.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test245.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test246.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test247.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test248.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test249.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test250.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test251.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test252.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test253.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test254.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test255.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test256.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test257.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test258.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test259.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test260.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test261.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test262.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test263.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test264.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test265.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test266.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test267.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test268.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test301.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test302.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test303.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test304.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test305.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test306.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test307.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test308.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test309.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test310.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test311.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test312.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test313.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test314.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test315.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test316.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test317.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test318.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test319.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test320.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test321.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test322.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test323.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test324.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test325.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test326.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test327.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test328.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test329.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test330.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test331.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test332.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test333.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test334.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test335.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test336.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test337.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test338.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test339.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test340.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test341.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test342.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test343.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test344.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test345.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test346.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test347.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test348.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test349.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test350.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test351.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test352.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test353.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test354.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test401.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test402.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test403.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test404.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test405.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test406.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test407.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test408.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test409.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test410.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test411.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test412.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test413.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test414.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test415.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test416.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test417.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test418.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test419.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test420.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test421.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test422.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test423.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test424.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test425.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test426.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test427.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test428.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test429.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test430.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test431.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test432.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test434.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test435.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test437.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test438.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test439.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test440.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test441.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test442.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test443.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test444.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test445.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test446.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test447.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test448.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test449.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test450.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test451.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test452.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test453.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test454.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test501.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test502.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test503.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test504.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test505.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test506.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test507.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test508.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test509.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test510.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test511.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test512.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test513.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test514.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test515.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test516.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test517.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test518.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test519.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test520.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test521.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test522.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test523.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test524.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test525.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test526.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test527.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test529.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test530.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test531.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test532.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test601.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test602.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test603.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test604.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test605.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test606.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test607.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test608.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test609.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test610.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test611.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test612.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test613.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test614.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test615.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test616.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test617.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test618.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test619.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test620.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test621.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test622.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test623.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test624.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test625.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test626.m.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="tmp" o="root" g="admin" p="16893"><f n="prop-base" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="props" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="root" g="admin" p="16893"><mod>mode</mod></f><mod>mode</mod></f><mod>mode</mod></f><f n="dak.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="IdFromString.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="IdToName.m" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="Makefile" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="README" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="runme.m" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="test101.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test102.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test103.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test104.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test105.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test106.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test107.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test108.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test109.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test110.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1101.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1102.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1103.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1104.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1105.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1106.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1107.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1108.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1109.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test111.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1110.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test112.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test113.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test114.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test115.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test116.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test117.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test118.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test119.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test120.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1201.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1202.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1203.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1204.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1205.m" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="test1206.m" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="test1207.m" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="test1208.m" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="test121.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test122.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test123.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test124.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test125.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test126.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test127.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test128.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test129.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test130.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1301.m" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="test1302.m" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="test1303.m" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="test1304.m" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="test131.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test132.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test133.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test134.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test135.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test136.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test137.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test139.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test140.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1401.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1402.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test141.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test142.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test143.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test144.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1501.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1502.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1601.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test1602.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test201.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test202.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test203.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test204.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test205.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test206.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test207.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test208.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test209.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test210.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test211.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test212.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test213.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test214.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test215.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test216.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test217.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test218.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test219.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test220.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test221.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test222.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test223.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test224.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test225.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test226.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test227.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test228.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test229.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test230.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test232.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test233.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test234.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test235.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test236.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test237.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test238.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test239.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test240.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test241.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test242.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test243.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test244.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test245.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test246.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test247.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test248.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test249.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test250.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test251.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test252.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test253.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test254.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test255.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test256.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test257.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test258.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test259.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test260.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test261.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test262.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test263.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test264.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test265.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test266.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test267.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test268.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test301.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test302.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test303.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test304.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test305.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test306.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test307.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test308.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test309.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test310.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test311.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test312.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test313.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test314.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test315.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test316.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test317.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test318.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test319.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test320.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test321.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test322.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test323.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test324.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test325.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test326.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test327.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test328.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test329.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test330.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test331.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test332.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test333.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test334.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test335.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test336.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test337.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test338.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test339.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test340.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test341.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test342.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test343.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test344.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test345.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test346.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test347.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test348.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test349.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test350.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test351.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test352.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test353.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test354.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test401.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test402.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test403.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test404.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test405.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test406.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test407.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test408.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test409.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test410.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test411.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test412.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test413.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test414.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test415.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test416.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test417.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test418.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test419.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test420.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test421.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test422.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test423.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test424.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test425.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test426.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test427.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test428.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test429.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test430.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test431.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test432.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test434.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test435.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test437.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test438.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test439.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test440.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test441.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test442.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test443.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test444.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test445.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test446.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test447.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test448.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test449.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test450.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test451.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test452.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test453.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test454.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test501.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test502.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test503.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test504.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test505.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test506.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test507.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test508.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test509.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test510.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test511.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test512.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test513.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test514.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test515.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test516.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test517.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test518.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test519.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test520.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test521.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test522.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test523.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test524.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test525.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test526.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test527.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test529.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test530.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test531.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test532.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test601.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test602.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test603.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test604.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test605.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test606.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test607.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test608.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test609.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test610.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test611.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test612.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test613.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test614.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test615.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test616.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test617.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test618.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test619.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test620.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test621.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test622.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test623.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test624.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test625.m" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="test626.m" o="root" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="Par" o="root" g="admin" p="16893"><f n=".svn" o="root" g="admin" p="16893"><f n="all-wcprops" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="entries" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="prop-base" o="root" g="admin" p="16893"><f n="79North.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIPA.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIPB.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIPC.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIPD.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIPE.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIPF.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Pig.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="RoundSheetEISMINT.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="RoundSheetShelf.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="RoundSheetStaticEISMINT.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareSheetConstrained.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareSheetShelf.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareShelf.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareShelfConstrained.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareThermal.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="props" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="root" g="admin" p="16893"><f n="79North.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIPA.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIPB.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIPC.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIPD.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIPE.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="ISMIPF.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="Pig.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="RoundSheetEISMINT.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="RoundSheetShelf.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="RoundSheetStaticEISMINT.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareEISMINT.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareSheetConstrained.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareSheetShelf.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareShelf.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareShelfConstrained.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareThermal.par.svn-base" o="root" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="tmp" o="root" g="admin" p="16893"><f n="prop-base" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="props" o="root" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="root" g="admin" p="16893"><mod>mode</mod></f><mod>mode</mod></f><mod>mode</mod></f><f n="79North.par" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="ISMIPA.par" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="ISMIPB.par" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="ISMIPC.par" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="ISMIPD.par" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="ISMIPE.par" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="ISMIPF.par" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="Pig.par" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="RoundSheetEISMINT.par" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="RoundSheetShelf.par" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="RoundSheetStaticEISMINT.par" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="SquareEISMINT.par" o="root" g="admin" p="33204"><mod>mode</mod></f><f n="SquareSheetConstrained.par" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="SquareSheetShelf.par" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="SquareShelf.par" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="SquareShelfConstrained.par" o="root" g="admin" p="33277"><mod>mode</mod></f><f n="SquareThermal.par" o="root" g="admin" p="33277"><mod>mode</mod></f><mod>mode</mod></f><mod>group</mod><mod>owner</mod></f></pkg-contents>
+\ No newline at end of file
+Index: ../trunk-jpl/packagers/macosx/ISSM.pmdoc/03test.xml
+===================================================================
+--- ../trunk-jpl/packagers/macosx/ISSM.pmdoc/03test.xml	(revision 18395)
++++ ../trunk-jpl/packagers/macosx/ISSM.pmdoc/03test.xml	(revision 18396)
+@@ -1 +0,0 @@
+-<pkgref spec="1.12" uuid="B3D6E8F8-4650-477C-8E99-0122145B211E"><config><identifier>issm.test.pkg</identifier><version>1.0</version><description></description><post-install type="none"/><requireAuthorization/><installFrom mod="true">/Users/larour/issm-uci/trunk-jpl/packagers/macosx/test</installFrom><installTo mod="true">/ISSM/test</installTo><flags><followSymbolicLinks/></flags><packageStore type="internal"></packageStore><mod>installTo</mod><mod>relocatable</mod><mod>installFrom.path</mod><mod>scripts.postinstall.path</mod><mod>identifier</mod><mod>parent</mod><mod>includeRoot</mod><mod>installTo.path</mod></config><contents><file-list>03test-contents.xml</file-list><filter>/CVS$</filter><filter>/\.svn$</filter><filter>/\.cvsignore$</filter><filter>/\.cvspass$</filter><filter>/\.DS_Store$</filter></contents></pkgref>
+\ No newline at end of file
+Index: ../trunk-jpl/packagers/macosx/ISSM.pmdoc/02bin-contents.xml
+===================================================================
+--- ../trunk-jpl/packagers/macosx/ISSM.pmdoc/02bin-contents.xml	(revision 18395)
++++ ../trunk-jpl/packagers/macosx/ISSM.pmdoc/02bin-contents.xml	(revision 18396)
+@@ -1 +0,0 @@
+-<pkg-contents spec="1.12"><f n="bin" o="root" g="admin" p="16877" pt="/Users/larour/issm-uci/trunk-jpl/packagers/macosx/bin" m="false" t="file"><f n="startup.m" o="root" g="admin" p="33277"><mod>mode</mod></f><mod>group</mod><mod>owner</mod></f></pkg-contents>
+\ No newline at end of file
+Index: ../trunk-jpl/packagers/macosx/ISSM.pmdoc/01issm-contents.xml
+===================================================================
+--- ../trunk-jpl/packagers/macosx/ISSM.pmdoc/01issm-contents.xml	(revision 18395)
++++ ../trunk-jpl/packagers/macosx/ISSM.pmdoc/01issm-contents.xml	(revision 18396)
+@@ -1 +0,0 @@
+-<pkg-contents spec="1.12"><f n="ISSM.app" o="larour" g="admin" p="16893" pt="/Users/larour/issm-uci/trunk-jpl/packagers/macosx/ISSM.app" m="true" t="file"><f n=".svn" o="larour" g="admin" p="16893"><f n="all-wcprops" o="larour" g="admin" p="33204"><mod>mode</mod></f><f n="entries" o="larour" g="admin" p="33204"><mod>mode</mod></f><f n="prop-base" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="props" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="tmp" o="larour" g="admin" p="16893"><f n="prop-base" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="props" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="larour" g="admin" p="16893"><mod>mode</mod></f><mod>mode</mod></f><mod>mode</mod></f><f n="Contents" o="larour" g="admin" p="16893"><f n=".svn" o="larour" g="admin" p="16893"><f n="all-wcprops" o="larour" g="admin" p="33204"><mod>mode</mod></f><f n="entries" o="larour" g="admin" p="33204"><mod>mode</mod></f><f n="prop-base" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="props" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="larour" g="admin" p="16893"><f n="Info.plist.svn-base" o="larour" g="admin" p="33204"><mod>mode</mod></f><f n="PkgInfo.svn-base" o="larour" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="tmp" o="larour" g="admin" p="16893"><f n="prop-base" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="props" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="larour" g="admin" p="16893"><mod>mode</mod></f><mod>mode</mod></f><mod>mode</mod></f><f n="Info.plist" o="larour" g="admin" p="33204"><mod>mode</mod></f><f n="MacOS" o="larour" g="admin" p="16893"><f n=".svn" o="larour" g="admin" p="16893"><f n="all-wcprops" o="larour" g="admin" p="33204"><mod>mode</mod></f><f n="entries" o="larour" g="admin" p="33204"><mod>mode</mod></f><f n="prop-base" o="larour" g="admin" p="16893"><f n="applet.svn-base" o="larour" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="props" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="larour" g="admin" p="16893"><f n="applet.svn-base" o="larour" g="admin" p="33277"><mod>mode</mod></f><mod>mode</mod></f><f n="tmp" o="larour" g="admin" p="16893"><f n="prop-base" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="props" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="larour" g="admin" p="16893"><mod>mode</mod></f><mod>mode</mod></f><mod>mode</mod></f><f n="applet" o="larour" g="admin" p="33277"><mod>mode</mod></f><mod>mode</mod></f><f n="PkgInfo" o="larour" g="admin" p="33204"><mod>mode</mod></f><f n="Resources" o="larour" g="admin" p="16893"><f n=".svn" o="larour" g="admin" p="16893"><f n="all-wcprops" o="larour" g="admin" p="33204"><mod>mode</mod></f><f n="entries" o="larour" g="admin" p="33204"><mod>mode</mod></f><f n="prop-base" o="larour" g="admin" p="16893"><f n="applet.icns.svn-base" o="larour" g="admin" p="33204"><mod>mode</mod></f><f n="applet.rsrc.svn-base" o="larour" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="props" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="larour" g="admin" p="16893"><f n="applet.icns.svn-base" o="larour" g="admin" p="33204"><mod>mode</mod></f><f n="applet.rsrc.svn-base" o="larour" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="tmp" o="larour" g="admin" p="16893"><f n="prop-base" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="props" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="larour" g="admin" p="16893"><mod>mode</mod></f><mod>mode</mod></f><mod>mode</mod></f><f n="applet.icns" o="larour" g="admin" p="33204"><mod>mode</mod></f><f n="applet.rsrc" o="larour" g="admin" p="33204"><mod>mode</mod></f><f n="description.rtfd" o="larour" g="admin" p="16893"><f n=".svn" o="larour" g="admin" p="16893"><f n="all-wcprops" o="larour" g="admin" p="33204"><mod>mode</mod></f><f n="entries" o="larour" g="admin" p="33204"><mod>mode</mod></f><f n="prop-base" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="props" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="larour" g="admin" p="16893"><f n="TXT.rtf.svn-base" o="larour" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="tmp" o="larour" g="admin" p="16893"><f n="prop-base" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="props" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="larour" g="admin" p="16893"><mod>mode</mod></f><mod>mode</mod></f><mod>mode</mod></f><f n="TXT.rtf" o="larour" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="Scripts" o="larour" g="admin" p="16893"><f n=".svn" o="larour" g="admin" p="16893"><f n="all-wcprops" o="larour" g="admin" p="33204"><mod>mode</mod></f><f n="entries" o="larour" g="admin" p="33204"><mod>mode</mod></f><f n="prop-base" o="larour" g="admin" p="16893"><f n="main.scpt.svn-base" o="larour" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="props" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="larour" g="admin" p="16893"><f n="main.scpt.svn-base" o="larour" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><f n="tmp" o="larour" g="admin" p="16893"><f n="prop-base" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="props" o="larour" g="admin" p="16893"><mod>mode</mod></f><f n="text-base" o="larour" g="admin" p="16893"><mod>mode</mod></f><mod>mode</mod></f><mod>mode</mod></f><f n="main.scpt" o="larour" g="admin" p="33204"><mod>mode</mod></f><mod>mode</mod></f><mod>mode</mod></f><mod>mode</mod></f><mod>group</mod><mod>mode</mod></f></pkg-contents>
+\ No newline at end of file
+Index: ../trunk-jpl/packagers/macosx/ISSM.pmdoc/index.xml
+===================================================================
+--- ../trunk-jpl/packagers/macosx/ISSM.pmdoc/index.xml	(revision 18395)
++++ ../trunk-jpl/packagers/macosx/ISSM.pmdoc/index.xml	(revision 18396)
+@@ -1 +0,0 @@
+-<pkmkdoc spec="1.12"><properties><title>ISSM</title><build>/Users/larour/issm-uci/trunk-jpl/packagers/macosx/ISSM.pkg</build><organization>http://issm.jpl.nasa.gov</organization><userSees ui="both"/><min-target os="3"/><domain user="true"/></properties><distribution><versions min-spec="1.000000"/><scripts></scripts></distribution><description>Ice Sheet System Model</description><contents><choice title="ISSM" id="choice3" starts_selected="true" starts_enabled="true" starts_hidden="false"><pkgref id="ISSM.pkg"/></choice><choice title="bin" id="choice6" starts_selected="true" starts_enabled="true" starts_hidden="false"><pkgref id="issm.bin.pkg"/></choice><choice title="test" id="choice16" starts_selected="true" starts_enabled="true" starts_hidden="false"><pkgref id="issm.test.pkg"/></choice></contents><resources bg-scale="none" bg-align="topleft"><locale lang="en"/></resources><flags/><item type="file">01issm.xml</item><item type="file">02bin.xml</item><item type="file">03test.xml</item><mod>properties.title</mod><mod>properties.userDomain</mod><mod>description</mod><mod>properties.anywhereDomain</mod></pkmkdoc>
+\ No newline at end of file
+Index: ../trunk-jpl/packagers/macosx/matlabissm
+===================================================================
+--- ../trunk-jpl/packagers/macosx/matlabissm	(revision 18395)
++++ ../trunk-jpl/packagers/macosx/matlabissm	(revision 18396)
+@@ -1,4 +0,0 @@
+-#/bin/bash
+-user_home=`echo ~`;
+-export  ISSM_TIER="$user_home/ISSM"
+-matlab -r "name=getenv('USER'); issm=['/Users/' name '/ISSM']; cd(issm); cd bin; startup; cd ../;"
+Index: ../trunk-jpl/packagers/macosx/README
+===================================================================
+--- ../trunk-jpl/packagers/macosx/README	(revision 18395)
++++ ../trunk-jpl/packagers/macosx/README	(revision 18396)
+@@ -1,16 +0,0 @@
+-Files needsed to package ISSM into a MacOSX delivery: 
+-
+-ISSM.appscript : applescript file used by Script Editor to build ISSM.app. Just edit using applescript, and save 
+-as application. 
+-
+-ISSM.app: result of above. 
+-
+-ISSM.pmdoc: Package Maker project, which outputs ISSM.pkg
+-
+-ISSM.pkg: result of above. 
+-
+-Package Maker can be command line driven, using the pmdoc project directly. This is what package.sh does.
+-
+-issm.icns: icon file for ISSM install.
+-matlabissm: used by the Package Maker to launch matlab with ISSM path sourced. 
+-startup.m: needed to be sourced by Matlab to point towards mac executables.
+Index: ../trunk-jpl/packagers/macosx/startup.m
+===================================================================
+--- ../trunk-jpl/packagers/macosx/startup.m	(revision 18395)
++++ ../trunk-jpl/packagers/macosx/startup.m	(revision 18396)
+@@ -1,45 +0,0 @@
+-%STARTUP - Matlab startup script
+-%
+-%   startup.m is a script run by matlab at the beginning of a session, just
+-%   before handing over the prompt to the user. This delivery startup.m script
+-%   has been customized here for the ISSM code. This startup script should be
+-%   run by users before trying to use ISSM. The best way to do that is to put
+-%   the startup file in the location where Matlab starts and established its
+-%   root directory.
+-
+-% clear the last warning to focus on the warnings of the ISSM path
+-lastwarn(''); 
+-
+-%Recover ISSM_TIER , or if on a Windows machine, ISSM_TIER_WIN
+-ISSM_TIER=getenv('ISSM_TIER');
+-
+-if (isempty(ISSM_TIER)),
+-	error('issmdir error message: ''ISSM_TIER'' environment variable is empty! You should define ISSM_TIER in your .cshrc or .bashrc!');
+-end
+-
+-%Now add all issm code paths necessary to run issm smoothly. 
+-%We capture the error output, so that we can warn the user to update 
+-%the variable ISSM_TIER in this file, in case it is not correctly setup. 
+-
+-%ISSM path
+-addpath(pwd); %add current path first
+-
+-%Check on any warning messages that might indicate that the paths were not correct. 
+-if ~isempty(lastwarn),
+-	fprintf('\n  Error trying to setup ''ISSM'' code paths. Try and update the ISSM_TIER variable in your .cshrc or .bashrc!\n');
+-	fprintf('  ''ISSM'' will not  work at all until this is resolved\n\n');
+-else
+-	fprintf('\n  To get started with ISSM, type issmdoc at the command prompt.\n\n');
+-end
+-
+-%disable matlab bell!
+-beep off;
+-
+-% no warning if we try to plot while in nojvm (will not be supported in future releases)
+-warning off MATLAB:HandleGraphics:noJVM
+-
+-%at the end, get to tests directory if ISSM_TESTS exists: 
+-ISSM_TESTS=getenv('ISSM_TESTS');
+-if ~isempty(ISSM_TESTS),
+-	cd(ISSM_TESTS);
+-end
Index: /issm/oecreview/Archive/18296-19100/ISSM-18396-18397.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18396-18397.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18396-18397.diff	(revision 19102)
@@ -0,0 +1,32 @@
+Index: ../trunk-jpl/test/NightlyRun/runme.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/runme.m	(revision 18396)
++++ ../trunk-jpl/test/NightlyRun/runme.m	(revision 18397)
+@@ -34,9 +34,6 @@
+ %      runme('exclude',101);
+ %      runme('id',102,'procedure','update');
+ 
+-%Get ISSM_DIR variable
+-ISSM_DIR=issmdir();
+-
+ %Check inputs
+ % {{{
+ if nargout>1
+@@ -237,7 +234,7 @@
+ 					message=getReport(me2);
+ 					fprintf('%s',message);
+ 					if strcmpi(output,'nightly')
+-						fid=fopen([ISSM_DIR '/nightlylog/matlaberror.log'], 'at');
++						fid=fopen([issmdir() '/nightlylog/matlaberror.log'], 'at');
+ 						fprintf(fid,'%s',message);
+ 						fprintf(fid,'\n------------------------------------------------------------------\n');
+ 						fclose(fid);
+@@ -260,7 +257,7 @@
+ 		message=getReport(me);
+ 		fprintf('%s',message);
+ 		if strcmpi(output,'nightly')
+-			fid=fopen([ISSM_DIR '/nightlylog/matlaberror.log'], 'at');
++			fid=fopen([issmdir() '/nightlylog/matlaberror.log'], 'at');
+ 			fprintf(fid,'%s',message);
+ 			fprintf(fid,'\n------------------------------------------------------------------\n');
+ 			fclose(fid);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18397-18398.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18397-18398.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18397-18398.diff	(revision 19102)
@@ -0,0 +1,270 @@
+Index: ../trunk-jpl/jenkins/imac-012301-gil
+===================================================================
+--- ../trunk-jpl/jenkins/imac-012301-gil	(revision 18397)
++++ ../trunk-jpl/jenkins/imac-012301-gil	(revision 18398)
+@@ -12,17 +12,14 @@
+ ISSM_CONFIG='--prefix=$ISSM_DIR \
+ 	--with-matlab-dir=$MATLAB_DIR \
+ 	--with-triangle-dir=$ISSM_DIR/externalpackages/triangle/install \
+-	--with-metis-dir=$ISSM_DIR/externalpackages/metis/install \
+ 	--with-mpi-include=$ISSM_DIR/externalpackages/mpich/install/include  \
+-	--with-mpi-libflags=" $ISSM_DIR/externalpackages/mpich/install/lib/libpmpich.a $ISSM_DIR/externalpackages/mpich/install/lib/libmpich.a $ISSM_DIR/externalpackages/mpich/install/lib/libmpl.a " \
+-	--with-fortran-lib="/usr/local/gfortran/lib/libgfortran.a" \
+-	--with-math-lib="/usr/lib/libm.dylib" \
+-	--with-graphics-lib="/usr/X11/lib/libX11.dylib" \
+-	--with-numthreads=8 \
++	--with-mpi-libflags="-L$ISSM_DIR/externalpackages/mpich/install/lib -lpmpich -lmpich -lmpl" \
+ 	--with-petsc-dir=$ISSM_DIR/externalpackages/petsc/install  \
+-	--with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-scalapack-dir=$ISSM_DIR/externalpackages/petsc/install/ \
+ 	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-metis-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-numthreads=8 \
++	--enable-debugging \
+ 	--enable-development'
+ 
+ #MATLAB path
+@@ -59,7 +56,6 @@
+ 						triangle  install-macosx64.sh 
+ 						shell2junit  install.sh "
+ 
+-
+ #---------------------#
+ # 4: ISSM Compilation #
+ #---------------------#
+@@ -69,22 +65,8 @@
+ # - "no"  do not compile ISSM
+ ISSM_COMPILATION="yes"
+ 
+-#----------------------#
+-# 5: Mail notification #
+-#----------------------#
+-
+-#Mail delivery. If SKIPMAIL="no", the html nightly run report will be
+-#sent to the adresses present in $ISSM_DIR/cron/mailinglist.
+-SKIPMAIL="no"
+-
+-#Sender email address
+-EMAIL_ADRESS="eric.larour@jpl.nasa.gov"
+-
+-#Mailing list
+-MAILINGLIST="eric.larour@jpl.nasa.gov"
+-
+ #------------------------#
+-# 6: Nightly run options #
++# 5: Nightly run options #
+ #------------------------#
+ 
+ #number of cpus used in ISSM installation and compilation (one is usually
+Index: ../trunk-jpl/jenkins/jenkins.sh
+===================================================================
+--- ../trunk-jpl/jenkins/jenkins.sh	(revision 18397)
++++ ../trunk-jpl/jenkins/jenkins.sh	(revision 18398)
+@@ -2,51 +2,6 @@
+ #This bash script calls the nightlyrun.m matlab file to run our nightly test decks. 
+ #It then processes the results and sends an email to the Ice developpers.
+ 
+-#some functions
+-function timer() #{{{
+-{
+-	if [[ $# -eq 0 ]]; then
+-		echo $(date '+%s')
+-	else
+-		local  stime=$1
+-		etime=$(date '+%s')
+-
+-		if [[ -z "$stime" ]]; then stime=$etime; fi
+-
+-		dt=$((etime - stime))
+-		ds=$((dt % 60))
+-		dm=$(((dt / 60) % 60))
+-		dh=$((dt / 3600))
+-		printf '%d:%02d:%02d' $dh $dm $ds
+-	fi
+-} #}}}
+-function todaydate() #{{{
+-{
+-	suffix=`date | awk '{printf("%s-%s-%s  %s",$2,$3,$6,$4);}'`			 
+-	echo $suffix;			 
+-} #}}}
+-function host_name() #{{{
+-{
+-	#return host name depending on the OS
+-	if [ "$1" = "win7" ] 
+-	then
+-		HOST_NAME=`hostname | sed 's/-//g'`;
+-	else
+-		HOST_NAME=`hostname -s | sed 's/-//g'`;
+-	fi
+-	echo $HOST_NAME;
+-} #}}}
+-function pause() #{{{
+-{
+-pid=`ps aux -W | grep $1 | awk '{printf("%s\n",$1);}'`
+-
+-while [ -n "$pid" ]
+-do
+-	pid=`ps aux -W | grep $1 | awk '{printf("%s\n",$1);}'`
+-done
+-}
+-#}}}
+-
+ #Get configuration
+ #Source config file{{{
+ if [ $# -ne 1 ];
+@@ -62,17 +17,11 @@
+ fi 
+ source $1;
+ #}}}
+-#Initialize variables {{{
+-TODAY=$(todaydate);
++#Get Operating system (OS) name{{{
+ OS=$(uname -s)
+ if [[ $OS == "CYGWIN_NT-6.1-WOW64" ]]; then 
+ 	OS="win7";
+ fi
+-HOST_NAME=$(host_name $OS);
+-START_TIME=$(timer);
+-ISSM_RELEASE=$(basename $(echo $REPOSITORY));
+-USER=$(whoami);
+-INIT_PATH=$(pwd);
+ #}}}
+ 
+ #Installation ISSM
+@@ -211,37 +160,14 @@
+ echo "Cleaning up execution directory"
+ rm -rf $ISSM_DIR/execution/*
+ 
+-#Prepare info.log
+-#{{{
+-rm -rf $ISSM_DIR/nightlylog
+-mkdir  $ISSM_DIR/nightlylog
+-INSTALL_TIME=$(timer)
+-ELAPSED=$(timer $START_TIME)
+-VERSION=$(svnversion $ISSM_DIR)
+-cat << END > $ISSM_DIR/nightlylog/info.log
+-name:      $(echo $NAME)
+-today:     $(echo $TODAY)
+-user:      $(echo $USER)
+-host:      $(echo $HOST_NAME)
+-OS:        $(echo $OS)
+-release:   $(echo $ISSM_RELEASE)
+-init_path: $(echo $INIT_PATH)
+-is_matlab: $(echo $MATLAB_TEST)
+-is_python: $(echo $PYTHON_TEST)
+-elapsed_install: $(echo $ELAPSED)
+-version: $(echo $VERSION)
+-END
+-#}}}
+-
+ #matlab tests
+ if [ $MATLAB_TEST -eq 1 ]; then
+ #Launch all tests on different cpus {{{
+-MATLAB_START_TIME=$(timer);
+ for (( i=1;i<=$NUMCPUS_RUN;i++ ))
+ do
+ 	#Launch matlab and the nightly run script
+ 	cat > $ISSM_DIR/nightlylog/matlab_run$i.m << EOF
+-	warning off %necessary to avoid a info.log of several Go for parallel runs
++	warning off %necessary to avoid a log of several Go for parallel runs
+ 	try,
+ 	$(if [ "$MATLAB_NROPTIONS" = ""  ]
+ 	then
+@@ -268,7 +194,12 @@
+ 
+ #wait until matlab closes
+ if [ "$OS" = "win7" ]; then
+-	pause MATLAB
++	pid=$(ps aux -W | grep MATLAB | awk '{printf("%s\n",MATLAB);}')
++
++	while [ -n "$pid" ]
++	do
++		pid=$(ps aux -W | grep MATLAB | awk '{printf("%s\n",MATLAB);}')
++	done
+ else
+ 	wait
+ fi
+@@ -283,22 +214,8 @@
+ 
+ #filter out windows characters: 
+ cat matlab_log.log | tr -cd '\11\12\40-\176' > matlab_log.log2 && mv matlab_log.log2 matlab_log.log
+-
+ #}}}
+-#Complete info.log {{{
+-if [ $(cat matlab_log.log | grep "MATLABEXITEDCORRECTLY" | wc -l) -eq $NUMCPUS_RUN ]
+-then
+-	MATLABCRASH=0
+-else
+-	MATLABCRASH=1
+ fi
+-ELAPSED=$(timer $MATLAB_START_TIME)
+-cat << END >>  $ISSM_DIR/nightlylog/info.log
+-elapsed_matlab: $(echo $ELAPSED)
+-matlab_crash:   $(echo $MATLABCRASH)
+-END
+-#}}}
+-fi
+ 
+ #python tests
+ if [ $PYTHON_TEST -eq 1 ]; then
+@@ -311,13 +228,6 @@
+ 	./runme.py --output=nightly --rank=$i --numprocs=$NUMCPUS_RUN $PYTHON_NROPTIONS 2>&1 > $ISSM_DIR/nightlylog/python_log$i.log &
+ done
+ 
+-#wait until python closes
+-if [ "$OS" = "win7" ]; then
+-	pause MATLAB
+-else
+-	wait
+-fi
+-
+ #concatenate reports
+ cd $ISSM_DIR/nightlylog/
+ rm python_log.log
+@@ -326,29 +236,8 @@
+ 	cat python_log$i.log >> python_log.log
+ done
+ #}}}
+-#Complete info.log {{{
+-if [ $(cat python_log.log | grep "PYTHONEXITEDCORRECTLY" | wc -l) -eq $NUMCPUS_RUN ]
+-then
+-	PYTHONCRASH=0
+-else
+-	PYTHONCRASH=1
+ fi
+-ELAPSED=$(timer $PYTHON_START_TIME)
+-cat << END >>  $ISSM_DIR/nightlylog/info.log
+-elapsed_python: $(echo $ELAPSED)
+-python_crash:   $(echo $PYTHONCRASH)
+-END
+-#}}}
+-fi
+ 
+-#complete info.log
+-#{{{
+-ELAPSED=$(timer $START_TIME)
+-cat << END >>  $ISSM_DIR/nightlylog/info.log
+-elapsed_total:  $(echo $ELAPSED)
+-END
+-#}}}
+-
+ #process logs to be junit compatible
+ #{{{
+ cd $ISSM_DIR/nightlylog/
+Index: ../trunk-jpl/configure.ac
+===================================================================
+--- ../trunk-jpl/configure.ac	(revision 18397)
++++ ../trunk-jpl/configure.ac	(revision 18398)
+@@ -13,10 +13,10 @@
+ AC_PROG_CXX([icpc cccl cl icl g++])
+ AC_PROG_F77([ifort g77 gfortran])
+ 
+-AC_F77_LIBRARY_LDFLAGS
++#AC_F77_LIBRARY_LDFLAGS
+ 
+ #Libraries and linking
+-AC_PATH_XTRA      #figure out X library and include paths
++#AC_PATH_XTRA      #figure out X library and include paths
+ 
+ #AUTOMAKE
+ #Initialize automake and declare foreign so that we don't need a ChangeLog, INSTALL, etc
Index: /issm/oecreview/Archive/18296-19100/ISSM-18398-18399.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18398-18399.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18398-18399.diff	(revision 19102)
@@ -0,0 +1,292 @@
+Index: ../trunk-jpl/jenkins/linux64_larsen
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_larsen	(revision 18398)
++++ ../trunk-jpl/jenkins/linux64_larsen	(revision 18399)
+@@ -1,105 +0,0 @@
+-#
+-########### Configuration file for Eric Larour's Jenkins run on Murdo ############
+-
+-#-------------------------------#
+-# 1: ISSM general configuration #
+-#-------------------------------#
+-
+-#Nightly run name
+-NAME="ISSM matlab tests on Linux64 (murdo)"
+-
+-#ISSM CONFIGURATION 
+-ISSM_CONFIG='--prefix=$ISSM_DIR\
+-	--with-matlab-dir=$MATLAB_DIR \
+-	--with-triangle-dir=$ISSM_DIR/externalpackages/triangle/install \
+-	--with-metis-dir=$ISSM_DIR/externalpackages/metis/install \
+-	--with-mpi-include=$ISSM_DIR/externalpackages/mpich/install/include  \
+-	--with-mpi-libflags="-L$ISSM_DIR/externalpackages/mpich/install/lib/ -lmpich" \
+-	--with-petsc-dir=$ISSM_DIR/externalpackages/petsc/install \
+-	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install/ \
+-	--with-dakota-dir=$ISSM_DIR/externalpackages/dakota/install \
+-	--with-boost-dir=$ISSM_DIR/externalpackages/boost/install/ \
+-	--with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install \
+-	--with-chaco-dir="$ISSM_DIR/externalpackages/chaco/install" \
+-	--with-graphics-lib="/usr/lib/x86_64-linux-gnu/libX11.so" \
+-	--with-numthreads=18 \
+-	--enable-development \
+-	--enable-debugging '
+-
+-#MATLAB path
+-MATLAB_PATH="/usr/local/matlab80/"
+-
+-#PYTHON and MATLAB testing
+-MATLAB_TEST=1
+-PYTHON_TEST=0
+-
+-#execution path used for parallel runs
+-EXECUTION_PATH=$ISSM_DIR/execution
+-
+-#repo:
+-REPOSITORY="https://issm.ess.uci.edu/svn/issm/issm/trunk-jpl"
+-
+-#-----------------------------------#
+-# 3: External packages installation #
+-#-----------------------------------#
+-
+-#ISSM_EXTERNALPACKAGES can have 3 values:
+-# - "install" install all external packages listed below
+-# - "copy"    copy existing directories (EXTERNALPACKAGESDIR)
+-# - "none"    leave external packages as is
+-#             ->skip to section 4
+-ISSM_EXTERNALPACKAGES="install"
+-EXTERNALPACKAGESDIR=$ISSM_DIR/externalpackages
+-
+-#List of external pakages to be installed and their installation scripts
+-EXTERNALPACKAGES="autotools install.sh                
+-						matlab    install.sh                
+-						mpich     install-3.0-linux64.sh    
+-						cmake     install.sh                
+-						petsc     install-3.5-linux64.sh    
+-						triangle  install-linux64.sh        
+-						boost     install.sh                
+-						dakota    install-5.3.1-linux64.sh  
+-						chaco     install.sh 
+-						shell2junit install.sh"
+-
+-#---------------------#
+-# 4: ISSM Compilation #
+-#---------------------#
+-
+-#ISSM_COMPILATION can have 2 values:
+-# - "yes" compile ISSM
+-# - "no"  do not compile ISSM
+-ISSM_COMPILATION="yes"
+-
+-#----------------------#
+-# 5: Mail notification #
+-#----------------------#
+-
+-#Mail delivery. If SKIPMAIL="no", the html nightly run report will be
+-#sent to the adresses present in $ISSM_DIR/cron/mailinglist.
+-SKIPMAIL="no"
+-
+-#Sender email address
+-EMAIL_ADRESS="eric.larour@jpl.nasa.gov"
+-
+-#Mailing list
+-MAILINGLIST="eric.larour@jpl.nasa.gov"
+-
+-#------------------------#
+-# 6: Nightly run options #
+-#------------------------#
+-
+-#number of cpus used in ISSM installation and compilation (one is usually
+-#safer as some packages are very sensitive to parallel compilation)
+-NUMCPUS_INSTALL=8
+-
+-#number of cpus used in the nightly runs.
+-NUMCPUS_RUN=8
+-
+-#Nightly run options. The matlab routine runme.m will be called
+-#as follows: runme($MATLAB_NROPTIONS). The options must be understandable
+-#by Matlab and runme.m
+-#ex: "'id',[101 102 103]"
+-MATLAB_NROPTIONS=""
+-PYTHON_NROPTIONS=""
+Index: ../trunk-jpl/jenkins/linux64_murdo
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_murdo	(revision 18398)
++++ ../trunk-jpl/jenkins/linux64_murdo	(revision 18399)
+@@ -12,18 +12,18 @@
+ ISSM_CONFIG='--prefix=$ISSM_DIR\
+ 	--with-matlab-dir=$MATLAB_DIR \
+ 	--with-triangle-dir=$ISSM_DIR/externalpackages/triangle/install \
+-	--with-metis-dir=$ISSM_DIR/externalpackages/metis/install \
+ 	--with-mpi-include=$ISSM_DIR/externalpackages/mpich/install/include  \
+ 	--with-mpi-libflags="-L$ISSM_DIR/externalpackages/mpich/install/lib/ -lmpich" \
+ 	--with-petsc-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-metis-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install/ \
++	--with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-python-dir=$ISSM_DIR/externalpackages/python/install\
+ 	--with-python-numpy-dir=$ISSM_DIR/externalpackages/python/install/lib/python2.7/site-packages/numpy/core/include/numpy\
+-	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install/ \
+-	--with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-chaco-dir="$ISSM_DIR/externalpackages/chaco/install" \
+-	--with-graphics-lib="/usr/lib/x86_64-linux-gnu/libX11.so" \
+ 	--with-dakota-dir=$ISSM_DIR/externalpackages/dakota/install \
+ 	--with-boost-dir=$ISSM_DIR/externalpackages/boost/install/ \
++	--with-fortran-lib="-L/usr/lib/gcc/x86_64-linux-gnu/4.6/ -lgfortran" \
+ 	--with-numthreads=18 \
+ 	--enable-development \
+ 	--enable-debugging '
+@@ -54,15 +54,15 @@
+ EXTERNALPACKAGESDIR=$ISSM_DIR/externalpackages
+ 
+ #List of external pakages to be installed and their installation scripts
+-EXTERNALPACKAGES="autotools install.sh                
+-						matlab    install.sh                
+-						mpich     install-3.0-linux64.sh    
+-						cmake     install.sh                
+-						petsc     install-3.5-linux64.sh    
+-						triangle  install-linux64.sh        
+-						boost     install.sh                
+-						dakota    install-5.3.1-linux64.sh  
+-						chaco     install.sh 
++EXTERNALPACKAGES="autotools     install.sh                
++						matlab        install.sh                
++						mpich         install-3.0-linux64.sh    
++						cmake         install.sh                
++						petsc         install-3.5-linux64.sh    
++						triangle      install-linux64.sh        
++						boost         install.sh                
++						dakota        install-5.3.1-linux64.sh  
++						chaco         install.sh 
+ 						python        install-2.7.3-linux64.sh    
+ 						nose          install-linux64-python2.sh  
+ 						blas          install-linux64.sh          
+@@ -73,7 +73,7 @@
+ 						hdf5          install.sh                  
+ 						netcdf        install.sh                  
+ 						netcdf-python install.sh
+-						shell2junit install.sh"
++						shell2junit   install.sh"
+ 
+ 
+ #---------------------#
+@@ -85,22 +85,8 @@
+ # - "no"  do not compile ISSM
+ ISSM_COMPILATION="yes"
+ 
+-#----------------------#
+-# 5: Mail notification #
+-#----------------------#
+-
+-#Mail delivery. If SKIPMAIL="no", the html nightly run report will be
+-#sent to the adresses present in $ISSM_DIR/cron/mailinglist.
+-SKIPMAIL="no"
+-
+-#Sender email address
+-EMAIL_ADRESS="eric.larour@jpl.nasa.gov"
+-
+-#Mailing list
+-MAILINGLIST="eric.larour@jpl.nasa.gov"
+-
+ #------------------------#
+-# 6: Nightly run options #
++# 5: Nightly run options #
+ #------------------------#
+ 
+ #number of cpus used in ISSM installation and compilation (one is usually
+Index: ../trunk-jpl/jenkins/linux64_murdo_ad
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_murdo_ad	(revision 18398)
++++ ../trunk-jpl/jenkins/linux64_murdo_ad	(revision 18399)
+@@ -64,22 +64,8 @@
+ # - "no"  do not compile ISSM
+ ISSM_COMPILATION="yes"
+ 
+-#----------------------#
+-# 5: Mail notification #
+-#----------------------#
+-
+-#Mail delivery. If SKIPMAIL="no", the html nightly run report will be
+-#sent to the adresses present in $ISSM_DIR/cron/mailinglist.
+-SKIPMAIL="no"
+-
+-#Sender email address
+-EMAIL_ADRESS="eric.larour@jpl.nasa.gov"
+-
+-#Mailing list
+-MAILINGLIST="eric.larour@jpl.nasa.gov"
+-
+ #------------------------#
+-# 6: Nightly run options #
++# 5: Nightly run options #
+ #------------------------#
+ 
+ #number of cpus used in ISSM installation and compilation (one is usually
+Index: ../trunk-jpl/jenkins/linux64_murdo_ampi
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_murdo_ampi	(revision 18398)
++++ ../trunk-jpl/jenkins/linux64_murdo_ampi	(revision 18399)
+@@ -77,22 +77,8 @@
+ # - "no"  do not compile ISSM
+ ISSM_COMPILATION="yes"
+ 
+-#----------------------#
+-# 5: Mail notification #
+-#----------------------#
+-
+-#Mail delivery. If SKIPMAIL="no", the html nightly run report will be
+-#sent to the adresses present in $ISSM_DIR/cron/mailinglist.
+-SKIPMAIL="no"
+-
+-#Sender email address
+-EMAIL_ADRESS="eric.larour@jpl.nasa.gov"
+-
+-#Mailing list
+-MAILINGLIST="eric.larour@jpl.nasa.gov"
+-
+ #------------------------#
+-# 6: Nightly run options #
++# 5: Nightly run options #
+ #------------------------#
+ 
+ #number of cpus used in ISSM installation and compilation (one is usually
+Index: ../trunk-jpl/jenkins/execute_shell
+===================================================================
+--- ../trunk-jpl/jenkins/execute_shell	(revision 18398)
++++ ../trunk-jpl/jenkins/execute_shell	(revision 18399)
+@@ -9,8 +9,6 @@
+ 		configfile=linux64_murdo ;;
+ 	imac-012301-gil )
+ 		configfile=imac-012301-gil ;;
+-	larsen )
+-		configfile=linux64_larsen ;;
+ 	windows )
+ 		configfile=windows
+ 		export PATH=/cygdrive/c/Cygwin/usr/bin:/cygdrive/c/Cygwin/bin:$PATH ;;
+Index: ../trunk-jpl/jenkins/windows
+===================================================================
+--- ../trunk-jpl/jenkins/windows	(revision 18398)
++++ ../trunk-jpl/jenkins/windows	(revision 18399)
+@@ -65,22 +65,8 @@
+ # - "no"  do not compile ISSM
+ ISSM_COMPILATION="yes"
+ 
+-#----------------------#
+-# 5: Mail notification #
+-#----------------------#
+-
+-#Mail delivery. If SKIPMAIL="no", the html nightly run report will be
+-#sent to the adresses present in $ISSM_DIR/cron/mailinglist.
+-SKIPMAIL="no"
+-
+-#Sender email address
+-EMAIL_ADRESS="eric.larour@jpl.nasa.gov"
+-
+-#Mailing list
+-MAILINGLIST="eric.larour@jpl.nasa.gov"
+-
+ #------------------------#
+-# 6: Nightly run options #
++# 5: Nightly run options #
+ #------------------------#
+ 
+ #number of cpus used in ISSM installation and compilation (one is usually
Index: /issm/oecreview/Archive/18296-19100/ISSM-18399-18400.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18399-18400.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18399-18400.diff	(revision 19102)
@@ -0,0 +1,60 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18399)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18400)
+@@ -297,15 +297,15 @@
+ /*}}}*/
+ void       Penta::ComputeDeviatoricStressTensor(){/*{{{*/
+ 
+-	IssmDouble      xyz_list[NUMVERTICES][3];
+-	IssmDouble      viscosity;
+-	IssmDouble      epsilon[6]; /* epsilon=[exx,eyy,exy];*/
+-	IssmDouble      tau_xx[NUMVERTICES];
+-	IssmDouble		tau_yy[NUMVERTICES];
+-	IssmDouble		tau_zz[NUMVERTICES];
+-	IssmDouble      tau_xy[NUMVERTICES];
+-	IssmDouble		tau_xz[NUMVERTICES];
+-	IssmDouble		tau_yz[NUMVERTICES];
++	IssmDouble  xyz_list[NUMVERTICES][3];
++	IssmDouble  viscosity;
++	IssmDouble  epsilon[6]; /* epsilon=[exx,eyy,exy];*/
++	IssmDouble  tau_xx[NUMVERTICES];
++	IssmDouble	tau_yy[NUMVERTICES];
++	IssmDouble	tau_zz[NUMVERTICES];
++	IssmDouble  tau_xy[NUMVERTICES];
++	IssmDouble	tau_xz[NUMVERTICES];
++	IssmDouble	tau_yz[NUMVERTICES];
+ 	GaussPenta* gauss=NULL;
+ 
+ 	/* Get node coordinates and dof list: */
+@@ -335,12 +335,12 @@
+ 	}
+ 
+ 	/*Add Stress tensor components into inputs*/
+-	this->inputs->AddInput(new PentaInput(StressTensorxxEnum,&tau_xx[0],P1Enum));
+-	this->inputs->AddInput(new PentaInput(StressTensorxyEnum,&tau_xy[0],P1Enum));
+-	this->inputs->AddInput(new PentaInput(StressTensorxzEnum,&tau_xz[0],P1Enum));
+-	this->inputs->AddInput(new PentaInput(StressTensoryyEnum,&tau_yy[0],P1Enum));
+-	this->inputs->AddInput(new PentaInput(StressTensoryzEnum,&tau_yz[0],P1Enum));
+-	this->inputs->AddInput(new PentaInput(StressTensorzzEnum,&tau_zz[0],P1Enum));
++	this->inputs->AddInput(new PentaInput(DeviatoricStressxxEnum,&tau_xx[0],P1Enum));
++	this->inputs->AddInput(new PentaInput(DeviatoricStressxyEnum,&tau_xy[0],P1Enum));
++	this->inputs->AddInput(new PentaInput(DeviatoricStressxzEnum,&tau_xz[0],P1Enum));
++	this->inputs->AddInput(new PentaInput(DeviatoricStressyyEnum,&tau_yy[0],P1Enum));
++	this->inputs->AddInput(new PentaInput(DeviatoricStressyzEnum,&tau_yz[0],P1Enum));
++	this->inputs->AddInput(new PentaInput(DeviatoricStresszzEnum,&tau_zz[0],P1Enum));
+ 
+ 	/*Clean up and return*/
+ 	delete gauss;
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18399)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18400)
+@@ -1204,6 +1204,7 @@
+ 	}
+ 
+ 	/*Assign output pointer*/
++	_assert_(input);
+ 	*pinterpolation   = input->GetResultInterpolation();
+ 	*pnodesperelement = input->GetResultNumberOfNodes();
+ }/*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18400-18401.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18400-18401.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18400-18401.diff	(revision 19102)
@@ -0,0 +1,45 @@
+Index: ../trunk-jpl/jenkins/linux64_murdo_ampi
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_murdo_ampi	(revision 18400)
++++ ../trunk-jpl/jenkins/linux64_murdo_ampi	(revision 18401)
+@@ -20,12 +20,12 @@
+ 				  --with-metis-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 				  --with-mpi-include=$ISSM_DIR/externalpackages/mpich/install/include  \
+ 				  --with-mpi-libflags="-L$ISSM_DIR/externalpackages/mpich/install/lib/ -lmpich" \
+-				  --with-graphics-lib="/usr/lib/x86_64-linux-gnu/libX11.so" \
+ 				  --with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install/ \
+ 				  --with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 				  --with-numthreads=18  \
+ 				  --with-scalapack-dir=$ISSM_DIR/externalpackages/petsc/install/ \
+ 				  --with-triangle-dir=$ISSM_DIR/externalpackages/triangle/install \
++				  --with-fortran-lib="-L/usr/lib/gcc/x86_64-linux-gnu/4.6/ -lgfortran" \
+ 				  --enable-development \
+ 				  --enable-debugging CXXFLAGS="-g -O0" '
+ #MATLAB path
+Index: ../trunk-jpl/configure.ac
+===================================================================
+--- ../trunk-jpl/configure.ac	(revision 18400)
++++ ../trunk-jpl/configure.ac	(revision 18401)
+@@ -5,19 +5,16 @@
+ AC_CONFIG_AUX_DIR([./aux-config])         #Put config files in aux-config
+ AC_CONFIG_MACRO_DIR([m4])                 #m4 macros are located in m4
+ m4_include([m4/issm_options.m4])
+-AC_CANONICAL_TARGET                       #Determine the system type
+ 
++#Determine System type and OS
++AC_CANONICAL_TARGET
++
+ #Compilers
+ AC_PROG_CC([icc cccl cl icl gcc])
+ AC_PROG_CPP
+ AC_PROG_CXX([icpc cccl cl icl g++])
+ AC_PROG_F77([ifort g77 gfortran])
+ 
+-#AC_F77_LIBRARY_LDFLAGS
+-
+-#Libraries and linking
+-#AC_PATH_XTRA      #figure out X library and include paths
+-
+ #AUTOMAKE
+ #Initialize automake and declare foreign so that we don't need a ChangeLog, INSTALL, etc
+ AM_INIT_AUTOMAKE([foreign])
Index: /issm/oecreview/Archive/18296-19100/ISSM-18401-18402.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18401-18402.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18401-18402.diff	(revision 19102)
@@ -0,0 +1,91 @@
+Index: ../trunk-jpl/externalpackages/mpich/install-3.0-macosx64-static.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/mpich/install-3.0-macosx64-static.sh	(revision 0)
++++ ../trunk-jpl/externalpackages/mpich/install-3.0-macosx64-static.sh	(revision 18402)
+@@ -0,0 +1,32 @@
++#!/bin/bash
++set -eu
++
++#Some cleanup
++rm -rf src install mpich-3.0.4
++mkdir src install
++
++#Download from ISSM server
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/mpich-3.0.4.tar.gz' 'mpich-3.0.4.tar.gz'
++
++#Untar 
++tar -zxvf  mpich-3.0.4.tar.gz
++
++#Move mpich into src directory
++mv mpich-3.0.4/* src
++rm -rf mpich-3.0.4
++
++#Configure mpich
++cd src
++./configure \
++	--prefix="$ISSM_DIR/externalpackages/mpich/install" \
++	--enable-shared
++
++	#CC=llvm-gcc \
++
++#Compile mpich (this new version supports parallel make)
++if [ $# -eq 0 ]; then
++	make
++else
++	make -j $1
++fi
++make install 
+
+Property changes on: ../trunk-jpl/externalpackages/mpich/install-3.0-macosx64-static.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh	(revision 0)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh	(revision 18402)
+@@ -0,0 +1,35 @@
++#!/bin/bash
++set -eu
++
++#Some cleanup
++rm -rf install petsc-3.5.1 src
++mkdir install src
++
++#Download from ISSM server
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.1.tar.gz' 'petsc-3.5.1.tar.gz'
++
++#Untar and move petsc to install directory
++tar -zxvf  petsc-3.5.1.tar.gz
++mv petsc-3.5.1/* src/
++rm -rf petsc-3.5.1
++
++#configure
++cd src
++./config/configure.py \
++	--prefix="$ISSM_DIR/externalpackages/petsc/install" \
++	--with-mpi-dir="$ISSM_DIR/externalpackages/mpich/install" \
++	--PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
++	--with-debugging=0 \
++	--with-valgrind=0 \
++	--with-ssl=0 \
++	--with-x=0 \
++	--with-shared-libraries=0 \
++	--download-metis=1 \
++	--download-parmetis=1 \
++	--download-mumps=1 \
++   --download-fblaslapack=yes \
++	--download-scalapack=1
++
++#Compile and intall
++make
++make install
+
+Property changes on: ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18402-18403.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18402-18403.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18402-18403.diff	(revision 19102)
@@ -0,0 +1,1028 @@
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.cpp	(revision 18402)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.cpp	(revision 18403)
+@@ -198,8 +198,7 @@
+ void AdjointBalancethicknessAnalysis::GradientJVx(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+ 	/*Intermediaries*/
+-	IssmDouble Jdet,weight;
+-	IssmDouble thickness,Dlambda[3],dp[3];
++	IssmDouble thickness,Jdet,Dlambda[3],dp[3];
+ 	IssmDouble *xyz_list= NULL;
+ 
+ 	/*Fetch number of vertices for this finite element*/
+@@ -246,8 +245,7 @@
+ void AdjointBalancethicknessAnalysis::GradientJVy(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+ 	/*Intermediaries*/
+-	IssmDouble Jdet,weight;
+-	IssmDouble thickness,Dlambda[3],dp[3];
++	IssmDouble thickness,Jdet,Dlambda[3],dp[3];
+ 	IssmDouble *xyz_list= NULL;
+ 
+ 	/*Fetch number of vertices for this finite element*/
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18402)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18403)
+@@ -51,7 +51,7 @@
+ 	IssmDouble  NUMxH2,NUMyH2,DENH2;
+ 	IssmDouble  NUMxUbar,NUMyUbar,DENUbar;
+ 	IssmDouble  vxobs,vyobs,vxobsbar,vyobsbar,vbarobs2,vbarobs;
+-	IssmDouble  nux,nuy,phi,dphi[2];
++	IssmDouble  nu,phi,dphi[2];
+ 	int        *responses = NULL;
+ 	IssmDouble *xyz_list  = NULL;
+ 
+@@ -72,8 +72,7 @@
+ 	Input* potential_input = element->GetInput(PotentialEnum);             _assert_(potential_input);
+ 	Input* vxobs_input     = element->GetInput(BalancethicknessVxObsEnum); _assert_(vxobs_input);
+ 	Input* vyobs_input     = element->GetInput(BalancethicknessVyObsEnum); _assert_(vyobs_input);
+-	Input* nux_input       = element->GetInput(BalancethicknessNuxEnum);   _assert_(nux_input);
+-	Input* nuy_input       = element->GetInput(BalancethicknessNuyEnum);   _assert_(nuy_input);
++	Input* nu_input        = element->GetInput(BalancethicknessNuEnum);    _assert_(nu_input);
+ 
+ 	/* Start  looping on the number of gaussian points: */
+ 	Gauss* gauss=element->NewGauss(2);
+@@ -86,16 +85,15 @@
+ 
+ 		vxobs_input->GetInputValue(&vxobs,gauss);
+ 		vyobs_input->GetInputValue(&vyobs,gauss);
+-		nux_input->GetInputValue(&nux,gauss);
+-		nuy_input->GetInputValue(&nuy,gauss);
++		nu_input->GetInputValue(&nu,gauss);
+ 		potential_input->GetInputValue(&phi,gauss);
+ 		potential_input->GetInputDerivativeValue(&dphi[0],xyz_list,gauss);
+ 		thicknessobs_input->GetInputValue(&hobs,gauss);
+ 
+-		vxobsbar = nux*vxobs;
+-		vyobsbar = nuy*vyobs;
++		vxobsbar = nu*vxobs;
++		vyobsbar = nu*vyobs;
+ 
+-		vbarobs2 = (nux*nux*vxobs*vxobs + nuy*nuy*vyobs*vyobs);
++		vbarobs2 = (nu*nu*vxobs*vxobs + nu*nu*vyobs*vyobs);
+ 		vbarobs  = sqrt(vbarobs2);
+ 		hu2 = hobs*hobs*vbarobs2;
+ 
+@@ -104,32 +102,36 @@
+ 			weights_input->GetInputValue(&weight,gauss,responses[resp]);
+ 
+ 			switch(responses[resp]){
++				case IrrotationalH2MisfitEnum:
++					/*J = (H^2 - Hobs^2)^2*/
++					for(i=0;i<numnodes;i++){
++						NUMxH2 = 2.*dbasis[0*numnodes+i]*dphi[0]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
++						NUMyH2 = 2.*dbasis[1*numnodes+i]*dphi[1]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
++						DENH2 = vbarobs2*vbarobs2+1.e-14;
++						pe->values[i]+=(NUMxH2+NUMyH2)/DENH2 *weight*Jdet*gauss->weight;
++					}
++					break;
++				case IrrotationalDirectionMisfitEnum:
++					/*J = 1/2 (vbar ^ gard(phi))^2*/
++					for(i=0;i<numnodes;i++){
++						pe->values[i]+= weight*Jdet*gauss->weight*
++						  nu*nu*(vyobs*dphi[0] - vxobs*dphi[1])*
++						  (vyobs*dbasis[0*numnodes+i] - vxobs*dbasis[1*numnodes+i]);
++					}
++					break;
+ 				case Balancethickness2MisfitEnum:
+-					/*J = (H^2 - Hobs^2)^2*/
+-					//for(i=0;i<numnodes;i++){
+-					//	NUMxH2 = 2.*dbasis[0*numnodes+i]*dphi[0]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
+-					//	NUMyH2 = 2.*dbasis[1*numnodes+i]*dphi[1]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
+-					//	DENH2 = vbarobs2*vbarobs2+1.e-14;
+-					//	pe->values[i]+=(NUMxH2+NUMyH2)/DENH2 *weight*Jdet*gauss->weight;
+-					//}
+ 					/*J = phi^2*/
+ 					//for(i=0;i<numnodes;i++) pe->values[i]+= phi*basis[i]*weight*Jdet*gauss->weight; //OK
+ 					/*J = grad phi ^2*/
+ 					//for(i=0;i<numnodes;i++) pe->values[i]+= (dphi[0]*dbasis[0*numnodes+i] + dphi[1]*dbasis[1*numnodes+i])*weight*Jdet*gauss->weight; //OK
+-					/*J = (ubar - nux*uobs)^2*/
++					/*J = (ubar - nu*uobs)^2*/
+ 					//for(i=0;i<numnodes;i++){
+ 					//	NUMxUbar = (vyobsbar*dphi[0]*dphi[1] - vxobsbar*dphi[1]*dphi[1])*vbarobs*dbasis[0*numnodes+i];
+ 					//	NUMyUbar = (vyobsbar*dphi[0]*dphi[0] - vxobsbar*dphi[0]*dphi[1])*vbarobs*dbasis[1*numnodes+i];
+ 					//	DENUbar  = pow(dphi[0]*dphi[0] + dphi[1]*dphi[1],3./2.)+1.e-14;
+ 					//	pe->values[i]+=(NUMxUbar-NUMyUbar)/DENUbar *weight*Jdet*gauss->weight;
+ 					//}
+-					/*J = 1/2 (vbar ^ gard(phi))^2*/
+-					for(i=0;i<numnodes;i++){
+-						pe->values[i]+= weight*Jdet*gauss->weight*
+-						  (nuy*vyobs*dphi[0] - nux*vxobs*dphi[1])*
+-						  (nuy*vyobs*dbasis[0*numnodes+i] - nux*vxobs*dbasis[1*numnodes+i]);
+-					}
+-
++					_error_("Not implemented yet");
+ 					break;
+ 				default:
+ 					_error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
+@@ -168,15 +170,37 @@
+ 
+ 	/*Deal with first part (partial derivative a J with respect to k)*/
+ 	for(resp=0;resp<num_responses;resp++) switch(responses[resp]){
+-		case Balancethickness2MisfitEnum: /*Nothing, \partial J/\partial k = 0*/ break;
++		case Balancethickness2MisfitEnum:
++			/*Nothing, \partial J/\partial k = 0*/
++			break;
++		case IrrotationalH2MisfitEnum:
++			switch(control_type){
++				case BalancethicknessApparentMassbalanceEnum:
++					/*Nothing, \partial J/\partial k = 0*/
++					break;
++				case BalancethicknessNuEnum:
++					GradientJ1Nu(element,gradient,control_index);
++					break;
++				default: _error_("control type not supported yet: " << EnumToStringx(control_type));
++			} 
++			break;
++		case IrrotationalDirectionMisfitEnum:
++			switch(control_type){
++				case BalancethicknessApparentMassbalanceEnum:
++					/*Nothing, \partial J/\partial k = 0*/
++					break;
++				case BalancethicknessNuEnum:
++					GradientJ2Nu(element,gradient,control_index); break; //Might need to be renamed ?
++				default: _error_("control type not supported yet: " << EnumToStringx(control_type));
++			} 
++			break;
+ 		default: _error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
+ 	}
+ 
+ 	/*Deal with second term*/
+ 	switch(control_type){
+ 		case BalancethicknessApparentMassbalanceEnum: GradientJAdot(element,gradient,control_index); break;
+-		case BalancethicknessNuxEnum: GradientJNux(element,gradient,control_index); break;//should be in first part....
+-		case BalancethicknessNuyEnum: GradientJNuy(element,gradient,control_index); break;//should be in first part....
++		case BalancethicknessNuEnum: /*Nothing: state equations do not depend on k*/ break;
+ 		default: _error_("control type not supported yet: " << EnumToStringx(control_type));
+ 	}
+ 
+@@ -187,8 +211,7 @@
+ void AdjointBalancethickness2Analysis::GradientJAdot(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+ 	/*Intermediaries*/
+-	IssmDouble Jdet,weight;
+-	IssmDouble lambda; 
++	IssmDouble lambda,Jdet; 
+ 	IssmDouble *xyz_list= NULL;
+ 
+ 	/*Fetch number of vertices for this finite element*/
+@@ -202,8 +225,7 @@
+ 	/*Retrieve all inputs we will be needing: */
+ 	element->GetVerticesCoordinates(&xyz_list);
+ 	element->GradientIndexing(&vertexpidlist[0],control_index);
+-	Input* adjoint_input = element->GetInput(AdjointEnum);                            _assert_(adjoint_input);
+-	Input* weights_input = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
++	Input* adjoint_input = element->GetInput(AdjointEnum); _assert_(adjoint_input);
+ 
+ 	Gauss* gauss=element->NewGauss(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+@@ -211,12 +233,11 @@
+ 
+ 		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+ 		element->NodalFunctionsP1(basis,gauss);
+-		weights_input->GetInputValue(&weight,gauss,Balancethickness2MisfitEnum);
+ 		adjoint_input->GetInputValue(&lambda,gauss);
+ 
+ 		/*Build gradient vector (actually -dJ/da): */
+ 		for(int i=0;i<numvertices;i++){
+-			ge[i]+= - weight*Jdet*gauss->weight*basis[i]*lambda;
++			ge[i]+= - Jdet*gauss->weight*basis[i]*lambda;
+ 			_assert_(!xIsNan<IssmDouble>(ge[i]));
+ 		}
+ 	}
+@@ -229,12 +250,11 @@
+ 	xDelete<int>(vertexpidlist);
+ 	delete gauss;
+ }/*}}}*/
+-void AdjointBalancethickness2Analysis::GradientJNux(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++void AdjointBalancethickness2Analysis::GradientJ1Nu(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+ 	/*Intermediaries*/
+-	IssmDouble Jdet,weight;
+-	IssmDouble vxobs,vyobs,thicknessobs;
+-	IssmDouble nux,nuy,dphi[2],dphinorm2,nuvobs2;
++	IssmDouble vxobs,vyobs,thicknessobs,weight;
++	IssmDouble nu,Jdet,dphi[2],dphinorm2,nuvobs2;
+ 	IssmDouble *xyz_list= NULL;
+ 
+ 	/*Fetch number of vertices for this finite element*/
+@@ -251,8 +271,7 @@
+ 	Input* weights_input   = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+ 	Input* vxobs_input     = element->GetInput(BalancethicknessVxObsEnum); _assert_(vxobs_input);
+ 	Input* vyobs_input     = element->GetInput(BalancethicknessVyObsEnum); _assert_(vyobs_input);
+-	Input* nux_input       = element->GetInput(BalancethicknessNuxEnum);   _assert_(nux_input);
+-	Input* nuy_input       = element->GetInput(BalancethicknessNuyEnum);   _assert_(nuy_input);
++	Input* nu_input        = element->GetInput(BalancethicknessNuEnum);    _assert_(nu_input);
+ 	Input* potential_input = element->GetInput(PotentialEnum);             _assert_(potential_input);
+ 	Input* thicknessobs_input=element->GetInput(InversionThicknessObsEnum);_assert_(thicknessobs_input);
+ 
+@@ -262,24 +281,20 @@
+ 
+ 		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+ 		element->NodalFunctionsP1(basis,gauss);
+-		weights_input->GetInputValue(&weight,gauss,Balancethickness2MisfitEnum);
++		weights_input->GetInputValue(&weight,gauss,IrrotationalH2MisfitEnum);
+ 		vxobs_input->GetInputValue(&vxobs,gauss);
+ 		vyobs_input->GetInputValue(&vyobs,gauss);
+-		nux_input->GetInputValue(&nux,gauss);
+-		nuy_input->GetInputValue(&nuy,gauss);
++		nu_input->GetInputValue(&nu,gauss);
+ 		potential_input->GetInputDerivativeValue(&dphi[0],xyz_list,gauss);
+ 		thicknessobs_input->GetInputValue(&thicknessobs,gauss);
+ 
+ 		dphinorm2 = dphi[0]*dphi[0] + dphi[1]*dphi[1];
+-		nuvobs2   = nux*vxobs*nux*vxobs + nuy*vyobs*nuy*vyobs;
++		nuvobs2   = nu*nu*(vxobs*vxobs + vyobs*vyobs);
+ 
+ 		/*Build gradient vector (actually -dJ/da): */
+ 		for(int i=0;i<numvertices;i++){
+-			//ge[i]+= - weight*Jdet*gauss->weight*(-vxobs)*dphi[1]*(nuy*vyobs*dphi[0] - nux*vxobs*dphi[1])*basis[i]; //THIS IS FOR Q//V
+-			ge[i]+= - weight*Jdet*gauss->weight*basis[i]*(
+-						-2.*nux*vxobs*vxobs*(
+-							dphinorm2*dphinorm2 - thicknessobs*thicknessobs*dphinorm2*nuvobs2
+-							)/ ( (pow(nux,6)+pow(nuy,6))*pow(vxobs,6) + 3*(nux*vxobs*nuy*vyobs)*(nux*vxobs*nuy*vyobs)*nuvobs2)
++			ge[i]+= -weight*Jdet*gauss->weight*basis[i]*(
++						-2./pow(nu,3) * dphinorm2/(vxobs*vxobs + vyobs*vyobs) * (dphinorm2/nuvobs2 - thicknessobs*thicknessobs) 
+ 						);
+ 			_assert_(!xIsNan<IssmDouble>(ge[i]));
+ 		}
+@@ -293,12 +308,11 @@
+ 	xDelete<int>(vertexpidlist);
+ 	delete gauss;
+ }/*}}}*/
+-void AdjointBalancethickness2Analysis::GradientJNuy(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++void AdjointBalancethickness2Analysis::GradientJ2Nu(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+ 	/*Intermediaries*/
+-	IssmDouble Jdet,weight;
+-	IssmDouble vxobs,vyobs,thicknessobs;
+-	IssmDouble nux,nuy,dphi[2],dphinorm2,nuvobs2;
++	IssmDouble vxobs,vyobs,thicknessobs,weight;
++	IssmDouble nu,Jdet,dphi[2],dphinorm2,nuvobs2;
+ 	IssmDouble *xyz_list= NULL;
+ 
+ 	/*Fetch number of vertices for this finite element*/
+@@ -312,41 +326,32 @@
+ 	/*Retrieve all inputs we will be needing: */
+ 	element->GetVerticesCoordinates(&xyz_list);
+ 	element->GradientIndexing(&vertexpidlist[0],control_index);
+-	Input* weights_input      = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+-	Input* vxobs_input        = element->GetInput(BalancethicknessVxObsEnum); _assert_(vxobs_input);
+-	Input* vyobs_input        = element->GetInput(BalancethicknessVyObsEnum); _assert_(vyobs_input);
+-	Input* nux_input          = element->GetInput(BalancethicknessNuxEnum);   _assert_(nux_input);
+-	Input* nuy_input          = element->GetInput(BalancethicknessNuyEnum);   _assert_(nuy_input);
+-	Input* potential_input    = element->GetInput(PotentialEnum);             _assert_(potential_input);
+-	Input* thicknessobs_input = element->GetInput(InversionThicknessObsEnum);_assert_(thicknessobs_input);
++	Input* weights_input   = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
++	Input* vxobs_input     = element->GetInput(BalancethicknessVxObsEnum); _assert_(vxobs_input);
++	Input* vyobs_input     = element->GetInput(BalancethicknessVyObsEnum); _assert_(vyobs_input);
++	Input* nu_input        = element->GetInput(BalancethicknessNuEnum);    _assert_(nu_input);
++	Input* potential_input = element->GetInput(PotentialEnum);             _assert_(potential_input);
++	Input* thicknessobs_input=element->GetInput(InversionThicknessObsEnum);_assert_(thicknessobs_input);
+ 
+-
+ 	Gauss* gauss=element->NewGauss(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 		gauss->GaussPoint(ig);
+ 
+ 		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+ 		element->NodalFunctionsP1(basis,gauss);
+-		weights_input->GetInputValue(&weight,gauss,Balancethickness2MisfitEnum);
++		weights_input->GetInputValue(&weight,gauss,IrrotationalDirectionMisfitEnum);
+ 		vxobs_input->GetInputValue(&vxobs,gauss);
+ 		vyobs_input->GetInputValue(&vyobs,gauss);
+-		nux_input->GetInputValue(&nux,gauss);
+-		nuy_input->GetInputValue(&nuy,gauss);
++		nu_input->GetInputValue(&nu,gauss);
+ 		potential_input->GetInputDerivativeValue(&dphi[0],xyz_list,gauss);
+ 		thicknessobs_input->GetInputValue(&thicknessobs,gauss);
+ 
+ 		dphinorm2 = dphi[0]*dphi[0] + dphi[1]*dphi[1];
+-		nuvobs2   = nux*vxobs*nux*vxobs + nuy*vyobs*nuy*vyobs;
++		nuvobs2   = nu*vxobs*nu*vxobs + nu*vyobs*nu*vyobs;
+ 
+-
+ 		/*Build gradient vector (actually -dJ/da): */
+ 		for(int i=0;i<numvertices;i++){
+-			//ge[i]+= - weight*Jdet*gauss->weight*(+vyobs)*dphi[0]*(nuy*vyobs*dphi[0] - nux*vxobs*dphi[1])*basis[i];
+-			ge[i]+= - weight*Jdet*gauss->weight*basis[i]*(
+-						-2.*nuy*vyobs*vyobs*(
+-							dphinorm2*dphinorm2 - thicknessobs*thicknessobs*dphinorm2*nuvobs2
+-							)/ ( (pow(nux,6)+pow(nuy,6))*pow(vyobs,6) + 3*(nux*vxobs*nuy*vyobs)*(nux*vxobs*nuy*vyobs)*nuvobs2)
+-						);
++			ge[i]+= - weight*Jdet*gauss->weight*nu*(vyobs*dphi[0] -vxobs*dphi[1])*(vyobs*dphi[0] -vxobs*dphi[1])*basis[i];
+ 			_assert_(!xIsNan<IssmDouble>(ge[i]));
+ 		}
+ 	}
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h	(revision 18402)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h	(revision 18403)
+@@ -28,8 +28,8 @@
+ 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+ 		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+ 		void GradientJAdot(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJNux(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJNuy(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void GradientJ1Nu(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void GradientJ2Nu(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+ 		void UpdateConstraints(FemModel* femmodel);
+ };
+Index: ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18402)
++++ ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18403)
+@@ -26,8 +26,7 @@
+ 	}
+ 
+ 	iomodel->FetchDataToInput(elements,BalancethicknessApparentMassbalanceEnum);
+-	iomodel->FetchDataToInput(elements,BalancethicknessNuxEnum);
+-	iomodel->FetchDataToInput(elements,BalancethicknessNuyEnum);
++	iomodel->FetchDataToInput(elements,BalancethicknessNuEnum);
+ 	iomodel->FetchDataToInput(elements,BalancethicknessVxObsEnum);
+ 	iomodel->FetchDataToInput(elements,BalancethicknessVyObsEnum);
+ 	iomodel->FetchDataToInput(elements,BalancethicknessThicknessObsEnum);
+@@ -202,7 +201,7 @@
+ 
+ 	/*Intermediaries */
+ 	int         Hinterpolation;
+-	IssmDouble  vx,vy,vbar,nux,nuy,normdphi,dphi[2];
++	IssmDouble  vx,vy,vbar,nu,normdphi,dphi[2];
+ 	IssmDouble* xyz_list = NULL;
+ 	int       * doflist  = NULL;
+ 
+@@ -232,8 +231,7 @@
+ 	Input* potential_input = element->GetInput(PotentialEnum);             _assert_(potential_input);
+ 	Input* vx_input        = element->GetInput(BalancethicknessVxObsEnum); _assert_(vx_input);
+ 	Input* vy_input        = element->GetInput(BalancethicknessVyObsEnum); _assert_(vy_input);
+-	Input* nux_input       = element->GetInput(BalancethicknessNuxEnum);   _assert_(nux_input);
+-	Input* nuy_input       = element->GetInput(BalancethicknessNuyEnum);   _assert_(nuy_input);
++	Input* nu_input        = element->GetInput(BalancethicknessNuEnum);    _assert_(nu_input);
+ 
+ 	switch(element->GetElementType()){
+ 		case P1Enum: Hinterpolation = P0Enum; break;
+@@ -246,11 +244,10 @@
+ 
+ 		vx_input->GetInputValue(&vx,gauss);
+ 		vy_input->GetInputValue(&vy,gauss);
+-		nux_input->GetInputValue(&nux,gauss);
+-		nuy_input->GetInputValue(&nuy,gauss);
++		nu_input->GetInputValue(&nu,gauss);
+ 		potential_input->GetInputDerivativeValue(&dphi[0],xyz_list,gauss);
+ 
+-		vx = vx*nux; vy = vy*nuy;
++		vx = vx*nu; vy = vy*nu;
+ 		vbar = sqrt(vx*vx + vy*vy) + 1.e-10;
+ 		normdphi = sqrt(dphi[0]*dphi[0] + dphi[1]*dphi[1]);
+ 
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18402)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18403)
+@@ -300,8 +300,12 @@
+ 	BalancethicknessSpcpotentialEnum,
+ 	BalancethicknessApparentMassbalanceEnum,
+ 	Balancethickness2MisfitEnum,
+-	BalancethicknessNuxEnum,
+-	BalancethicknessNuyEnum,
++	IrrotationalH2MisfitEnum,
++	IrrotationalDirectionMisfitEnum,
++	IrrotationalVelMisfitEnum,
++	IrrotationalAlongGradientNuEnum,
++	IrrotationalAcrossGradientNuEnum,
++	BalancethicknessNuEnum,
+ 	BalancethicknessVxObsEnum,
+ 	BalancethicknessVyObsEnum,
+ 	BalancethicknessThicknessObsEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18402)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18403)
+@@ -308,8 +308,12 @@
+ 		case BalancethicknessSpcpotentialEnum : return "BalancethicknessSpcpotential";
+ 		case BalancethicknessApparentMassbalanceEnum : return "BalancethicknessApparentMassbalance";
+ 		case Balancethickness2MisfitEnum : return "Balancethickness2Misfit";
+-		case BalancethicknessNuxEnum : return "BalancethicknessNux";
+-		case BalancethicknessNuyEnum : return "BalancethicknessNuy";
++		case IrrotationalH2MisfitEnum : return "IrrotationalH2Misfit";
++		case IrrotationalDirectionMisfitEnum : return "IrrotationalDirectionMisfit";
++		case IrrotationalVelMisfitEnum : return "IrrotationalVelMisfit";
++		case IrrotationalAlongGradientNuEnum : return "IrrotationalAlongGradientNu";
++		case IrrotationalAcrossGradientNuEnum : return "IrrotationalAcrossGradientNu";
++		case BalancethicknessNuEnum : return "BalancethicknessNu";
+ 		case BalancethicknessVxObsEnum : return "BalancethicknessVxObs";
+ 		case BalancethicknessVyObsEnum : return "BalancethicknessVyObs";
+ 		case BalancethicknessThicknessObsEnum : return "BalancethicknessThicknessObs";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18402)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18403)
+@@ -314,8 +314,12 @@
+ 	      else if (strcmp(name,"BalancethicknessSpcpotential")==0) return BalancethicknessSpcpotentialEnum;
+ 	      else if (strcmp(name,"BalancethicknessApparentMassbalance")==0) return BalancethicknessApparentMassbalanceEnum;
+ 	      else if (strcmp(name,"Balancethickness2Misfit")==0) return Balancethickness2MisfitEnum;
+-	      else if (strcmp(name,"BalancethicknessNux")==0) return BalancethicknessNuxEnum;
+-	      else if (strcmp(name,"BalancethicknessNuy")==0) return BalancethicknessNuyEnum;
++	      else if (strcmp(name,"IrrotationalH2Misfit")==0) return IrrotationalH2MisfitEnum;
++	      else if (strcmp(name,"IrrotationalDirectionMisfit")==0) return IrrotationalDirectionMisfitEnum;
++	      else if (strcmp(name,"IrrotationalVelMisfit")==0) return IrrotationalVelMisfitEnum;
++	      else if (strcmp(name,"IrrotationalAlongGradientNu")==0) return IrrotationalAlongGradientNuEnum;
++	      else if (strcmp(name,"IrrotationalAcrossGradientNu")==0) return IrrotationalAcrossGradientNuEnum;
++	      else if (strcmp(name,"BalancethicknessNu")==0) return BalancethicknessNuEnum;
+ 	      else if (strcmp(name,"BalancethicknessVxObs")==0) return BalancethicknessVxObsEnum;
+ 	      else if (strcmp(name,"BalancethicknessVyObs")==0) return BalancethicknessVyObsEnum;
+ 	      else if (strcmp(name,"BalancethicknessThicknessObs")==0) return BalancethicknessThicknessObsEnum;
+@@ -378,14 +382,14 @@
+ 	      else if (strcmp(name,"FlaimSolution")==0) return FlaimSolutionEnum;
+ 	      else if (strcmp(name,"HydrologyShreveAnalysis")==0) return HydrologyShreveAnalysisEnum;
+ 	      else if (strcmp(name,"HydrologyDCInefficientAnalysis")==0) return HydrologyDCInefficientAnalysisEnum;
+-	      else if (strcmp(name,"HydrologyDCEfficientAnalysis")==0) return HydrologyDCEfficientAnalysisEnum;
++         else stage=4;
++   }
++   if(stage==4){
++	      if (strcmp(name,"HydrologyDCEfficientAnalysis")==0) return HydrologyDCEfficientAnalysisEnum;
+ 	      else if (strcmp(name,"HydrologySolution")==0) return HydrologySolutionEnum;
+ 	      else if (strcmp(name,"MeltingAnalysis")==0) return MeltingAnalysisEnum;
+ 	      else if (strcmp(name,"MasstransportAnalysis")==0) return MasstransportAnalysisEnum;
+-         else stage=4;
+-   }
+-   if(stage==4){
+-	      if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum;
++	      else if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum;
+ 	      else if (strcmp(name,"FreeSurfaceBaseAnalysis")==0) return FreeSurfaceBaseAnalysisEnum;
+ 	      else if (strcmp(name,"FreeSurfaceTopAnalysis")==0) return FreeSurfaceTopAnalysisEnum;
+ 	      else if (strcmp(name,"SurfaceNormalVelocity")==0) return SurfaceNormalVelocityEnum;
+@@ -501,14 +505,14 @@
+ 	      else if (strcmp(name,"Boundary")==0) return BoundaryEnum;
+ 	      else if (strcmp(name,"Converged")==0) return ConvergedEnum;
+ 	      else if (strcmp(name,"Fill")==0) return FillEnum;
+-	      else if (strcmp(name,"FractionIncrement")==0) return FractionIncrementEnum;
++         else stage=5;
++   }
++   if(stage==5){
++	      if (strcmp(name,"FractionIncrement")==0) return FractionIncrementEnum;
+ 	      else if (strcmp(name,"Friction")==0) return FrictionEnum;
+ 	      else if (strcmp(name,"Internal")==0) return InternalEnum;
+ 	      else if (strcmp(name,"MassFlux")==0) return MassFluxEnum;
+-         else stage=5;
+-   }
+-   if(stage==5){
+-	      if (strcmp(name,"MeltingOffset")==0) return MeltingOffsetEnum;
++	      else if (strcmp(name,"MeltingOffset")==0) return MeltingOffsetEnum;
+ 	      else if (strcmp(name,"Misfit")==0) return MisfitEnum;
+ 	      else if (strcmp(name,"Pressure")==0) return PressureEnum;
+ 	      else if (strcmp(name,"PressurePicard")==0) return PressurePicardEnum;
+@@ -624,14 +628,14 @@
+ 	      else if (strcmp(name,"MisfitModelEnum")==0) return MisfitModelEnumEnum;
+ 	      else if (strcmp(name,"MisfitObservation")==0) return MisfitObservationEnum;
+ 	      else if (strcmp(name,"MisfitObservationEnum")==0) return MisfitObservationEnumEnum;
+-	      else if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
++         else stage=6;
++   }
++   if(stage==6){
++	      if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
+ 	      else if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
+ 	      else if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
+ 	      else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
+-         else stage=6;
+-   }
+-   if(stage==6){
+-	      if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
++	      else if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
+ 	      else if (strcmp(name,"MinVel")==0) return MinVelEnum;
+ 	      else if (strcmp(name,"MaxVel")==0) return MaxVelEnum;
+ 	      else if (strcmp(name,"MinVx")==0) return MinVxEnum;
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 18402)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 18403)
+@@ -40,8 +40,7 @@
+ 			case VyEnum:
+ 			case ThicknessEnum:
+ 			case FrictionCoefficientEnum:
+-			case BalancethicknessNuxEnum:
+-			case BalancethicknessNuyEnum:
++			case BalancethicknessNuEnum:
+ 			case BalancethicknessApparentMassbalanceEnum:
+ 				iomodel->FetchData(1,control); 
+ 				break;
+Index: ../trunk-jpl/src/c/cores/controlvalidation_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/controlvalidation_core.cpp	(revision 18402)
++++ ../trunk-jpl/src/c/cores/controlvalidation_core.cpp	(revision 18403)
+@@ -11,8 +11,10 @@
+ void controlvalidation_core(FemModel* femmodel){
+ 
+ 	int         solution_type,n;
++	int         num_responses;
+ 	IssmDouble  j0,j;
+ 	IssmDouble  Ialpha,exponent,alpha;
++	IssmDouble* jlist = NULL;
+ 	IssmDouble *G = NULL;
+ 	IssmDouble *X = NULL;
+ 	IssmDouble *X0= NULL;
+@@ -24,6 +26,7 @@
+ 	/*Recover parameters used throughout the solution*/
+ 	femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
+ 	femmodel->parameters->SetParam(false,SaveResultsEnum);
++	femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum);
+ 
+ 	/*Get initial guess*/
+ 	Vector<IssmDouble> *Xpetsc = NULL;
+@@ -44,8 +47,16 @@
+ 	solutioncore(femmodel);
+ 	if(VerboseControl()) _printf0_("   Compute Adjoint\n");
+ 	adjointcore(femmodel);
++
+ 	if(VerboseControl()) _printf0_("   Compute Initial cost function\n");
+-	femmodel->CostFunctionx(&j0,NULL,NULL);
++	femmodel->CostFunctionx(&j0,&jlist,NULL);
++	_printf0_("Initial J(x+dk)      |  List of contributions\n");
++	_printf0_("_____________________________________________\n");
++	_printf0_("J(x) = "<<setw(12)<<setprecision(7)<<j0<<"  |  ");
++	for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(12)<<setprecision(7)<<jlist[i]);
++	_printf0_("\n");
++	xDelete<IssmDouble>(jlist);
++
+ 	if(VerboseControl()) _printf0_("   Compute Gradient\n");
+ 	Gradjx(&G,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
+ 	for(int i=0;i<n;i++) G[i] = -G[i];
+@@ -94,6 +105,8 @@
+ 	#else
+ 	femmodel->results->AddObject(new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,JEnum,output,num,2,1,0));
+ 	#endif
++	ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,G);
++	femmodel->OutputControlsx(&femmodel->results);
+ 
+ 	/*Clean up and return*/
+ 	xDelete<IssmDouble>(G);
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18402)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18403)
+@@ -591,7 +591,12 @@
+ 				case RheologyBbarAbsGradientEnum:   RheologyBbarAbsGradientx(&double_result,elements,nodes,vertices,loads,materials,parameters);    break;
+ 				case DragCoefficientAbsGradientEnum:DragCoefficientAbsGradientx(&double_result,elements,nodes,vertices,loads,materials,parameters); break;
+ 				case BalancethicknessMisfitEnum:    BalancethicknessMisfitx(&double_result);                                                        break;
+-				case Balancethickness2MisfitEnum:  Balancethickness2Misfitx(&double_result); break;
++				case Balancethickness2MisfitEnum:   Balancethickness2Misfitx(&double_result); break;
++				case IrrotationalH2MisfitEnum:      IrrotationalH2Misfitx(&double_result); break;
++				case IrrotationalDirectionMisfitEnum:  IrrotationalDirectionMisfitx(&double_result); break;
++				case IrrotationalVelMisfitEnum:        IrrotationalVelMisfitx(&double_result); break;
++				case IrrotationalAlongGradientNuEnum:  IrrotationalAlongGradientNux(&double_result); break;
++				case IrrotationalAcrossGradientNuEnum: IrrotationalAcrossGradientNux(&double_result); break;
+ 
+ 			   /*Vector */
+ 				default:
+@@ -1304,7 +1309,7 @@
+ 	IssmDouble J_sum;
+ 
+ 	IssmDouble  weight,thicknessobs,thickness,potential,dpotential[2];
+-	IssmDouble  vx,vy,vxbar,vybar,vxobs,vyobs,vxbarobs,vybarobs,nux,nuy;
++	IssmDouble  vx,vy,vxbar,vybar,vxobs,vyobs,vxbarobs,vybarobs,nu;
+ 	IssmDouble  Jdet;
+ 	IssmDouble* xyz_list = NULL;
+ 
+@@ -1325,8 +1330,7 @@
+ 		Input* vyobs_input       =element->GetInput(BalancethicknessVyObsEnum); _assert_(vyobs_input);
+ 		Input* vx_input          =element->GetInput(VxEnum); _assert_(vx_input);
+ 		Input* vy_input          =element->GetInput(VyEnum); _assert_(vy_input);
+-		Input* nux_input       = element->GetInput(BalancethicknessNuxEnum);   _assert_(nux_input);
+-		Input* nuy_input       = element->GetInput(BalancethicknessNuyEnum);   _assert_(nuy_input);
++		Input* nu_input       = element->GetInput(BalancethicknessNuEnum);   _assert_(nu_input);
+ 
+ 		/* Start  looping on the number of gaussian points: */
+ 		Gauss* gauss=element->NewGauss(2);
+@@ -1347,11 +1351,10 @@
+ 			vyobs_input->GetInputValue(&vyobs,gauss);
+ 			vx_input->GetInputValue(&vxbar,gauss);
+ 			vy_input->GetInputValue(&vybar,gauss);
+-			nux_input->GetInputValue(&nux,gauss);
+-			nuy_input->GetInputValue(&nuy,gauss);
++			nu_input->GetInputValue(&nu,gauss);
+ 
+-			vxbarobs = nux*vxobs;
+-			vybarobs = nuy*vyobs;
++			vxbarobs = nu*vxobs;
++			vybarobs = nu*vyobs;
+ 
+ 			/*J = (H^2 - Hobs^2)^2*/
+ 			J +=0.5*(thickness*thickness - thicknessobs*thicknessobs)*(thickness*thickness - thicknessobs*thicknessobs)*weight*Jdet*gauss->weight;
+@@ -1379,6 +1382,126 @@
+ 	*presponse=J;
+ 
+ }/*}}}*/
++void FemModel::IrrotationalH2Misfitx(IssmDouble* presponse){/*{{{*/
++
++	/*output: */
++	IssmDouble J=0.;
++	IssmDouble J_sum;
++
++	IssmDouble  weight,thicknessobs,thickness;
++	IssmDouble  Jdet;
++	IssmDouble* xyz_list = NULL;
++
++	/*Compute Misfit: */
++	for(int i=0;i<elements->Size();i++){
++		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++
++		/*If on water, return 0: */
++		if(!element->IsIceInElement()) continue;
++
++		/* Get node coordinates*/
++		element->GetVerticesCoordinates(&xyz_list);
++		Input* weights_input     =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
++		Input* thickness_input   =element->GetInput(ThicknessEnum);                          _assert_(thickness_input);
++		Input* thicknessobs_input=element->GetInput(InversionThicknessObsEnum);              _assert_(thicknessobs_input);
++
++		/* Start  looping on the number of gaussian points: */
++		Gauss* gauss=element->NewGauss(2);
++		for(int ig=gauss->begin();ig<gauss->end();ig++){
++
++			gauss->GaussPoint(ig);
++			element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++
++			/*Get all parameters at gaussian point*/
++			weights_input->GetInputValue(&weight,gauss,IrrotationalH2MisfitEnum);
++			thickness_input->GetInputValue(&thickness,gauss);
++			thicknessobs_input->GetInputValue(&thicknessobs,gauss);
++
++			/*J = (H^2 - Hobs^2)^2*/
++			J +=0.5*(thickness*thickness - thicknessobs*thicknessobs)*(thickness*thickness - thicknessobs*thicknessobs)*weight*Jdet*gauss->weight;
++		}
++
++		/*clean up and Return: */
++		xDelete<IssmDouble>(xyz_list);
++		delete gauss;
++	}
++
++	/*Sum all J from all cpus of the cluster:*/
++	ISSM_MPI_Reduce (&J,&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
++	ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
++	J=J_sum;
++
++	/*Assign output pointers: */
++	*presponse=J;
++
++}/*}}}*/
++void FemModel::IrrotationalDirectionMisfitx(IssmDouble* presponse){/*{{{*/
++
++	/*output: */
++	IssmDouble J=0.;
++	IssmDouble J_sum;
++
++	IssmDouble  weight,thicknessobs,thickness,dpotential[2];
++	IssmDouble  vx,vy,vxobs,vyobs,nu;
++	IssmDouble  Jdet;
++	IssmDouble* xyz_list = NULL;
++
++	/*Compute Misfit: */
++	for(int i=0;i<elements->Size();i++){
++		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++
++		/*If on water, return 0: */
++		if(!element->IsIceInElement()) continue;
++
++		/* Get node coordinates*/
++		element->GetVerticesCoordinates(&xyz_list);
++		Input* weights_input     =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
++		Input* potential_input   =element->GetInput(PotentialEnum);                          _assert_(potential_input);
++		Input* vxobs_input       =element->GetInput(BalancethicknessVxObsEnum);              _assert_(vxobs_input);
++		Input* vyobs_input       =element->GetInput(BalancethicknessVyObsEnum);              _assert_(vyobs_input);
++		Input* nu_input          = element->GetInput(BalancethicknessNuEnum);                _assert_(nu_input);
++
++		/* Start  looping on the number of gaussian points: */
++		Gauss* gauss=element->NewGauss(2);
++		for(int ig=gauss->begin();ig<gauss->end();ig++){
++
++			gauss->GaussPoint(ig);
++			element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++
++			/*Get all parameters at gaussian point*/
++			weights_input->GetInputValue(&weight,gauss,IrrotationalDirectionMisfitEnum);
++			potential_input->GetInputDerivativeValue(&dpotential[0],xyz_list,gauss);
++			vxobs_input->GetInputValue(&vxobs,gauss);
++			vyobs_input->GetInputValue(&vyobs,gauss);
++			nu_input->GetInputValue(&nu,gauss);
++
++			/*J = 1/2 (vbar ^ gard(phi))^2*/
++			J += 0.5*(nu*vyobs*dpotential[0] - nu*vxobs*dpotential[1])*(nu*vyobs*dpotential[0] - nu*vxobs*dpotential[1])*weight*Jdet*gauss->weight;
++		}
++
++		/*clean up and Return: */
++		xDelete<IssmDouble>(xyz_list);
++		delete gauss;
++	}
++
++	/*Sum all J from all cpus of the cluster:*/
++	ISSM_MPI_Reduce (&J,&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
++	ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
++	J=J_sum;
++
++	/*Assign output pointers: */
++	*presponse=J;
++
++}/*}}}*/
++void FemModel::IrrotationalVelMisfitx(IssmDouble* presponse){/*{{{*/
++	_error_("not implemented yet");
++}/*}}}*/
++void FemModel::IrrotationalAlongGradientNux(IssmDouble* presponse){/*{{{*/
++	_error_("not implemented yet");
++}/*}}}*/
++void FemModel::IrrotationalAcrossGradientNux(IssmDouble* presponse){/*{{{*/
++	_error_("not implemented yet");
++}/*}}}*/
+ void FemModel::ThicknessAbsGradientx( IssmDouble* pJ){/*{{{*/
+ 
+ 	/*output: */
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18402)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18403)
+@@ -1031,8 +1031,7 @@
+ 				/*No yts conversion*/
+ 				case ThicknessEnum:
+ 				case FrictionCoefficientEnum:
+-				case BalancethicknessNuxEnum:
+-				case BalancethicknessNuyEnum:
++				case BalancethicknessNuEnum:
+ 					if(iomodel->Data(control)){
+ 						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data(control)[tria_vertex_ids[j]-1];
+ 						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i];
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18402)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18403)
+@@ -1053,8 +1053,7 @@
+ 				name==BedEnum ||
+ 				name==BalancethicknessThickeningRateEnum ||
+ 				name==BalancethicknessApparentMassbalanceEnum ||
+-				name==BalancethicknessNuxEnum ||
+-				name==BalancethicknessNuyEnum ||
++				name==BalancethicknessNuEnum ||
+ 				name==SigmaNNEnum ||
+ 				name==SurfaceSlopeXEnum ||
+ 				name==SurfaceSlopeYEnum ||
+Index: ../trunk-jpl/src/c/classes/FemModel.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.h	(revision 18402)
++++ ../trunk-jpl/src/c/classes/FemModel.h	(revision 18403)
+@@ -80,6 +80,11 @@
+ 		void ElementResponsex(IssmDouble* presponse,int response_enum);
+ 		void BalancethicknessMisfitx(IssmDouble* pV);
+ 		void Balancethickness2Misfitx(IssmDouble* pV);
++		void IrrotationalH2Misfitx(IssmDouble* pV);
++		void IrrotationalDirectionMisfitx(IssmDouble* pV);
++		void IrrotationalVelMisfitx(IssmDouble* pV);
++		void IrrotationalAlongGradientNux(IssmDouble* pV);
++		void IrrotationalAcrossGradientNux(IssmDouble* pV);
+ 		#ifdef  _HAVE_DAKOTA_
+ 		void DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses);
+ 		#endif
+Index: ../trunk-jpl/src/m/classes/inversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversion.m	(revision 18402)
++++ ../trunk-jpl/src/m/classes/inversion.m	(revision 18403)
+@@ -131,7 +131,8 @@
+ 			md = checkfield(md,'fieldname','inversion.iscontrol','values',[0 1]);
+ 			md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0 1]);
+ 			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',...
+-				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'DamageDbar' 'Vx' 'Vy' 'Thickness' 'BalancethicknessNux' 'BalancethicknessNuy' 'BalancethicknessApparentMassbalance'});
++				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'DamageDbar' 'Vx' 'Vy' 'Thickness',...
++				'BalancethicknessNux' 'BalancethicknessNuy' 'BalancethicknessApparentMassbalance'});
+ 			md = checkfield(md,'fieldname','inversion.nsteps','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.maxiter_per_step','size',[md.inversion.nsteps 1],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.step_threshold','size',[md.inversion.nsteps 1]);
+Index: ../trunk-jpl/src/m/classes/inversionvalidation.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 18402)
++++ ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 18403)
+@@ -52,8 +52,9 @@
+ 			md = checkfield(md,'fieldname','inversion.iscontrol','values',[0 1]);
+ 			md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0 1]);
+ 			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',...
+-				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'MaterialsRheologyZbar' 'Vx' 'Vy' 'Thickness' 'BalancethicknessApparentMassbalance'});
+-			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:507]);
++				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'DamageDbar' 'Vx' 'Vy' 'Thickness',...
++				'BalancethicknessNu' 'BalancethicknessApparentMassbalance'});
++			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:506 601:604]);
+ 			md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);
+ 			md = checkfield(md,'fieldname','inversion.max_parameters','size',[md.mesh.numberofvertices num_controls]);
+@@ -138,7 +139,11 @@
+ 			pos=find(obj.cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
+ 			pos=find(obj.cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
+ 			pos=find(obj.cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
+-			pos=find(obj.cost_functions==507); data(pos)=Balancethickness2MisfitEnum();
++			pos=find(obj.cost_functions==601); data(pos)=IrrotationalH2MisfitEnum();
++			pos=find(obj.cost_functions==602); data(pos)=IrrotationalDirectionMisfitEnum();
++			pos=find(obj.cost_functions==603); data(pos)=IrrotationalVelMisfitEnum();
++			pos=find(obj.cost_functions==604); data(pos)=IrrotationalAlongGradientNuEnum();
++			pos=find(obj.cost_functions==605); data(pos)=IrrotationalAcrossGradientNuEnum();
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/balancethickness2.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/balancethickness2.m	(revision 18402)
++++ ../trunk-jpl/src/m/classes/balancethickness2.m	(revision 18403)
+@@ -7,8 +7,7 @@
+ 	properties (SetAccess=public) 
+ 		spcpotential         = NaN;
+ 		apparent_massbalance = NaN;
+-		nux                  = NaN;
+-		nuy                  = NaN;
++		nu                  = NaN;
+ 		vx_obs               = NaN;
+ 		vy_obs               = NaN;
+ 		thickness_obs        = NaN;
+@@ -31,8 +30,7 @@
+ 
+ 			md = checkfield(md,'fieldname','balancethickness.spcpotential','size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','balancethickness.apparent_massbalance','size',[md.mesh.numberofvertices 1],'NaN',1);
+-			md = checkfield(md,'fieldname','balancethickness.nux','size',[md.mesh.numberofvertices 1],'NaN',1,'>',0,'<=',1);
+-			md = checkfield(md,'fieldname','balancethickness.nuy','size',[md.mesh.numberofvertices 1],'NaN',1,'>',0,'<=',1);
++			md = checkfield(md,'fieldname','balancethickness.nu','size',[md.mesh.numberofvertices 1],'NaN',1,'>',0,'<=',1);
+ 			md = checkfield(md,'fieldname','balancethickness.vx_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
+ 			md = checkfield(md,'fieldname','balancethickness.vy_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
+ 			md = checkfield(md,'fieldname','balancethickness.thickness_obs','size',[md.mesh.numberofvertices 1],'NaN',1,'>=',0);
+@@ -42,8 +40,7 @@
+ 
+ 			fielddisplay(obj,'spcpotential','potential constraints (NaN means no constraint)');
+ 			fielddisplay(obj,'apparent_massbalance','Apparent mass balance [m/yr]');
+-			fielddisplay(obj,'nux','vx_bar = nux vx_s (in ]0 1])');
+-			fielddisplay(obj,'nuy','vy_bar = nuy vy_s (in ]0 1])');
++			fielddisplay(obj,'nu','v_bar = nu v_s (in ]0 1])');
+ 			fielddisplay(obj,'vx_obs','observed vx');
+ 			fielddisplay(obj,'vy_obs','observed vy');
+ 			fielddisplay(obj,'thickness_obs','observed H');
+@@ -52,10 +49,14 @@
+ 		function marshall(obj,md,fid) % {{{
+ 			WriteData(fid,'object',obj,'class','Balancethickness','fieldname','spcpotential','format','DoubleMat','mattype',1);
+ 			WriteData(fid,'object',obj,'class','Balancethickness','fieldname','apparent_massbalance','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','Balancethickness','fieldname','nux','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','Balancethickness','fieldname','nuy','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','Balancethickness','fieldname','vx_obs','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','Balancethickness','fieldname','vy_obs','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'class','Balancethickness','fieldname','nu','format','DoubleMat','mattype',1);
++			if(numel(obj.vx_obs)==md.mesh.numberofelements),
++				mattype=2;
++			else
++				mattype=1;
++			end
++			WriteData(fid,'object',obj,'class','Balancethickness','fieldname','vx_obs','format','DoubleMat','mattype',mattype);
++			WriteData(fid,'object',obj,'class','Balancethickness','fieldname','vy_obs','format','DoubleMat','mattype',mattype);
+ 			WriteData(fid,'object',obj,'class','Balancethickness','fieldname','thickness_obs','format','DoubleMat','mattype',1);
+ 		end % }}}
+ 	end
+Index: ../trunk-jpl/src/m/enum/BalancethicknessNuxEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BalancethicknessNuxEnum.m	(revision 18402)
++++ ../trunk-jpl/src/m/enum/BalancethicknessNuxEnum.m	(revision 18403)
+@@ -1,11 +0,0 @@
+-function macro=BalancethicknessNuxEnum()
+-%BALANCETHICKNESSNUXENUM - Enum of BalancethicknessNux
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=BalancethicknessNuxEnum()
+-
+-macro=StringToEnum('BalancethicknessNux');
+Index: ../trunk-jpl/src/m/enum/BalancethicknessNuyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BalancethicknessNuyEnum.m	(revision 18402)
++++ ../trunk-jpl/src/m/enum/BalancethicknessNuyEnum.m	(revision 18403)
+@@ -1,11 +0,0 @@
+-function macro=BalancethicknessNuyEnum()
+-%BALANCETHICKNESSNUYENUM - Enum of BalancethicknessNuy
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=BalancethicknessNuyEnum()
+-
+-macro=StringToEnum('BalancethicknessNuy');
+Index: ../trunk-jpl/src/m/enum/IrrotationalDirectionMisfitEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/IrrotationalDirectionMisfitEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/IrrotationalDirectionMisfitEnum.m	(revision 18403)
+@@ -0,0 +1,11 @@
++function macro=IrrotationalDirectionMisfitEnum()
++%IRROTATIONALDIRECTIONMISFITENUM - Enum of IrrotationalDirectionMisfit
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=IrrotationalDirectionMisfitEnum()
++
++macro=StringToEnum('IrrotationalDirectionMisfit');
+Index: ../trunk-jpl/src/m/enum/IrrotationalAcrossGradientNuEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/IrrotationalAcrossGradientNuEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/IrrotationalAcrossGradientNuEnum.m	(revision 18403)
+@@ -0,0 +1,11 @@
++function macro=IrrotationalAcrossGradientNuEnum()
++%IRROTATIONALACROSSGRADIENTNUENUM - Enum of IrrotationalAcrossGradientNu
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=IrrotationalAcrossGradientNuEnum()
++
++macro=StringToEnum('IrrotationalAcrossGradientNu');
+Index: ../trunk-jpl/src/m/enum/IrrotationalAlongGradientNuEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/IrrotationalAlongGradientNuEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/IrrotationalAlongGradientNuEnum.m	(revision 18403)
+@@ -0,0 +1,11 @@
++function macro=IrrotationalAlongGradientNuEnum()
++%IRROTATIONALALONGGRADIENTNUENUM - Enum of IrrotationalAlongGradientNu
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=IrrotationalAlongGradientNuEnum()
++
++macro=StringToEnum('IrrotationalAlongGradientNu');
+Index: ../trunk-jpl/src/m/enum/IrrotationalH2MisfitEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/IrrotationalH2MisfitEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/IrrotationalH2MisfitEnum.m	(revision 18403)
+@@ -0,0 +1,11 @@
++function macro=IrrotationalH2MisfitEnum()
++%IRROTATIONALH2MISFITENUM - Enum of IrrotationalH2Misfit
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=IrrotationalH2MisfitEnum()
++
++macro=StringToEnum('IrrotationalH2Misfit');
+Index: ../trunk-jpl/src/m/enum/IrrotationalVelMisfitEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/IrrotationalVelMisfitEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/IrrotationalVelMisfitEnum.m	(revision 18403)
+@@ -0,0 +1,11 @@
++function macro=IrrotationalVelMisfitEnum()
++%IRROTATIONALVELMISFITENUM - Enum of IrrotationalVelMisfit
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=IrrotationalVelMisfitEnum()
++
++macro=StringToEnum('IrrotationalVelMisfit');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18402)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18403)
+@@ -300,8 +300,12 @@
+ def BalancethicknessSpcpotentialEnum(): return StringToEnum("BalancethicknessSpcpotential")[0]
+ def BalancethicknessApparentMassbalanceEnum(): return StringToEnum("BalancethicknessApparentMassbalance")[0]
+ def Balancethickness2MisfitEnum(): return StringToEnum("Balancethickness2Misfit")[0]
+-def BalancethicknessNuxEnum(): return StringToEnum("BalancethicknessNux")[0]
+-def BalancethicknessNuyEnum(): return StringToEnum("BalancethicknessNuy")[0]
++def IrrotationalH2MisfitEnum(): return StringToEnum("IrrotationalH2Misfit")[0]
++def IrrotationalDirectionMisfitEnum(): return StringToEnum("IrrotationalDirectionMisfit")[0]
++def IrrotationalVelMisfitEnum(): return StringToEnum("IrrotationalVelMisfit")[0]
++def IrrotationalAlongGradientNuEnum(): return StringToEnum("IrrotationalAlongGradientNu")[0]
++def IrrotationalAcrossGradientNuEnum(): return StringToEnum("IrrotationalAcrossGradientNu")[0]
++def BalancethicknessNuEnum(): return StringToEnum("BalancethicknessNu")[0]
+ def BalancethicknessVxObsEnum(): return StringToEnum("BalancethicknessVxObs")[0]
+ def BalancethicknessVyObsEnum(): return StringToEnum("BalancethicknessVyObs")[0]
+ def BalancethicknessThicknessObsEnum(): return StringToEnum("BalancethicknessThicknessObs")[0]
+Index: ../trunk-jpl/src/m/enum/BalancethicknessNuEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BalancethicknessNuEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/BalancethicknessNuEnum.m	(revision 18403)
+@@ -0,0 +1,11 @@
++function macro=BalancethicknessNuEnum()
++%BALANCETHICKNESSNUENUM - Enum of BalancethicknessNu
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=BalancethicknessNuEnum()
++
++macro=StringToEnum('BalancethicknessNu');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18403-18404.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18403-18404.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18403-18404.diff	(revision 19102)
@@ -0,0 +1,156 @@
+Index: ../trunk-jpl/configs/config-macosx64-static.sh
+===================================================================
+--- ../trunk-jpl/configs/config-macosx64-static.sh	(revision 0)
++++ ../trunk-jpl/configs/config-macosx64-static.sh	(revision 18404)
+@@ -0,0 +1,22 @@
++#!/bin/sh
++
++#petsc 3.2
++#mpich 1.4
++
++./configure \
++	--prefix=$ISSM_DIR \
++   --disable-static \
++   --enable-standalone-executables \
++   --enable-standalone-libraries \
++	--with-matlab-dir=$MATLAB_DIR \
++	--with-triangle-dir=$ISSM_DIR/externalpackages/triangle/install \
++	--with-metis-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-petsc-dir=$ISSM_DIR/externalpackages/petsc/install  \
++   --with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-mpi-include=$ISSM_DIR/externalpackages/mpich/install/include  \
++	--with-mpi-libflags=" -L$ISSM_DIR/externalpackages/mpich/install/lib -lmpich -lpmpich" \
++	--with-scalapack-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install \
++   --with-fortran-lib="/usr/local/lib/libgfortran.a" \
++   --enable-debugging \
++	--with-numthreads=4
+
+Property changes on: ../trunk-jpl/configs/config-macosx64-static.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 0)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18404)
+@@ -0,0 +1,110 @@
++#!/bin/bash
++
++ISSM_ARCH='macosx64'
++
++# Environment Variables
++#
++# ISSM_DIR and MATLAB_DIR must be set correctly.
++# {{{
++if [ "${ISSM_DIR}x" == "x" ]; then
++   echo "ISSM_DIR is not set!" >&2
++   exit 1;
++elif [ -d ${ISSM_DIR} ]; then
++   echo "ISSM_DIR: ${ISSM_DIR}"
++else
++   echo "ISSM_DIR: ${ISSM_DIR} does not exist!" >&2
++   exit 1;
++fi
++
++if [ "${MATLAB_DIR}x" == "x" ]; then
++   echo "MATLAB_DIR is not set!"
++   exit 1;
++elif [ -d ${MATLAB_DIR} ]; then
++   echo "MATLAB_DIR: ${MATLAB_DIR}"
++else
++   echo "MATLAB_DIR: ${MATLAB_DIR} does not exist!" >&2
++   exit 1;
++fi
++# }}}
++
++cd $ISSM_DIR
++
++# Externalpackages
++# {{{
++echo 'Installing external packages...'
++
++cd "$ISSM_DIR/externalpackages/cmake"
++echo '---------------------------------'
++echo "Installing CMAKE"
++echo '---------------------------------'
++./install.sh &> /dev/null
++
++if [ $? -ne 0 ]; then
++   echo "FAILED TO INSTALL CMAKE!"
++   exit 1;
++fi
++
++cd "$ISSM_DIR/externalpackages/autotools"
++echo '---------------------------------'
++echo "Installing Autotools"
++echo '---------------------------------'
++./install.sh &> /dev/null
++
++if [ $? -ne 0 ]; then
++   echo "FAILED TO INSTALL AUTOTOOLS!"
++   exit 1;
++fi
++
++source $ISSM_DIR/etc/environment.sh
++
++cd "$ISSM_DIR/externalpackages/triangle"
++echo '---------------------------------'
++echo "Installing Triangle"
++echo '---------------------------------'
++./install-macosx64.sh &> /dev/null
++
++if [ $? -ne 0 ]; then
++   echo "FAILED TO INSTALL TRIANGLE!"
++   exit 1;
++fi
++
++cd "$ISSM_DIR/externalpackages/mpich"
++echo '---------------------------------'
++echo "Installing MPICH"
++echo '---------------------------------'
++./install-3.0-macosx64-static.sh &> /dev/null
++
++if [ $? -ne 0 ]; then
++   echo "FAILED TO INSTALL MPICH!"
++   exit 1;
++fi
++
++cd "$ISSM_DIR/externalpackages/petsc"
++echo '---------------------------------'
++echo "Installing PETSc"
++echo '---------------------------------'
++./install-3.5-macosx64-static.sh &> /dev/null
++
++if [ $? -ne 0 ]; then
++   echo "FAILED TO INSTALL PETSC!"
++   exit 1;
++fi
++
++export MATLAB_DIR
++# }}}
++
++source $ISSM_DIR/etc/environment.sh
++
++cd $ISSM_DIR
++
++echo "Aureconf..."
++autoreconf -if &> /dev/null
++
++echo "Configuring..."
++$ISSM_DIR/configs/config-macosx64-static.sh &> /dev/null
++
++echo "Building..."
++make $1 &> /dev/null
++
++echo "Installing..."
++make install &> /dev/null
+
+Property changes on: ../trunk-jpl/packagers/macosx/install.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18404-18405.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18404-18405.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18404-18405.diff	(revision 19102)
@@ -0,0 +1,64 @@
+Index: ../trunk-jpl/src/m/classes/inversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversion.m	(revision 18404)
++++ ../trunk-jpl/src/m/classes/inversion.m	(revision 18405)
+@@ -132,11 +132,11 @@
+ 			md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0 1]);
+ 			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',...
+ 				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'DamageDbar' 'Vx' 'Vy' 'Thickness',...
+-				'BalancethicknessNux' 'BalancethicknessNuy' 'BalancethicknessApparentMassbalance'});
++				'BalancethicknessNu' 'BalancethicknessApparentMassbalance'});
+ 			md = checkfield(md,'fieldname','inversion.nsteps','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.maxiter_per_step','size',[md.inversion.nsteps 1],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.step_threshold','size',[md.inversion.nsteps 1]);
+-			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:507]);
++			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:506 601:604]);
+ 			md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.gradient_scaling','size',[md.inversion.nsteps num_controls]);
+ 			md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);
+@@ -238,7 +238,11 @@
+ 			pos=find(obj.cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
+ 			pos=find(obj.cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
+ 			pos=find(obj.cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
+-			pos=find(obj.cost_functions==507); data(pos)=Balancethickness2MisfitEnum();
++			pos=find(obj.cost_functions==601); data(pos)=IrrotationalH2MisfitEnum();
++			pos=find(obj.cost_functions==602); data(pos)=IrrotationalDirectionMisfitEnum();
++			pos=find(obj.cost_functions==603); data(pos)=IrrotationalVelMisfitEnum();
++			pos=find(obj.cost_functions==604); data(pos)=IrrotationalAlongGradientNuEnum();
++			pos=find(obj.cost_functions==605); data(pos)=IrrotationalAcrossGradientNuEnum();
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/m1qn3inversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 18404)
++++ ../trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 18405)
+@@ -70,12 +70,13 @@
+ 			md = checkfield(md,'fieldname','inversion.iscontrol','values',[0 1]);
+ 			md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0 1]);
+ 			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',...
+-				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'MaterialsRheologyZbar' 'Vx' 'Vy' 'Thickness' 'BalancethicknessApparentMassbalance'});
++				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'DamageDbar',...
++				'Vx' 'Vy' 'Thickness' 'BalancethicknessNu' 'BalancethicknessApparentMassbalance'});
+ 			md = checkfield(md,'fieldname','inversion.maxsteps','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.maxiter','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.dxmin','numel',1,'>',0);
+ 			md = checkfield(md,'fieldname','inversion.gttol','numel',1,'>',0);
+-			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:507]);
++			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:506 601:604]);
+ 			md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);
+ 			md = checkfield(md,'fieldname','inversion.max_parameters','size',[md.mesh.numberofvertices num_controls]);
+@@ -168,7 +169,11 @@
+ 			pos=find(obj.cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
+ 			pos=find(obj.cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
+ 			pos=find(obj.cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
+-			pos=find(obj.cost_functions==507); data(pos)=Balancethickness2MisfitEnum();
++			pos=find(obj.cost_functions==601); data(pos)=IrrotationalH2MisfitEnum();
++			pos=find(obj.cost_functions==602); data(pos)=IrrotationalDirectionMisfitEnum();
++			pos=find(obj.cost_functions==603); data(pos)=IrrotationalVelMisfitEnum();
++			pos=find(obj.cost_functions==604); data(pos)=IrrotationalAlongGradientNuEnum();
++			pos=find(obj.cost_functions==605); data(pos)=IrrotationalAcrossGradientNuEnum();
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+ 		end % }}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18405-18406.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18405-18406.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18405-18406.diff	(revision 19102)
@@ -0,0 +1,48 @@
+Index: ../trunk-jpl/externalpackages/mpich/install-3.0-macosx64-static.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/mpich/install-3.0-macosx64-static.sh	(revision 18405)
++++ ../trunk-jpl/externalpackages/mpich/install-3.0-macosx64-static.sh	(revision 18406)
+@@ -18,11 +18,8 @@
+ #Configure mpich
+ cd src
+ ./configure \
+-	--prefix="$ISSM_DIR/externalpackages/mpich/install" \
+-	--enable-shared
++	--prefix="$ISSM_DIR/externalpackages/mpich/install"
+ 
+-	#CC=llvm-gcc \
+-
+ #Compile mpich (this new version supports parallel make)
+ if [ $# -eq 0 ]; then
+ 	make
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18405)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18406)
+@@ -37,7 +37,7 @@
+ echo '---------------------------------'
+ echo "Installing CMAKE"
+ echo '---------------------------------'
+-./install.sh &> /dev/null
++./install.sh $1 &> /dev/null
+ 
+ if [ $? -ne 0 ]; then
+    echo "FAILED TO INSTALL CMAKE!"
+@@ -72,7 +72,7 @@
+ echo '---------------------------------'
+ echo "Installing MPICH"
+ echo '---------------------------------'
+-./install-3.0-macosx64-static.sh &> /dev/null
++./install-3.0-macosx64-static.sh $1 &> /dev/null
+ 
+ if [ $? -ne 0 ]; then
+    echo "FAILED TO INSTALL MPICH!"
+@@ -83,7 +83,7 @@
+ echo '---------------------------------'
+ echo "Installing PETSc"
+ echo '---------------------------------'
+-./install-3.5-macosx64-static.sh &> /dev/null
++./install-3.5-macosx64-static.sh $1 &> /dev/null
+ 
+ if [ $? -ne 0 ]; then
+    echo "FAILED TO INSTALL PETSC!"
Index: /issm/oecreview/Archive/18296-19100/ISSM-18406-18407.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18406-18407.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18406-18407.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18406)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18407)
+@@ -83,7 +83,7 @@
+ echo '---------------------------------'
+ echo "Installing PETSc"
+ echo '---------------------------------'
+-./install-3.5-macosx64-static.sh $1 &> /dev/null
++./install-3.5-macosx64-static.sh &> /dev/null
+ 
+ if [ $? -ne 0 ]; then
+    echo "FAILED TO INSTALL PETSC!"
Index: /issm/oecreview/Archive/18296-19100/ISSM-18407-18408.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18407-18408.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18407-18408.diff	(revision 19102)
@@ -0,0 +1,50 @@
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18407)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18408)
+@@ -31,7 +31,7 @@
+ 
+ # Externalpackages
+ # {{{
+-echo 'Installing external packages...'
++echo "\nInstalling external packages...\n"
+ 
+ cd "$ISSM_DIR/externalpackages/cmake"
+ echo '---------------------------------'
+@@ -100,11 +100,35 @@
+ echo "Aureconf..."
+ autoreconf -if &> /dev/null
+ 
++if [ $? -ne 0 ]; then
++   echo "FAILED TO AUTORECONF!"
++   exit 1;
++fi
++
+ echo "Configuring..."
+ $ISSM_DIR/configs/config-macosx64-static.sh &> /dev/null
+ 
++if [ $? -ne 0 ]; then
++   echo "FAILED TO CONFIGURE!"
++   exit 1;
++fi
++
+ echo "Building..."
+-make $1 &> /dev/null
++if [ -z $1 ]; then
++   make -j$1 &> /dev/null
++else
++   make &> /dev/null
++fi
+ 
++if [ $? -ne 0 ]; then
++   echo "FAILED TO BUILD!"
++   exit 1;
++fi
++
+ echo "Installing..."
+ make install &> /dev/null
++
++if [ $? -ne 0 ]; then
++   echo "FAILED TO INSTALL!"
++   exit 1;
++fi
Index: /issm/oecreview/Archive/18296-19100/ISSM-18408-18409.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18408-18409.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18408-18409.diff	(revision 19102)
@@ -0,0 +1,35 @@
+Index: ../trunk-jpl/configs/config-macosx64-static.sh
+===================================================================
+--- ../trunk-jpl/configs/config-macosx64-static.sh	(revision 18408)
++++ ../trunk-jpl/configs/config-macosx64-static.sh	(revision 18409)
+@@ -1,8 +1,5 @@
+ #!/bin/sh
+ 
+-#petsc 3.2
+-#mpich 1.4
+-
+ ./configure \
+ 	--prefix=$ISSM_DIR \
+    --disable-static \
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18408)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18409)
+@@ -31,8 +31,16 @@
+ 
+ # Externalpackages
+ # {{{
+-echo "\nInstalling external packages...\n"
++echo ""
++echo "Installing external packages..."
++echo ""
+ 
++cd "$ISSM_DIR/externalpackages/matlab"
++echo '---------------------------------'
++echo "Linking Matlab"
++echo '---------------------------------'
++ln -s $MATLAB_DIR ./install
++
+ cd "$ISSM_DIR/externalpackages/cmake"
+ echo '---------------------------------'
+ echo "Installing CMAKE"
Index: /issm/oecreview/Archive/18296-19100/ISSM-18409-18410.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18409-18410.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18409-18410.diff	(revision 19102)
@@ -0,0 +1,21 @@
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18409)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18410)
+@@ -1,7 +1,5 @@
+ #!/bin/bash
+ 
+-ISSM_ARCH='macosx64'
+-
+ # Environment Variables
+ #
+ # ISSM_DIR and MATLAB_DIR must be set correctly.
+@@ -97,8 +95,6 @@
+    echo "FAILED TO INSTALL PETSC!"
+    exit 1;
+ fi
+-
+-export MATLAB_DIR
+ # }}}
+ 
+ source $ISSM_DIR/etc/environment.sh
Index: /issm/oecreview/Archive/18296-19100/ISSM-18410-18411.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18410-18411.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18410-18411.diff	(revision 19102)
@@ -0,0 +1,201 @@
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18410)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18411)
+@@ -1,7 +1,5 @@
+ #!/bin/bash
+ 
+-# Environment Variables
+-#
+ # ISSM_DIR and MATLAB_DIR must be set correctly.
+ # {{{
+ if [ "${ISSM_DIR}x" == "x" ]; then
+@@ -25,114 +23,97 @@
+ fi
+ # }}}
+ 
+-cd $ISSM_DIR
++#List of external pakages to be installed and their installation scripts
++EXTERNALPACKAGES="autotools install.sh                
++                  mpich     install-3.0-macosx64-static.sh
++                  cmake     install.sh                
++                  petsc     install-3.5-macosx64-static.sh
++                  triangle  install-macosx64.sh "
+ 
+-# Externalpackages
++# Install Externalpackages
+ # {{{
+-echo ""
+-echo "Installing external packages..."
+-echo ""
++cd $ISSM_DIR/externalpackages
+ 
+-cd "$ISSM_DIR/externalpackages/matlab"
+-echo '---------------------------------'
+-echo "Linking Matlab"
+-echo '---------------------------------'
+-ln -s $MATLAB_DIR ./install
++#number of packages: 
++NUMPACKAGES=$(($(echo $EXTERNALPACKAGES | wc -w )/2))
+ 
+-cd "$ISSM_DIR/externalpackages/cmake"
+-echo '---------------------------------'
+-echo "Installing CMAKE"
+-echo '---------------------------------'
+-./install.sh $1 &> /dev/null
++for ((i=1;i<=$NUMPACKAGES;i++))
++do
++	NUM1=$((2*$i-1))
++	NUM2=$((2*$i))
++	PACKAGENAME=$(echo $EXTERNALPACKAGES | cut -d " " -f $NUM1-$NUM1)
++	PACKAGEINST=$(echo $EXTERNALPACKAGES | cut -d " " -f $NUM2-$NUM2)
+ 
+-if [ $? -ne 0 ]; then
+-   echo "FAILED TO INSTALL CMAKE!"
+-   exit 1;
+-fi
++	cd $PACKAGENAME
+ 
+-cd "$ISSM_DIR/externalpackages/autotools"
+-echo '---------------------------------'
+-echo "Installing Autotools"
+-echo '---------------------------------'
+-./install.sh &> /dev/null
++	#tricky part here. We do not want to reinstall this package if it's already installed
++	#and the svn file which does the install has not be modified! To keep track of 
++	#this, we check the current svn version against the "last changed" revision number.  If they 
++	#are the same, we reinstall the package. 
++	current_version=`svnversion`
++	last_changed_version=`svn info $PACKAGEINST | grep "Last Changed Rev" | awk '{printf("%s\n",$4);}'`
+ 
+-if [ $? -ne 0 ]; then
+-   echo "FAILED TO INSTALL AUTOTOOLS!"
+-   exit 1;
+-fi
++	if [[ $current_version == $last_changed_version ]]; then 
++		#go ahead and reinstall. 
++		echo "For $PACKAGENAME: svn current_version  is $current_version and last changed version is $last_changed_version"
++		echo "Triggering new install of $PACKAGENAME"
++		install_test=1
++	else
++		#ok, we want to skip, unless the package is not installed: 
++		if [ -d install ]; then 
++			#could be empty, signaling a failed previous install: 
++			if [ "$(ls -A install)" ];then
++				echo "For $PACKAGENAME: svn current_version  is $current_version and last changed version is $last_changed_version"
++				echo "and install directory exists, so skipping install of $PACKAGENAME"
++				install_test=0;
++			else
++				echo "For $PACKAGENAME: svn current_version  is $current_version and last changed version is $last_changed_version"
++				echo "and install directory exists, however, it is empty, so triggering install of $PACKAGENAME"
++				install_test=1;
++			fi
++		else
++			echo "For $PACKAGENAME: svn current_version  is $current_version and last changed version is $last_changed_version"
++			echo "However, install directory does not exist, so triggering install of $PACKAGENAME"
++			install_test=1;
++		fi
++	fi
+ 
++	if [[ $install_test == 1 ]]; then 
++		echo "======================================================";
++		echo "       Installing $PACKAGENAME                        ";
++		echo "======================================================";
++		./$PACKAGEINST |  tee compil.log
++		if [ $? -ne 0 ]; then
++			echo "======================================================";
++			echo "    ERROR: installation of $PACKAGENAME failed        ";
++			echo "======================================================";
++			#erase install directory, so that next time, we still try and compile this!
++			rm -rf install
++		fi
++		source $ISSM_DIR/etc/environment.sh
++	else
++		echo "======================================================";
++		echo "       Skipping install of $PACKAGENAME                        ";
++		echo "======================================================";
++	fi
++	cd ..
++done
+ source $ISSM_DIR/etc/environment.sh
+-
+-cd "$ISSM_DIR/externalpackages/triangle"
+-echo '---------------------------------'
+-echo "Installing Triangle"
+-echo '---------------------------------'
+-./install-macosx64.sh &> /dev/null
+-
+-if [ $? -ne 0 ]; then
+-   echo "FAILED TO INSTALL TRIANGLE!"
+-   exit 1;
+-fi
+-
+-cd "$ISSM_DIR/externalpackages/mpich"
+-echo '---------------------------------'
+-echo "Installing MPICH"
+-echo '---------------------------------'
+-./install-3.0-macosx64-static.sh $1 &> /dev/null
+-
+-if [ $? -ne 0 ]; then
+-   echo "FAILED TO INSTALL MPICH!"
+-   exit 1;
+-fi
+-
+-cd "$ISSM_DIR/externalpackages/petsc"
+-echo '---------------------------------'
+-echo "Installing PETSc"
+-echo '---------------------------------'
+-./install-3.5-macosx64-static.sh &> /dev/null
+-
+-if [ $? -ne 0 ]; then
+-   echo "FAILED TO INSTALL PETSC!"
+-   exit 1;
+-fi
+ # }}}
+ 
+-source $ISSM_DIR/etc/environment.sh
+-
+-cd $ISSM_DIR
+-
++# Compile ISSM
++#{{{
+ echo "Aureconf..."
+ autoreconf -if &> /dev/null
+-
+-if [ $? -ne 0 ]; then
+-   echo "FAILED TO AUTORECONF!"
+-   exit 1;
+-fi
+-
+ echo "Configuring..."
+ $ISSM_DIR/configs/config-macosx64-static.sh &> /dev/null
++if [ $? -ne 0 ]; then echo "FAILED TO CONFIGURE!" && exit 1; fi
+ 
+-if [ $? -ne 0 ]; then
+-   echo "FAILED TO CONFIGURE!"
+-   exit 1;
+-fi
+-
+ echo "Building..."
+-if [ -z $1 ]; then
+-   make -j$1 &> /dev/null
+-else
+-   make &> /dev/null
+-fi
++make -j 4 
++if [ $? -ne 0 ]; then echo "FAILED TO BUILD!" && exit 1; fi
+ 
+-if [ $? -ne 0 ]; then
+-   echo "FAILED TO BUILD!"
+-   exit 1;
+-fi
+-
+ echo "Installing..."
+ make install &> /dev/null
+-
+-if [ $? -ne 0 ]; then
+-   echo "FAILED TO INSTALL!"
+-   exit 1;
+-fi
++if [ $? -ne 0 ]; then echo "FAILED TO INSTALL!" && exit 1; fi
++#}}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18411-18412.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18411-18412.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18411-18412.diff	(revision 19102)
@@ -0,0 +1,17 @@
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18411)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18412)
+@@ -103,10 +103,11 @@
+ 
+ # Compile ISSM
+ #{{{
++cd $ISSM_DIR
+ echo "Aureconf..."
+ autoreconf -if &> /dev/null
+ echo "Configuring..."
+-$ISSM_DIR/configs/config-macosx64-static.sh &> /dev/null
++$ISSM_DIR/configs/config-macosx64-static.sh
+ if [ $? -ne 0 ]; then echo "FAILED TO CONFIGURE!" && exit 1; fi
+ 
+ echo "Building..."
Index: /issm/oecreview/Archive/18296-19100/ISSM-18412-18413.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18412-18413.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18412-18413.diff	(revision 19102)
@@ -0,0 +1,40 @@
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18412)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18413)
+@@ -105,9 +105,25 @@
+ #{{{
+ cd $ISSM_DIR
+ echo "Aureconf..."
+-autoreconf -if &> /dev/null
++autoreconf -if
+ echo "Configuring..."
+-$ISSM_DIR/configs/config-macosx64-static.sh
++./configure \
++	--prefix=$ISSM_DIR \
++	--disable-static \
++	--enable-standalone-executables \
++	--enable-standalone-libraries \
++	--with-matlab-dir="/Applications/MATLAB_R2011b.app/" \
++	--with-triangle-dir=$ISSM_DIR/externalpackages/triangle/install \
++	--with-metis-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-petsc-dir=$ISSM_DIR/externalpackages/petsc/install  \
++	--with-mpi-include=$ISSM_DIR/externalpackages/mpich/install/include  \
++	--with-mpi-libflags=" -L$ISSM_DIR/externalpackages/mpich/install/lib -lmpich -lpmpich" \
++	--with-scalapack-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-fortran-lib="/usr/local/lib/libgfortran.a" \
++	--enable-debugging \
++	--with-numthreads=4
++
+ if [ $? -ne 0 ]; then echo "FAILED TO CONFIGURE!" && exit 1; fi
+ 
+ echo "Building..."
+@@ -115,6 +131,6 @@
+ if [ $? -ne 0 ]; then echo "FAILED TO BUILD!" && exit 1; fi
+ 
+ echo "Installing..."
+-make install &> /dev/null
++make install 
+ if [ $? -ne 0 ]; then echo "FAILED TO INSTALL!" && exit 1; fi
+ #}}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18413-18414.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18413-18414.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18413-18414.diff	(revision 19102)
@@ -0,0 +1,18 @@
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18413)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18414)
+@@ -116,10 +116,11 @@
+ 	--with-triangle-dir=$ISSM_DIR/externalpackages/triangle/install \
+ 	--with-metis-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-petsc-dir=$ISSM_DIR/externalpackages/petsc/install  \
++	--with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-scalapack-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-mpi-include=$ISSM_DIR/externalpackages/mpich/install/include  \
+ 	--with-mpi-libflags=" -L$ISSM_DIR/externalpackages/mpich/install/lib -lmpich -lpmpich" \
+-	--with-scalapack-dir=$ISSM_DIR/externalpackages/petsc/install \
+-	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-fortran-lib="/usr/local/lib/libgfortran.a" \
+ 	--enable-debugging \
+ 	--with-numthreads=4
Index: /issm/oecreview/Archive/18296-19100/ISSM-18414-18415.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18414-18415.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18414-18415.diff	(revision 19102)
@@ -0,0 +1,24 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh	(revision 18414)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh	(revision 18415)
+@@ -27,7 +27,6 @@
+ 	--download-metis=1 \
+ 	--download-parmetis=1 \
+ 	--download-mumps=1 \
+-   --download-fblaslapack=yes \
+ 	--download-scalapack=1
+ 
+ #Compile and intall
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18414)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18415)
+@@ -116,7 +116,6 @@
+ 	--with-triangle-dir=$ISSM_DIR/externalpackages/triangle/install \
+ 	--with-metis-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-petsc-dir=$ISSM_DIR/externalpackages/petsc/install  \
+-	--with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-scalapack-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-mpi-include=$ISSM_DIR/externalpackages/mpich/install/include  \
Index: /issm/oecreview/Archive/18296-19100/ISSM-18415-18416.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18415-18416.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18415-18416.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18415)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18416)
+@@ -116,6 +116,7 @@
+ 	--with-triangle-dir=$ISSM_DIR/externalpackages/triangle/install \
+ 	--with-metis-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-petsc-dir=$ISSM_DIR/externalpackages/petsc/install  \
++	--with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-scalapack-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-mpi-include=$ISSM_DIR/externalpackages/mpich/install/include  \
Index: /issm/oecreview/Archive/18296-19100/ISSM-18416-18417.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18416-18417.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18416-18417.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh	(revision 18416)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh	(revision 18417)
+@@ -27,6 +27,7 @@
+ 	--download-metis=1 \
+ 	--download-parmetis=1 \
+ 	--download-mumps=1 \
++	--download-fblaslapack=1 \
+ 	--download-scalapack=1
+ 
+ #Compile and intall
Index: /issm/oecreview/Archive/18296-19100/ISSM-18417-18418.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18417-18418.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18417-18418.diff	(revision 19102)
@@ -0,0 +1,39 @@
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18417)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18418)
+@@ -46,16 +46,8 @@
+ 
+ 	cd $PACKAGENAME
+ 
+-	#tricky part here. We do not want to reinstall this package if it's already installed
+-	#and the svn file which does the install has not be modified! To keep track of 
+-	#this, we check the current svn version against the "last changed" revision number.  If they 
+-	#are the same, we reinstall the package. 
+-	current_version=`svnversion`
+-	last_changed_version=`svn info $PACKAGEINST | grep "Last Changed Rev" | awk '{printf("%s\n",$4);}'`
+-
+-	if [[ $current_version == $last_changed_version ]]; then 
++	if [[ $PACKAGEINST -nt  install ]]; then 
+ 		#go ahead and reinstall. 
+-		echo "For $PACKAGENAME: svn current_version  is $current_version and last changed version is $last_changed_version"
+ 		echo "Triggering new install of $PACKAGENAME"
+ 		install_test=1
+ 	else
+@@ -63,16 +55,13 @@
+ 		if [ -d install ]; then 
+ 			#could be empty, signaling a failed previous install: 
+ 			if [ "$(ls -A install)" ];then
+-				echo "For $PACKAGENAME: svn current_version  is $current_version and last changed version is $last_changed_version"
+ 				echo "and install directory exists, so skipping install of $PACKAGENAME"
+ 				install_test=0;
+ 			else
+-				echo "For $PACKAGENAME: svn current_version  is $current_version and last changed version is $last_changed_version"
+ 				echo "and install directory exists, however, it is empty, so triggering install of $PACKAGENAME"
+ 				install_test=1;
+ 			fi
+ 		else
+-			echo "For $PACKAGENAME: svn current_version  is $current_version and last changed version is $last_changed_version"
+ 			echo "However, install directory does not exist, so triggering install of $PACKAGENAME"
+ 			install_test=1;
+ 		fi
Index: /issm/oecreview/Archive/18296-19100/ISSM-18418-18419.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18418-18419.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18418-18419.diff	(revision 19102)
@@ -0,0 +1,16 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh	(revision 18418)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh	(revision 18419)
+@@ -27,9 +27,10 @@
+ 	--download-metis=1 \
+ 	--download-parmetis=1 \
+ 	--download-mumps=1 \
+-	--download-fblaslapack=1 \
+ 	--download-scalapack=1
+ 
++#--download-fblaslapack=1 \
++
+ #Compile and intall
+ make
+ make install
Index: /issm/oecreview/Archive/18296-19100/ISSM-18419-18420.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18419-18420.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18419-18420.diff	(revision 19102)
@@ -0,0 +1,33 @@
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18419)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18420)
+@@ -32,8 +32,10 @@
+ 
+ # Install Externalpackages
+ # {{{
+-cd $ISSM_DIR/externalpackages
+ 
++#Files source environment to make sure installed packages are in PATH
++source $ISSM_DIR/etc/environment.sh
++
+ #number of packages: 
+ NUMPACKAGES=$(($(echo $EXTERNALPACKAGES | wc -w )/2))
+ 
+@@ -44,7 +46,7 @@
+ 	PACKAGENAME=$(echo $EXTERNALPACKAGES | cut -d " " -f $NUM1-$NUM1)
+ 	PACKAGEINST=$(echo $EXTERNALPACKAGES | cut -d " " -f $NUM2-$NUM2)
+ 
+-	cd $PACKAGENAME
++	cd $ISSM_DIR/externalpackages$PACKAGENAME
+ 
+ 	if [[ $PACKAGEINST -nt  install ]]; then 
+ 		#go ahead and reinstall. 
+@@ -87,7 +89,6 @@
+ 	fi
+ 	cd ..
+ done
+-source $ISSM_DIR/etc/environment.sh
+ # }}}
+ 
+ # Compile ISSM
Index: /issm/oecreview/Archive/18296-19100/ISSM-18420-18421.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18420-18421.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18420-18421.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18420)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18421)
+@@ -46,7 +46,7 @@
+ 	PACKAGENAME=$(echo $EXTERNALPACKAGES | cut -d " " -f $NUM1-$NUM1)
+ 	PACKAGEINST=$(echo $EXTERNALPACKAGES | cut -d " " -f $NUM2-$NUM2)
+ 
+-	cd $ISSM_DIR/externalpackages$PACKAGENAME
++	cd $ISSM_DIR/externalpackages/$PACKAGENAME
+ 
+ 	if [[ $PACKAGEINST -nt  install ]]; then 
+ 		#go ahead and reinstall. 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18421-18422.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18421-18422.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18421-18422.diff	(revision 19102)
@@ -0,0 +1,21 @@
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18421)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18422)
+@@ -106,7 +106,6 @@
+ 	--with-triangle-dir=$ISSM_DIR/externalpackages/triangle/install \
+ 	--with-metis-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-petsc-dir=$ISSM_DIR/externalpackages/petsc/install  \
+-	--with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-scalapack-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-mpi-include=$ISSM_DIR/externalpackages/mpich/install/include  \
+@@ -115,6 +114,8 @@
+ 	--enable-debugging \
+ 	--with-numthreads=4
+ 
++#--with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install \
++
+ if [ $? -ne 0 ]; then echo "FAILED TO CONFIGURE!" && exit 1; fi
+ 
+ echo "Building..."
Index: /issm/oecreview/Archive/18296-19100/ISSM-18422-18423.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18422-18423.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18422-18423.diff	(revision 19102)
@@ -0,0 +1,34 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh	(revision 18422)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh	(revision 18423)
+@@ -27,9 +27,9 @@
+ 	--download-metis=1 \
+ 	--download-parmetis=1 \
+ 	--download-mumps=1 \
++	--download-fblaslapack=1 \
+ 	--download-scalapack=1
+ 
+-#--download-fblaslapack=1 \
+ 
+ #Compile and intall
+ make
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18422)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18423)
+@@ -108,13 +108,13 @@
+ 	--with-petsc-dir=$ISSM_DIR/externalpackages/petsc/install  \
+ 	--with-scalapack-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-mpi-include=$ISSM_DIR/externalpackages/mpich/install/include  \
+ 	--with-mpi-libflags=" -L$ISSM_DIR/externalpackages/mpich/install/lib -lmpich -lpmpich" \
+ 	--with-fortran-lib="/usr/local/lib/libgfortran.a" \
+ 	--enable-debugging \
+ 	--with-numthreads=4
+ 
+-#--with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 
+ if [ $? -ne 0 ]; then echo "FAILED TO CONFIGURE!" && exit 1; fi
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18423-18424.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18423-18424.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18423-18424.diff	(revision 19102)
@@ -0,0 +1,35 @@
+Index: ../trunk-jpl/packagers/macosx/package.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/package.sh	(revision 18423)
++++ ../trunk-jpl/packagers/macosx/package.sh	(revision 18424)
+@@ -1,13 +1,27 @@
+ #/bin/bash
+ 
++#Check that test101 runs
++cd $ISSM_DIR/test/NightlyRun
++delete matlab.log
++matlab -nojvm -nosplash -r "try, addpath $ISSM_DIR/bin $ISSM_DIR/lib; runme('id',101);exit; catch me,fprintf('%s',getReport(me)); exit; end" -logfile matlab.log
++
++if [[ $(cat matlab.log | grep -c SUCCESS) -lt 10 ]]; then
++	echo "test101 FAILED"
++	exit 1;
++fi
++
++exit 0
++
+ #Package using the Package Maker from OSX, driven by command line.
+ tarball_name='issm-mac-static_build.tar.gz'
+-
+ cd $ISSM_DIR
+ 
+ echo "Cleanup first" 
+- 
+ rm $tarball_name
+ 
++echo "modify generic" 
++cd $ISSM_DIR/bin
++cat generic_static.m | sed -e "s/generic_static/generic/g" > generic.m
++
+ echo "Creating tarball: ${tarball_name}"
+-tar -czf $tarball_name ./bin ./lib ./test ./examples
++tar -czf $tarball_name ./bin ./lib ./test ./examples externalpackages/mpich/install/bin/mpiexec externalpackages/mpich/install/bin/hydra_pmi_proxy
Index: /issm/oecreview/Archive/18296-19100/ISSM-18424-18425.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18424-18425.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18424-18425.diff	(revision 19102)
@@ -0,0 +1,29 @@
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18424)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18425)
+@@ -22,6 +22,7 @@
+    exit 1;
+ fi
+ # }}}
++exit 0
+ 
+ #List of external pakages to be installed and their installation scripts
+ EXTERNALPACKAGES="autotools install.sh                
+Index: ../trunk-jpl/packagers/macosx/package.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/package.sh	(revision 18424)
++++ ../trunk-jpl/packagers/macosx/package.sh	(revision 18425)
+@@ -1,9 +1,9 @@
+-#/bin/bash
++#!/bin/bash
+ 
+ #Check that test101 runs
+ cd $ISSM_DIR/test/NightlyRun
+-delete matlab.log
+-matlab -nojvm -nosplash -r "try, addpath $ISSM_DIR/bin $ISSM_DIR/lib; runme('id',101);exit; catch me,fprintf('%s',getReport(me)); exit; end" -logfile matlab.log
++rm matlab.log
++$MATLAB_DIR/bin/matlab -nojvm -nosplash -r "try, addpath $ISSM_DIR/bin $ISSM_DIR/lib; runme('id',101);exit; catch me,fprintf('%s',getReport(me)); exit; end" -logfile matlab.log
+ 
+ if [[ $(cat matlab.log | grep -c SUCCESS) -lt 10 ]]; then
+ 	echo "test101 FAILED"
Index: /issm/oecreview/Archive/18296-19100/ISSM-18425-18426.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18425-18426.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18425-18426.diff	(revision 19102)
@@ -0,0 +1,22 @@
+Index: ../trunk-jpl/packagers/macosx/package.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/package.sh	(revision 18425)
++++ ../trunk-jpl/packagers/macosx/package.sh	(revision 18426)
+@@ -8,10 +8,10 @@
+ if [[ $(cat matlab.log | grep -c SUCCESS) -lt 10 ]]; then
+ 	echo "test101 FAILED"
+ 	exit 1;
++else
++	echo "test101 passed"
+ fi
+ 
+-exit 0
+-
+ #Package using the Package Maker from OSX, driven by command line.
+ tarball_name='issm-mac-static_build.tar.gz'
+ cd $ISSM_DIR
+@@ -25,3 +25,4 @@
+ 
+ echo "Creating tarball: ${tarball_name}"
+ tar -czf $tarball_name ./bin ./lib ./test ./examples externalpackages/mpich/install/bin/mpiexec externalpackages/mpich/install/bin/hydra_pmi_proxy
++ls
Index: /issm/oecreview/Archive/18296-19100/ISSM-18426-18427.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18426-18427.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18426-18427.diff	(revision 19102)
@@ -0,0 +1,22 @@
+Index: ../trunk-jpl/packagers/macosx/package.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/package.sh	(revision 18426)
++++ ../trunk-jpl/packagers/macosx/package.sh	(revision 18427)
+@@ -14,9 +14,9 @@
+ 
+ #Package using the Package Maker from OSX, driven by command line.
+ tarball_name='issm-mac-static_build.tar.gz'
+-cd $ISSM_DIR
+ 
+ echo "Cleanup first" 
++cd $ISSM_DIR
+ rm $tarball_name
+ 
+ echo "modify generic" 
+@@ -24,5 +24,6 @@
+ cat generic_static.m | sed -e "s/generic_static/generic/g" > generic.m
+ 
+ echo "Creating tarball: ${tarball_name}"
++cd $ISSM_DIR
+ tar -czf $tarball_name ./bin ./lib ./test ./examples externalpackages/mpich/install/bin/mpiexec externalpackages/mpich/install/bin/hydra_pmi_proxy
+ ls
Index: /issm/oecreview/Archive/18296-19100/ISSM-18427-18428.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18427-18428.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18427-18428.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18427)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18428)
+@@ -22,7 +22,6 @@
+    exit 1;
+ fi
+ # }}}
+-exit 0
+ 
+ #List of external pakages to be installed and their installation scripts
+ EXTERNALPACKAGES="autotools install.sh                
Index: /issm/oecreview/Archive/18296-19100/ISSM-18428-18429.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18428-18429.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18428-18429.diff	(revision 19102)
@@ -0,0 +1,44 @@
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18428)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18429)
+@@ -119,7 +119,7 @@
+ if [ $? -ne 0 ]; then echo "FAILED TO CONFIGURE!" && exit 1; fi
+ 
+ echo "Building..."
+-make -j 4 
++#make -j 4 
+ if [ $? -ne 0 ]; then echo "FAILED TO BUILD!" && exit 1; fi
+ 
+ echo "Installing..."
+Index: ../trunk-jpl/packagers/macosx/package.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/package.sh	(revision 18428)
++++ ../trunk-jpl/packagers/macosx/package.sh	(revision 18429)
+@@ -1,5 +1,12 @@
+ #!/bin/bash
+ 
++echo "modify generic" 
++cd $ISSM_DIR/bin
++cat generic_static.m | sed -e "s/generic_static/generic/g" > generic.m
++echo "move mpiexec to bin" 
++cp ../externalpackages/mpich/install/bin/mpiexec .
++cp ../externalpackages/mpich/install/bin/hydra_pmi_proxy .
++
+ #Check that test101 runs
+ cd $ISSM_DIR/test/NightlyRun
+ rm matlab.log
+@@ -19,11 +26,9 @@
+ cd $ISSM_DIR
+ rm $tarball_name
+ 
+-echo "modify generic" 
+-cd $ISSM_DIR/bin
+-cat generic_static.m | sed -e "s/generic_static/generic/g" > generic.m
+ 
++
+ echo "Creating tarball: ${tarball_name}"
+ cd $ISSM_DIR
+-tar -czf $tarball_name ./bin ./lib ./test ./examples externalpackages/mpich/install/bin/mpiexec externalpackages/mpich/install/bin/hydra_pmi_proxy
++tar -czf $tarball_name ./bin ./lib ./test ./examples
+ ls
Index: /issm/oecreview/Archive/18296-19100/ISSM-18429-18430.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18429-18430.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18429-18430.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/packagers/macosx/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/install.sh	(revision 18429)
++++ ../trunk-jpl/packagers/macosx/install.sh	(revision 18430)
+@@ -119,7 +119,7 @@
+ if [ $? -ne 0 ]; then echo "FAILED TO CONFIGURE!" && exit 1; fi
+ 
+ echo "Building..."
+-#make -j 4 
++make -j 4 
+ if [ $? -ne 0 ]; then echo "FAILED TO BUILD!" && exit 1; fi
+ 
+ echo "Installing..."
Index: /issm/oecreview/Archive/18296-19100/ISSM-18430-18431.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18430-18431.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18430-18431.diff	(revision 19102)
@@ -0,0 +1,10 @@
+Index: ../trunk-jpl/packagers/macosx/package.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/package.sh	(revision 18430)
++++ ../trunk-jpl/packagers/macosx/package.sh	(revision 18431)
+@@ -31,4 +31,4 @@
+ echo "Creating tarball: ${tarball_name}"
+ cd $ISSM_DIR
+ tar -czf $tarball_name ./bin ./lib ./test ./examples
+-ls
++ls -lah $tarball_name
Index: /issm/oecreview/Archive/18296-19100/ISSM-18431-18432.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18431-18432.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18431-18432.diff	(revision 19102)
@@ -0,0 +1,16 @@
+Index: ../trunk-jpl/packagers/macosx/package.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/package.sh	(revision 18431)
++++ ../trunk-jpl/packagers/macosx/package.sh	(revision 18432)
+@@ -27,8 +27,10 @@
+ rm $tarball_name
+ 
+ 
+-
+ echo "Creating tarball: ${tarball_name}"
+ cd $ISSM_DIR
+ tar -czf $tarball_name ./bin ./lib ./test ./examples
+ ls -lah $tarball_name
++
++echo "Shipping to website"
++scp $tarball_name websites:/home/larour/files/$tarball_name
Index: /issm/oecreview/Archive/18296-19100/ISSM-18432-18433.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18432-18433.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18432-18433.diff	(revision 19102)
@@ -0,0 +1,11 @@
+Index: ../trunk-jpl/examples/README.txt
+===================================================================
+--- ../trunk-jpl/examples/README.txt	(revision 0)
++++ ../trunk-jpl/examples/README.txt	(revision 18433)
+@@ -0,0 +1,6 @@
++To run the following examples see the accompanying tutorials that can be found within the
++documentation tab on the ISSM webpage. The tutorials were created to be parallel to lectures given,
++but the tutorials are up to date on their version of ISSM. However within the workshop directory you
++can find the lecture tutorials which will give a more in depth technical overview. If more help is
++needed see the Usermanual also found under the documentation tab. If you don't want to complete the
++tutorials in chronological order make sure to see Jakobshavn to run the download script. 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18433-18434.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18433-18434.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18433-18434.diff	(revision 19102)
@@ -0,0 +1,509 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp	(revision 0)
++++ ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp	(revision 18434)
+@@ -0,0 +1,492 @@
++#include <iostream>
++#include <cmath>
++#include <fstream>
++#include <string>
++#include <cstdio>
++#include <cstdlib>
++#include <time.h>
++#include <cassert>
++#include <gsl/gsl_multifit.h>
++
++using namespace std;
++
++class Matrix{/*{{{*/
++	private:
++		int     M;        /*Number of lines   */
++		int     N;        /*Number if Columns */
++		double *values;
++	public:
++		Matrix(int m_in,int n_in){/*{{{*/
++			this->M = m_in;
++			this->N = n_in;
++			this->values = new double[M*N];
++		}/*}}}*/
++		~Matrix(){/*{{{*/
++			delete [] this->values;
++		}/*}}}*/
++		void Echo(void){/*{{{*/
++			for(int i=0;i<M;i++){
++				for(int j=0;j<N;j++){
++					cout << " " << this->values[i*N+j];
++				}
++				cout << endl;
++			}
++		}/*}}}*/
++		void SetValue(int i,int j,double value){/*{{{*/
++			this->values[i*N+j] = value;
++		}/*}}}*/
++		double GetValue(int i,int j){/*{{{*/
++			return this->values[i*N+j];
++		}/*}}}*/
++		void GetSize(int* pM,int* pN){/*{{{*/
++			*pM = this->M;
++			*pN = this->N;
++		}/*}}}*/
++		double* GetPointer(void){/*{{{*/
++			return this->values;
++		}/*}}}*/
++		void MatrixSum(Matrix* A,Matrix* B){/*{{{*/
++			/*Check that sizes are compatible*/
++			int M_B,N_B,M_A,N_A;
++			B->GetSize(&M_B,&N_B);
++			A->GetSize(&M_A,&N_A);
++			assert(this->M==M_B && this->N==N_B);
++			assert(this->M==M_A && this->N==N_A);
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,A->GetValue(i,j) + B->GetValue(i,j));
++				}
++			}
++		}/*}}}*/
++		void MatrixDiff(Matrix* A,Matrix* B){/*{{{*/
++			/*Check that sizes are compatible*/
++			int M_B,N_B,M_A,N_A;
++			B->GetSize(&M_B,&N_B);
++			A->GetSize(&M_A,&N_A);
++			assert(this->M==M_B && this->N==N_B);
++			assert(this->M==M_A && this->N==N_A);
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,A->GetValue(i,j) - B->GetValue(i,j));
++				}
++			}
++		}/*}}}*/
++		void MatrixAbs(Matrix* A){/*{{{*/
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,fabs(A->GetValue(i,j)));
++				}
++			}
++		}/*}}}*/
++		void MatrixEqual(Matrix* A){/*{{{*/
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,A->GetValue(i,j));
++				}
++			}
++		}/*}}}*/
++		double MatrixInternSum(){/*{{{*/
++			double sum=0;
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					sum+=this->GetValue(i,j);
++				}
++			}
++			return sum;
++		}/*}}}*/
++		void ExtractLine(Matrix* A,int i){/*{{{*/
++			/* Check that the size of A is compatible */
++			int M_A,N_A;
++			A->GetSize(&M_A,&N_A);
++			assert(M_A==1 && this->N==N_A);
++			for(int j=0;j<this->N;j++){
++				A->SetValue(0,j,this->GetValue(i,j));
++			}
++		}/*}}}*/
++		void ExtractColumn(Matrix* A,int j){/*{{{*/
++			/* Check that the size of A is compatible */
++			int M_A,N_A;
++			A->GetSize(&M_A,&N_A);
++			assert(N_A==1 && this->M==M_A);
++			for(int i=0;i<this->M;i++){
++				A->SetValue(i,0,this->GetValue(i,j));
++			}
++		}/*}}}*/
++		void AddNumber(double a){/*{{{*/
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,this->GetValue(i,j) + a);
++				}
++			}
++		}/*}}}*/
++};/*}}}*/
++
++/*Local prototypes{{{*/
++void makep(Matrix *Pobs,int nx,int ny, int dx, int dy);
++void vec2grid(Matrix *V,Matrix *V1,Matrix *V2,int nx, int ny);
++void msplit( Matrix *m, Matrix *m1,Matrix *m2,double dlevel);
++void plouff(Matrix *g,Matrix *Pobs,Matrix *Pp,Matrix * mesh,Matrix *rho,int dx,int dy, int dn,int m,int n,int l);
++void vec2gridsimple(Matrix *V,Matrix *V1,int nx, int ny);
++void reshape(Matrix* V,Matrix* V1,int nx,int ny);
++double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,int dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my);
++void GSLsquarefit(Matrix** pX,Matrix* A,Matrix* B);
++/*}}}*/
++
++int main(){/*{{{*/
++
++	/* Seed the random number generator {{{*/
++	srand (time(NULL));               /*}}}*/
++	/* Define the variables {{{*/
++
++	int    dx     = 500;   /* prism dimension in x-direction                           */
++	int    dy     = 500;   /* prism dimension in y-direction                           */
++	int    mx     = 39;    /* number of prisms in x-direction                          */
++	int    my     = 60;    /* number of prisms in y-direction                          */
++	int    nx     = 39;    /* number of data points in x-direction                     */
++	int    ny     = 60;    /* number of data points in y-direction                     */
++	int    dn     = 15000; /* distance for neighbouting prisms for gravity calculation */
++	double ptval  = 100.;  /* max. amount to perturb model                             */
++	double ptval2 = 100.;
++
++	Matrix *Pobs=new Matrix(nx*ny,2); /* data positions */
++	makep(Pobs,nx,ny,dx,dy);
++// Pobs->Echo();
++
++
++	Matrix *Pp=new Matrix(mx*my,2); /* data positions */
++	makep(Pp,mx,my,dx,dy);
++// Pp->Echo();
++
++	double  rhoi = 890;           /* ice density     */
++	double  rhow = 1030;          /* water density   */
++// double  rhos = 2013;		      /* sediment density */
++	double  rhoc = 2670;          /* bedrock density */
++	
++	Matrix *Rho  = new Matrix(1,2);
++	Rho->SetValue(0,0,rhoi);
++	Rho->SetValue(0,1,rhow);
++	Matrix *rho1  = new Matrix(1,3);
++	rho1->SetValue(0,0,rhoi);
++	rho1->SetValue(0,1,rhow);
++	rho1->SetValue(0,2,rhoc);
++	Matrix *rho2  = new Matrix(1,2);
++	rho2->SetValue(0,0,rhoi-rhoc);
++	rho2->SetValue(0,1,rhow-rhoc);
++	
++	double ctr=1;            /* parameter for filtering */
++	double sd=0.1;
++
++	Matrix *xobs= new Matrix(ny,nx);
++	Matrix *yobs= new Matrix(ny,nx);
++
++	vec2grid(Pobs,xobs,yobs,nx,ny);
++//	xobs->Echo();
++//	yobs->Echo();
++
++	double dlevel= 860;                /* mean level of data acquisition */
++
++	double mmax  = 1000;               /* max value for layer interfaces */
++	double mmax2 = 1000;
++	double mmax3 = 1000;
++
++	/* control parameter for temperature schedule  */
++
++	double ca=0.9;                    /* for acceptance */
++	double cm=0.5;                    /* for model perturbation */
++	                     /*}}}*/     
++	/* load the data {{{*/
++
++	/* Observed gravity anomaly */
++
++	ifstream file1("store_fa500_36s.txt");
++	Matrix * gobs= new Matrix(nx*ny,1);
++	double inputnumber;
++	for(int i=0;i<ny*nx; i++){ 
++		file1 >> inputnumber;
++		gobs->SetValue(i,0, inputnumber*1e-5);
++	}
++	file1.close();
++//	gobs->Echo();
++	
++	/* load data about the ice thickness */
++
++	ifstream file2("store_flag_icethick500.txt");
++	Matrix * icethick= new Matrix(mx*my,1);
++	for(int s=0;s<mx*my; s++){ 
++		file2 >> inputnumber;
++		icethick->SetValue(s,0,inputnumber);
++	}
++	file2.close();
++//	icethick->Echo();
++
++	/* load the batimethry data */
++
++	ifstream file3("store_flag_bathy500.txt");
++	Matrix * bathy= new Matrix(mx*my,1);
++	for(int s=0;s<mx*my; s++){ 
++		file3 >> inputnumber;
++		bathy->SetValue(s,0,inputnumber);
++	}
++	file3.close();
++//	bathy->Echo();
++	
++	/* id of grid to evaluate misfit */
++
++
++	ifstream file4("store_flag_eval500.txt");
++	Matrix * evalid= new Matrix(mx*my,1);
++	for(int s=0;s<mx*my; s++){ 
++		file4 >> inputnumber;
++		evalid->SetValue(s,0,inputnumber);
++	}
++	file4.close();
++//	evalid->Echo();
++	
++	/* initial guess of the model */
++
++	ifstream file5("m0_140114b.txt");
++	Matrix * mesh_ini= new Matrix(mx*my,3);
++	for(int s=0;s<mx*my; s++){ 
++		for(int j=0;j<3;j++){
++		file5 >> inputnumber;
++		mesh_ini->SetValue(s,j,inputnumber);
++	}
++	}
++	file5.close();
++//	mesh_ini->Echo();
++                           /*}}}*/
++	double q=0;
++ q=misfit(mesh_ini,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my);
++     cout<< q;
++/*	Matrix* G=new Matrix(4,3);
++	Matrix* df=new Matrix(4,1);
++	Matrix* o=new Matrix(4,1);
++	for(int i= 0;i<4;i++){
++		for(int j=0;j<3;j++){
++			if(j==2){G->SetValue(i,j,1);}
++			else{G->SetValue(i,j,i+j);}
++		}
++		df->SetValue(i,0,i*1e-3);
++	}
++		G->SetValue(0,0,1);
++		G->SetValue(0,1,2);
++
++	Matrix* M = NULL;
++	GSLsquarefit(&M,G,df);
++	for(int i= 0;i<4;i++){
++		o->SetValue(i,0,G->GetValue(i,0)*M->GetValue(0,0)+G->GetValue(i,1)*M->GetValue(1,0)+G->GetValue(i,2)*M->GetValue(2,0));}
++
++	G->Echo();
++	df->Echo();
++	M->Echo();
++	o->Echo();*/
++
++	return 0;
++}/*}}}*/
++
++void GSLsquarefit(Matrix** pX,Matrix* A,Matrix* B){/*{{{*/
++
++	/*GSL Matrices and vectors: */
++	int    M,N;
++	double chisq;
++
++	/*Get system size*/
++	A->GetSize(&M,&N);
++
++	/*Initialize gsl matrices and vectors: */
++	gsl_matrix* a = gsl_matrix_alloc(M,N);
++	for(int i=0;i<M;i++){
++		for(int j=0;j<N;j++){
++			gsl_matrix_set (a,i,j,A->GetValue(i,j));
++		}
++	}
++	gsl_vector* b = gsl_vector_alloc(M);
++	for(int i=0;i<M;i++){
++		gsl_vector_set(b,i,B->GetValue(i,0));
++	}
++
++	gsl_vector* x = gsl_vector_alloc(N);
++	gsl_matrix* cov = gsl_matrix_alloc(N,N);
++
++	/*Least square fit: */
++	gsl_multifit_linear_workspace* work = gsl_multifit_linear_alloc(M,N);
++	gsl_multifit_linear (a, b, x, cov, &chisq, work);
++	gsl_multifit_linear_free (work);
++
++	/*Clean up and assign output pointer*/
++	Matrix* X = new Matrix(N,1);
++	for(int j=0;j<N;j++){
++		X->SetValue(j,0,gsl_vector_get(x,j));
++	}
++	*pX = X;
++
++	gsl_matrix_free(a);
++	gsl_vector_free(b);
++	gsl_matrix_free(cov);
++
++}/*}}}*/
++void makep(Matrix *Pobs,int nx,int ny, int dx, int dy){/*{{{*/
++	for(int i=0;i<ny;i++){
++		for(int j=0;j<nx;j++){
++			Pobs->SetValue(j+nx*i,0,j*dx);
++			Pobs->SetValue(j+nx*i,1,i*dy);
++		}
++	}
++}/*}}}*/
++void vec2grid(Matrix *V,Matrix *V1,Matrix *V2,int nx, int ny){/*{{{*/
++	for(int i=0;i<ny;i++){
++		for (int j=0;j<nx;j++){
++			V1->SetValue(i,j, V->GetValue(j+nx*i,0));
++			V2->SetValue(i,j, V->GetValue(j+nx*i,1));
++		}
++	}
++}/*}}}*/
++void msplit( Matrix *m, Matrix *m1,Matrix *m2,double dlevel){/*{{{*/
++	int sizem1,sizem2;
++	m->GetSize(&sizem1,&sizem2);
++	for(int i=0;i<sizem1;i++){
++		for(int j=0;j<sizem2+1;j++){
++			if(j<sizem2){
++				m1->SetValue(i,j,1e-10*(sizem2+1-j));
++				m2->SetValue(i,j,m->GetValue(i,j));
++				if(m->GetValue(i,j)<0){
++					m1->SetValue(i,j,m->GetValue(i,j));
++					m2->SetValue(i,j,i*1e-10);
++				}
++			}
++			else{
++				m1->SetValue(i,j,1e-10);
++			}
++		}
++	}
++	m1->AddNumber(dlevel);
++	m2->AddNumber(dlevel);
++}/*}}}*/
++void plouff(Matrix *g,Matrix *Pobs,Matrix *Pp,Matrix * mesh,Matrix *rho,int dx,int dy, int dn,int m,int n,int l){/*{{{*/
++		double gg=6.673e-11;
++		int si,sj,id,s;
++		double R,Q,P;
++		Matrix *xp= new Matrix(1,2);
++		Matrix *yp= new Matrix(1,2);
++		Matrix *xpp= new Matrix(1,2);
++		Matrix *ypp= new Matrix(1,2);
++		Matrix *U= new Matrix(l,4);
++		Matrix *U1=new Matrix(1,4);
++		Matrix *U2=new Matrix(1,4);
++		Matrix *gl= new Matrix(1,l-1);
++		bool test=true;
++		for(int c=0;c<n;c++){
++			g->SetValue(c,0,0);
++			for(int a=0;a<m;a++){
++				test=true;
++				xp->SetValue(0,0,Pp->GetValue(a,0)-Pobs->GetValue(c,0));
++				xp->SetValue(0,1,Pp->GetValue(a,0)-Pobs->GetValue(c,0)+dx);
++				if(xp->GetValue(0,0)<0 && xp->GetValue(0,0)<xp->GetValue(0,1) && xp->GetValue(0,0)*xp->GetValue(0,1)>=0){
++					xpp->SetValue(0,0,xp->GetValue(0,1));
++					xpp->SetValue(0,1,xp->GetValue(0,0));
++					xp->MatrixAbs(xpp);
++				}
++				yp->SetValue(0,0,Pp->GetValue(a,1)-Pobs->GetValue(c,1));
++				yp->SetValue(0,1,Pp->GetValue(a,1)-Pobs->GetValue(c,1)+dy);
++				if(yp->GetValue(0,0)<0 && yp->GetValue(0,0)<yp->GetValue(0,1) && yp->GetValue(0,0)*yp->GetValue(0,1)>=0){
++					ypp->SetValue(0,0,yp->GetValue(0,1));
++					ypp->SetValue(0,1,yp->GetValue(0,0));
++					yp->MatrixAbs(ypp);
++				}
++				P=sqrt(xp->GetValue(0,0)*xp->GetValue(0,0)+yp->GetValue(0,0)*yp->GetValue(0,0));
++				if(P>dn){
++					test=false;
++					for(int i=0;i<l-1;i++){
++						gl->SetValue(0,i,0);
++					}
++				}
++				if(test==true){
++					si=1;
++					sj=1;
++					id=0;
++					for(int i=0;i<2;i++){
++						si*=-1;
++						for(int j=0;j<2;j++){
++							si*=-1;
++							s=si*sj;
++							for(int k=0;k<l;k++){
++								R=sqrt(xp->GetValue(0,i)*xp->GetValue(0,i)+yp->GetValue(0,j)*yp->GetValue(0,j)+mesh->GetValue(a,k)*mesh->GetValue(a,k));
++								Q=atan(xp->GetValue(0,i)*yp->GetValue(0,j)/(mesh->GetValue(a,k)*R));
++								U->SetValue(k,id,s*(mesh->GetValue(a,k)*Q-xp->GetValue(0,i)*log(R+yp->GetValue(0,j))-yp->GetValue(0,j)*log(R+xp->GetValue(0,i))));
++							}
++							id++;
++						}
++					}
++					for(int b=0;b<l-1;b++){
++						U->ExtractLine(U1,b);
++						U->ExtractLine(U2,b+1);
++						gl->SetValue(0,b,rho->GetValue(0,b)*(U1->MatrixInternSum()*(-1)+U2->MatrixInternSum()));
++					}
++				}
++				g->SetValue(c,0,g->GetValue(c,0)+gg*gl->MatrixInternSum());
++			}
++		}
++		delete xp;
++		delete yp;
++		delete xpp;
++		delete ypp;
++		delete gl;
++		delete U;
++		delete U1;
++		delete U2;
++	}/*}}}*/
++void vec2gridsimple(Matrix *V,Matrix *V1,int nx, int ny){/*{{{*/
++	for(int i=0;i<ny;i++){
++		for (int j=0;j<nx;j++){
++			V1->SetValue(i,j, V->GetValue(j+nx*i,0));
++		}
++	}
++}/*}}}*/
++void reshape(Matrix* V,Matrix* V1,int nx,int ny){/*{{{*/
++	for (int i=0;i<ny;i++){
++		for(int j=0;j<nx;j++){
++			V1->SetValue(j+nx*i,0,V->GetValue(i,j));
++		}
++	}
++}/*}}}*/
++double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,int dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my){/*{{{*/
++	Matrix* m1=new Matrix(mx*my,4);
++	Matrix* m2=new Matrix(mx*my,3);
++	Matrix* g1=new Matrix(nx*ny,1);
++	Matrix* g2=new Matrix(nx*ny,1);
++	Matrix* g=new Matrix(nx*ny,1);
++	Matrix* gcalgr=new Matrix(ny,nx);
++	Matrix* gcalvec=new Matrix(mx*my,1);
++	Matrix* df=new Matrix(mx*my,1);
++	Matrix* G=new Matrix(mx*my,3);
++	double a=0;
++	double b=0;
++	double e=0;
++	msplit(m0,m1,m2,dlevel);
++   plouff(g1,Pobs,Pp,m1,rho1,dx,dy,dn,mx*my,nx*ny,4);
++   plouff(g2,Pobs,Pp,m2,rho2,dx,dy,dn,mx*my,nx*ny,3);
++	g->MatrixSum(g1,g2);
++	vec2gridsimple(g,gcalgr,nx,ny);
++	reshape(gcalgr,gcalvec,mx,my);
++	for (int i=0;i<mx*my;i++){
++		df->SetValue(i,0,evalid->GetValue(i,0)*(gobs->GetValue(i,0)-gcalvec->GetValue(i,0)));
++		G->SetValue(i,0,evalid->GetValue(i,0)*Pobs->GetValue(i,0));
++		G->SetValue(i,1,evalid->GetValue(i,0)*Pobs->GetValue(i,1));
++		G->SetValue(i,2,evalid->GetValue(i,0));
++	}
++	Matrix* M = NULL;
++	GSLsquarefit(&M,G,df);
++
++	for (int i=0;i<my;i++){
++		for(int j=0;j<mx;j++){
++			gcalgr->SetValue(i,j,gcalgr->GetValue(i,j)+xobs->GetValue(i,j)*M->GetValue(0,0)+yobs->GetValue(i,j)*M->GetValue(1,0)+M->GetValue(2,0));
++		}
++	}
++	reshape(gcalgr,g,mx,my);
++	for (int i=0;i<mx*my;i++){
++		a=a+fabs(evalid->GetValue(i,0)*(gobs->GetValue(i,0)-g->GetValue(i,0)));
++		b=b+fabs(evalid->GetValue(i,0)*(gobs->GetValue(i,0)+g->GetValue(i,0)));
++	}
++	e=2*a/(a+b);
++	return e;
++}/*}}}*/
+Index: ../trunk-jpl/src/m/contrib/gravity/Makefile
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/Makefile	(revision 0)
++++ ../trunk-jpl/src/m/contrib/gravity/Makefile	(revision 18434)
+@@ -0,0 +1,7 @@
++all:
++		g++ vfsa.cpp -o forward \
++			-I$(ISSM_DIR)/externalpackages/gsl/install/include \
++			-L$(ISSM_DIR)/externalpackages/gsl/install/lib -lgsl -lgslcblas
++
++clean:
++		rm -f forward
Index: /issm/oecreview/Archive/18296-19100/ISSM-18434-18435.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18434-18435.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18434-18435.diff	(revision 19102)
@@ -0,0 +1,107 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp	(revision 18434)
++++ ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp	(revision 18435)
+@@ -130,6 +130,8 @@
+ void reshape(Matrix* V,Matrix* V1,int nx,int ny);
+ double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,int dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my);
+ void GSLsquarefit(Matrix** pX,Matrix* A,Matrix* B);
++double signe(double a);
++void filtergrav(Matrix* A,Matrix* Ain,double ctr,double sd,int mx,int my);
+ /*}}}*/
+ 
+ int main(){/*{{{*/
+@@ -280,7 +282,9 @@
+ 	df->Echo();
+ 	M->Echo();
+ 	o->Echo();*/
+-
++double a;
++a=signe(-9);
++cout<<a;
+ 	return 0;
+ }/*}}}*/
+ 
+@@ -490,3 +494,82 @@
+ 	e=2*a/(a+b);
+ 	return e;
+ }/*}}}*/
++void newmodelgen(Matrix* m0,Matrix* m1,Matrix* bathy,Matrix* icethick,int mx,int my,double T,double ptval,double mmax,double mmax2,double ctr,double sd){/*{{{*/
++	Matrix* m1gr=new Matrix(my,mx);
++	Matrix* m1grsm=new Matrix(my,mx);
++	Matrix* m1col=new Matrix(mx*my,1);
++	double u=0;
++	double y=0;
++	m1->MatrixEqual(m0);
++	for (int i=0;i<mx*my;i++){
++		if(icethick->GetValue(i,0)==0){
++			u=double (rand())/ double(RAND_MAX);
++			y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
++			m1->SetValue(i,1,m0->GetValue(i,1)+y*ptval);
++			if(m1->GetValue(i,1)<=m1->GetValue(i,0)){
++				m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
++			}
++			if(m1->GetValue(i,1)>=m1->GetValue(i,0)+mmax){
++				m1->SetValue(i,1,m1->GetValue(i,0)+mmax);
++			}
++		}
++	}
++	m1->ExtractColumn(m1col,1);
++	vec2gridsimple(m1col,m1gr,mx,my);
++	filtergrav(m1grsm,m1gr,ctr,sd,mx,my);
++	reshape(m1grsm,m1col,mx,my);
++	for (int i=0;i<mx*my;i++){
++		if(icethick->GetValue(i,0)==0){
++			m1->SetValue(i,1,m1col->GetValue(i,0));
++		}
++		else{
++			m1->SetValue(i,1,m0->GetValue(i,1));
++		}
++		if(m1->GetValue(i,1)<=m1->GetValue(i,0)){
++			m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
++		}
++	}
++
++	for (int i=0;i<mx*my;i++){
++		if(bathy->GetValue(i,0)==0){
++			u=double (rand())/ double(RAND_MAX);
++			y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
++			m1->SetValue(i,2,m0->GetValue(i,2)+y*ptval);
++			if(m1->GetValue(i,2)<=m1->GetValue(i,1)){
++				m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++			}
++			if(m1->GetValue(i,2)>=m1->GetValue(i,1)+mmax2){
++				m1->SetValue(i,2,m1->GetValue(i,1)+mmax2);
++			}
++		}
++	}
++	m1->ExtractColumn(m1col,2);
++	vec2gridsimple(m1col,m1gr,mx,my);
++	filtergrav(m1grsm,m1gr,ctr,sd,mx,my);
++	reshape(m1grsm,m1col,mx,my);
++	for (int i=0;i<mx*my;i++){
++		if(bathy->GetValue(i,0)==0){
++			m1->SetValue(i,2,m1col->GetValue(i,0));
++		}
++		else{
++			m1->SetValue(i,2,m0->GetValue(i,2));
++		}
++		if(m1->GetValue(i,2)<=m1->GetValue(i,1)){
++			m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++		}
++	}
++	delete m1gr;
++	delete m1grsm;
++	delete m1col;
++}/*}}}*/
++double signe(double a){/*{{{*/
++	if(a<0){return -1;}
++	else{return 1;}
++}/*}}}*/
++void filtergrav(Matrix* A,Matrix* Ain,double ctr,double sd,int mx,int my){/*{{{*/
++	for (int i=1;i<my-1;i++){
++		for(int j=1;j<mx-1;j++){
++			A->SetValue(i,j,(ctr*Ain->GetValue(i,j)+sd*(Ain->GetValue(i-1,j)+Ain->GetValue(i+1,j)+Ain->GetValue(i,j-1)+Ain->GetValue(i,j+1)))/(ctr+4*sd));
++		}
++	}
++}/*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18435-18436.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18435-18436.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18435-18436.diff	(revision 19102)
@@ -0,0 +1,2497 @@
+Index: ../trunk-jpl/packagers/ubuntu/README
+===================================================================
+--- ../trunk-jpl/packagers/ubuntu/README	(revision 18435)
++++ ../trunk-jpl/packagers/ubuntu/README	(revision 18436)
+@@ -1,60 +0,0 @@
+-TARBALL INSTALLATION:
+-
+-To install ISSM, untar ISSM-Ubuntu32.tar.gz 
+-You will get an ISSM directory. 
+-
+-You then need to setup the following environment variable in your 
+-.bashrc or .cshrc: 
+-
+-in your .bashrc: 
+-export ISSM_TIER='path_to_untarred_ISSM/bin'
+-
+-or in your .cshrc: 
+-setenv ISSM_TIER 'path_to_untarred_ISSM'
+-
+-Once this is done, fireup matlab from inside the ISSM directory: 
+-matlab -nojvm -r "startup;"
+-
+-
+-UNDER CONSTRUCTION - UNDER CONSTRUCTION - UNDER CONSTRUCTION - UNDER CONSTRUCTION 
+--------------------------------------------------------------------------------
+-				OR THE RIGHT WAY....
+-DPKG/DEB INSTALLATION:
+-
+-To install from deb archives (*.deb), use:
+-
+-	> sudo dpkg --install <debarchive>
+-
+-That's it! But not really. Do make sure that you install petsc and metis first.
+-When you first try to install issm, dpkg will tell you that you are missing
+-dependencies. Just:
+-
+-	> sudo apt-get install -f
+-
+-to fix the dependencies and complete the install. When apt-get is done, you 
+-should see something that says that ISSM is installed correctly on your 
+-machine. That's it! For real this time.
+-
+-Uninstalling is simple too:
+-
+-	> sudo apt-get remove <issmPackageName>
+-
+-That'll do all the work for you. This won't delete any configuration or user
+-defined environment stuff. Just swap "remove" out for "purge" and that'll
+-delete everything. And apt-get might ask you to remove unneeded dependencies,
+-so you should probably do that to keep your system clean.
+-
+-To create your own custom debian archive, see the README in issmpkg.
+-
+--------------------------------------------------------------------------------
+-
+-APT-GET INSTALLATION: (this doesnot work yet)
+-
+-To install from apt-get:
+-
+-	> sudo add-apt-repository <issm_PPA_URL>
+-	> sudo apt-get install <issmPackageName>
+-
+-Just say yes to everything apt asks you, and you're good.
+-
+-UNDER CONSTRUCTION - UNDER CONSTRUCTION - UNDER CONSTRUCTION - UNDER CONSTRUCTION 
+Index: ../trunk-jpl/packagers/ubuntu/issmpkg/issm_options.m4
+===================================================================
+--- ../trunk-jpl/packagers/ubuntu/issmpkg/issm_options.m4	(revision 18435)
++++ ../trunk-jpl/packagers/ubuntu/issmpkg/issm_options.m4	(revision 18436)
+@@ -1,1690 +0,0 @@
+-dnl ISSM Options
+-
+-AC_DEFUN([ISSM_OPTIONS],[
+-
+-	dnl ISSM's internal options
+-	dnl Debugging {{{
+-	AC_ARG_ENABLE([debugging],                                        dnl feature
+-		AS_HELP_STRING([--enable-debugging],[turn debug support on]),  dnl help string
+-		[enable_debugging=$enableval],                                 dnl action if given
+-		[enable_debugging=no])                                         dnl action if not given
+-	if test "x$enable_debugging" = xyes; then
+-		AC_DEFINE([_ISSM_DEBUG_],[1],[Macro to enable debugging in ISSM])
+-	fi
+-
+-	dnl }}}
+-    dnl Shared build {{{
+-    AC_ARG_ENABLE([sharedlibs],                                                dnl feature
+-        AS_HELP_STRING([--enable-sharedlibs], [produce libISSM.so.0]),         dnl help string
+-        [enable_sharedlibs=$enableval],                                        dnl action if given
+-        [enable_sharedlibs=no])                                                dnl action if not given
+-    AM_CONDITIONAL([SHAREDLIBS], [test x$enable_sharedlibs = xyes])
+-    dnl }}}
+-    dnl Version{{{
+-    AC_ARG_ENABLE([version],                                                dnl feature
+-        AS_HELP_STRING([--enable-version], [produce libISSM.so.0]),         dnl help string
+-        [enable_version=$enableval],                                        dnl action if given
+-        [enable_version=no])                                                dnl action if not given
+-    AM_CONDITIONAL([VERSION], [test x$enable_VERSION = xyes])
+-    dnl }}}
+-	dnl Wrappers build {{{
+-	AC_ARG_WITH([wrappers],
+-		AS_HELP_STRING([--with-wrappers = value],[wrappers compilation. ]),
+-		[WRAPPERS_VALUE=$withval],[WRAPPERS_VALUE="yes"])
+-	AC_MSG_CHECKING(for wrappers compilation)
+-	AM_CONDITIONAL([WRAPPERS], [test x$WRAPPERS_VALUE = xyes])
+-	AC_MSG_RESULT($WRAPPERS_VALUE) 
+-	dnl }}}
+-	dnl Extensions{{{
+-	ISSMEXT=".exe"
+-	AC_SUBST([ISSMEXT])
+-	dnl }}}
+-
+-	dnl ISSM's externalpackages
+-	dnl vendor{{{
+-	AC_ARG_WITH([vendor],
+-	  AS_HELP_STRING([--with-vendor = VENDOR], [vendor name, ex: intel]),
+-	  [VENDOR=$withval],[VENDOR=""]) 
+-	AC_MSG_CHECKING(for vendor compilers)
+-	if test -n "$VENDOR"; then
+-
+-		if  test $VENDOR = intel-win32; then
+-			export CC=icl
+-			export CXX=icl
+-			export CFLAGS="-DWIN32 -D_INTEL_WIN_"
+-			export CXXFLAGS="-DWIN32 -D_INTEL_WIN_"
+-		elif  test $VENDOR = intel-win7-32; then
+-			export CC=cl
+-			export CXX=cccl
+-			export CXXFLAGS="-DWIN32 -D_INTEL_WIN_ -EHsc"
+-			export CFLAGS="-DWIN32 -D_INTEL_WIN_ -EHsc"
+-			export AR="ar-lib lib"
+-			export OS_LDFLAG="-Wl,"
+-			export RANLIB=true
+-			OSLIBS="-Wl,kernel32.lib -Wl,user32.lib -Wl,gdi32.lib -Wl,winspool.lib -Wl,comdlg32.lib -Wl,advapi32.lib -Wl,shell32.lib -Wl,ole32.lib -Wl,oleaut32.lib -Wl,uuid.lib -Wl,odbc32.lib -Wl,odbccp32.lib"
+-		elif  test $VENDOR = intel-win7-64; then
+-			export CC=cl
+-			export CXX=cccl
+-			export CXXFLAGS="-DWIN32 -D_INTEL_WIN_ -EHsc"
+-			export CFLAGS="-DWIN32 -D_INTEL_WIN_ -EHsc"
+-			export AR="ar-lib lib"
+-			export OS_LDFLAG="-Wl,"
+-			export RANLIB=true
+-			OSLIBS="-Wl,kernel32.lib -Wl,user32.lib -Wl,gdi32.lib -Wl,winspool.lib -Wl,comdlg32.lib -Wl,advapi32.lib -Wl,shell32.lib -Wl,ole32.lib -Wl,oleaut32.lib -Wl,uuid.lib -Wl,odbc32.lib -Wl,odbccp32.lib"
+-		elif test $VENDOR = intel-linux; then
+-			export CC=icc
+-			export CXX=icpc
+-			export CFLAGS=" -D_INTEL_LINUX_"
+-			export CXXFLAGS=" -D_INTEL_LINUX_"
+-		elif test $VENDOR = intel-discover; then
+-			export CC=icc
+-			export CXX=icpc
+-			export CXXFLAGS=" -O3 -D_INTEL_LINUX_ -DMPICH_IGNORE_CXX_SEEK"
+-			export CFLAGS=" -O3 -D_INTEL_LINUX_ -DMPICH_IGNORE_CXX_SEEK"
+-		elif test $VENDOR = intel-pleiades; then
+-			export CC=icc
+-			export CXX=icpc
+-			export CXXFLAGS=" -O3 -D_INTEL_LINUX_ "
+-			export CFLAGS=" -O3 -D_INTEL_LINUX_ "
+-        else
+-		AC_MSG_ERROR([unknown compiler vendor!])
+-		fi
+-	fi
+-	AC_SUBST([OSLIBS]) 
+-	AC_MSG_RESULT(done)
+-	dnl }}}
+-	dnl matlab{{{
+-
+-	dnl 1. See if matlab has been provided
+-	AC_ARG_WITH([matlab-dir],
+-		AS_HELP_STRING([--with-matlab-dir=DIR], [matlab root directory. necessary for serial build.]),
+-		[MATLAB_ROOT=$withval],[MATLAB_ROOT=""]) 
+-
+-	AC_MSG_CHECKING([whether matlab is enabled])
+-	if test -d "$MATLAB_ROOT"; then
+-		HAVE_MATLAB=yes
+-	else
+-		HAVE_MATLAB=no
+-	fi
+-	if test x$HAVE_MATLAB = xyes; then
+-		AC_DEFINE([_HAVE_MATLAB_],[1],[with Matlab in ISSM src])
+-	fi
+-	AC_MSG_RESULT($HAVE_MATLAB)
+-	AM_CONDITIONAL([MATLAB], [test x$HAVE_MATLAB = xyes])
+-
+-	dnl 2. Get Matlab libraries
+-	if test x$HAVE_MATLAB = xyes; then
+-
+-		AC_MSG_CHECKING(for matlab headers and libraries in $MATLAB_ROOT)
+-  		MATLABINCL="-I$MATLAB_ROOT/extern/include/"
+-		
+-		dnl 4. get MEXLIB MEXLINK and MEXEXT (experimental)
+-      dnl OS-dependent variables and checks
+-  		case "${host_os}" in
+-  			*cygwin*) 
+-  				if  test $VENDOR = intel-win7-32; then
+-  					MEXLIB="-Wl,./../../c/libISSMCore.a -Wl,libISSMApi.a -Wl,libISSMMatlab.a -Wl,./../../c/libISSMModules.a -Wl,libmx.lib -Wl,libmex.lib -Wl,libmat.lib ${OSLIBS} -Wl,libf2cblas.lib -Wl,libf2clapack.lib" 
+-               MEXLINK="-Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win32/microsoft` -no-undefined -Wl,/export:mexFunction" 
+-  				elif  test l-win7-64; then
+-  					MEXLIB="-Wl,./../../c/libISSMCore.a -Wl,libISSMApi.a -Wl,libISSMMatlab.a -Wl,./../../c/libISSMModules.a -Wl,libmx.lib -Wl,libmex.lib -Wl,libmat.lib ${OSLIBS} -Wl,libf2cblas.lib -Wl,libf2clapack.lib" 
+-               MEXLINK="-Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win64/microsoft` -no-undefined -Wl,/export:mexFunction" 
+-  				fi
+-  				MEXEXT=`$MATLAB_ROOT/bin/mexext.bat`
+-  				MEXEXT=".$MEXEXT"
+-  			;;
+-		   *)
+-		      MEXLINK=$(mex -v 2>&1 < /dev/null | grep LDFLAGS     | sed -e "s/         LDFLAGS            = //g")
+-	         MEXLIB=$( mex -v 2>&1 < /dev/null | grep CXXLIBS     | sed -e "s/         CXXLIBS            = //g")
+-		      MEXEXT=$( mex -v 2>&1 < /dev/null | grep LDEXTENSION | sed -e "s/         LDEXTENSION        = //g")
+-  			;;
+-      esac
+-	   AC_MSG_RESULT(done)
+-
+-		AC_SUBST([MATLABINCL])
+-		AC_SUBST([MEX])
+-		MATLABWRAPPEREXT=$MEXEXT
+-		AC_SUBST([MATLABWRAPPEREXT])
+-	   AC_SUBST([MEXLIB]) 
+-		AC_SUBST([MEXLINK])
+-	fi
+-	dnl }}}
+-	dnl triangle {{{
+-	AC_ARG_WITH([triangle-dir],
+-		AS_HELP_STRING([--with-triangle-dir=DIR], [triangle root directory. necessary for serial build]),
+-		[TRIANGLE_ROOT=$withval],
+-		[TRIANGLE_ROOT=""]) 
+-	AC_ARG_WITH([triangle-include-dir],
+-		AS_HELP_STRING([--with-triangle-include-dir], [triangle include dir]),
+-		[TRIANGLE_INCL=$withval],
+-		[TRIANGLE_INCL="$TRIANGLE_ROOT"])
+-	AC_ARG_WITH([triangle-lib-dir],
+-		AS_HELP_STRING([--with-triangle-lib-dir], [triangle lib dir]),
+-		[TRIANGLE_LIB=$withval],
+-		[TRIANGLE_LIB="$TRIANGLE_ROOT"])
+-	AC_MSG_CHECKING(for triangle headers and libraries)
+-
+-	if test -d "$TRIANGLE_ROOT"; then
+-
+-		dnl defaults
+-		HAVE_TRIANGLE=yes
+-		TRIANGLEINCL=-I$TRIANGLE_INCL
+-
+-		case "${host_os}" in
+-				*cygwin*)
+-				TRIANGLELIB="-Wl,`cygpath -m $TRIANGLE_LIB/`triangle.lib"
+-				;;
+-				*linux*)
+-				TRIANGLELIB="-ltriangle"
+-				;;
+-				*darwin*)
+-				TRIANGLELIB=$TRIANGLE_LIB/triangle.a
+-				;;
+-			esac
+-
+-		AC_DEFINE([_HAVE_TRIANGLE_],[1],[with Triangle in ISSM src])
+-		AC_SUBST([TRIANGLEINCL])
+-		AC_SUBST([TRIANGLELIB])
+-
+-	else
+-		HAVE_TRIANGLE=no
+-	fi
+-	AC_MSG_RESULT($HAVE_TRIANGLE)
+-	dnl }}}
+-	dnl boost{{{
+-	AC_ARG_WITH([boost-dir],
+-	  AS_HELP_STRING([--with-boost-dir=DIR], [boost root directory.]),
+-	  [BOOST_ROOT=$withval],[BOOST_ROOT=""]) 
+-	AC_MSG_CHECKING(for boost)
+-	
+-	if test -d "$BOOST_ROOT"; then
+-		dnl defaults
+-		HAVE_BOOST=yes
+-		BOOSTINCL=-I$BOOST_ROOT/include
+-		BOOSTLIB="-L$BOOST_ROOT/lib -lboost_python"
+-
+-		AC_DEFINE([_HAVE_BOOST_],[1],[with Boost in ISSM src])
+-		AC_SUBST([BOOSTINCL])
+-		AC_SUBST([BOOSTLIB])
+-	else
+-		HAVE_BOOST=no
+-	fi
+-	AM_CONDITIONAL([BOOST], [test x$HAVE_BOOST = xyes])
+-	AC_MSG_RESULT($HAVE_BOOST)
+-	dnl }}}
+-	dnl dakota{{{
+-	AC_ARG_WITH([dakota-dir],
+-	  AS_HELP_STRING([--with-dakota-dir=DIR], [dakota root directory. necessary for serial build]),
+-	  [DAKOTA_ROOT=$withval],[DAKOTA_ROOT=""]) 
+-	AC_MSG_CHECKING(for dakota)
+-	
+-	if test -d "$DAKOTA_ROOT"; then
+-
+-		dnl defaults
+-		HAVE_DAKOTA=yes
+-		AC_MSG_RESULT($HAVE_DAKOTA)
+-		DAKOTAINCL=-I$DAKOTA_ROOT/include
+-		AC_MSG_CHECKING(for dakota version)
+-		if test -f "$DAKOTA_ROOT/../src/src/CommandLineHandler.C"; then
+-			DAKOTA_VERSION=`cat $DAKOTA_ROOT/../src/src/CommandLineHandler.C | grep 'DAKOTA version' | grep 'release' | grep -v // | sed 's/.*DAKOTA version //' | sed 's/ .*//' `
+-		else if test -f "$DAKOTA_ROOT/../src/src/CommandLineHandler.cpp"; then
+-			DAKOTA_VERSION=`cat $DAKOTA_ROOT/../src/src/CommandLineHandler.cpp | grep 'DAKOTA version' | grep 'release' | grep -v // | sed 's/.*DAKOTA version //' | sed 's/ .*//' `
+-		else
+-			AC_MSG_ERROR([Dakota CommandLineHandler.C or CommandLineHandler.cpp file not found to determine DAKOTA_VERSION!]);
+-		fi
+-		fi
+-
+-		AC_MSG_RESULT($DAKOTA_VERSION)
+-		AC_DEFINE_UNQUOTED([_DAKOTA_VERSION_],"$DAKOTA_VERSION",[Dakota version number])
+-		DAKOTAFLAGS=""
+-		case "${host_os}" in
+-			*cygwin*)
+-				if      test x$DAKOTA_VERSION = x4.2 || test x$DAKOTA_VERSION = x4.2+; then
+-					DAKOTALIB="-L$DAKOTA_ROOT/lib -ldakota -lteuchos -lpecos -lfftw3 -llhs -levidence -lsurfpack -lconmin -lddace -lfsudace -ljega -lcport -lopt -lpsuade -lnewmat -lncsuopt -lgsl -lquadrature -lcoliny -lcolin -lpebbl -lutilib -l3po -lnappspack -lappspack -lconveyor -lshared -lcdd -lamplsolver"
+-				else if test x$DAKOTA_VERSION = x5.1 || test x$DAKOTA_VERSION = x5.2; then
+-					DAKOTALIB="-L$DAKOTA_ROOT/lib -ldakota -lteuchos -lpecos -llhs -lsparsegrid -lsurfpack -lconmin -lddace -lfsudace -ljega -lcport -loptpp -lpsuade -lncsuopt -lcolin -linterfaces -lmomh -lscolib -lpebbl -ltinyxml -lutilib -l3po -lhopspack -lnidr -lamplsolver -lboost_signals -lboost_regex -lboost_filesystem"
+-				else
+-					AC_MSG_ERROR([Dakota version not found or version ($DAKOTA_VERSION) not supported!]);
+-				fi
+-				fi
+-			;;
+-			*linux*)
+-				if      test x$DAKOTA_VERSION = x4.2 || test x$DAKOTA_VERSION = x4.2+; then
+-					DAKOTALIB="-L$DAKOTA_ROOT/lib -ldakota -lteuchos -lpecos -lfftw3 -llhs -levidence -lsurfpack -lconmin -lddace -lfsudace -ljega -lcport -lopt -lpsuade -lnewmat -lncsuopt -lgsl -lquadrature -lcoliny -lcolin -lpebbl -lutilib -l3po -lnappspack -lappspack -lconveyor -lshared -lcdd -lamplsolver"
+-				else if test x$DAKOTA_VERSION = x5.1 || test x$DAKOTA_VERSION = x5.2; then
+-					DAKOTALIB="-L$DAKOTA_ROOT/lib -ldakota -lteuchos -lpecos -llhs -lsparsegrid -lsurfpack -lconmin -lddace -lfsudace -ljega -lcport -loptpp -lpsuade -lncsuopt -lcolin -linterfaces -lmomh -lscolib -lpebbl -ltinyxml -lutilib -l3po -lhopspack -lnidr -lamplsolver -lboost_signals -lboost_regex -lboost_filesystem -lboost_system -ldl"
+-				else if test x$DAKOTA_VERSION = x5.3 || test x$DAKOTA_VERSION = x5.3.1; then
+-					DAKOTAFLAGS="-DDISABLE_DAKOTA_CONFIG_H -DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DDAKOTA_PLUGIN -DBOOST_DISABLE_ASSERTS -DDAKOTA_HAVE_BOOST_FS -DHAVE_UNISTD_H -DHAVE_SYSTEM -DHAVE_WORKING_FORK -DHAVE_WORKING_VFORK -DHAVE_SYS_WAIT_H -DHAVE_USLEEP -DDAKOTA_F90 -DDAKOTA_HAVE_MPI -DHAVE_PECOS -DHAVE_SURFPACK -DDAKOTA_COLINY -DDAKOTA_UTILIB -DHAVE_ADAPTIVE_SAMPLING -DHAVE_CONMIN -DDAKOTA_DDACE -DHAVE_FSUDACE -DDAKOTA_HOPS -DHAVE_JEGA -DHAVE_NCSU -DHAVE_NL2SOL -DHAVE_OPTPP -DDAKOTA_OPTPP -DHAVE_PSUADE -DHAVE_AMPL"
+-					DAKOTALIB="-L$DAKOTA_ROOT/lib -ldakota_src -ldakota_src_fortran -lnidr -lteuchos -lpecos -lpecos_src -llhs -lmods -lmod -ldfftpack -lsparsegrid -lsurfpack -lsurfpack_fortran -lutilib -lcolin -linterfaces -lscolib -l3po -lpebbl -ltinyxml -lconmin -ldace -lanalyzer -lrandom -lsampling -lbose -lfsudace -lhopspack -ljega -ljega_fe -lmoga -lsoga -leutils -lutilities -lncsuopt -lcport -loptpp -lpsuade -lamplsolver -L$BOOST_ROOT/lib -lboost_signals -lboost_regex -lboost_filesystem -lboost_system "
+-				else
+-					AC_MSG_ERROR([Dakota version not found or version ($DAKOTA_VERSION) not supported!]);
+-				fi
+-				fi
+-				fi
+-			;;
+-			*darwin*)
+-				if      test x$DAKOTA_VERSION = x4.2 || test x$DAKOTA_VERSION = x4.2+; then
+-					DAKOTALIB="-L$DAKOTA_ROOT/lib -ldakota -lteuchos -lpecos -lfftw3 -llhs -levidence -lsurfpack -lconmin -lddace -lfsudace -ljega -lcport -lopt -lpsuade -lnewmat -lncsuopt -lgsl -lquadrature -lcoliny -lcolin -lpebbl -lutilib -l3po -lnappspack -lappspack -lconveyor -lshared -lcdd -lamplsolver" 
+-					dnl DAKOTALIB+= "-lgslcblas -L/usr/lib -lblas -llapack"
+-				else if test x$DAKOTA_VERSION = x5.1 || test x$DAKOTA_VERSION = x5.2; then
+-					DAKOTALIB="-L$DAKOTA_ROOT/lib -ldakota -lteuchos -lpecos -llhs -lsparsegrid -lsurfpack -lconmin -lddace -lfsudace -ljega -lcport -loptpp -lpsuade -lncsuopt -lcolin -linterfaces -lmomh -lscolib -lpebbl -ltinyxml -lutilib -l3po -lhopspack -lnidr -lamplsolver -lboost_signals -lboost_regex -lboost_filesystem -lboost_system"
+-					dnl DAKOTALIB+= "-lgslcblas -L/usr/lib -lblas -llapack"
+-				else
+-					AC_MSG_ERROR([Dakota version not found or version ($DAKOTA_VERSION) not supported!]);
+-				fi
+-				fi
+-			;;
+-		esac
+-		AC_DEFINE([_HAVE_DAKOTA_],[1],[with Dakota in ISSM src])
+-
+-		case $DAKOTA_VERSION in
+-			@<:@1-9@:>@.@<:@0-9@:>@.@<:@0-9@:>@)
+-				DAKOTA_MAJOR=`echo $DAKOTA_VERSION | sed -e 's/^\(@<:@0-9@:>@*\)\..*/\1/'`
+-				DAKOTA_MINOR=`echo $DAKOTA_VERSION | sed -e 's/^@<:@0-9@:>@*\.\(@<:@0-9@:>@*\)\..*/\1/'`
+-				DAKOTA_BUILD=`echo $DAKOTA_VERSION | sed -e 's/^@<:@0-9@:>@*\.@<:@0-9@:>@*\.\(@<:@0-9@:>@*\).*/\1/'`
+-			;;
+-			@<:@1-9@:>@.@<:@0-9@:>@)
+-				DAKOTA_MAJOR=`echo $DAKOTA_VERSION | sed -e 's/^\(@<:@0-9@:>@*\)\..*/\1/'`
+-				DAKOTA_MINOR=`echo $DAKOTA_VERSION | sed -e 's/^@<:@0-9@:>@*\.\(@<:@0-9@:>@*\).*/\1/'`
+-				DAKOTA_BUILD=0
+-			;;
+-			@<:@1-9@:>@.@<:@0-9@:>@+)
+-				DAKOTA_MAJOR=`echo $DAKOTA_VERSION | sed -e 's/^\(@<:@0-9@:>@*\)\..*/\1/'`
+-				DAKOTA_MINOR=`echo $DAKOTA_VERSION | sed -e 's/^@<:@0-9@:>@*\.\(@<:@0-9@:>@*\).*/\1/'`
+-				DAKOTA_BUILD=0
+-			;;
+-			*)
+-				AC_MSG_ERROR([Dakota version ($DAKOTA_VERSION) not supported!]);
+-		   ;;
+-		esac
+-		AC_MSG_CHECKING(for dakota major version)
+-		AC_MSG_RESULT($DAKOTA_MAJOR)
+-		AC_DEFINE_UNQUOTED([_DAKOTA_MAJOR_],$DAKOTA_MAJOR,[Dakota major version number])
+-		AC_MSG_CHECKING(for dakota minor version)
+-		AC_MSG_RESULT($DAKOTA_MINOR)
+-		AC_DEFINE_UNQUOTED([_DAKOTA_MINOR_],$DAKOTA_MINOR,[Dakota minor version number])
+-		AC_MSG_CHECKING(for dakota build version)
+-		AC_MSG_RESULT($DAKOTA_BUILD)
+-		AC_DEFINE_UNQUOTED([_DAKOTA_BUILD_],$DAKOTA_BUILD,[Dakota build version number])
+-
+-		AC_SUBST([DAKOTAINCL])
+-		AC_SUBST([DAKOTAFLAGS])
+-		AC_SUBST([DAKOTALIB])
+-
+-	else
+-		HAVE_DAKOTA=no
+-		AC_MSG_RESULT($HAVE_DAKOTA)
+-	fi
+-
+-	AM_CONDITIONAL([DAKOTA], [test x$HAVE_DAKOTA = xyes])
+-	dnl }}}
+-	dnl python{{{
+-	AC_ARG_WITH([python-dir],
+-		AS_HELP_STRING([--with-python-dir=DIR], [python root directory.]),
+-		[PYTHON_ROOT=$withval],
+-		[PYTHON_ROOT=""]) 
+-
+-	AC_ARG_WITH([python-include-dir],
+-		AS_HELP_STRING([--with-python-include-dir=DIR], [python include directory.]),
+-		[PYTHON_INCL=$withval],
+-		[PYTHON_INCL="$PYTHON_ROOT/include"]) 
+-
+-	AC_ARG_WITH([python-lib-dir],
+-		AS_HELP_STRING([--with-python-lib-dir=DIR], [python lib directory.]),
+-		[PYTHON_LIB=$withval],
+-		[PYTHON_LIB="$PYTHON_ROOT/lib"]) 
+-
+-	AC_MSG_CHECKING(for python)
+-	if test -d "$PYTHON_ROOT"; then
+-		HAVE_PYTHON="yes"
+-		AC_DEFINE([_HAVE_PYTHON_],[1],[with Python in ISSM src])
+-	else
+-		HAVE_PYTHON=no
+-	fi
+-	AC_MSG_RESULT($HAVE_PYTHON)
+-
+-	dnl get python version
+-	if test x$HAVE_PYTHON = xyes; then
+-		AC_MSG_CHECKING(for python version)
+-		dnl Query Python for its version number.  Getting [:3] seems to be
+-		dnl the best way to do this; it's what "site.py" does in the standard
+-		dnl library.
+-		PYTHON_VERSION=$($PYTHON_ROOT/bin/python -c "import sys; print sys.version[[:3]]")
+-		AC_MSG_RESULT($PYTHON_VERSION)
+-
+-		dnl recover major: 
+-		PYTHON_MAJOR=${PYTHON_VERSION%.*}
+-		if test x$PYTHON_MAJOR = x3; then
+-			dnl are we running python 3?
+-			HAVE_PYTHON3="yes"
+-		else
+-			HAVE_PYTHON3="no"
+-		fi
+-		AC_DEFINE_UNQUOTED([_PYTHON_MAJOR_],$PYTHON_MAJOR,[python version major])
+-
+-		PYTHONINCL="-I$PYTHON_INCL"
+-		PYTHONLIB="-L$PYTHON_LIB -lpython$PYTHON_VERSION"
+-		PYTHONEXT=.so
+-
+-		case "${host_os}" in
+-			*cygwin*)
+-			PYTHONLINK="-shared"
+-			;;
+-			*linux*)
+-			PYTHONLINK="-shared"
+-			;;
+-			*darwin*)
+-			PYTHONLINK="-dynamiclib"
+-			;;
+-		esac
+-
+-		AC_SUBST([PYTHONINCL])
+-		AC_SUBST([PYTHONLIB])
+-		PYTHONWRAPPEREXT=$PYTHONEXT
+-		AC_SUBST([PYTHONWRAPPEREXT])
+-		AC_SUBST([PYTHONLINK])
+-	fi
+-	AM_CONDITIONAL([PYTHON], [test x$HAVE_PYTHON = xyes])
+-	AM_CONDITIONAL([PYTHON3], [test x$HAVE_PYTHON3 = xyes])
+-	dnl }}}
+-	dnl python-numpy{{{
+-	AC_ARG_WITH([python-numpy-dir],
+-	  AS_HELP_STRING([--with-python-numpy-dir=DIR], [python-numpy root directory.]),
+-	  [PYTHON_NUMPY_ROOT=$withval],[PYTHON_NUMPY_ROOT=""]) 
+-	AC_MSG_CHECKING(for python-numpy)
+-	
+-	if test -d "$PYTHON_NUMPY_ROOT"; then
+-		dnl defaults
+-		HAVE_PYTHON_NUMPY=yes
+-		PYTHON_NUMPYINCL="-I$PYTHON_NUMPY_ROOT -I$PYTHON_NUMPY_ROOT/core/include/numpy"
+-
+-		AC_DEFINE([_HAVE_PYTHON_NUMPY_],[1],[with Python-Numpy in ISSM src])
+-		AC_SUBST([PYTHON_NUMPYINCL])
+-	else
+-		HAVE_PYTHON_NUMPY=no
+-	fi
+-	AC_MSG_RESULT($HAVE_PYTHON_NUMPY)
+-	dnl }}}
+-	dnl chaco{{{
+-	AC_ARG_WITH([chaco-dir],
+-	  AS_HELP_STRING([--with-chaco-dir=DIR], [chaco root directory.]),
+-	  [CHACO_ROOT=$withval],[CHACO_ROOT=""]) 
+-	AC_MSG_CHECKING(for chaco)
+-	
+-	if test -d "$CHACO_ROOT"; then
+-
+-		dnl defaults
+-		HAVE_CHACO=yes
+-		CHACOINCL=-I$CHACO_ROOT/include
+-		CHACOLIB="-L$CHACO_ROOT/lib -lchacominusblas"
+-
+-		AC_DEFINE([_HAVE_CHACO_],[1],[with Chaco in ISSM src])
+-		AC_SUBST([CHACOINCL])
+-		AC_SUBST([CHACOLIB])
+-
+-	else
+-		HAVE_CHACO=no
+-	fi
+-	AC_MSG_RESULT($HAVE_CHACO)
+-	dnl }}}
+-	dnl scotch{{{
+-	AC_ARG_WITH([scotch-dir],
+-	  AS_HELP_STRING([--with-scotch-dir=DIR], [scotch root directory.]),
+-	  [SCOTCH_ROOT=$withval],[SCOTCH_ROOT=""]) 
+-	AC_MSG_CHECKING(for scotch)
+-	
+-	if test -d "$SCOTCH_ROOT"; then
+-
+-		dnl defaults
+-		HAVE_SCOTCH=yes
+-		SCOTCHINCL="-DNOFILEIO -I$SCOTCH_ROOT/include -DSCOTCH_VERSION=\\\"UNKNOWN\\\""
+-		SCOTCHLIB="-L$SCOTCH_ROOT/lib -lnfioscotch -lnfioscotcherr -lnfioscotcherrexit -lscotchmetis"
+-
+-		AC_DEFINE([_HAVE_SCOTCH_],[1],[with Scotch in ISSM src])
+-		AC_SUBST([SCOTCHINCL])
+-		AC_SUBST([SCOTCHLIB])
+-
+-	else
+-		HAVE_SCOTCH=no
+-	fi
+-	AC_MSG_RESULT($HAVE_SCOTCH)
+-	dnl }}}
+-	dnl adolc{{{
+-	AC_ARG_WITH([adolc-dir],
+-		AS_HELP_STRING([--with-adolc-dir=DIR], [adolc root directory.]),
+-		[ADOLC_ROOT=$withval],[ADOLC_ROOT="no"]) 
+-	AC_MSG_CHECKING(for adolc)
+-
+-	if test "x$ADOLC_ROOT" = "xno"; then
+-		HAVE_ADOLC=no
+-	else
+-		if test -d "$ADOLC_ROOT"; then
+-
+-			dnl defaults
+-			HAVE_ADOLC=yes
+-			ADOLCINCL="-I$ADOLC_ROOT/include"
+-			ADOLCLIB="-L$ADOLC_ROOT/lib64 -ladolc"
+-
+-			AC_DEFINE([_HAVE_ADOLC_],[1],[with adolc in ISSM src])
+-			AC_SUBST([ADOLCINCL])
+-			AC_SUBST([ADOLCLIB])
+-
+-		else
+-			echo  "Specified directory does not exist!"
+-			exit 1
+-		fi
+-	fi
+-	AM_CONDITIONAL([ADOLC], [test x$HAVE_ADOLC = xyes])
+-	AC_MSG_RESULT($HAVE_ADOLC)
+-	dnl }}}
+-	dnl adolc-version{{{
+-	AC_ARG_WITH([adolc-version],
+-		AS_HELP_STRING([--with-adolc-version=number], [adolc version.]),
+-		[ADOLC_VERSION=$withval],[ADOLC_VERSION=2]) 
+-	AC_MSG_CHECKING(for adolc-version) 
+-
+-	AC_DEFINE_UNQUOTED([_ADOLC_VERSION_],$ADOLC_VERSION,[ADOLC version])
+-	AC_MSG_RESULT($ADOLC_VERSION)
+-	dnl }}}
+-	dnl adic2{{{
+-	AC_ARG_WITH([adic2-dir],
+-	  AS_HELP_STRING([--with-adic2-dir=DIR], [adic2 root directory.]),
+-	  [ADIC2_ROOT=$withval],[ADIC2_ROOT="no"]) 
+-	AC_MSG_CHECKING(for adic2)
+-
+-	if test "x$ADIC2_ROOT" = "xno"; then
+-		HAVE_ADIC2=no
+-	else
+-		if test -d "$ADIC2_ROOT"; then
+-
+-			dnl defaults
+-			HAVE_ADIC2=yes
+-			ADIC2INCL="-DADIC2_DENSE -I$ADIC2_ROOT/include -I$ADIC2_ROOT/share/runtime_dense/"
+-			ADIC2LIB=""
+-
+-			AC_DEFINE([_HAVE_ADIC2_],[1],[with adic2 in ISSM src])
+-			AC_SUBST([ADIC2INCL])
+-			AC_SUBST([ADIC2LIB])
+-
+-		else
+-			echo  "Specified directory does not exist!"
+-			exit 1
+-		fi
+-	fi
+-	AM_CONDITIONAL([ADIC2], [test x$HAVE_ADIC2 = xyes])
+-	AC_MSG_RESULT($HAVE_ADIC2)
+-	dnl }}}
+-	dnl gsl{{{
+-	AC_ARG_WITH([gsl-dir],
+-	  AS_HELP_STRING([--with-gsl-dir=DIR], [gsl root directory.]),
+-	  [GSL_ROOT=$withval],[GSL_ROOT=""]) 
+-	AC_MSG_CHECKING(for gsl)
+-	
+-	if test -d "$GSL_ROOT"; then
+-
+-		dnl defaults
+-		HAVE_GSL=yes
+-		GSLINCL="-I$GSL_ROOT/include"
+-		GSLLIB="-dy -L$GSL_ROOT/lib -lgsl -lgslcblas -lm"
+-
+-		AC_DEFINE([_HAVE_GSL_],[1],[with gsl in ISSM src])
+-		AC_SUBST([GSLINCL])
+-		AC_SUBST([GSLLIB])
+-
+-	else
+-		HAVE_GSL=no
+-	fi
+-	AM_CONDITIONAL([GSL], [test x$HAVE_GSL = xyes])
+-	AC_MSG_RESULT($HAVE_GSL)
+-	dnl }}}
+-	dnl rose{{{
+-	AC_ARG_WITH([rose-dir],
+-	  AS_HELP_STRING([--with-rose-dir=DIR], [rose root directory.]),
+-	  [ROSE_ROOT=$withval],[ROSE_ROOT=""]) 
+-	AC_MSG_CHECKING(for rose)
+-	
+-	if test -d "$ROSE_ROOT"; then
+-
+-		dnl defaults
+-		HAVE_ROSE=yes
+-		ROSEINCL="-I$ROSE_ROOT/include"
+-		ROSELIB=""
+-
+-		AC_DEFINE([_HAVE_ROSE_],[1],[with rose in ISSM src])
+-		AC_SUBST([ROSEINCL])
+-		AC_SUBST([ROSELIB])
+-
+-	else
+-		HAVE_ROSE=no
+-	fi
+-	AM_CONDITIONAL([ROSE], [test x$HAVE_ROSE = xyes])
+-	AC_MSG_RESULT($HAVE_ROSE)
+-	dnl }}}
+-	dnl mpi{{{
+-	AC_MSG_CHECKING(for mpi)
+-	
+-	AC_ARG_WITH([mpi-include],
+-	  AS_HELP_STRING([--with-mpi-include=DIR],[mpi include directory, necessary for parallel build]),
+-	  [MPI_INCLUDE=$withval],[MPI_INCLUDE=""])
+-
+-	AC_ARG_WITH([mpi-libdir],
+-	  AS_HELP_STRING([--with-mpi-libdir=DIR],[mpi lib directory, necessary for parallel build]),
+-	  [MPI_LIBDIR=$withval],[MPI_LIBDIR=""])
+-
+-	AC_ARG_WITH([mpi-libflags],
+-	  AS_HELP_STRING([--with-mpi-libflags=LIBS],[mpi libraries to be used, necessary for parallel build]),
+-	  [MPI_LIBFLAGS=$withval],[MPI_LIBFLAGS=""])
+-
+-	
+-	if test -z "$MPI_INCLUDE" ; then
+-		HAVE_MPI=no
+-	else
+-		HAVE_MPI=yes
+-
+-		dnl Processing for windows
+-		if  test x$VENDOR = xintel-win7-32; then
+-			MPI_LIBDIR=`cygpath -m $MPI_LIBDIR`
+-			MPIINCL=`cygpath -m $MPI_INCLUDE`
+-		elif test x$VENDOR = xintel-win7-64; then
+-			MPI_LIBDIR=`cygpath -m $MPI_LIBDIR`
+-			MPI_INCLUDE=`cygpath -m $MPI_INCLUDE`
+-		fi
+-
+-		if test -z "$MPI_LIBDIR"; then
+-			MPIINCL=-I"$MPI_INCLUDE"
+-			MPILIB="$MPI_LIBFLAGS"
+-		else
+-			MPIINCL=-I"$MPI_INCLUDE"
+-			MPILIB="-L$MPI_LIBDIR $MPI_LIBFLAGS"
+-		fi
+-		AC_DEFINE([_HAVE_MPI_],[1],[with Mpi in ISSM src])
+-		AC_DEFINE([HAVE_MPI],[1],[Mpi Flag for Dakota (DO NOT REMOVE)])
+-		AC_SUBST([MPIINCL])
+-		AC_SUBST([MPILIB])
+-	fi
+-
+-	AM_CONDITIONAL([MPI], [test x$HAVE_MPI = xyes])
+-	AC_MSG_RESULT($HAVE_MPI)
+-	dnl }}}
+-	dnl petsc{{{
+-	AC_ARG_WITH([petsc-dir],
+-	  AS_HELP_STRING([--with-petsc-dir=DIR],[PETSc root directory, necessary for parallel build]),
+-	  [PETSC_ROOT=$withval],[PETSC_ROOT=""])
+-		
+-	if test -d "$PETSC_ROOT"; then
+-		AC_MSG_CHECKING(for petsc version)
+-		PETSC_MAJOR=`cat $PETSC_ROOT/include/petscversion.h | grep "#define PETSC_VERSION_MAJOR" | sed 's/#define PETSC_VERSION_MAJOR//' | sed 's/ //g'`
+-		PETSC_MINOR=`cat $PETSC_ROOT/include/petscversion.h | grep "#define PETSC_VERSION_MINOR" | sed 's/#define PETSC_VERSION_MINOR//' | sed 's/ //g'`
+-		AC_DEFINE_UNQUOTED([_PETSC_MAJOR_],$PETSC_MAJOR,[PETSc version major])
+-		AC_DEFINE_UNQUOTED([_PETSC_MINOR_],$PETSC_MINOR,[PETSc version minor])
+-		AC_MSG_RESULT($PETSC_MAJOR.$PETSC_MINOR)
+-
+-		PETSC_VERSION_DATE_HG=`cat $PETSC_ROOT/include/petscversion.h | grep "#define PETSC_VERSION_DATE_HG" | sed 's/#define PETSC_VERSION_DATE_HG//' | sed 's/ //g' | sed -e 's/\"//g' `
+-		PETSC_RELEASE=`cat $PETSC_ROOT/include/petscversion.h | grep "#define PETSC_VERSION_RELEASE" | sed 's/#define PETSC_VERSION_RELEASE//' | sed 's/ //g'`
+-
+-		AC_MSG_CHECKING(whether petsc is the development version)
+-		dnl if test x$PETSC_VERSION_DATE_HG = xunknown; then
+-		if test "$PETSC_RELEASE" = "0"; then
+-		   AC_DEFINE([_HAVE_PETSCDEV_],[1],[with PETSc-dev])
+-			AC_MSG_RESULT(yes)
+-		else
+-			AC_MSG_RESULT(no)
+-		fi
+-	fi
+-	
+-	AC_ARG_WITH([petsc-arch],
+-	  AS_HELP_STRING([--with-petsc-arch=DIR],[PETSc arch , necessary for parallel build]),
+-	  [PETSC_ARCH=$withval],[PETSC_ARCH=""])
+-
+-	AC_MSG_CHECKING(for petsc headers and libraries in $PETSC_ROOT for architecture $PETSC_ARCH)
+-	
+-	dnl To ge PETSc's libraries:
+-	dnl cd externalpackages/petsc/src
+-	dnl make getlinklibs
+-	if test -d "$PETSC_ROOT"; then
+-
+-	 PETSCINCL=" -I$PETSC_ROOT/include"
+-	 dnl Add other location (not needed anymore since at least PETSc 3.0)
+-	 if test "x$PETSC_ARCH" != "x" && test -d "$PETSC_ROOT/$PETSC_ARCH/include"; then
+-	  PETSCINCL+=" $PETSC_ROOT/$PETSC_ARCH/include"
+-	 fi
+-	 if test "x$PETSC_ARCH" != "x" && test -d "$PETSC_ROOT/include/$PETSC_ARCH"; then
+-	  PETSCINCL+=" $PETSC_ROOT/include/$PETSC_ARCH"
+-	 fi
+-	
+-	 case "${host_os}" in
+-			*cygwin*)
+-			if test $PETSC_MAJOR -lt 3 ; then
+-				PETSCLIB=-Wl,/LIBPATH:`cygpath -w $PETSC_ROOT/lib`  -Wl,libpetscksp.lib  -Wl,libpetscdm.lib  -Wl,libpetscmat.lib  -Wl,libpetscvec.lib  -Wl,libpetscsnes.lib  -Wl,libpetscts.lib  -Wl,libmpiuni.lib  -Wl,libpetsc.lib
+-			else
+-				PETSCLIB="-L$PETSC_ROOT/lib  -Wl,libpetsc.lib"
+-				if test $PETSC_MAJOR -gt 3 || test $PETSC_MINOR -ge 3; then PETSCLIB+="  -Wl,libmetis.lib"; fi
+-			fi
+-			;;
+-			*linux*)
+-			if test $PETSC_MAJOR -lt 3 ; then
+-				PETSCLIB="-L$PETSC_ROOT/lib -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsnes -lpetscts -lmpiuni -lpetsc"
+-			else
+-				PETSCLIB="-L$PETSC_ROOT/lib -lpetsc -ldl"
+-				if test $PETSC_MAJOR -gt 3 || test $PETSC_MINOR -ge 3; then PETSCLIB+=" -lmetis"; fi
+-			fi
+-			;;
+-			*darwin*)
+-			if test $PETSC_MAJOR -lt 3 ; then
+-				PETSCLIB="-L$PETSC_ROOT/lib -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsnes -lpetscts -lpetsc"
+-			else
+-				PETSCLIB="-L$PETSC_ROOT/lib -lpetsc"
+-				if test $PETSC_MAJOR -gt 3 || test $PETSC_MINOR -ge 3; then PETSCLIB+=" -lmetis"; fi
+-			fi
+-			;;
+-		esac
+-		AC_DEFINE([_HAVE_PETSC_],[1],[with PETSc in ISSM src])
+-		AC_SUBST([PETSCINCL])
+-		AC_SUBST([PETSCLIB])
+-		HAVE_PETSC=yes
+-	else
+-		HAVE_PETSC=no
+-	fi
+-	
+-	AM_CONDITIONAL([PETSC], [test x$HAVE_PETSC = xyes])
+-	AC_MSG_RESULT($HAVE_PETSC)
+-	dnl }}}
+-	dnl metis{{{
+-	if test "$HAVE_PETSC" = "yes" && test "x$PETSC_MAJOR" = "x3" && test $PETSC_MINOR -ge 3; then
+-
+-		dnl in petsc >=3.3, metis is provided
+-		HAVE_METIS="yes"
+-		AC_DEFINE([_METIS_VERSION_],[5],[ Metis version number])
+-		AC_DEFINE([_HAVE_METIS_],[1],[with Metis in ISSM src])
+-	else
+-		AC_ARG_WITH([metis-dir],
+-		  AS_HELP_STRING([--with-metis-dir=DIR],[metis root directory. necessary for serial build]),
+-		  [METIS_ROOT=$withval],[METIS_ROOT=""])
+-
+-		AC_MSG_CHECKING(for metis headers and libraries in $METIS_ROOT)
+-
+-		if test -d "$METIS_ROOT"; then
+-
+-			dnl first figure out version of metis: does the VERSION file exist?
+-			if test -e "$METIS_ROOT/VERSION"; then
+-				METIS_VERSION=4
+-			else
+-				METIS_VERSION=5
+-			fi
+-
+-			dnl defaults
+-			HAVE_METIS=yes
+-
+-			if test "$METIS_VERSION" = "4" ; then
+-					
+-				METISINCL=-I"$METIS_ROOT/Lib" 
+-				case "${host_os}" in
+-					*cygwin*)
+-					METISLIB="-L$METIS_ROOT -Wl,libmetis.lib"
+-					;;
+-					*linux*)
+-					METISLIB=-L"$METIS_ROOT/ -lmetis"
+-					;;
+-					*darwin*)
+-					METISLIB=-L"$METIS_ROOT/ -lmetis"
+-					;;
+-				esac
+-
+-					AC_DEFINE([_METIS_VERSION_],[4],[ Metis version number])
+-			fi
+-			if test "$METIS_VERSION" = "5" ; then
+-		
+-				case "${host_os}" in
+-					*cygwin*)
+-					METISLIB="-L$METIS_ROOT libmetis.lib"
+-					;;
+-					*linux*)
+-					METISLIB=-L"$METIS_ROOT/lib -lmetis"
+-					;;
+-					*darwin*)
+-					METISLIB=-L"$METIS_ROOT/lib -lmetis"
+-					;;
+-				esac
+-
+-				METISINCL=-I"$METIS_ROOT/include" 
+-				AC_DEFINE([_METIS_VERSION_],[5],[ Metis version number])
+-			fi
+-
+-			AC_DEFINE([_HAVE_METIS_],[1],[with Metis in ISSM src])
+-			AC_SUBST([METISINCL])
+-			AC_SUBST([METISLIB])
+-		else
+-			HAVE_METIS=no
+-		fi
+-		AC_MSG_RESULT($HAVE_METIS)
+-	fi
+-	AM_CONDITIONAL([METIS], [test x$HAVE_METIS = xyes])
+-	dnl }}}
+-	dnl tao{{{
+-	AC_ARG_WITH([tao-dir],
+-		AS_HELP_STRING([--with-tao-dir=DIR], [tao root directory.]),
+-		[TAO_ROOT=$withval],[TAO_ROOT=""]) 
+-	AC_MSG_CHECKING(for tao)
+-
+-	if test -d "$TAO_ROOT"; then
+-
+-	  HAVE_TAO=yes
+-	  TAOINCL="-I$TAO_ROOT/ -I$TAO_ROOT/include -I$TAO_ROOT/bmake/ "
+-	  TAOLIB="-L$TAO_ROOT/lib -ltao -lpetsc"
+-
+-	  AC_DEFINE([_HAVE_TAO_],[1],[with Tao in ISSM src])
+-	  AC_SUBST([TAOINCL])
+-	  AC_SUBST([TAOLIB])
+-	else
+-		HAVE_TAO=no
+-	fi
+-	AC_MSG_RESULT($HAVE_TAO)
+-	dnl }}}
+-	dnl slepc{{{
+-	AC_ARG_WITH([slepc-dir],
+-	  AS_HELP_STRING([--with-slepc-dir=DIR],[slepc root directory]),
+-	  [SLEPC_ROOT=$withval],[SLEPC_ROOT=""])
+-			  
+-	AC_MSG_CHECKING(for slepc headers and libraries in $SLEPC_ROOT)
+-	if test -d "$SLEPC_ROOT"; then
+-		HAVE_SLEPC=yes
+-		SLEPCINCL=-I"$SLEPC_ROOT/include"
+-		SLEPCLIB=-L"$SLEPC_ROOT/lib/ -lslepc"
+-
+-		AC_DEFINE([_HAVE_SLEPC_],[1],[with Slepc in ISSM src])
+-		AC_SUBST([SLEPCINCL])
+-		AC_SUBST([SLEPCLIB])
+-	else
+-		HAVE_SLEPC=no
+-	fi
+-	AC_MSG_RESULT($HAVE_SLEPC)
+-	dnl }}}
+-	dnl shapelib{{{
+-	AC_ARG_WITH([shapelib-dir],
+-	  AS_HELP_STRING([--with-shapelib-dir=DIR], [shapelib root directory]),
+-	  [SHAPELIB_ROOT=$withval],[SHAPELIB_ROOT=""])
+-			  
+-	AC_MSG_CHECKING(for shapelib headers and libraries in $SHAPELIB_ROOT)
+-	if test -d "$SHAPELIB_ROOT"; then
+-
+-		dnl defaults
+-		HAVE_SHAPELIB=yes
+-		SHAPELIBINCL=-I"$SHAPELIB_ROOT/include"
+-		SHAPELIBLIB=-L"$SHAPELIB_ROOT/lib/ -lshape"
+-
+-		AC_DEFINE([_HAVE_SHAPELIB_],[1],[with Shapelib in ISSM src])
+-		AC_SUBST([SHAPELIBINCL])
+-		AC_SUBST([SHAPELIBLIB])
+-	else
+-		HAVE_SHAPELIB=no
+-	fi
+-	AC_MSG_RESULT($HAVE_SHAPELIB)
+-	dnl }}}
+-	dnl scalapack{{{
+-	AC_ARG_WITH([scalapack-dir],
+-	  AS_HELP_STRING([--with-scalapack-dir=DIR],[scalapack root directory]),
+-	  [SCALAPACK_ROOT=$withval],[SCALAPACK_ROOT=""])
+-			  
+-	AC_MSG_CHECKING(for scalapack headers and libraries in $SCALAPACK_ROOT)
+-	if test -d "$SCALAPACK_ROOT"; then
+-
+-		dnl defaults
+-		HAVE_SCALAPACK=yes
+-		if test x$VENDOR = xintel-discover; then
+-		 SCALAPACKLIB=-L"$SCALAPACK_ROOT/ -lmkl_scalapack_lp64"
+-		else
+-		 SCALAPACKLIB=-L"$SCALAPACK_ROOT/ -lscalapack"
+-		fi
+-
+-		AC_DEFINE([_HAVE_SCALAPACK_],[1],[with Scalapack in ISSM src])
+-		AC_SUBST([SCALAPACKLIB])
+-	else
+-		HAVE_SCALAPACK=no
+-	fi
+-	AC_MSG_RESULT($HAVE_SCALAPACK)
+-	dnl }}}
+-	dnl blas{{{
+-	AC_ARG_WITH([blas-lapack-dir],
+-	  AS_HELP_STRING([--with-blas-lapack-dir=DIR],[blas-lapack root directory]),
+-	  [BLASLAPACK_ROOT=$withval],[BLASLAPACK_ROOT=""])
+-			  
+-	AC_MSG_CHECKING(for blas and lapack headers and libraries in $BLASLAPACK_ROOT)
+-	if test -d "$BLASLAPACK_ROOT"; then
+-
+-		dnl defaults
+-		HAVE_BLASLAPACK=yes
+-		BLASLAPACKINCL=""
+-	
+-		if test x$VENDOR = xintel-discover; then
+-		 BLASLAPACKLIB=-L"$BLASLAPACK_ROOT -lmkl_lapack -lmkl -lguide -lpthread"
+-		else
+-		dnl: branch on whether we are running on windows or linux.
+-		case "${host_os}" in
+-			*cygwin*)
+-			BLASLAPACKLIB="-L`cygpath -m $BLASLAPACK_ROOT` -Wl,libf2cblas.lib  -Wl,libf2clapack.lib"
+-			;;
+-			*linux*)
+-			BLASLAPACKLIB=-L"$BLASLAPACK_ROOT/lib -lflapack -lfblas " 
+-			;;
+-			*darwin*)
+-			BLASLAPACKLIB=-L"$BLASLAPACK_ROOT/lib -lflapack -lfblas " 
+-			;;
+-		esac
+-		fi
+-
+-		AC_DEFINE([_HAVE_BLASLAPACK_],[1],[with blas lapack in ISSM src])
+-		AC_SUBST([BLASLAPACKLIB])
+-		AC_SUBST([BLASLAPACKINCL])
+-	else
+-		HAVE_BLASLAPACK=no
+-	fi
+-	AC_MSG_RESULT($HAVE_BLASLAPACK)
+-	dnl }}}
+-	dnl mkl{{{
+-	AC_ARG_WITH([mkl-dir],
+-	  AS_HELP_STRING([--with-mkl-dir=DIR],[mkl root directory]),
+-	  [MKL_ROOT=$withval],[MKL_ROOT=""])
+-			  
+-	AC_MSG_CHECKING(for mkl headers and libraries in $MKL_ROOT)
+-	if test -d "$MKL_ROOT"; then
+-
+-		dnl defaults
+-		HAVE_MKL=yes
+-		MKLINCL=""
+-		if test x$VENDOR = xintel-pleiades; then
+-		 MKLLIB=-L"$MKL_ROOT -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread"
+-		else
+-		 MKLLIB=-L"$MKL_ROOT -lmkl -lmkl_lapack -lmkl_scalapack_ilp64 -lmkl_blacs_sgimpt_ilp64 -lguide -lpthread"
+-		fi
+-		AC_DEFINE([_HAVE_MKL_],[1],[with mkl in ISSM src])
+-		AC_SUBST([MKLLIB])
+-		AC_SUBST([MKLINCL])
+-	else
+-		HAVE_MKL=no
+-	fi
+-	AC_MSG_RESULT($HAVE_MKL)
+-	dnl }}}
+-	dnl plapack{{{
+-	AC_MSG_CHECKING(for plapack)
+-	
+-	AC_ARG_WITH([plapack-lib],
+-	  AS_HELP_STRING([--with-plapack-lib = lib],[plapack library]),
+-	  [PLAPACK_LIB=$withval],[PLAPACK_LIB=""])
+-	
+-	AC_ARG_WITH([plapack-include],
+-			  AS_HELP_STRING([--with-plapack-include = include],
+-							 [plapack include ]),
+-			  [PLAPACK_INCLUDE=$withval],[PLAPACK_INCLUDE=""])
+-	  
+-	if test -n "$PLAPACK_LIB"; then
+-		if test -n "$PLAPACK_INCLUDE"; then
+-		
+-			dnl defaults
+-			HAVE_PLAPACK=yes
+-			PLAPACKINCL="$PLAPACK_INCLUDE"
+-			PLAPACKLIB="$PLAPACK_LIB"
+-
+-			AC_DEFINE([_HAVE_PLAPACK_],[1],[with Plapack in ISSM src])
+-			AC_SUBST([PLAPACKINCL])
+-			AC_SUBST([PLAPACKLIB])
+-		else
+-			HAVE_PLAPACK=no
+-		fi
+-	else
+-		HAVE_PLAPACK=no
+-	fi
+-	AC_MSG_RESULT($HAVE_PLAPACK)
+-	dnl }}}
+-	dnl mumps{{{
+-	AC_ARG_WITH([mumps-dir],
+-	  AS_HELP_STRING([--with-mumps-dir=DIR],[mumps root directory]),
+-	  [MUMPS_ROOT=$withval],[MUMPS_ROOT=""])
+-			  
+-	AC_MSG_CHECKING(for mumps headers and libraries in $MUMPS_ROOT)
+-	if test -d "$MUMPS_ROOT"; then
+-
+-		dnl defaults
+-		HAVE_MUMPS=yes
+-		MUMPSINCL=-I"$MUMPS_ROOT/include"
+-		if test "$PETSC_MAJOR" = "2" ; then
+-		MUMPSLIB=-L"$MUMPS_ROOT/lib -ldmumps -lcmumps  -lpord "
+-		else
+-		dnl MUMPSLIB=-L"$MUMPS_ROOT/lib -ldmumps -lcmumps  -lmumps_common -lpord -lparmetis -lzmumps"
+-		MUMPSLIB=-L"$MUMPS_ROOT/lib -ldmumps -lcmumps  -lmumps_common -lpord -lparmetis"
+-		fi
+-
+-		AC_DEFINE([_HAVE_MUMPS_],[1],[with Mumps in ISSM src])
+-		AC_SUBST([MUMPSINCL])
+-		AC_SUBST([MUMPSLIB])
+-	else
+-		HAVE_MUMPS=no
+-	fi
+-	AM_CONDITIONAL([MUMPS], [test x$HAVE_MUMPS = xyes])
+-	AC_MSG_RESULT($HAVE_MUMPS)
+-	dnl }}}
+-	dnl blacs{{{
+-	AC_ARG_WITH([blacs-dir],
+-		AS_HELP_STRING([--with-blacs-dir=DIR],[blacs root directory]),
+-			  [BLACS_ROOT=$withval],[BLACS_ROOT=""])
+-			  
+-	AC_MSG_CHECKING(for blacs headers and libraries in $BLACS_ROOT)
+-	if test -d "$BLACS_ROOT"; then
+-
+-		dnl defaults
+-		HAVE_BLACS=yes
+-		BLACSINCL=""
+-		if test x$VENDOR = xintel-discover; then
+-		 BLACSLIB=-L"$BLACS_ROOT/ -lmkl_blacs_intelmpi_lp64"
+-		else
+-		 BLACSLIB=-L"$BLACS_ROOT/ -lblacs"
+-		fi
+-        
+-		AC_DEFINE([_HAVE_BLACS_],[1],[with Blacs in ISSM src])
+-		AC_SUBST([BLACSINCL])
+-		AC_SUBST([BLACSLIB])
+-	else
+-		HAVE_BLACS=no
+-	fi
+-	AC_MSG_RESULT($HAVE_BLACS)
+-	dnl }}}
+-	dnl hypre{{{
+-	AC_ARG_WITH([hypre-dir],
+-	  AS_HELP_STRING([--with-hypre-dir=DIR],[hypre root directory]),
+-			  [HYPRE_ROOT=$withval],[HYPRE_ROOT=""])
+-			  
+-	AC_MSG_CHECKING(for hypre headers and libraries in $HYPRE_ROOT)
+-	if test -d "$HYPRE_ROOT"; then
+-
+-		dnl defaults
+-		HAVE_HYPRE=yes
+-		HYPREINCL=""
+-		HYPRELIB=-L"$HYPRE_ROOT/lib -lHYPRE"
+-        
+-		AC_DEFINE([_HAVE_HYPRE_],[1],[with Blacs in ISSM src])
+-		AC_SUBST([HYPREINCL])
+-		AC_SUBST([HYPRELIB])
+-	else
+-		HAVE_HYPRE=no
+-	fi
+-	AC_MSG_RESULT($HAVE_HYPRE)
+-	dnl }}}
+-	dnl prometheus{{{
+-		AC_ARG_WITH([prometheus-dir],
+-					AS_HELP_STRING([--with-prometheus-dir=DIR],[prometheus root directory]),
+-					[PROMETHEUS_ROOT=$withval],[PROMETHEUS_ROOT=""])
+-
+-		  AC_MSG_CHECKING(for prometheus headers and libraries in $PROMETHEUS_ROOT)
+-		  if test -d "$PROMETHEUS_ROOT"; then
+-
+-			dnl defaults
+-			  HAVE_PROMETHEUS=yes
+-			  PROMETHEUSINCL=-I"$PROMETHEUS_ROOT/include"
+-			  PROMETHEUSLIB=-L"$PROMETHEUS_ROOT/lib -lpromfei -lprometheus -lparmetis"
+-
+-			  AC_DEFINE([_HAVE_PROMETHEUS_],[1],[with Prometheus in ISSM src])
+-			  AC_SUBST([PROMETHEUSINCL])
+-			  AC_SUBST([PROMETHEUSLIB])
+-		  else
+-				HAVE_PROMETHEUS=no
+-			fi
+-			AC_MSG_RESULT($HAVE_PROMETHEUS)
+-		dnl }}}
+-dnl spai{{{
+-	AC_ARG_WITH([spai-dir],
+-				AS_HELP_STRING([--with-spai-dir=DIR],[spai root directory]),
+-				[SPAI_ROOT=$withval],[SPAI_ROOT=""])
+-
+-	  AC_MSG_CHECKING(for spai headers and libraries in $SPAI_ROOT)
+-	  if test -d "$SPAI_ROOT"; then
+-
+-		dnl defaults
+-		  HAVE_SPAI=yes
+-		  SPAIINCL=-I"$SPAI_ROOT/include"
+-		  SPAILIB=-L"$SPAI_ROOT/lib -lspai"
+-
+-		  AC_DEFINE([_HAVE_SPAI_],[1],[with Spai in ISSM src])
+-		  AC_SUBST([SPAIINCL])
+-		  AC_SUBST([SPAILIB])
+-	  else
+-		HAVE_SPAI=no
+-		  fi
+-		  AC_MSG_RESULT($HAVE_SPAI)
+-		  dnl }}}
+-dnl superlu{{{ 
+-	AC_ARG_WITH([superlu-dir],
+-				AS_HELP_STRING([--with-superlu-dir=DIR],[superlu root directory]),
+-				[SUPERLU_ROOT=$withval],[SUPERLU_ROOT=""])
+-
+-	  AC_MSG_CHECKING(for superlu headers and libraries in $SUPERLU_ROOT)
+-	  if test -d "$SUPERLU_ROOT"; then
+-
+-		dnl defaults
+-		  HAVE_SUPERLU=yes
+-		  SUPERLUINCL=-I"$SUPERLU_ROOT/include"
+-		  SUPERLULIB=-L"$SUPERLU_ROOT/lib -lsuperlu_4.3"
+-
+-		  AC_DEFINE([_HAVE_SUPERLU_],[1],[with Superlu in ISSM src])
+-		  AC_SUBST([SUPERLUINCL])
+-		  AC_SUBST([SUPERLULIB])
+-	  else
+-		HAVE_SUPERLU=no
+-		  fi
+-		  AC_MSG_RESULT($HAVE_SUPERLU)
+-		  dnl }}}
+-dnl spooles{{{ 
+-	AC_ARG_WITH([spooles-dir],
+-				AS_HELP_STRING([--with-spooles-dir=DIR],[spooles root directory]),
+-				[SPOOLES_ROOT=$withval],[SPOOLES_ROOT=""])
+-
+-	  AC_MSG_CHECKING(for spooles headers and libraries in $SPOOLES_ROOT)
+-	  if test -d "$SPOOLES_ROOT"; then
+-
+-		dnl defaults
+-		  HAVE_SPOOLES=yes
+-		  SPOOLESINCL=-I"$SPOOLES_ROOT/include"
+-		  SPOOLESLIB=-L"$SPOOLES_ROOT/lib -lspooles"
+-
+-		  AC_DEFINE([_HAVE_SPOOLES_],[1],[with Spooles in ISSM src])
+-		  AC_SUBST([SPOOLESINCL])
+-		  AC_SUBST([SPOOLESLIB])
+-	  else
+-		HAVE_SPOOLES=no
+-		  fi
+-		  AC_MSG_RESULT($HAVE_SPOOLES)
+-		  dnl }}}
+-dnl pastix{{{ 
+-	AC_ARG_WITH([pastix-dir],
+-				AS_HELP_STRING([--with-pastix-dir=DIR],[pastix root directory]),
+-				[PASTIX_ROOT=$withval],[PASTIX_ROOT=""])
+-
+-	  AC_MSG_CHECKING(for pastix headers and libraries in $PASTIX_ROOT)
+-	  if test -d "$PASTIX_ROOT"; then
+-
+-		dnl defaults
+-		  HAVE_PASTIX=yes
+-		  PASTIXINCL=-I"$PASTIX_ROOT/include"
+-		  PASTIXLIB=-L"$PASTIX_ROOT/lib -lpastix_XXbit_mpi_smp_nobubble_int32_simple_real_scotch_i686_pc_linux -lptscotch -lptscotcherr -lpastix"
+-
+-		  AC_DEFINE([_HAVE_PASTIX_],[1],[with Pastix in ISSM src])
+-		  AC_SUBST([PASTIXINCL])
+-		  AC_SUBST([PASTIXLIB])
+-	  else
+-		HAVE_PASTIX=no
+-		  fi
+-		  AC_MSG_RESULT($HAVE_PASTIX)
+-		  dnl }}}
+-	dnl ml{{{
+-	AC_ARG_WITH([ml-dir],
+-	  AS_HELP_STRING([--with-ml-dir=DIR],[ml root directory]),
+-			  [ML_ROOT=$withval],[ML_ROOT=""])
+-			  
+-	AC_MSG_CHECKING(for ml headers and libraries in $ML_ROOT)
+-	if test -d "$ML_ROOT"; then
+-
+-		dnl defaults
+-		HAVE_ML=yes
+-		MLINCL=-I"$ML_ROOT/include"
+-		MLLIB=-L"$ML_ROOT/lib -lml"
+-        
+-		AC_DEFINE([_HAVE_ML_],[1],[with Blacs in ISSM src])
+-		AC_SUBST([MLINCL])
+-		AC_SUBST([MLLIB])
+-	else
+-		HAVE_ML=no
+-	fi
+-	AC_MSG_RESULT($HAVE_ML)
+-	dnl }}}
+-	dnl umfpack{{{
+-		AC_ARG_WITH([umfpack-dir],
+-		  AS_HELP_STRING([--with-umfpack-dir=DIR],[UMFPACK root directory]),
+-					[UMFPACK_ROOT=$withval],[UMFPACK_ROOT=""])
+-
+-		AC_MSG_CHECKING(for UMFPACK headers and libraries in $UMFPACK_ROOT)
+-		if test -d "$UMFPACK_ROOT"; then
+-
+-			dnl defaults
+-			HAVE_UMFPACK=yes
+-			UMFPACKINCL=""
+-			UMFPACKLIB=-L"$UMFPACK_ROOT/lib -lumfpack -lumfpack.5.5.1"
+-
+-			AC_DEFINE([_HAVE_UMFPACK_],[1],[with UMFPACK in ISSM src])
+-			AC_SUBST([UMFPACKINCL])
+-			AC_SUBST([UMFPACKLIB])
+-		else
+-			HAVE_UMFPACK=no
+-		fi
+-		AC_MSG_RESULT($HAVE_UMFPACK)
+-	dnl }}}
+-dnl math{{{
+-	AC_MSG_CHECKING(for math library)
+-	AC_ARG_WITH([math-lib],
+-	  AS_HELP_STRING([--with-math-lib = otions],[math options, for ex: "/usr/lib/libm.a]),
+-	  [MATH_LIB=$withval],[MATH_LIB=""])
+-
+-	dnl check that --with-math-lib may have been provided
+-	if test -n "$MATH_LIB" ; then
+-		HAVE_MATH=yes
+-		MATHLIB="$MATH_LIB"
+-
+-		AC_DEFINE([_HAVE_MATH_],[1],[with MATH in ISSM src])
+-		AC_SUBST([MATHLIB])
+-	fi
+-	AC_MSG_RESULT(done)
+-	dnl }}}
+-	dnl fortran{{{
+-	AC_ARG_WITH([fortran],
+-		AS_HELP_STRING([--with-fortran = YES], [do we compile fortran code (default is yes)]),
+-		[FORTRAN=$withval],[FORTRAN=yes]) 
+-	AC_MSG_CHECKING(for fortran compilation)
+-	if test "x$FORTRAN" = "xyes"; then
+-		dnl defaults
+-		HAVE_FORTRAN=yes
+-
+-		AC_DEFINE([_HAVE_FORTRAN_],[1],[with fortran capability])
+-	else
+-		HAVE_FORTRAN=no
+-	fi
+-	AM_CONDITIONAL([FORTRAN], [test x$FORTRAN = xyes])
+-	AC_MSG_RESULT($FORTRAN)
+-
+-	if test "x$FORTRAN" = "xyes"; then
+-		dnl fortran library  option
+-		AC_MSG_CHECKING(for fortran library)
+-		AC_ARG_WITH([fortran-lib],
+-		  AS_HELP_STRING([--with-fortran-lib = options],[fortran options, for ex: "/usr/lib/gfortran.a]),
+-			[FORTRAN_LIB=$withval],[FORTRAN_LIB=""])
+-
+-		dnl check that --with-fortran-lib may have been provided
+-		if test -n "$FORTRAN_LIB" ; then
+-			dnl check that library provided EXISTS!
+-		   FORTRAN_DIR=$(echo $FORTRAN_LIB | sed -e "s/-L//g" | awk '{print $[1]}')
+-			if test -d "$FORTRAN_DIR" || test -f "$FORTRAN_DIR"; then
+-				FORTRANLIB="$FORTRAN_LIB"
+-				AC_DEFINE([_HAVE_FORTRAN_],[1],[with FORTRAN in ISSM src])
+-				AC_SUBST([FORTRANLIB])
+-			else
+-			 if test "x$HAVE_MPI" = "xyes"; then
+-				FORTRANLIB=$(mpif77 -print-file-name="libgfortran.a")
+-				if test -f "$FORTRANLIB"; then
+-					 AC_MSG_ERROR([fortran library provided ($FORTRAN_LIB) does not exist, MPI suggests the following library: $FORTRANLIB]);
+-				fi
+-			 fi
+-				AC_MSG_ERROR([fortran library provided ($FORTRAN_LIB) does not exist!]);
+-			fi
+-		fi
+-		AC_MSG_RESULT(done)
+-	fi
+-	dnl }}}
+-	dnl graphics{{{
+-	AC_MSG_CHECKING(for graphics library)
+-	AC_ARG_WITH([graphics-lib],
+-	  AS_HELP_STRING([--with-graphics-lib = options],[graphics options, for ex: "/usr/X11/lib/libX11.a]),
+-	  [GRAPHICS_LIB=$withval],[GRAPHICS_LIB=""])
+-
+-	dnl check that --with-graphics-lib may have been provided
+-	
+-	if test -n "$GRAPHICS_LIB" ; then
+-		dnl check that library provided EXISTS!
+-		GRAPHICS_DIR=$(echo $GRAPHICS_LIB | sed -e "s/-L//g" | awk '{print $[1]}')
+-		if test -d "$GRAPHICS_DIR" || test -f "$GRAPHICS_DIR"; then
+-			HAVE_GRAPHICS=yes
+-			GRAPHICSLIB="$GRAPHICS_LIB"
+-			AC_DEFINE([_HAVE_GRAPHICS_],[1],[with GRAPHICS in ISSM src])
+-			AC_SUBST([GRAPHICSLIB])
+-		else
+-			if test -f "$PETSC_ROOT/conf/petscvariables"; then
+-				GRAPHICSLIB=$(cat $PETSC_ROOT/conf/petscvariables | grep X_LIB)
+-				AC_MSG_ERROR([graphics library provided ($GRAPHICS_LIB) does not exist, PETSc suggests the following library: $GRAPHICSLIB]);
+-			fi
+-			AC_MSG_ERROR([graphics library provided ($GRAPHICS_LIB$) does not exist!]);
+-		fi
+-	fi
+-	AC_MSG_RESULT(done)
+-	dnl }}}
+-
+-	dnl Capabilities
+-	dnl with-kml{{{
+-	AC_ARG_WITH([kml],
+-		AS_HELP_STRING([--with-kml = YES],[compile with kml capabilities (default is yes)]),
+-		[KML=$withval],[KML=yes]) 
+-	AC_MSG_CHECKING(for kml capability compilation)
+-
+-	if test "x$KML" = "xyes"; then
+-		HAVE_KML=yes
+-		AC_DEFINE([_HAVE_KML_],[1],[with kml capability])
+-	else
+-		HAVE_KML=no
+-	fi
+-	AM_CONDITIONAL([KML], [test x$HAVE_KML = xyes])
+-	AC_MSG_RESULT($HAVE_KML)
+-	dnl }}}
+-	dnl with-kriging{{{
+-	AC_ARG_WITH([kriging],
+-		AS_HELP_STRING([--with-kriging = YES],[compile with kriging capabilities (default is yes)]),
+-		[KRIGING=$withval],[KRIGING=yes]) 
+-	AC_MSG_CHECKING(for kriging capability compilation)
+-
+-	if test "x$KRIGING" = "xyes"; then
+-		HAVE_KRIGING=yes
+-		AC_DEFINE([_HAVE_KRIGING_],[1],[with kriging capability])
+-	else
+-		HAVE_KRIGING=no
+-	fi
+-	AM_CONDITIONAL([KRIGING], [test x$HAVE_KRIGING = xyes])
+-	AC_MSG_RESULT($HAVE_KRIGING)
+-	dnl }}}
+-	dnl with-steadystate{{{
+-	AC_ARG_WITH([steadystate],
+-		AS_HELP_STRING([--with-steadystate = YES],[compile with steadystate capabilities (default is yes)]),
+-		[STEADYSTATE=$withval],[STEADYSTATE=yes]) 
+-	AC_MSG_CHECKING(for steadystate capability compilation)
+-
+-	if test "x$STEADYSTATE" = "xyes"; then
+-
+-		dnl defaults
+-		HAVE_STEADYSTATE=yes
+-
+-		AC_DEFINE([_HAVE_STEADYSTATE_],[1],[with steadystate capability])
+-	else
+-		HAVE_STEADYSTATE=no
+-	fi
+-	AM_CONDITIONAL([STEADYSTATE], [test x$HAVE_STEADYSTATE = xyes])
+-	AC_MSG_RESULT($HAVE_STEADYSTATE)
+-	dnl }}}
+-	dnl with-transient{{{
+-	AC_ARG_WITH([transient],
+-		AS_HELP_STRING([--with-transient = YES], [compile with transient capabilities (default is yes)]),
+-		[TRANSIENT=$withval],[TRANSIENT=yes]) 
+-	AC_MSG_CHECKING(for transient capability compilation)
+-
+-	if test "x$TRANSIENT" = "xyes"; then
+-
+-		dnl defaults
+-		HAVE_TRANSIENT=yes
+-
+-		AC_DEFINE([_HAVE_TRANSIENT_],[1],[with transient capability])
+-	else
+-		HAVE_TRANSIENT=no
+-	fi
+-	AM_CONDITIONAL([TRANSIENT], [test x$HAVE_TRANSIENT = xyes])
+-	AC_MSG_RESULT($HAVE_TRANSIENT)
+-	dnl }}}
+-	dnl with-thermal{{{
+-	AC_ARG_WITH([thermal],
+-		AS_HELP_STRING([--with-thermal = YES], [compile with thermal capabilities (default is yes)]),
+-		[THERMAL=$withval],[THERMAL=yes]) 
+-	AC_MSG_CHECKING(for thermal capability compilation)
+-
+-	if test "x$THERMAL" = "xyes"; then
+-
+-		dnl defaults
+-		HAVE_THERMAL=yes
+-
+-		AC_DEFINE([_HAVE_THERMAL_],[1],[with thermal capability])
+-	else
+-		HAVE_THERMAL=no
+-	fi
+-	AM_CONDITIONAL([THERMAL], [test x$HAVE_THERMAL = xyes])
+-	AC_MSG_RESULT($HAVE_THERMAL)
+-	dnl }}}
+-	dnl with-prognostic{{{
+-	AC_ARG_WITH([prognostic],
+-		AS_HELP_STRING([--with-prognostic = YES], [compile with prognostic capabilities (default is yes)]),
+-		[PROGNOSTIC=$withval],[PROGNOSTIC=yes]) 
+-	AC_MSG_CHECKING(for prognostic capability compilation)
+-
+-	if test "x$PROGNOSTIC" = "xyes"; then
+-
+-		dnl defaults
+-		HAVE_PROGNOSTIC=yes
+-
+-		AC_DEFINE([_HAVE_PROGNOSTIC_],[1],[with prognostic capability])
+-	else
+-		HAVE_PROGNOSTIC=no
+-	fi
+-	AM_CONDITIONAL([PROGNOSTIC], [test x$HAVE_PROGNOSTIC = xyes])
+-	AC_MSG_RESULT($HAVE_PROGNOSTIC)
+-	dnl }}}
+-	dnl with-control{{{
+-	AC_ARG_WITH([control],
+-		AS_HELP_STRING([--with-control = YES], [compile with control capabilities (default is yes)]),
+-		[CONTROL=$withval],[CONTROL=yes]) 
+-	AC_MSG_CHECKING(for control capability compilation)
+-
+-	if test "x$CONTROL" = "xyes"; then
+-
+-		dnl defaults
+-		HAVE_CONTROL=yes
+-
+-		AC_DEFINE([_HAVE_CONTROL_],[1],[with control capability])
+-	else
+-		HAVE_CONTROL=no
+-	fi
+-	AM_CONDITIONAL([CONTROL], [test x$HAVE_CONTROL = xyes])
+-	AC_MSG_RESULT($HAVE_CONTROL)
+-	dnl }}}
+-	dnl with-hydrology{{{
+-	AC_ARG_WITH([hydrology],
+-		AS_HELP_STRING([--with-hydrology = YES], [compile with hydrology capabilities (default is yes)]),
+-		[HYDROLOGY=$withval],[HYDROLOGY=yes]) 
+-	AC_MSG_CHECKING(for hydrology capability compilation)
+-
+-	if test "x$HYDROLOGY" = "xyes"; then
+-
+-		dnl defaults
+-		HAVE_HYDROLOGY=yes
+-
+-		AC_DEFINE([_HAVE_HYDROLOGY_],[1],[with hydrology capability])
+-	else
+-		HAVE_HYDROLOGY=no
+-	fi
+-	AM_CONDITIONAL([HYDROLOGY], [test x$HAVE_HYDROLOGY = xyes])
+-	AC_MSG_RESULT($HAVE_HYDROLOGY)
+-	dnl }}}
+-	dnl with-diagnostic{{{
+-	AC_ARG_WITH([diagnostic],
+-		AS_HELP_STRING([--with-diagnostic = YES], [compile with diagnostic capabilities (default is yes)]),
+-		[DIAGNOSTIC=$withval],[DIAGNOSTIC=yes]) 
+-	AC_MSG_CHECKING(for diagnostic capability compilation)
+-
+-	if test "x$DIAGNOSTIC" = "xyes"; then
+-
+-		dnl defaults
+-		HAVE_DIAGNOSTIC=yes
+-
+-		AC_DEFINE([_HAVE_DIAGNOSTIC_],[1],[with diagnostic capability])
+-	else
+-		HAVE_DIAGNOSTIC=no
+-	fi
+-	AM_CONDITIONAL([DIAGNOSTIC], [test x$HAVE_DIAGNOSTIC = xyes])
+-	AC_MSG_RESULT($HAVE_DIAGNOSTIC)
+-	dnl }}}
+-	dnl with-balanced{{{
+-	AC_ARG_WITH([balanced],
+-		AS_HELP_STRING([--with-balanced = YES], [compile with balanced capabilities (default is yes)]),
+-		[BALANCED=$withval],[BALANCED=yes]) 
+-	AC_MSG_CHECKING(for balanced capability compilation)
+-
+-	if test "x$BALANCED" = "xyes"; then
+-
+-		dnl defaults
+-		HAVE_BALANCED=yes
+-
+-		AC_DEFINE([_HAVE_BALANCED_],[1],[with balanced capability])
+-	else
+-		HAVE_BALANCED=no
+-	fi
+-	AM_CONDITIONAL([BALANCED], [test x$HAVE_BALANCED = xyes])
+-	AC_MSG_RESULT($HAVE_BALANCED)
+-	dnl }}}
+-	dnl with-responses{{{
+-	AC_ARG_WITH([responses],
+-		AS_HELP_STRING([--with-responses = YES], [compile with responses capabilities (default is yes)]),
+-		[RESPONSES=$withval],[RESPONSES=yes]) 
+-	AC_MSG_CHECKING(for responses capability compilation)
+-
+-	if test "x$RESPONSES" = "xyes"; then
+-
+-		dnl defaults
+-		HAVE_RESPONSES=yes
+-
+-		AC_DEFINE([_HAVE_RESPONSES_],[1],[with responses capability])
+-	else
+-		HAVE_RESPONSES=no
+-	fi
+-	AM_CONDITIONAL([RESPONSES], [test x$HAVE_RESPONSES = xyes])
+-	AC_MSG_RESULT($HAVE_RESPONSES)
+-	dnl }}}
+-	dnl with-slope{{{
+-	AC_ARG_WITH([slope],
+-		AS_HELP_STRING([--with-slope = YES], [compile with slope capabilities (default is yes)]),
+-		[SLOPE=$withval],[SLOPE=yes]) 
+-	AC_MSG_CHECKING(for slope capability compilation)
+-
+-	if test "x$SLOPE" = "xyes"; then
+-
+-		dnl defaults
+-		HAVE_SLOPE=yes
+-
+-		AC_DEFINE([_HAVE_SLOPE_],[1],[with slope capability])
+-	else
+-		HAVE_SLOPE=no
+-	fi
+-	AM_CONDITIONAL([SLOPE], [test x$HAVE_SLOPE = xyes])
+-	AC_MSG_RESULT($HAVE_SLOPE)
+-	dnl }}}
+-	dnl with-groundingline{{{
+-	AC_ARG_WITH([groundingline],
+-		AS_HELP_STRING([--with-groundingline = YES], [compile with groundingline capabilities (default is yes)]),
+-		[GROUNDINGLINE=$withval],[GROUNDINGLINE=yes]) 
+-	AC_MSG_CHECKING(for groundingline capability compilation)
+-
+-	if test "x$GROUNDINGLINE" = "xyes"; then
+-
+-		dnl defaults
+-		HAVE_GROUNDINGLINE=yes
+-
+-		AC_DEFINE([_HAVE_GROUNDINGLINE_],[1],[with groundingline capability])
+-	else
+-		HAVE_GROUNDINGLINE=no
+-	fi
+-	AM_CONDITIONAL([GROUNDINGLINE], [test x$HAVE_GROUNDINGLINE = xyes])
+-	AC_MSG_RESULT($HAVE_GROUNDINGLINE)
+-	dnl }}}
+-	dnl with-rifts{{{
+-	AC_ARG_WITH([rifts],
+-		AS_HELP_STRING([--with-rifts = YES], [compile with rifts capabilities (default is yes)]),
+-		[RIFTS=$withval],[RIFTS=yes]) 
+-	AC_MSG_CHECKING(for rifts capability compilation)
+-
+-	if test "x$RIFTS" = "xyes"; then
+-
+-		dnl defaults
+-		HAVE_RIFTS=yes
+-
+-		AC_DEFINE([_HAVE_RIFTS_],[1],[with rifts capability])
+-	else
+-		HAVE_RIFTS=no
+-	fi
+-	AM_CONDITIONAL([RIFTS], [test x$HAVE_RIFTS = xyes])
+-	AC_MSG_RESULT($HAVE_RIFTS)
+-	dnl }}}
+-	dnl math77{{{
+-	AC_ARG_WITH([math77-dir],
+-		AS_HELP_STRING([--with-math77-dir=DIR], [math77 root directory.]),
+-		[MATH77_ROOT=$withval],[MATH77_ROOT=""]) 
+-	AC_MSG_CHECKING(for math77)
+-
+-	if test -d "$MATH77_ROOT"; then
+-
+-	  HAVE_MATH77=yes
+-	  MATH77LIB="-L$MATH77_ROOT/ -lmath77"
+-
+-	  AC_DEFINE([_HAVE_MATH77_],[1],[with math77 in ISSM src])
+-	  AC_SUBST([MATH77LIB])
+-	else
+-		HAVE_MATH77=no
+-	fi
+-	AC_MSG_RESULT($HAVE_MATH77)
+-	dnl }}}
+-	dnl with-gia{{{
+-	AC_ARG_WITH([gia],
+-		AS_HELP_STRING([--with-gia = YES], [compile with gia capabilities (default is yes)]),
+-		[GIA=$withval],[GIA=no]) 
+-	AC_MSG_CHECKING(for gia capability compilation)
+-
+-	if test "x$GIA" = "xyes"; then
+-	  
+-	  if test "x$HAVE_MATH77" = "xno"; then
+-		  HAVE_GIA=no
+-		  AC_MSG_ERROR([gia requires compilation of math77 library! Reconfigure with --with-math77 option on]);
+-	  else
+-		dnl defaults
+-		HAVE_GIA=yes
+-		AC_DEFINE([_HAVE_GIA_],[1],[with gia capability])
+-	  fi
+-
+-	else
+-		HAVE_GIA=no
+-	fi
+-	AM_CONDITIONAL([GIA], [test x$HAVE_GIA = xyes])
+-	AC_MSG_RESULT($HAVE_GIA)
+-	dnl }}}
+-	dnl with-ios{{{
+-	AC_ARG_WITH([ios],
+-		AS_HELP_STRING([--with-ios = YES], [compile with iOS capabilities (default is no, alternatives are yes)]),
+-		[IOS=$withval],[IOS=no]) 
+-	AC_MSG_CHECKING(for iOS compilation)
+-
+-	if test "x$IOS" = "xyes"; then
+-		dnl defaults
+-		HAVE_IOS=yes
+-
+-		AC_DEFINE([_HAVE_IOS_],[1],[with android capability])
+-	elif test "x$IOS" = "xno"; then
+-		HAVE_IOS=no
+-	else
+-	  AC_MSG_ERROR([--with-ios should be either no or yes])
+-	fi
+-	AM_CONDITIONAL([IOS], [test x$HAVE_IOS != xno])
+-	AC_MSG_RESULT($HAVE_IOS)
+-	dnl }}}
+-	dnl with-android{{{
+-	AC_ARG_WITH([android],
+-		AS_HELP_STRING([--with-android = EXE], [compile with android capabilities (default is no, alternatives are exe and jni)]),
+-		[ANDROID=$withval],[ANDROID=no]) 
+-	AC_MSG_CHECKING(for android capability compilation)
+-
+-	if test "x$ANDROID" = "xjni"; then
+-
+-		dnl defaults
+-		HAVE_ANDROID=jni
+-		AC_DEFINE([_HAVE_ANDROID_],[1],[with android capability])
+-		AC_DEFINE([_HAVE_ANDROID_JNI_],[1],[with android jni])
+-	elif test "x$ANDROID" = "xexe"; then
+-		dnl defaults
+-		HAVE_ANDROID=exe
+-
+-		AC_DEFINE([_HAVE_ANDROID_],[1],[with android capability])
+-	elif test "x$ANDROID" = "xno"; then
+-		HAVE_ANDROID=no
+-	else
+-	  AC_MSG_ERROR([--with-android should be either no, exe or jni])
+-	fi
+-	AM_CONDITIONAL([ANDROID], [test x$HAVE_ANDROID != xno])
+-	AM_CONDITIONAL([ANDROIDJNI], [test x$HAVE_ANDROID = xjni])
+-	AM_CONDITIONAL([ANDROIDEXE], [test x$HAVE_ANDROID = xexe])
+-	AC_MSG_RESULT($HAVE_ANDROID)
+-	dnl }}}
+-	dnl with-android-ndk{{{
+-	AC_ARG_WITH([android-ndk],
+-	  AS_HELP_STRING([--with-android-ndk=DIR], [android-ndk root directory.]),
+-	  [ANDROID_NDK_ROOT=$withval],[ANDROID_NDK_ROOT=""]) 
+-	AC_MSG_CHECKING(with android ndk)
+-	
+-	if test -d "$ANDROID_NDK_ROOT"; then
+-		dnl defaults
+-		HAVE_ANDROID_NDK=yes
+-		ANDROID_NDKINCL="-I$ANDROID_NDK_ROOT/arm-linux-android-install/sysroot/usr/include"
+-
+-		AC_DEFINE([_HAVE_ANDROID_NDK_],[1],[with android ndk in ISSM src])
+-		AC_SUBST([ANDROID_NDKINCL])
+-	else
+-		HAVE_ANDROID_NDK=no
+-	fi
+-	AC_MSG_RESULT($HAVE_ANDROID_NDK)
+-	dnl }}}
+-	dnl with-3d{{{
+-	AC_ARG_WITH([3d],
+-		AS_HELP_STRING([--with-3d = YES], [compile with 3d capabilities (default is yes)]),
+-		[THREED=$withval],[THREED=yes]) 
+-	AC_MSG_CHECKING(for 3d capability compilation)
+-
+-	if test "x$THREED" = "xyes"; then
+-
+-		dnl defaults
+-		HAVE_3D=yes
+-
+-		AC_DEFINE([_HAVE_3D_],[1],[with 3d capability])
+-	else
+-		HAVE_3D=no
+-	fi
+-	AM_CONDITIONAL([THREED], [test x$HAVE_3D = xyes])
+-	AC_MSG_RESULT($HAVE_3D)
+-	dnl }}}
+-	dnl checks{{{
+-	AC_MSG_CHECKING(consistency between all libraries)
+-	
+-	dnl check that if petsc is requested , mpi should be specified
+-	if test "$HAVE_PETSC" = "yes" ; then
+-		if test "$HAVE_MPI" = "NO";  then
+-			AC_MSG_ERROR([petsc requires mpi!]);
+-		fi
+-	fi
+-
+-	dnl check that we have either python or matlab support if we compile the modules
+-	if test "$MODULES_VALUE" = "yes"  && test "$HAVE_MATLAB" = "no" && test "$HAVE_PYTHON" = "no"; then
+-		AC_MSG_ERROR([need at least python or matlab support to compile modules (or use --with-modules=no)]);
+-	fi
+-
+-	dnl check that if we have MPI, we have metis
+-	if test "$HAVE_METIS" = "yes"  && test "$HAVE_MPI" = "no" ; then
+-	AC_MSG_ERROR([need mpi if using the metis partitioner!]);
+-	fi
+-
+-	AC_MSG_RESULT(done)
+-	dnl }}}
+-
+-	dnl other options
+-	dnl optimization{{{
+-	dnl bypass standard optimization -g -O2 ? 
+-	AC_ARG_WITH([cxxoptflags],
+-	  AS_HELP_STRING([--with-cxxoptflags = CXXOPTFLAGS], [optimization using CXX flags, ex: --with-cxxoptflags=-march=opteron -O3]),
+-	  [CXXOPTFLAGS=$withval],[CXXOPTFLAGS="-g -O2"]) 
+-	AC_MSG_CHECKING(for c++ optimization flags)
+-	AC_SUBST([CXXOPTFLAGS])
+-	AC_MSG_RESULT(done)
+-
+-	dnl }}}
+-	dnl multithreading{{{
+-	AC_ARG_WITH([numthreads],
+-	  AS_HELP_STRING([--with-numthreads = NUMTHREADS_VALUE],[numthreads, default is 1. ]),
+-	  [NUMTHREADS_VALUE=$withval],[NUMTHREADS_VALUE=1])
+-	AC_MSG_CHECKING(for number of threads)
+-	dnl defaults
+-	MULTITHREADING=no
+-	MULTITHREADINLIB=""
+-	if test "$NUMTHREADS_VALUE" != "1"; then
+-		
+-		MULTITHREADINGLIB="-lpthread -lrt"
+-		case "${host_os}" in
+-		*cygwin*)
+-		MULTITHREADINGLIB="-lpthread -lrt"
+-		;;
+-		*linux*)
+-		MULTITHREADINGLIB="-lpthread -lrt"
+-		;;
+-		*darwin*)
+-		MULTITHREADINGLIB="-lpthread"
+-		;;
+-		esac
+-
+-		AC_DEFINE([_MULTITHREADING_],[1],[with numthreads enabled])
+-		AC_DEFINE_UNQUOTED([_NUMTHREADS_],[$NUMTHREADS_VALUE],[number of threads])
+-	fi
+-	AC_SUBST([MULTITHREADINGLIB])
+-	AC_MSG_RESULT($NUMTHREADS_VALUE) 
+-	dnl }}}
+-	dnl 64bit {{{
+-	AC_ARG_WITH([64bit-indices],
+-	  AS_HELP_STRING([--with-64bit-indices = bool], [use 64 bit integers, default 0, ex: --with-64bit-indices=1]),
+-	  [USE_64BIT_INDICES=$withval],[USE_64BIT_INDICES=0]) 
+-	AC_MSG_CHECKING(for 64 bit indices)
+-
+-	if test "$USE_64BIT_INDICES" == "1"; then
+-	AC_DEFINE([ISSM_USE_64BIT_INDICES],[1],[with 64 bits indices])
+-	else
+-	AC_DEFINE([ISSM_USE_64BIT_INDICES],[0],[with 64 bits indices])
+-	fi
+-	AC_MSG_RESULT($USE_64BIT_INDICES)
+-	dnl }}}
+-])
+Index: ../trunk-jpl/packagers/ubuntu/issmpkg/install-3.2-linux64.sh
+===================================================================
+--- ../trunk-jpl/packagers/ubuntu/issmpkg/install-3.2-linux64.sh	(revision 18435)
++++ ../trunk-jpl/packagers/ubuntu/issmpkg/install-3.2-linux64.sh	(revision 18436)
+@@ -1,37 +0,0 @@
+-#!/bin/bash
+-set -eu
+-
+-#Some cleanup
+-rm -rf install petsc-3.2-p3 src
+-mkdir install src
+-
+-#Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-3.2-p3.tar.gz' 'petsc-3.2-p3.tar.gz'
+-
+-#Untar and move petsc to install directory
+-tar -zxvf  petsc-3.2-p3.tar.gz
+-mv petsc-3.2-p3/* src/
+-rm -rf petsc-3.2-p3
+-
+-#configure
+-cd src
+-./config/configure.py \
+-	--prefix="$ISSM_DIR/externalpackages/petsc/install" \
+-	--with-mpi-dir="/usr/lib/mpich2/" \
+-	--with-clanguage=C++ \
+-	--PETSC_ARCH=linux-gnu-amd64 \
+-	--PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
+-	--with-debugging=0 \
+-	--with-shared-libraries=1 \
+-	--download-mumps=yes \
+-	--download-scalapack=yes \
+-	--download-blacs=yes \
+-	--download-blas=yes \
+-	--download-f-blas-lapack=yes \
+-	--download-plapack=yes \
+-	--download-parmetis=yes \
+-	--with-pic=1
+-
+-#Compile petsc and install it
+-make
+-make install
+Index: ../trunk-jpl/packagers/ubuntu/issmpkg/triangle.h.patch
+===================================================================
+--- ../trunk-jpl/packagers/ubuntu/issmpkg/triangle.h.patch	(revision 18435)
++++ ../trunk-jpl/packagers/ubuntu/issmpkg/triangle.h.patch	(revision 18436)
+@@ -1,12 +0,0 @@
+-250a251,257
+-> /*Patch for ISSM*/
+-> #ifndef REAL
+-> typedef double REAL;
+-> typedef void VOID;
+-> #endif
+-> /*End patch*/
+-> 
+-283c290
+-< void triangulate(char *, struct triangulateio *, struct triangulateio *,
+----
+-> extern "C" void triangulate(char *, struct triangulateio *, struct triangulateio *,
+Index: ../trunk-jpl/packagers/ubuntu/issmpkg/README
+===================================================================
+--- ../trunk-jpl/packagers/ubuntu/issmpkg/README	(revision 18435)
++++ ../trunk-jpl/packagers/ubuntu/issmpkg/README	(revision 18436)
+@@ -1,138 +0,0 @@
+-UNDER CONSTRUCTION - UNDER CONSTRUCTION - UNDER CONSTRUCTION - UNDER CONSTRUCTION 
+-
+-PREFACE:
+-	There are configuration files included in the dir where this document
+-	 resides. Use them, that's why they're there. But I know, since some of
+-	 you like to go against the grain, at least one of you is going to try
+-	 building a package from an install that differs from mine.
+-
+-	If you choose to go down that dark road, then bear in mind that there
+-	 are ways to do this right, and there are ways to do this wrong....
+-	 Make sure that you mind where you decide to install the bin and lib.
+-	 If you specify a target outside of the trunk, and don't, let's say,
+-	 write the same dir somewhere else, then the package won't work. 
+-
+-	Make sure when putting together a dir hierarchy for a package, that you
+-	 create something sime to what you specifed during compile. If you
+-	 change "--bindir" then create a dir in the package that corresponds to
+-	 that. The trunk doesn't necessarily have to be in the same place as it
+-	 is on the build system.
+-
+--------------------------------------------------------------------------------
+-		    Installing ISSM to create a deb package:
+--------------------------------------------------------------------------------
+-
+-1.	Install mpich from the ubuntu repositories:
+-
+-		> sudo apt-get install mpich2 (or something similar)
+-
+-		Check to make sure that it installs the "-dev" libs
+-			if not:
+-			 > sudo apt-get install libmpich-dev (or something similar)
+-			Otherwise you won't get "/usr/lib/mpich2"
+-
+-		You can use "apt-cache search" to find a package's full name
+-
+-2a.	Compile petsc and metis (preferred versions: 3.2 and 4.0, respectively):
+-
+-		Make sure that petsc's installer file is pointing to the
+-		 correct mpich dir
+-
+-			You should use "/usr/lib/mpich2" (or something similar)
+-
+-		As of now, it is preferable to use the separate mpich package
+-		 because the infrastructure of the mpich package under petsc
+-		 is having issues with being packaged
+-
+-		Also make sure that you mind the target of the installation.
+-			Right now /usr/share/petsc and /usr/share/metis are the
+-			 best options suffixed by version numbers
+-
+-2b.	Install dependencies from the ubuntu repositories
+-
+-		Use apt-get install to install:
+-			triangle-bin, libtriangle-dev, python2.7-dev, 
+-			 python-scipy, python-netcdf4, netcdf-bin, python-nose, 
+-			 libnetcdfc++4, hdf5-tools
+-
+-		REMEMBER: that this tutorial assumes you are creating the
+-		 python interface
+-			
+-3.	Be sure to patch the system triangle.h file
+-
+-		> sudo patch /usr/include/triangle.h $ISSM_DIR/externalpackages/triangle/triangle.h.patch
+-			the header may also be called "libtriangle.h"
+-
+-		Just like always, this will move the original to 
+-		 "triangle.h.old" incase you need to revert
+-
+-4.	Compile ISSM
+-
+-		> autoreconf -iv && configs/config-*-packaging.sh && make && sudo -E make install
+-
+--------------------------------------------------------------------------------
+-		          Creating an issm.deb package
+--------------------------------------------------------------------------------
+-	THIS ASSUMES YOU ARE USING THE CONFIG FILE SUPPLIED HERE.
+-	IF YOU ARE DOING AN ALTERNATE CONFIG, MAKE SURE THE DIR
+-	HIERARCHY IS PROPERLY REFLECTED BY THE BINDIR AND LIBDIR!
+-
+-1.	Make a directory to work from (the dir dpkg-deb will build)
+-		Anywhere will do, but using a ~/tmp dir works best
+-
+-		> mkdir issmpkgdir
+-		> cd issmpkgdir
+-
+-2.	Create the dir hierarchy:
+-
+-		> mkdir -p usr/{bin,lib,share/issm-trunk} etc/issm DEBIAN
+-
+-		This is will create:
+-		issmpkgdir/
+-		|_ usr/
+-		|  |_ bin/
+-		|  |_ lib/
+-		|  |_ share/
+-		|     |_issm-trunk/ - this is the trunk
+-		|_ etc/
+-		|  |_ issm/ - this is where issmrc and other conf files go
+-		|_DEBIAN/ - where control files and install scripts go
+-
+-		As stated, if you change "--bindir" or "--libdir" in the config
+-		 file, then make sure that you create matching dirs in this
+-		 step, or vice-versa.
+-
+-3.	Copy the contents of the package over:
+-
+-		> sudo cp -r /usr/bin/issm usr/bin
+-		> sudo cp -r /usr/lib/issm usr/lib
+-		> cp -r $ISSM_DIR/* usr/share/issm-trunk
+-
+-		When you copy the trunk over, this your opportunity to weed out
+-		 anything you don't want included in the build.
+-		Again, the config file installs the bin and lib files to a dir
+-		 that's separate from the rest of the bin and lib files. If you
+-		 change "--bindir" or "--libdir", make sure you install them to
+-		 a subdirectory of your target to keep things neat or else 
+-		 you'll have to pick them out, one-by-one to complete this step.
+-
+-4.	Write your control file. A template is provided, that is the bare minimum to
+-		 create the package 
+-
+-		You will NEED the following dependencies:
+-		mpich2, petsc3.2-issm, metis4.0-issm, triangle-bin, libtriangle-dev, 
+-		 python2.7-dev, python-scipy, python-netcdf4, netcdf-bin, python-nose, 
+-		 libnetcdfc++4, hdf5-tools
+-
+-5.	Create any install/uninstall scripts needed (preinst, postinst, prerm, postrm)
+-		There are already some templates provided for you.
+-
+-		Make sure you address the issue of any user created content. By
+-		 default, apt-get won't remove anything that wasn't created by
+-		 the installer, even if you use purge. Put this in a rm script.
+-
+-6.	Build the package:
+-
+-		> dpkg-deb --build <workingDir> <nameOfPackage>
+-
+-UNDER CONSTRUCTION - UNDER CONSTRUCTION - UNDER CONSTRUCTION - UNDER CONSTRUCTION 
+Index: ../trunk-jpl/packagers/ubuntu/issmpkg/environment.sh
+===================================================================
+--- ../trunk-jpl/packagers/ubuntu/issmpkg/environment.sh	(revision 18435)
++++ ../trunk-jpl/packagers/ubuntu/issmpkg/environment.sh	(revision 18436)
+@@ -1,287 +0,0 @@
+-#ISSM_DIR and ISSM_ARCH should have been defined already in your shell settings file (.bashrc, .cshrc, etc ...)
+-
+-pathprepend(){ #{{{
+-	if [ -d "$1" ] && [[ ":$PATH:" != *":$1:"* ]]; then
+-		export PATH="$1:$PATH"
+-	fi
+-} #}}}
+-pathappend(){ #{{{
+-	if [ -d "$1" ] && [[ ":$PATH:" != *":$1:"* ]]; then
+-		export PATH="$PATH:$1"
+-	fi
+-} #}}}
+-libpathprepend(){ #{{{
+-	if [ -d "$1" ] && [[ ":$LD_LIBRARY_PATH:" != *":$1:"* ]]; then
+-		export LD_LIBRARY_PATH="$1:$LD_LIBRARY_PATH"
+-	fi
+-	if [ -d "$1" ] && [[ ":$LD_RUN_PATH:" != *":$1:"* ]]; then
+-		export LD_RUN_PATH="$1:$LD_RUN_PATH"
+-	fi
+-} #}}}
+-libpathappend(){ #{{{
+-	if [ -d "$1" ] && [[ ":$LD_LIBRARY_PATH:" != *":$1:"* ]]; then
+-		export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$1"
+-	fi
+-	if [ -d "$1" ] && [[ ":$LD_RUN_PATH:" != *":$1:"* ]]; then
+-		export LD_RUN_PATH="$LD_RUN_PATH:$1"
+-	fi
+-} #}}}
+-dylibpathprepend(){ #{{{
+-	if [ -d "$1" ] && [[ ":$DYLD_LIBRARY_PATH:" != *":$1:"* ]]; then
+-		export DYLD_LIBRARY_PATH="$1:$DYLD_LIBRARY_PATH"
+-	fi
+-	if [ -d "$1" ] && [[ ":$LD_RUN_PATH:" != *":$1:"* ]]; then
+-		export LD_RUN_PATH="$1:$LD_RUN_PATH"
+-	fi
+-} #}}}
+-dylibpathappend(){ #{{{
+-	if [ -d "$1" ] && [[ ":$DYLD_LIBRARY_PATH:" != *":$1:"* ]]; then
+-		export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:$1"
+-	fi
+-	if [ -d "$1" ] && [[ ":$LD_RUN_PATH:" != *":$1:"* ]]; then
+-		export LD_RUN_PATH="$LD_RUN_PATH:$1"
+-	fi
+-} #}}}
+-
+-#FIXME: during installation packages are installed one by one but environment.sh was sourced
+-#before so new packages are NOT in the path.
+-#may resource environment.sh with:
+-#if [ -z $(echo "$PATH" | grep "$MATLAB_DIR") ]; then export $PATH...; fi
+-
+-#Windows compilers: 
+-if [[ "$ISSM_ARCH" == "cygwin-intel" ]]; then
+-	source $ISSM_DIR/externalpackages/windows/windows_environment.sh
+-fi
+-
+-#Some basic path, in case it is not included by default
+-libpathappend "/usr/local/lib"
+-
+-#Load ISSM scripts
+-pathappend "$ISSM_DIR/scripts"
+-
+-MATLAB_DIR="$ISSM_DIR/externalpackages/matlab/install"
+-export MATLAB_DIR
+-pathprepend   "$MATLAB_DIR/bin" #take precedence over /usr/local/bin/matlab
+-libpathappend "$MATLAB_DIR/lib"
+-
+-#legacy mpich2 (To be removed)
+-MPI_DIR="$ISSM_DIR/externalpackages/mpich2/install"
+-if [ -d "$MPI_DIR" ]; then
+-	export MPI_DIR
+-	pathprepend   "$MPI_DIR/bin"
+-	libpathappend "$MPI_DIR/lib"
+-fi
+-
+-MPI_DIR="$ISSM_DIR/externalpackages/mpich/install"
+-if [ -d "$MPI_DIR" ]; then
+-	export MPI_DIR
+-	pathprepend   "$MPI_DIR/bin"
+-	libpathappend "$MPI_DIR/lib"
+-fi
+-
+-PETSC_DIR="$ISSM_DIR/externalpackages/petsc/install"
+-export PETSC_DIR
+-libpathappend "$PETSC_DIR/lib"
+-
+-SLEPC_DIR="$ISSM_DIR/externalpackages/slepc/install"
+-libpathappend "$SLEPC_DIR/lib"
+-
+-TAO_DIR="$ISSM_DIR/externalpackages/tao/install"
+-libpathappend "$TAO_DIR/lib"
+-
+-DAKOTA_DIR="$ISSM_DIR/externalpackages/dakota/install"
+-pathappend "$DAKOTA_DIR/bin"
+-libpathappend "$DAKOTA_DIR/lib"
+-
+-DOXYGEN_DIR="$ISSM_DIR/externalpackages/doxygen/install"
+-pathprepend "$DOXYGEN_DIR/bin"
+-
+-AUTOTOOLS_DIR="$ISSM_DIR/externalpackages/autotools/install"
+-pathprepend "$AUTOTOOLS_DIR/bin"
+-
+-SDK_DIR="C:/MicrosoftVisualStudio 9.0/Microsoft Visual C++ 2008 Express Edition with SP1 - ENU"
+-pathappend "$SDK_DIR"
+-
+-SSH_DIR="$ISSM_DIR/externalpackages/ssh"
+-pathappend "$SSH_DIR"
+-
+-VALGRIND_DIR="$ISSM_DIR/externalpackages/valgrind/install"
+-pathprepend "$VALGRIND_DIR/bin"
+-
+-CPPCHECK_DIR="$ISSM_DIR/externalpackages/cppcheck/install"
+-pathappend "$CPPCHECK_DIR/bin"
+-
+-GDAL_DIR="$ISSM_DIR/externalpackages/gdal/install"
+-pathprepend "$GDAL_DIR/bin"
+-libpathappend "$GDAL_DIR/lib"
+-
+-PROJ4_DIR="$ISSM_DIR/externalpackages/proj.4/install"
+-libpathappend "$PROJ4_DIR/lib"
+-
+-MERCURIAL_DIR="$ISSM_DIR/externalpackages/mercurial/install"
+-if [ -d "$MERCURIAL_DIR" ]; then
+-	export PYTHONPATH="$PYTHONPATH:$MERCURIAL_DIR/mercurial/pure/"
+-	pathappend "$MERCURIAL_DIR"
+-fi
+-
+-BOOST_DIR="$ISSM_DIR/externalpackages/boost/install"
+-BOOSTROOT="$ISSM_DIR/externalpackages/boost/install"
+-if [ -d "$BOOST_DIR" ]; then
+-	export BOOSTROOT
+-	export BOOST_DIR
+-	libpathappend   "$BOOST_DIR/lib"
+-	dylibpathappend "$BOOST_DIR/lib"
+-	pathappend      "$BOOST_DIR/bin"
+-fi
+-
+-XERCESROOT="$ISSM_DIR/externalpackages/xerces/install"
+-XERCESCROOT="$ISSM_DIR/externalpackages/xerces/src"
+-if [ -d "$XERCESROOT" ]; then
+-	export XERCESROOT 
+-	export XERCESCROOT
+-fi
+-
+-XAIF_DIR="$ISSM_DIR/externalpackages/xaifbooster/xaifBooster"
+-XAIFBOOSTERROOT="$ISSM_DIR/externalpackages/xaifbooster/"
+-XAIFBOOSTER_HOME="$ISSM_DIR/externalpackages/xaifbooster/xaifBooster"
+-PLATFORM="x86-Linux"
+-if [ -d "$XAIF_DIR" ]; then
+-	export XAIFBOOSTERROOT
+-	export XAIFBOOSTER_HOME
+-	export XAIF_DIR
+-	export PLATFORM
+-fi
+-
+-ANGELROOT="$ISSM_DIR/externalpackages/angel/angel"
+-if [ -d "$ANGELROOT" ]; then
+-	export ANGELROOT
+-fi
+-
+-OPENANALYSISROOT="$ISSM_DIR/externalpackages/openanalysis/install"
+-if [ -d "$OPENANALYSISROOT" ]; then
+-	export OPENANALYSISROOT
+-	libpathappend "$OPENANALYSISROOT/lib"
+-fi
+-
+-JVM_DIR="/usr/local/gcc/4.3.2/lib64/gcj-4.3.2-9/"
+-libpathappend "$JVM_DIR"
+-
+-BBFTP_DIR="$ISSM_DIR/externalpackages/bbftp/install"
+-pathappend "$BBFTP_DIR/bin"
+-
+-ADIC_DIR="$ISSM_DIR/externalpackages/adic/install"
+-pathappend "$ADIC_DIR/bin"
+-libpathappend "$ADIC_DIR/lib"
+-
+-COLPACK_DIR="$ISSM_DIR/externalpackages/colpack/install"
+-libpathappend "$COLPACK_DIR/lib"
+-
+-ECLIPSE_DIR="$ISSM_DIR/externalpackages/eclipse/install"
+-pathappend "$ECLIPSE_DIR"
+-
+-APPSCAN_DIR="$ISSM_DIR/externalpackages/appscan/install"
+-pathappend "$APPSCAN_DIR/bin"
+-
+-RATS_DIR="$ISSM_DIR/externalpackages/rats/install"
+-pathappend "$RATS_DIR/bin"
+-
+-DYSON_DIR="$ISSM_DIR/externalpackages/dyson/"
+-pathappend "$DYSON_DIR"
+-
+-CMAKE_DIR="$ISSM_DIR/externalpackages/cmake/install"
+-pathprepend "$CMAKE_DIR/bin"
+-
+-SHAPELIB_DIR="$ISSM_DIR/externalpackages/shapelib/install"
+-pathappend "$SHAPELIB_DIR/exec"
+-
+-CCCL_DIR="$ISSM_DIR/externalpackages/cccl/install"
+-pathappend "$CCCL_DIR/bin"
+-
+-PACKAGEMAKER_DIR="$ISSM_DIR/externalpackages/packagemaker/install"
+-pathappend "$PACKAGEMAKER_DIR"
+-
+-#android-dev-dir
+-export ANDROID_DIR="$ISSM_DIR/externalpackages/android"
+-
+-export ANDROID_NDK_DIR="$ANDROID_DIR/android-ndk/install"
+-pathappend "$ANDROID_NDK_DIR/arm-linux-android-install/bin"
+-
+-export ANDROID_SDK_DIR="$ANDROID_DIR/android-sdk/install"
+-pathappend "$ANDROID_SDK_DIR/"
+-
+-GSL_DIR="$ISSM_DIR/externalpackages/gsl/install"
+-libpathappend "$GSL_DIR/lib"
+-
+-GMAKE_DIR="$ISSM_DIR/externalpackages/gmake/install"
+-pathprepend "$GMAKE_DIR/bin"
+-
+-PYTHON_DIR="/usr"
+-if [ -d "$PYTHON_DIR" ]; then
+-	export PYTHONPATH="$PYTHONPATH:$ISSM_DIR/lib"
+-	export PYTHONSTARTUP="$ISSM_DIR/startup.py"
+-	pathprepend    "/usr"
+-	libpathprepend "$ISSM_DIR/lib"
+-	libpathprepend "/usr/lib/python2.7"
+-fi
+-
+-MODELE_DIR="$ISSM_DIR/externalpackages/modelE/install"
+-pathappend "$MODELE_DIR/src/exec"
+-
+-GIT_DIR="$ISSM_DIR/externalpackages/git/install"
+-pathprepend "$GIT_DIR/bin"
+-
+-NCVIEW_DIR="$ISSM_DIR/externalpackages/ncview/install"
+-pathappend "$NCVIEW_DIR"
+-
+-TCLX_DIR="$ISSM_DIR/externalpackages/tclx/install/lib/tclx8.4"
+-libpathappend "$TCLX_DIR"
+-
+-ASPELL_DIR="$ISSM_DIR/externalpackages/aspell/install"
+-pathappend "$ASPELL_DIR/bin"
+-
+-HDF5_DIR="$ISSM_DIR/externalpackages/hdf5/install"
+-dylibpathappend "$HDF5_DIR/lib"
+-libpathappend "$HDF5_DIR/lib"
+-if [ -d "$HDF5_DIR" ]; then
+-	export LIBRARY_PATH="$LIBRARY_PATH:$HDF5_DIR/lib"
+-	export C_INCLUDE_PATH="$C_INCLUDE_PATH:$HDF5_DIR/include"
+-fi
+-
+-NETCDF_DIR="$ISSM_DIR/externalpackages/netcdf/install"
+-pathappend "$NETCDF_DIR/bin"
+-dylibpathappend "$NETCDF_DIR/lib"
+-libpathappend "$NETCDF_DIR/lib"
+-if [ -d "$NETCDF_DIR" ]; then
+-	export LIBRARY_PATH="$LIBRARY_PATH:$NETCDF_DIR/lib"
+-	dylibpathappend "$NETCDF_DIR/lib"
+-	libpathappend "$NETCDF_DIR/lib"
+-	export C_INCLUDE_PATH="$C_INCLUDE_PATH:$NETCDF_DIR/include"
+-fi
+-
+-NETCDF_CXX_DIR="$ISSM_DIR/externalpackages/netcdf-cxx/install"
+-libpathappend "$NETCDF_CXX_DIR/lib"
+-
+-SVN_DIR="$ISSM_DIR/externalpackages/svn/install"
+-pathprepend   "$SVN_DIR/bin"
+-libpathappend "$SVN_DIR/lib"
+-
+-APR_DIR="$ISSM_DIR/externalpackages/apr/install"
+-pathappend    "$APR_DIR/bin"
+-libpathappend "$APR_DIR/lib"
+-
+-APR_UTIL_DIR="$ISSM_DIR/externalpackages/apr-util/install"
+-pathappend   "$APR_UTIL_DIR/bin:$PATH"
+-libpathappend "$APR_UTIL_DIR/lib"
+-
+-SQLITE_DIR="$ISSM_DIR/externalpackages/sqlite/install"
+-pathappend   "$SQLITE_DIR/bin"
+-libpathappend "$SQLITE_DIR/lib"
+-
+-YAMS_DIR="$ISSM_DIR/externalpackages/yams/install"
+-pathappend   "$YAMS_DIR"
+-
+-SWIG_DIR="$ISSM_DIR/externalpackages/swig/install"
+-pathappend   "$SWIG_DIR"
+-
+-#AUX-CONFIG
+-pathappend   "$ISSM_DIR/aux-config"
+Index: ../trunk-jpl/packagers/ubuntu/issmpkg/templates/sampleControl
+===================================================================
+--- ../trunk-jpl/packagers/ubuntu/issmpkg/templates/sampleControl	(revision 18435)
++++ ../trunk-jpl/packagers/ubuntu/issmpkg/templates/sampleControl	(revision 18436)
+@@ -1,6 +0,0 @@
+-Package: issm-python
+-Version: 1.1.3
+-Architecture: amd64
+-Depends: mpich2, petsc3.2-issm, metis4.0-issm, triangle-bin, libtriangle-dev, python2.7-dev, python-scipy, python-netcdf4, netcdf-bin, python-nose, libnetcdfc++4, hdf5-tools
+-Maintainer: issm/jpl (issm@jpl.nasa.gov)
+-Description: Ice Sheet System Model, ubuntu/debian package
+Index: ../trunk-jpl/packagers/ubuntu/startup.m
+===================================================================
+--- ../trunk-jpl/packagers/ubuntu/startup.m	(revision 18435)
++++ ../trunk-jpl/packagers/ubuntu/startup.m	(revision 18436)
+@@ -1,40 +0,0 @@
+-%STARTUP - Matlab startup script
+-%
+-%   startup.m is a script run by matlab at the beginning of a session, just
+-%   before handing over the prompt to the user. This delivery startup.m script
+-%   has been customized here for the ISSM code. This startup script should be
+-%   run by users before trying to use ISSM. The best way to do that is to put
+-%   the startup file in the location where Matlab starts and established its
+-%   root directory.
+-
+-% clear the last warning to focus on the warnings of the ISSM path
+-lastwarn(''); 
+-
+-%Recover ISSM_TIER , or if on a Windows machine, ISSM_TIER_WIN
+-ISSM_TIER=getenv('ISSM_TIER');
+-
+-if (isempty(ISSM_TIER)),
+-	error('issmdir error message: ''ISSM_TIER'' environment variable is empty! You should define ISSM_TIER in your .cshrc or .bashrc!');
+-end
+-
+-%Now add all issm code paths necessary to run issm smoothly. 
+-%We capture the error output, so that we can warn the user to update 
+-%the variable ISSM_TIER in this file, in case it is not correctly setup. 
+-
+-%ISSM path
+-addpath(ISSM_TIER);
+-addpath([ISSM_TIER '/bin']);
+-
+-%Check on any warning messages that might indicate that the paths were not correct. 
+-if ~isempty(lastwarn),
+-	fprintf('\n  Error trying to setup ''ISSM'' code paths. Try and update the ISSM_TIER variable in your .cshrc or .bashrc!\n');
+-	fprintf('  ''ISSM'' will not  work at all until this is resolved\n\n');
+-else
+-	fprintf('\n  To get started with ISSM, type issmdoc at the command prompt.\n\n');
+-end
+-
+-%disable matlab bell!
+-beep off;
+-
+-% no warning if we try to plot while in nojvm (will not be supported in future releases)
+-warning off MATLAB:HandleGraphics:noJVM
+Index: ../trunk-jpl/packagers/ubuntu/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/ubuntu/install.sh	(revision 0)
++++ ../trunk-jpl/packagers/ubuntu/install.sh	(revision 18436)
+@@ -0,0 +1,127 @@
++#!/bin/bash
++
++# ISSM_DIR and MATLAB_DIR must be set correctly.
++# {{{
++if [ "${ISSM_DIR}x" == "x" ]; then
++   echo "ISSM_DIR is not set!" >&2
++   exit 1;
++elif [ -d ${ISSM_DIR} ]; then
++   echo "ISSM_DIR: ${ISSM_DIR}"
++else
++   echo "ISSM_DIR: ${ISSM_DIR} does not exist!" >&2
++   exit 1;
++fi
++
++if [ "${MATLAB_DIR}x" == "x" ]; then
++   echo "MATLAB_DIR is not set!"
++   exit 1;
++elif [ -d ${MATLAB_DIR} ]; then
++   echo "MATLAB_DIR: ${MATLAB_DIR}"
++else
++   echo "MATLAB_DIR: ${MATLAB_DIR} does not exist!" >&2
++   exit 1;
++fi
++# }}}
++
++#List of external pakages to be installed and their installation scripts
++EXTERNALPACKAGES="autotools install.sh                
++                  cmake     install.sh                
++                  petsc     install-3.5-linux64-static.sh
++                  triangle  install-linux64.sh "
++
++# Install Externalpackages
++# {{{
++
++#Files source environment to make sure installed packages are in PATH
++source $ISSM_DIR/etc/environment.sh
++
++#number of packages: 
++NUMPACKAGES=$(($(echo $EXTERNALPACKAGES | wc -w )/2))
++
++for ((i=1;i<=$NUMPACKAGES;i++))
++do
++	NUM1=$((2*$i-1))
++	NUM2=$((2*$i))
++	PACKAGENAME=$(echo $EXTERNALPACKAGES | cut -d " " -f $NUM1-$NUM1)
++	PACKAGEINST=$(echo $EXTERNALPACKAGES | cut -d " " -f $NUM2-$NUM2)
++
++	cd $ISSM_DIR/externalpackages/$PACKAGENAME
++
++	if [[ $PACKAGEINST -nt  install ]]; then 
++		#go ahead and reinstall. 
++		echo "Triggering new install of $PACKAGENAME"
++		install_test=1
++	else
++		#ok, we want to skip, unless the package is not installed: 
++		if [ -d install ]; then 
++			#could be empty, signaling a failed previous install: 
++			if [ "$(ls -A install)" ];then
++				echo "and install directory exists, so skipping install of $PACKAGENAME"
++				install_test=0;
++			else
++				echo "and install directory exists, however, it is empty, so triggering install of $PACKAGENAME"
++				install_test=1;
++			fi
++		else
++			echo "However, install directory does not exist, so triggering install of $PACKAGENAME"
++			install_test=1;
++		fi
++	fi
++
++	if [[ $install_test == 1 ]]; then 
++		echo "======================================================";
++		echo "       Installing $PACKAGENAME                        ";
++		echo "======================================================";
++		./$PACKAGEINST |  tee compil.log
++		if [ $? -ne 0 ]; then
++			echo "======================================================";
++			echo "    ERROR: installation of $PACKAGENAME failed        ";
++			echo "======================================================";
++			#erase install directory, so that next time, we still try and compile this!
++			rm -rf install
++		fi
++		source $ISSM_DIR/etc/environment.sh
++	else
++		echo "======================================================";
++		echo "       Skipping install of $PACKAGENAME                        ";
++		echo "======================================================";
++	fi
++	cd ..
++done
++# }}}
++
++# Compile ISSM
++#{{{
++cd $ISSM_DIR
++echo "Aureconf..."
++autoreconf -if
++echo "Configuring..."
++./configure \
++	--prefix=$ISSM_DIR \
++	--disable-static \
++	--enable-standalone-executables \
++	--enable-standalone-libraries \
++	--with-matlab-dir="/Applications/MATLAB_R2011b.app/" \
++	--with-triangle-dir=$ISSM_DIR/externalpackages/triangle/install \
++	--with-metis-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-petsc-dir=$ISSM_DIR/externalpackages/petsc/install  \
++	--with-scalapack-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-mpi-include=$ISSM_DIR/externalpackages/petsc/install/include  \
++	--with-mpi-libflags=" -L$ISSM_DIR/externalpackages/petsc/install/lib -lmpich -lmpl " \
++	--with-fortran-lib="-L/usr/lib/gcc/x86_64-linux-gnu/4.6/ -lgfortran" \
++	--enable-debugging \
++	--with-numthreads=4
++
++
++if [ $? -ne 0 ]; then echo "FAILED TO CONFIGURE!" && exit 1; fi
++
++echo "Building..."
++make -j 8
++if [ $? -ne 0 ]; then echo "FAILED TO BUILD!" && exit 1; fi
++
++echo "Installing..."
++make install 
++if [ $? -ne 0 ]; then echo "FAILED TO INSTALL!" && exit 1; fi
++#}}}
+
+Property changes on: ../trunk-jpl/packagers/ubuntu/install.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/packagers/ubuntu/package.sh
+===================================================================
+--- ../trunk-jpl/packagers/ubuntu/package.sh	(revision 18435)
++++ ../trunk-jpl/packagers/ubuntu/package.sh	(revision 18436)
+@@ -1,15 +1,31 @@
+-#/bin/bash
++#!/bin/bash
+ 
+-#Just tar gz the bin/ directory and test/ directory and put a startup.m file.
++echo "modify generic" 
++cd $ISSM_DIR/bin
++cat generic_static.m | sed -e "s/generic_static/generic/g" > generic.m
++echo "move mpiexec to bin" 
++cp ../externalpackages/mpich/install/bin/mpiexec .
++cp ../externalpackages/mpich/install/bin/hydra_pmi_proxy .
+ 
+-rm -rf ISSM ISSM-Ubuntu32.tar.gz
++#Check that test101 runs
++cd $ISSM_DIR/test/NightlyRun
++rm matlab.log
++$MATLAB_DIR/bin/matlab -nojvm -nosplash -r "try, addpath $ISSM_DIR/bin $ISSM_DIR/lib; runme('id',101);exit; catch me,fprintf('%s',getReport(me)); exit; end" -logfile matlab.log
+ 
+-mkdir ISSM
+-cd ISSM
+-ln -s $ISSM_TIER/bin ./bin
+-ln -s $ISSM_TIER/test ./test
+-cp ../startup.m ./
+-cp ../README.m ./
+-cd ..
+-tar  zcvfh  ISSM-Ubuntu32.tar.gz --exclude='.svn' ./ISSM
+-rm -rf ISSM
++if [[ $(cat matlab.log | grep -c SUCCESS) -lt 10 ]]; then
++	echo "test101 FAILED"
++	exit 1;
++else
++	echo "test101 passed"
++fi
++
++tarball_name='issm-ubuntu-static_build.tar.gz'
++
++echo "Cleanup first" 
++cd $ISSM_DIR
++rm $tarball_name
++
++echo "Creating tarball: ${tarball_name}"
++cd $ISSM_DIR
++tar -czf $tarball_name ./bin ./lib ./test ./examples
++ls -lah $tarball_name
Index: /issm/oecreview/Archive/18296-19100/ISSM-18436-18437.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18436-18437.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18436-18437.diff	(revision 19102)
@@ -0,0 +1,107 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh	(revision 18436)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh	(revision 18437)
+@@ -28,6 +28,7 @@
+  --with-debugging=0 \
+  --with-valgrind=0 \
+  --with-x=0 \
++ --with-ssl=0 \
+  --with-batch=1  \
+  --with-shared-libraries=1 \
+  --download-metis=1 \
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh	(revision 18436)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh	(revision 18437)
+@@ -22,6 +22,7 @@
+ 	--with-debugging=0 \
+ 	--with-valgrind=0 \
+ 	--with-x=0 \
++	--with-ssl=0 \
+ 	--with-shared-libraries=1 \
+ 	--download-metis=1 \
+ 	--download-parmetis=1 \
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-linux64.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-linux64.sh	(revision 18436)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-linux64.sh	(revision 18437)
+@@ -22,6 +22,7 @@
+ 	--with-debugging=0 \
+ 	--with-valgrind=0 \
+ 	--with-x=0 \
++	--with-ssl=0 \
+ 	--with-shared-libraries=1 \
+ 	--download-metis=1 \
+ 	--download-parmetis=1 \
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh	(revision 18436)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh	(revision 18437)
+@@ -25,6 +25,7 @@
+ 	--with-debugging=0 \
+ 	--with-valgrind=0 \
+ 	--with-x=0 \
++	--with-ssl=0 \
+ 	--with-batch=1  \
+ 	--with-shared-libraries=1 \
+ 	--download-metis=1 \
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-linux64-static.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-linux64-static.sh	(revision 0)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-linux64-static.sh	(revision 18437)
+@@ -0,0 +1,35 @@
++#!/bin/bash
++set -eu
++
++#Some cleanup
++rm -rf install petsc-3.5.1 src
++mkdir install src
++
++#Download from ISSM server
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.1.tar.gz' 'petsc-3.5.1.tar.gz'
++
++#Untar and move petsc to install directory
++tar -zxvf  petsc-3.5.1.tar.gz
++mv petsc-3.5.1/* src/
++rm -rf petsc-3.5.1
++
++#configure
++cd src
++./config/configure.py \
++	--prefix="$ISSM_DIR/externalpackages/petsc/install" \
++	--PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
++	--with-debugging=0 \
++	--with-valgrind=0 \
++	--with-x=0 \
++	--with-ssl=0 \
++	--with-shared-libraries=0 \
++	--download-mpich=1 \
++	--download-metis=1 \
++	--download-parmetis=1 \
++	--download-mumps=1 \
++	--download-scalapack=1 \
++	--download-fblaslapack=1 
++
++#Compile and intall
++make
++make install
+
+Property changes on: ../trunk-jpl/externalpackages/petsc/install-3.5-linux64-static.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh	(revision 18436)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh	(revision 18437)
+@@ -22,6 +22,7 @@
+   --with-batch=1  \
+   --with-debugging=0 \
+   --with-x=0 \
++  --with-ssl=0 \
+   --with-shared-libraries=1 \
+   --known-mpi-shared-libraries=1 \
+   --with-mpi=1 \
Index: /issm/oecreview/Archive/18296-19100/ISSM-18437-18438.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18437-18438.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18437-18438.diff	(revision 19102)
@@ -0,0 +1,85 @@
+Index: ../trunk-jpl/externalpackages/mpich/install-3.0-linux64-static.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/mpich/install-3.0-linux64-static.sh	(revision 0)
++++ ../trunk-jpl/externalpackages/mpich/install-3.0-linux64-static.sh	(revision 18438)
+@@ -0,0 +1,29 @@
++#!/bin/bash
++set -eu
++
++#Some cleanup
++rm -rf src install mpich-3.0.4
++mkdir src install
++
++#Download from ISSM server
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/mpich-3.0.4.tar.gz' 'mpich-3.0.4.tar.gz'
++
++#Untar 
++tar -zxvf  mpich-3.0.4.tar.gz
++
++#Move mpich into src directory
++mv mpich-3.0.4/* src
++rm -rf mpich-3.0.4
++
++#Configure mpich
++cd src
++./configure \
++	--prefix="$ISSM_DIR/externalpackages/mpich/install" 
++
++#Compile mpich (this new version supports parallel make)
++if [ $# -eq 0 ]; then
++	make
++else
++	make -j $1
++fi
++make install 
+
+Property changes on: ../trunk-jpl/externalpackages/mpich/install-3.0-linux64-static.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-linux64-static.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-linux64-static.sh	(revision 18437)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-linux64-static.sh	(revision 18438)
+@@ -18,12 +18,12 @@
+ ./config/configure.py \
+ 	--prefix="$ISSM_DIR/externalpackages/petsc/install" \
+ 	--PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
++	--with-mpi-dir="$ISSM_DIR/externalpackages/mpich/install" \
+ 	--with-debugging=0 \
+ 	--with-valgrind=0 \
+ 	--with-x=0 \
+ 	--with-ssl=0 \
+ 	--with-shared-libraries=0 \
+-	--download-mpich=1 \
+ 	--download-metis=1 \
+ 	--download-parmetis=1 \
+ 	--download-mumps=1 \
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh	(revision 18437)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh	(revision 18438)
+@@ -17,8 +17,8 @@
+ cd src
+ ./config/configure.py \
+ 	--prefix="$ISSM_DIR/externalpackages/petsc/install" \
++	--PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
+ 	--with-mpi-dir="$ISSM_DIR/externalpackages/mpich/install" \
+-	--PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
+ 	--with-debugging=0 \
+ 	--with-valgrind=0 \
+ 	--with-ssl=0 \
+Index: ../trunk-jpl/packagers/ubuntu/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/ubuntu/install.sh	(revision 18437)
++++ ../trunk-jpl/packagers/ubuntu/install.sh	(revision 18438)
+@@ -25,6 +25,7 @@
+ 
+ #List of external pakages to be installed and their installation scripts
+ EXTERNALPACKAGES="autotools install.sh                
++						mpich     install-3.0-linux64-static.sh
+                   cmake     install.sh                
+                   petsc     install-3.5-linux64-static.sh
+                   triangle  install-linux64.sh "
Index: /issm/oecreview/Archive/18296-19100/ISSM-18438-18439.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18438-18439.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18438-18439.diff	(revision 19102)
@@ -0,0 +1,53 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp	(revision 18438)
++++ ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp	(revision 18439)
+@@ -132,6 +132,7 @@
+ void GSLsquarefit(Matrix** pX,Matrix* A,Matrix* B);
+ double signe(double a);
+ void filtergrav(Matrix* A,Matrix* Ain,double ctr,double sd,int mx,int my);
++void newmodelgen(Matrix* m0,Matrix* m1,Matrix* bathy,Matrix* icethick,int mx,int my,double T,double ptval,double mmax,double mmax2,double ctr,double sd);
+ /*}}}*/
+ 
+ int main(){/*{{{*/
+@@ -258,9 +259,9 @@
+ //	mesh_ini->Echo();
+                            /*}}}*/
+ 	double q=0;
+- q=misfit(mesh_ini,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my);
++/* q=misfit(mesh_ini,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my);
+      cout<< q;
+-/*	Matrix* G=new Matrix(4,3);
++Matrix* G=new Matrix(4,3);
+ 	Matrix* df=new Matrix(4,1);
+ 	Matrix* o=new Matrix(4,1);
+ 	for(int i= 0;i<4;i++){
+@@ -282,9 +283,9 @@
+ 	df->Echo();
+ 	M->Echo();
+ 	o->Echo();*/
+-double a;
+-a=signe(-9);
+-cout<<a;
++	Matrix* m1=new Matrix(mx*my,3);
++	double T=100;
++newmodelgen(mesh_ini,m1,bathy,icethick,mx,my,T,ptval,mmax,mmax2,ctr,sd);
+ 	return 0;
+ }/*}}}*/
+ 
+@@ -516,6 +517,7 @@
+ 	}
+ 	m1->ExtractColumn(m1col,1);
+ 	vec2gridsimple(m1col,m1gr,mx,my);
++	cout<<endl<<endl;
+ 	filtergrav(m1grsm,m1gr,ctr,sd,mx,my);
+ 	reshape(m1grsm,m1col,mx,my);
+ 	for (int i=0;i<mx*my;i++){
+@@ -567,6 +569,7 @@
+ 	else{return 1;}
+ }/*}}}*/
+ void filtergrav(Matrix* A,Matrix* Ain,double ctr,double sd,int mx,int my){/*{{{*/
++	A->MatrixEqual(Ain);
+ 	for (int i=1;i<my-1;i++){
+ 		for(int j=1;j<mx-1;j++){
+ 			A->SetValue(i,j,(ctr*Ain->GetValue(i,j)+sd*(Ain->GetValue(i-1,j)+Ain->GetValue(i+1,j)+Ain->GetValue(i,j-1)+Ain->GetValue(i,j+1)))/(ctr+4*sd));
Index: /issm/oecreview/Archive/18296-19100/ISSM-18439-18440.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18439-18440.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18439-18440.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/packagers/ubuntu/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/ubuntu/install.sh	(revision 18439)
++++ ../trunk-jpl/packagers/ubuntu/install.sh	(revision 18440)
+@@ -102,7 +102,7 @@
+ 	--disable-static \
+ 	--enable-standalone-executables \
+ 	--enable-standalone-libraries \
+-	--with-matlab-dir="/Applications/MATLAB_R2011b.app/" \
++	--with-matlab-dir="/usr/local/matlab80/" \
+ 	--with-triangle-dir=$ISSM_DIR/externalpackages/triangle/install \
+ 	--with-metis-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-petsc-dir=$ISSM_DIR/externalpackages/petsc/install  \
Index: /issm/oecreview/Archive/18296-19100/ISSM-18440-18441.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18440-18441.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18440-18441.diff	(revision 19102)
@@ -0,0 +1,14 @@
+Index: ../trunk-jpl/externalpackages/mpich/install-3.0-linux64-static.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/mpich/install-3.0-linux64-static.sh	(revision 18440)
++++ ../trunk-jpl/externalpackages/mpich/install-3.0-linux64-static.sh	(revision 18441)
+@@ -17,8 +17,7 @@
+ 
+ #Configure mpich
+ cd src
+-./configure \
+-	--prefix="$ISSM_DIR/externalpackages/mpich/install" 
++./configure --prefix="$ISSM_DIR/externalpackages/mpich/install" 
+ 
+ #Compile mpich (this new version supports parallel make)
+ if [ $# -eq 0 ]; then
Index: /issm/oecreview/Archive/18296-19100/ISSM-18441-18442.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18441-18442.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18441-18442.diff	(revision 19102)
@@ -0,0 +1,15 @@
+Index: ../trunk-jpl/packagers/ubuntu/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/ubuntu/install.sh	(revision 18441)
++++ ../trunk-jpl/packagers/ubuntu/install.sh	(revision 18442)
+@@ -109,8 +109,8 @@
+ 	--with-scalapack-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install \
+-	--with-mpi-include=$ISSM_DIR/externalpackages/petsc/install/include  \
+-	--with-mpi-libflags=" -L$ISSM_DIR/externalpackages/petsc/install/lib -lmpich -lmpl " \
++	--with-mpi-include=$ISSM_DIR/externalpackages/mpich/install/include  \
++	--with-mpi-libflags=" -L$ISSM_DIR/externalpackages/mpich/install/lib -lmpich -lmpl " \
+ 	--with-fortran-lib="-L/usr/lib/gcc/x86_64-linux-gnu/4.6/ -lgfortran" \
+ 	--enable-debugging \
+ 	--with-numthreads=4
Index: /issm/oecreview/Archive/18296-19100/ISSM-18442-18443.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18442-18443.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18442-18443.diff	(revision 19102)
@@ -0,0 +1,15 @@
+Index: ../trunk-jpl/externalpackages/mpich/install-3.0-linux64-static.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/mpich/install-3.0-linux64-static.sh	(revision 18442)
++++ ../trunk-jpl/externalpackages/mpich/install-3.0-linux64-static.sh	(revision 18443)
+@@ -17,7 +17,9 @@
+ 
+ #Configure mpich
+ cd src
+-./configure --prefix="$ISSM_DIR/externalpackages/mpich/install" 
++./configure \
++	--prefix="$ISSM_DIR/externalpackages/mpich/install"  \
++	--enable-shared
+ 
+ #Compile mpich (this new version supports parallel make)
+ if [ $# -eq 0 ]; then
Index: /issm/oecreview/Archive/18296-19100/ISSM-18443-18444.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18443-18444.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18443-18444.diff	(revision 19102)
@@ -0,0 +1,48 @@
+Index: ../trunk-jpl/externalpackages/mpich/install-3.0-linux64-static.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/mpich/install-3.0-linux64-static.sh	(revision 18443)
++++ ../trunk-jpl/externalpackages/mpich/install-3.0-linux64-static.sh	(revision 18444)
+@@ -1,30 +0,0 @@
+-#!/bin/bash
+-set -eu
+-
+-#Some cleanup
+-rm -rf src install mpich-3.0.4
+-mkdir src install
+-
+-#Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/mpich-3.0.4.tar.gz' 'mpich-3.0.4.tar.gz'
+-
+-#Untar 
+-tar -zxvf  mpich-3.0.4.tar.gz
+-
+-#Move mpich into src directory
+-mv mpich-3.0.4/* src
+-rm -rf mpich-3.0.4
+-
+-#Configure mpich
+-cd src
+-./configure \
+-	--prefix="$ISSM_DIR/externalpackages/mpich/install"  \
+-	--enable-shared
+-
+-#Compile mpich (this new version supports parallel make)
+-if [ $# -eq 0 ]; then
+-	make
+-else
+-	make -j $1
+-fi
+-make install 
+Index: ../trunk-jpl/packagers/ubuntu/install.sh
+===================================================================
+--- ../trunk-jpl/packagers/ubuntu/install.sh	(revision 18443)
++++ ../trunk-jpl/packagers/ubuntu/install.sh	(revision 18444)
+@@ -25,7 +25,7 @@
+ 
+ #List of external pakages to be installed and their installation scripts
+ EXTERNALPACKAGES="autotools install.sh                
+-						mpich     install-3.0-linux64-static.sh
++						mpich     install-3.0-linux64.sh
+                   cmake     install.sh                
+                   petsc     install-3.5-linux64-static.sh
+                   triangle  install-linux64.sh "
Index: /issm/oecreview/Archive/18296-19100/ISSM-18444-18445.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18444-18445.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18444-18445.diff	(revision 19102)
@@ -0,0 +1,23 @@
+Index: ../trunk-jpl/packagers/ubuntu/package.sh
+===================================================================
+--- ../trunk-jpl/packagers/ubuntu/package.sh	(revision 18444)
++++ ../trunk-jpl/packagers/ubuntu/package.sh	(revision 18445)
+@@ -29,3 +29,6 @@
+ cd $ISSM_DIR
+ tar -czf $tarball_name ./bin ./lib ./test ./examples
+ ls -lah $tarball_name
++
++echo "Shipping binaris to website"
++scp $tarball_name websites:/home/larour/files/$tarball_name
+Index: ../trunk-jpl/packagers/macosx/package.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/package.sh	(revision 18444)
++++ ../trunk-jpl/packagers/macosx/package.sh	(revision 18445)
+@@ -26,7 +26,6 @@
+ cd $ISSM_DIR
+ rm $tarball_name
+ 
+-
+ echo "Creating tarball: ${tarball_name}"
+ cd $ISSM_DIR
+ tar -czf $tarball_name ./bin ./lib ./test ./examples
Index: /issm/oecreview/Archive/18296-19100/ISSM-18445-18446.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18445-18446.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18445-18446.diff	(revision 19102)
@@ -0,0 +1,198 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp	(revision 18445)
++++ ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp	(revision 18446)
+@@ -133,6 +133,7 @@
+ double signe(double a);
+ void filtergrav(Matrix* A,Matrix* Ain,double ctr,double sd,int mx,int my);
+ void newmodelgen(Matrix* m0,Matrix* m1,Matrix* bathy,Matrix* icethick,int mx,int my,double T,double ptval,double mmax,double mmax2,double ctr,double sd);
++double coolshed(double T0,int k,double c,double D);
+ /*}}}*/
+ 
+ int main(){/*{{{*/
+@@ -196,6 +197,21 @@
+ 
+ 	double ca=0.9;                    /* for acceptance */
+ 	double cm=0.5;                    /* for model perturbation */
++
++	double T0a          = 0.1;      /* initial temperature for acceptance           */
++	double T0m          = 0.9;      /* initial temperature for model perturbation   */
++	double D            = 2;        /* dimension of the model                       */
++	int    maxconsecrej = 1000;     /* max consecutive rejection                    */
++	int    maxsuccess   = 100;      /* max number of success within one temperature */
++	double T_min        = 1e-10;    /* stopping temp                                */
++	double Tred         = 1;
++	double E_min        = -1000000;
++	double E_exp        = 0.0291;   /* expected misfit                              */
++	int    maxiter      = 10000;
++	int    maxtotaliter = 1000000;
++	double Tol          = 1e-10;    /* tolerance on misfit                          */
++	int    sfreq        = 100;
++
+ 	                     /*}}}*/     
+ 	/* load the data {{{*/
+ 
+@@ -258,34 +274,130 @@
+ 	file5.close();
+ //	mesh_ini->Echo();
+                            /*}}}*/
+-	double q=0;
+-/* q=misfit(mesh_ini,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my);
+-     cout<< q;
+-Matrix* G=new Matrix(4,3);
+-	Matrix* df=new Matrix(4,1);
+-	Matrix* o=new Matrix(4,1);
+-	for(int i= 0;i<4;i++){
+-		for(int j=0;j<3;j++){
+-			if(j==2){G->SetValue(i,j,1);}
+-			else{G->SetValue(i,j,i+j);}
++		/* VFSA {{{ */
++
++	/* name of the files to save results */
++	std::ofstream savefile1 ("r_140114b.txt");
++	std::ofstream savefile2("m_140114b.txt");
++
++	/* counters initialization */
++	int    success   = 0;
++	int    finished  = 0;
++	int    consec    = 0;
++	double Ta        = T0a;
++	double Tm        = T0m;
++	int    iterT     = 0;   /* iteration within a T      */
++	int    total     = 0;   /* total number of iteration */
++	int    totaliter = 0;
++	int    msave     = 0;
++	double E_new;
++	double E_final;
++	double dE;
++	double P;
++	double rn;
++	Matrix* m_old    = new Matrix(mx *my,3);
++	Matrix* m_min    = new Matrix(mx *my,3);
++	Matrix* m_new    = new Matrix(mx *my,3);
++	m_old->MatrixEqual(mesh_ini);
++	mesh_ini->Echo();
++
++	/* calculate initial misfit */
++	double E_old=misfit(m_old,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my);
++
++	/* record initial settings */
++	savefile1 << "P     "<< "Ta    "<< "Tm    "<< "Eold  "<< "totaliter "<< "Tred   "<< endl;
++	savefile1 << "nan   "<<  Ta<<"   "<< Tm<<"   "<< E_old<<"     "<< totaliter<<"         "<< Tred <<"  "<< endl;
++	savefile2 << totaliter<< endl;
++	for(int i=0;i<mx*my;i++){
++	savefile2 << m_old->GetValue(i,0)<<"   "<< m_old->GetValue(i,1)<<"   "<< m_old->GetValue(i,2)<<endl;
++	}
++	
++	/* beginning of the loop */
++
++	while(finished==0){
++		
++		iterT++;
++		totaliter++;
++
++		/* stop or reduce T */
++		if(iterT>=maxiter || success>maxsuccess){
++			if(Ta<T_min || total>maxtotaliter || fabs(E_old)<=Tol){
++				finished=1;
++				total+=iterT;
++				break;
++			}
++			else{ /* reduce T */
++				Ta=coolshed(T0a,Tred,ca,D);
++				Tm=coolshed(T0m,Tred,cm,D);
++				total+=iterT;
++				iterT=0;
++				success=1;
++				Tred++;
++				consec=0;
++			}
+ 		}
+-		df->SetValue(i,0,i*1e-3);
++
++		/* update model and calculate energy */
++
++		newmodelgen(m_old,m_new,bathy,icethick,mx,my,Tm,ptval,mmax,mmax2,ctr,sd);  /* new model */
++	   E_new=misfit(m_new,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my); /* new energy */
++		dE=E_new-E_old;                                        /* energy difference */
++
++		/* acceptance probability */
++
++		P=exp(-dE/Ta);
++
++		/* stop if energy is lower than specified minimum */
++		if (E_new<E_min){
++			m_old->MatrixEqual(m_new);
++			E_old=E_new;
++			break;
++		}
++
++		rn=rand()/double (RAND_MAX);
++
++		/* accept new model or not */
++		if(dE<=0){
++			m_old->MatrixEqual(m_new);
++			E_old=E_new;
++			success++;
++			consec=0;
++			savefile1 << P<<"   "<<  Ta<<"   "<< Tm<<"   "<< E_old<<"     "<< totaliter<<"         "<< Tred <<"  "<< endl;
++			if(Ta<1e-3){
++				savefile2 << totaliter<< endl;
++				for(int i=0;i<mx*my;i++){
++					savefile2 << m_old->GetValue(i,0)<<"   "<< m_old->GetValue(i,1)<<"   "<< m_old->GetValue(i,2)<<endl;
++				}
++			}
++		}
++		else{
++			if(P>rn){
++				m_old->MatrixEqual(m_new);
++				E_old=E_new;
++				success++;
++				consec=0;
++				savefile1 << P<<"   "<<  Ta<<"   "<< Tm<<"   "<< E_old<<"     "<< totaliter<<"         "<< Tred <<"  "<< endl;
++				if(Ta<1e-3){
++					savefile2 << totaliter<< endl;
++					for(int i=0;i<mx*my;i++){
++						savefile2 << m_old->GetValue(i,0)<<"   "<< m_old->GetValue(i,1)<<"   "<< m_old->GetValue(i,2)<<endl;
++					}
++				}
++			}
++			else{
++				consec++;
++			}
++		}
+ 	}
+-		G->SetValue(0,0,1);
+-		G->SetValue(0,1,2);
+ 
+-	Matrix* M = NULL;
+-	GSLsquarefit(&M,G,df);
+-	for(int i= 0;i<4;i++){
+-		o->SetValue(i,0,G->GetValue(i,0)*M->GetValue(0,0)+G->GetValue(i,1)*M->GetValue(1,0)+G->GetValue(i,2)*M->GetValue(2,0));}
+-
+-	G->Echo();
+-	df->Echo();
+-	M->Echo();
+-	o->Echo();*/
+-	Matrix* m1=new Matrix(mx*my,3);
+-	double T=100;
+-newmodelgen(mesh_ini,m1,bathy,icethick,mx,my,T,ptval,mmax,mmax2,ctr,sd);
++	m_min->MatrixEqual(m_old);
++	E_final=E_old;
++	savefile1 << "nan"<<"   "<<  "nan"<<"   "<< "nan"<<"   "<< E_final<<"     "<< "nan"<<"         "<< "nan" <<"  "<< endl;
++	savefile2 << " Mesh final"<< endl;
++	for(int i=0;i<mx*my;i++){
++		savefile2 << m_min->GetValue(i,0)<<"   "<< m_min->GetValue(i,1)<<"   "<< m_min->GetValue(i,2)<<endl;
++	}
++			/*}}}*/
+ 	return 0;
+ }/*}}}*/
+ 
+@@ -576,3 +688,7 @@
+ 		}
+ 	}
+ }/*}}}*/
++double coolshed(double T0,int k,double c,double D){/*{{{*/
++	double T1=T0*exp(-c*pow(k,1/D));
++	return T1;
++}/*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18446-18447.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18446-18447.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18446-18447.diff	(revision 19102)
@@ -0,0 +1,14 @@
+Index: ../trunk-jpl/jenkins/parsing_rules
+===================================================================
+--- ../trunk-jpl/jenkins/parsing_rules	(revision 18446)
++++ ../trunk-jpl/jenkins/parsing_rules	(revision 18447)
+@@ -1,7 +1,7 @@
+-ok /not really/
+-
+ # match line starting with 'error ', case-insensitive
+ error /.*\\berror:\\b.*/
++error /FAILURE/
++error /failed/
+ 
+ # list of warnings here...
+ warning /[Ww]arning/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18447-18448.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18447-18448.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18447-18448.diff	(revision 19102)
@@ -0,0 +1,11 @@
+Index: ../trunk-jpl/packagers/macosx/package.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/package.sh	(revision 18447)
++++ ../trunk-jpl/packagers/macosx/package.sh	(revision 18448)
+@@ -33,3 +33,6 @@
+ 
+ echo "Shipping to website"
+ scp $tarball_name websites:/home/larour/files/$tarball_name
++
++echo "Shipping binaris to website"
++scp $tarball_name websites:/home/larour/files/$tarball_name
Index: /issm/oecreview/Archive/18296-19100/ISSM-18448-18449.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18448-18449.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18448-18449.diff	(revision 19102)
@@ -0,0 +1,11 @@
+Index: ../trunk-jpl/packagers/macosx/package.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/package.sh	(revision 18448)
++++ ../trunk-jpl/packagers/macosx/package.sh	(revision 18449)
+@@ -34,5 +34,5 @@
+ echo "Shipping to website"
+ scp $tarball_name websites:/home/larour/files/$tarball_name
+ 
+-echo "Shipping binaris to website"
++echo "Shipping binaries to website"
+ scp $tarball_name websites:/home/larour/files/$tarball_name
Index: /issm/oecreview/Archive/18296-19100/ISSM-18449-18450.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18449-18450.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18449-18450.diff	(revision 19102)
@@ -0,0 +1,476 @@
+Index: ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18449)
++++ ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18450)
+@@ -201,7 +201,7 @@
+ 
+ 	/*Intermediaries */
+ 	int         Hinterpolation;
+-	IssmDouble  vx,vy,vbar,nu,normdphi,dphi[2];
++	IssmDouble  vx,vy,vbar,nu,normdphi,dphi[2],H;
+ 	IssmDouble* xyz_list = NULL;
+ 	int       * doflist  = NULL;
+ 
+@@ -232,6 +232,7 @@
+ 	Input* vx_input        = element->GetInput(BalancethicknessVxObsEnum); _assert_(vx_input);
+ 	Input* vy_input        = element->GetInput(BalancethicknessVyObsEnum); _assert_(vy_input);
+ 	Input* nu_input        = element->GetInput(BalancethicknessNuEnum);    _assert_(nu_input);
++	Input* thickness_input = element->GetInput(BalancethicknessThicknessObsEnum);             _assert_(thickness_input);
+ 
+ 	switch(element->GetElementType()){
+ 		case P1Enum: Hinterpolation = P0Enum; break;
+@@ -245,6 +246,7 @@
+ 		vx_input->GetInputValue(&vx,gauss);
+ 		vy_input->GetInputValue(&vy,gauss);
+ 		nu_input->GetInputValue(&nu,gauss);
++		thickness_input->GetInputValue(&H,gauss);
+ 		potential_input->GetInputDerivativeValue(&dphi[0],xyz_list,gauss);
+ 
+ 		vx = vx*nu; vy = vy*nu;
+@@ -252,8 +254,8 @@
+ 		normdphi = sqrt(dphi[0]*dphi[0] + dphi[1]*dphi[1]);
+ 
+ 		thickness_list[iv] = normdphi/vbar;
+-		vx_list[iv]        = -1./thickness_list[iv] * dphi[0];
+-		vy_list[iv]        = -1./thickness_list[iv] * dphi[1];
++		vx_list[iv]        = -1./H * dphi[0];
++		vy_list[iv]        = -1./H * dphi[1];
+ 	}
+ 	element->AddInput(ThicknessEnum,thickness_list,Hinterpolation);
+ 	element->AddInput(VxEnum,vx_list,Hinterpolation);
+Index: ../trunk-jpl/src/c/modules/InputExtrudex/InputExtrudex.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/InputExtrudex/InputExtrudex.cpp	(revision 18449)
++++ ../trunk-jpl/src/c/modules/InputExtrudex/InputExtrudex.cpp	(revision 18450)
+@@ -7,9 +7,9 @@
+ #include "../../classes/classes.h"
+ #include "../../toolkits/toolkits.h"
+ 
+-void InputExtrudex(FemModel* femmodel,int input_enum){
++void InputExtrudex(FemModel* femmodel,int input_enum,int start){
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+ 		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-		element->InputExtrude(input_enum);
++		element->InputExtrude(input_enum,start);
+ 	}
+ }
+Index: ../trunk-jpl/src/c/modules/InputExtrudex/InputExtrudex.h
+===================================================================
+--- ../trunk-jpl/src/c/modules/InputExtrudex/InputExtrudex.h	(revision 18449)
++++ ../trunk-jpl/src/c/modules/InputExtrudex/InputExtrudex.h	(revision 18450)
+@@ -8,6 +8,6 @@
+ #include "../../classes/classes.h"
+ 
+ /* local prototypes: */
+-void InputExtrudex(FemModel* femmodel,int input_enum);
++void InputExtrudex(FemModel* femmodel,int input_enum,int start);
+ 
+ #endif  /* _INPUTDUPLICATEX_H */
+Index: ../trunk-jpl/src/c/cores/extrudefrombase_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/extrudefrombase_core.cpp	(revision 18449)
++++ ../trunk-jpl/src/c/cores/extrudefrombase_core.cpp	(revision 18450)
+@@ -26,7 +26,7 @@
+ 	/*Special method for Penta, otherwise call solution sequence*/
+ 	if(elementtype==PentaEnum){
+ 		int inputenum; femmodel->parameters->FindParam(&inputenum,InputToExtrudeEnum);
+-		InputExtrudex(femmodel,inputenum);
++		InputExtrudex(femmodel,inputenum,-1);
+ 	}
+ 	else{
+ 		/*Call on core computations: */
+Index: ../trunk-jpl/src/c/classes/Elements/Element.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18450)
+@@ -219,7 +219,7 @@
+ 		virtual void   ComputeDeviatoricStressTensor(void)=0;
+ 
+ 		virtual void   Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finite_element)=0;
+-		virtual void   InputExtrude(int input_enum)=0;
++		virtual void   InputExtrude(int input_enum,int start)=0;
+ 		virtual void   InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum)=0;
+ 		virtual void   InputUpdateFromSolutionOneDof(IssmDouble* solution,int inputenum)=0;
+ 
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18450)
+@@ -85,7 +85,7 @@
+ 		void        GetVerticesCoordinatesBase(IssmDouble** pxyz_list);
+ 		void        GetVerticesCoordinatesTop(IssmDouble** pxyz_list);
+ 		void        InputDepthAverageAtBase(int enum_type,int average_enum_type);
+-		void        InputExtrude(int enum_type){_error_("not implemented"); /*For penta only*/};
++		void        InputExtrude(int enum_type,int start){_error_("not implemented"); /*For penta only*/};
+ 		void        InputScale(int enum_type,IssmDouble scale_factor);
+ 		void        MaterialUpdateFromTemperature(void){_error_("not implemented yet");};
+ 		int         NodalValue(IssmDouble* pvalue, int index, int natureofdataenum);
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18450)
+@@ -446,8 +446,8 @@
+ 	this->inputs->AddInput(NewTemperatureInput);
+ 	this->inputs->AddInput(NewPrecipitationInput);
+ 
+-	this->InputExtrude(SurfaceforcingsMonthlytemperaturesEnum);
+-	this->InputExtrude(SurfaceforcingsPrecipitationEnum);
++	this->InputExtrude(SurfaceforcingsMonthlytemperaturesEnum,-1);
++	this->InputExtrude(SurfaceforcingsPrecipitationEnum,-1);
+ 
+ 	/*clean-up*/
+ 	delete gauss;
+@@ -1190,32 +1190,38 @@
+ 	this->inputs->AddInput((Input*)depth_averaged_input);
+ }
+ /*}}}*/
+-void       Penta::InputExtrude(int enum_type){/*{{{*/
++void       Penta::InputExtrude(int enum_type,int start){/*{{{*/
+ 
+-	/*Are we on the base, not on the surface?:*/
+-	if(!IsOnBase()) return;
++	_assert_(start==-1 || start==+1);
+ 
++	/*Are we on the the boundary we want to be?*/
++	if(start==-1 && !IsOnBase())    return;
++	if(start==+1 && !IsOnSurface()) return;
++
+ 	/*Step1: Get and Extrude original input: */
+ 	Input* base_input=(Input*)this->inputs->GetInput(enum_type);
+ 	if(!base_input) _error_("could not find input with enum " << EnumToStringx(enum_type));
+-	base_input->Extrude();
++	base_input->Extrude(start);
+ 
+ 	/*Stop if there is only one layer of element*/
+-	if(this->IsOnSurface()) return;
++	if(start==-1 && this->IsOnSurface()) return;
++	if(start==+1 && this->IsOnBase())    return;
+ 
+ 	/*Step 2: this input has been extruded for this element, now follow the upper element*/
+ 	Penta* penta=this;
+ 	for(;;){
+-		/* get upper Penta*/
+-		penta=penta->GetUpperPenta();
++		/*get upper/lower Penta*/
++		if(start==-1) penta=penta->GetUpperPenta();
++		else          penta=penta->GetLowerPenta();
+ 		_assert_(penta->Id()!=this->id);
+ 
+ 		/*Add input of the basal element to penta->inputs*/
+ 		Input* copy=(Input*)base_input->copy();
+ 		penta->inputs->AddInput((Input*)copy);
+ 
+-		/*Stop if we have reached the surface*/
+-		if(penta->IsOnSurface()) break;
++		/*Stop if we have reached the surface/base*/
++		if(start==-1 && penta->IsOnSurface()) break;
++		if(start==+1 && penta->IsOnBase())    break;
+ 	}
+ }
+ /*}}}*/
+@@ -1784,7 +1790,7 @@
+    /*Update inputs*/    
+    this->inputs->AddInput(new PentaInput(SurfaceforcingsMassBalanceEnum,&agd[0],P1Enum));
+    //this->inputs->AddInput(new PentaVertexInput(ThermalSpcTemperatureEnum,&Tsurf[0]));
+-   this->InputExtrude(SurfaceforcingsMassBalanceEnum);
++   this->InputExtrude(SurfaceforcingsMassBalanceEnum,-1);
+ 
+ 	/*clean-up*/
+ 	delete gauss;
+@@ -2859,10 +2865,10 @@
+ 		if (save_parameter) ((ControlInput*)input)->SaveValue();
+ 
+ 		if(control_type[i]==MaterialsRheologyBbarEnum){
+-			this->InputExtrude(MaterialsRheologyBEnum);
++			this->InputExtrude(MaterialsRheologyBEnum,-1);
+ 		}
+ 		else if(control_type[i]==DamageDbarEnum){
+-			this->InputExtrude(DamageDEnum);
++			this->InputExtrude(DamageDEnum,-1);
+ 		}
+ 	}
+ 
+@@ -2929,10 +2935,10 @@
+ 	((ControlInput*)input)->SetInput(new_input);
+ 
+ 	if(control_init==MaterialsRheologyBbarEnum){
+-		this->InputExtrude(control_enum);
++		this->InputExtrude(control_enum,-1);
+ 	}
+ 	if(control_init==DamageDbarEnum){
+-		this->InputExtrude(control_enum);
++		this->InputExtrude(control_enum,-1);
+ 	}
+ }
+ /*}}}*/
+@@ -3170,15 +3176,15 @@
+ 		else phi[i]=h[i]+r[i]/density;
+ 	}
+ 	this->inputs->AddInput(new PentaInput(MaskGroundediceLevelsetEnum,&phi[0],P1Enum));
+-	this->InputExtrude(MaskGroundediceLevelsetEnum);
++	this->InputExtrude(MaskGroundediceLevelsetEnum,-1);
+ 
+ 	/*Update inputs*/
+ 	this->inputs->AddInput(new PentaInput(SurfaceEnum,&s[0],P1Enum));
+ 	this->inputs->AddInput(new PentaInput(BaseEnum,&b[0],P1Enum));
+ 
+ 	/*Extrude inputs*/
+-	this->InputExtrude(SurfaceEnum);
+-	this->InputExtrude(BaseEnum);
++	this->InputExtrude(SurfaceEnum,-1);
++	this->InputExtrude(BaseEnum,-1);
+ }
+ /*}}}*/
+ void       Penta::PotentialUngrounding(Vector<IssmDouble>* potential_ungrounding){/*{{{*/
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18450)
+@@ -143,7 +143,7 @@
+ 		int            GetElementType(void);
+ 		void           GetInputValue(IssmDouble* pvalue,Node* node,int enumtype);
+ 		Node*          GetNode(int node_number);
+-		void	         InputExtrude(int enum_type);
++		void	         InputExtrude(int enum_type,int start);
+ 		void           InputUpdateFromSolutionOneDof(IssmDouble* solutiong,int enum_type);
+ 		void           InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solutiong,int enum_type);
+ 		bool	         IsOnSurface(void);
+Index: ../trunk-jpl/src/c/classes/Elements/Seg.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18450)
+@@ -129,7 +129,7 @@
+ 
+ 		void        GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int enum_type){_error_("not implemented yet");};
+ 		void        InputDepthAverageAtBase(int enum_type,int average_enum_type){_error_("not implemented yet");};
+-		void        InputExtrude(int enum_type){_error_("not implemented"); /*For penta only*/};
++		void        InputExtrude(int enum_type,int start){_error_("not implemented"); /*For penta only*/};
+ 		void        InputScale(int enum_type,IssmDouble scale_factor){_error_("not implemented yet");};
+ 		void        MaterialUpdateFromTemperature(void){_error_("not implemented yet");};
+ 		int         NodalValue(IssmDouble* pvalue, int index, int natureofdataenum){_error_("not implemented yet");};
+Index: ../trunk-jpl/src/c/classes/Elements/Tetra.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18450)
+@@ -133,7 +133,7 @@
+ 		void		   GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level){_error_("not implemented yet");};
+ 		void        GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int enum_type){_error_("not implemented yet");};
+ 		void        InputDepthAverageAtBase(int enum_type,int average_enum_type){_error_("not implemented yet");};
+-		void        InputExtrude(int enum_type){_error_("not implemented"); /*For penta only*/};
++		void        InputExtrude(int enum_type,int start){_error_("not implemented"); /*For penta only*/};
+ 		void        InputScale(int enum_type,IssmDouble scale_factor){_error_("not implemented yet");};
+ 		void        MaterialUpdateFromTemperature(void){_error_("not implemented yet");};
+ 		int         NodalValue(IssmDouble* pvalue, int index, int natureofdataenum){_error_("not implemented yet");};
+Index: ../trunk-jpl/src/c/classes/Inputs/DoubleInput.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/DoubleInput.h	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Inputs/DoubleInput.h	(revision 18450)
+@@ -66,7 +66,7 @@
+ 		IssmDouble MaxAbs(void);
+ 		IssmDouble Min(void);
+ 		IssmDouble MinAbs(void);
+-		void Extrude(void){_error_("not supported yet");};
++		void Extrude(int start){_error_("not supported yet");};
+ 		void VerticallyIntegrate(Input* thickness_input);
+ 		void GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist);
+ 		/*}}}*/
+Index: ../trunk-jpl/src/c/classes/Inputs/ControlInput.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/ControlInput.cpp	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Inputs/ControlInput.cpp	(revision 18450)
+@@ -120,9 +120,9 @@
+ void ControlInput::Constrain(IssmDouble min, IssmDouble max){/*{{{*/
+ 	   values->Constrain(min,max);
+ }/*}}}*/
+-void ControlInput::Extrude(void){/*{{{*/
+-	values->Extrude();
+-	savedvalues->Extrude();
++void ControlInput::Extrude(int start){/*{{{*/
++	values->Extrude(start);
++	savedvalues->Extrude(start);
+ 	//gradient->Extrude();
+ }/*}}}*/
+ int  ControlInput::GetResultInterpolation(void){/*{{{*/
+Index: ../trunk-jpl/src/c/classes/Inputs/SegInput.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/SegInput.h	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Inputs/SegInput.h	(revision 18450)
+@@ -68,7 +68,7 @@
+ 		IssmDouble MaxAbs(void){_error_("not implemented yet");};
+ 		IssmDouble Min(void);
+ 		IssmDouble MinAbs(void){_error_("not implemented yet");};
+-		void Extrude(void){_error_("not supported yet");};
++		void Extrude(int start){_error_("not supported yet");};
+ 		void VerticallyIntegrate(Input* thickness_input){_error_("not supported yet");};
+ 		void GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist){_error_("not implemented yet");};
+ 
+Index: ../trunk-jpl/src/c/classes/Inputs/TetraInput.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/TetraInput.h	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Inputs/TetraInput.h	(revision 18450)
+@@ -68,7 +68,7 @@
+ 		IssmDouble MaxAbs(void);
+ 		IssmDouble Min(void);
+ 		IssmDouble MinAbs(void);
+-		void Extrude(void){_error_("not supported yet");};
++		void Extrude(int start){_error_("not supported yet");};
+ 		void VerticallyIntegrate(Input* thickness_input){_error_("not supported yet");};
+ 		void GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist);
+ 
+Index: ../trunk-jpl/src/c/classes/Inputs/Input.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/Input.h	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Inputs/Input.h	(revision 18450)
+@@ -50,7 +50,7 @@
+ 		virtual void   AXPY(Input* xinput,IssmDouble scalar)=0;
+ 		virtual void   Constrain(IssmDouble cm_min, IssmDouble cm_max)=0;
+ 		virtual void   VerticallyIntegrate(Input* thickness_input)=0;
+-		virtual void   Extrude()=0;
++		virtual void   Extrude(int start)=0;
+ 		virtual void   GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist)=0;
+ 
+ 		virtual Input* SpawnTriaInput(int index1,int index2,int index3)=0;
+Index: ../trunk-jpl/src/c/classes/Inputs/ControlInput.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/ControlInput.h	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Inputs/ControlInput.h	(revision 18450)
+@@ -71,7 +71,7 @@
+ 		IssmDouble MaxAbs(void){_error_("not implemented yet");};
+ 		IssmDouble Min(void);
+ 		IssmDouble MinAbs(void){_error_("not implemented yet");};
+-		void Extrude(void);
++		void Extrude(int start);
+ 		void VerticallyIntegrate(Input* thickness_input);
+ 		void GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist,const char* data);
+ 		void GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist);
+Index: ../trunk-jpl/src/c/classes/Inputs/DatasetInput.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/DatasetInput.h	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Inputs/DatasetInput.h	(revision 18450)
+@@ -67,7 +67,7 @@
+ 		IssmDouble MaxAbs(void){_error_("not implemented yet");};
+ 		IssmDouble Min(void){_error_("not implemented yet");};
+ 		IssmDouble MinAbs(void){_error_("not implemented yet");};
+-		void Extrude(void){_error_("not implemented yet");};
++		void Extrude(int start){_error_("not implemented yet");};
+ 		void VerticallyIntegrate(Input* thickness_input){_error_("not implemented yet");};
+ 		void GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist){_error_("not implemented yet");};
+ 		int GetResultInterpolation(void){_error_("not implemented yet");};
+Index: ../trunk-jpl/src/c/classes/Inputs/BoolInput.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/BoolInput.cpp	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Inputs/BoolInput.cpp	(revision 18450)
+@@ -132,7 +132,7 @@
+ 
+ }
+ /*}}}*/
+-void BoolInput::Extrude(void){/*{{{*/
++void BoolInput::Extrude(int start){/*{{{*/
+ 
+ 	/*do nothing*/
+ 	return;
+Index: ../trunk-jpl/src/c/classes/Inputs/IntInput.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/IntInput.h	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Inputs/IntInput.h	(revision 18450)
+@@ -67,7 +67,7 @@
+ 		IssmDouble MaxAbs(void){_error_("Max not implemented for integers");};
+ 		IssmDouble Min(void){_error_("Min not implemented for integers");};
+ 		IssmDouble MinAbs(void){_error_("Min not implemented for integers");};
+-		void Extrude(void){_error_("not supported yet");};
++		void Extrude(int start){_error_("not supported yet");};
+ 		void VerticallyIntegrate(Input* thickness_input){_error_("not supported yet");};
+ 		void GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist);
+ 		/*}}}*/
+Index: ../trunk-jpl/src/c/classes/Inputs/BoolInput.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/BoolInput.h	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Inputs/BoolInput.h	(revision 18450)
+@@ -63,7 +63,7 @@
+ 		void Scale(IssmDouble scale_factor);
+ 		void AXPY(Input* xinput,IssmDouble scalar);
+ 		void Constrain(IssmDouble cm_min, IssmDouble cm_max){_error_("Constrain not implemented for booleans");};
+-		void Extrude(void);
++		void Extrude(int start);
+ 		void VerticallyIntegrate(Input* thickness_input){_error_("not supported yet");};
+ 		void GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist);
+ 		/*}}}*/
+Index: ../trunk-jpl/src/c/classes/Inputs/TriaInput.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/TriaInput.h	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Inputs/TriaInput.h	(revision 18450)
+@@ -68,7 +68,7 @@
+ 		IssmDouble MaxAbs(void);
+ 		IssmDouble Min(void);
+ 		IssmDouble MinAbs(void);
+-		void Extrude(void){_error_("not supported yet");};
++		void Extrude(int start){_error_("not supported yet");};
+ 		void VerticallyIntegrate(Input* thickness_input){_error_("not supported yet");};
+ 		void GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist);
+ 
+Index: ../trunk-jpl/src/c/classes/Inputs/PentaInput.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/PentaInput.cpp	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Inputs/PentaInput.cpp	(revision 18450)
+@@ -290,11 +290,16 @@
+ 
+ }
+ /*}}}*/
+-void PentaInput::Extrude(void){/*{{{*/
++void PentaInput::Extrude(int start){/*{{{*/
+ 
+ 	switch(this->interpolation_type){
+ 		case P1Enum:
+-			for(int i=0;i<3;i++) this->values[3+i]=this->values[i];
++			if(start==-1){
++				for(int i=0;i<3;i++) this->values[3+i]=this->values[i];
++			}
++			else{
++				for(int i=3;i<6;i++) this->values[i]  =this->values[3+i];
++			}
+ 			break;
+ 		default:
+ 			_error_("not supported yet for type "<<EnumToStringx(this->interpolation_type));
+Index: ../trunk-jpl/src/c/classes/Inputs/TransientInput.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/TransientInput.cpp	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Inputs/TransientInput.cpp	(revision 18450)
+@@ -344,10 +344,10 @@
+ 
+ }
+ /*}}}*/
+-void TransientInput::Extrude(void){/*{{{*/
++void TransientInput::Extrude(int start){/*{{{*/
+ 
+ 	for(int i=0;i<this->numtimesteps;i++){
+-		((Input*)this->inputs->GetObjectByOffset(i))->Extrude();
++		((Input*)this->inputs->GetObjectByOffset(i))->Extrude(start);
+ 	}
+ }
+ /*}}}*/
+Index: ../trunk-jpl/src/c/classes/Inputs/PentaInput.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/PentaInput.h	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Inputs/PentaInput.h	(revision 18450)
+@@ -67,7 +67,7 @@
+ 		IssmDouble MaxAbs(void);
+ 		IssmDouble Min(void);
+ 		IssmDouble MinAbs(void);
+-		void Extrude(void);
++		void Extrude(int start);
+ 		void VerticallyIntegrate(Input* thickness_input);
+ 		void GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist);
+ 
+Index: ../trunk-jpl/src/c/classes/Inputs/TransientInput.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/TransientInput.h	(revision 18449)
++++ ../trunk-jpl/src/c/classes/Inputs/TransientInput.h	(revision 18450)
+@@ -72,7 +72,7 @@
+ 		IssmDouble MaxAbs(void);
+ 		IssmDouble Min(void);
+ 		IssmDouble MinAbs(void);
+-		void Extrude(void);
++		void Extrude(int start);
+ 		void VerticallyIntegrate(Input* thickness_forcing){_error_("not supported yet");};
+ 		void GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist);
+ 		void GetTimeValues(IssmDouble* values,IssmDouble time){_error_("not implemented yet");};
Index: /issm/oecreview/Archive/18296-19100/ISSM-18450-18451.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18450-18451.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18450-18451.diff	(revision 19102)
@@ -0,0 +1,17 @@
+Index: ../trunk-jpl/jenkins/linux64_murdo
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_murdo	(revision 18450)
++++ ../trunk-jpl/jenkins/linux64_murdo	(revision 18451)
+@@ -13,10 +13,10 @@
+ 	--with-matlab-dir=$MATLAB_DIR \
+ 	--with-triangle-dir=$ISSM_DIR/externalpackages/triangle/install \
+ 	--with-mpi-include=$ISSM_DIR/externalpackages/mpich/install/include  \
+-	--with-mpi-libflags="-L$ISSM_DIR/externalpackages/mpich/install/lib/ -lmpich" \
++	--with-mpi-libflags="-L$ISSM_DIR/externalpackages/mpich/install/lib -lmpich" \
+ 	--with-petsc-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-metis-dir=$ISSM_DIR/externalpackages/petsc/install \
+-	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install/ \
++	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-python-dir=$ISSM_DIR/externalpackages/python/install\
+ 	--with-python-numpy-dir=$ISSM_DIR/externalpackages/python/install/lib/python2.7/site-packages/numpy/core/include/numpy\
Index: /issm/oecreview/Archive/18296-19100/ISSM-18451-18452.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18451-18452.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18451-18452.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18451)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18452)
+@@ -237,7 +237,7 @@
+ 	_printf0_("   "<<setw(40)<<left<<"FemModel initialization elapsed time:"<<profiler->DeltaTime(StartInit,FinishInit) << "\n");
+ 	_printf0_("   "<<setw(40)<<left<<"Core solution elapsed time:"<<profiler->DeltaTime(StartCore,FinishCore) << "\n");
+ 	_printf0_("\n");
+-	_printf0_("   Total elapsed time:"
++	_printf0_("   Total elapsed time: "
+ 				<<profiler->DeltaTimeModHour(Start,Finish)<<" hrs "
+ 				<<profiler->DeltaTimeModMin(Start,Finish)<<" min "
+ 				<<profiler->DeltaTimeModSec(Start,Finish)<<" sec"
Index: /issm/oecreview/Archive/18296-19100/ISSM-18452-18453.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18452-18453.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18452-18453.diff	(revision 19102)
@@ -0,0 +1,220 @@
+Index: ../trunk-jpl/src/c/bamg/Mesh.cpp
+===================================================================
+--- ../trunk-jpl/src/c/bamg/Mesh.cpp	(revision 18452)
++++ ../trunk-jpl/src/c/bamg/Mesh.cpp	(revision 18453)
+@@ -226,22 +226,22 @@
+ 	Mesh::~Mesh() {/*{{{*/
+ 		/*Original code from Frederic Hecht <hecht@ann.jussieu.fr> (BAMG v1.01, Mesh2.cpp/Triangles)*/
+ 
+-		//if (vertices)             delete [] vertices;
+-		if (edges)                delete [] edges;
+-		if (triangles)            delete [] triangles;
+-		if (quadtree)             delete    quadtree;
+-		//if (orderedvertices)                delete [] orderedvertices;
+-		if (subdomains)           delete []  subdomains;
+-		if (VerticesOnGeomEdge)   delete [] VerticesOnGeomEdge;
+-		if (VerticesOnGeomVertex) delete [] VerticesOnGeomVertex;
+-		if (VertexOnBThVertex)    delete [] VertexOnBThVertex;
+-		if (VertexOnBThEdge)      delete [] VertexOnBThEdge;
++		if(vertices)             delete [] vertices;
++		if(edges)                delete [] edges;
++		if(triangles)            delete [] triangles;
++		if(quadtree)             delete    quadtree;
++		if(orderedvertices)      delete [] orderedvertices;
++		if(subdomains)           delete []  subdomains;
++		if(VerticesOnGeomEdge)   delete [] VerticesOnGeomEdge;
++		if(VerticesOnGeomVertex) delete [] VerticesOnGeomVertex;
++		if(VertexOnBThVertex)    delete [] VertexOnBThVertex;
++		if(VertexOnBThEdge)      delete [] VertexOnBThEdge;
+ 
+-		if (&Gh) {
++		if(&Gh){
+ 			if (Gh.NbRef>0) Gh.NbRef--;
+ 			else if (Gh.NbRef==0) delete &Gh;
+ 		}
+-		if (&BTh && (&BTh != this)) {
++		if(&BTh && (&BTh != this)){
+ 			if (BTh.NbRef>0) BTh.NbRef--;
+ 			else if (BTh.NbRef==0) delete &BTh;
+ 		}
+@@ -2725,7 +2725,7 @@
+ 		VerticesOnGeomEdge=NULL;
+ 
+ 		/*Allocate if maxnbv_in>0*/
+-		if (maxnbv_in) {
++		if(maxnbv_in){
+ 			vertices=new BamgVertex[maxnbv];
+ 			_assert_(vertices);
+ 			orderedvertices=new BamgVertex* [maxnbv];
+@@ -2733,7 +2733,7 @@
+ 			triangles=new Triangle[maxnbt];
+ 			_assert_(triangles);
+ 		}
+-		else {
++		else{
+ 			vertices=NULL;
+ 			orderedvertices=NULL;
+ 			triangles=NULL;
+Index: ../trunk-jpl/src/c/modules/InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.cpp	(revision 18452)
++++ ../trunk-jpl/src/c/modules/InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.cpp	(revision 18453)
+@@ -48,12 +48,12 @@
+ 	data_interp=xNew<double>(N_interp*N_data);
+ 
+ 	/*read background mesh*/
+-	Mesh Th(index_data,x_data,y_data,nods_data,nels_data); 
++	Mesh* Th=new Mesh(index_data,x_data,y_data,nods_data,nels_data); 
+ 
+ 	/*Get reference number (for subdomains)*/
+-	long* reft = xNew<long>(Th.nbt);
+-	Th.TriangleReferenceList(reft);
+-	Th.CreateSingleVertexToTriangleConnectivity();
++	long* reft = xNew<long>(Th->nbt);
++	Th->TriangleReferenceList(reft);
++	Th->CreateSingleVertexToTriangleConnectivity();
+ 
+ 	/*Get domain boundaries*/
+ 	xmin=x_data[0]; ymin=y_data[0];
+@@ -78,10 +78,10 @@
+ 
+ 		/*Get current point coordinates*/
+ 		r.x=x_interp[i]; r.y=y_interp[i];
+-		I2 I=Th.R2ToI2(r);
++		I2 I=Th->R2ToI2(r);
+ 
+ 		/*Find triangle holding r/I*/
+-		Triangle &tb=*Th.TriangleFindFromCoord(I,dete);
++		Triangle &tb=*Th->TriangleFindFromCoord(I,dete);
+ 
+ 		/*point inside convex*/
+ 		if (tb.det>0){ 
+@@ -91,11 +91,11 @@
+ 			areacoord[1]= (double) dete[1]/tb.det;
+ 			areacoord[2]= (double) dete[2]/tb.det;
+ 			/*3 vertices of the triangle*/
+-			i0=Th.GetId(tb[0]);
+-			i1=Th.GetId(tb[1]);
+-			i2=Th.GetId(tb[2]);
++			i0=Th->GetId(tb[0]);
++			i1=Th->GetId(tb[1]);
++			i2=Th->GetId(tb[2]);
+ 			/*triangle number*/
+-			it=Th.GetId(tb);
++			it=Th->GetId(tb);
+ 
+ 			/*Inside convex but outside mesh*/
+ 			if (reft[it]<0 && isdefault){
+@@ -119,11 +119,11 @@
+ 				areacoord[VerticesOfTriangularEdge[k][0]] = bb;
+ 				areacoord[OppositeVertex[k]] = 1 - aa -bb;
+ 				//3 vertices of the triangle
+-				i0=Th.GetId(tc[0]);
+-				i1=Th.GetId(tc[1]);
+-				i2=Th.GetId(tc[2]);
++				i0=Th->GetId(tc[0]);
++				i1=Th->GetId(tc[1]);
++				i2=Th->GetId(tc[2]);
+ 				//triangle number
+-				it=Th.GetId(tc);
++				it=Th->GetId(tc);
+ 			}
+ 		}
+ 
+@@ -144,6 +144,7 @@
+ 	//if(N_interp>=100) _printf_("\r      interpolation progress: "<<fixed<<setw(6)<<setprecision(2)<<100.<<"%  \n");
+ 
+ 	/*clean-up and return*/
++	delete Th;
+ 	xDelete<long>(reft);
+ 	*pdata_interp=data_interp;
+ 	return 1;
+Index: ../trunk-jpl/src/wrappers/python/io/WritePythonData.cpp
+===================================================================
+--- ../trunk-jpl/src/wrappers/python/io/WritePythonData.cpp	(revision 18452)
++++ ../trunk-jpl/src/wrappers/python/io/WritePythonData.cpp	(revision 18453)
+@@ -34,9 +34,13 @@
+ 	npy_intp dims[2]={0,0};
+ 	PyObject* array=NULL;
+ 
++	/*copy matrix: */
++	double* matrix_python=xNew<double>(M*N);
++	memcpy(matrix_python,matrix,M*N*sizeof(double));
++
+ 	dims[0]=(npy_intp)M;
+ 	dims[1]=(npy_intp)N;
+-	array=PyArray_SimpleNewFromData(2,dims,NPY_DOUBLE,matrix);
++	array=PyArray_SimpleNewFromData(2,dims,NPY_DOUBLE,matrix_python);
+ 
+ 	PyTuple_SetItem(tuple, index, array);
+ }/*}}}*/
+@@ -46,13 +50,9 @@
+ 	npy_intp dims[2]={0,0};
+ 	PyObject* array=NULL;
+ 
+-	/*intermediary:*/
+-	long* lmatrix=NULL;
+-	int i;
+-
+ 	/*transform into long matrix: */
+-	lmatrix=xNew<long>(M*N);
+-	for(i=0;i<M*N;i++)lmatrix[i]=(long)matrix[i];
++	long* lmatrix=xNew<long>(M*N);
++	for(int i=0;i<M*N;i++)lmatrix[i]=(long)matrix[i];
+ 
+ 	dims[0]=(npy_intp)M;
+ 	dims[1]=(npy_intp)N;
+@@ -66,25 +66,29 @@
+ 	npy_intp dims[2]={0,0};
+ 	PyObject* array=NULL;
+ 
++	/*copy matrix: */
++	bool* matrix_python=xNew<bool>(M*N);
++	memcpy(matrix_python,matrix,M*N*sizeof(bool));
++
+ 	dims[0]=(npy_intp)M;
+ 	dims[1]=(npy_intp)N;
+-	array=PyArray_SimpleNewFromData(2,dims,NPY_BOOL,matrix);
++	array=PyArray_SimpleNewFromData(2,dims,NPY_BOOL,matrix_python);
+ 
+ 	PyTuple_SetItem(tuple, index, array);
+ }/*}}}*/
+ /*FUNCTION WriteData(PyObject* py_tuple,int index, double* vector, int M){{{*/
+ void WriteData(PyObject* py_tuple, int index, double* vector, int M){
+ 
+-	double   *buffer = NULL;
+ 	npy_intp  dim   = 10;
+ 	PyObject *array = NULL;
+ 
+-	/*Copy vector*/
+-	buffer=xNew<double>(M);
+-	for(int i=0;i<M;i++)buffer[i]=vector[i];
+ 
++	/*copy vector: */
++	double* vector_python=xNew<double>(M);
++	memcpy(vector_python,vector,M*sizeof(double));
++
+ 	dim=(npy_intp)M;
+-	array=PyArray_SimpleNewFromData(1,&dim,NPY_DOUBLE,buffer);
++	array=PyArray_SimpleNewFromData(1,&dim,NPY_DOUBLE,vector_python);
+ 
+ 	PyTuple_SetItem(py_tuple, index, array);
+ 
+Index: ../trunk-jpl/src/wrappers/InterpFromMeshToMesh2d/InterpFromMeshToMesh2d.cpp
+===================================================================
+--- ../trunk-jpl/src/wrappers/InterpFromMeshToMesh2d/InterpFromMeshToMesh2d.cpp	(revision 18452)
++++ ../trunk-jpl/src/wrappers/InterpFromMeshToMesh2d/InterpFromMeshToMesh2d.cpp	(revision 18453)
+@@ -75,5 +75,13 @@
+ 	WriteData(DATAINTERP,data_interp,N_interp,N_data);
+ 
+ 	/*end module: */
++	xDelete<int>(index);
++	xDelete<double>(x_data);
++	xDelete<double>(y_data);
++	xDelete<double>(data);
++	xDelete<double>(x_interp);
++	xDelete<double>(y_interp);
++	xDelete<double>(data_interp);
++	delete options;
+ 	MODULEEND();
+ }
Index: /issm/oecreview/Archive/18296-19100/ISSM-18453-18454.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18453-18454.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18453-18454.diff	(revision 19102)
@@ -0,0 +1,72 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp	(revision 18453)
++++ ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp	(revision 18454)
+@@ -299,7 +299,6 @@
+ 	Matrix* m_min    = new Matrix(mx *my,3);
+ 	Matrix* m_new    = new Matrix(mx *my,3);
+ 	m_old->MatrixEqual(mesh_ini);
+-	mesh_ini->Echo();
+ 
+ 	/* calculate initial misfit */
+ 	double E_old=misfit(m_old,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my);
+@@ -309,13 +308,14 @@
+ 	savefile1 << "nan   "<<  Ta<<"   "<< Tm<<"   "<< E_old<<"     "<< totaliter<<"         "<< Tred <<"  "<< endl;
+ 	savefile2 << totaliter<< endl;
+ 	for(int i=0;i<mx*my;i++){
+-	savefile2 << m_old->GetValue(i,0)<<"   "<< m_old->GetValue(i,1)<<"   "<< m_old->GetValue(i,2)<<endl;
++		savefile2 << m_old->GetValue(i,0)<<"   "<< m_old->GetValue(i,1)<<"   "<< m_old->GetValue(i,2)<<endl;
+ 	}
+-	
++	savefile2 << "111111111111111111111111111111111111111111111111111111111111111111111111111"<< endl;
++
+ 	/* beginning of the loop */
+ 
+ 	while(finished==0){
+-		
++
+ 		iterT++;
+ 		totaliter++;
+ 
+@@ -340,7 +340,7 @@
+ 		/* update model and calculate energy */
+ 
+ 		newmodelgen(m_old,m_new,bathy,icethick,mx,my,Tm,ptval,mmax,mmax2,ctr,sd);  /* new model */
+-	   E_new=misfit(m_new,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my); /* new energy */
++		E_new=misfit(m_new,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my); /* new energy */
+ 		dE=E_new-E_old;                                        /* energy difference */
+ 
+ 		/* acceptance probability */
+@@ -368,6 +368,7 @@
+ 				for(int i=0;i<mx*my;i++){
+ 					savefile2 << m_old->GetValue(i,0)<<"   "<< m_old->GetValue(i,1)<<"   "<< m_old->GetValue(i,2)<<endl;
+ 				}
++				savefile2 << "111111111111111111111111111111111111111111111111111111111111111111111111111"<< endl;
+ 			}
+ 		}
+ 		else{
+@@ -382,6 +383,7 @@
+ 					for(int i=0;i<mx*my;i++){
+ 						savefile2 << m_old->GetValue(i,0)<<"   "<< m_old->GetValue(i,1)<<"   "<< m_old->GetValue(i,2)<<endl;
+ 					}
++					savefile2 << "111111111111111111111111111111111111111111111111111111111111111111111111111"<< endl;
+ 				}
+ 			}
+ 			else{
+@@ -397,6 +399,8 @@
+ 	for(int i=0;i<mx*my;i++){
+ 		savefile2 << m_min->GetValue(i,0)<<"   "<< m_min->GetValue(i,1)<<"   "<< m_min->GetValue(i,2)<<endl;
+ 	}
++	savefile1.close;
++	savefile2.close;
+ 			/*}}}*/
+ 	return 0;
+ }/*}}}*/
+@@ -629,7 +633,6 @@
+ 	}
+ 	m1->ExtractColumn(m1col,1);
+ 	vec2gridsimple(m1col,m1gr,mx,my);
+-	cout<<endl<<endl;
+ 	filtergrav(m1grsm,m1gr,ctr,sd,mx,my);
+ 	reshape(m1grsm,m1col,mx,my);
+ 	for (int i=0;i<mx*my;i++){
Index: /issm/oecreview/Archive/18296-19100/ISSM-18454-18455.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18454-18455.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18454-18455.diff	(revision 19102)
@@ -0,0 +1,119 @@
+Index: ../trunk-jpl/src/c/bamg/BamgVertex.h
+===================================================================
+--- ../trunk-jpl/src/c/bamg/BamgVertex.h	(revision 18454)
++++ ../trunk-jpl/src/c/bamg/BamgVertex.h	(revision 18455)
+@@ -22,6 +22,7 @@
+ 			R2        r;                 // real coordinates
+ 			Metric    m;
+ 			long      ReferenceNumber;
++			long      PreviousNumber;
+ 			Direction DirOfSearch;
+ 			short     IndexInTriangle;              // the vertex number in triangle; varies between 0 and 2 in t
+ 
+@@ -41,6 +42,7 @@
+ 			double operator()(R2 x) const { return m(x);} // Get x in the metric m
+ 
+ 			/*methods (No constructor and no destructors...)*/
++			BamgVertex();
+ 			double Smoothing(Mesh & ,const Mesh & ,Triangle  * & ,double =1);
+ 			void   MetricFromHessian(const double Hxx,const double Hyx, const double Hyy, const double smin,const double smax,const double s,const double err,BamgOpts* bamgopts);
+ 			void   Echo();
+Index: ../trunk-jpl/src/c/bamg/BamgMesh.cpp
+===================================================================
+--- ../trunk-jpl/src/c/bamg/BamgMesh.cpp	(revision 18454)
++++ ../trunk-jpl/src/c/bamg/BamgMesh.cpp	(revision 18455)
+@@ -4,7 +4,7 @@
+ /*Constructors/Destructors*/
+ BamgMesh::BamgMesh(){/*{{{*/
+ 
+-	this->VerticesSize[0]=0,                  this->VerticesSize[1]=0;                 this->Vertices=NULL;
++	this->VerticesSize[0]=0,                  this->VerticesSize[1]=0;                 this->Vertices=NULL;          this->PreviousNumbering = NULL;
+ 	this->EdgesSize[0]=0,                     this->EdgesSize[1]=0;                    this->Edges=NULL;
+ 	this->TrianglesSize[0]=0,                 this->TrianglesSize[1]=0;                this->Triangles=NULL;
+ 	this->QuadrilateralsSize[0]=0,            this->QuadrilateralsSize[1]=0;           this->Quadrilaterals=NULL;
+@@ -29,6 +29,7 @@
+ BamgMesh::~BamgMesh(){/*{{{*/
+ 
+ 	xDelete<double>(this->Vertices);
++	xDelete<double>(this->PreviousNumbering);
+ 	xDelete<double>(this->Edges);
+ 	xDelete<double>(this->Triangles);
+ 	xDelete<double>(this->Quadrilaterals);
+Index: ../trunk-jpl/src/c/bamg/BamgVertex.cpp
+===================================================================
+--- ../trunk-jpl/src/c/bamg/BamgVertex.cpp	(revision 18454)
++++ ../trunk-jpl/src/c/bamg/BamgVertex.cpp	(revision 18455)
+@@ -9,6 +9,11 @@
+ 
+ namespace bamg {
+ 
++	/*Constructor/Destructor*/
++	BamgVertex::BamgVertex(){ /*{{{*/
++		this->PreviousNumber = 0;
++	}/*}}}*/
++
+ 	/*Methods*/
+ 	void BamgVertex::Echo(void){/*{{{*/
+ 
+@@ -16,6 +21,7 @@
+ 		_printf_("  integer   coordinates i.x: " << i.x << ", i.y: " << i.y << "\n");
+ 		_printf_("  Euclidean coordinates r.x: " << r.x << ", r.y: " << r.y << "\n");
+ 		_printf_("  ReferenceNumber = " << ReferenceNumber << "\n");
++		_printf_("  PreviousNumber  = " << PreviousNumber << "\n");
+ 		m.Echo();
+ 
+ 		return;
+Index: ../trunk-jpl/src/c/bamg/BamgMesh.h
+===================================================================
+--- ../trunk-jpl/src/c/bamg/BamgMesh.h	(revision 18454)
++++ ../trunk-jpl/src/c/bamg/BamgMesh.h	(revision 18455)
+@@ -10,6 +10,7 @@
+ 
+ 		int     VerticesSize[2];
+ 		double* Vertices;
++		double* PreviousNumbering;
+ 		int     EdgesSize[2];
+ 		double* Edges;
+ 		int     TrianglesSize[2];
+Index: ../trunk-jpl/src/c/bamg/Mesh.cpp
+===================================================================
+--- ../trunk-jpl/src/c/bamg/Mesh.cpp	(revision 18454)
++++ ../trunk-jpl/src/c/bamg/Mesh.cpp	(revision 18455)
+@@ -570,12 +570,14 @@
+ 		if(verbose>5) _printf_("      writing Vertices\n");
+ 		bamgmesh->VerticesSize[0]=nbv;
+ 		bamgmesh->VerticesSize[1]=3;
+-		if (nbv){
++		if(nbv){
+ 			bamgmesh->Vertices=xNew<double>(3*nbv);
++			bamgmesh->PreviousNumbering=xNew<double>(nbv);
+ 			for (i=0;i<nbv;i++){
+ 				bamgmesh->Vertices[i*3+0]=vertices[i].r.x;
+ 				bamgmesh->Vertices[i*3+1]=vertices[i].r.y;
+ 				bamgmesh->Vertices[i*3+2]=vertices[i].GetReferenceNumber();
++				bamgmesh->PreviousNumbering[i]=vertices[i].PreviousNumber;
+ 			}
+ 		}
+ 
+@@ -3145,7 +3147,8 @@
+ 			for (i=0;i<Bh.nbv;i++){ 
+ 				BamgVertex &bv=Bh[i];
+ 				if (!bv.GeomEdgeHook){
+-					vertices[nbv].r   = bv.r;
++					vertices[nbv].r              = bv.r;
++					vertices[nbv].PreviousNumber = i+1;
+ 					vertices[nbv++].m = bv.m;
+ 				}
+ 			}
+Index: ../trunk-jpl/src/m/classes/bamgmesh.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/bamgmesh.m	(revision 18454)
++++ ../trunk-jpl/src/m/classes/bamgmesh.m	(revision 18455)
+@@ -22,6 +22,7 @@
+ 		NodalElementConnectivity=[];
+ 		CrackedVertices=[];
+ 		CrackedEdges=[];
++		PreviousNumbering=[];
+ 		% }}}
+ 	end
+ 	methods
Index: /issm/oecreview/Archive/18296-19100/ISSM-18455-18456.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18455-18456.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18455-18456.diff	(revision 19102)
@@ -0,0 +1,73 @@
+Index: ../trunk-jpl/AUTHORS
+===================================================================
+--- ../trunk-jpl/AUTHORS	(revision 18455)
++++ ../trunk-jpl/AUTHORS	(revision 18456)
+@@ -1,27 +0,0 @@
+-Ice Sheet System Model is a JPL/UCI collaboration to develop a massively-parallelized
+-multi-purpose finite element framework dedicated to ice sheet modeling
+-
+-Project Scientist: 
+-   Eric Rignot <eric.rignot@jpl.nasa.gov>
+-
+-Project Manager: 
+-   Eric Larour <eric.larour@jpl.nasa.gov>
+-
+-Current core developers:
+-   * Eric Larour <eric.larour@jpl.nasa.gov>
+-   * Helene Seroussi <helene.seroussi@jpl.nasa.gov>
+-   * Mathieu Morlighem <mathieu.morlighem@uci.edu>
+-
+-Contributors:
+-	We thank the following contributors for their help in making ISSM better!
+-
+-	Robert Crippen, Jet Propulsion Laboratory.  robbert.crippen@jpl.nasa.gov
+-	HoleFiller routines to plug incomplete datasets. See HoleFiller module in src/m/matlab/utils
+-
+-	Point Inclusion in Polygon Test (pnpoly.c used in Utils/Arguscontourtomesh/IsInPoly.c)
+-	W. Randolph Franklin (WRF)
+-	http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
+-
+-	DACE: A Matlab Kriging toolbox, Søren N.Lophaen, Hans Bruun Nielsen and Jacob
+-	Søndergaard (Technical University of Denmark)
+-	http://www2.imm.dtu.dk/~hbn/dace/
+Index: ../trunk-jpl/README
+===================================================================
+--- ../trunk-jpl/README	(revision 18455)
++++ ../trunk-jpl/README	(revision 18456)
+@@ -4,33 +4,17 @@
+ Ice Sheet System Modeling: a framework for modeling ice flow on ice sheet/ice shelf
+ systems using Finite Elemenent Analysis, and parallel technologies.
+ 
+-------------------------------------------------------------------------------
++Email:   issm@jpl.nasa.gov
++Website: http://issm.jpl.nasa.gov/
+ 
+-Jet Propulsion Laboratory
+-
+-Eric    Larour (Project Manager)
+-Mathieu Morlighem (Core Developer, Anisotropic Meshing, Control Methods)
+-Helene  Seroussi (Core Develper Coupling 2D-3D, Multi-model, full-Stokes)
+-Nicole  Schlegel (Developer, Atmospheric Forcing)
+-Chris   Borstad (Developer, Rifting/Faulting/Crack Propagation)
+-Feras   Habbal (Developer, Solver Technologies)
+-Daria   Halkides (Analyst, Atmospheric Forcing)
+-Ala     Khazendar (Analyst, Ice Sheet Processes)
+-
+-Email: issm@jpl.nasa.gov
+-
+ ------------------------------------------------------------------------------
+ 
+-Website: http://issm.jpl.nasa.gov/ for additional information.
+-
+-------------------------------------------------------------------------------
+-
+ License
+ 
+ ISSM is California Institute of Technology Copyright, Distributed under BSD Three Clause License.
+ 
+ 
+-Copyright (c) 2002-2011, California Institute of Technology.
++Copyright (c) 2002-2014, California Institute of Technology.
+ All rights reserved.  Based on Government Sponsored Research under contracts
+ NAS7-1407 and/or NAS7-03001.
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18456-18457.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18456-18457.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18456-18457.diff	(revision 19102)
@@ -0,0 +1,312 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp	(revision 18456)
++++ ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp	(revision 18457)
+@@ -7,6 +7,7 @@
+ #include <time.h>
+ #include <cassert>
+ #include <gsl/gsl_multifit.h>
++#include <pthread.h>
+ 
+ using namespace std;
+ 
+@@ -125,7 +126,7 @@
+ void makep(Matrix *Pobs,int nx,int ny, int dx, int dy);
+ void vec2grid(Matrix *V,Matrix *V1,Matrix *V2,int nx, int ny);
+ void msplit( Matrix *m, Matrix *m1,Matrix *m2,double dlevel);
+-void plouff(Matrix *g,Matrix *Pobs,Matrix *Pp,Matrix * mesh,Matrix *rho,int dx,int dy, int dn,int m,int n,int l);
++void* plouffT(void* vpthread_handle);
+ void vec2gridsimple(Matrix *V,Matrix *V1,int nx, int ny);
+ void reshape(Matrix* V,Matrix* V1,int nx,int ny);
+ double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,int dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my);
+@@ -134,8 +135,31 @@
+ void filtergrav(Matrix* A,Matrix* Ain,double ctr,double sd,int mx,int my);
+ void newmodelgen(Matrix* m0,Matrix* m1,Matrix* bathy,Matrix* icethick,int mx,int my,double T,double ptval,double mmax,double mmax2,double ctr,double sd);
+ double coolshed(double T0,int k,double c,double D);
++void   LaunchThread(void* function(void*), void* usr,int num_threads);
+ /*}}}*/
+ 
++/*Multithreading structures {{{*/
++typedef struct{
++	void* usr;
++	int   my_thread;
++	int   num_threads;
++} pthread_handle;
++
++typedef struct{
++	Matrix *g;
++	Matrix *Pobs;
++	Matrix *Pp;
++	Matrix *mesh;
++	Matrix *rho;
++	int dx;
++	int dy;
++	int dn;
++	int m;
++	int n;
++	int l;
++} AppStruct;
++/*}}}*/
++
+ int main(){/*{{{*/
+ 
+ 	/* Seed the random number generator {{{*/
+@@ -390,6 +414,7 @@
+ 				consec++;
+ 			}
+ 		}
++	cout<<totaliter<<endl;
+ 	}
+ 
+ 	m_min->MatrixEqual(m_old);
+@@ -399,8 +424,8 @@
+ 	for(int i=0;i<mx*my;i++){
+ 		savefile2 << m_min->GetValue(i,0)<<"   "<< m_min->GetValue(i,1)<<"   "<< m_min->GetValue(i,2)<<endl;
+ 	}
+-	savefile1.close;
+-	savefile2.close;
++	savefile1.close();
++	savefile2.close();
+ 			/*}}}*/
+ 	return 0;
+ }/*}}}*/
+@@ -483,79 +508,6 @@
+ 	m1->AddNumber(dlevel);
+ 	m2->AddNumber(dlevel);
+ }/*}}}*/
+-void plouff(Matrix *g,Matrix *Pobs,Matrix *Pp,Matrix * mesh,Matrix *rho,int dx,int dy, int dn,int m,int n,int l){/*{{{*/
+-		double gg=6.673e-11;
+-		int si,sj,id,s;
+-		double R,Q,P;
+-		Matrix *xp= new Matrix(1,2);
+-		Matrix *yp= new Matrix(1,2);
+-		Matrix *xpp= new Matrix(1,2);
+-		Matrix *ypp= new Matrix(1,2);
+-		Matrix *U= new Matrix(l,4);
+-		Matrix *U1=new Matrix(1,4);
+-		Matrix *U2=new Matrix(1,4);
+-		Matrix *gl= new Matrix(1,l-1);
+-		bool test=true;
+-		for(int c=0;c<n;c++){
+-			g->SetValue(c,0,0);
+-			for(int a=0;a<m;a++){
+-				test=true;
+-				xp->SetValue(0,0,Pp->GetValue(a,0)-Pobs->GetValue(c,0));
+-				xp->SetValue(0,1,Pp->GetValue(a,0)-Pobs->GetValue(c,0)+dx);
+-				if(xp->GetValue(0,0)<0 && xp->GetValue(0,0)<xp->GetValue(0,1) && xp->GetValue(0,0)*xp->GetValue(0,1)>=0){
+-					xpp->SetValue(0,0,xp->GetValue(0,1));
+-					xpp->SetValue(0,1,xp->GetValue(0,0));
+-					xp->MatrixAbs(xpp);
+-				}
+-				yp->SetValue(0,0,Pp->GetValue(a,1)-Pobs->GetValue(c,1));
+-				yp->SetValue(0,1,Pp->GetValue(a,1)-Pobs->GetValue(c,1)+dy);
+-				if(yp->GetValue(0,0)<0 && yp->GetValue(0,0)<yp->GetValue(0,1) && yp->GetValue(0,0)*yp->GetValue(0,1)>=0){
+-					ypp->SetValue(0,0,yp->GetValue(0,1));
+-					ypp->SetValue(0,1,yp->GetValue(0,0));
+-					yp->MatrixAbs(ypp);
+-				}
+-				P=sqrt(xp->GetValue(0,0)*xp->GetValue(0,0)+yp->GetValue(0,0)*yp->GetValue(0,0));
+-				if(P>dn){
+-					test=false;
+-					for(int i=0;i<l-1;i++){
+-						gl->SetValue(0,i,0);
+-					}
+-				}
+-				if(test==true){
+-					si=1;
+-					sj=1;
+-					id=0;
+-					for(int i=0;i<2;i++){
+-						si*=-1;
+-						for(int j=0;j<2;j++){
+-							si*=-1;
+-							s=si*sj;
+-							for(int k=0;k<l;k++){
+-								R=sqrt(xp->GetValue(0,i)*xp->GetValue(0,i)+yp->GetValue(0,j)*yp->GetValue(0,j)+mesh->GetValue(a,k)*mesh->GetValue(a,k));
+-								Q=atan(xp->GetValue(0,i)*yp->GetValue(0,j)/(mesh->GetValue(a,k)*R));
+-								U->SetValue(k,id,s*(mesh->GetValue(a,k)*Q-xp->GetValue(0,i)*log(R+yp->GetValue(0,j))-yp->GetValue(0,j)*log(R+xp->GetValue(0,i))));
+-							}
+-							id++;
+-						}
+-					}
+-					for(int b=0;b<l-1;b++){
+-						U->ExtractLine(U1,b);
+-						U->ExtractLine(U2,b+1);
+-						gl->SetValue(0,b,rho->GetValue(0,b)*(U1->MatrixInternSum()*(-1)+U2->MatrixInternSum()));
+-					}
+-				}
+-				g->SetValue(c,0,g->GetValue(c,0)+gg*gl->MatrixInternSum());
+-			}
+-		}
+-		delete xp;
+-		delete yp;
+-		delete xpp;
+-		delete ypp;
+-		delete gl;
+-		delete U;
+-		delete U1;
+-		delete U2;
+-	}/*}}}*/
+ void vec2gridsimple(Matrix *V,Matrix *V1,int nx, int ny){/*{{{*/
+ 	for(int i=0;i<ny;i++){
+ 		for (int j=0;j<nx;j++){
+@@ -584,8 +536,27 @@
+ 	double b=0;
+ 	double e=0;
+ 	msplit(m0,m1,m2,dlevel);
+-   plouff(g1,Pobs,Pp,m1,rho1,dx,dy,dn,mx*my,nx*ny,4);
+-   plouff(g2,Pobs,Pp,m2,rho2,dx,dy,dn,mx*my,nx*ny,3);
++	
++	/*Multithreaded core*/
++	int       num_threads = 4;
++	AppStruct usr;
++	usr.g = g1;
++	usr.Pobs = Pobs;
++	usr.Pp=Pp;
++	usr.mesh= m1;
++	usr.rho= rho1;
++	usr.dx=dx;
++	usr.dy=dy;
++	usr.dn=dn;
++	usr.m=mx*my;
++	usr.n=nx*ny;
++	usr.l=4;
++	LaunchThread(plouffT,(void*)&usr,num_threads);
++	usr.g = g2;
++	usr.mesh= m2;
++	usr.rho= rho2;
++	usr.l=3;
++	LaunchThread(plouffT,(void*)&usr,num_threads);
+ 	g->MatrixSum(g1,g2);
+ 	vec2gridsimple(g,gcalgr,nx,ny);
+ 	reshape(gcalgr,gcalvec,mx,my);
+@@ -695,3 +666,129 @@
+ 	double T1=T0*exp(-c*pow(k,1/D));
+ 	return T1;
+ }/*}}}*/
++void* plouffT(void* vpthread_handle){/*{{{*/
++
++	/*recover this thread info*/
++	pthread_handle *handle = (pthread_handle*)vpthread_handle;
++	int my_thread   = handle->my_thread;
++	int num_threads = handle->num_threads;
++
++	/*Recover struct*/
++	AppStruct *usr = (AppStruct*)handle->usr;
++	Matrix *g = usr->g;
++	Matrix *Pobs = usr->Pobs;
++	Matrix *Pp = usr->Pp;
++	Matrix *mesh = usr->mesh;
++	Matrix *rho = usr->rho;
++	int dx =usr->dx;
++	int dy =usr->dy;
++	int dn =usr->dn;
++	int m =usr->m;
++	int n =usr->n;
++	int l =usr->l;
++
++	double gg=6.673e-11;
++	int si,sj,id,s;
++	double R,Q,P;
++	Matrix *xp= new Matrix(1,2);
++	Matrix *yp= new Matrix(1,2);
++	Matrix *xpp= new Matrix(1,2);
++	Matrix *ypp= new Matrix(1,2);
++	Matrix *U= new Matrix(l,4);
++	Matrix *U1=new Matrix(1,4);
++	Matrix *U2=new Matrix(1,4);
++	Matrix *gl= new Matrix(1,l-1);
++	bool test=true;
++	for(int c=my_thread;c<n;c+=num_threads){
++		g->SetValue(c,0,0);
++		for(int a=0;a<m;a++){
++			test=true;
++			xp->SetValue(0,0,Pp->GetValue(a,0)-Pobs->GetValue(c,0));
++			xp->SetValue(0,1,Pp->GetValue(a,0)-Pobs->GetValue(c,0)+dx);
++			if(xp->GetValue(0,0)<0 && xp->GetValue(0,0)<xp->GetValue(0,1) && xp->GetValue(0,0)*xp->GetValue(0,1)>=0){
++				xpp->SetValue(0,0,xp->GetValue(0,1));
++				xpp->SetValue(0,1,xp->GetValue(0,0));
++				xp->MatrixAbs(xpp);
++			}
++			yp->SetValue(0,0,Pp->GetValue(a,1)-Pobs->GetValue(c,1));
++			yp->SetValue(0,1,Pp->GetValue(a,1)-Pobs->GetValue(c,1)+dy);
++			if(yp->GetValue(0,0)<0 && yp->GetValue(0,0)<yp->GetValue(0,1) && yp->GetValue(0,0)*yp->GetValue(0,1)>=0){
++				ypp->SetValue(0,0,yp->GetValue(0,1));
++				ypp->SetValue(0,1,yp->GetValue(0,0));
++				yp->MatrixAbs(ypp);
++			}
++			P=sqrt(xp->GetValue(0,0)*xp->GetValue(0,0)+yp->GetValue(0,0)*yp->GetValue(0,0));
++			if(P>dn){
++				test=false;
++				for(int i=0;i<l-1;i++){
++					gl->SetValue(0,i,0);
++				}
++			}
++			if(test==true){
++				si=1;
++				sj=1;
++				id=0;
++				for(int i=0;i<2;i++){
++					si*=-1;
++					for(int j=0;j<2;j++){
++						si*=-1;
++						s=si*sj;
++						for(int k=0;k<l;k++){
++							R=sqrt(xp->GetValue(0,i)*xp->GetValue(0,i)+yp->GetValue(0,j)*yp->GetValue(0,j)+mesh->GetValue(a,k)*mesh->GetValue(a,k));
++							Q=atan(xp->GetValue(0,i)*yp->GetValue(0,j)/(mesh->GetValue(a,k)*R));
++							U->SetValue(k,id,s*(mesh->GetValue(a,k)*Q-xp->GetValue(0,i)*log(R+yp->GetValue(0,j))-yp->GetValue(0,j)*log(R+xp->GetValue(0,i))));
++						}
++						id++;
++					}
++				}
++				for(int b=0;b<l-1;b++){
++					U->ExtractLine(U1,b);
++					U->ExtractLine(U2,b+1);
++					gl->SetValue(0,b,rho->GetValue(0,b)*(U1->MatrixInternSum()*(-1)+U2->MatrixInternSum()));
++				}
++			}
++			g->SetValue(c,0,g->GetValue(c,0)+gg*gl->MatrixInternSum());
++		}
++	}
++	delete xp;
++	delete yp;
++	delete xpp;
++	delete ypp;
++	delete gl;
++	delete U;
++	delete U1;
++	delete U2;
++
++	return NULL;
++}/*}}}*/
++void LaunchThread(void* function(void*), void* usr,int num_threads){/*{{{*/
++
++	int i;
++	int            *status  = NULL;
++	pthread_t      *threads = NULL;
++	pthread_handle *handles = NULL;
++
++	/*dynamically allocate: */
++	threads=(pthread_t*)malloc(num_threads*sizeof(pthread_t));
++	handles=(pthread_handle*)malloc(num_threads*sizeof(pthread_handle));
++
++	for(i=0;i<num_threads;i++){
++		handles[i].usr=usr;
++		handles[i].my_thread  =i;
++		handles[i].num_threads=num_threads;
++	}
++	for(i=0;i<num_threads;i++){
++		if(pthread_create(threads+i,NULL,function,(void*)(handles+i))){
++			std::cerr<<"pthread_create error";
++		}
++	}
++	for(i=0;i<num_threads;i++){
++		if(pthread_join(threads[i],(void**)&status)){
++			std::cerr<<"pthread_join error";
++		}
++	}
++
++	/*Free ressources:*/
++	delete threads;
++	delete handles;
++}/*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18457-18458.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18457-18458.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18457-18458.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/packagers/macosx/package.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/package.sh	(revision 18457)
++++ ../trunk-jpl/packagers/macosx/package.sh	(revision 18458)
+@@ -31,8 +31,5 @@
+ tar -czf $tarball_name ./bin ./lib ./test ./examples
+ ls -lah $tarball_name
+ 
+-echo "Shipping to website"
+-scp $tarball_name websites:/home/larour/files/$tarball_name
+-
+ echo "Shipping binaries to website"
+ scp $tarball_name websites:/home/larour/files/$tarball_name
Index: /issm/oecreview/Archive/18296-19100/ISSM-18458-18459.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18458-18459.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18458-18459.diff	(revision 19102)
@@ -0,0 +1,26 @@
+Index: ../trunk-jpl/test/NightlyRun/test211.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test211.py	(revision 18458)
++++ ../trunk-jpl/test/NightlyRun/test211.py	(revision 18459)
+@@ -28,7 +28,7 @@
+ field_tolerances=[\
+ 	2e-08,2e-08,1e-06,2e-08,1e-08,1e-08,1e-08,1e-08,1e-08,1e-08,\
+ 	5e-07,5e-07,5e-05,1e-07,1e-08,1e-08,1e-08,1e-08,5e-08,2e-06,\
+-	5e-06,5e-06,5e-05,5e-06,1e-07,5e-07,5e-07,5e-07,1e-06,5e-05]
++	5e-06,5e-06,5e-05,5e-06,1e-07,5e-07,5e-07,5e-07,5e-06,5e-05]
+ field_values=[\
+ 	md.results.TransientSolution[0].Vx,\
+ 	md.results.TransientSolution[0].Vy,\
+Index: ../trunk-jpl/test/NightlyRun/test211.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test211.m	(revision 18458)
++++ ../trunk-jpl/test/NightlyRun/test211.m	(revision 18459)
+@@ -15,7 +15,7 @@
+ field_tolerances={...
+ 	2e-08,2e-08,1e-06,2e-08,1e-08,1e-08,1e-08,1e-08,1e-08,1e-08,...
+ 	5e-07,5e-07,5e-05,1e-07,1e-08,1e-08,1e-08,1e-08,5e-08,2e-06,...
+-	5e-06,5e-06,5e-05,5e-06,5e-07,5e-07,5e-07,1e-07,1e-06,5e-05};
++	5e-06,5e-06,5e-05,5e-06,5e-07,5e-07,5e-07,5e-07,5e-06,5e-05};
+ field_values={...
+ 	(md.results.TransientSolution(1).Vx),...
+ 	(md.results.TransientSolution(1).Vy),...
Index: /issm/oecreview/Archive/18296-19100/ISSM-18459-18460.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18459-18460.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18459-18460.diff	(revision 19102)
@@ -0,0 +1,498 @@
+Index: ../trunk-jpl/src/m/coordsystems/ll2utm.m
+===================================================================
+--- ../trunk-jpl/src/m/coordsystems/ll2utm.m	(revision 0)
++++ ../trunk-jpl/src/m/coordsystems/ll2utm.m	(revision 18460)
+@@ -0,0 +1,200 @@
++function [x,y,f]=ll2utm(lat,lon,datum)
++%LL2UTM Lat/Lon to UTM coordinates precise conversion.
++%   [X,Y]=LL2UTM2(LAT,LON) or LL2UTM([LAT,LON]) converts coordinates 
++%	LAT,LON (in degrees) to UTM X and Y (in meters). Default datum is WGS84.
++%
++%	LAT and LON can be scalars, vectors or matrix. Outputs X and Y will
++%	have the same size as inputs.
++%
++%	LL2UTM(LAT,LON,DATUM) uses specific DATUM for conversion. DATUM can be
++%	a string in the following list:
++%		'wgs84': World Geodetic System 1984 (default)
++%		'nad27': North American Datum 1927
++%		'clk66': Clarke 1866
++%		'nad83': North American Datum 1983
++%		'grs80': Geodetic Reference System 1980
++%		'int24': International 1924 / Hayford 1909
++%	or DATUM can be a 2-element vector [A,F] where A is semimajor axis (in
++%	meters)	and F is flattening of the user-defined ellipsoid.
++%
++%	[X,Y,ZONE]=LL2UTM(...) returns also computed UTM ZONE (negative value 
++%	stands for southern hemisphere points).
++%
++%
++%	XY = LL2UTM(...) or without any output argument returns a 2-column 
++%	matrix [X,Y].
++%
++%	Notice:
++%		- LL2UTM does not perform cross-datum conversion.
++%		- precision is near a millimeter.
++%
++%
++%	Reference:
++%		I.G.N., Projection cartographique Mercator Transverse: Algorithmes,
++%		   Notes Techniques NT/G 76, janvier 1995.
++%
++%   Author: Francois Beauducel, <beauducel@ipgp.fr>
++%   Created: 2003-12-02
++%   Updated: 2014-04-20
++
++
++%	Copyright (c) 2001-2014, François Beauducel, covered by BSD License.
++%	All rights reserved.
++%
++%	Redistribution and use in source and binary forms, with or without 
++%	modification, are permitted provided that the following conditions are 
++%	met:
++%
++%	   * Redistributions of source code must retain the above copyright 
++%	     notice, this list of conditions and the following disclaimer.
++%	   * Redistributions in binary form must reproduce the above copyright 
++%	     notice, this list of conditions and the following disclaimer in 
++%	     the documentation and/or other materials provided with the distribution
++%	                           
++%	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
++%	AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
++%	IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
++%	ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
++%	LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
++%	CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
++%	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
++%	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
++%	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
++%	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
++%	POSSIBILITY OF SUCH DAMAGE.
++
++% Available datums
++datums = [ ...
++	{ 'wgs84', 6378137.0, 298.257223563 };
++	{ 'nad83', 6378137.0, 298.257222101 };
++	{ 'grs80', 6378137.0, 298.257222101 };
++	{ 'nad27', 6378206.4, 294.978698214 };
++	{ 'int24', 6378388.0, 297.000000000 };
++	{ 'clk66', 6378206.4, 294.978698214 };
++];
++
++if nargin == 1
++	if size(lat,2) ~= 2
++		error('Single input argument must be a 2-column matrix [LAT,LON].')
++	end
++	lon = lat(:,2);
++	lat = lat(:,1);
++end
++	
++if nargin < 1
++	error('Not enough input arguments.')
++end
++
++if all([numel(lat),numel(lon)] > 1) && any(size(lat) ~= size(lon))
++	error('LAT and LON must be the same size or scalars.')
++end
++
++if nargin < 3
++	datum = 'wgs84';
++end
++
++if ischar(datum)
++	if ~any(strcmpi(datum,datums(:,1)))
++		error('Unkown DATUM name "%s"',datum);
++	end
++	k = find(strcmpi(datum,datums(:,1)));
++	A1 = datums{k,2};
++	F1 = datums{k,3};	
++else
++	if numel(datum) ~= 2
++		error('User defined DATUM must be a vector [A,F].');
++	end
++	A1 = datum(1);
++	F1 = datum(2);
++end
++
++% constants
++D0 = 180/pi;	% conversion rad to deg
++
++K0 = 0.9996;	% UTM scale factor
++X0 = 500000;	% UTM false East (m)
++
++B1 = A1*(1 - 1/F1);
++E1 = sqrt((A1*A1 - B1*B1)/(A1*A1));
++
++p1 = lat/D0;					% Phi = Latitude (rad)
++l1 = lon/D0;					% Lambda = Longitude (rad)
++F0 = round((l1*D0 + 183)/6);	% UTM zone
++P0 = 0/D0;
++L0 = (6*F0 - 183)/D0;			% UTM origin longitude (rad)
++Y0 = 1e7*(p1 < 0);				% UTM false northern (m)
++N = K0*A1;
++
++C = coef(E1,0);
++B = C(1)*P0 + C(2)*sin(2*P0) + C(3)*sin(4*P0) + C(4)*sin(6*P0) + C(5)*sin(8*P0);
++YS = Y0 - N*B;
++
++C = coef(E1,2);
++L = log(tan(pi/4 + p1/2).*(((1 - E1*sin(p1))./(1 + E1*sin(p1))).^(E1/2)));
++z = complex(atan(sinh(L)./cos(l1 - L0)),log(tan(pi/4 + asin(sin(l1 - L0)./cosh(L))/2)));
++Z = N.*C(1).*z + N.*(C(2)*sin(2*z) + C(3)*sin(4*z) + C(4)*sin(6*z) + C(5)*sin(8*z));
++xs = imag(Z) + X0;
++ys = real(Z) + YS;
++
++% outputs zone if needed: scalar value if unique, or vector/matrix of the
++% same size as x/y in case of crossed zones
++if nargout > 2
++	fu = unique(F0.*sign(lat));
++	if isscalar(fu)
++		f = fu;
++	else
++		f = F0;
++	end
++end
++
++if nargout < 2
++	x = [xs(:),ys(:)];
++else
++	x = xs;
++	y = ys;
++end
++
++
++
++%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
++function c = coef(e,m)
++%COEF Projection coefficients
++%	COEF(E,M) returns a vector of 5 coefficients from:
++%		E = first ellipsoid excentricity
++%		M = 0 for transverse mercator
++%		M = 1 for transverse mercator reverse coefficients
++%		M = 2 for merdian arc
++
++
++if nargin < 2
++	m = 0;
++end
++
++switch m
++	case 0
++	c0 = [-175/16384, 0,   -5/256, 0,  -3/64, 0, -1/4, 0, 1;
++           -105/4096, 0, -45/1024, 0,  -3/32, 0, -3/8, 0, 0;
++           525/16384, 0,  45/1024, 0, 15/256, 0,    0, 0, 0;
++          -175/12288, 0, -35/3072, 0,      0, 0,    0, 0, 0;
++          315/131072, 0,        0, 0,      0, 0,    0, 0, 0];
++	  
++	case 1
++	c0 = [-175/16384, 0,   -5/256, 0,  -3/64, 0, -1/4, 0, 1;
++             1/61440, 0,   7/2048, 0,   1/48, 0,  1/8, 0, 0;
++          559/368640, 0,   3/1280, 0,  1/768, 0,    0, 0, 0;
++          283/430080, 0, 17/30720, 0,      0, 0,    0, 0, 0;
++       4397/41287680, 0,        0, 0,      0, 0,    0, 0, 0];
++
++	case 2
++	c0 = [-175/16384, 0,   -5/256, 0,  -3/64, 0, -1/4, 0, 1;
++         -901/184320, 0,  -9/1024, 0,  -1/96, 0,  1/8, 0, 0;
++         -311/737280, 0,  17/5120, 0, 13/768, 0,    0, 0, 0;
++          899/430080, 0, 61/15360, 0,      0, 0,    0, 0, 0;
++      49561/41287680, 0,        0, 0,      0, 0,    0, 0, 0];
++   
++end
++c = zeros(size(c0,1),1);
++
++for i = 1:size(c0,1)
++    c(i) = polyval(c0(i,:),e);
++end
+\ No newline at end of file
+Index: ../trunk-jpl/src/m/coordsystems/utm2ll.m
+===================================================================
+--- ../trunk-jpl/src/m/coordsystems/utm2ll.m	(revision 18459)
++++ ../trunk-jpl/src/m/coordsystems/utm2ll.m	(revision 18460)
+@@ -1,117 +1,190 @@
+-function  [Lat,Lon] = utm2ll(xx,yy,utmzone)
+-% -------------------------------------------------------------------------
+-% [Lat,Lon] = utm2ll(x,y,utmzone)
++function [lat,lon]=utm2ll(x,y,f,datum,varargin)
++%UTM2LL UTM to Lat/Lon coordinates precise conversion.
++%   [LAT,LON]=UTM2LL(X,Y,ZONE) converts UTM coordinates X,Y (in meters)
++%	defined in the UTM ZONE (integer) to latitude LAT and longitude LON 
++%	(in degrees). Default datum is WGS84.
+ %
+-% Description: Function to convert vectors of UTM coordinates into Lat/Lon vectors (WGS84).
+-% Some code has been extracted from UTMIP.m function by Gabriel Ruiz Martinez.
++%	X and Y can be scalars, vectors or matrix. Outputs LAT and LON will
++%	have the same size as inputs.
+ %
+-% Inputs:on)
+-%    -3.485713    7.801235 -119.955246  -17.759537  -94.799019  121.640266
++%	For southern hemisphere points, use negative zone -ZONE.
+ %
+-% Example 2: If you need Lat/Lon coordinates in Degrees, Minutes and Seconds
+-% [Lat, Lon]=utm2ll(x,y,utmzone);
+-% LatDMS=dms2mat(deg2dms(Lat))
+-%LatDMS =
+-%    40.00         18.00         55.55
+-%    46.00         17.00          2.01
+-%    37.00         34.00         40.17
+-%    28.00         38.00         44.33
+-%    38.00         51.00         19.96
+-%    25.00          3.00         42.41
+-% LonDMS=dms2mat(deg2dms(Lon))
+-%LonDMS =
+-%    -3.00         29.00          8.61
+-%     7.00         48.00          4.40
+-%  -119.00         57.00         18.93
+-%   -17.00         45.00         34.33
+-%   -94.00         47.00         56.47
+-%   121.00         38.00         24.96
++%	UTM2LL(X,Y,ZONE,DATUM) uses specific DATUM for conversion. DATUM can be
++%	a string in the following list:
++%		'wgs84': World Geodetic System 1984 (default)
++%		'nad27': North American Datum 1927
++%		'clk66': Clarke 1866
++%		'nad83': North American Datum 1983
++%		'grs80': Geodetic Reference System 1980
++%		'int24': International 1924 / Hayford 1909
++%	or DATUM can be a 2-element vector [A,F] where A is semimajor axis (in
++%	meters)	and F is flattening of the user-defined ellipsoid.
+ %
+-% Author:
+-%   Rafael Palacios
+-%   Universidad Pontificia Comillas
+-%   Madrid, Spain
+-% Version: Apr/06, Jun/06, Aug/06
+-% Aug/06: corrected m-Lint warnings
+-%-------------------------------------------------------------------------
++%	Notice:
++%		- UTM2LL does not perform cross-datum conversion.
++%		- precision is near a millimeter.
++%
++%
++%	Reference:
++%		I.G.N., Projection cartographique Mercator Transverse: Algorithmes,
++%		   Notes Techniques NT/G 76, janvier 1995.
++%
++%   Author: Francois Beauducel, <beauducel@ipgp.fr>
++%   Created: 2001-08-23
++%   Updated: 2014-04-20
+ 
+-% Argument checking
++%	Copyright (c) 2001-2014, François Beauducel, covered by BSD License.
++%	All rights reserved.
+ %
+-error(nargchk(3, 3, nargin)); %3 arguments required
+-n1=length(xx);
+-n2=length(yy);
+-n3=size(utmzone,1);
+-if (n1~=n2 || n1~=n3)
+-	error('x,y and utmzone vectors should have the same number or rows');
++%	Redistribution and use in source and binary forms, with or without 
++%	modification, are permitted provided that the following conditions are 
++%	met:
++%
++%	   * Redistributions of source code must retain the above copyright 
++%	     notice, this list of conditions and the following disclaimer.
++%	   * Redistributions in binary form must reproduce the above copyright 
++%	     notice, this list of conditions and the following disclaimer in 
++%	     the documentation and/or other materials provided with the distribution
++%	                           
++%	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
++%	AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
++%	IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
++%	ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
++%	LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
++%	CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
++%	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
++%	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
++%	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
++%	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
++%	POSSIBILITY OF SUCH DAMAGE.
++
++% Available datums
++datums = [ ...
++	{ 'wgs84', 6378137.0, 298.257223563 };
++	{ 'nad83', 6378137.0, 298.257222101 };
++	{ 'grs80', 6378137.0, 298.257222101 };
++	{ 'nad27', 6378206.4, 294.978698214 };
++	{ 'int24', 6378388.0, 297.000000000 };
++	{ 'clk66', 6378206.4, 294.978698214 };
++];
++
++if nargin < 3
++	error('Not enough input arguments.')
+ end
+-c=size(utmzone,2);
+-if (c~=4)
+-	error('utmzone should be a vector of strings like "30 T"');
++
++if all([numel(x),numel(y)] > 1) && any(size(x) ~= size(y))
++	error('X and Y must be the same size or scalars.')
+ end
+ 
+-% Memory pre-allocation
+-%
+-Lat=zeros(n1,1);
+-Lon=zeros(n1,1);
++if ~isnumeric(f) || ~isscalar(f) || f ~= round(f)
++	error('ZONE must be a scalar integer.')
++end
+ 
+-% Main Loop
+-%
+-for i=1:n1
+-	if (utmzone(i,4)>'X' || utmzone(i,4)<'C')
+-		fprintf('utm2ll: Warning utmzone should be a vector of strings like "30 T", not "30 t"\n');
++if nargin < 4
++	datum = 'wgs84';
++end
++
++if ischar(datum)
++	if ~any(strcmpi(datum,datums(:,1)))
++		error('Unkown DATUM name "%s"',datum);
+ 	end
+-	if (utmzone(i,4)>'M')
+-		hemis='N';   % Northern hemisphere
+-	else
+-		hemis='S';
++	k = find(strcmpi(datum,datums(:,1)));
++	A1 = datums{k,2};
++	F1 = datums{k,3};	
++else
++	if numel(datum) ~= 2
++		error('User defined DATUM must be a vector [A,F].');
+ 	end
++	A1 = datum(1);
++	F1 = datum(2);
++end
+ 
+-	x=xx(i);
+-	y=yy(i);
+-	zone=str2double(utmzone(i,1:2));
++% constants
++D0 = 180/pi;	% conversion rad to deg
++maxiter = 100;	% maximum iteration for latitude computation
++eps = 1e-11;	% minimum residue for latitude computation
+ 
+-	sa = 6378137.000000 ; sb = 6356752.314245;
++K0 = 0.9996;								% UTM scale factor
++X0 = 500000;								% UTM false East (m)
++Y0 = 1e7*(f < 0);							% UTM false North (m)
++P0 = 0;										% UTM origin latitude (rad)
++L0 = (6*abs(f) - 183)/D0;					% UTM origin longitude (rad)
++E1 = sqrt((A1^2 - (A1*(1 - 1/F1))^2)/A1^2);	% ellpsoid excentricity
++N = K0*A1;
+ 
+-	%   e = ( ( ( sa ^ 2 ) - ( sb ^ 2 ) ) ^ 0.5 ) / sa;
+-	e2 = ( ( ( sa ^ 2 ) - ( sb ^ 2 ) ) ^ 0.5 ) / sb;
+-	e2cuadrada = e2 ^ 2;
+-	c = ( sa ^ 2 ) / sb;
+-	%   alpha = ( sa - sb ) / sa;             %f
+-	%   ablandamiento = 1 / alpha;   % 1/f
++% computing parameters for Mercator Transverse projection
++C = coef(E1,0);
++YS = Y0 - N*(C(1)*P0 + C(2)*sin(2*P0) + C(3)*sin(4*P0) + C(4)*sin(6*P0) + C(5)*sin(8*P0));
+ 
+-	X = x - 500000;
++C = coef(E1,1);
++zt = complex((y - YS)/N/C(1),(x - X0)/N/C(1));
++z = zt - C(2)*sin(2*zt) - C(3)*sin(4*zt) - C(4)*sin(6*zt) - C(5)*sin(8*zt);
++L = real(z);
++LS = imag(z);
+ 
+-	if hemis == 'S' || hemis == 's'
+-		Y = y - 10000000;
+-	else
+-		Y = y;
+-	end
++l = L0 + atan(sinh(LS)./cos(L));
++p = asin(sin(L)./cosh(LS));
+ 
+-	S = ( ( zone * 6 ) - 183 );
+-	lat =  Y / ( 6366197.724 * 0.9996 );
+-	v = ( c / ( ( 1 + ( e2cuadrada * ( cos(lat) ) ^ 2 ) ) ) ^ 0.5 ) * 0.9996;
+-	a = X / v;
+-	a1 = sin( 2 * lat );
+-	a2 = a1 * ( cos(lat) ) ^ 2;
+-	j2 = lat + ( a1 / 2 );
+-	j4 = ( ( 3 * j2 ) + a2 ) / 4;
+-	j6 = ( ( 5 * j4 ) + ( a2 * ( cos(lat) ) ^ 2) ) / 3;
+-	alfa = ( 3 / 4 ) * e2cuadrada;
+-	beta = ( 5 / 3 ) * alfa ^ 2;
+-	gama = ( 35 / 27 ) * alfa ^ 3;
+-	Bm = 0.9996 * c * ( lat - alfa * j2 + beta * j4 - gama * j6 );
+-	b = ( Y - Bm ) / v;
+-	Epsi = ( ( e2cuadrada * a^ 2 ) / 2 ) * ( cos(lat) )^ 2;
+-	Eps = a * ( 1 - ( Epsi / 3 ) );
+-	nab = ( b * ( 1 - Epsi ) ) + lat;
+-	senoheps = ( exp(Eps) - exp(-Eps) ) / 2;
+-	Delt = atan(senoheps / (cos(nab) ) );
+-	TaO = atan(cos(Delt) * tan(nab));
+-	longitude = (Delt *(180 / pi ) ) + S;
+-	latitude = ( lat + ( 1 + e2cuadrada* (cos(lat)^ 2) - ( 3 / 2 ) * e2cuadrada * sin(lat) * cos(lat) * ( TaO - lat ) ) * ( TaO - lat ) ) * ...
+-		(180 / pi);
++L = log(tan(pi/4 + p/2));
+ 
+-	Lat(i)=latitude;
+-	Lon(i)=longitude;
++% calculates latitude from the isometric latitude
++p = 2*atan(exp(L)) - pi/2;
++p0 = NaN;
++n = 0;
++while any(isnan(p0) | abs(p - p0) > eps) & n < maxiter
++	p0 = p;
++	es = E1*sin(p0);
++	p = 2*atan(((1 + es)./(1 - es)).^(E1/2).*exp(L)) - pi/2;
++	n = n + 1;
++end
+ 
++if nargout < 2
++	lat = D0*[p(:),l(:)];
++else
++	lat = p*D0;
++	lon = l*D0;
+ end
++
++
++%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
++function c = coef(e,m)
++%COEF Projection coefficients
++%	COEF(E,M) returns a vector of 5 coefficients from:
++%		E = first ellipsoid excentricity
++%		M = 0 for transverse mercator
++%		M = 1 for transverse mercator reverse coefficients
++%		M = 2 for merdian arc
++
++
++if nargin < 2
++	m = 0;
++end
++
++switch m
++	case 0
++	c0 = [-175/16384, 0,   -5/256, 0,  -3/64, 0, -1/4, 0, 1;
++           -105/4096, 0, -45/1024, 0,  -3/32, 0, -3/8, 0, 0;
++           525/16384, 0,  45/1024, 0, 15/256, 0,    0, 0, 0;
++          -175/12288, 0, -35/3072, 0,      0, 0,    0, 0, 0;
++          315/131072, 0,        0, 0,      0, 0,    0, 0, 0];
++	  
++	case 1
++	c0 = [-175/16384, 0,   -5/256, 0,  -3/64, 0, -1/4, 0, 1;
++             1/61440, 0,   7/2048, 0,   1/48, 0,  1/8, 0, 0;
++          559/368640, 0,   3/1280, 0,  1/768, 0,    0, 0, 0;
++          283/430080, 0, 17/30720, 0,      0, 0,    0, 0, 0;
++       4397/41287680, 0,        0, 0,      0, 0,    0, 0, 0];
++
++	case 2
++	c0 = [-175/16384, 0,   -5/256, 0,  -3/64, 0, -1/4, 0, 1;
++         -901/184320, 0,  -9/1024, 0,  -1/96, 0,  1/8, 0, 0;
++         -311/737280, 0,  17/5120, 0, 13/768, 0,    0, 0, 0;
++          899/430080, 0, 61/15360, 0,      0, 0,    0, 0, 0;
++      49561/41287680, 0,        0, 0,      0, 0,    0, 0, 0];
++   
++end
++c = zeros(size(c0,1),1);
++
++for i = 1:size(c0,1)
++    c(i) = polyval(c0(i,:),e);
++end
+\ No newline at end of file
Index: /issm/oecreview/Archive/18296-19100/ISSM-18460-18461.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18460-18461.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18460-18461.diff	(revision 19102)
@@ -0,0 +1,55 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp	(revision 18460)
++++ ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp	(revision 18461)
+@@ -426,6 +426,22 @@
+ 	}
+ 	savefile1.close();
+ 	savefile2.close();
++
++	delete m_old;
++	delete m_min;
++	delete m_new;
++	delete Pobs;
++	delete Pp;
++	delete Rho;
++	delete rho1;
++	delete rho2;
++	delete xobs;
++	delete yobs;
++	delete mesh_ini;
++	delete bathy;
++	delete icethick;
++	delete evalid;
++
+ 			/*}}}*/
+ 	return 0;
+ }/*}}}*/
+@@ -538,7 +554,7 @@
+ 	msplit(m0,m1,m2,dlevel);
+ 	
+ 	/*Multithreaded core*/
+-	int       num_threads = 4;
++	int       num_threads = 8;
+ 	AppStruct usr;
+ 	usr.g = g1;
+ 	usr.Pobs = Pobs;
+@@ -580,6 +596,18 @@
+ 		b=b+fabs(evalid->GetValue(i,0)*(gobs->GetValue(i,0)+g->GetValue(i,0)));
+ 	}
+ 	e=2*a/(a+b);
++
++	delete m1;
++	delete m2;
++	delete g1;
++	delete g2;
++	delete g;
++	delete gcalgr;
++	delete gcalvec;
++	delete df;
++	delete G;
++	delete M;
++
+ 	return e;
+ }/*}}}*/
+ void newmodelgen(Matrix* m0,Matrix* m1,Matrix* bathy,Matrix* icethick,int mx,int my,double T,double ptval,double mmax,double mmax2,double ctr,double sd){/*{{{*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18461-18462.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18461-18462.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18461-18462.diff	(revision 19102)
@@ -0,0 +1,752 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 0)
++++ ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 18462)
+@@ -0,0 +1,747 @@
++#include <iostream>
++#include <cmath>
++#include <fstream>
++#include <string>
++#include <cstdio>
++#include <cstdlib>
++#include <time.h>
++#include <cassert>
++#include <gsl/gsl_multifit.h>
++#include "mpi.h"
++using namespace std;
++
++class Matrix{/*{{{*/
++	private:
++		int     M;        /*Number of lines   */
++		int     N;        /*Number if Columns */
++		double *values;
++	public:
++		Matrix(int m_in,int n_in){/*{{{*/
++			this->M = m_in;
++			this->N = n_in;
++			this->values = new double[M*N]();
++		}/*}}}*/
++		~Matrix(){/*{{{*/
++			delete [] this->values;
++		}/*}}}*/
++		void Echo(void){/*{{{*/
++			for(int i=0;i<M;i++){
++				for(int j=0;j<N;j++){
++					cout << " " << this->values[i*N+j];
++				}
++				cout << endl;
++			}
++		}/*}}}*/
++		void SetValue(int i,int j,double value){/*{{{*/
++			this->values[i*N+j] = value;
++		}/*}}}*/
++		double GetValue(int i,int j){/*{{{*/
++			return this->values[i*N+j];
++		}/*}}}*/
++		void GetSize(int* pM,int* pN){/*{{{*/
++			*pM = this->M;
++			*pN = this->N;
++		}/*}}}*/
++		double* GetPointer(void){/*{{{*/
++			return this->values;
++		}/*}}}*/
++		void MatrixSum(Matrix* A,Matrix* B){/*{{{*/
++			/*Check that sizes are compatible*/
++			int M_B,N_B,M_A,N_A;
++			B->GetSize(&M_B,&N_B);
++			A->GetSize(&M_A,&N_A);
++			assert(this->M==M_B && this->N==N_B);
++			assert(this->M==M_A && this->N==N_A);
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,A->GetValue(i,j) + B->GetValue(i,j));
++				}
++			}
++		}/*}}}*/
++		void MatrixDiff(Matrix* A,Matrix* B){/*{{{*/
++			/*Check that sizes are compatible*/
++			int M_B,N_B,M_A,N_A;
++			B->GetSize(&M_B,&N_B);
++			A->GetSize(&M_A,&N_A);
++			assert(this->M==M_B && this->N==N_B);
++			assert(this->M==M_A && this->N==N_A);
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,A->GetValue(i,j) - B->GetValue(i,j));
++				}
++			}
++		}/*}}}*/
++		void MatrixAbs(Matrix* A){/*{{{*/
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,fabs(A->GetValue(i,j)));
++				}
++			}
++		}/*}}}*/
++		void MatrixEqual(Matrix* A){/*{{{*/
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,A->GetValue(i,j));
++				}
++			}
++		}/*}}}*/
++		double MatrixInternSum(){/*{{{*/
++			double sum=0;
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					sum+=this->GetValue(i,j);
++				}
++			}
++			return sum;
++		}/*}}}*/
++		void ExtractLine(Matrix* A,int i){/*{{{*/
++			/* Check that the size of A is compatible */
++			int M_A,N_A;
++			A->GetSize(&M_A,&N_A);
++			assert(M_A==1 && this->N==N_A);
++			for(int j=0;j<this->N;j++){
++				A->SetValue(0,j,this->GetValue(i,j));
++			}
++		}/*}}}*/
++		void ExtractColumn(Matrix* A,int j){/*{{{*/
++			/* Check that the size of A is compatible */
++			int M_A,N_A;
++			A->GetSize(&M_A,&N_A);
++			assert(N_A==1 && this->M==M_A);
++			for(int i=0;i<this->M;i++){
++				A->SetValue(i,0,this->GetValue(i,j));
++			}
++		}/*}}}*/
++		void AddNumber(double a){/*{{{*/
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,this->GetValue(i,j) + a);
++				}
++			}
++		}/*}}}*/
++};/*}}}*/
++
++/*Local prototypes{{{*/
++void makep(Matrix *Pobs,int nx,int ny, int dx, int dy);
++void vec2grid(Matrix *V,Matrix *V1,Matrix *V2,int nx, int ny);
++void msplit( Matrix *m, Matrix *m1,Matrix *m2,double dlevel);
++void plouff(Matrix *g,Matrix *Pobs,Matrix *Pp,Matrix * mesh,Matrix *rho,int dx,int dy, int dn,int m,int n,int l,int my_rank,int num_procs);
++void vec2gridsimple(Matrix *V,Matrix *V1,int nx, int ny);
++void reshape(Matrix* V,Matrix* V1,int nx,int ny);
++double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,int dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my,int my_rank,int num_procs);
++void GSLsquarefit(Matrix** pX,Matrix* A,Matrix* B);
++double signe(double a);
++void filtergrav(Matrix* A,Matrix* Ain,double ctr,double sd,int mx,int my);
++void newmodelgen(Matrix* m0,Matrix* m1,Matrix* bathy,Matrix* icethick,int mx,int my,double T,double ptval,double mmax,double mmax2,double ctr,double sd);
++double coolshed(double T0,int k,double c,double D);
++/*}}}*/
++
++int main(int argc,char *argv[]){/*{{{*/
++	
++	int my_rank,num_procs;
++
++	MPI_Init(&argc, &argv);
++
++	MPI_Comm_size(MPI_COMM_WORLD,&num_procs);
++	MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
++
++	/* Seed the random number generator {{{*/
++	srand (time(NULL));               /*}}}*/
++	/* Define the variables {{{*/
++
++	int    dx     = 500;   /* prism dimension in x-direction                           */
++	int    dy     = 500;   /* prism dimension in y-direction                           */
++	int    mx     = 39;    /* number of prisms in x-direction                          */
++	int    my     = 60;    /* number of prisms in y-direction                          */
++	int    nx     = 39;    /* number of data points in x-direction                     */
++	int    ny     = 60;    /* number of data points in y-direction                     */
++	int    dn     = 15000; /* distance for neighbouting prisms for gravity calculation */
++	double ptval  = 100.;  /* max. amount to perturb model                             */
++	double ptval2 = 100.;
++
++	Matrix *Pobs=new Matrix(nx*ny,2); /* data positions */
++	makep(Pobs,nx,ny,dx,dy);
++	// Pobs->Echo();
++
++
++	Matrix *Pp=new Matrix(mx*my,2); /* data positions */
++	makep(Pp,mx,my,dx,dy);
++	// Pp->Echo();
++
++	double  rhoi = 890;           /* ice density     */
++	double  rhow = 1030;          /* water density   */
++	// double  rhos = 2013;		      /* sediment density */
++	double  rhoc = 2670;          /* bedrock density */
++
++	Matrix *Rho  = new Matrix(1,2);
++	Rho->SetValue(0,0,rhoi);
++	Rho->SetValue(0,1,rhow);
++	Matrix *rho1  = new Matrix(1,3);
++	rho1->SetValue(0,0,rhoi);
++	rho1->SetValue(0,1,rhow);
++	rho1->SetValue(0,2,rhoc);
++	Matrix *rho2  = new Matrix(1,2);
++	rho2->SetValue(0,0,rhoi-rhoc);
++	rho2->SetValue(0,1,rhow-rhoc);
++
++	double ctr=1;            /* parameter for filtering */
++	double sd=0.1;
++
++	Matrix *xobs= new Matrix(ny,nx);
++	Matrix *yobs= new Matrix(ny,nx);
++
++	vec2grid(Pobs,xobs,yobs,nx,ny);
++	//	xobs->Echo();
++	//	yobs->Echo();
++
++	double dlevel= 860;                /* mean level of data acquisition */
++
++	double mmax  = 1000;               /* max value for layer interfaces */
++	double mmax2 = 1000;
++	double mmax3 = 1000;
++
++	/* control parameter for temperature schedule  */
++
++	double ca=0.9;                    /* for acceptance */
++	double cm=0.5;                    /* for model perturbation */
++
++	double T0a          = 0.1;      /* initial temperature for acceptance           */
++	double T0m          = 0.9;      /* initial temperature for model perturbation   */
++	double D            = 2;        /* dimension of the model                       */
++	int    maxconsecrej = 1000;     /* max consecutive rejection                    */
++	int    maxsuccess   = 100;      /* max number of success within one temperature */
++	double T_min        = 1e-10;    /* stopping temp                                */
++	double Tred         = 1;
++	double E_min        = -1000000;
++	double E_exp        = 0.0291;   /* expected misfit                              */
++	int    maxiter      = 10000;
++	int    maxtotaliter = 1000000;
++	double Tol          = 1e-10;    /* tolerance on misfit                          */
++	int    sfreq        = 100;
++
++	/*}}}*/     
++	/* load the data {{{*/
++
++	/* Observed gravity anomaly */
++
++	ifstream file1("store_fa500_36s.txt");
++	Matrix * gobs= new Matrix(nx*ny,1);
++	double inputnumber;
++	for(int i=0;i<ny*nx; i++){ 
++		file1 >> inputnumber;
++		gobs->SetValue(i,0, inputnumber*1e-5);
++	}
++	file1.close();
++	//	gobs->Echo();
++
++	/* load data about the ice thickness */
++
++	ifstream file2("store_flag_icethick500.txt");
++	Matrix * icethick= new Matrix(mx*my,1);
++	for(int s=0;s<mx*my; s++){ 
++		file2 >> inputnumber;
++		icethick->SetValue(s,0,inputnumber);
++	}
++	file2.close();
++	//	icethick->Echo();
++
++	/* load the batimethry data */
++
++	ifstream file3("store_flag_bathy500.txt");
++	Matrix * bathy= new Matrix(mx*my,1);
++	for(int s=0;s<mx*my; s++){ 
++		file3 >> inputnumber;
++		bathy->SetValue(s,0,inputnumber);
++	}
++	file3.close();
++	//	bathy->Echo();
++
++	/* id of grid to evaluate misfit */
++
++
++	ifstream file4("store_flag_eval500.txt");
++	Matrix * evalid= new Matrix(mx*my,1);
++	for(int s=0;s<mx*my; s++){ 
++		file4 >> inputnumber;
++		evalid->SetValue(s,0,inputnumber);
++	}
++	file4.close();
++	//	evalid->Echo();
++
++	/* initial guess of the model */
++
++	ifstream file5("m0_140114b.txt");
++	Matrix * mesh_ini= new Matrix(mx*my,3);
++	for(int s=0;s<mx*my; s++){ 
++		for(int j=0;j<3;j++){
++			file5 >> inputnumber;
++			mesh_ini->SetValue(s,j,inputnumber);
++		}
++	}
++	file5.close();
++	//	mesh_ini->Echo();
++	/*}}}*/
++	/* VFSA {{{ */
++
++	/* name of the files to save results */
++	std::ofstream savefile1 ("r_140114b.txt");
++	std::ofstream savefile2("m_140114b.txt");
++
++	/* counters initialization */
++	int    success   = 0;
++	int    finished  = 0;
++	int    consec    = 0;
++	double Ta        = T0a;
++	double Tm        = T0m;
++	int    iterT     = 0;   /* iteration within a T      */
++	int    total     = 0;   /* total number of iteration */
++	int    totaliter = 0;
++	int    msave     = 0;
++	double E_new;
++	double E_final;
++	double dE;
++	double P;
++	double rn;
++	Matrix* m_old    = new Matrix(mx *my,3);
++	Matrix* m_min    = new Matrix(mx *my,3);
++	Matrix* m_new    = new Matrix(mx *my,3);
++	m_old->MatrixEqual(mesh_ini);
++
++	/* calculate initial misfit */
++	double E_old=misfit(m_old,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my, my_rank, num_procs);
++	/* record initial settings */
++	if(!my_rank){
++		savefile1 << "P     "<< "Ta    "<< "Tm    "<< "Eold  "<< "totaliter "<< "Tred   "<< endl;
++		savefile1 << "nan   "<<  Ta<<"   "<< Tm<<"   "<< E_old<<"     "<< totaliter<<"         "<< Tred <<"  "<< endl;
++		savefile2 << totaliter<< endl;
++		for(int i=0;i<mx*my;i++){
++			savefile2 << m_old->GetValue(i,0)<<"   "<< m_old->GetValue(i,1)<<"   "<< m_old->GetValue(i,2)<<endl;
++		}
++		savefile2 << "111111111111111111111111111111111111111111111111111111111111111111111111111"<< endl;
++	}
++	/* beginning of the loop */
++
++	while(finished==0){
++		iterT++;
++		totaliter++;
++
++		/* stop or reduce T */
++		if(iterT>=maxiter || success>maxsuccess){
++			if(Ta<T_min || total>maxtotaliter || fabs(E_old)<=Tol){
++				finished=1;
++				total+=iterT;
++				break;
++			}
++			else{ /* reduce T */
++				Ta=coolshed(T0a,Tred,ca,D);
++				Tm=coolshed(T0m,Tred,cm,D);
++				total+=iterT;
++				iterT=0;
++				success=1;
++				Tred++;
++				consec=0;
++			}
++		}
++
++		/* update model and calculate energy */
++
++		newmodelgen(m_old,m_new,bathy,icethick,mx,my,Tm,ptval,mmax,mmax2,ctr,sd);  /* new model */
++		E_new=misfit(m_new,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my, my_rank, num_procs); /* new energy */
++		dE=E_new-E_old;                                        /* energy difference */
++
++		/* acceptance probability */
++
++		P=exp(-dE/Ta);
++
++		/* stop if energy is lower than specified minimum */
++		if (E_new<E_min){
++			m_old->MatrixEqual(m_new);
++			E_old=E_new;
++			break;
++		}
++
++		rn=rand()/double (RAND_MAX);
++
++		/* accept new model or not */
++		if(dE<=0){
++			m_old->MatrixEqual(m_new);
++			E_old=E_new;
++			success++;
++			consec=0;
++			if(!my_rank){
++				savefile1 << P<<"   "<<  Ta<<"   "<< Tm<<"   "<< E_old<<"     "<< totaliter<<"         "<< Tred <<"  "<< endl;
++			}
++			if(Ta<1e-3){
++				if(!my_rank){
++					savefile2 << totaliter<< endl;
++					for(int i=0;i<mx*my;i++){
++						savefile2 << m_old->GetValue(i,0)<<"   "<< m_old->GetValue(i,1)<<"   "<< m_old->GetValue(i,2)<<endl;
++					}
++					savefile2 << "111111111111111111111111111111111111111111111111111111111111111111111111111"<< endl;
++				}
++			}
++		}
++		else{
++			if(P>rn){
++				m_old->MatrixEqual(m_new);
++				E_old=E_new;
++				success++;
++				consec=0;
++				if(!my_rank){
++					savefile1 << P<<"   "<<  Ta<<"   "<< Tm<<"   "<< E_old<<"     "<< totaliter<<"         "<< Tred <<"  "<< endl;
++					if(Ta<1e-3){
++						savefile2 << totaliter<< endl;
++						for(int i=0;i<mx*my;i++){
++							savefile2 << m_old->GetValue(i,0)<<"   "<< m_old->GetValue(i,1)<<"   "<< m_old->GetValue(i,2)<<endl;
++						}
++						savefile2 << "111111111111111111111111111111111111111111111111111111111111111111111111111"<< endl;
++					}
++				}
++			}
++			else{
++				consec++;
++			}
++		}
++		if(!my_rank){
++			cout<<totaliter<<endl;
++		}
++	}
++
++	m_min->MatrixEqual(m_old);
++	E_final=E_old;
++	if(!my_rank){
++		savefile1 << "nan"<<"   "<<  "nan"<<"   "<< "nan"<<"   "<< E_final<<"     "<< "nan"<<"         "<< "nan" <<"  "<< endl;
++		savefile2 << " Mesh final"<< endl;
++		for(int i=0;i<mx*my;i++){
++			savefile2 << m_min->GetValue(i,0)<<"   "<< m_min->GetValue(i,1)<<"   "<< m_min->GetValue(i,2)<<endl;
++		}
++	}
++	savefile1.close();
++	savefile2.close();
++
++	delete m_old;
++	delete m_min;
++	delete m_new;
++	delete Pobs;
++	delete Pp;
++	delete Rho;
++	delete rho1;
++	delete rho2;
++	delete xobs;
++	delete yobs;
++	delete mesh_ini;
++	delete bathy;
++	delete icethick;
++	delete evalid;
++
++	/*}}}*/
++
++   MPI_Finalize();
++
++	return 0;
++}/*}}}*/
++
++void GSLsquarefit(Matrix** pX,Matrix* A,Matrix* B){/*{{{*/
++
++	/*GSL Matrices and vectors: */
++	int    M,N;
++	double chisq;
++
++	/*Get system size*/
++	A->GetSize(&M,&N);
++
++	/*Initialize gsl matrices and vectors: */
++	gsl_matrix* a = gsl_matrix_alloc(M,N);
++	for(int i=0;i<M;i++){
++		for(int j=0;j<N;j++){
++			gsl_matrix_set (a,i,j,A->GetValue(i,j));
++		}
++	}
++	gsl_vector* b = gsl_vector_alloc(M);
++	for(int i=0;i<M;i++){
++		gsl_vector_set(b,i,B->GetValue(i,0));
++	}
++
++	gsl_vector* x = gsl_vector_alloc(N);
++	gsl_matrix* cov = gsl_matrix_alloc(N,N);
++
++	/*Least square fit: */
++	gsl_multifit_linear_workspace* work = gsl_multifit_linear_alloc(M,N);
++	gsl_multifit_linear (a, b, x, cov, &chisq, work);
++	gsl_multifit_linear_free (work);
++
++	/*Clean up and assign output pointer*/
++	Matrix* X = new Matrix(N,1);
++	for(int j=0;j<N;j++){
++		X->SetValue(j,0,gsl_vector_get(x,j));
++	}
++	*pX = X;
++
++	gsl_matrix_free(a);
++	gsl_vector_free(b);
++	gsl_matrix_free(cov);
++
++}/*}}}*/
++void makep(Matrix *Pobs,int nx,int ny, int dx, int dy){/*{{{*/
++	for(int i=0;i<ny;i++){
++		for(int j=0;j<nx;j++){
++			Pobs->SetValue(j+nx*i,0,j*dx);
++			Pobs->SetValue(j+nx*i,1,i*dy);
++		}
++	}
++}/*}}}*/
++void vec2grid(Matrix *V,Matrix *V1,Matrix *V2,int nx, int ny){/*{{{*/
++	for(int i=0;i<ny;i++){
++		for (int j=0;j<nx;j++){
++			V1->SetValue(i,j, V->GetValue(j+nx*i,0));
++			V2->SetValue(i,j, V->GetValue(j+nx*i,1));
++		}
++	}
++}/*}}}*/
++void msplit( Matrix *m, Matrix *m1,Matrix *m2,double dlevel){/*{{{*/
++	int sizem1,sizem2;
++	m->GetSize(&sizem1,&sizem2);
++	for(int i=0;i<sizem1;i++){
++		for(int j=0;j<sizem2+1;j++){
++			if(j<sizem2){
++				m1->SetValue(i,j,1e-10*(sizem2+1-j));
++				m2->SetValue(i,j,m->GetValue(i,j));
++				if(m->GetValue(i,j)<0){
++					m1->SetValue(i,j,m->GetValue(i,j));
++					m2->SetValue(i,j,i*1e-10);
++				}
++			}
++			else{
++				m1->SetValue(i,j,1e-10);
++			}
++		}
++	}
++	m1->AddNumber(dlevel);
++	m2->AddNumber(dlevel);
++}/*}}}*/
++void plouff(Matrix *g,Matrix *Pobs,Matrix *Pp,Matrix * mesh,Matrix *rho,int dx,int dy, int dn,int m,int n,int l,int my_rank,int num_procs){/*{{{*/
++	double gg=6.673e-11;
++	int si,sj,id,s;
++	double R,Q,P;
++	Matrix *xp= new Matrix(1,2);
++	Matrix *yp= new Matrix(1,2);
++	Matrix *xpp= new Matrix(1,2);
++	Matrix *ypp= new Matrix(1,2);
++	Matrix *U= new Matrix(l,4);
++	Matrix *U1=new Matrix(1,4);
++	Matrix *U2=new Matrix(1,4);
++	Matrix *gl= new Matrix(1,l-1);
++	bool test=true;
++
++	double *glocal=new double[n]();
++	double *gcalc=new double[n]();
++
++	for(int c=my_rank;c<n;c+=num_procs){
++		glocal[c]=0;
++		for(int a=0;a<m;a++){
++			test=true;
++			xp->SetValue(0,0,Pp->GetValue(a,0)-Pobs->GetValue(c,0));
++			xp->SetValue(0,1,Pp->GetValue(a,0)-Pobs->GetValue(c,0)+dx);
++			if(xp->GetValue(0,0)<0 && xp->GetValue(0,0)<xp->GetValue(0,1) && xp->GetValue(0,0)*xp->GetValue(0,1)>=0){
++				xpp->SetValue(0,0,xp->GetValue(0,1));
++				xpp->SetValue(0,1,xp->GetValue(0,0));
++				xp->MatrixAbs(xpp);
++			}
++			yp->SetValue(0,0,Pp->GetValue(a,1)-Pobs->GetValue(c,1));
++			yp->SetValue(0,1,Pp->GetValue(a,1)-Pobs->GetValue(c,1)+dy);
++			if(yp->GetValue(0,0)<0 && yp->GetValue(0,0)<yp->GetValue(0,1) && yp->GetValue(0,0)*yp->GetValue(0,1)>=0){
++				ypp->SetValue(0,0,yp->GetValue(0,1));
++				ypp->SetValue(0,1,yp->GetValue(0,0));
++				yp->MatrixAbs(ypp);
++			}
++			P=sqrt(xp->GetValue(0,0)*xp->GetValue(0,0)+yp->GetValue(0,0)*yp->GetValue(0,0));
++			if(P>dn){
++				test=false;
++				for(int i=0;i<l-1;i++){
++					gl->SetValue(0,i,0);
++				}
++			}
++			if(test==true){
++				si=1;
++				sj=1;
++				id=0;
++				for(int i=0;i<2;i++){
++					si*=-1;
++					for(int j=0;j<2;j++){
++						si*=-1;
++						s=si*sj;
++						for(int k=0;k<l;k++){
++							R=sqrt(xp->GetValue(0,i)*xp->GetValue(0,i)+yp->GetValue(0,j)*yp->GetValue(0,j)+mesh->GetValue(a,k)*mesh->GetValue(a,k));
++							Q=atan(xp->GetValue(0,i)*yp->GetValue(0,j)/(mesh->GetValue(a,k)*R));
++							U->SetValue(k,id,s*(mesh->GetValue(a,k)*Q-xp->GetValue(0,i)*log(R+yp->GetValue(0,j))-yp->GetValue(0,j)*log(R+xp->GetValue(0,i))));
++						}
++						id++;
++					}
++				}
++				for(int b=0;b<l-1;b++){
++					U->ExtractLine(U1,b);
++					U->ExtractLine(U2,b+1);
++					gl->SetValue(0,b,rho->GetValue(0,b)*(U1->MatrixInternSum()*(-1)+U2->MatrixInternSum()));
++				}
++			}
++			glocal[c]=glocal[c]+gg*gl->MatrixInternSum();
++
++		}
++	}
++
++	MPI_Allreduce(glocal,gcalc,n,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
++	if(!my_rank){for(int c=0;c<n;c++){
++		g->SetValue(c,0,gcalc[c]);
++	}
++	}
++
++	delete xp;
++	delete yp;
++	delete xpp;
++	delete ypp;
++	delete gl;
++	delete U;
++	delete U1;
++	delete U2;
++	delete []glocal;
++	delete []gcalc;
++}/*}}}*/
++void vec2gridsimple(Matrix *V,Matrix *V1,int nx, int ny){/*{{{*/
++	for(int i=0;i<ny;i++){
++		for (int j=0;j<nx;j++){
++			V1->SetValue(i,j, V->GetValue(j+nx*i,0));
++		}
++	}
++}/*}}}*/
++void reshape(Matrix* V,Matrix* V1,int nx,int ny){/*{{{*/
++	for (int i=0;i<ny;i++){
++		for(int j=0;j<nx;j++){
++			V1->SetValue(j+nx*i,0,V->GetValue(i,j));
++		}
++	}
++}/*}}}*/
++double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,int dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my,int my_rank,int num_procs){/*{{{*/
++	Matrix* m1=new Matrix(mx*my,4);
++	Matrix* m2=new Matrix(mx*my,3);
++	Matrix* g1=new Matrix(nx*ny,1);
++	Matrix* g2=new Matrix(nx*ny,1);
++	Matrix* g=new Matrix(nx*ny,1);
++	Matrix* gcalgr=new Matrix(ny,nx);
++	Matrix* gcalvec=new Matrix(mx*my,1);
++	Matrix* df=new Matrix(mx*my,1);
++	Matrix* G=new Matrix(mx*my,3);
++	double a=0;
++	double b=0;
++	double e=0;
++	msplit(m0,m1,m2,dlevel);
++	plouff(g1,Pobs,Pp,m1,rho1,dx,dy,dn,mx*my,nx*ny,4, my_rank, num_procs);
++	plouff(g2,Pobs,Pp,m2,rho2,dx,dy,dn,mx*my,nx*ny,3, my_rank, num_procs);
++	g->MatrixSum(g1,g2);
++	vec2gridsimple(g,gcalgr,nx,ny);
++	reshape(gcalgr,gcalvec,mx,my);
++	for (int i=0;i<mx*my;i++){
++		df->SetValue(i,0,evalid->GetValue(i,0)*(gobs->GetValue(i,0)-gcalvec->GetValue(i,0)));
++		G->SetValue(i,0,evalid->GetValue(i,0)*Pobs->GetValue(i,0));
++		G->SetValue(i,1,evalid->GetValue(i,0)*Pobs->GetValue(i,1));
++		G->SetValue(i,2,evalid->GetValue(i,0));
++	}
++	Matrix* M = NULL;
++	GSLsquarefit(&M,G,df);
++
++	for (int i=0;i<my;i++){
++		for(int j=0;j<mx;j++){
++			gcalgr->SetValue(i,j,gcalgr->GetValue(i,j)+xobs->GetValue(i,j)*M->GetValue(0,0)+yobs->GetValue(i,j)*M->GetValue(1,0)+M->GetValue(2,0));
++		}
++	}
++	reshape(gcalgr,g,mx,my);
++	for (int i=0;i<mx*my;i++){
++		a=a+fabs(evalid->GetValue(i,0)*(gobs->GetValue(i,0)-g->GetValue(i,0)));
++		b=b+fabs(evalid->GetValue(i,0)*(gobs->GetValue(i,0)+g->GetValue(i,0)));
++	}
++	e=2*a/(a+b);
++	return e;
++}/*}}}*/
++void newmodelgen(Matrix* m0,Matrix* m1,Matrix* bathy,Matrix* icethick,int mx,int my,double T,double ptval,double mmax,double mmax2,double ctr,double sd){/*{{{*/
++	Matrix* m1gr=new Matrix(my,mx);
++	Matrix* m1grsm=new Matrix(my,mx);
++	Matrix* m1col=new Matrix(mx*my,1);
++	double u=0;
++	double y=0;
++	m1->MatrixEqual(m0);
++	for (int i=0;i<mx*my;i++){
++		if(icethick->GetValue(i,0)==0){
++			u=double (rand())/ double(RAND_MAX);
++			y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
++			m1->SetValue(i,1,m0->GetValue(i,1)+y*ptval);
++			if(m1->GetValue(i,1)<=m1->GetValue(i,0)){
++				m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
++			}
++			if(m1->GetValue(i,1)>=m1->GetValue(i,0)+mmax){
++				m1->SetValue(i,1,m1->GetValue(i,0)+mmax);
++			}
++		}
++	}
++	m1->ExtractColumn(m1col,1);
++	vec2gridsimple(m1col,m1gr,mx,my);
++	filtergrav(m1grsm,m1gr,ctr,sd,mx,my);
++	reshape(m1grsm,m1col,mx,my);
++	for (int i=0;i<mx*my;i++){
++		if(icethick->GetValue(i,0)==0){
++			m1->SetValue(i,1,m1col->GetValue(i,0));
++		}
++		else{
++			m1->SetValue(i,1,m0->GetValue(i,1));
++		}
++		if(m1->GetValue(i,1)<=m1->GetValue(i,0)){
++			m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
++		}
++	}
++
++	for (int i=0;i<mx*my;i++){
++		if(bathy->GetValue(i,0)==0){
++			u=double (rand())/ double(RAND_MAX);
++			y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
++			m1->SetValue(i,2,m0->GetValue(i,2)+y*ptval);
++			if(m1->GetValue(i,2)<=m1->GetValue(i,1)){
++				m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++			}
++			if(m1->GetValue(i,2)>=m1->GetValue(i,1)+mmax2){
++				m1->SetValue(i,2,m1->GetValue(i,1)+mmax2);
++			}
++		}
++	}
++	m1->ExtractColumn(m1col,2);
++	vec2gridsimple(m1col,m1gr,mx,my);
++	filtergrav(m1grsm,m1gr,ctr,sd,mx,my);
++	reshape(m1grsm,m1col,mx,my);
++	for (int i=0;i<mx*my;i++){
++		if(bathy->GetValue(i,0)==0){
++			m1->SetValue(i,2,m1col->GetValue(i,0));
++		}
++		else{
++			m1->SetValue(i,2,m0->GetValue(i,2));
++		}
++		if(m1->GetValue(i,2)<=m1->GetValue(i,1)){
++			m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++		}
++	}
++	delete m1gr;
++	delete m1grsm;
++	delete m1col;
++}/*}}}*/
++double signe(double a){/*{{{*/
++	if(a<0){return -1;}
++	else{return 1;}
++}/*}}}*/
++void filtergrav(Matrix* A,Matrix* Ain,double ctr,double sd,int mx,int my){/*{{{*/
++	A->MatrixEqual(Ain);
++	for (int i=1;i<my-1;i++){
++		for(int j=1;j<mx-1;j++){
++			A->SetValue(i,j,(ctr*Ain->GetValue(i,j)+sd*(Ain->GetValue(i-1,j)+Ain->GetValue(i+1,j)+Ain->GetValue(i,j-1)+Ain->GetValue(i,j+1)))/(ctr+4*sd));
++		}
++	}
++}/*}}}*/
++double coolshed(double T0,int k,double c,double D){/*{{{*/
++	double T1=T0*exp(-c*pow(k,1/D));
++	return T1;
++}/*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18462-18463.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18462-18463.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18462-18463.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/wrappers/matlab/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/wrappers/matlab/Makefile.am	(revision 18462)
++++ ../trunk-jpl/src/wrappers/matlab/Makefile.am	(revision 18463)
+@@ -98,7 +98,7 @@
+ endif
+ 
+ if FORTRAN
+-deps += $(FLIBS) $(FORTRANLIB)
++deps += $(FLIBS)
+ endif
+ 
+ #MEXLIB needs to be the last (undefined references on larsen)
Index: /issm/oecreview/Archive/18296-19100/ISSM-18463-18464.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18463-18464.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18463-18464.diff	(revision 19102)
@@ -0,0 +1,19 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/Makefile
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/Makefile	(revision 18463)
++++ ../trunk-jpl/src/m/contrib/gravity/Makefile	(revision 18464)
+@@ -1,7 +1,11 @@
+ all:
+-		g++ vfsa.cpp -o forward \
++		g++ vfsa_mpi.cpp  \
+ 			-I$(ISSM_DIR)/externalpackages/gsl/install/include \
+-			-L$(ISSM_DIR)/externalpackages/gsl/install/lib -lgsl -lgslcblas
++			-L$(ISSM_DIR)/externalpackages/gsl/install/lib -lgsl -lgslcblas \
++		   -I$(ISSM_DIR)/externalpackages/mpich/install/include/ \
++		   -L$(ISSM_DIR)/externalpackages/mpich/install/lib/ -lmpich -lpmpich -lmpl -o forward.exe 
+ 
++forward:
++	   mpirun -np 4 ./forward.exe
+ clean:
+-		rm -f forward
++		rm ./forward.exe
Index: /issm/oecreview/Archive/18296-19100/ISSM-18464-18465.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18464-18465.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18464-18465.diff	(revision 19102)
@@ -0,0 +1,74 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp	(revision 18464)
++++ ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp	(revision 18465)
+@@ -129,12 +129,12 @@
+ void* plouffT(void* vpthread_handle);
+ void vec2gridsimple(Matrix *V,Matrix *V1,int nx, int ny);
+ void reshape(Matrix* V,Matrix* V1,int nx,int ny);
+-double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,int dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my);
++double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,double dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my);
+ void GSLsquarefit(Matrix** pX,Matrix* A,Matrix* B);
+ double signe(double a);
+ void filtergrav(Matrix* A,Matrix* Ain,double ctr,double sd,int mx,int my);
+ void newmodelgen(Matrix* m0,Matrix* m1,Matrix* bathy,Matrix* icethick,int mx,int my,double T,double ptval,double mmax,double mmax2,double ctr,double sd);
+-double coolshed(double T0,int k,double c,double D);
++double coolshed(double T0,double k,double c,double D);
+ void   LaunchThread(void* function(void*), void* usr,int num_threads);
+ /*}}}*/
+ 
+@@ -538,7 +538,7 @@
+ 		}
+ 	}
+ }/*}}}*/
+-double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,int dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my){/*{{{*/
++double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,double dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my){/*{{{*/
+ 	Matrix* m1=new Matrix(mx*my,4);
+ 	Matrix* m2=new Matrix(mx*my,3);
+ 	Matrix* g1=new Matrix(nx*ny,1);
+@@ -690,7 +690,7 @@
+ 		}
+ 	}
+ }/*}}}*/
+-double coolshed(double T0,int k,double c,double D){/*{{{*/
++double coolshed(double T0,double k,double c,double D){/*{{{*/
+ 	double T1=T0*exp(-c*pow(k,1/D));
+ 	return T1;
+ }/*}}}*/
+Index: ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 18464)
++++ ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 18465)
+@@ -128,12 +128,12 @@
+ void plouff(Matrix *g,Matrix *Pobs,Matrix *Pp,Matrix * mesh,Matrix *rho,int dx,int dy, int dn,int m,int n,int l,int my_rank,int num_procs);
+ void vec2gridsimple(Matrix *V,Matrix *V1,int nx, int ny);
+ void reshape(Matrix* V,Matrix* V1,int nx,int ny);
+-double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,int dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my,int my_rank,int num_procs);
++double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,double dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my,int my_rank,int num_procs);
+ void GSLsquarefit(Matrix** pX,Matrix* A,Matrix* B);
+ double signe(double a);
+ void filtergrav(Matrix* A,Matrix* Ain,double ctr,double sd,int mx,int my);
+ void newmodelgen(Matrix* m0,Matrix* m1,Matrix* bathy,Matrix* icethick,int mx,int my,double T,double ptval,double mmax,double mmax2,double ctr,double sd);
+-double coolshed(double T0,int k,double c,double D);
++double coolshed(double T0,double k,double c,double D);
+ /*}}}*/
+ 
+ int main(int argc,char *argv[]){/*{{{*/
+@@ -620,7 +620,7 @@
+ 		}
+ 	}
+ }/*}}}*/
+-double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,int dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my,int my_rank,int num_procs){/*{{{*/
++double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,double dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my,int my_rank,int num_procs){/*{{{*/
+ 	Matrix* m1=new Matrix(mx*my,4);
+ 	Matrix* m2=new Matrix(mx*my,3);
+ 	Matrix* g1=new Matrix(nx*ny,1);
+@@ -741,7 +741,7 @@
+ 		}
+ 	}
+ }/*}}}*/
+-double coolshed(double T0,int k,double c,double D){/*{{{*/
++double coolshed(double T0,double k,double c,double D){/*{{{*/
+ 	double T1=T0*exp(-c*pow(k,1/D));
+ 	return T1;
+ }/*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18465-18466.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18465-18466.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18465-18466.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 18465)
++++ ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 18466)
+@@ -403,7 +403,6 @@
+ 			}
+ 		}
+ 		if(!my_rank){
+-			cout<<totaliter<<endl;
+ 		}
+ 	}
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18466-18467.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18466-18467.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18466-18467.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/wrappers/matlab/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/wrappers/matlab/Makefile.am	(revision 18466)
++++ ../trunk-jpl/src/wrappers/matlab/Makefile.am	(revision 18467)
+@@ -98,7 +98,7 @@
+ endif
+ 
+ if FORTRAN
+-deps += $(FLIBS)
++deps += $(FLIBS) $(FORTRANLIB)
+ endif
+ 
+ #MEXLIB needs to be the last (undefined references on larsen)
Index: /issm/oecreview/Archive/18296-19100/ISSM-18467-18468.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18467-18468.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18467-18468.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 18467)
++++ ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 18468)
+@@ -402,8 +402,6 @@
+ 				consec++;
+ 			}
+ 		}
+-		if(!my_rank){
+-		}
+ 	}
+ 
+ 	m_min->MatrixEqual(m_old);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18468-18469.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18468-18469.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18468-18469.diff	(revision 19102)
@@ -0,0 +1,40 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 18468)
++++ ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 18469)
+@@ -402,6 +402,8 @@
+ 				consec++;
+ 			}
+ 		}
++		if(!my_rank){
++		}
+ 	}
+ 
+ 	m_min->MatrixEqual(m_old);
+@@ -475,6 +477,7 @@
+ 	*pX = X;
+ 
+ 	gsl_matrix_free(a);
++	gsl_vector_free(x);
+ 	gsl_vector_free(b);
+ 	gsl_matrix_free(cov);
+ 
+@@ -656,6 +659,18 @@
+ 		b=b+fabs(evalid->GetValue(i,0)*(gobs->GetValue(i,0)+g->GetValue(i,0)));
+ 	}
+ 	e=2*a/(a+b);
++
++	delete m1;
++	delete m2;
++	delete g1;
++	delete g2;
++	delete g;
++	delete gcalgr;
++	delete gcalvec;
++	delete df;
++	delete G;
++	delete M;
++
+ 	return e;
+ }/*}}}*/
+ void newmodelgen(Matrix* m0,Matrix* m1,Matrix* bathy,Matrix* icethick,int mx,int my,double T,double ptval,double mmax,double mmax2,double ctr,double sd){/*{{{*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18469-18470.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18469-18470.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18469-18470.diff	(revision 19102)
@@ -0,0 +1,555 @@
+Index: ../trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp	(revision 18469)
++++ ../trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp	(revision 18470)
+@@ -74,10 +74,7 @@
+ 	int finiteelement;
+ 
+ 	iomodel->Constant(&finiteelement,DamageElementinterpEnum);
+-
+-	if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(1,MeshVertexonbaseEnum);
+ 	::CreateNodes(nodes,iomodel,DamageEvolutionAnalysisEnum,finiteelement);
+-	iomodel->DeleteData(1,MeshVertexonbaseEnum);
+ }/*}}}*/
+ void DamageEvolutionAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+ 
+@@ -108,74 +105,60 @@
+ 
+ 	/* Check if ice in element */
+ 	if(!element->IsIceInElement()) return NULL;
+-
+ 	/*Intermediaries*/
+-	Element*    basalelement;
+ 	int         domaintype,dim;
+ 	int         stabilization;
+-	IssmDouble  Jdet,dt,D_scalar,h;
+-	IssmDouble  vel,vx,vy,dvxdx,dvydy,dvx[2],dvy[2];
++	IssmDouble  Jdet,dt,D_scalar,h,hx,hy,hz;
++	IssmDouble  vel,vx,vy,vz,dvxdx,dvydy,dvzdz,dvx[3],dvy[3],dvz[3];
+ 	IssmDouble *xyz_list  = NULL;
+ 
+-	/*Get problem dimension and basal element*/
++	/*Get problem dimension*/
+ 	element->FindParam(&domaintype,DomainTypeEnum);
+ 	switch(domaintype){
+-		case Domain2DhorizontalEnum:
+-			basalelement = element;
+-			dim = 2;
+-			break;
+-		case Domain3DEnum:
+-			if(!element->IsOnBase()) return NULL;
+-			basalelement = element->SpawnBasalElement();
+-			dim = 2;
+-			break;
+-		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
++		case Domain2DhorizontalEnum: dim = 2; break;
++		case Domain3DEnum:           dim = 3; break;
++		default: _error_("Not implemented yet");
+ 	}
+ 
+ 	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = basalelement->GetNumberOfNodes();
++	int numnodes = element->GetNumberOfNodes();
+ 
+ 	/*Initialize Element vector*/
+-	ElementMatrix* Ke     = basalelement->NewElementMatrix();
++	ElementMatrix* Ke     = element->NewElementMatrix();
+ 	IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
+ 	IssmDouble*    B      = xNew<IssmDouble>(dim*numnodes);
+ 	IssmDouble*    Bprime = xNew<IssmDouble>(dim*numnodes);
+ 	IssmDouble*    D      = xNewZeroInit<IssmDouble>(dim*dim);
+ 
+ 	/*Retrieve all inputs and parameters*/
+-	basalelement->GetVerticesCoordinates(&xyz_list);
+-	basalelement->FindParam(&dt,TimesteppingTimeStepEnum);
+-	basalelement->FindParam(&stabilization,DamageStabilizationEnum);
+-	Input* vxaverage_input=NULL;
+-	Input* vyaverage_input=NULL;
+-	if(domaintype==Domain2DhorizontalEnum){
+-		vxaverage_input=basalelement->GetInput(VxEnum); _assert_(vxaverage_input);
+-		vyaverage_input=basalelement->GetInput(VyEnum); _assert_(vyaverage_input);
++	element->GetVerticesCoordinates(&xyz_list);
++	element->FindParam(&dt,TimesteppingTimeStepEnum);
++	element->FindParam(&stabilization,DamageStabilizationEnum);
++	Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input);
++	Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input);
++	Input* vz_input = NULL;
++	if(dim==3){
++		vz_input=element->GetInput(VzEnum); _assert_(vz_input);
+ 	}
+-	else{
+-		if(dim==1){
+-			vxaverage_input=element->GetInput(VxEnum); _assert_(vxaverage_input);
+-		}
+-		if(dim==2){
+-			vxaverage_input=element->GetInput(VxAverageEnum); _assert_(vxaverage_input);
+-			vyaverage_input=element->GetInput(VyAverageEnum); _assert_(vyaverage_input);
+-		}
+-	}
+-	h=basalelement->CharacteristicLength();
+ 
++	if(dim==2) h=element->CharacteristicLength();
++
+ 	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=basalelement->NewGauss(2);
++	Gauss* gauss=element->NewGauss(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 		gauss->GaussPoint(ig);
+ 
+-		basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		basalelement->NodalFunctions(basis,gauss);
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		element->NodalFunctions(basis,gauss);
+ 		
+-		vxaverage_input->GetInputValue(&vx,gauss);
+-		vxaverage_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
+-		if(dim==2){
+-			vyaverage_input->GetInputValue(&vy,gauss);
+-			vyaverage_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
++		vx_input->GetInputValue(&vx,gauss);
++		vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
++
++		if(dim==3){
++			vz_input->GetInputValue(&vz,gauss);
++			vz_input->GetInputDerivativeValue(&dvz[0],xyz_list,gauss);
+ 		}
+ 
+ 		D_scalar=gauss->weight*Jdet;
+@@ -184,15 +167,17 @@
+ 					basis,1,numnodes,0,
+ 					&Ke->values[0],1);
+ 
+-		GetB(B,basalelement,dim,xyz_list,gauss);
+-		GetBprime(Bprime,basalelement,dim,xyz_list,gauss);
++		GetB(B,element,dim,xyz_list,gauss);
++		GetBprime(Bprime,element,dim,xyz_list,gauss);
+ 
+ 		dvxdx=dvx[0];
+-		if(dim==2) dvydy=dvy[1];
++		dvydy=dvy[1];
++		if(dim==3) dvzdz=dvz[2];
+ 		D_scalar=dt*gauss->weight*Jdet;
+ 
+ 		D[0*dim+0]=D_scalar*dvxdx;
+-		if(dim==2) D[1*dim+1]=D_scalar*dvydy;
++		D[1*dim+1]=D_scalar*dvydy;
++		if(dim==3) D[2*dim+2]=D_scalar*dvzdz;
+ 
+ 		TripleMultiply(B,dim,numnodes,1,
+ 					D,dim,dim,0,
+@@ -200,7 +185,8 @@
+ 					&Ke->values[0],1);
+ 
+ 		D[0*dim+0]=D_scalar*vx;
+-		if(dim==2) D[1*dim+1]=D_scalar*vy;
++		D[1*dim+1]=D_scalar*vy;
++		if(dim==3) D[2*dim+2]=D_scalar*vz;
+ 
+ 		TripleMultiply(B,dim,numnodes,1,
+ 					D,dim,dim,0,
+@@ -208,9 +194,17 @@
+ 					&Ke->values[0],1);
+ 
+ 		if(stabilization==2){
+-			if(dim==1){
+-				vel=fabs(vx)+1.e-8;
+-				D[0]=h/(2.0*vel)*vx*vx;
++			if(dim==3){
++				vel=sqrt(vx*vx+vy*vy+vz*vz)+1.e-8;
++				D[0*dim+0]=h/(2.0*vel)*vx*vx;
++				D[1*dim+0]=h/(2.0*vel)*vy*vx;
++				D[2*dim+0]=h/(2.0*vel)*vz*vx;
++				D[0*dim+1]=h/(2.0*vel)*vx*vy;
++				D[1*dim+1]=h/(2.0*vel)*vy*vy;
++				D[2*dim+1]=h/(2.0*vel)*vy*vz;
++				D[0*dim+2]=h/(2.0*vel)*vx*vz;
++				D[1*dim+2]=h/(2.0*vel)*vy*vz;
++				D[2*dim+2]=h/(2.0*vel)*vz*vz;
+ 			}
+ 			else{
+ 				/*Streamline upwinding*/
+@@ -222,20 +216,39 @@
+ 			}
+ 		}
+ 		else if(stabilization==1){
+-			vxaverage_input->GetInputAverage(&vx);
+-			if(dim==2) vyaverage_input->GetInputAverage(&vy);
+-			D[0*dim+0]=h/2.0*fabs(vx);
+-			if(dim==2) D[1*dim+1]=h/2.0*fabs(vy);
++			if(dim==2){
++				vx_input->GetInputAverage(&vx);
++				vy_input->GetInputAverage(&vy);
++				D[0*dim+0]=h/2.0*fabs(vx);
++				D[1*dim+1]=h/2.0*fabs(vy);
++			}
++			else if(dim==3){ 
++				element->ElementSizes(&hx,&hy,&hz);
++				vel=sqrt(vx*vx + vy*vy + vz*vz)+1.e-14;
++				h=sqrt( pow(hx*vx/vel,2) + pow(hy*vy/vel,2) + pow(hz*vz/vel,2));
++				D[0*dim+0]=h/(2.*vel)*fabs(vx*vx);  D[0*dim+1]=h/(2.*vel)*fabs(vx*vy); D[0*dim+2]=h/(2.*vel)*fabs(vx*vz);
++				D[1*dim+0]=h/(2.*vel)*fabs(vy*vx);  D[1*dim+1]=h/(2.*vel)*fabs(vy*vy); D[1*dim+2]=h/(2.*vel)*fabs(vy*vz);
++				D[2*dim+0]=h/(2.*vel)*fabs(vz*vx);  D[2*dim+1]=h/(2.*vel)*fabs(vz*vy); D[2*dim+2]=h/(2.*vel)*fabs(vz*vz);
++			}
+ 		}
+ 		if(stabilization==1 || stabilization==2){
+-			if(dim==1) D[0]=D_scalar*D[0];
+-			else{
++			if(dim==2){
+ 				D[0*dim+0]=D_scalar*D[0*dim+0];
+ 				D[1*dim+0]=D_scalar*D[1*dim+0];
+ 				D[0*dim+1]=D_scalar*D[0*dim+1];
+ 				D[1*dim+1]=D_scalar*D[1*dim+1];
+ 			}
+-
++			else if(dim==3){
++				D[0*dim+0]=D_scalar*D[0*dim+0];
++				D[1*dim+0]=D_scalar*D[1*dim+0];
++				D[2*dim+0]=D_scalar*D[2*dim+0];
++				D[0*dim+1]=D_scalar*D[0*dim+1];
++				D[1*dim+1]=D_scalar*D[1*dim+1];
++				D[2*dim+1]=D_scalar*D[2*dim+1];
++				D[0*dim+2]=D_scalar*D[0*dim+2];
++				D[1*dim+2]=D_scalar*D[1*dim+2];
++				D[2*dim+2]=D_scalar*D[2*dim+2];
++			}
+ 			TripleMultiply(Bprime,dim,numnodes,1,
+ 						D,dim,dim,0,
+ 						Bprime,dim,numnodes,0,
+@@ -251,7 +264,6 @@
+ 	xDelete<IssmDouble>(Bprime);
+ 	xDelete<IssmDouble>(D);
+ 	delete gauss;
+-	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 	return Ke;
+ }/*}}}*/
+ ElementVector* DamageEvolutionAnalysis::CreatePVector(Element* element){/*{{{*/
+@@ -261,53 +273,54 @@
+ 
+ 	/*Intermediaries*/
+ 	int      domaintype,damagelaw;
+-	Element* basalelement;
+ 	IssmDouble  Jdet,dt;
+ 	IssmDouble  f,damage;
+ 	IssmDouble* xyz_list = NULL;
+-
+-	/*Get basal element*/
++	/*Get element*/
+ 	element->FindParam(&domaintype,DomainTypeEnum);
+-	switch(domaintype){
+-		case Domain2DhorizontalEnum:
+-			basalelement = element;
+-			break;
+-		case Domain3DEnum:
+-			if(!element->IsOnBase()) return NULL;
+-			basalelement = element->SpawnBasalElement();
+-			break;
+-		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+-	}
+ 
+-
+ 	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = basalelement->GetNumberOfNodes();
++	int numnodes = element->GetNumberOfNodes();
+ 
+ 	/*Initialize Element vector and other vectors*/
+-	ElementVector* pe    = basalelement->NewElementVector();
++	ElementVector* pe    = element->NewElementVector();
+ 	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
+ 
+ 	/*Retrieve all inputs and parameters*/
+-	basalelement->GetVerticesCoordinates(&xyz_list);
+-	basalelement->FindParam(&dt,TimesteppingTimeStepEnum);
+-	basalelement->FindParam(&damagelaw,DamageLawEnum);
+-	if(damagelaw==1 | damagelaw==2){
+-		this->CreateDamageFInputPralong(basalelement);
++	element->GetVerticesCoordinates(&xyz_list);
++	element->FindParam(&dt,TimesteppingTimeStepEnum);
++	element->FindParam(&damagelaw,DamageLawEnum);
++	switch(damagelaw){
++		case 1:
++			this->CreateDamageFInputPralong(element);
++			break;
++		case 2:
++			this->CreateDamageFInputPralong(element);
++			break;
++		case 3:
++			this->CreateDamageFInputExp(element);
++			break;
++		default:
++			_error_("not implemented yet");
+ 	}
+-	else if(damagelaw==3){
+-		this->CreateDamageFInputExp(basalelement);
++
++	Input* damaged_input = NULL;
++	Input* damagef_input = element->GetInput(DamageFEnum); _assert_(damagef_input);
++	if(domaintype==Domain2DhorizontalEnum){
++		damaged_input = element->GetInput(DamageDbarEnum); _assert_(damaged_input);
+ 	}
+-	Input* damaged_input = basalelement->GetInput(DamageDEnum); _assert_(damaged_input);
+-	Input* damagef_input = basalelement->GetInput(DamageFEnum); _assert_(damagef_input);
++	else{
++		damaged_input = element->GetInput(DamageDEnum); _assert_(damaged_input);
++	}
+ 
+ 
+ 	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=basalelement->NewGauss(2);
++	Gauss* gauss=element->NewGauss(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 		gauss->GaussPoint(ig);
+ 
+-		basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		basalelement->NodalFunctions(basis,gauss);
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		element->NodalFunctions(basis,gauss);
+ 
+ 		damaged_input->GetInputValue(&damage,gauss);
+ 		damagef_input->GetInputValue(&f,gauss);
+@@ -316,11 +329,9 @@
+ 			pe->values[i]+=Jdet*gauss->weight*(damage+dt*f)*basis[i];
+ 		}
+ 	}
+-
+ 	/*Clean up and return*/
+ 	xDelete<IssmDouble>(xyz_list);
+ 	xDelete<IssmDouble>(basis);
+-	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 	delete gauss;
+ 	return pe;
+ }/*}}}*/
+@@ -392,25 +403,18 @@
+ 	int domaintype;
+ 	IssmDouble  max_damage;
+ 	int			*doflist = NULL;
+-	Element*   basalelement=NULL;
+ 
+ 	element->FindParam(&domaintype,DomainTypeEnum);
+-	if(domaintype!=Domain2DhorizontalEnum){
+-		if(!element->IsOnBase()) return;
+-		basalelement=element->SpawnBasalElement();
+-	}
+-	else{
+-		basalelement = element;
+-	}
++
+ 	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = basalelement->GetNumberOfNodes();
++	int numnodes = element->GetNumberOfNodes();
+ 
+ 	/*Fetch dof list and allocate solution vector*/
+-	basalelement->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
++	element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
+ 	IssmDouble* newdamage = xNew<IssmDouble>(numnodes);
+ 
+ 	/*Get user-supplied max_damage: */
+-	basalelement->FindParam(&max_damage,DamageMaxDamageEnum);
++	element->FindParam(&max_damage,DamageMaxDamageEnum);
+ 
+ 	/*Use the dof list to index into the solution vector: */
+ 	for(int i=0;i<numnodes;i++){
+@@ -424,16 +428,15 @@
+ 
+ 	/*Get all inputs and parameters*/
+ 	if(domaintype==Domain2DhorizontalEnum){
+-		basalelement->AddInput(DamageDbarEnum,newdamage,element->GetElementType());
++		element->AddInput(DamageDbarEnum,newdamage,element->GetElementType());
+ 	}
+ 	else{
+-		basalelement->AddBasalInput(DamageDEnum,newdamage,element->GetElementType());
++		element->AddInput(DamageDEnum,newdamage,element->GetElementType());
+ 	}
+ 
+ 	/*Free ressources:*/
+ 	xDelete<IssmDouble>(newdamage);
+ 	xDelete<int>(doflist);
+-	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ }/*}}}*/
+ void DamageEvolutionAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+@@ -445,10 +448,10 @@
+ 
+ 	/*Intermediaries */
+ 	IssmDouble c1,c2,c3,healing,stress_threshold;
+-	IssmDouble s_xx,s_xy,s_yy,s1,s2,stmp;
++	IssmDouble s_xx,s_xy,s_xz,s_yy,s_yz,s_zz,s1,s2,s3,stmp;
+ 	IssmDouble J2s,Chi,Psi,PosPsi,NegPsi;
+-	IssmDouble damage,tau_xx,tau_xy,tau_yy;
+-	int equivstress,domaintype,damagelaw;
++	IssmDouble damage,tau_xx,tau_xy,tau_xz,tau_yy,tau_yz,tau_zz,stressMaxPrincipal;
++	int equivstress,domaintype,damagelaw,dim;
+ 
+ 	/*Fetch number of vertices and allocate output*/
+ 	int numnodes = element->GetNumberOfNodes();
+@@ -463,13 +466,32 @@
+ 	element->FindParam(&domaintype,DomainTypeEnum);
+ 	element->FindParam(&damagelaw,DamageLawEnum);
+ 
+-	/*Compute stress tensor: */
++	/*Get problem dimension*/
++	switch(domaintype){
++		case Domain2DhorizontalEnum: dim = 2; break;
++		case Domain3DEnum:           dim = 3; break;
++		default: _error_("not implemented");
++	}
++	/*Compute stress tensor and Stress Max Principal: */
+ 	element->ComputeDeviatoricStressTensor();
+-
++	if(dim==3){
++		/*Only works in 3d because the pressure is defined*/
++		element->StressMaxPrincipalCreateInput();
++	}
+ 	/*retrieve what we need: */
+ 	Input* tau_xx_input  = element->GetInput(DeviatoricStressxxEnum);     _assert_(tau_xx_input);
+ 	Input* tau_xy_input  = element->GetInput(DeviatoricStressxyEnum);     _assert_(tau_xy_input);
+ 	Input* tau_yy_input  = element->GetInput(DeviatoricStressyyEnum);     _assert_(tau_yy_input);
++	Input* tau_xz_input  = NULL;
++	Input* tau_yz_input  = NULL;
++	Input* tau_zz_input  = NULL;
++	Input* stressMaxPrincipal_input = NULL;
++	if(dim==3){
++		tau_xz_input  = element->GetInput(DeviatoricStressxzEnum);     _assert_(tau_xz_input);
++		tau_yz_input  = element->GetInput(DeviatoricStressyzEnum);     _assert_(tau_yz_input);
++		tau_zz_input  = element->GetInput(DeviatoricStresszzEnum);     _assert_(tau_zz_input);
++		stressMaxPrincipal_input = element->GetInput(StressMaxPrincipalEnum); _assert_(stressMaxPrincipal_input);
++	}
+ 	Input* damage_input = NULL;
+ 	if(domaintype==Domain2DhorizontalEnum){
+ 		damage_input = element->GetInput(DamageDbarEnum); 	_assert_(damage_input);
+@@ -490,37 +512,66 @@
+ 		tau_xx_input->GetInputValue(&tau_xx,gauss);
+ 		tau_xy_input->GetInputValue(&tau_xy,gauss);
+ 		tau_yy_input->GetInputValue(&tau_yy,gauss);
+-	
++		if(dim==3){
++			tau_xz_input->GetInputValue(&tau_xz,gauss);
++			tau_yz_input->GetInputValue(&tau_yz,gauss);
++			tau_zz_input->GetInputValue(&tau_zz,gauss);
++		}
+ 		/*Calculate effective stress components*/
+ 		s_xx=tau_xx/(1.-damage);
+ 		s_xy=tau_xy/(1.-damage);
+ 		s_yy=tau_yy/(1.-damage);
+-
++		if(dim==3){
++			s_xz=tau_xz/(1.-damage);
++			s_yz=tau_yz/(1.-damage);
++			s_zz=tau_zz/(1.-damage);
++		}
+ 		/*Calculate principal effective stresses*/
+-		s1=(s_xx+s_yy)/2.+sqrt(pow((s_xx-s_yy)/2.,2)+pow(s_xy,2));
+-		s2=(s_xx+s_yy)/2.-sqrt(pow((s_xx-s_yy)/2.,2)+pow(s_xy,2));
+-		if(fabs(s2)>fabs(s1)){stmp=s2; s2=s1; s1=stmp;}
++		if(dim==2){
++			s1=(s_xx+s_yy)/2.+sqrt(pow((s_xx-s_yy)/2.,2)+pow(s_xy,2));
++			s2=(s_xx+s_yy)/2.-sqrt(pow((s_xx-s_yy)/2.,2)+pow(s_xy,2));
++			if(fabs(s2)>fabs(s1)){stmp=s2; s2=s1; s1=stmp;}
+ 
+-		if(equivstress==0){ /* von Mises */
+-			Chi=sqrt(s1*s1-s1*s2+s2*s2);
+-		}
+-		else if(equivstress==1){ /* max principal stress */
+-			Chi=s1;
+-		}
+-		Psi=Chi-stress_threshold;
+-		NegPsi=max(-Chi,0.); /* healing only for compressive stresses */
++			if(equivstress==0){ /* von Mises */
++				Chi=sqrt(s1*s1-s1*s2+s2*s2);
++			}
++			else if(equivstress==1){ /* max principal stress */
++				Chi=s1;
++			}
++			Psi=Chi-stress_threshold;
++			NegPsi=max(-Chi,0.); /* healing only for compressive stresses */
+ 
+-		if(damagelaw==1){
+-			PosPsi=max(Psi,0.);
+-			f[i]= c1*(pow(PosPsi,c2) - healing*pow(NegPsi,c2))*pow((1./(1.-damage)),c3);
++			if(damagelaw==1){
++				PosPsi=max(Psi,0.);
++				f[i]= c1*(pow(PosPsi,c2) - healing*pow(NegPsi,c2))*pow((1./(1.-damage)),c3);
++			}
++			else if(damagelaw==2){
++				PosPsi=max(Psi,1.);
++				f[i]= c1*(pow(log10(PosPsi),c2) - healing*pow(NegPsi,c2))*pow((1./(1.-damage)),c3);
++			}
++			else _error_("damage law not supported");
+ 		}
+-		else if(damagelaw==2){
+-			PosPsi=max(Psi,1.);
+-			f[i]= c1*(pow(log10(PosPsi),c2) - healing*pow(NegPsi,c2))*pow((1./(1.-damage)),c3);
++		else{
++			if(equivstress==1){/* max principal stress */
++				stressMaxPrincipal_input->GetInputValue(&stressMaxPrincipal,gauss);
++				Chi=stressMaxPrincipal/(1.-damage);
++			}
++			else if(equivstress==0){/* von Mises */
++				Chi=sqrt(((s_xx-s_yy)*(s_xx-s_yy)+(s_yy-s_zz)*(s_yy-s_zz)+(s_zz-s_xx)*(s_zz-s_xx)+6.*(s_xy*s_xy+s_yz*s_yz+s_xz*s_xz))/2.);
++			}
++			Psi=Chi-stress_threshold;
++			NegPsi=max(-Chi,0.); /* healing only for compressive stresses */
++			if(damagelaw==1){
++				PosPsi=max(Psi,0.);
++				f[i]= c1*(pow(PosPsi,c2) - healing*pow(NegPsi,c2))*pow((1./(1.-damage)),c3);
++			}
++			else if(damagelaw==2){
++				PosPsi=max(Psi,1.);
++				f[i]= c1*(pow(log10(PosPsi),c2) - healing*pow(NegPsi,c2))*pow((1./(1.-damage)),c3);
++			}
++			else _error_("damage law not supported");
+ 		}
+-		else _error_("damage law not supported");
+ 	}
+-
+ 	/*Add input*/
+ 	element->AddInput(DamageFEnum,f,element->GetElementType());
+ 	
+Index: ../trunk-jpl/src/c/cores/damage_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/damage_core.cpp	(revision 18469)
++++ ../trunk-jpl/src/c/cores/damage_core.cpp	(revision 18470)
+@@ -33,7 +33,7 @@
+ 		if(VerboseSolution()) _printf0_("   saving results\n");
+ 		femmodel->RequestedOutputsx(&femmodel->results,requested_outputs,numoutputs);
+ 	}
+-	
++
+ 	/*Free resources:*/	
+ 	if(numoutputs){
+ 		for(int i=0;i<numoutputs;i++){
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18469)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18470)
+@@ -1407,7 +1407,7 @@
+ 
+ 		/*Initialize maximum eigne value*/
+ 		if(numroots>0){
+-			max = x[0];
++			max = fabs(x[0]);
+ 		}
+ 		else{
+ 			_error_("No eigen value found");
+@@ -1415,7 +1415,7 @@
+ 
+ 		/*Get max*/
+ 		for(int i=1;i<numroots;i++){
+-			if(x[i]>max) max = x[i];
++			if(fabs(x[i])>max) max = fabs(x[i]);
+ 		}
+ 
+ 		maxprincipal[iv]=max;
+Index: ../trunk-jpl/src/c/classes/Node.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Node.cpp	(revision 18469)
++++ ../trunk-jpl/src/c/classes/Node.cpp	(revision 18470)
+@@ -93,7 +93,6 @@
+ 				analysis_enum==L2ProjectionBaseAnalysisEnum || 
+ 				analysis_enum==BalancethicknessAnalysisEnum ||
+ 				analysis_enum==HydrologyDCInefficientAnalysisEnum ||
+-				analysis_enum==DamageEvolutionAnalysisEnum || 
+ 				analysis_enum==HydrologyDCEfficientAnalysisEnum ||
+ 				analysis_enum==LevelsetAnalysisEnum ||
+ 				analysis_enum==ExtrapolationAnalysisEnum
Index: /issm/oecreview/Archive/18296-19100/ISSM-18470-18471.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18470-18471.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18470-18471.diff	(revision 19102)
@@ -0,0 +1,23 @@
+Index: ../trunk-jpl/src/m/classes/organizer.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/organizer.py	(revision 18470)
++++ ../trunk-jpl/src/m/classes/organizer.py	(revision 18471)
+@@ -150,7 +150,7 @@
+ 
+ 		return bool
+ 	#}}}
+-	def savemodel(self,md):    # {{{
++	def savemodel(self,md, name='default'):    # {{{
+ 
+ 		#check
+ 		if self._currentstep==0:
+@@ -158,7 +158,8 @@
+ 		if self._currentstep>len(self.steps):
+ 			raise RuntimeError("Cannot save model because organizer (org) is not up to date!")
+ 
+-		name=os.path.join(self.repository,self.prefix+'.step#'+self.steps[self._currentstep-1]['string']+'.python')
++		if (name=='default'):
++			name=os.path.join(self.repository,self.prefix+'.step#'+self.steps[self._currentstep-1]['string']+'.python')
+ 		print "saving model as: '%s'" % name
+ 
+ 		#check that md is a model
Index: /issm/oecreview/Archive/18296-19100/ISSM-18471-18472.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18471-18472.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18471-18472.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/classes/Inputs/PentaInput.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/PentaInput.cpp	(revision 18471)
++++ ../trunk-jpl/src/c/classes/Inputs/PentaInput.cpp	(revision 18472)
+@@ -298,7 +298,7 @@
+ 				for(int i=0;i<3;i++) this->values[3+i]=this->values[i];
+ 			}
+ 			else{
+-				for(int i=3;i<6;i++) this->values[i]  =this->values[3+i];
++				for(int i=0;i<3;i++) this->values[i]  =this->values[3+i];
+ 			}
+ 			break;
+ 		default:
Index: /issm/oecreview/Archive/18296-19100/ISSM-18472-18473.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18472-18473.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18472-18473.diff	(revision 19102)
@@ -0,0 +1,25 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp	(revision 18472)
++++ ../trunk-jpl/src/m/contrib/gravity/vfsa.cpp	(revision 18473)
+@@ -484,6 +484,7 @@
+ 
+ 	gsl_matrix_free(a);
+ 	gsl_vector_free(b);
++	gsl_vector_free(x);
+ 	gsl_matrix_free(cov);
+ 
+ }/*}}}*/
+Index: ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 18472)
++++ ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 18473)
+@@ -402,8 +402,6 @@
+ 				consec++;
+ 			}
+ 		}
+-		if(!my_rank){
+-		}
+ 	}
+ 
+ 	m_min->MatrixEqual(m_old);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18473-18474.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18473-18474.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18473-18474.diff	(revision 19102)
@@ -0,0 +1,709 @@
+Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h	(revision 18473)
++++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h	(revision 18474)
+@@ -69,6 +69,7 @@
+ 		ElementMatrix* CreateJacobianMatrixFS(Element* element);
+ 		ElementMatrix* CreateKMatrixFS(Element* element);
+ 		ElementMatrix* CreateKMatrixFSViscousLATH(Element* element);
++		ElementMatrix* CreateKMatrixFSViscousLACR(Element* element);
+ 		ElementMatrix* CreateKMatrixFSViscousXTH(Element* element);
+ 		ElementMatrix* CreateKMatrixFSViscous(Element* element);
+ 		ElementMatrix* CreateKMatrixFSFriction(Element* element);
+@@ -76,6 +77,7 @@
+ 		ElementVector* CreatePVectorFS(Element* element);
+ 		ElementVector* CreatePVectorFSViscous(Element* element);
+ 		ElementVector* CreatePVectorFSViscousLATH(Element* element);
++		ElementVector* CreatePVectorFSViscousLACR(Element* element);
+ 		ElementVector* CreatePVectorFSViscousXTH(Element* element);
+ 		ElementVector* CreatePVectorFSShelf(Element* element);
+ 		ElementVector* CreatePVectorFSFront(Element* element);
+Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18473)
++++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18474)
+@@ -111,7 +111,7 @@
+ 
+ 	/*XTH LATH parameters*/
+ 	iomodel->Constant(&fe_FS,FlowequationFeFSEnum);
+-	if(fe_FS==XTaylorHoodEnum || fe_FS==LATaylorHoodEnum){
++	if(fe_FS==XTaylorHoodEnum || fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum){
+ 		parameters->AddObject(iomodel->CopyConstantObject(AugmentedLagrangianREnum));
+ 		parameters->AddObject(iomodel->CopyConstantObject(AugmentedLagrangianRlambdaEnum));
+ 		parameters->AddObject(iomodel->CopyConstantObject(AugmentedLagrangianThetaEnum));
+@@ -246,7 +246,7 @@
+ 	}
+ 	/*LATH parameters*/
+ 	iomodel->Constant(&fe_FS,FlowequationFeFSEnum);
+-	if(fe_FS==LATaylorHoodEnum){
++	if(fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum){
+ 		iomodel->FetchDataToInput(elements,PressureEnum,0.);
+ 		InputUpdateFromConstantx(elements,0.,SigmaNNEnum);
+ 	}
+@@ -427,15 +427,16 @@
+ 		else if(isFS){  iomodel->Constant(&finiteelement,FlowequationFeFSEnum);
+ 			/*Deduce velocity interpolation from finite element*/
+ 			switch(finiteelement){
+-				case P1P1Enum            : finiteelement = P1Enum;       break;
+-				case P1P1GLSEnum         : finiteelement = P1Enum;       break;
+-				case MINIcondensedEnum   : finiteelement = P1bubbleEnum; break;
+-				case MINIEnum            : finiteelement = P1bubbleEnum; break;
+-				case TaylorHoodEnum      : finiteelement = P2Enum;       break;
+-				case XTaylorHoodEnum     : finiteelement = P2Enum;       break;
+-				case LATaylorHoodEnum    : finiteelement = P2Enum;       break;
+-				case OneLayerP4zEnum     : finiteelement = P2xP4Enum;    break;
+-				case CrouzeixRaviartEnum : finiteelement = P2bubbleEnum; break;
++				case P1P1Enum              : finiteelement = P1Enum;       break;
++				case P1P1GLSEnum           : finiteelement = P1Enum;       break;
++				case MINIcondensedEnum     : finiteelement = P1bubbleEnum; break;
++				case MINIEnum              : finiteelement = P1bubbleEnum; break;
++				case TaylorHoodEnum        : finiteelement = P2Enum;       break;
++				case XTaylorHoodEnum       : finiteelement = P2Enum;       break;
++				case LATaylorHoodEnum      : finiteelement = P2Enum;       break;
++				case LACrouzeixRaviartEnum : finiteelement = P2bubbleEnum; break;
++				case OneLayerP4zEnum       : finiteelement = P2xP4Enum;    break;
++				case CrouzeixRaviartEnum   : finiteelement = P2bubbleEnum; break;
+ 				default: _error_("finite element "<<EnumToStringx(finiteelement)<<" not supported");
+ 			}
+ 		}
+@@ -881,7 +882,7 @@
+ 		femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum);
+ 		if (fe_FS==XTaylorHoodEnum)
+ 		 solutionsequence_la_theta(femmodel);
+-		else if (fe_FS==LATaylorHoodEnum)
++		else if (fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum)
+ 		 solutionsequence_la(femmodel);
+ 		else if(newton>0)
+ 		 solutionsequence_newton(femmodel);
+@@ -2942,6 +2943,8 @@
+ 	 Ke1=CreateKMatrixFSViscousXTH(element);
+ 	else if(fe_FS==LATaylorHoodEnum)
+ 	 Ke1=CreateKMatrixFSViscousLATH(element);
++	else if(fe_FS==LACrouzeixRaviartEnum)
++	 Ke1=CreateKMatrixFSViscousLACR(element);
+ 	else
+ 	 Ke1=CreateKMatrixFSViscous(element);
+ 
+@@ -3085,6 +3088,136 @@
+ 	xDelete<int>(cs_list);
+ 	return Ke;
+ }/*}}}*/
++ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSViscousLACR(Element* element){/*{{{*/
++
++	/*Intermediaries*/
++	int         i,dim,epssize;
++	IssmDouble  r,rl,Jdet,viscosity,DU,DUl;
++	IssmDouble	normal[3];
++	IssmDouble *xyz_list = NULL;
++	IssmDouble *xyz_list_base = NULL;
++
++	/*Get problem dimension*/
++	element->FindParam(&dim,DomainDimensionEnum);
++	element->FindParam(&r,AugmentedLagrangianREnum);
++	if(dim==2) epssize = 3;
++	else       epssize = 6;
++
++	/*Fetch number of nodes and dof for this finite element*/
++	int vnumnodes = element->NumberofNodesVelocity();
++	int pnumnodes = element->GetNumberOfNodes(P1DGEnum);
++	int lnumnodes = element->GetNumberOfNodes(P2Enum);
++	int numdof    = vnumnodes*dim;
++	int pnumdof   = pnumnodes;
++	int lnumdof   = lnumnodes;
++
++	/*Prepare coordinate system list*/
++	int* cs_list = xNew<int>(vnumnodes);
++	if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum;
++	else       for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum;
++
++	/*Initialize Element matrix and vectors*/
++	ElementMatrix* Ke       = element->NewElementMatrix(FSvelocityEnum);
++	IssmDouble*    B        = xNew<IssmDouble>(epssize*numdof);
++	IssmDouble*    Bprime   = xNew<IssmDouble>(epssize*numdof);
++	IssmDouble*    BtBUzawa = xNewZeroInit<IssmDouble>(numdof*pnumdof);
++	IssmDouble*    BU       = xNew<IssmDouble>(pnumdof);
++	IssmDouble*    BprimeU  = xNew<IssmDouble>(numdof);
++	IssmDouble*    D        = xNewZeroInit<IssmDouble>(epssize*epssize);
++
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinates(&xyz_list);
++	Input* vx_input = element->GetInput(VxEnum);     _assert_(vx_input);
++	Input* vy_input = element->GetInput(VyEnum);     _assert_(vy_input);
++	Input* vz_input = NULL;
++	if(dim==3){vz_input = element->GetInput(VzEnum); _assert_(vz_input);}
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss = element->NewGauss(5);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		this->GetBFSvel(B,element,dim,xyz_list,gauss);
++		this->GetBFSprimevel(Bprime,element,dim,xyz_list,gauss);
++
++		element->ViscosityFS(&viscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input);
++		for(i=0;i<epssize;i++)   D[i*epssize+i] = 2*viscosity*gauss->weight*Jdet;
++
++		TripleMultiply(B,epssize,numdof,1,
++					D,epssize,epssize,0,
++					Bprime,epssize,numdof,0,
++					&Ke->values[0],1);
++
++		this->GetBFSUzawa(BU,element,dim,xyz_list,gauss);
++		this->GetBFSprimeUzawa(BprimeU,element,dim,xyz_list,gauss);
++
++		DU = gauss->weight*Jdet*sqrt(r);
++
++		TripleMultiply(BU,1,pnumdof,1,
++					&DU,1,1,0,
++					BprimeU,1,numdof,0,
++					BtBUzawa,1);
++	}
++
++	if(element->IsOnBase() && 0){ 
++		element->FindParam(&rl,AugmentedLagrangianRlambdaEnum);
++		element->GetVerticesCoordinatesBase(&xyz_list_base);
++		element->NormalBase(&normal[0],xyz_list_base);
++
++		IssmDouble* Dlambda  = xNewZeroInit<IssmDouble>(dim*dim);
++		IssmDouble* C        = xNewZeroInit<IssmDouble>(dim*lnumdof);
++		IssmDouble* Cprime   = xNewZeroInit<IssmDouble>(dim*numdof);
++		IssmDouble* CtCUzawa = xNewZeroInit<IssmDouble>(numdof*lnumdof);
++
++		delete gauss;
++		gauss = element->NewGaussBase(5);
++		for(int ig=gauss->begin();ig<gauss->end();ig++){
++			gauss->GaussPoint(ig);
++
++			element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
++			this->GetCFS(C,element,dim,xyz_list,gauss);
++			this->GetCFSprime(Cprime,element,dim,xyz_list,gauss);
++			for(i=0;i<dim;i++) Dlambda[i*dim+i] = gauss->weight*Jdet*sqrt(normal[i]*normal[i])*sqrt(rl);
++			TripleMultiply(C,dim,lnumdof,1,
++						Dlambda,dim,dim,0,
++						Cprime,dim,numdof,0,
++						CtCUzawa,1);
++		}
++
++		/*The sigma naugmentation should not be transformed*/
++		MatrixMultiply(CtCUzawa,lnumdof,numdof,1,
++					CtCUzawa,lnumdof,numdof,0,
++					&Ke->values[0],1);
++
++		/*Delete base part*/
++		xDelete<IssmDouble>(Dlambda);
++		xDelete<IssmDouble>(C);
++		xDelete<IssmDouble>(Cprime);
++		xDelete<IssmDouble>(CtCUzawa);
++		xDelete<IssmDouble>(xyz_list_base);
++	}
++
++	/*Transform Coordinate System*/
++	element->TransformStiffnessMatrixCoord(Ke,cs_list);
++
++	/*The pressure augmentation should not be transformed*/
++	MatrixMultiply(BtBUzawa,pnumdof,numdof,1,
++				BtBUzawa,pnumdof,numdof,0,
++				&Ke->values[0],1);
++
++	/*Clean up and return*/
++	delete gauss;
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(D);
++	xDelete<IssmDouble>(Bprime);
++	xDelete<IssmDouble>(B);
++	xDelete<IssmDouble>(BprimeU);
++	xDelete<IssmDouble>(BU);
++	xDelete<IssmDouble>(BtBUzawa);
++	xDelete<int>(cs_list);
++	return Ke;
++}/*}}}*/
+ ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSViscousXTH(Element* element){/*{{{*/
+ 
+ 	/*Intermediaries*/
+@@ -3450,6 +3583,13 @@
+ 		delete pe2;
+ 		return pe3;
+ 	}
++	else if(fe_FS==LACrouzeixRaviartEnum){
++		ElementVector* pe2=CreatePVectorFSViscousLACR(element);
++		ElementVector* pe3 = new ElementVector(pe,pe2);
++		delete pe;
++		delete pe2;
++		return pe3;
++	}
+ 	return pe;
+ }/*}}}*/
+ ElementVector* StressbalanceAnalysis::CreatePVectorFSFriction(Element* element){/*{{{*/
+@@ -3680,6 +3820,19 @@
+ 		delete petemp;
+ 		delete pe4;
+ 	}
++	else if(fe_FS==LACrouzeixRaviartEnum){
++		ElementVector* pe1=CreatePVectorFSViscous(element);
++		ElementVector* pe2=CreatePVectorFSShelf(element);
++		ElementVector* pe3=CreatePVectorFSFront(element);
++		ElementVector* petemp =new ElementVector(pe1,pe2,pe3);
++		ElementVector* pe4=CreatePVectorFSViscousLACR(element);
++		pe = new ElementVector(petemp,pe4);
++		delete pe1;
++		delete pe2;
++		delete pe3;
++		delete petemp;
++		delete pe4;
++	}
+ 	else{
+ 		ElementVector* pe1=CreatePVectorFSViscous(element);
+ 		ElementVector* pe2=CreatePVectorFSShelf(element);
+@@ -3986,6 +4139,89 @@
+ 		IssmDouble   sigmann;
+ 		IssmDouble*  vbasis = xNew<IssmDouble>(numnodes);
+ 
++		element->GetVerticesCoordinatesBase(&xyz_list_base);
++		element->NormalBase(&bed_normal[0],xyz_list_base);
++
++		delete gauss;
++		gauss=element->NewGaussBase(5);
++		for(int ig=gauss->begin();ig<gauss->end();ig++){
++			gauss->GaussPoint(ig);
++
++			element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
++			element->NodalFunctionsVelocity(vbasis,gauss);
++			sigmann_input->GetInputValue(&sigmann, gauss);
++
++			for(i=0;i<numnodes;i++){
++				pe->values[i*dim+0] += + sigmann*bed_normal[0]*gauss->weight*Jdet*vbasis[i];
++				pe->values[i*dim+1] += + sigmann*bed_normal[1]*gauss->weight*Jdet*vbasis[i];
++				if(dim==3) pe->values[i*dim+2] += + sigmann*bed_normal[2]*gauss->weight*Jdet*vbasis[i];
++			}
++		}
++		xDelete<IssmDouble>(xyz_list_base);
++		xDelete<IssmDouble>(vbasis);
++	}
++
++	/*Transform coordinate system*/
++	//element->TransformLoadVectorCoord(pe,cs_list); Do not transform augmentation
++
++	/*Clean up and return*/
++	delete gauss;
++	xDelete<int>(cs_list);
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(dbasis);
++	return pe;
++}/*}}}*/
++ElementVector* StressbalanceAnalysis::CreatePVectorFSViscousLACR(Element* element){/*{{{*/
++
++	int         i,dim;
++	IssmDouble  Jdet,r,pressure;
++	IssmDouble  bed_normal[3];
++	IssmDouble *xyz_list      = NULL;
++	IssmDouble *xyz_list_base = NULL;
++	Gauss*      gauss         = NULL;
++
++	/*Get problem dimension*/
++	element->FindParam(&dim,DomainDimensionEnum);
++
++	/*Fetch number of nodes and dof for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++
++	/*Prepare coordinate system list*/
++	int* cs_list = xNew<int>(numnodes);
++	if(dim==2) for(i=0;i<numnodes;i++) cs_list[i] = XYEnum;
++	else       for(i=0;i<numnodes;i++) cs_list[i] = XYZEnum;
++
++	/*Initialize vectors*/
++	ElementVector* pe      = element->NewElementVector(FSvelocityEnum);
++	IssmDouble*    dbasis  = xNew<IssmDouble>(3*numnodes);
++
++	/*Retrieve all inputs and parameters*/
++	element->FindParam(&r,AugmentedLagrangianREnum);
++	element->GetVerticesCoordinates(&xyz_list);
++
++	/*Get pressure and sigmann*/
++	Input* pressure_input=element->GetInput(PressureEnum); _assert_(pressure_input);
++	Input* sigmann_input =element->GetInput(SigmaNNEnum);  _assert_(sigmann_input);
++
++	gauss=element->NewGauss(5);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		
++		pressure_input->GetInputValue(&pressure, gauss);
++		element->NodalFunctionsDerivativesVelocity(dbasis,xyz_list,gauss);
++
++		for(i=0;i<numnodes;i++){
++			pe->values[i*dim+0] += pressure*gauss->weight*Jdet*dbasis[0*numnodes+i];
++			pe->values[i*dim+1] += pressure*gauss->weight*Jdet*dbasis[1*numnodes+i];
++			if(dim==3) pe->values[i*dim+2]+= pressure*gauss->weight*Jdet*dbasis[2*numnodes+i];
++		}
++	}
++
++	if(element->IsOnBase()){ 
++		IssmDouble   sigmann;
++		IssmDouble*  vbasis = xNew<IssmDouble>(numnodes);
++
+ 		element->GetVerticesCoordinatesBase(&xyz_list_base);
+ 		element->NormalBase(&bed_normal[0],xyz_list_base);
+ 
+Index: ../trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp	(revision 18473)
++++ ../trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp	(revision 18474)
+@@ -16,8 +16,15 @@
+ void UzawaPressureAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	/*Update elements: */
+-	int finiteelement = P1Enum;
++	int finiteelement;
+ 	int counter=0;
++	int fe_FS;
++
++	iomodel->Constant(&fe_FS,FlowequationFeFSEnum);
++	if(fe_FS=LATaylorHoodEnum) finiteelement = P1Enum;
++	else if(fe_FS=LACrouzeixRaviartEnum) finiteelement = P1DGEnum;
++	else _error_("solution not supported yet");
++
+ 	for(int i=0;i<iomodel->numberofelements;i++){
+ 		if(iomodel->my_elements[i]){
+ 			Element* element=(Element*)elements->GetObjectByOffset(counter);
+@@ -34,7 +41,14 @@
+ }/*}}}*/
+ void UzawaPressureAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 
+-	int finiteelement = P1Enum;
++	int finiteelement;
++	int fe_FS;
++
++	iomodel->Constant(&fe_FS,FlowequationFeFSEnum);
++	if(fe_FS=LATaylorHoodEnum) finiteelement = P1Enum;
++	else if(fe_FS=LACrouzeixRaviartEnum) finiteelement = P1DGEnum;
++	else _error_("solution not supported yet");
++
+ 	::CreateNodes(nodes,iomodel,UzawaPressureAnalysisEnum,finiteelement);
+ }/*}}}*/
+ void UzawaPressureAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+@@ -175,7 +189,10 @@
+ 
+ 	/*Fetch number of nodes and dof for this finite element*/
+ 	int numnodes      = element->GetNumberOfNodes();
+-	int numnodessigma = element->GetNumberOfNodes(P2Enum);
++	int numnodessigma;
++	if(element->element_type==P1Enum) numnodessigma=element->GetNumberOfNodes(P2Enum);
++	else if(element->element_type==P1DGEnum) numnodessigma=element->GetNumberOfNodes(P2Enum);
++	else _error_("finite element not supported yet");
+ 
+ 	element->FindParam(&dim,DomainDimensionEnum);
+ 
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18473)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18474)
+@@ -608,6 +608,7 @@
+ 	XTaylorHoodEnum,
+ 	OneLayerP4zEnum,
+ 	CrouzeixRaviartEnum,
++	LACrouzeixRaviartEnum,
+ 	/*}}}*/
+ 	/*Results{{{*/
+ 	SaveResultsEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18473)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18474)
+@@ -597,6 +597,7 @@
+ 		case XTaylorHoodEnum : return "XTaylorHood";
+ 		case OneLayerP4zEnum : return "OneLayerP4z";
+ 		case CrouzeixRaviartEnum : return "CrouzeixRaviart";
++		case LACrouzeixRaviartEnum : return "LACrouzeixRaviart";
+ 		case SaveResultsEnum : return "SaveResults";
+ 		case BoolExternalResultEnum : return "BoolExternalResult";
+ 		case DoubleExternalResultEnum : return "DoubleExternalResult";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18473)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18474)
+@@ -609,6 +609,7 @@
+ 	      else if (strcmp(name,"XTaylorHood")==0) return XTaylorHoodEnum;
+ 	      else if (strcmp(name,"OneLayerP4z")==0) return OneLayerP4zEnum;
+ 	      else if (strcmp(name,"CrouzeixRaviart")==0) return CrouzeixRaviartEnum;
++	      else if (strcmp(name,"LACrouzeixRaviart")==0) return LACrouzeixRaviartEnum;
+ 	      else if (strcmp(name,"SaveResults")==0) return SaveResultsEnum;
+ 	      else if (strcmp(name,"BoolExternalResult")==0) return BoolExternalResultEnum;
+ 	      else if (strcmp(name,"DoubleExternalResult")==0) return DoubleExternalResultEnum;
+@@ -627,11 +628,11 @@
+ 	      else if (strcmp(name,"MisfitName")==0) return MisfitNameEnum;
+ 	      else if (strcmp(name,"MisfitModelEnum")==0) return MisfitModelEnumEnum;
+ 	      else if (strcmp(name,"MisfitObservation")==0) return MisfitObservationEnum;
+-	      else if (strcmp(name,"MisfitObservationEnum")==0) return MisfitObservationEnumEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
++	      if (strcmp(name,"MisfitObservationEnum")==0) return MisfitObservationEnumEnum;
++	      else if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
+ 	      else if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
+ 	      else if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
+ 	      else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp	(revision 18473)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp	(revision 18474)
+@@ -532,7 +532,48 @@
+ 				}
+ 			}
+ 			break;
++		case LACrouzeixRaviartEnum:
++			_assert_(approximation==FSApproximationEnum);
++			/*P2b velocity*/
++			EdgesPartitioning(&my_edges,iomodel);
++			for(i=0;i<iomodel->numberofvertices;i++){
++				if(iomodel->my_vertices[i]){
++					nodes->AddObject(new Node(id0+i+1,i,lid++,i,iomodel,analysis,FSvelocityEnum));
++				}
++			}
++			for(i=0;i<iomodel->numberofedges;i++){
++				if(my_edges[i]){
++					nodes->AddObject(new Node(id0+iomodel->numberofvertices+i+1,iomodel->numberofvertices+i,lid++,0,iomodel,analysis,FSvelocityEnum));
++				}
++			}
++			id0 = id0+iomodel->numberofvertices+iomodel->numberofedges;
++			if(iomodel->meshelementtype==PentaEnum){
++				FacesPartitioning(&my_faces,iomodel);
++				for(i=0;i<iomodel->numberoffaces;i++){
++					if(iomodel->faces[i*iomodel->facescols+2]==2){/*Vertical quads*/
++						if(my_faces[i]){
++							node = new Node(id0+i+1,iomodel->numberofvertices+iomodel->numberofedges+i,lid++,0,iomodel,analysis,FSvelocityEnum);
++							nodes->AddObject(node);
++						}
++					}
++					else if(iomodel->faces[i*iomodel->facescols+2]==1){/*Triangular base/top*/
++						/*Nothing*/
++					}
++					else{
++						_error_("not supported");
++					}
++				}
++				id0 = id0+iomodel->numberoffaces;
++			}
++			for(i=0;i<iomodel->numberofelements;i++){
++				if(iomodel->my_elements[i]){
++					nodes->AddObject(new Node(id0+i+1,id0-iomodel->nodecounter+i,lid++,0,iomodel,analysis,FSvelocityEnum));
++				}
++			}
+ 
++			/*No pressure*/
++			break;
++
+ 		default:
+ 			_error_("Finite element "<<EnumToStringx(finite_element)<<" not supported yet");
+ 	}
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18473)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18474)
+@@ -2050,6 +2050,17 @@
+ 			tria_node_ids[8]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofelements+3*index+2;
+ 			tria_node_ids[9]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberofelements+3*index+3;
+ 			break;
++		case LACrouzeixRaviartEnum:
++			numnodes        = 7;
++			tria_node_ids   = xNew<int>(numnodes);
++			tria_node_ids[0]=iomodel->nodecounter+iomodel->elements[3*index+0];
++			tria_node_ids[1]=iomodel->nodecounter+iomodel->elements[3*index+1];
++			tria_node_ids[2]=iomodel->nodecounter+iomodel->elements[3*index+2];
++			tria_node_ids[3]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*index+0]+1;
++			tria_node_ids[4]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*index+1]+1;
++			tria_node_ids[5]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*index+2]+1;
++			tria_node_ids[6]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->numberofedges+index+1;
++			break;
+ 		default:
+ 			_error_("Finite element "<<EnumToStringx(finiteelement_type)<<" not supported yet");
+ 	}
+Index: ../trunk-jpl/src/c/classes/Elements/PentaRef.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/PentaRef.cpp	(revision 18473)
++++ ../trunk-jpl/src/c/classes/Elements/PentaRef.cpp	(revision 18474)
+@@ -965,6 +965,7 @@
+ 		case LATaylorHoodEnum:      return NUMNODESP2;
+ 		case OneLayerP4zEnum:       return NUMNODESP2xP4+NUMNODESP1;
+ 		case CrouzeixRaviartEnum:   return NUMNODESP2b+NUMNODESP1;
++		case LACrouzeixRaviartEnum: return NUMNODESP2b;
+ 		default:       _error_("Element type "<<EnumToStringx(finiteelement)<<" not supported yet");
+ 	}
+ 
+@@ -974,14 +975,15 @@
+ int  PentaRef::VelocityInterpolation(int fe_stokes){/*{{{*/
+ 
+ 	switch(fe_stokes){
+-		case P1P1Enum:           return P1Enum;
+-		case P1P1GLSEnum:        return P1Enum;
+-		case MINIcondensedEnum:  return P1bubbleEnum;
+-		case MINIEnum:           return P1bubbleEnum;
+-		case TaylorHoodEnum:     return P2Enum;
+-		case LATaylorHoodEnum:   return P2Enum;
+-		case OneLayerP4zEnum:    return P2xP4Enum;
+-		case CrouzeixRaviartEnum:return P2bubbleEnum;
++		case P1P1Enum:              return P1Enum;
++		case P1P1GLSEnum:           return P1Enum;
++		case MINIcondensedEnum:     return P1bubbleEnum;
++		case MINIEnum:              return P1bubbleEnum;
++		case TaylorHoodEnum:        return P2Enum;
++		case LATaylorHoodEnum:      return P2Enum;
++		case OneLayerP4zEnum:       return P2xP4Enum;
++		case CrouzeixRaviartEnum:   return P2bubbleEnum;
++		case LACrouzeixRaviartEnum: return P2bubbleEnum;
+ 		default:       _error_("Element type "<<EnumToStringx(fe_stokes)<<" not supported yet");
+ 	}
+ 
+@@ -991,14 +993,15 @@
+ int  PentaRef::PressureInterpolation(int fe_stokes){/*{{{*/
+ 
+ 	switch(fe_stokes){
+-		case P1P1Enum:           return P1Enum;
+-		case P1P1GLSEnum:        return P1Enum;
+-		case MINIcondensedEnum:  return P1Enum;
+-		case MINIEnum:           return P1Enum;
+-		case TaylorHoodEnum:     return P1Enum;
+-		case LATaylorHoodEnum:   return NoneEnum;
+-		case OneLayerP4zEnum:    return P1Enum;
+-		case CrouzeixRaviartEnum:return P1DGEnum;
++		case P1P1Enum:              return P1Enum;
++		case P1P1GLSEnum:           return P1Enum;
++		case MINIcondensedEnum:     return P1Enum;
++		case MINIEnum:              return P1Enum;
++		case TaylorHoodEnum:        return P1Enum;
++		case LATaylorHoodEnum:      return NoneEnum;
++		case OneLayerP4zEnum:       return P1Enum;
++		case CrouzeixRaviartEnum:   return P1DGEnum;
++		case LACrouzeixRaviartEnum: return NoneEnum;
+ 		default:       _error_("Element type "<<EnumToStringx(fe_stokes)<<" not supported yet");
+ 	}
+ 
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18473)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18474)
+@@ -2416,6 +2416,29 @@
+ 			penta_node_ids[23]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberoffaces+iomodel->numberofelements+6*index+5;
+ 			penta_node_ids[24]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberoffaces+iomodel->numberofelements+6*index+6;
+ 			break;
++		case LACrouzeixRaviartEnum:
++			numnodes         = 19;
++			penta_node_ids   = xNew<int>(numnodes);
++			penta_node_ids[ 0]=iomodel->nodecounter+iomodel->elements[6*index+0];
++			penta_node_ids[ 1]=iomodel->nodecounter+iomodel->elements[6*index+1];
++			penta_node_ids[ 2]=iomodel->nodecounter+iomodel->elements[6*index+2];
++			penta_node_ids[ 3]=iomodel->nodecounter+iomodel->elements[6*index+3];
++			penta_node_ids[ 4]=iomodel->nodecounter+iomodel->elements[6*index+4];
++			penta_node_ids[ 5]=iomodel->nodecounter+iomodel->elements[6*index+5];
++			penta_node_ids[ 6]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+0]+1;
++			penta_node_ids[ 7]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+1]+1;
++			penta_node_ids[ 8]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+2]+1;
++			penta_node_ids[ 9]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+3]+1;
++			penta_node_ids[10]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+4]+1;
++			penta_node_ids[11]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+5]+1;
++			penta_node_ids[12]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+6]+1;
++			penta_node_ids[13]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+7]+1;
++			penta_node_ids[14]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+8]+1;
++			penta_node_ids[15]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtofaceconnectivity[5*index+2]+1;
++			penta_node_ids[16]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtofaceconnectivity[5*index+3]+1;
++			penta_node_ids[17]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->numberofedges+iomodel->elementtofaceconnectivity[5*index+4]+1;
++			penta_node_ids[18]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->numberofedges+iomodel->numberoffaces+index+1;
++			break;
+ 		default:
+ 			_error_("Finite element "<<EnumToStringx(finiteelement_type)<<" not supported yet");
+ 	}
+Index: ../trunk-jpl/src/c/classes/Elements/TriaRef.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/TriaRef.cpp	(revision 18473)
++++ ../trunk-jpl/src/c/classes/Elements/TriaRef.cpp	(revision 18474)
+@@ -407,23 +407,24 @@
+ int  TriaRef::NumberofNodes(int finiteelement){/*{{{*/
+ 
+ 	switch(finiteelement){
+-		case NoneEnum:              return 0;
+-		case P0Enum:                return NUMNODESP0;
+-		case P1Enum:                return NUMNODESP1;
+-		case P1DGEnum:              return NUMNODESP1;
+-		case P1bubbleEnum:          return NUMNODESP1b;
+-		case P1bubblecondensedEnum: return NUMNODESP1b;
+-		case P2Enum:                return NUMNODESP2;
+-		case P2bubbleEnum:          return NUMNODESP2b;
+-		case P2bubblecondensedEnum: return NUMNODESP2b;
+-		case P1P1Enum:              return NUMNODESP1*2;
+-		case P1P1GLSEnum:           return NUMNODESP1*2;
+-		case MINIcondensedEnum:     return NUMNODESP1b+NUMNODESP1;
+-		case MINIEnum:              return NUMNODESP1b+NUMNODESP1;
+-		case TaylorHoodEnum:        return NUMNODESP2+NUMNODESP1;
+-		case LATaylorHoodEnum:      return NUMNODESP2;
+-		case XTaylorHoodEnum:       return NUMNODESP2+NUMNODESP1;
+-		case CrouzeixRaviartEnum:   return NUMNODESP2b+NUMNODESP1;
++		case NoneEnum:                return 0;
++		case P0Enum:                  return NUMNODESP0;
++		case P1Enum:                  return NUMNODESP1;
++		case P1DGEnum:                return NUMNODESP1;
++		case P1bubbleEnum:            return NUMNODESP1b;
++		case P1bubblecondensedEnum:   return NUMNODESP1b;
++		case P2Enum:                  return NUMNODESP2;
++		case P2bubbleEnum:            return NUMNODESP2b;
++		case P2bubblecondensedEnum:   return NUMNODESP2b;
++		case P1P1Enum:                return NUMNODESP1*2;
++		case P1P1GLSEnum:             return NUMNODESP1*2;
++		case MINIcondensedEnum:       return NUMNODESP1b+NUMNODESP1;
++		case MINIEnum:                return NUMNODESP1b+NUMNODESP1;
++		case TaylorHoodEnum:          return NUMNODESP2+NUMNODESP1;
++		case LATaylorHoodEnum:        return NUMNODESP2;
++		case XTaylorHoodEnum:         return NUMNODESP2+NUMNODESP1;
++		case CrouzeixRaviartEnum:     return NUMNODESP2b+NUMNODESP1;
++		case LACrouzeixRaviartEnum:   return NUMNODESP2b;
+ 		default: _error_("Element type "<<EnumToStringx(finiteelement)<<" not supported yet");
+ 	}
+ 
+@@ -433,14 +434,15 @@
+ int  TriaRef::VelocityInterpolation(int fe_stokes){/*{{{*/
+ 
+ 	switch(fe_stokes){
+-		case P1P1Enum:           return P1Enum;
+-		case P1P1GLSEnum:        return P1Enum;
+-		case MINIcondensedEnum:  return P1bubbleEnum;
+-		case MINIEnum:           return P1bubbleEnum;
+-		case TaylorHoodEnum:     return P2Enum;
+-		case LATaylorHoodEnum:   return P2Enum;
+-		case XTaylorHoodEnum:    return P2Enum;
+-		case CrouzeixRaviartEnum:return P2bubbleEnum;
++		case P1P1Enum:              return P1Enum;
++		case P1P1GLSEnum:           return P1Enum;
++		case MINIcondensedEnum:     return P1bubbleEnum;
++		case MINIEnum:              return P1bubbleEnum;
++		case TaylorHoodEnum:        return P2Enum;
++		case LATaylorHoodEnum:      return P2Enum;
++		case XTaylorHoodEnum:       return P2Enum;
++		case CrouzeixRaviartEnum:   return P2bubbleEnum;
++		case LACrouzeixRaviartEnum: return P2bubbleEnum;
+ 		default:       _error_("Element type "<<EnumToStringx(fe_stokes)<<" not supported yet");
+ 	}
+ 
+@@ -450,14 +452,15 @@
+ int  TriaRef::PressureInterpolation(int fe_stokes){/*{{{*/
+ 
+ 	switch(fe_stokes){
+-		case P1P1Enum:            return P1Enum;
+-		case P1P1GLSEnum:         return P1Enum;
+-		case MINIcondensedEnum:   return P1Enum;
+-		case MINIEnum:            return P1Enum;
+-		case TaylorHoodEnum:      return P1Enum;
+-		case LATaylorHoodEnum:    return NoneEnum;
+-		case XTaylorHoodEnum:     return P1Enum;
+-		case CrouzeixRaviartEnum: return P1DGEnum;
++		case P1P1Enum:              return P1Enum;
++		case P1P1GLSEnum:           return P1Enum;
++		case MINIcondensedEnum:     return P1Enum;
++		case MINIEnum:              return P1Enum;
++		case TaylorHoodEnum:        return P1Enum;
++		case LATaylorHoodEnum:      return NoneEnum;
++		case XTaylorHoodEnum:       return P1Enum;
++		case CrouzeixRaviartEnum:   return P1DGEnum;
++		case LACrouzeixRaviartEnum: return NoneEnum;
+ 		default:       _error_("Element type "<<EnumToStringx(fe_stokes)<<" not supported yet");
+ 	}
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18474-18475.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18474-18475.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18474-18475.diff	(revision 19102)
@@ -0,0 +1,30 @@
+Index: ../trunk-jpl/test/NightlyRun/test701.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test701.m	(revision 18474)
++++ ../trunk-jpl/test/NightlyRun/test701.m	(revision 18475)
+@@ -47,7 +47,7 @@
+ field_names={};
+ field_tolerances={};
+ field_values={};
+-for i={'MINI','MINIcondensed','TaylorHood','XTaylorHood','LATaylorHood','CrouzeixRaviart'}
++for i={'MINI','MINIcondensed','TaylorHood','XTaylorHood','LATaylorHood','CrouzeixRaviart','LACrouzeixRaviart'}
+ 	disp(' ');
+ 	disp(['====== Testing ' i{1} ' Full-Stokes Finite element =====']);
+ 	md.flowequation.fe_FS=i{1};
+Index: ../trunk-jpl/test/Archives/Archive701.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/m/classes/flowequation.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/flowequation.m	(revision 18474)
++++ ../trunk-jpl/src/m/classes/flowequation.m	(revision 18475)
+@@ -138,7 +138,7 @@
+ 			md = checkfield(md,'fieldname','flowequation.isFS','numel',[1],'values',[0 1]);
+ 			md = checkfield(md,'fieldname','flowequation.fe_SSA','values',{'P1','P1bubble','P1bubblecondensed','P2','P2bubble'});
+ 			md = checkfield(md,'fieldname','flowequation.fe_HO' ,'values',{'P1','P1bubble','P1bubblecondensed','P1xP2','P2xP1','P2','P2bubble','P1xP3','P2xP4'});
+-			md = checkfield(md,'fieldname','flowequation.fe_FS' ,'values',{'P1P1','P1P1GLS','MINIcondensed','MINI','TaylorHood','LATaylorHood','XTaylorHood','OneLayerP4z','CrouzeixRaviart'});
++			md = checkfield(md,'fieldname','flowequation.fe_FS' ,'values',{'P1P1','P1P1GLS','MINIcondensed','MINI','TaylorHood','LATaylorHood','XTaylorHood','OneLayerP4z','CrouzeixRaviart','LACrouzeixRaviart'});
+ 			md = checkfield(md,'fieldname','flowequation.augmented_lagrangian_r','numel',[1],'>',0.);
+ 			md = checkfield(md,'fieldname','flowequation.augmented_lagrangian_rlambda','numel',[1],'>',0.);
+ 			md = checkfield(md,'fieldname','flowequation.augmented_lagrangian_rhop','numel',[1],'>',0.);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18475-18476.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18475-18476.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18475-18476.diff	(revision 19102)
@@ -0,0 +1,1377 @@
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18475)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18476)
+@@ -44,108 +44,8 @@
+ 	return Ke;
+ }/*}}}*/
+ ElementVector* AdjointBalancethickness2Analysis::CreatePVector(Element* element){/*{{{*/
++	_error_("Not implemented yet");
+ 
+-	/*Intermediaries */
+-	int         num_responses,i;
+-	IssmDouble  hobs,hu2,weight,Jdet;
+-	IssmDouble  NUMxH2,NUMyH2,DENH2;
+-	IssmDouble  NUMxUbar,NUMyUbar,DENUbar;
+-	IssmDouble  vxobs,vyobs,vxobsbar,vyobsbar,vbarobs2,vbarobs;
+-	IssmDouble  nu,phi,dphi[2];
+-	int        *responses = NULL;
+-	IssmDouble *xyz_list  = NULL;
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-
+-	/*Initialize Element vector and vectors*/
+-	ElementVector* pe     = element->NewElementVector(SSAApproximationEnum);
+-	IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
+-	IssmDouble*    dbasis = xNew<IssmDouble>(2*numnodes);
+-
+-	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinates(&xyz_list);
+-	element->FindParam(&num_responses,InversionNumCostFunctionsEnum);
+-	element->FindParam(&responses,NULL,InversionCostFunctionsEnum);
+-	Input* thicknessobs_input = element->GetInput(InversionThicknessObsEnum);              _assert_(thicknessobs_input);
+-	Input* weights_input      = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+-	Input* potential_input = element->GetInput(PotentialEnum);             _assert_(potential_input);
+-	Input* vxobs_input     = element->GetInput(BalancethicknessVxObsEnum); _assert_(vxobs_input);
+-	Input* vyobs_input     = element->GetInput(BalancethicknessVyObsEnum); _assert_(vyobs_input);
+-	Input* nu_input        = element->GetInput(BalancethicknessNuEnum);    _assert_(nu_input);
+-
+-	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=element->NewGauss(2);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		element->NodalFunctions(basis,gauss);
+-		element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+-
+-		vxobs_input->GetInputValue(&vxobs,gauss);
+-		vyobs_input->GetInputValue(&vyobs,gauss);
+-		nu_input->GetInputValue(&nu,gauss);
+-		potential_input->GetInputValue(&phi,gauss);
+-		potential_input->GetInputDerivativeValue(&dphi[0],xyz_list,gauss);
+-		thicknessobs_input->GetInputValue(&hobs,gauss);
+-
+-		vxobsbar = nu*vxobs;
+-		vyobsbar = nu*vyobs;
+-
+-		vbarobs2 = (nu*nu*vxobs*vxobs + nu*nu*vyobs*vyobs);
+-		vbarobs  = sqrt(vbarobs2);
+-		hu2 = hobs*hobs*vbarobs2;
+-
+-		/*Loop over all requested responses*/
+-		for(int resp=0;resp<num_responses;resp++){
+-			weights_input->GetInputValue(&weight,gauss,responses[resp]);
+-
+-			switch(responses[resp]){
+-				case IrrotationalH2MisfitEnum:
+-					/*J = (H^2 - Hobs^2)^2*/
+-					for(i=0;i<numnodes;i++){
+-						NUMxH2 = 2.*dbasis[0*numnodes+i]*dphi[0]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
+-						NUMyH2 = 2.*dbasis[1*numnodes+i]*dphi[1]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
+-						DENH2 = vbarobs2*vbarobs2+1.e-14;
+-						pe->values[i]+=(NUMxH2+NUMyH2)/DENH2 *weight*Jdet*gauss->weight;
+-					}
+-					break;
+-				case IrrotationalDirectionMisfitEnum:
+-					/*J = 1/2 (vbar ^ gard(phi))^2*/
+-					for(i=0;i<numnodes;i++){
+-						pe->values[i]+= weight*Jdet*gauss->weight*
+-						  nu*nu*(vyobs*dphi[0] - vxobs*dphi[1])*
+-						  (vyobs*dbasis[0*numnodes+i] - vxobs*dbasis[1*numnodes+i]);
+-					}
+-					break;
+-				case Balancethickness2MisfitEnum:
+-					/*J = phi^2*/
+-					//for(i=0;i<numnodes;i++) pe->values[i]+= phi*basis[i]*weight*Jdet*gauss->weight; //OK
+-					/*J = grad phi ^2*/
+-					//for(i=0;i<numnodes;i++) pe->values[i]+= (dphi[0]*dbasis[0*numnodes+i] + dphi[1]*dbasis[1*numnodes+i])*weight*Jdet*gauss->weight; //OK
+-					/*J = (ubar - nu*uobs)^2*/
+-					//for(i=0;i<numnodes;i++){
+-					//	NUMxUbar = (vyobsbar*dphi[0]*dphi[1] - vxobsbar*dphi[1]*dphi[1])*vbarobs*dbasis[0*numnodes+i];
+-					//	NUMyUbar = (vyobsbar*dphi[0]*dphi[0] - vxobsbar*dphi[0]*dphi[1])*vbarobs*dbasis[1*numnodes+i];
+-					//	DENUbar  = pow(dphi[0]*dphi[0] + dphi[1]*dphi[1],3./2.)+1.e-14;
+-					//	pe->values[i]+=(NUMxUbar-NUMyUbar)/DENUbar *weight*Jdet*gauss->weight;
+-					//}
+-					_error_("Not implemented yet");
+-					break;
+-				default:
+-					_error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
+-			}
+-		}
+-	}
+-
+-	/*Clean up and return*/
+-	xDelete<int>(responses);
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(basis);
+-	xDelete<IssmDouble>(dbasis);
+-	delete gauss;
+-	return pe;
+ }/*}}}*/
+ void AdjointBalancethickness2Analysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	_error_("not implemented yet");
+@@ -173,34 +73,11 @@
+ 		case Balancethickness2MisfitEnum:
+ 			/*Nothing, \partial J/\partial k = 0*/
+ 			break;
+-		case IrrotationalH2MisfitEnum:
+-			switch(control_type){
+-				case BalancethicknessApparentMassbalanceEnum:
+-					/*Nothing, \partial J/\partial k = 0*/
+-					break;
+-				case BalancethicknessNuEnum:
+-					GradientJ1Nu(element,gradient,control_index);
+-					break;
+-				default: _error_("control type not supported yet: " << EnumToStringx(control_type));
+-			} 
+-			break;
+-		case IrrotationalDirectionMisfitEnum:
+-			switch(control_type){
+-				case BalancethicknessApparentMassbalanceEnum:
+-					/*Nothing, \partial J/\partial k = 0*/
+-					break;
+-				case BalancethicknessNuEnum:
+-					GradientJ2Nu(element,gradient,control_index); break; //Might need to be renamed ?
+-				default: _error_("control type not supported yet: " << EnumToStringx(control_type));
+-			} 
+-			break;
+ 		default: _error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
+ 	}
+ 
+ 	/*Deal with second term*/
+ 	switch(control_type){
+-		case BalancethicknessApparentMassbalanceEnum: GradientJAdot(element,gradient,control_index); break;
+-		case BalancethicknessNuEnum: /*Nothing: state equations do not depend on k*/ break;
+ 		default: _error_("control type not supported yet: " << EnumToStringx(control_type));
+ 	}
+ 
+@@ -250,120 +127,6 @@
+ 	xDelete<int>(vertexpidlist);
+ 	delete gauss;
+ }/*}}}*/
+-void AdjointBalancethickness2Analysis::GradientJ1Nu(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+-
+-	/*Intermediaries*/
+-	IssmDouble vxobs,vyobs,thicknessobs,weight;
+-	IssmDouble nu,Jdet,dphi[2],dphinorm2,nuvobs2;
+-	IssmDouble *xyz_list= NULL;
+-
+-	/*Fetch number of vertices for this finite element*/
+-	int numvertices = element->GetNumberOfVertices();
+-
+-	/*Initialize some vectors*/
+-	IssmDouble* basis         = xNew<IssmDouble>(numvertices);
+-	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
+-	int*        vertexpidlist = xNew<int>(numvertices);
+-
+-	/*Retrieve all inputs we will be needing: */
+-	element->GetVerticesCoordinates(&xyz_list);
+-	element->GradientIndexing(&vertexpidlist[0],control_index);
+-	Input* weights_input   = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+-	Input* vxobs_input     = element->GetInput(BalancethicknessVxObsEnum); _assert_(vxobs_input);
+-	Input* vyobs_input     = element->GetInput(BalancethicknessVyObsEnum); _assert_(vyobs_input);
+-	Input* nu_input        = element->GetInput(BalancethicknessNuEnum);    _assert_(nu_input);
+-	Input* potential_input = element->GetInput(PotentialEnum);             _assert_(potential_input);
+-	Input* thicknessobs_input=element->GetInput(InversionThicknessObsEnum);_assert_(thicknessobs_input);
+-
+-	Gauss* gauss=element->NewGauss(2);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		element->NodalFunctionsP1(basis,gauss);
+-		weights_input->GetInputValue(&weight,gauss,IrrotationalH2MisfitEnum);
+-		vxobs_input->GetInputValue(&vxobs,gauss);
+-		vyobs_input->GetInputValue(&vyobs,gauss);
+-		nu_input->GetInputValue(&nu,gauss);
+-		potential_input->GetInputDerivativeValue(&dphi[0],xyz_list,gauss);
+-		thicknessobs_input->GetInputValue(&thicknessobs,gauss);
+-
+-		dphinorm2 = dphi[0]*dphi[0] + dphi[1]*dphi[1];
+-		nuvobs2   = nu*nu*(vxobs*vxobs + vyobs*vyobs);
+-
+-		/*Build gradient vector (actually -dJ/da): */
+-		for(int i=0;i<numvertices;i++){
+-			ge[i]+= -weight*Jdet*gauss->weight*basis[i]*(
+-						-2./pow(nu,3) * dphinorm2/(vxobs*vxobs + vyobs*vyobs) * (dphinorm2/nuvobs2 - thicknessobs*thicknessobs) 
+-						);
+-			_assert_(!xIsNan<IssmDouble>(ge[i]));
+-		}
+-	}
+-	gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
+-
+-	/*Clean up and return*/
+-	xDelete<IssmDouble>(ge);
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(basis);
+-	xDelete<int>(vertexpidlist);
+-	delete gauss;
+-}/*}}}*/
+-void AdjointBalancethickness2Analysis::GradientJ2Nu(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+-
+-	/*Intermediaries*/
+-	IssmDouble vxobs,vyobs,thicknessobs,weight;
+-	IssmDouble nu,Jdet,dphi[2],dphinorm2,nuvobs2;
+-	IssmDouble *xyz_list= NULL;
+-
+-	/*Fetch number of vertices for this finite element*/
+-	int numvertices = element->GetNumberOfVertices();
+-
+-	/*Initialize some vectors*/
+-	IssmDouble* basis         = xNew<IssmDouble>(numvertices);
+-	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
+-	int*        vertexpidlist = xNew<int>(numvertices);
+-
+-	/*Retrieve all inputs we will be needing: */
+-	element->GetVerticesCoordinates(&xyz_list);
+-	element->GradientIndexing(&vertexpidlist[0],control_index);
+-	Input* weights_input   = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+-	Input* vxobs_input     = element->GetInput(BalancethicknessVxObsEnum); _assert_(vxobs_input);
+-	Input* vyobs_input     = element->GetInput(BalancethicknessVyObsEnum); _assert_(vyobs_input);
+-	Input* nu_input        = element->GetInput(BalancethicknessNuEnum);    _assert_(nu_input);
+-	Input* potential_input = element->GetInput(PotentialEnum);             _assert_(potential_input);
+-	Input* thicknessobs_input=element->GetInput(InversionThicknessObsEnum);_assert_(thicknessobs_input);
+-
+-	Gauss* gauss=element->NewGauss(2);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		element->NodalFunctionsP1(basis,gauss);
+-		weights_input->GetInputValue(&weight,gauss,IrrotationalDirectionMisfitEnum);
+-		vxobs_input->GetInputValue(&vxobs,gauss);
+-		vyobs_input->GetInputValue(&vyobs,gauss);
+-		nu_input->GetInputValue(&nu,gauss);
+-		potential_input->GetInputDerivativeValue(&dphi[0],xyz_list,gauss);
+-		thicknessobs_input->GetInputValue(&thicknessobs,gauss);
+-
+-		dphinorm2 = dphi[0]*dphi[0] + dphi[1]*dphi[1];
+-		nuvobs2   = nu*vxobs*nu*vxobs + nu*vyobs*nu*vyobs;
+-
+-		/*Build gradient vector (actually -dJ/da): */
+-		for(int i=0;i<numvertices;i++){
+-			ge[i]+= - weight*Jdet*gauss->weight*nu*(vyobs*dphi[0] -vxobs*dphi[1])*(vyobs*dphi[0] -vxobs*dphi[1])*basis[i];
+-			_assert_(!xIsNan<IssmDouble>(ge[i]));
+-		}
+-	}
+-	gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
+-
+-	/*Clean up and return*/
+-	xDelete<IssmDouble>(ge);
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(basis);
+-	xDelete<int>(vertexpidlist);
+-	delete gauss;
+-}/*}}}*/
+ void AdjointBalancethickness2Analysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 	element->InputUpdateFromSolutionOneDof(solution,AdjointEnum);
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.h	(revision 18475)
++++ ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.h	(revision 18476)
+@@ -25,11 +25,12 @@
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		ElementVector* CreatePVectorVolume(Element* element);
+-		ElementVector* CreatePVectorBoundary(Element* element);
+ 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+ 		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+ 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+ 		void UpdateConstraints(FemModel* femmodel);
++
++		/*Specifics*/
++		void CreateDiffusionCoefficient(Element* element);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h	(revision 18475)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h	(revision 18476)
+@@ -28,8 +28,6 @@
+ 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+ 		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+ 		void GradientJAdot(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJ1Nu(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJ2Nu(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+ 		void UpdateConstraints(FemModel* femmodel);
+ };
+Index: ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18475)
++++ ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18476)
+@@ -25,13 +25,13 @@
+ 		}
+ 	}
+ 
+-	iomodel->FetchDataToInput(elements,BalancethicknessApparentMassbalanceEnum);
+-	iomodel->FetchDataToInput(elements,BalancethicknessNuEnum);
+-	iomodel->FetchDataToInput(elements,BalancethicknessVxObsEnum);
+-	iomodel->FetchDataToInput(elements,BalancethicknessVyObsEnum);
+-	iomodel->FetchDataToInput(elements,BalancethicknessThicknessObsEnum);
+-	iomodel->FetchDataToInput(elements,MeshVertexonboundaryEnum);
++	iomodel->FetchDataToInput(elements,ThicknessEnum);
++	iomodel->FetchDataToInput(elements,SurfaceEnum);
++	iomodel->FetchDataToInput(elements,BaseEnum);
+ 	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
++	iomodel->FetchDataToInput(elements,BasalforcingsGroundediceMeltingRateEnum);
++	iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum);
++	iomodel->FetchDataToInput(elements,BalancethicknessThickeningRateEnum);
+ }/*}}}*/
+ void Balancethickness2Analysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 
+@@ -42,7 +42,7 @@
+ 
+ 
+ 	int finiteelement = P1Enum;
+-	IoModelToConstraintsx(constraints,iomodel,BalancethicknessSpcpotentialEnum,Balancethickness2AnalysisEnum,finiteelement);
++	IoModelToConstraintsx(constraints,iomodel,BalancethicknessSpcthicknessEnum,Balancethickness2AnalysisEnum,finiteelement);
+ 
+ }/*}}}*/
+ void Balancethickness2Analysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+@@ -63,7 +63,7 @@
+ ElementMatrix* Balancethickness2Analysis::CreateKMatrix(Element* element){/*{{{*/
+ 
+ 	/*Intermediaries */
+-	IssmDouble Jdet,D_scalar;
++	IssmDouble  Jdet,D;
+ 	IssmDouble* xyz_list = NULL;
+ 
+ 	/*Fetch number of nodes and dof for this finite element*/
+@@ -73,8 +73,12 @@
+ 	ElementMatrix* Ke     = element->NewElementMatrix();
+ 	IssmDouble*    dbasis = xNew<IssmDouble>(2*numnodes);
+ 
++	/*Create input D*/
++	this->CreateDiffusionCoefficient(element);
++
+ 	/*Retrieve all inputs and parameters*/
+ 	element->GetVerticesCoordinates(&xyz_list);
++	Input* D_input = element->GetInput(BalancethicknessDiffusionCoefficientEnum); _assert_(D_input);
+ 
+ 	/* Start  looping on the number of gaussian points: */
+ 	Gauss* gauss=element->NewGauss(2);
+@@ -82,10 +86,11 @@
+ 		gauss->GaussPoint(ig);
+ 		element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+ 		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		D_input->GetInputValue(&D,gauss);
+ 
+ 		for(int i=0;i<numnodes;i++){
+ 			for(int j=0;j<numnodes;j++){
+-				Ke->values[i*numnodes+j] += gauss->weight*Jdet*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j]);
++				Ke->values[i*numnodes+j] += D*gauss->weight*Jdet*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j]);
+ 			}
+ 		}
+ 	}
+@@ -98,20 +103,8 @@
+ }/*}}}*/
+ ElementVector* Balancethickness2Analysis::CreatePVector(Element* element){/*{{{*/
+ 
+-	/*compute all load vectors for this element*/
+-	ElementVector* pe1=CreatePVectorVolume(element);
+-	ElementVector* pe2=CreatePVectorBoundary(element);
+-	ElementVector* pe =new ElementVector(pe1,pe2);
+-
+-	/*clean-up and return*/
+-	delete pe1;
+-	delete pe2;
+-	return pe;
+-}/*}}}*/
+-ElementVector* Balancethickness2Analysis::CreatePVectorVolume(Element* element){/*{{{*/
+-
+ 	/*Intermediaries */
+-	IssmDouble  adot,Jdet;
++	IssmDouble  dhdt,mb,ms,dD[2],db[2],Jdet;
+ 	IssmDouble* xyz_list = NULL;
+ 
+ 	/*Fetch number of nodes and dof for this finite element*/
+@@ -123,7 +116,11 @@
+ 
+ 	/*Retrieve all inputs and parameters*/
+ 	element->GetVerticesCoordinates(&xyz_list);
+-	Input* adot_input   = element->GetInput(BalancethicknessApparentMassbalanceEnum); _assert_(adot_input);
++	Input* ms_input   = element->GetInput(SurfaceforcingsMassBalanceEnum);                _assert_(ms_input);
++	Input* mb_input   = element->GetInput(BasalforcingsGroundediceMeltingRateEnum);       _assert_(mb_input);
++	Input* dhdt_input = element->GetInput(BalancethicknessThickeningRateEnum);            _assert_(dhdt_input);
++	Input* D_input   = element->GetInput(BalancethicknessDiffusionCoefficientEnum);       _assert_(D_input);
++	Input* bed_input  = element->GetInput(BaseEnum);                                      _assert_(bed_input);
+ 
+ 	/* Start  looping on the number of gaussian points: */
+ 	Gauss* gauss=element->NewGauss(2);
+@@ -132,61 +129,21 @@
+ 
+ 		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+ 		element->NodalFunctions(basis,gauss);
+-		adot_input->GetInputValue(&adot,gauss);
+ 
+-		for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*adot*basis[i];
+-	}
++		ms_input->GetInputValue(&ms,gauss);
++		mb_input->GetInputValue(&mb,gauss);
++		dhdt_input->GetInputValue(&dhdt,gauss);
++		bed_input->GetInputDerivativeValue(&db[0],xyz_list,gauss);
++		D_input->GetInputDerivativeValue(&dD[0],xyz_list,gauss);
++		db[0]=0.;
++		db[1]=0.;
+ 
+-	/*Clean up and return*/
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(basis);
+-	delete gauss;
+-	return pe;
+-}/*}}}*/
+-ElementVector* Balancethickness2Analysis::CreatePVectorBoundary(Element* element){/*{{{*/
+-
+-	/*If no front, return NULL*/
+-	if(!element->IsFaceOnBoundary()) return NULL;
+-
+-	/*Intermediaries*/
+-	IssmDouble  Jdet,thickness,vx,vy;
+-	IssmDouble *xyz_list = NULL;
+-	IssmDouble *xyz_list_front = NULL;
+-	IssmDouble  normal[2];
+-
+-	/*Fetch number of nodes for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-
+-	/*Initialize Element vector and other vectors*/
+-	ElementVector* pe    = element->NewElementVector();
+-	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
+-
+-	/*Retrieve all inputs and parameters*/
+-	Input* thickness_input = element->GetInput(BalancethicknessThicknessObsEnum); _assert_(thickness_input);
+-	Input* vx_input        = element->GetInput(BalancethicknessVxObsEnum);        _assert_(vx_input);
+-	Input* vy_input        = element->GetInput(BalancethicknessVyObsEnum);        _assert_(vy_input);
+-
+-	element->GetVerticesCoordinates(&xyz_list);
+-	element->GetIcefrontCoordinates(&xyz_list_front,xyz_list,MaskIceLevelsetEnum);
+-	element->NormalSection(&normal[0],xyz_list_front);
+-
+-	/*Start looping on Gaussian points*/
+-	Gauss* gauss=element->NewGauss(xyz_list,xyz_list_front,3);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-
+-		gauss->GaussPoint(ig);
+-		thickness_input->GetInputValue(&thickness,gauss);
+-		vx_input->GetInputValue(&vx,gauss);
+-		vy_input->GetInputValue(&vy,gauss);
+-		element->JacobianDeterminantSurface(&Jdet,xyz_list_front,gauss);
+-		element->NodalFunctions(basis,gauss);
+-
+-		for(int i=0;i<numnodes;i++) pe->values[i] += Jdet*gauss->weight*thickness*(vx*normal[0] + vy*normal[1])*basis[i];
++		/*Since grad(b) is constant div(D grad(b) ) = grad(D).grad(b)*/
++		for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(ms-mb-dhdt +dD[0]*db[0]+dD[1]*db[1])*basis[i];
+ 	}
+ 
+ 	/*Clean up and return*/
+ 	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(xyz_list_front);
+ 	xDelete<IssmDouble>(basis);
+ 	delete gauss;
+ 	return pe;
+@@ -198,79 +155,55 @@
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+ void Balancethickness2Analysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++	element->InputUpdateFromSolutionOneDof(solution,ThicknessEnum);
++}/*}}}*/
++void Balancethickness2Analysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++	/*Default, do nothing*/
++	return;
++}/*}}}*/
+ 
++/*Specifics*/
++void Balancethickness2Analysis::CreateDiffusionCoefficient(Element* element){/*{{{*/
++
+ 	/*Intermediaries */
+-	int         Hinterpolation;
+-	IssmDouble  vx,vy,vbar,nu,normdphi,dphi[2],H;
+-	IssmDouble* xyz_list = NULL;
+-	int       * doflist  = NULL;
++	IssmDouble       omega,h,mu0,ds[2],Cmu,B;
++	const int        n = 3.;
++	const IssmDouble Hstar = 500.;
++	const IssmDouble Lstar = 500.e+3;
++	IssmDouble *xyz_list  = NULL;
+ 
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes    = element->GetNumberOfNodes();
+-	int numvertices = element->GetNumberOfVertices();
++	/*Fetch number of vertices and allocate output*/
++	int  numnodes = element->GetNumberOfNodes();
++	IssmDouble* D      = xNew<IssmDouble>(numnodes);
++	IssmDouble* Dgradb = xNew<IssmDouble>(numnodes);
+ 
+-	/*Fetch dof list and allocate solution vector*/
+-	element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
+-	IssmDouble* values         = xNew<IssmDouble>(numnodes);
+-	IssmDouble* thickness_list = xNew<IssmDouble>(numvertices);
+-	IssmDouble* vx_list        = xNew<IssmDouble>(numvertices);
+-	IssmDouble* vy_list        = xNew<IssmDouble>(numvertices);
+-
+-	/*Use the dof list to index into the solution vector: */
+-	for(int i=0;i<numnodes;i++){
+-		values[i]=solution[doflist[i]];
+-
+-		/*Check solution*/
+-		if(xIsNan<IssmDouble>(values[i])) _error_("NaN found in solution vector");
+-	}
+-
+-	element->AddInput(PotentialEnum,values,element->GetElementType());
+-
+-	/*Retrieve all inputs and parameters*/
++	/*retrieve what we need: */
+ 	element->GetVerticesCoordinates(&xyz_list);
+-	Input* potential_input = element->GetInput(PotentialEnum);             _assert_(potential_input);
+-	Input* vx_input        = element->GetInput(BalancethicknessVxObsEnum); _assert_(vx_input);
+-	Input* vy_input        = element->GetInput(BalancethicknessVyObsEnum); _assert_(vy_input);
+-	Input* nu_input        = element->GetInput(BalancethicknessNuEnum);    _assert_(nu_input);
+-	Input* thickness_input = element->GetInput(BalancethicknessThicknessObsEnum);             _assert_(thickness_input);
++	Input* thickness_input  = element->GetInput(ThicknessEnum);          _assert_(thickness_input);
++	Input* surface_input    = element->GetInput(SurfaceEnum);            _assert_(surface_input);
++	Input* B_input          = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);
++	IssmDouble rhog = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum);
+ 
+-	switch(element->GetElementType()){
+-		case P1Enum: Hinterpolation = P0Enum; break;
+-		default:     _error_("not implemented");
+-	}
+-
++	/*Calculate damage evolution source term: */
+ 	Gauss* gauss=element->NewGauss();
+-	for (int iv=0;iv<1;iv++){
+-		gauss->GaussNode(Hinterpolation,iv);//P0 Only for now
++	for (int i=0;i<numnodes;i++){
++		gauss->GaussNode(element->GetElementType(),i);
++		
++		B_input->GetInputValue(&B,gauss);
++		thickness_input->GetInputValue(&h,gauss);
++		surface_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);
+ 
+-		vx_input->GetInputValue(&vx,gauss);
+-		vy_input->GetInputValue(&vy,gauss);
+-		nu_input->GetInputValue(&nu,gauss);
+-		thickness_input->GetInputValue(&H,gauss);
+-		potential_input->GetInputDerivativeValue(&dphi[0],xyz_list,gauss);
++		mu0   = pow(2.,(1.-3*n)/(2.*n)) * B;
++		omega = pow(rhog,3) * pow(Hstar,2*(n+1)) * pow(Hstar/Lstar,2*(n+1)) * 1./pow(mu0,n);
++		Cmu   = 0.;
+ 
+-		vx = vx*nu; vy = vy*nu;
+-		vbar = sqrt(vx*vx + vy*vy) + 1.e-10;
+-		normdphi = sqrt(dphi[0]*dphi[0] + dphi[1]*dphi[1]);
+-
+-		thickness_list[iv] = normdphi/vbar;
+-		vx_list[iv]        = -1./H * dphi[0];
+-		vy_list[iv]        = -1./H * dphi[1];
++		D[i] = omega*(ds[0]*ds[0]+ds[1]*ds[1])*pow(h,4)*(1./5.*h - Cmu);
+ 	}
+-	element->AddInput(ThicknessEnum,thickness_list,Hinterpolation);
+-	element->AddInput(VxEnum,vx_list,Hinterpolation);
+-	element->AddInput(VyEnum,vy_list,Hinterpolation);
+ 
++	/*Add input*/
++	element->AddInput(BalancethicknessDiffusionCoefficientEnum,D,element->GetElementType());
++	
+ 	/*Clean up and return*/
++	xDelete<IssmDouble>(D);
+ 	delete gauss;
+-	xDelete<int>(doflist);
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(values);
+-	xDelete<IssmDouble>(thickness_list);
+-	xDelete<IssmDouble>(vx_list);
+-	xDelete<IssmDouble>(vy_list);
+ }/*}}}*/
+-void Balancethickness2Analysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+-	/*Default, do nothing*/
+-	return;
+-}/*}}}*/
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18475)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18476)
+@@ -300,15 +300,7 @@
+ 	BalancethicknessSpcpotentialEnum,
+ 	BalancethicknessApparentMassbalanceEnum,
+ 	Balancethickness2MisfitEnum,
+-	IrrotationalH2MisfitEnum,
+-	IrrotationalDirectionMisfitEnum,
+-	IrrotationalVelMisfitEnum,
+-	IrrotationalAlongGradientNuEnum,
+-	IrrotationalAcrossGradientNuEnum,
+-	BalancethicknessNuEnum,
+-	BalancethicknessVxObsEnum,
+-	BalancethicknessVyObsEnum,
+-	BalancethicknessThicknessObsEnum,
++	BalancethicknessDiffusionCoefficientEnum,
+ 	/*}}}*/
+ 	/*Surfaceforcings{{{*/
+ 	SurfaceforcingsEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18475)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18476)
+@@ -308,15 +308,7 @@
+ 		case BalancethicknessSpcpotentialEnum : return "BalancethicknessSpcpotential";
+ 		case BalancethicknessApparentMassbalanceEnum : return "BalancethicknessApparentMassbalance";
+ 		case Balancethickness2MisfitEnum : return "Balancethickness2Misfit";
+-		case IrrotationalH2MisfitEnum : return "IrrotationalH2Misfit";
+-		case IrrotationalDirectionMisfitEnum : return "IrrotationalDirectionMisfit";
+-		case IrrotationalVelMisfitEnum : return "IrrotationalVelMisfit";
+-		case IrrotationalAlongGradientNuEnum : return "IrrotationalAlongGradientNu";
+-		case IrrotationalAcrossGradientNuEnum : return "IrrotationalAcrossGradientNu";
+-		case BalancethicknessNuEnum : return "BalancethicknessNu";
+-		case BalancethicknessVxObsEnum : return "BalancethicknessVxObs";
+-		case BalancethicknessVyObsEnum : return "BalancethicknessVyObs";
+-		case BalancethicknessThicknessObsEnum : return "BalancethicknessThicknessObs";
++		case BalancethicknessDiffusionCoefficientEnum : return "BalancethicknessDiffusionCoefficient";
+ 		case SurfaceforcingsEnum : return "Surfaceforcings";
+ 		case SMBEnum : return "SMB";
+ 		case SurfaceforcingsMassBalanceEnum : return "SurfaceforcingsMassBalance";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18475)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18476)
+@@ -314,15 +314,7 @@
+ 	      else if (strcmp(name,"BalancethicknessSpcpotential")==0) return BalancethicknessSpcpotentialEnum;
+ 	      else if (strcmp(name,"BalancethicknessApparentMassbalance")==0) return BalancethicknessApparentMassbalanceEnum;
+ 	      else if (strcmp(name,"Balancethickness2Misfit")==0) return Balancethickness2MisfitEnum;
+-	      else if (strcmp(name,"IrrotationalH2Misfit")==0) return IrrotationalH2MisfitEnum;
+-	      else if (strcmp(name,"IrrotationalDirectionMisfit")==0) return IrrotationalDirectionMisfitEnum;
+-	      else if (strcmp(name,"IrrotationalVelMisfit")==0) return IrrotationalVelMisfitEnum;
+-	      else if (strcmp(name,"IrrotationalAlongGradientNu")==0) return IrrotationalAlongGradientNuEnum;
+-	      else if (strcmp(name,"IrrotationalAcrossGradientNu")==0) return IrrotationalAcrossGradientNuEnum;
+-	      else if (strcmp(name,"BalancethicknessNu")==0) return BalancethicknessNuEnum;
+-	      else if (strcmp(name,"BalancethicknessVxObs")==0) return BalancethicknessVxObsEnum;
+-	      else if (strcmp(name,"BalancethicknessVyObs")==0) return BalancethicknessVyObsEnum;
+-	      else if (strcmp(name,"BalancethicknessThicknessObs")==0) return BalancethicknessThicknessObsEnum;
++	      else if (strcmp(name,"BalancethicknessDiffusionCoefficient")==0) return BalancethicknessDiffusionCoefficientEnum;
+ 	      else if (strcmp(name,"Surfaceforcings")==0) return SurfaceforcingsEnum;
+ 	      else if (strcmp(name,"SMB")==0) return SMBEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsMassBalance")==0) return SurfaceforcingsMassBalanceEnum;
+@@ -382,10 +374,7 @@
+ 	      else if (strcmp(name,"FlaimSolution")==0) return FlaimSolutionEnum;
+ 	      else if (strcmp(name,"HydrologyShreveAnalysis")==0) return HydrologyShreveAnalysisEnum;
+ 	      else if (strcmp(name,"HydrologyDCInefficientAnalysis")==0) return HydrologyDCInefficientAnalysisEnum;
+-         else stage=4;
+-   }
+-   if(stage==4){
+-	      if (strcmp(name,"HydrologyDCEfficientAnalysis")==0) return HydrologyDCEfficientAnalysisEnum;
++	      else if (strcmp(name,"HydrologyDCEfficientAnalysis")==0) return HydrologyDCEfficientAnalysisEnum;
+ 	      else if (strcmp(name,"HydrologySolution")==0) return HydrologySolutionEnum;
+ 	      else if (strcmp(name,"MeltingAnalysis")==0) return MeltingAnalysisEnum;
+ 	      else if (strcmp(name,"MasstransportAnalysis")==0) return MasstransportAnalysisEnum;
+@@ -393,7 +382,10 @@
+ 	      else if (strcmp(name,"FreeSurfaceBaseAnalysis")==0) return FreeSurfaceBaseAnalysisEnum;
+ 	      else if (strcmp(name,"FreeSurfaceTopAnalysis")==0) return FreeSurfaceTopAnalysisEnum;
+ 	      else if (strcmp(name,"SurfaceNormalVelocity")==0) return SurfaceNormalVelocityEnum;
+-	      else if (strcmp(name,"ExtrudeFromBaseAnalysis")==0) return ExtrudeFromBaseAnalysisEnum;
++         else stage=4;
++   }
++   if(stage==4){
++	      if (strcmp(name,"ExtrudeFromBaseAnalysis")==0) return ExtrudeFromBaseAnalysisEnum;
+ 	      else if (strcmp(name,"ExtrudeFromTopAnalysis")==0) return ExtrudeFromTopAnalysisEnum;
+ 	      else if (strcmp(name,"DepthAverageAnalysis")==0) return DepthAverageAnalysisEnum;
+ 	      else if (strcmp(name,"SteadystateSolution")==0) return SteadystateSolutionEnum;
+@@ -505,10 +497,7 @@
+ 	      else if (strcmp(name,"Boundary")==0) return BoundaryEnum;
+ 	      else if (strcmp(name,"Converged")==0) return ConvergedEnum;
+ 	      else if (strcmp(name,"Fill")==0) return FillEnum;
+-         else stage=5;
+-   }
+-   if(stage==5){
+-	      if (strcmp(name,"FractionIncrement")==0) return FractionIncrementEnum;
++	      else if (strcmp(name,"FractionIncrement")==0) return FractionIncrementEnum;
+ 	      else if (strcmp(name,"Friction")==0) return FrictionEnum;
+ 	      else if (strcmp(name,"Internal")==0) return InternalEnum;
+ 	      else if (strcmp(name,"MassFlux")==0) return MassFluxEnum;
+@@ -516,7 +505,10 @@
+ 	      else if (strcmp(name,"Misfit")==0) return MisfitEnum;
+ 	      else if (strcmp(name,"Pressure")==0) return PressureEnum;
+ 	      else if (strcmp(name,"PressurePicard")==0) return PressurePicardEnum;
+-	      else if (strcmp(name,"AndroidFrictionCoefficient")==0) return AndroidFrictionCoefficientEnum;
++         else stage=5;
++   }
++   if(stage==5){
++	      if (strcmp(name,"AndroidFrictionCoefficient")==0) return AndroidFrictionCoefficientEnum;
+ 	      else if (strcmp(name,"ResetPenalties")==0) return ResetPenaltiesEnum;
+ 	      else if (strcmp(name,"SegmentOnIceShelf")==0) return SegmentOnIceShelfEnum;
+ 	      else if (strcmp(name,"SurfaceAbsVelMisfit")==0) return SurfaceAbsVelMisfitEnum;
+@@ -628,10 +620,7 @@
+ 	      else if (strcmp(name,"MisfitName")==0) return MisfitNameEnum;
+ 	      else if (strcmp(name,"MisfitModelEnum")==0) return MisfitModelEnumEnum;
+ 	      else if (strcmp(name,"MisfitObservation")==0) return MisfitObservationEnum;
+-         else stage=6;
+-   }
+-   if(stage==6){
+-	      if (strcmp(name,"MisfitObservationEnum")==0) return MisfitObservationEnumEnum;
++	      else if (strcmp(name,"MisfitObservationEnum")==0) return MisfitObservationEnumEnum;
+ 	      else if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
+ 	      else if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
+ 	      else if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
+@@ -639,7 +628,10 @@
+ 	      else if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
+ 	      else if (strcmp(name,"MinVel")==0) return MinVelEnum;
+ 	      else if (strcmp(name,"MaxVel")==0) return MaxVelEnum;
+-	      else if (strcmp(name,"MinVx")==0) return MinVxEnum;
++         else stage=6;
++   }
++   if(stage==6){
++	      if (strcmp(name,"MinVx")==0) return MinVxEnum;
+ 	      else if (strcmp(name,"MaxVx")==0) return MaxVxEnum;
+ 	      else if (strcmp(name,"MaxAbsVx")==0) return MaxAbsVxEnum;
+ 	      else if (strcmp(name,"MinVy")==0) return MinVyEnum;
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 18475)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 18476)
+@@ -40,7 +40,6 @@
+ 			case VyEnum:
+ 			case ThicknessEnum:
+ 			case FrictionCoefficientEnum:
+-			case BalancethicknessNuEnum:
+ 			case BalancethicknessApparentMassbalanceEnum:
+ 				iomodel->FetchData(1,control); 
+ 				break;
+Index: ../trunk-jpl/src/c/cores/balancethickness2_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/balancethickness2_core.cpp	(revision 18475)
++++ ../trunk-jpl/src/c/cores/balancethickness2_core.cpp	(revision 18476)
+@@ -25,8 +25,8 @@
+ 
+ 	if(save_results){
+ 		if(VerboseSolution()) _printf0_("   saving results\n");
+-		int outputs[4] = {ThicknessEnum,PotentialEnum,VxEnum,VyEnum};
+-		femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],4);
++		int outputs[1] = {ThicknessEnum};
++		femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],1);
+ 	}
+ 
+ }
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18475)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18476)
+@@ -592,11 +592,6 @@
+ 				case DragCoefficientAbsGradientEnum:DragCoefficientAbsGradientx(&double_result,elements,nodes,vertices,loads,materials,parameters); break;
+ 				case BalancethicknessMisfitEnum:    BalancethicknessMisfitx(&double_result);                                                        break;
+ 				case Balancethickness2MisfitEnum:   Balancethickness2Misfitx(&double_result); break;
+-				case IrrotationalH2MisfitEnum:      IrrotationalH2Misfitx(&double_result); break;
+-				case IrrotationalDirectionMisfitEnum:  IrrotationalDirectionMisfitx(&double_result); break;
+-				case IrrotationalVelMisfitEnum:        IrrotationalVelMisfitx(&double_result); break;
+-				case IrrotationalAlongGradientNuEnum:  IrrotationalAlongGradientNux(&double_result); break;
+-				case IrrotationalAcrossGradientNuEnum: IrrotationalAcrossGradientNux(&double_result); break;
+ 
+ 			   /*Vector */
+ 				default:
+@@ -1319,58 +1314,8 @@
+ 
+ 		/*If on water, return 0: */
+ 		if(!element->IsIceInElement()) continue;
++		 _error_("Not implemented");
+ 
+-		/* Get node coordinates*/
+-		element->GetVerticesCoordinates(&xyz_list);
+-		Input* weights_input     =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+-		Input* thickness_input   =element->GetInput(ThicknessEnum);                          _assert_(thickness_input);
+-		Input* thicknessobs_input=element->GetInput(InversionThicknessObsEnum);              _assert_(thicknessobs_input);
+-		Input* potential_input   =element->GetInput(PotentialEnum);                          _assert_(potential_input);
+-		Input* vxobs_input       =element->GetInput(BalancethicknessVxObsEnum); _assert_(vxobs_input);
+-		Input* vyobs_input       =element->GetInput(BalancethicknessVyObsEnum); _assert_(vyobs_input);
+-		Input* vx_input          =element->GetInput(VxEnum); _assert_(vx_input);
+-		Input* vy_input          =element->GetInput(VyEnum); _assert_(vy_input);
+-		Input* nu_input       = element->GetInput(BalancethicknessNuEnum);   _assert_(nu_input);
+-
+-		/* Start  looping on the number of gaussian points: */
+-		Gauss* gauss=element->NewGauss(2);
+-		for(int ig=gauss->begin();ig<gauss->end();ig++){
+-
+-			gauss->GaussPoint(ig);
+-
+-			/* Get Jacobian determinant: */
+-			element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-
+-			/*Get all parameters at gaussian point*/
+-			weights_input->GetInputValue(&weight,gauss,Balancethickness2MisfitEnum);
+-			thickness_input->GetInputValue(&thickness,gauss);
+-			thicknessobs_input->GetInputValue(&thicknessobs,gauss);
+-			potential_input->GetInputValue(&potential,gauss);
+-			potential_input->GetInputDerivativeValue(&dpotential[0],xyz_list,gauss);
+-			vxobs_input->GetInputValue(&vxobs,gauss);
+-			vyobs_input->GetInputValue(&vyobs,gauss);
+-			vx_input->GetInputValue(&vxbar,gauss);
+-			vy_input->GetInputValue(&vybar,gauss);
+-			nu_input->GetInputValue(&nu,gauss);
+-
+-			vxbarobs = nu*vxobs;
+-			vybarobs = nu*vyobs;
+-
+-			/*J = (H^2 - Hobs^2)^2*/
+-			J +=0.5*(thickness*thickness - thicknessobs*thicknessobs)*(thickness*thickness - thicknessobs*thicknessobs)*weight*Jdet*gauss->weight;
+-			/*J = phi^2*/
+-			//J +=.5*potential*potential*weight*Jdet*gauss->weight;// OK
+-			/*J = grad phi^2*/
+-			//J +=.5*(dpotential[0]*dpotential[0] + dpotential[1]*dpotential[1])*weight*Jdet*gauss->weight;
+-			/*J = (ubar - nux*uobs)^2*/
+-			//J +=0.5*((vxbarobs - vxbar)*(vxbarobs - vxbar) + (vybarobs - vybar)*(vybarobs - vybar))*weight*Jdet*gauss->weight;
+-			/*J = 1/2 (vbar ^ gard(phi))^2*/
+-			//J += 0.5*(nuy*vyobs*dpotential[0] - nux*vxobs*dpotential[1])*(nuy*vyobs*dpotential[0] - nux*vxobs*dpotential[1])*weight*Jdet*gauss->weight;
+-		}
+-
+-		/*clean up and Return: */
+-		xDelete<IssmDouble>(xyz_list);
+-		delete gauss;
+ 	}
+ 
+ 	/*Sum all J from all cpus of the cluster:*/
+@@ -1382,126 +1327,6 @@
+ 	*presponse=J;
+ 
+ }/*}}}*/
+-void FemModel::IrrotationalH2Misfitx(IssmDouble* presponse){/*{{{*/
+-
+-	/*output: */
+-	IssmDouble J=0.;
+-	IssmDouble J_sum;
+-
+-	IssmDouble  weight,thicknessobs,thickness;
+-	IssmDouble  Jdet;
+-	IssmDouble* xyz_list = NULL;
+-
+-	/*Compute Misfit: */
+-	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
+-
+-		/*If on water, return 0: */
+-		if(!element->IsIceInElement()) continue;
+-
+-		/* Get node coordinates*/
+-		element->GetVerticesCoordinates(&xyz_list);
+-		Input* weights_input     =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+-		Input* thickness_input   =element->GetInput(ThicknessEnum);                          _assert_(thickness_input);
+-		Input* thicknessobs_input=element->GetInput(InversionThicknessObsEnum);              _assert_(thicknessobs_input);
+-
+-		/* Start  looping on the number of gaussian points: */
+-		Gauss* gauss=element->NewGauss(2);
+-		for(int ig=gauss->begin();ig<gauss->end();ig++){
+-
+-			gauss->GaussPoint(ig);
+-			element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-
+-			/*Get all parameters at gaussian point*/
+-			weights_input->GetInputValue(&weight,gauss,IrrotationalH2MisfitEnum);
+-			thickness_input->GetInputValue(&thickness,gauss);
+-			thicknessobs_input->GetInputValue(&thicknessobs,gauss);
+-
+-			/*J = (H^2 - Hobs^2)^2*/
+-			J +=0.5*(thickness*thickness - thicknessobs*thicknessobs)*(thickness*thickness - thicknessobs*thicknessobs)*weight*Jdet*gauss->weight;
+-		}
+-
+-		/*clean up and Return: */
+-		xDelete<IssmDouble>(xyz_list);
+-		delete gauss;
+-	}
+-
+-	/*Sum all J from all cpus of the cluster:*/
+-	ISSM_MPI_Reduce (&J,&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+-	ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
+-	J=J_sum;
+-
+-	/*Assign output pointers: */
+-	*presponse=J;
+-
+-}/*}}}*/
+-void FemModel::IrrotationalDirectionMisfitx(IssmDouble* presponse){/*{{{*/
+-
+-	/*output: */
+-	IssmDouble J=0.;
+-	IssmDouble J_sum;
+-
+-	IssmDouble  weight,thicknessobs,thickness,dpotential[2];
+-	IssmDouble  vx,vy,vxobs,vyobs,nu;
+-	IssmDouble  Jdet;
+-	IssmDouble* xyz_list = NULL;
+-
+-	/*Compute Misfit: */
+-	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
+-
+-		/*If on water, return 0: */
+-		if(!element->IsIceInElement()) continue;
+-
+-		/* Get node coordinates*/
+-		element->GetVerticesCoordinates(&xyz_list);
+-		Input* weights_input     =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+-		Input* potential_input   =element->GetInput(PotentialEnum);                          _assert_(potential_input);
+-		Input* vxobs_input       =element->GetInput(BalancethicknessVxObsEnum);              _assert_(vxobs_input);
+-		Input* vyobs_input       =element->GetInput(BalancethicknessVyObsEnum);              _assert_(vyobs_input);
+-		Input* nu_input          = element->GetInput(BalancethicknessNuEnum);                _assert_(nu_input);
+-
+-		/* Start  looping on the number of gaussian points: */
+-		Gauss* gauss=element->NewGauss(2);
+-		for(int ig=gauss->begin();ig<gauss->end();ig++){
+-
+-			gauss->GaussPoint(ig);
+-			element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-
+-			/*Get all parameters at gaussian point*/
+-			weights_input->GetInputValue(&weight,gauss,IrrotationalDirectionMisfitEnum);
+-			potential_input->GetInputDerivativeValue(&dpotential[0],xyz_list,gauss);
+-			vxobs_input->GetInputValue(&vxobs,gauss);
+-			vyobs_input->GetInputValue(&vyobs,gauss);
+-			nu_input->GetInputValue(&nu,gauss);
+-
+-			/*J = 1/2 (vbar ^ gard(phi))^2*/
+-			J += 0.5*(nu*vyobs*dpotential[0] - nu*vxobs*dpotential[1])*(nu*vyobs*dpotential[0] - nu*vxobs*dpotential[1])*weight*Jdet*gauss->weight;
+-		}
+-
+-		/*clean up and Return: */
+-		xDelete<IssmDouble>(xyz_list);
+-		delete gauss;
+-	}
+-
+-	/*Sum all J from all cpus of the cluster:*/
+-	ISSM_MPI_Reduce (&J,&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+-	ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
+-	J=J_sum;
+-
+-	/*Assign output pointers: */
+-	*presponse=J;
+-
+-}/*}}}*/
+-void FemModel::IrrotationalVelMisfitx(IssmDouble* presponse){/*{{{*/
+-	_error_("not implemented yet");
+-}/*}}}*/
+-void FemModel::IrrotationalAlongGradientNux(IssmDouble* presponse){/*{{{*/
+-	_error_("not implemented yet");
+-}/*}}}*/
+-void FemModel::IrrotationalAcrossGradientNux(IssmDouble* presponse){/*{{{*/
+-	_error_("not implemented yet");
+-}/*}}}*/
+ void FemModel::ThicknessAbsGradientx( IssmDouble* pJ){/*{{{*/
+ 
+ 	/*output: */
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18475)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18476)
+@@ -1031,7 +1031,6 @@
+ 				/*No yts conversion*/
+ 				case ThicknessEnum:
+ 				case FrictionCoefficientEnum:
+-				case BalancethicknessNuEnum:
+ 					if(iomodel->Data(control)){
+ 						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data(control)[tria_vertex_ids[j]-1];
+ 						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i];
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18475)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18476)
+@@ -1052,8 +1052,6 @@
+ 				name==BaseEnum ||
+ 				name==BedEnum ||
+ 				name==BalancethicknessThickeningRateEnum ||
+-				name==BalancethicknessApparentMassbalanceEnum ||
+-				name==BalancethicknessNuEnum ||
+ 				name==SigmaNNEnum ||
+ 				name==SurfaceSlopeXEnum ||
+ 				name==SurfaceSlopeYEnum ||
+Index: ../trunk-jpl/src/c/classes/FemModel.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.h	(revision 18475)
++++ ../trunk-jpl/src/c/classes/FemModel.h	(revision 18476)
+@@ -80,11 +80,6 @@
+ 		void ElementResponsex(IssmDouble* presponse,int response_enum);
+ 		void BalancethicknessMisfitx(IssmDouble* pV);
+ 		void Balancethickness2Misfitx(IssmDouble* pV);
+-		void IrrotationalH2Misfitx(IssmDouble* pV);
+-		void IrrotationalDirectionMisfitx(IssmDouble* pV);
+-		void IrrotationalVelMisfitx(IssmDouble* pV);
+-		void IrrotationalAlongGradientNux(IssmDouble* pV);
+-		void IrrotationalAcrossGradientNux(IssmDouble* pV);
+ 		#ifdef  _HAVE_DAKOTA_
+ 		void DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses);
+ 		#endif
+Index: ../trunk-jpl/src/dox/issm.dox
+===================================================================
+--- ../trunk-jpl/src/dox/issm.dox	(revision 18475)
++++ ../trunk-jpl/src/dox/issm.dox	(revision 18476)
+@@ -46,44 +46,29 @@
+ <th  bgcolor=#7AA9DD style="text-align:left;">Language</th><th  bgcolor=#7AA9DD style="text-align:right;">files</th><th  bgcolor=#7AA9DD style="text-align:right;">blank</th><th  bgcolor=#7AA9DD style="text-align:right;">comment</th><th  bgcolor=#7AA9DD style="text-align:right;">code</th><th  bgcolor=#7AA9DD style="text-align:right;">Total</th>
+ </th>
+ <tr>
+-<th  bgcolor=#FFFFFF style="text-align:left;"> C++ </th><td  bgcolor=#FFFFFF style="text-align:right;">453</td><td  bgcolor=#FFFFFF style="text-align:right;">15861</td><td  bgcolor=#FFFFFF style="text-align:right;">18188</td><td  bgcolor=#FFFFFF style="text-align:right;">68849</td><td  bgcolor=#FFFFFF style="text-align:right;">102898</td>
++<th  bgcolor=#FFFFFF style="text-align:left;"> C++ </th><td  bgcolor=#FFFFFF style="text-align:right;">445</td><td  bgcolor=#FFFFFF style="text-align:right;">15967</td><td  bgcolor=#FFFFFF style="text-align:right;">16145</td><td  bgcolor=#FFFFFF style="text-align:right;">70397</td><td  bgcolor=#FFFFFF style="text-align:right;">102509</td>
+ </tr>
+ <tr>
+-<th  bgcolor=#C6E2FF style="text-align:left;"> MATLAB </th><td  bgcolor=#C6E2FF style="text-align:right;">1378</td><td  bgcolor=#C6E2FF style="text-align:right;">8341</td><td  bgcolor=#C6E2FF style="text-align:right;">16259</td><td  bgcolor=#C6E2FF style="text-align:right;">38645</td><td  bgcolor=#C6E2FF style="text-align:right;">63245</td>
++<th  bgcolor=#C6E2FF style="text-align:left;"> MATLAB </th><td  bgcolor=#C6E2FF style="text-align:right;">1422</td><td  bgcolor=#C6E2FF style="text-align:right;">8497</td><td  bgcolor=#C6E2FF style="text-align:right;">16638</td><td  bgcolor=#C6E2FF style="text-align:right;">39538</td><td  bgcolor=#C6E2FF style="text-align:right;">64673</td>
+ </tr>
+ <tr>
+-<th  bgcolor=#FFFFFF style="text-align:left;"> C/C++  Header </th><td  bgcolor=#FFFFFF style="text-align:right;">421</td><td  bgcolor=#FFFFFF style="text-align:right;">3504</td><td  bgcolor=#FFFFFF style="text-align:right;">3753</td><td  bgcolor=#FFFFFF style="text-align:right;">15489</td><td  bgcolor=#FFFFFF style="text-align:right;">22746</td>
++<th  bgcolor=#FFFFFF style="text-align:left;"> C/C++  Header </th><td  bgcolor=#FFFFFF style="text-align:right;">411</td><td  bgcolor=#FFFFFF style="text-align:right;">3443</td><td  bgcolor=#FFFFFF style="text-align:right;">3528</td><td  bgcolor=#FFFFFF style="text-align:right;">15243</td><td  bgcolor=#FFFFFF style="text-align:right;">22214</td>
+ </tr>
+ <tr>
+-<th  bgcolor=#C6E2FF style="text-align:left;"> m4 </th><td  bgcolor=#C6E2FF style="text-align:right;">9</td><td  bgcolor=#C6E2FF style="text-align:right;">1588</td><td  bgcolor=#C6E2FF style="text-align:right;">151</td><td  bgcolor=#C6E2FF style="text-align:right;">11565</td><td  bgcolor=#C6E2FF style="text-align:right;">13304</td>
++<th  bgcolor=#C6E2FF style="text-align:left;"> m4 </th><td  bgcolor=#C6E2FF style="text-align:right;">8</td><td  bgcolor=#C6E2FF style="text-align:right;">1036</td><td  bgcolor=#C6E2FF style="text-align:right;">149</td><td  bgcolor=#C6E2FF style="text-align:right;">9756</td><td  bgcolor=#C6E2FF style="text-align:right;">10941</td>
+ </tr>
+ <tr>
+-<th  bgcolor=#FFFFFF style="text-align:left;"> Python </th><td  bgcolor=#FFFFFF style="text-align:right;">144</td><td  bgcolor=#FFFFFF style="text-align:right;">2330</td><td  bgcolor=#FFFFFF style="text-align:right;">2559</td><td  bgcolor=#FFFFFF style="text-align:right;">9348</td><td  bgcolor=#FFFFFF style="text-align:right;">14237</td>
++<th  bgcolor=#FFFFFF style="text-align:left;"> Python </th><td  bgcolor=#FFFFFF style="text-align:right;">151</td><td  bgcolor=#FFFFFF style="text-align:right;">2421</td><td  bgcolor=#FFFFFF style="text-align:right;">2623</td><td  bgcolor=#FFFFFF style="text-align:right;">9733</td><td  bgcolor=#FFFFFF style="text-align:right;">14777</td>
+ </tr>
+ <tr>
+-<th  bgcolor=#C6E2FF style="text-align:left;"> XML </th><td  bgcolor=#C6E2FF style="text-align:right;">4</td><td  bgcolor=#C6E2FF style="text-align:right;">160</td><td  bgcolor=#C6E2FF style="text-align:right;">92</td><td  bgcolor=#C6E2FF style="text-align:right;">3075</td><td  bgcolor=#C6E2FF style="text-align:right;">3327</td>
+-</tr>
+-<tr>
+-<th  bgcolor=#FFFFFF style="text-align:left;"> Java </th><td  bgcolor=#FFFFFF style="text-align:right;">18</td><td  bgcolor=#FFFFFF style="text-align:right;">719</td><td  bgcolor=#FFFFFF style="text-align:right;">891</td><td  bgcolor=#FFFFFF style="text-align:right;">2321</td><td  bgcolor=#FFFFFF style="text-align:right;">3931</td>
+-</tr>
+-<tr>
+ <th  bgcolor=#C6E2FF style="text-align:left;"> Fortran  77 </th><td  bgcolor=#C6E2FF style="text-align:right;">7</td><td  bgcolor=#C6E2FF style="text-align:right;">4</td><td  bgcolor=#C6E2FF style="text-align:right;">302</td><td  bgcolor=#C6E2FF style="text-align:right;">365</td><td  bgcolor=#C6E2FF style="text-align:right;">671</td>
+ </tr>
+ <tr>
+-<th  bgcolor=#FFFFFF style="text-align:left;"> Bourne  Shell </th><td  bgcolor=#FFFFFF style="text-align:right;">3</td><td  bgcolor=#FFFFFF style="text-align:right;">61</td><td  bgcolor=#FFFFFF style="text-align:right;">88</td><td  bgcolor=#FFFFFF style="text-align:right;">266</td><td  bgcolor=#FFFFFF style="text-align:right;">415</td>
++<th  bgcolor=#FFFFFF style="text-align:left;"> Bourne  Shell </th><td  bgcolor=#FFFFFF style="text-align:right;">2</td><td  bgcolor=#FFFFFF style="text-align:right;">59</td><td  bgcolor=#FFFFFF style="text-align:right;">84</td><td  bgcolor=#FFFFFF style="text-align:right;">262</td><td  bgcolor=#FFFFFF style="text-align:right;">405</td>
+ </tr>
+ <tr>
+-<th  bgcolor=#C6E2FF style="text-align:left;"> XSD </th><td  bgcolor=#C6E2FF style="text-align:right;">2</td><td  bgcolor=#C6E2FF style="text-align:right;">30</td><td  bgcolor=#C6E2FF style="text-align:right;">36</td><td  bgcolor=#C6E2FF style="text-align:right;">229</td><td  bgcolor=#C6E2FF style="text-align:right;">295</td>
++<th  bgcolor=#C6E2FF style="text-align:left;"> SUM: </th><td  bgcolor=#C6E2FF style="text-align:right;">2446</td><td  bgcolor=#C6E2FF style="text-align:right;">31427</td><td  bgcolor=#C6E2FF style="text-align:right;">39469</td><td  bgcolor=#C6E2FF style="text-align:right;">145294</td><td  bgcolor=#C6E2FF style="text-align:right;">216190</td>
+ </tr>
+-<tr>
+-<th  bgcolor=#FFFFFF style="text-align:left;"> Perl </th><td  bgcolor=#FFFFFF style="text-align:right;">1</td><td  bgcolor=#FFFFFF style="text-align:right;">6</td><td  bgcolor=#FFFFFF style="text-align:right;">9</td><td  bgcolor=#FFFFFF style="text-align:right;">196</td><td  bgcolor=#FFFFFF style="text-align:right;">211</td>
+-</tr>
+-<tr>
+-<th  bgcolor=#C6E2FF style="text-align:left;"> Ant </th><td  bgcolor=#C6E2FF style="text-align:right;">1</td><td  bgcolor=#C6E2FF style="text-align:right;">16</td><td  bgcolor=#C6E2FF style="text-align:right;">7</td><td  bgcolor=#C6E2FF style="text-align:right;">103</td><td  bgcolor=#C6E2FF style="text-align:right;">126</td>
+-</tr>
+-<tr>
+-<th  bgcolor=#FFFFFF style="text-align:left;"> SUM: </th><td  bgcolor=#FFFFFF style="text-align:right;">2441</td><td  bgcolor=#FFFFFF style="text-align:right;">32620</td><td  bgcolor=#FFFFFF style="text-align:right;">42335</td><td  bgcolor=#FFFFFF style="text-align:right;">150451</td><td  bgcolor=#FFFFFF style="text-align:right;">225406</td>
+-</tr>
+ </table>
+ 
+ 	<I> Copyright (C) 2014 </I>
+Index: ../trunk-jpl/src/m/classes/balancethickness2.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/balancethickness2.m	(revision 18475)
++++ ../trunk-jpl/src/m/classes/balancethickness2.m	(revision 18476)
+@@ -1,63 +0,0 @@
+-%BALANCETHICKNESS2 class definition
+-%
+-%   Usage:
+-%      balancethickness2=balancethickness2();
+-
+-classdef balancethickness2
+-	properties (SetAccess=public) 
+-		spcpotential         = NaN;
+-		apparent_massbalance = NaN;
+-		nu                  = NaN;
+-		vx_obs               = NaN;
+-		vy_obs               = NaN;
+-		thickness_obs        = NaN;
+-	end
+-	methods
+-		function obj = balancethickness2(varargin) % {{{
+-			switch nargin
+-				case 0
+-					obj=setdefaultparameters(obj);
+-				otherwise
+-					error('constructor not supported');
+-			end
+-		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
+-
+-		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
+-			%Early return
+-			if solution~=Balancethickness2SolutionEnum(), return; end
+-
+-			md = checkfield(md,'fieldname','balancethickness.spcpotential','size',[md.mesh.numberofvertices 1]);
+-			md = checkfield(md,'fieldname','balancethickness.apparent_massbalance','size',[md.mesh.numberofvertices 1],'NaN',1);
+-			md = checkfield(md,'fieldname','balancethickness.nu','size',[md.mesh.numberofvertices 1],'NaN',1,'>',0,'<=',1);
+-			md = checkfield(md,'fieldname','balancethickness.vx_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
+-			md = checkfield(md,'fieldname','balancethickness.vy_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
+-			md = checkfield(md,'fieldname','balancethickness.thickness_obs','size',[md.mesh.numberofvertices 1],'NaN',1,'>=',0);
+-		end % }}}
+-		function disp(obj) % {{{
+-			disp(sprintf('   balance thickness solution parameters:'));
+-
+-			fielddisplay(obj,'spcpotential','potential constraints (NaN means no constraint)');
+-			fielddisplay(obj,'apparent_massbalance','Apparent mass balance [m/yr]');
+-			fielddisplay(obj,'nu','v_bar = nu v_s (in ]0 1])');
+-			fielddisplay(obj,'vx_obs','observed vx');
+-			fielddisplay(obj,'vy_obs','observed vy');
+-			fielddisplay(obj,'thickness_obs','observed H');
+-
+-		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'object',obj,'class','Balancethickness','fieldname','spcpotential','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','Balancethickness','fieldname','apparent_massbalance','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','Balancethickness','fieldname','nu','format','DoubleMat','mattype',1);
+-			if(numel(obj.vx_obs)==md.mesh.numberofelements),
+-				mattype=2;
+-			else
+-				mattype=1;
+-			end
+-			WriteData(fid,'object',obj,'class','Balancethickness','fieldname','vx_obs','format','DoubleMat','mattype',mattype);
+-			WriteData(fid,'object',obj,'class','Balancethickness','fieldname','vy_obs','format','DoubleMat','mattype',mattype);
+-			WriteData(fid,'object',obj,'class','Balancethickness','fieldname','thickness_obs','format','DoubleMat','mattype',1);
+-		end % }}}
+-	end
+-end
+Index: ../trunk-jpl/src/m/classes/inversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversion.m	(revision 18475)
++++ ../trunk-jpl/src/m/classes/inversion.m	(revision 18476)
+@@ -238,11 +238,6 @@
+ 			pos=find(obj.cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
+ 			pos=find(obj.cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
+ 			pos=find(obj.cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
+-			pos=find(obj.cost_functions==601); data(pos)=IrrotationalH2MisfitEnum();
+-			pos=find(obj.cost_functions==602); data(pos)=IrrotationalDirectionMisfitEnum();
+-			pos=find(obj.cost_functions==603); data(pos)=IrrotationalVelMisfitEnum();
+-			pos=find(obj.cost_functions==604); data(pos)=IrrotationalAlongGradientNuEnum();
+-			pos=find(obj.cost_functions==605); data(pos)=IrrotationalAcrossGradientNuEnum();
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/m1qn3inversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 18475)
++++ ../trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 18476)
+@@ -169,11 +169,6 @@
+ 			pos=find(obj.cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
+ 			pos=find(obj.cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
+ 			pos=find(obj.cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
+-			pos=find(obj.cost_functions==601); data(pos)=IrrotationalH2MisfitEnum();
+-			pos=find(obj.cost_functions==602); data(pos)=IrrotationalDirectionMisfitEnum();
+-			pos=find(obj.cost_functions==603); data(pos)=IrrotationalVelMisfitEnum();
+-			pos=find(obj.cost_functions==604); data(pos)=IrrotationalAlongGradientNuEnum();
+-			pos=find(obj.cost_functions==605); data(pos)=IrrotationalAcrossGradientNuEnum();
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/inversionvalidation.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 18475)
++++ ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 18476)
+@@ -139,11 +139,6 @@
+ 			pos=find(obj.cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
+ 			pos=find(obj.cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
+ 			pos=find(obj.cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
+-			pos=find(obj.cost_functions==601); data(pos)=IrrotationalH2MisfitEnum();
+-			pos=find(obj.cost_functions==602); data(pos)=IrrotationalDirectionMisfitEnum();
+-			pos=find(obj.cost_functions==603); data(pos)=IrrotationalVelMisfitEnum();
+-			pos=find(obj.cost_functions==604); data(pos)=IrrotationalAlongGradientNuEnum();
+-			pos=find(obj.cost_functions==605); data(pos)=IrrotationalAcrossGradientNuEnum();
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/enum/IrrotationalDirectionMisfitEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/IrrotationalDirectionMisfitEnum.m	(revision 18475)
++++ ../trunk-jpl/src/m/enum/IrrotationalDirectionMisfitEnum.m	(revision 18476)
+@@ -1,11 +0,0 @@
+-function macro=IrrotationalDirectionMisfitEnum()
+-%IRROTATIONALDIRECTIONMISFITENUM - Enum of IrrotationalDirectionMisfit
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=IrrotationalDirectionMisfitEnum()
+-
+-macro=StringToEnum('IrrotationalDirectionMisfit');
+Index: ../trunk-jpl/src/m/enum/BalancethicknessThicknessObsEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BalancethicknessThicknessObsEnum.m	(revision 18475)
++++ ../trunk-jpl/src/m/enum/BalancethicknessThicknessObsEnum.m	(revision 18476)
+@@ -1,11 +0,0 @@
+-function macro=BalancethicknessThicknessObsEnum()
+-%BALANCETHICKNESSTHICKNESSOBSENUM - Enum of BalancethicknessThicknessObs
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=BalancethicknessThicknessObsEnum()
+-
+-macro=StringToEnum('BalancethicknessThicknessObs');
+Index: ../trunk-jpl/src/m/enum/IrrotationalAcrossGradientNuEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/IrrotationalAcrossGradientNuEnum.m	(revision 18475)
++++ ../trunk-jpl/src/m/enum/IrrotationalAcrossGradientNuEnum.m	(revision 18476)
+@@ -1,11 +0,0 @@
+-function macro=IrrotationalAcrossGradientNuEnum()
+-%IRROTATIONALACROSSGRADIENTNUENUM - Enum of IrrotationalAcrossGradientNu
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=IrrotationalAcrossGradientNuEnum()
+-
+-macro=StringToEnum('IrrotationalAcrossGradientNu');
+Index: ../trunk-jpl/src/m/enum/IrrotationalAlongGradientNuEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/IrrotationalAlongGradientNuEnum.m	(revision 18475)
++++ ../trunk-jpl/src/m/enum/IrrotationalAlongGradientNuEnum.m	(revision 18476)
+@@ -1,11 +0,0 @@
+-function macro=IrrotationalAlongGradientNuEnum()
+-%IRROTATIONALALONGGRADIENTNUENUM - Enum of IrrotationalAlongGradientNu
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=IrrotationalAlongGradientNuEnum()
+-
+-macro=StringToEnum('IrrotationalAlongGradientNu');
+Index: ../trunk-jpl/src/m/enum/BalancethicknessVxObsEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BalancethicknessVxObsEnum.m	(revision 18475)
++++ ../trunk-jpl/src/m/enum/BalancethicknessVxObsEnum.m	(revision 18476)
+@@ -1,11 +0,0 @@
+-function macro=BalancethicknessVxObsEnum()
+-%BALANCETHICKNESSVXOBSENUM - Enum of BalancethicknessVxObs
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=BalancethicknessVxObsEnum()
+-
+-macro=StringToEnum('BalancethicknessVxObs');
+Index: ../trunk-jpl/src/m/enum/IrrotationalH2MisfitEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/IrrotationalH2MisfitEnum.m	(revision 18475)
++++ ../trunk-jpl/src/m/enum/IrrotationalH2MisfitEnum.m	(revision 18476)
+@@ -1,11 +0,0 @@
+-function macro=IrrotationalH2MisfitEnum()
+-%IRROTATIONALH2MISFITENUM - Enum of IrrotationalH2Misfit
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=IrrotationalH2MisfitEnum()
+-
+-macro=StringToEnum('IrrotationalH2Misfit');
+Index: ../trunk-jpl/src/m/enum/IrrotationalVelMisfitEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/IrrotationalVelMisfitEnum.m	(revision 18475)
++++ ../trunk-jpl/src/m/enum/IrrotationalVelMisfitEnum.m	(revision 18476)
+@@ -1,11 +0,0 @@
+-function macro=IrrotationalVelMisfitEnum()
+-%IRROTATIONALVELMISFITENUM - Enum of IrrotationalVelMisfit
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=IrrotationalVelMisfitEnum()
+-
+-macro=StringToEnum('IrrotationalVelMisfit');
+Index: ../trunk-jpl/src/m/enum/BalancethicknessVyObsEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BalancethicknessVyObsEnum.m	(revision 18475)
++++ ../trunk-jpl/src/m/enum/BalancethicknessVyObsEnum.m	(revision 18476)
+@@ -1,11 +0,0 @@
+-function macro=BalancethicknessVyObsEnum()
+-%BALANCETHICKNESSVYOBSENUM - Enum of BalancethicknessVyObs
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=BalancethicknessVyObsEnum()
+-
+-macro=StringToEnum('BalancethicknessVyObs');
+Index: ../trunk-jpl/src/m/enum/BalancethicknessNuEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BalancethicknessNuEnum.m	(revision 18475)
++++ ../trunk-jpl/src/m/enum/BalancethicknessNuEnum.m	(revision 18476)
+@@ -1,11 +0,0 @@
+-function macro=BalancethicknessNuEnum()
+-%BALANCETHICKNESSNUENUM - Enum of BalancethicknessNu
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=BalancethicknessNuEnum()
+-
+-macro=StringToEnum('BalancethicknessNu');
+Index: ../trunk-jpl/src/m/enum/BalancethicknessDiffusionCoefficientEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BalancethicknessDiffusionCoefficientEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/BalancethicknessDiffusionCoefficientEnum.m	(revision 18476)
+@@ -0,0 +1,11 @@
++function macro=BalancethicknessDiffusionCoefficientEnum()
++%BALANCETHICKNESSDIFFUSIONCOEFFICIENTENUM - Enum of BalancethicknessDiffusionCoefficient
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=BalancethicknessDiffusionCoefficientEnum()
++
++macro=StringToEnum('BalancethicknessDiffusionCoefficient');
+Index: ../trunk-jpl/src/m/enum/LACrouzeixRaviartEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/LACrouzeixRaviartEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/LACrouzeixRaviartEnum.m	(revision 18476)
+@@ -0,0 +1,11 @@
++function macro=LACrouzeixRaviartEnum()
++%LACROUZEIXRAVIARTENUM - Enum of LACrouzeixRaviart
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=LACrouzeixRaviartEnum()
++
++macro=StringToEnum('LACrouzeixRaviart');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18475)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18476)
+@@ -300,15 +300,7 @@
+ def BalancethicknessSpcpotentialEnum(): return StringToEnum("BalancethicknessSpcpotential")[0]
+ def BalancethicknessApparentMassbalanceEnum(): return StringToEnum("BalancethicknessApparentMassbalance")[0]
+ def Balancethickness2MisfitEnum(): return StringToEnum("Balancethickness2Misfit")[0]
+-def IrrotationalH2MisfitEnum(): return StringToEnum("IrrotationalH2Misfit")[0]
+-def IrrotationalDirectionMisfitEnum(): return StringToEnum("IrrotationalDirectionMisfit")[0]
+-def IrrotationalVelMisfitEnum(): return StringToEnum("IrrotationalVelMisfit")[0]
+-def IrrotationalAlongGradientNuEnum(): return StringToEnum("IrrotationalAlongGradientNu")[0]
+-def IrrotationalAcrossGradientNuEnum(): return StringToEnum("IrrotationalAcrossGradientNu")[0]
+-def BalancethicknessNuEnum(): return StringToEnum("BalancethicknessNu")[0]
+-def BalancethicknessVxObsEnum(): return StringToEnum("BalancethicknessVxObs")[0]
+-def BalancethicknessVyObsEnum(): return StringToEnum("BalancethicknessVyObs")[0]
+-def BalancethicknessThicknessObsEnum(): return StringToEnum("BalancethicknessThicknessObs")[0]
++def BalancethicknessDiffusionCoefficientEnum(): return StringToEnum("BalancethicknessDiffusionCoefficient")[0]
+ def SurfaceforcingsEnum(): return StringToEnum("Surfaceforcings")[0]
+ def SMBEnum(): return StringToEnum("SMB")[0]
+ def SurfaceforcingsMassBalanceEnum(): return StringToEnum("SurfaceforcingsMassBalance")[0]
+@@ -589,6 +581,7 @@
+ def XTaylorHoodEnum(): return StringToEnum("XTaylorHood")[0]
+ def OneLayerP4zEnum(): return StringToEnum("OneLayerP4z")[0]
+ def CrouzeixRaviartEnum(): return StringToEnum("CrouzeixRaviart")[0]
++def LACrouzeixRaviartEnum(): return StringToEnum("LACrouzeixRaviart")[0]
+ def SaveResultsEnum(): return StringToEnum("SaveResults")[0]
+ def BoolExternalResultEnum(): return StringToEnum("BoolExternalResult")[0]
+ def DoubleExternalResultEnum(): return StringToEnum("DoubleExternalResult")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18476-18477.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18476-18477.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18476-18477.diff	(revision 19102)
@@ -0,0 +1,23 @@
+Index: ../trunk-jpl/m4/issm_options.m4
+===================================================================
+--- ../trunk-jpl/m4/issm_options.m4	(revision 18476)
++++ ../trunk-jpl/m4/issm_options.m4	(revision 18477)
+@@ -271,7 +271,7 @@
+   				MEXEXT=".$MEXEXT"
+   			;;
+ 		   *)
+-           MEXLINK=$(mex -v 2>&1 < /dev/null | grep LDFLAGS     | sed -e "s/         LDFLAGS            = //       g" | sed -e "s/-[[^ ]]*mexFunction\\.map//g")
++           MEXLINK=$($MATLAB_ROOT/bin/mex -v 2>&1 < /dev/null | grep LDFLAGS     | sed -e "s/         LDFLAGS            = //g")
+            MEXLIB=$( $MATLAB_ROOT/bin/mex -v 2>&1 < /dev/null | grep CXXLIBS     | sed -e "s/         CXXLIBS            = //g")
+ 		     MEXEXT=$( $MATLAB_ROOT/bin/mex -v 2>&1 < /dev/null | grep LDEXTENSION | sed -e "s/         LDEXTENSION        = //g")
+ 				dnl version 2014 and up
+@@ -286,6 +286,9 @@
+ 					 rm -f conftest.tmp
+ 				fi
+ 
++				dnl Make sure mexFunction.map is not in MEXLIB to avoid problems with global variables
++				MEXLINK=$(echo $MEXLINK | sed -e "s/-[[^ ]]*mexFunction\\.map//g")
++
+   			;;
+       esac
+ 		AC_MSG_RESULT(done)
Index: /issm/oecreview/Archive/18296-19100/ISSM-18477-18478.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18477-18478.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18477-18478.diff	(revision 19102)
@@ -0,0 +1,218 @@
+Index: ../trunk-jpl/src/m/coordsystems/ll2utm.m
+===================================================================
+--- ../trunk-jpl/src/m/coordsystems/ll2utm.m	(revision 18477)
++++ ../trunk-jpl/src/m/coordsystems/ll2utm.m	(revision 18478)
+@@ -1,13 +1,13 @@
+-function [x,y,f]=ll2utm(lat,lon,datum)
++function [x,y,f]=ll2utm(varargin)
+ %LL2UTM Lat/Lon to UTM coordinates precise conversion.
+-%   [X,Y]=LL2UTM2(LAT,LON) or LL2UTM([LAT,LON]) converts coordinates 
++%	[X,Y]=LL2UTM2(LAT,LON) or LL2UTM([LAT,LON]) converts coordinates 
+ %	LAT,LON (in degrees) to UTM X and Y (in meters). Default datum is WGS84.
+ %
+ %	LAT and LON can be scalars, vectors or matrix. Outputs X and Y will
+ %	have the same size as inputs.
+ %
+-%	LL2UTM(LAT,LON,DATUM) uses specific DATUM for conversion. DATUM can be
+-%	a string in the following list:
++%	LL2UTM(...,DATUM) uses specific DATUM for conversion. DATUM can be one
++%	of the following char strings:
+ %		'wgs84': World Geodetic System 1984 (default)
+ %		'nad27': North American Datum 1927
+ %		'clk66': Clarke 1866
+@@ -17,14 +17,17 @@
+ %	or DATUM can be a 2-element vector [A,F] where A is semimajor axis (in
+ %	meters)	and F is flattening of the user-defined ellipsoid.
+ %
+-%	[X,Y,ZONE]=LL2UTM(...) returns also computed UTM ZONE (negative value 
+-%	stands for southern hemisphere points).
++%	LL2UTM(...,ZONE) forces the UTM ZONE (scalar integer) instead of
++%	automatic set.
+ %
++%	[X,Y,ZONE]=LL2UTM(...) returns also the computed UTM ZONE (negative
++%	value for southern hemisphere points).
+ %
+-%	XY = LL2UTM(...) or without any output argument returns a 2-column 
++%
++%	XY=LL2UTM(...) or without any output argument returns a 2-column 
+ %	matrix [X,Y].
+ %
+-%	Notice:
++%	Note:
+ %		- LL2UTM does not perform cross-datum conversion.
+ %		- precision is near a millimeter.
+ %
+@@ -33,9 +36,12 @@
+ %		I.G.N., Projection cartographique Mercator Transverse: Algorithmes,
+ %		   Notes Techniques NT/G 76, janvier 1995.
+ %
+-%   Author: Francois Beauducel, <beauducel@ipgp.fr>
+-%   Created: 2003-12-02
+-%   Updated: 2014-04-20
++%	Acknowledgments: Mathieu.
++%
++%
++%	Author: Francois Beauducel, <beauducel@ipgp.fr>
++%	Created: 2003-12-02
++%	Updated: 2014-08-24
+ 
+ 
+ %	Copyright (c) 2001-2014, François Beauducel, covered by BSD License.
+@@ -73,27 +79,49 @@
+ 	{ 'clk66', 6378206.4, 294.978698214 };
+ ];
+ 
+-if nargin == 1
+-	if size(lat,2) ~= 2
+-		error('Single input argument must be a 2-column matrix [LAT,LON].')
+-	end
+-	lon = lat(:,2);
+-	lat = lat(:,1);
+-end
+-	
++% constants
++D0 = 180/pi;	% conversion rad to deg
++K0 = 0.9996;	% UTM scale factor
++X0 = 500000;	% UTM false East (m)
++
++% defaults
++datum = 'wgs84';
++zone = [];
++
+ if nargin < 1
+ 	error('Not enough input arguments.')
+ end
+ 
++if isnumeric(varargin{1}) & size(varargin{1},2) == 2
++	lat = varargin{1}(:,1);
++	lon = varargin{1}(:,2);
++	v = 1;
++elseif nargin > 1 & isnumeric(varargin{2})
++	lat = varargin{1};
++	lon = varargin{2};
++	v = 2;
++else
++	error('Single input argument must be a 2-column matrix [LAT,LON].')
++end
++
+ if all([numel(lat),numel(lon)] > 1) && any(size(lat) ~= size(lon))
+ 	error('LAT and LON must be the same size or scalars.')
+ end
+ 
+-if nargin < 3
+-	datum = 'wgs84';
++for n = (v+1):nargin
++	% LL2UTM(...,DATUM)
++	if ischar(varargin{n}) | (isnumeric(varargin{n}) & numel(varargin{n})==2)
++		datum = varargin{n};
++	% LL2UTM(...,ZONE)
++	elseif isnumeric(varargin{n}) & isscalar(varargin{n})
++			zone = round(varargin{n});
++	else
++		error('Unknown argument #%d. See documentation.',n)
++	end
+ end
+ 
+ if ischar(datum)
++	% LL2UTM(...,DATUM) with DATUM as char
+ 	if ~any(strcmpi(datum,datums(:,1)))
+ 		error('Unkown DATUM name "%s"',datum);
+ 	end
+@@ -101,28 +129,26 @@
+ 	A1 = datums{k,2};
+ 	F1 = datums{k,3};	
+ else
+-	if numel(datum) ~= 2
+-		error('User defined DATUM must be a vector [A,F].');
+-	end
++	% LL2UTM(...,DATUM) with DATUM as [A,F] user-defined
+ 	A1 = datum(1);
+ 	F1 = datum(2);
+ end
+ 
+-% constants
+-D0 = 180/pi;	% conversion rad to deg
++p1 = lat/D0;			% Phi = Latitude (rad)
++l1 = lon/D0;			% Lambda = Longitude (rad)
+ 
+-K0 = 0.9996;	% UTM scale factor
+-X0 = 500000;	% UTM false East (m)
++% UTM zone automatic setting
++if isempty(zone)
++	F0 = round((l1*D0 + 183)/6);
++else
++	F0 = zone;
++end
+ 
+ B1 = A1*(1 - 1/F1);
+ E1 = sqrt((A1*A1 - B1*B1)/(A1*A1));
+-
+-p1 = lat/D0;					% Phi = Latitude (rad)
+-l1 = lon/D0;					% Lambda = Longitude (rad)
+-F0 = round((l1*D0 + 183)/6);	% UTM zone
+ P0 = 0/D0;
+-L0 = (6*F0 - 183)/D0;			% UTM origin longitude (rad)
+-Y0 = 1e7*(p1 < 0);				% UTM false northern (m)
++L0 = (6*F0 - 183)/D0;		% UTM origin longitude (rad)
++Y0 = 1e7*(p1 < 0);		% UTM false northern (m)
+ N = K0*A1;
+ 
+ C = coef(E1,0);
+@@ -197,4 +223,4 @@
+ 
+ for i = 1:size(c0,1)
+     c(i) = polyval(c0(i,:),e);
+-end
+\ No newline at end of file
++end
+Index: ../trunk-jpl/src/m/coordsystems/utm2ll.m
+===================================================================
+--- ../trunk-jpl/src/m/coordsystems/utm2ll.m	(revision 18477)
++++ ../trunk-jpl/src/m/coordsystems/utm2ll.m	(revision 18478)
+@@ -1,6 +1,6 @@
+ function [lat,lon]=utm2ll(x,y,f,datum,varargin)
+ %UTM2LL UTM to Lat/Lon coordinates precise conversion.
+-%   [LAT,LON]=UTM2LL(X,Y,ZONE) converts UTM coordinates X,Y (in meters)
++%	[LAT,LON]=UTM2LL(X,Y,ZONE) converts UTM coordinates X,Y (in meters)
+ %	defined in the UTM ZONE (integer) to latitude LAT and longitude LON 
+ %	(in degrees). Default datum is WGS84.
+ %
+@@ -29,10 +29,11 @@
+ %		I.G.N., Projection cartographique Mercator Transverse: Algorithmes,
+ %		   Notes Techniques NT/G 76, janvier 1995.
+ %
+-%   Author: Francois Beauducel, <beauducel@ipgp.fr>
+-%   Created: 2001-08-23
+-%   Updated: 2014-04-20
++%	Author: Francois Beauducel, <beauducel@ipgp.fr>
++%	Created: 2001-08-23
++%	Updated: 2014-04-20
+ 
++
+ %	Copyright (c) 2001-2014, François Beauducel, covered by BSD License.
+ %	All rights reserved.
+ %
+@@ -104,11 +105,11 @@
+ maxiter = 100;	% maximum iteration for latitude computation
+ eps = 1e-11;	% minimum residue for latitude computation
+ 
+-K0 = 0.9996;								% UTM scale factor
+-X0 = 500000;								% UTM false East (m)
+-Y0 = 1e7*(f < 0);							% UTM false North (m)
+-P0 = 0;										% UTM origin latitude (rad)
+-L0 = (6*abs(f) - 183)/D0;					% UTM origin longitude (rad)
++K0 = 0.9996;					% UTM scale factor
++X0 = 500000;					% UTM false East (m)
++Y0 = 1e7*(f < 0);				% UTM false North (m)
++P0 = 0;						% UTM origin latitude (rad)
++L0 = (6*abs(f) - 183)/D0;			% UTM origin longitude (rad)
+ E1 = sqrt((A1^2 - (A1*(1 - 1/F1))^2)/A1^2);	% ellpsoid excentricity
+ N = K0*A1;
+ 
+@@ -187,4 +188,4 @@
+ 
+ for i = 1:size(c0,1)
+     c(i) = polyval(c0(i,:),e);
+-end
+\ No newline at end of file
++end
Index: /issm/oecreview/Archive/18296-19100/ISSM-18478-18479.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18478-18479.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18478-18479.diff	(revision 19102)
@@ -0,0 +1,59 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 18478)
++++ ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 18479)
+@@ -146,7 +146,7 @@
+ 	MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
+ 
+ 	/* Seed the random number generator {{{*/
+-	srand (time(NULL));               /*}}}*/
++		srand (time(NULL));            /*}}}*/
+ 	/* Define the variables {{{*/
+ 
+ 	int    dx     = 500;   /* prism dimension in x-direction                           */
+@@ -443,7 +443,6 @@
+ 	/*GSL Matrices and vectors: */
+ 	int    M,N;
+ 	double chisq;
+-
+ 	/*Get system size*/
+ 	A->GetSize(&M,&N);
+ 
+@@ -532,7 +531,6 @@
+ 	bool test=true;
+ 
+ 	double *glocal=new double[n]();
+-	double *gcalc=new double[n]();
+ 
+ 	for(int c=my_rank;c<n;c+=num_procs){
+ 		glocal[c]=0;
+@@ -566,7 +564,7 @@
+ 				for(int i=0;i<2;i++){
+ 					si*=-1;
+ 					for(int j=0;j<2;j++){
+-						si*=-1;
++						sj*=-1;
+ 						s=si*sj;
+ 						for(int k=0;k<l;k++){
+ 							R=sqrt(xp->GetValue(0,i)*xp->GetValue(0,i)+yp->GetValue(0,j)*yp->GetValue(0,j)+mesh->GetValue(a,k)*mesh->GetValue(a,k));
+@@ -587,11 +585,7 @@
+ 		}
+ 	}
+ 
+-	MPI_Allreduce(glocal,gcalc,n,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
+-	if(!my_rank){for(int c=0;c<n;c++){
+-		g->SetValue(c,0,gcalc[c]);
+-	}
+-	}
++	MPI_Allreduce(glocal,g->GetPointer(),n,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
+ 
+ 	delete xp;
+ 	delete yp;
+@@ -602,7 +596,6 @@
+ 	delete U1;
+ 	delete U2;
+ 	delete []glocal;
+-	delete []gcalc;
+ }/*}}}*/
+ void vec2gridsimple(Matrix *V,Matrix *V1,int nx, int ny){/*{{{*/
+ 	for(int i=0;i<ny;i++){
Index: /issm/oecreview/Archive/18296-19100/ISSM-18479-18480.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18479-18480.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18479-18480.diff	(revision 19102)
@@ -0,0 +1,15 @@
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 18479)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 18480)
+@@ -239,7 +239,9 @@
+ 			md.geometry.surface=project2d(md,md.geometry.surface,1);
+ 			md.geometry.thickness=project2d(md,md.geometry.thickness,1);
+ 			md.geometry.base=project2d(md,md.geometry.base,1);
+-			md.geometry.bed=project2d(md,md.geometry.bed,1);
++			if ~isnan(md.geometry.bed),
++				md.geometry.bed=project2d(md,md.geometry.bed,1);
++			end
+ 
+ 			if ~isnan(md.mask.groundedice_levelset),
+ 				md.mask.groundedice_levelset=project2d(md,md.mask.groundedice_levelset,1);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18480-18481.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18480-18481.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18480-18481.diff	(revision 19102)
@@ -0,0 +1,95 @@
+Index: ../trunk-jpl/src/m/qmu/plot/plot_hist_norm.m
+===================================================================
+--- ../trunk-jpl/src/m/qmu/plot/plot_hist_norm.m	(revision 18480)
++++ ../trunk-jpl/src/m/qmu/plot/plot_hist_norm.m	(revision 18481)
+@@ -43,7 +43,9 @@
+ %    ymax1         (numeric, maximum of histogram y-axis)
+ %    ymin2         (numeric, minimum of cdf y-axis)
+ %    ymax2         (numeric, maximum of cdf y-axis)
+-%    nrmplt        (char, 'line' or 'off' to change nrm plots from 'bar')
++%    nrmplt        (char, pass 'l' or 'off' to change nrm plots 
++%                   from default of 'bar' or 'b' to 'line' instead, 
++%                   pass 's' to change nrm plot to 'stairs')                                                  
+ %    cdfplt        (char, 'off' to turn off cdf line plots)
+ %    cdfleg        (char, 'off' to turn off cdf legends)
+ %    cmap          (char or numeric, colormap definition)
+@@ -173,13 +175,14 @@
+ end
+ 
+ %  parameters
+-
++LineWidth=1;
+ while (iarg <= nargin-1)
+     if ischar(varargin{iarg})
+         if ~isempty(strmatch(varargin{iarg},...
+                 {'hmin','hmax','hnint',...
+                  'ymin1','ymax1','ymin2','ymax2',...
+-                 'nrmplt','EdgeColor','FaceColor','cdfplt','cdfleg','nrmleg','cmap','titleplt','xlabelplt','ylabelplt','FontSize'},...
++                 'nrmplt','EdgeColor','FaceColor','LineWidth','cdfplt',...
++				     'cdfleg','nrmleg','cmap','titleplt','xlabelplt','ylabelplt','FontSize'},...
+                 'exact'))
+             eval([varargin{iarg} '=varargin{iarg+1};']);
+             disp([varargin{iarg} '=' any2str(varargin{iarg+1}) ';']);
+@@ -250,7 +253,9 @@
+     hl1=bar (edges(1:end-1),dhistc(1:end-1,1:1*ncol));
+     hl1(1*ncol+1:2*ncol)=...
+         line(edges(1:end-1),dhistc(1:end-1,1*ncol+1:2*ncol),...
+-             'LineWidth',2);
++             'LineWidth',LineWidth);
++elseif strncmpi(nrmplt,'s',1)
++	 hl1=stairs(edges(1:end-1)-(hmax-hmin)/hnint/2,dhistc(1:end-1,1:ncol));
+ elseif strncmpi(nrmplt,'off',3)
+     hl1=bar (edges(1:end-1),dhistc(1:end-1,1:1*ncol));
+ end
+@@ -268,8 +273,10 @@
+ end
+ 
+ %set face and edge color
+-for i=1:length(hl1)
+-	set(hl1(i),'EdgeColor',EdgeColor,'FaceColor',FaceColor);
++if ~strncmpi(nrmplt,'s',1)
++	for i=1:length(hl1)
++		set(hl1(i),'EdgeColor',EdgeColor,'FaceColor',FaceColor,'LineWidth',LineWidth);
++	end
+ end
+ 
+ %  set bars and lines to have a continuous colormap
+@@ -281,21 +288,23 @@
+ 
+ cmap=colormap;
+ for i=1:length(hl1)
+-    if (length(hl1) > 1)
+-        imap=round((i-1)/(length(hl1)-1)*(size(cmap,1)-1))+1;
+-    else
+-        imap=1;
+-    end
+-    if     strcmpi(get(hl1(i),'Type'),'hggroup')
+-        if ischar(get(hl1(i),'FaceColor')) && ...
+-           strcmpi(get(hl1(i),'FaceColor'),'flat')
+-            set(hl1(i),'FaceColor',cmap(imap,:))
+-        else
+-            set(hl1(i),'FaceColor',get(hl1(i),'FaceColor'))
+-        end
+-    elseif strcmpi(get(hl1(i),'Type'),'line')
+-        set(hl1(i),'Color',cmap(imap,:))
+-    end
++	if (length(hl1) > 1)
++		imap=round((i-1)/(length(hl1)-1)*(size(cmap,1)-1))+1;
++	else
++		imap=1;
++	end
++	if ~strncmpi(nrmplt,'s',1) && strcmpi(get(hl1(i),'Type'),'hggroup')
++		if ischar(get(hl1(i),'FaceColor')) && ...
++				strcmpi(get(hl1(i),'FaceColor'),'flat')
++			set(hl1(i),'FaceColor',cmap(imap,:))
++		else
++			set(hl1(i),'FaceColor',get(hl1(i),'FaceColor'))
++		end
++	elseif strcmpi(get(hl1(i),'Type'),'line')
++		set(hl1(i),'Color',cmap(imap,:))
++	elseif strncmpi(nrmplt,'s',1)
++		set(hl1(i),'Color',EdgeColor,'LineWidth',2)
++	end
+ end
+ 
+ xlim('auto')
Index: /issm/oecreview/Archive/18296-19100/ISSM-18481-18482.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18481-18482.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18481-18482.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/classes/frictionweertman.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionweertman.m	(revision 18481)
++++ ../trunk-jpl/src/m/classes/frictionweertman.m	(revision 18482)
+@@ -44,7 +44,7 @@
+ 		function marshall(obj,md,fid) % {{{
+ 			yts=365.0*24.0*3600.0;
+ 
+-			WriteData(fid,'enum',FrictionLawEnum,'data',1,'format','Integer');
++			WriteData(fid,'enum',FrictionLawEnum,'data',2,'format','Integer');
+ 			WriteData(fid,'class','friction','object',obj,'fieldname','C','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
+ 			WriteData(fid,'class','friction','object',obj,'fieldname','m','format','DoubleMat','mattype',2);
+ 			
Index: /issm/oecreview/Archive/18296-19100/ISSM-18482-18483.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18482-18483.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18482-18483.diff	(revision 19102)
@@ -0,0 +1,26 @@
+Index: ../trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp	(revision 18482)
++++ ../trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp	(revision 18483)
+@@ -21,8 +21,8 @@
+ 	int fe_FS;
+ 
+ 	iomodel->Constant(&fe_FS,FlowequationFeFSEnum);
+-	if(fe_FS=LATaylorHoodEnum) finiteelement = P1Enum;
+-	else if(fe_FS=LACrouzeixRaviartEnum) finiteelement = P1DGEnum;
++	if(fe_FS==LATaylorHoodEnum) finiteelement = P1Enum;
++	else if(fe_FS==LACrouzeixRaviartEnum) finiteelement = P1DGEnum;
+ 	else _error_("solution not supported yet");
+ 
+ 	for(int i=0;i<iomodel->numberofelements;i++){
+@@ -45,8 +45,8 @@
+ 	int fe_FS;
+ 
+ 	iomodel->Constant(&fe_FS,FlowequationFeFSEnum);
+-	if(fe_FS=LATaylorHoodEnum) finiteelement = P1Enum;
+-	else if(fe_FS=LACrouzeixRaviartEnum) finiteelement = P1DGEnum;
++	if(fe_FS==LATaylorHoodEnum) finiteelement = P1Enum;
++	else if(fe_FS==LACrouzeixRaviartEnum) finiteelement = P1DGEnum;
+ 	else _error_("solution not supported yet");
+ 
+ 	::CreateNodes(nodes,iomodel,UzawaPressureAnalysisEnum,finiteelement);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18483-18484.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18483-18484.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18483-18484.diff	(revision 19102)
@@ -0,0 +1,69 @@
+Index: ../trunk-jpl/test/Archives/Archive327.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive120.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive432.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive325.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive805.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive121.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive326.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive803.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive122.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive431.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18483)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18484)
+@@ -314,9 +314,9 @@
+ 			element->ElementSizes(&hx,&hy,&hz);
+ 			vel=sqrt(vx*vx + vy*vy + vz*vz)+1.e-14;
+ 			h=sqrt( pow(hx*vx/vel,2) + pow(hy*vy/vel,2) + pow(hz*vz/vel,2));
+-			K[0][0]=h/(2.*vel)*vx*vx;  K[0][1]=h/(2.*vel)*vx*vy; K[0][2]=h/(2.*vel)*vx*vz;
+-			K[1][0]=h/(2.*vel)*vy*vx;  K[1][1]=h/(2.*vel)*vy*vy; K[1][2]=h/(2.*vel)*vy*vz;
+-			K[2][0]=h/(2.*vel)*vz*vx;  K[2][1]=h/(2.*vel)*vz*vy; K[2][2]=h/(2.*vel)*vz*vz;
++			K[0][0]=h/(2.*vel)*fabs(vx*vx);  K[0][1]=h/(2.*vel)*fabs(vx*vy); K[0][2]=h/(2.*vel)*fabs(vx*vz);
++			K[1][0]=h/(2.*vel)*fabs(vy*vx);  K[1][1]=h/(2.*vel)*fabs(vy*vy); K[1][2]=h/(2.*vel)*fabs(vy*vz);
++			K[2][0]=h/(2.*vel)*fabs(vz*vx);  K[2][1]=h/(2.*vel)*fabs(vz*vy); K[2][2]=h/(2.*vel)*fabs(vz*vz);
+ 			for(int i=0;i<3;i++) for(int j=0;j<3;j++) K[i][j] = D_scalar*K[i][j];
+ 
+ 			GetBAdvecprime(Bprime,element,xyz_list,gauss); 
+@@ -1027,7 +1027,10 @@
+ 		}
+ 		else{
+ 			basalmeltingrate[vertexdown]=meltingrate_enthalpy[is];
+-			watercolumn[vertexdown]+=meltingrate_enthalpy[is];
++			if(watercolumn[vertexdown]+meltingrate_enthalpy[is]<0.)
++				watercolumn[vertexdown]=0.;
++			else
++				watercolumn[vertexdown]+=meltingrate_enthalpy[is];
+ 		}	
+ 		basalmeltingrate[vertexdown]*=rho_water/rho_ice; // convert meltingrate from water to ice equivalent
+ 		_assert_(watercolumn[vertexdown]>=0.);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18484-18485.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18484-18485.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18484-18485.diff	(revision 19102)
@@ -0,0 +1,22 @@
+Index: ../trunk-jpl/src/c/cores/AnalysisConfiguration.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/AnalysisConfiguration.cpp	(revision 18484)
++++ ../trunk-jpl/src/c/cores/AnalysisConfiguration.cpp	(revision 18485)
+@@ -25,7 +25,7 @@
+ 	switch(solutiontype){
+ 
+ 		case StressbalanceSolutionEnum:
+-			numanalyses=7;
++			numanalyses=6;
+ 			analyses=xNew<int>(numanalyses);
+ 			analyses[0]=StressbalanceAnalysisEnum;
+ 			analyses[1]=StressbalanceVerticalAnalysisEnum;
+@@ -33,7 +33,7 @@
+ 			analyses[3]=L2ProjectionBaseAnalysisEnum;
+ 			analyses[4]=ExtrudeFromBaseAnalysisEnum;
+ 			analyses[5]=DepthAverageAnalysisEnum;
+-			analyses[6]=UzawaPressureAnalysisEnum;
++			//analyses[6]=UzawaPressureAnalysisEnum;
+ 			break;
+ 
+ 		case SteadystateSolutionEnum:
Index: /issm/oecreview/Archive/18296-19100/ISSM-18485-18486.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18485-18486.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18485-18486.diff	(revision 19102)
@@ -0,0 +1,31 @@
+Index: ../trunk-jpl/src/c/bamg/Mesh.cpp
+===================================================================
+--- ../trunk-jpl/src/c/bamg/Mesh.cpp	(revision 18485)
++++ ../trunk-jpl/src/c/bamg/Mesh.cpp	(revision 18486)
+@@ -3142,16 +3142,25 @@
+ 		int verbose=bamgopts->verbose;
+ 
+ 		/*First, insert old points if requested*/
+-		if (KeepVertices && (&Bh != this) && (nbv+Bh.nbv< maxnbv)){
++		if(KeepVertices && (&Bh != this) && (nbv+Bh.nbv< maxnbv)){
+ 			if (verbose>5) _printf_("         Inserting initial mesh points\n");
++			bool pointsoutside = false;
+ 			for (i=0;i<Bh.nbv;i++){ 
+ 				BamgVertex &bv=Bh[i];
++				/*Do not insert if the point is outside*/
++				long long det3[3];
++				Triangle* tcvj=TriangleFindFromCoord(bv.i,det3);
++				if(tcvj->det<0){
++					pointsoutside = true;
++					continue;
++				}
+ 				if (!bv.GeomEdgeHook){
+ 					vertices[nbv].r              = bv.r;
+ 					vertices[nbv].PreviousNumber = i+1;
+ 					vertices[nbv++].m = bv.m;
+ 				}
+ 			}
++			if(pointsoutside) _printf_("WARNING: One or more points of the initial mesh fall outside of the geometric boundary\n");
+ 			Bh.CreateSingleVertexToTriangleConnectivity();     
+ 			InsertNewPoints(nbvold,NbTSwap,bamgopts->random);
+ 		}  
Index: /issm/oecreview/Archive/18296-19100/ISSM-18486-18487.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18486-18487.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18486-18487.diff	(revision 19102)
@@ -0,0 +1,24 @@
+Index: ../trunk-jpl/src/c/classes/Options/Options.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Options/Options.cpp	(revision 18486)
++++ ../trunk-jpl/src/c/classes/Options/Options.cpp	(revision 18487)
+@@ -73,6 +73,19 @@
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+ 		option=dynamic_cast<Option*>(*object);
++		//option=(Option*)(*object); //C-like cast
++		/*There is a crash on some machines (Einar Olason) that needs to be fixed*/
++		if(!option){
++			_printf_("The dynamic_cast from Object* to Option* is failing.\n");
++			_printf_("\n");
++			_printf_("A quick qorkaround consists of using a C-like cast\n");
++			_printf_("\n");
++			_printf_("Open Options.cpp and change the dynamic_cast in Options::GetOption by a C-like cast\n");
++			//_printf_("Open Options.h and replace the dynamic_cast of all the Get functions to C-like cats\n");
++			_printf_("\n");
++			_error_("Make the fix above and recompile ISSM");
++		}
++
+ 		if (!strncmp(name,option->Name(),strlen(option->Name()))){
+ 
+ 			/*OK, now do we have a complete name? If not, it is a cell or a structure, we need to go further*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18487-18488.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18487-18488.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18487-18488.diff	(revision 19102)
@@ -0,0 +1,53 @@
+Index: ../trunk-jpl/src/c/bamg/Mesh.cpp
+===================================================================
+--- ../trunk-jpl/src/c/bamg/Mesh.cpp	(revision 18487)
++++ ../trunk-jpl/src/c/bamg/Mesh.cpp	(revision 18488)
+@@ -2929,6 +2929,9 @@
+ 				vj.ReferenceNumber=0; 
+ 				Triangle *tcvj=TriangleFindFromCoord(vj.i,det3);
+ 				if (tcvj && !tcvj->link){
++					_printf_("While trying to add the following point:\n");
++					vj.Echo();
++					_printf_("BAMG determined that it was inside the following triangle, which probably lies outside of the geometric domain\n");
+ 					tcvj->Echo();
+ 					_error_("problem inserting point in InsertNewPoints (tcvj=" << tcvj << " and tcvj->link=" << tcvj->link << ")");
+ 				}
+@@ -3145,16 +3148,26 @@
+ 		if(KeepVertices && (&Bh != this) && (nbv+Bh.nbv< maxnbv)){
+ 			if (verbose>5) _printf_("         Inserting initial mesh points\n");
+ 			bool pointsoutside = false;
+-			for (i=0;i<Bh.nbv;i++){ 
++			for(i=0;i<Bh.nbv;i++){ 
+ 				BamgVertex &bv=Bh[i];
+ 				/*Do not insert if the point is outside*/
+ 				long long det3[3];
+ 				Triangle* tcvj=TriangleFindFromCoord(bv.i,det3);
+-				if(tcvj->det<0){
++				if(tcvj->det<0 || !tcvj->link){
+ 					pointsoutside = true;
+ 					continue;
+ 				}
+-				if (!bv.GeomEdgeHook){
++				IssmDouble area_1=((bv.r.x -(*tcvj)(2)->r.x)*((*tcvj)(1)->r.y-(*tcvj)(2)->r.y) 
++						- (bv.r.y -(*tcvj)(2)->r.y)*((*tcvj)(1)->r.x-(*tcvj)(2)->r.x));
++				IssmDouble area_2=(((*tcvj)(0)->r.x -(*tcvj)(2)->r.x)*(bv.r.y -(*tcvj)(2)->r.y) 
++						- ((*tcvj)(0)->r.y -(*tcvj)(2)->r.y)*(bv.r.x -(*tcvj)(2)->r.x));
++				IssmDouble area_3 =((bv.r.x -(*tcvj)(1)->r.x)*((*tcvj)(0)->r.y-(*tcvj)(1)->r.y)
++						- (bv.r.y -(*tcvj)(1)->r.y)*((*tcvj)(0)->r.x-(*tcvj)(1)->r.x));
++				if(area_1<0 || area_2<0 || area_3<0){
++					pointsoutside = true;
++					continue;
++				}
++				if(!bv.GeomEdgeHook){
+ 					vertices[nbv].r              = bv.r;
+ 					vertices[nbv].PreviousNumber = i+1;
+ 					vertices[nbv++].m = bv.m;
+@@ -3163,7 +3176,7 @@
+ 			if(pointsoutside) _printf_("WARNING: One or more points of the initial mesh fall outside of the geometric boundary\n");
+ 			Bh.CreateSingleVertexToTriangleConnectivity();     
+ 			InsertNewPoints(nbvold,NbTSwap,bamgopts->random);
+-		}  
++		}
+ 		else Bh.CreateSingleVertexToTriangleConnectivity();     
+ 
+ 		// generation of the list of next Triangle 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18488-18489.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18488-18489.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18488-18489.diff	(revision 19102)
@@ -0,0 +1,8 @@
+Index: ../trunk-jpl/test/Archives/Archive805.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive803.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
Index: /issm/oecreview/Archive/18296-19100/ISSM-18489-18490.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18489-18490.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18489-18490.diff	(revision 19102)
@@ -0,0 +1,18 @@
+Index: ../trunk-jpl/src/c/bamg/R2.h
+===================================================================
+--- ../trunk-jpl/src/c/bamg/R2.h	(revision 18489)
++++ ../trunk-jpl/src/c/bamg/R2.h	(revision 18490)
+@@ -18,10 +18,10 @@
+ 			  P2 () :x(0),y(0) {};
+ 			  P2 (R a,R b)  :x(a),y(b)  {}
+ 			  P2 (P2 A,P2 B) : x(B.x-A.x),y(B.y-A.y) {}
+-			  void Echo(){
++			  void Echo() const{
+ 				  printf("Member of P2:\n");
+-				  printf("   x: %g or %i\n",x,x);
+-				  printf("   y: %g or %i\n",y,y);
++				  std::cout<<"   x: "<<x<<std::endl;
++				  std::cout<<"   y: "<<y<<std::endl;
+ 			  }
+ 			  //operators
+ 			  RR       operator,(const P2<R,RR> & cc) const {return  (RR) x* (RR) cc.x+(RR) y* (RR) cc.y;} //scalar product
Index: /issm/oecreview/Archive/18296-19100/ISSM-18490-18491.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18490-18491.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18490-18491.diff	(revision 19102)
@@ -0,0 +1,148 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 18490)
++++ ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 18491)
+@@ -168,7 +168,7 @@
+ 	makep(Pp,mx,my,dx,dy);
+ 	// Pp->Echo();
+ 
+-	double  rhoi = 890;           /* ice density     */
++	double  rhoi = 917;           /* ice density     */
+ 	double  rhow = 1030;          /* water density   */
+ 	// double  rhos = 2013;		      /* sediment density */
+ 	double  rhoc = 2670;          /* bedrock density */
+@@ -185,7 +185,7 @@
+ 	rho2->SetValue(0,1,rhow-rhoc);
+ 
+ 	double ctr=1;            /* parameter for filtering */
+-	double sd=0.1;
++	double sd=0.5;
+ 
+ 	Matrix *xobs= new Matrix(ny,nx);
+ 	Matrix *yobs= new Matrix(ny,nx);
+@@ -668,69 +668,92 @@
+ 	Matrix* m1gr=new Matrix(my,mx);
+ 	Matrix* m1grsm=new Matrix(my,mx);
+ 	Matrix* m1col=new Matrix(mx*my,1);
++	Matrix* m1gr2=new Matrix(my,mx);
++	Matrix* m1grsm2=new Matrix(my,mx);
++	Matrix* m1col2=new Matrix(mx*my,1);
++	Matrix* nptflag= new Matrix(mx*my,1);
+ 	double u=0;
+ 	double y=0;
+ 	m1->MatrixEqual(m0);
++	nptflag->MatrixSum(icethick,bathy);
++	/* first layer: ice */
+ 	for (int i=0;i<mx*my;i++){
+-		if(icethick->GetValue(i,0)==0){
+-			u=double (rand())/ double(RAND_MAX);
++		if(nptflag->GetValue(i,0)==0){
++			u=double(rand())/double(RAND_MAX);
+ 			y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
+ 			m1->SetValue(i,1,m0->GetValue(i,1)+y*ptval);
++			m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
+ 			if(m1->GetValue(i,1)<=m1->GetValue(i,0)){
+ 				m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
++				m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
+ 			}
+ 			if(m1->GetValue(i,1)>=m1->GetValue(i,0)+mmax){
+ 				m1->SetValue(i,1,m1->GetValue(i,0)+mmax);
++				m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
+ 			}
+ 		}
+ 	}
++
+ 	m1->ExtractColumn(m1col,1);
+ 	vec2gridsimple(m1col,m1gr,mx,my);
+ 	filtergrav(m1grsm,m1gr,ctr,sd,mx,my);
+ 	reshape(m1grsm,m1col,mx,my);
++	m1->ExtractColumn(m1col2,2);
++	vec2gridsimple(m1col2,m1gr2,mx,my);
++	filtergrav(m1grsm2,m1gr2,ctr,sd,mx,my);
++	reshape(m1grsm2,m1col2,mx,my);
++
+ 	for (int i=0;i<mx*my;i++){
+-		if(icethick->GetValue(i,0)==0){
++		if(nptflag->GetValue(i,0)==0){
+ 			m1->SetValue(i,1,m1col->GetValue(i,0));
+-		}
+-		else{
+-			m1->SetValue(i,1,m0->GetValue(i,1));
+-		}
+-		if(m1->GetValue(i,1)<=m1->GetValue(i,0)){
+-			m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
+-		}
+-	}
+-
+-	for (int i=0;i<mx*my;i++){
+-		if(bathy->GetValue(i,0)==0){
+-			u=double (rand())/ double(RAND_MAX);
+-			y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
+-			m1->SetValue(i,2,m0->GetValue(i,2)+y*ptval);
+-			if(m1->GetValue(i,2)<=m1->GetValue(i,1)){
++			m1->SetValue(i,2,m1col2->GetValue(i,0));
++			if(m1->GetValue(i,1)<m1->GetValue(i,0)){
++				m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
+ 				m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
+ 			}
+-			if(m1->GetValue(i,2)>=m1->GetValue(i,1)+mmax2){
+-				m1->SetValue(i,2,m1->GetValue(i,1)+mmax2);
+-			}
+ 		}
+-	}
+-	m1->ExtractColumn(m1col,2);
+-	vec2gridsimple(m1col,m1gr,mx,my);
+-	filtergrav(m1grsm,m1gr,ctr,sd,mx,my);
+-	reshape(m1grsm,m1col,mx,my);
+-	for (int i=0;i<mx*my;i++){
+-		if(bathy->GetValue(i,0)==0){
+-			m1->SetValue(i,2,m1col->GetValue(i,0));
+-		}
+ 		else{
++			m1->SetValue(i,1,m0->GetValue(i,1));
+ 			m1->SetValue(i,2,m0->GetValue(i,2));
+ 		}
+-		if(m1->GetValue(i,2)<=m1->GetValue(i,1)){
+-			m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
+-		}
+ 	}
++
++				/* second layer: water */
++//	for (int i=0;i<mx*my;i++){
++//		if(bathy->GetValue(i,0)==0){
++//			u=double (rand())/ double(RAND_MAX);
++//			y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
++//			m1->SetValue(i,2,m0->GetValue(i,2)+y*ptval);
++//			if(m1->GetValue(i,2)<=m1->GetValue(i,1)){
++//				m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++//			}
++//			if(m1->GetValue(i,2)>=m1->GetValue(i,1)+mmax2){
++//				m1->SetValue(i,2,m1->GetValue(i,1)+mmax2);
++//			}
++//		}
++//	}
++//	m1->ExtractColumn(m1col,2);
++//	vec2gridsimple(m1col,m1gr,mx,my);
++//	filtergrav(m1grsm,m1gr,ctr,sd,mx,my);
++//	reshape(m1grsm,m1col,mx,my);
++//	for (int i=0;i<mx*my;i++){
++//		if(bathy->GetValue(i,0)==0){
++//			m1->SetValue(i,2,m1col->GetValue(i,0));
++//		}
++//		else{
++//			m1->SetValue(i,2,m0->GetValue(i,2));
++//		}
++//		if(m1->GetValue(i,2)<=m1->GetValue(i,1)){
++//			m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++//		}
++//	}
+ 	delete m1gr;
+ 	delete m1grsm;
+ 	delete m1col;
++	delete m1gr2;
++	delete m1grsm2;
++	delete m1col2;
++	delete nptflag;
+ }/*}}}*/
+ double signe(double a){/*{{{*/
+ 	if(a<0){return -1;}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18491-18492.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18491-18492.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18491-18492.diff	(revision 19102)
@@ -0,0 +1,3821 @@
+Index: ../trunk-jpl/m4/analyses.m4
+===================================================================
+--- ../trunk-jpl/m4/analyses.m4	(revision 18491)
++++ ../trunk-jpl/m4/analyses.m4	(revision 18492)
+@@ -10,466 +10,888 @@
+ [
+ 
+ dnl with-AdjointBalancethickness{{{
++
+ AC_ARG_WITH([AdjointBalancethickness],
++
+ 	AS_HELP_STRING([--with-AdjointBalancethickness = YES], [compile with AdjointBalancethickness capabilities (default is yes)]),
++
+ 	[ADJOINTBALANCETHICKNESS=$withval],[ADJOINTBALANCETHICKNESS=yes])
++
+ AC_MSG_CHECKING(for AdjointBalancethickness capability compilation)
+ 
++
+ HAVE_ADJOINTBALANCETHICKNESS=no 
++
+ if test "x$ADJOINTBALANCETHICKNESS" = "xyes"; then
++
+ 	HAVE_ADJOINTBALANCETHICKNESS=yes
++
+ 	AC_DEFINE([_HAVE_ADJOINTBALANCETHICKNESS_],[1],[with AdjointBalancethicknesscapability])
++
+ fi
++
+ AM_CONDITIONAL([ADJOINTBALANCETHICKNESS], [test x$HAVE_ADJOINTBALANCETHICKNESS = xyes])
++
+ AC_MSG_RESULT($HAVE_ADJOINTBALANCETHICKNESS)
++
+ dnl }}}
+ dnl with-AdjointBalancethickness2{{{
++
+ AC_ARG_WITH([AdjointBalancethickness2],
++
+ 	AS_HELP_STRING([--with-AdjointBalancethickness2 = YES], [compile with AdjointBalancethickness2 capabilities (default is yes)]),
++
+ 	[ADJOINTBALANCETHICKNESS2=$withval],[ADJOINTBALANCETHICKNESS2=yes])
++
+ AC_MSG_CHECKING(for AdjointBalancethickness2 capability compilation)
+ 
++
+ HAVE_ADJOINTBALANCETHICKNESS2=no 
++
+ if test "x$ADJOINTBALANCETHICKNESS2" = "xyes"; then
++
+ 	HAVE_ADJOINTBALANCETHICKNESS2=yes
++
+ 	AC_DEFINE([_HAVE_ADJOINTBALANCETHICKNESS2_],[1],[with AdjointBalancethickness2capability])
++
+ fi
++
+ AM_CONDITIONAL([ADJOINTBALANCETHICKNESS2], [test x$HAVE_ADJOINTBALANCETHICKNESS2 = xyes])
++
+ AC_MSG_RESULT($HAVE_ADJOINTBALANCETHICKNESS2)
++
+ dnl }}}
+ dnl with-AdjointHoriz{{{
++
+ AC_ARG_WITH([AdjointHoriz],
++
+ 	AS_HELP_STRING([--with-AdjointHoriz = YES], [compile with AdjointHoriz capabilities (default is yes)]),
++
+ 	[ADJOINTHORIZ=$withval],[ADJOINTHORIZ=yes])
++
+ AC_MSG_CHECKING(for AdjointHoriz capability compilation)
+ 
++
+ HAVE_ADJOINTHORIZ=no 
++
+ if test "x$ADJOINTHORIZ" = "xyes"; then
++
+ 	HAVE_ADJOINTHORIZ=yes
++
+ 	AC_DEFINE([_HAVE_ADJOINTHORIZ_],[1],[with AdjointHorizcapability])
++
+ fi
++
+ AM_CONDITIONAL([ADJOINTHORIZ], [test x$HAVE_ADJOINTHORIZ = xyes])
++
+ AC_MSG_RESULT($HAVE_ADJOINTHORIZ)
++
+ dnl }}}
+ dnl with-Balancethickness{{{
++
+ AC_ARG_WITH([Balancethickness],
++
+ 	AS_HELP_STRING([--with-Balancethickness = YES], [compile with Balancethickness capabilities (default is yes)]),
++
+ 	[BALANCETHICKNESS=$withval],[BALANCETHICKNESS=yes])
++
+ AC_MSG_CHECKING(for Balancethickness capability compilation)
+ 
++
+ HAVE_BALANCETHICKNESS=no 
++
+ if test "x$BALANCETHICKNESS" = "xyes"; then
++
+ 	HAVE_BALANCETHICKNESS=yes
++
+ 	AC_DEFINE([_HAVE_BALANCETHICKNESS_],[1],[with Balancethicknesscapability])
++
+ fi
++
+ AM_CONDITIONAL([BALANCETHICKNESS], [test x$HAVE_BALANCETHICKNESS = xyes])
++
+ AC_MSG_RESULT($HAVE_BALANCETHICKNESS)
++
+ dnl }}}
+ dnl with-Balancethickness2{{{
++
+ AC_ARG_WITH([Balancethickness2],
++
+ 	AS_HELP_STRING([--with-Balancethickness2 = YES], [compile with Balancethickness2 capabilities (default is yes)]),
++
+ 	[BALANCETHICKNESS2=$withval],[BALANCETHICKNESS2=yes])
++
+ AC_MSG_CHECKING(for Balancethickness2 capability compilation)
+ 
++
+ HAVE_BALANCETHICKNESS2=no 
++
+ if test "x$BALANCETHICKNESS2" = "xyes"; then
++
+ 	HAVE_BALANCETHICKNESS2=yes
++
+ 	AC_DEFINE([_HAVE_BALANCETHICKNESS2_],[1],[with Balancethickness2capability])
++
+ fi
++
+ AM_CONDITIONAL([BALANCETHICKNESS2], [test x$HAVE_BALANCETHICKNESS2 = xyes])
++
+ AC_MSG_RESULT($HAVE_BALANCETHICKNESS2)
++
+ dnl }}}
+ dnl with-BalancethicknessSoft{{{
++
+ AC_ARG_WITH([BalancethicknessSoft],
++
+ 	AS_HELP_STRING([--with-BalancethicknessSoft = YES], [compile with BalancethicknessSoft capabilities (default is yes)]),
++
+ 	[BALANCETHICKNESSSOFT=$withval],[BALANCETHICKNESSSOFT=yes])
++
+ AC_MSG_CHECKING(for BalancethicknessSoft capability compilation)
+ 
++
+ HAVE_BALANCETHICKNESSSOFT=no 
++
+ if test "x$BALANCETHICKNESSSOFT" = "xyes"; then
++
+ 	HAVE_BALANCETHICKNESSSOFT=yes
++
+ 	AC_DEFINE([_HAVE_BALANCETHICKNESSSOFT_],[1],[with BalancethicknessSoftcapability])
++
+ fi
++
+ AM_CONDITIONAL([BALANCETHICKNESSSOFT], [test x$HAVE_BALANCETHICKNESSSOFT = xyes])
++
+ AC_MSG_RESULT($HAVE_BALANCETHICKNESSSOFT)
++
+ dnl }}}
+ dnl with-Balancevelocity{{{
++
+ AC_ARG_WITH([Balancevelocity],
++
+ 	AS_HELP_STRING([--with-Balancevelocity = YES], [compile with Balancevelocity capabilities (default is yes)]),
++
+ 	[BALANCEVELOCITY=$withval],[BALANCEVELOCITY=yes])
++
+ AC_MSG_CHECKING(for Balancevelocity capability compilation)
+ 
++
+ HAVE_BALANCEVELOCITY=no 
++
+ if test "x$BALANCEVELOCITY" = "xyes"; then
++
+ 	HAVE_BALANCEVELOCITY=yes
++
+ 	AC_DEFINE([_HAVE_BALANCEVELOCITY_],[1],[with Balancevelocitycapability])
++
+ fi
++
+ AM_CONDITIONAL([BALANCEVELOCITY], [test x$HAVE_BALANCEVELOCITY = xyes])
++
+ AC_MSG_RESULT($HAVE_BALANCEVELOCITY)
++
+ dnl }}}
+ dnl with-L2ProjectionEPL{{{
++
+ AC_ARG_WITH([L2ProjectionEPL],
++
+ 	AS_HELP_STRING([--with-L2ProjectionEPL = YES], [compile with L2ProjectionEPL capabilities (default is yes)]),
++
+ 	[L2PROJECTIONEPL=$withval],[L2PROJECTIONEPL=yes])
++
+ AC_MSG_CHECKING(for L2ProjectionEPL capability compilation)
+ 
++
+ HAVE_L2PROJECTIONEPL=no 
++
+ if test "x$L2PROJECTIONEPL" = "xyes"; then
++
+ 	HAVE_L2PROJECTIONEPL=yes
++
+ 	AC_DEFINE([_HAVE_L2PROJECTIONEPL_],[1],[with L2ProjectionEPLcapability])
++
+ fi
++
+ AM_CONDITIONAL([L2PROJECTIONEPL], [test x$HAVE_L2PROJECTIONEPL = xyes])
++
+ AC_MSG_RESULT($HAVE_L2PROJECTIONEPL)
++
+ dnl }}}
+ dnl with-L2ProjectionBase{{{
++
+ AC_ARG_WITH([L2ProjectionBase],
++
+ 	AS_HELP_STRING([--with-L2ProjectionBase = YES], [compile with L2ProjectionBase capabilities (default is yes)]),
++
+ 	[L2PROJECTIONBASE=$withval],[L2PROJECTIONBASE=yes])
++
+ AC_MSG_CHECKING(for L2ProjectionBase capability compilation)
+ 
++
+ HAVE_L2PROJECTIONBASE=no 
++
+ if test "x$L2PROJECTIONBASE" = "xyes"; then
++
+ 	HAVE_L2PROJECTIONBASE=yes
++
+ 	AC_DEFINE([_HAVE_L2PROJECTIONBASE_],[1],[with L2ProjectionBasecapability])
++
+ fi
++
+ AM_CONDITIONAL([L2PROJECTIONBASE], [test x$HAVE_L2PROJECTIONBASE = xyes])
++
+ AC_MSG_RESULT($HAVE_L2PROJECTIONBASE)
++
+ dnl }}}
+ dnl with-DamageEvolution{{{
++
+ AC_ARG_WITH([DamageEvolution],
++
+ 	AS_HELP_STRING([--with-DamageEvolution = YES], [compile with DamageEvolution capabilities (default is yes)]),
++
+ 	[DAMAGEEVOLUTION=$withval],[DAMAGEEVOLUTION=yes])
++
+ AC_MSG_CHECKING(for DamageEvolution capability compilation)
+ 
++
+ HAVE_DAMAGEEVOLUTION=no 
++
+ if test "x$DAMAGEEVOLUTION" = "xyes"; then
++
+ 	HAVE_DAMAGEEVOLUTION=yes
++
+ 	AC_DEFINE([_HAVE_DAMAGEEVOLUTION_],[1],[with DamageEvolutioncapability])
++
+ fi
++
+ AM_CONDITIONAL([DAMAGEEVOLUTION], [test x$HAVE_DAMAGEEVOLUTION = xyes])
++
+ AC_MSG_RESULT($HAVE_DAMAGEEVOLUTION)
++
+ dnl }}}
+ dnl with-Stressbalance{{{
++
+ AC_ARG_WITH([Stressbalance],
++
+ 	AS_HELP_STRING([--with-Stressbalance = YES], [compile with Stressbalance capabilities (default is yes)]),
++
+ 	[STRESSBALANCE=$withval],[STRESSBALANCE=yes])
++
+ AC_MSG_CHECKING(for Stressbalance capability compilation)
+ 
++
+ HAVE_STRESSBALANCE=no 
++
+ if test "x$STRESSBALANCE" = "xyes"; then
++
+ 	HAVE_STRESSBALANCE=yes
++
+ 	AC_DEFINE([_HAVE_STRESSBALANCE_],[1],[with Stressbalancecapability])
++
+ fi
++
+ AM_CONDITIONAL([STRESSBALANCE], [test x$HAVE_STRESSBALANCE = xyes])
++
+ AC_MSG_RESULT($HAVE_STRESSBALANCE)
++
+ dnl }}}
+ dnl with-StressbalanceSIA{{{
++
+ AC_ARG_WITH([StressbalanceSIA],
++
+ 	AS_HELP_STRING([--with-StressbalanceSIA = YES], [compile with StressbalanceSIA capabilities (default is yes)]),
++
+ 	[STRESSBALANCESIA=$withval],[STRESSBALANCESIA=yes])
++
+ AC_MSG_CHECKING(for StressbalanceSIA capability compilation)
+ 
++
+ HAVE_STRESSBALANCESIA=no 
++
+ if test "x$STRESSBALANCESIA" = "xyes"; then
++
+ 	HAVE_STRESSBALANCESIA=yes
++
+ 	AC_DEFINE([_HAVE_STRESSBALANCESIA_],[1],[with StressbalanceSIAcapability])
++
+ fi
++
+ AM_CONDITIONAL([STRESSBALANCESIA], [test x$HAVE_STRESSBALANCESIA = xyes])
++
+ AC_MSG_RESULT($HAVE_STRESSBALANCESIA)
++
+ dnl }}}
+ dnl with-StressbalanceVertical{{{
++
+ AC_ARG_WITH([StressbalanceVertical],
++
+ 	AS_HELP_STRING([--with-StressbalanceVertical = YES], [compile with StressbalanceVertical capabilities (default is yes)]),
++
+ 	[STRESSBALANCEVERTICAL=$withval],[STRESSBALANCEVERTICAL=yes])
++
+ AC_MSG_CHECKING(for StressbalanceVertical capability compilation)
+ 
++
+ HAVE_STRESSBALANCEVERTICAL=no 
++
+ if test "x$STRESSBALANCEVERTICAL" = "xyes"; then
++
+ 	HAVE_STRESSBALANCEVERTICAL=yes
++
+ 	AC_DEFINE([_HAVE_STRESSBALANCEVERTICAL_],[1],[with StressbalanceVerticalcapability])
++
+ fi
++
+ AM_CONDITIONAL([STRESSBALANCEVERTICAL], [test x$HAVE_STRESSBALANCEVERTICAL = xyes])
++
+ AC_MSG_RESULT($HAVE_STRESSBALANCEVERTICAL)
++
+ dnl }}}
+ dnl with-Enthalpy{{{
++
+ AC_ARG_WITH([Enthalpy],
++
+ 	AS_HELP_STRING([--with-Enthalpy = YES], [compile with Enthalpy capabilities (default is yes)]),
++
+ 	[ENTHALPY=$withval],[ENTHALPY=yes])
++
+ AC_MSG_CHECKING(for Enthalpy capability compilation)
+ 
++
+ HAVE_ENTHALPY=no 
++
+ if test "x$ENTHALPY" = "xyes"; then
++
+ 	HAVE_ENTHALPY=yes
++
+ 	AC_DEFINE([_HAVE_ENTHALPY_],[1],[with Enthalpycapability])
++
+ fi
++
+ AM_CONDITIONAL([ENTHALPY], [test x$HAVE_ENTHALPY = xyes])
++
+ AC_MSG_RESULT($HAVE_ENTHALPY)
++
+ dnl }}}
+ dnl with-HydrologyShreve{{{
++
+ AC_ARG_WITH([HydrologyShreve],
++
+ 	AS_HELP_STRING([--with-HydrologyShreve = YES], [compile with HydrologyShreve capabilities (default is yes)]),
++
+ 	[HYDROLOGYSHREVE=$withval],[HYDROLOGYSHREVE=yes])
++
+ AC_MSG_CHECKING(for HydrologyShreve capability compilation)
+ 
++
+ HAVE_HYDROLOGYSHREVE=no 
++
+ if test "x$HYDROLOGYSHREVE" = "xyes"; then
++
+ 	HAVE_HYDROLOGYSHREVE=yes
++
+ 	AC_DEFINE([_HAVE_HYDROLOGYSHREVE_],[1],[with HydrologyShrevecapability])
++
+ fi
++
+ AM_CONDITIONAL([HYDROLOGYSHREVE], [test x$HAVE_HYDROLOGYSHREVE = xyes])
++
+ AC_MSG_RESULT($HAVE_HYDROLOGYSHREVE)
++
+ dnl }}}
+ dnl with-HydrologyDCInefficient{{{
++
+ AC_ARG_WITH([HydrologyDCInefficient],
++
+ 	AS_HELP_STRING([--with-HydrologyDCInefficient = YES], [compile with HydrologyDCInefficient capabilities (default is yes)]),
++
+ 	[HYDROLOGYDCINEFFICIENT=$withval],[HYDROLOGYDCINEFFICIENT=yes])
++
+ AC_MSG_CHECKING(for HydrologyDCInefficient capability compilation)
+ 
++
+ HAVE_HYDROLOGYDCINEFFICIENT=no 
++
+ if test "x$HYDROLOGYDCINEFFICIENT" = "xyes"; then
++
+ 	HAVE_HYDROLOGYDCINEFFICIENT=yes
++
+ 	AC_DEFINE([_HAVE_HYDROLOGYDCINEFFICIENT_],[1],[with HydrologyDCInefficientcapability])
++
+ fi
++
+ AM_CONDITIONAL([HYDROLOGYDCINEFFICIENT], [test x$HAVE_HYDROLOGYDCINEFFICIENT = xyes])
++
+ AC_MSG_RESULT($HAVE_HYDROLOGYDCINEFFICIENT)
++
+ dnl }}}
+ dnl with-HydrologyDCEfficient{{{
++
+ AC_ARG_WITH([HydrologyDCEfficient],
++
+ 	AS_HELP_STRING([--with-HydrologyDCEfficient = YES], [compile with HydrologyDCEfficient capabilities (default is yes)]),
++
+ 	[HYDROLOGYDCEFFICIENT=$withval],[HYDROLOGYDCEFFICIENT=yes])
++
+ AC_MSG_CHECKING(for HydrologyDCEfficient capability compilation)
+ 
++
+ HAVE_HYDROLOGYDCEFFICIENT=no 
++
+ if test "x$HYDROLOGYDCEFFICIENT" = "xyes"; then
++
+ 	HAVE_HYDROLOGYDCEFFICIENT=yes
++
+ 	AC_DEFINE([_HAVE_HYDROLOGYDCEFFICIENT_],[1],[with HydrologyDCEfficientcapability])
++
+ fi
++
+ AM_CONDITIONAL([HYDROLOGYDCEFFICIENT], [test x$HAVE_HYDROLOGYDCEFFICIENT = xyes])
++
+ AC_MSG_RESULT($HAVE_HYDROLOGYDCEFFICIENT)
++
+ dnl }}}
+ dnl with-Melting{{{
++
+ AC_ARG_WITH([Melting],
++
+ 	AS_HELP_STRING([--with-Melting = YES], [compile with Melting capabilities (default is yes)]),
++
+ 	[MELTING=$withval],[MELTING=yes])
++
+ AC_MSG_CHECKING(for Melting capability compilation)
+ 
++
+ HAVE_MELTING=no 
++
+ if test "x$MELTING" = "xyes"; then
++
+ 	HAVE_MELTING=yes
++
+ 	AC_DEFINE([_HAVE_MELTING_],[1],[with Meltingcapability])
++
+ fi
++
+ AM_CONDITIONAL([MELTING], [test x$HAVE_MELTING = xyes])
++
+ AC_MSG_RESULT($HAVE_MELTING)
++
+ dnl }}}
+ dnl with-Masstransport{{{
++
+ AC_ARG_WITH([Masstransport],
++
+ 	AS_HELP_STRING([--with-Masstransport = YES], [compile with Masstransport capabilities (default is yes)]),
++
+ 	[MASSTRANSPORT=$withval],[MASSTRANSPORT=yes])
++
+ AC_MSG_CHECKING(for Masstransport capability compilation)
+ 
++
+ HAVE_MASSTRANSPORT=no 
++
+ if test "x$MASSTRANSPORT" = "xyes"; then
++
+ 	HAVE_MASSTRANSPORT=yes
++
+ 	AC_DEFINE([_HAVE_MASSTRANSPORT_],[1],[with Masstransportcapability])
++
+ fi
++
+ AM_CONDITIONAL([MASSTRANSPORT], [test x$HAVE_MASSTRANSPORT = xyes])
++
+ AC_MSG_RESULT($HAVE_MASSTRANSPORT)
++
+ dnl }}}
+ dnl with-FreeSurfaceBase{{{
++
+ AC_ARG_WITH([FreeSurfaceBase],
++
+ 	AS_HELP_STRING([--with-FreeSurfaceBase = YES], [compile with FreeSurfaceBase capabilities (default is yes)]),
++
+ 	[FREESURFACEBASE=$withval],[FREESURFACEBASE=yes])
++
+ AC_MSG_CHECKING(for FreeSurfaceBase capability compilation)
+ 
++
+ HAVE_FREESURFACEBASE=no 
++
+ if test "x$FREESURFACEBASE" = "xyes"; then
++
+ 	HAVE_FREESURFACEBASE=yes
++
+ 	AC_DEFINE([_HAVE_FREESURFACEBASE_],[1],[with FreeSurfaceBasecapability])
++
+ fi
++
+ AM_CONDITIONAL([FREESURFACEBASE], [test x$HAVE_FREESURFACEBASE = xyes])
++
+ AC_MSG_RESULT($HAVE_FREESURFACEBASE)
++
+ dnl }}}
+ dnl with-FreeSurfaceTop{{{
++
+ AC_ARG_WITH([FreeSurfaceTop],
++
+ 	AS_HELP_STRING([--with-FreeSurfaceTop = YES], [compile with FreeSurfaceTop capabilities (default is yes)]),
++
+ 	[FREESURFACETOP=$withval],[FREESURFACETOP=yes])
++
+ AC_MSG_CHECKING(for FreeSurfaceTop capability compilation)
+ 
++
+ HAVE_FREESURFACETOP=no 
++
+ if test "x$FREESURFACETOP" = "xyes"; then
++
+ 	HAVE_FREESURFACETOP=yes
++
+ 	AC_DEFINE([_HAVE_FREESURFACETOP_],[1],[with FreeSurfaceTopcapability])
++
+ fi
++
+ AM_CONDITIONAL([FREESURFACETOP], [test x$HAVE_FREESURFACETOP = xyes])
++
+ AC_MSG_RESULT($HAVE_FREESURFACETOP)
++
+ dnl }}}
+ dnl with-ExtrudeFromBase{{{
++
+ AC_ARG_WITH([ExtrudeFromBase],
++
+ 	AS_HELP_STRING([--with-ExtrudeFromBase = YES], [compile with ExtrudeFromBase capabilities (default is yes)]),
++
+ 	[EXTRUDEFROMBASE=$withval],[EXTRUDEFROMBASE=yes])
++
+ AC_MSG_CHECKING(for ExtrudeFromBase capability compilation)
+ 
++
+ HAVE_EXTRUDEFROMBASE=no 
++
+ if test "x$EXTRUDEFROMBASE" = "xyes"; then
++
+ 	HAVE_EXTRUDEFROMBASE=yes
++
+ 	AC_DEFINE([_HAVE_EXTRUDEFROMBASE_],[1],[with ExtrudeFromBasecapability])
++
+ fi
++
+ AM_CONDITIONAL([EXTRUDEFROMBASE], [test x$HAVE_EXTRUDEFROMBASE = xyes])
++
+ AC_MSG_RESULT($HAVE_EXTRUDEFROMBASE)
++
+ dnl }}}
+ dnl with-ExtrudeFromTop{{{
++
+ AC_ARG_WITH([ExtrudeFromTop],
++
+ 	AS_HELP_STRING([--with-ExtrudeFromTop = YES], [compile with ExtrudeFromTop capabilities (default is yes)]),
++
+ 	[EXTRUDEFROMTOP=$withval],[EXTRUDEFROMTOP=yes])
++
+ AC_MSG_CHECKING(for ExtrudeFromTop capability compilation)
+ 
++
+ HAVE_EXTRUDEFROMTOP=no 
++
+ if test "x$EXTRUDEFROMTOP" = "xyes"; then
++
+ 	HAVE_EXTRUDEFROMTOP=yes
++
+ 	AC_DEFINE([_HAVE_EXTRUDEFROMTOP_],[1],[with ExtrudeFromTopcapability])
++
+ fi
++
+ AM_CONDITIONAL([EXTRUDEFROMTOP], [test x$HAVE_EXTRUDEFROMTOP = xyes])
++
+ AC_MSG_RESULT($HAVE_EXTRUDEFROMTOP)
++
+ dnl }}}
+ dnl with-DepthAverage{{{
++
+ AC_ARG_WITH([DepthAverage],
++
+ 	AS_HELP_STRING([--with-DepthAverage = YES], [compile with DepthAverage capabilities (default is yes)]),
++
+ 	[DEPTHAVERAGE=$withval],[DEPTHAVERAGE=yes])
++
+ AC_MSG_CHECKING(for DepthAverage capability compilation)
+ 
++
+ HAVE_DEPTHAVERAGE=no 
++
+ if test "x$DEPTHAVERAGE" = "xyes"; then
++
+ 	HAVE_DEPTHAVERAGE=yes
++
+ 	AC_DEFINE([_HAVE_DEPTHAVERAGE_],[1],[with DepthAveragecapability])
++
+ fi
++
+ AM_CONDITIONAL([DEPTHAVERAGE], [test x$HAVE_DEPTHAVERAGE = xyes])
++
+ AC_MSG_RESULT($HAVE_DEPTHAVERAGE)
++
+ dnl }}}
+ dnl with-SmoothedSurfaceSlopeX{{{
++
+ AC_ARG_WITH([SmoothedSurfaceSlopeX],
++
+ 	AS_HELP_STRING([--with-SmoothedSurfaceSlopeX = YES], [compile with SmoothedSurfaceSlopeX capabilities (default is yes)]),
++
+ 	[SMOOTHEDSURFACESLOPEX=$withval],[SMOOTHEDSURFACESLOPEX=yes])
++
+ AC_MSG_CHECKING(for SmoothedSurfaceSlopeX capability compilation)
+ 
++
+ HAVE_SMOOTHEDSURFACESLOPEX=no 
++
+ if test "x$SMOOTHEDSURFACESLOPEX" = "xyes"; then
++
+ 	HAVE_SMOOTHEDSURFACESLOPEX=yes
++
+ 	AC_DEFINE([_HAVE_SMOOTHEDSURFACESLOPEX_],[1],[with SmoothedSurfaceSlopeXcapability])
++
+ fi
++
+ AM_CONDITIONAL([SMOOTHEDSURFACESLOPEX], [test x$HAVE_SMOOTHEDSURFACESLOPEX = xyes])
++
+ AC_MSG_RESULT($HAVE_SMOOTHEDSURFACESLOPEX)
++
+ dnl }}}
+ dnl with-SmoothedSurfaceSlopeY{{{
++
+ AC_ARG_WITH([SmoothedSurfaceSlopeY],
++
+ 	AS_HELP_STRING([--with-SmoothedSurfaceSlopeY = YES], [compile with SmoothedSurfaceSlopeY capabilities (default is yes)]),
++
+ 	[SMOOTHEDSURFACESLOPEY=$withval],[SMOOTHEDSURFACESLOPEY=yes])
++
+ AC_MSG_CHECKING(for SmoothedSurfaceSlopeY capability compilation)
+ 
++
+ HAVE_SMOOTHEDSURFACESLOPEY=no 
++
+ if test "x$SMOOTHEDSURFACESLOPEY" = "xyes"; then
++
+ 	HAVE_SMOOTHEDSURFACESLOPEY=yes
++
+ 	AC_DEFINE([_HAVE_SMOOTHEDSURFACESLOPEY_],[1],[with SmoothedSurfaceSlopeYcapability])
++
+ fi
++
+ AM_CONDITIONAL([SMOOTHEDSURFACESLOPEY], [test x$HAVE_SMOOTHEDSURFACESLOPEY = xyes])
++
+ AC_MSG_RESULT($HAVE_SMOOTHEDSURFACESLOPEY)
+-dnl }}}
+-dnl with-UzawaPressure{{{
+-AC_ARG_WITH([UzawaPressure],
+-	AS_HELP_STRING([--with-UzawaPressure = YES], [compile with UzawaPressure capabilities (default is yes)]),
+-	[UZAWAPRESSURE=$withval],[UZAWAPRESSURE=yes])
+-AC_MSG_CHECKING(for UzawaPressure capability compilation)
+ 
+-HAVE_UZAWAPRESSURE=no 
+-if test "x$UZAWAPRESSURE" = "xyes"; then
+-	HAVE_UZAWAPRESSURE=yes
+-	AC_DEFINE([_HAVE_UZAWAPRESSURE_],[1],[with UzawaPressurecapability])
+-fi
+-AM_CONDITIONAL([UZAWAPRESSURE], [test x$HAVE_UZAWAPRESSURE = xyes])
+-AC_MSG_RESULT($HAVE_UZAWAPRESSURE)
+ dnl }}}
+ dnl with-Thermal{{{
++
+ AC_ARG_WITH([Thermal],
++
+ 	AS_HELP_STRING([--with-Thermal = YES], [compile with Thermal capabilities (default is yes)]),
++
+ 	[THERMAL=$withval],[THERMAL=yes])
++
+ AC_MSG_CHECKING(for Thermal capability compilation)
+ 
++
+ HAVE_THERMAL=no 
++
+ if test "x$THERMAL" = "xyes"; then
++
+ 	HAVE_THERMAL=yes
++
+ 	AC_DEFINE([_HAVE_THERMAL_],[1],[with Thermalcapability])
++
+ fi
++
+ AM_CONDITIONAL([THERMAL], [test x$HAVE_THERMAL = xyes])
++
+ AC_MSG_RESULT($HAVE_THERMAL)
++
+ dnl }}}
++dnl with-UzawaPressure{{{
++
++AC_ARG_WITH([UzawaPressure],
++
++	AS_HELP_STRING([--with-UzawaPressure = YES], [compile with UzawaPressure capabilities (default is yes)]),
++
++	[UZAWAPRESSURE=$withval],[UZAWAPRESSURE=yes])
++
++AC_MSG_CHECKING(for UzawaPressure capability compilation)
++
++
++HAVE_UZAWAPRESSURE=no 
++
++if test "x$UZAWAPRESSURE" = "xyes"; then
++
++	HAVE_UZAWAPRESSURE=yes
++
++	AC_DEFINE([_HAVE_UZAWAPRESSURE_],[1],[with UzawaPressurecapability])
++
++fi
++
++AM_CONDITIONAL([UZAWAPRESSURE], [test x$HAVE_UZAWAPRESSURE = xyes])
++
++AC_MSG_RESULT($HAVE_UZAWAPRESSURE)
++
++dnl }}}
+ dnl with-Gia{{{
++
+ AC_ARG_WITH([Gia],
++
+ 	AS_HELP_STRING([--with-Gia = YES], [compile with Gia capabilities (default is yes)]),
++
+ 	[GIA=$withval],[GIA=yes])
++
+ AC_MSG_CHECKING(for Gia capability compilation)
+ 
++
+ HAVE_GIA=no 
++
+ if test "x$GIA" = "xyes"; then
++
+ 	HAVE_GIA=yes
++
+ 	AC_DEFINE([_HAVE_GIA_],[1],[with Giacapability])
++
+ fi
++
+ AM_CONDITIONAL([GIA], [test x$HAVE_GIA = xyes])
++
+ AC_MSG_RESULT($HAVE_GIA)
++
+ dnl }}}
++dnl with-Seaice{{{
++
++AC_ARG_WITH([Seaice],
++
++	AS_HELP_STRING([--with-Seaice = YES], [compile with Seaice capabilities (default is yes)]),
++
++	[SEAICE=$withval],[SEAICE=yes])
++
++AC_MSG_CHECKING(for Seaice capability compilation)
++
++
++HAVE_SEAICE=no 
++
++if test "x$SEAICE" = "xyes"; then
++
++	HAVE_SEAICE=yes
++
++	AC_DEFINE([_HAVE_SEAICE_],[1],[with Seaicecapability])
++
++fi
++
++AM_CONDITIONAL([SEAICE], [test x$HAVE_SEAICE = xyes])
++
++AC_MSG_RESULT($HAVE_SEAICE)
++
++dnl }}}
+ dnl with-Meshdeformation{{{
++
+ AC_ARG_WITH([Meshdeformation],
++
+ 	AS_HELP_STRING([--with-Meshdeformation = YES], [compile with Meshdeformation capabilities (default is yes)]),
++
+ 	[MESHDEFORMATION=$withval],[MESHDEFORMATION=yes])
++
+ AC_MSG_CHECKING(for Meshdeformation capability compilation)
+ 
++
+ HAVE_MESHDEFORMATION=no 
++
+ if test "x$MESHDEFORMATION" = "xyes"; then
++
+ 	HAVE_MESHDEFORMATION=yes
++
+ 	AC_DEFINE([_HAVE_MESHDEFORMATION_],[1],[with Meshdeformationcapability])
++
+ fi
++
+ AM_CONDITIONAL([MESHDEFORMATION], [test x$HAVE_MESHDEFORMATION = xyes])
++
+ AC_MSG_RESULT($HAVE_MESHDEFORMATION)
++
+ dnl }}}
+ dnl with-Levelset{{{
++
+ AC_ARG_WITH([Levelset],
++
+ 	AS_HELP_STRING([--with-Levelset = YES], [compile with Levelset capabilities (default is yes)]),
++
+ 	[LEVELSET=$withval],[LEVELSET=yes])
++
+ AC_MSG_CHECKING(for Levelset capability compilation)
+ 
++
+ HAVE_LEVELSET=no 
++
+ if test "x$LEVELSET" = "xyes"; then
++
+ 	HAVE_LEVELSET=yes
++
+ 	AC_DEFINE([_HAVE_LEVELSET_],[1],[with Levelsetcapability])
++
+ fi
++
+ AM_CONDITIONAL([LEVELSET], [test x$HAVE_LEVELSET = xyes])
++
+ AC_MSG_RESULT($HAVE_LEVELSET)
++
+ dnl }}}
+ dnl with-Extrapolation{{{
++
+ AC_ARG_WITH([Extrapolation],
++
+ 	AS_HELP_STRING([--with-Extrapolation = YES], [compile with Extrapolation capabilities (default is yes)]),
++
+ 	[EXTRAPOLATION=$withval],[EXTRAPOLATION=yes])
++
+ AC_MSG_CHECKING(for Extrapolation capability compilation)
+ 
++
+ HAVE_EXTRAPOLATION=no 
++
+ if test "x$EXTRAPOLATION" = "xyes"; then
++
+ 	HAVE_EXTRAPOLATION=yes
++
+ 	AC_DEFINE([_HAVE_EXTRAPOLATION_],[1],[with Extrapolationcapability])
++
+ fi
++
+ AM_CONDITIONAL([EXTRAPOLATION], [test x$HAVE_EXTRAPOLATION = xyes])
++
+ AC_MSG_RESULT($HAVE_EXTRAPOLATION)
++
+ dnl }}}
+ dnl with-LsfReinitialization{{{
++
+ AC_ARG_WITH([LsfReinitialization],
++
+ 	AS_HELP_STRING([--with-LsfReinitialization = YES], [compile with LsfReinitialization capabilities (default is yes)]),
++
+ 	[LSFREINITIALIZATION=$withval],[LSFREINITIALIZATION=yes])
++
+ AC_MSG_CHECKING(for LsfReinitialization capability compilation)
+ 
++
+ HAVE_LSFREINITIALIZATION=no 
++
+ if test "x$LSFREINITIALIZATION" = "xyes"; then
++
+ 	HAVE_LSFREINITIALIZATION=yes
++
+ 	AC_DEFINE([_HAVE_LSFREINITIALIZATION_],[1],[with LsfReinitializationcapability])
++
+ fi
++
+ AM_CONDITIONAL([LSFREINITIALIZATION], [test x$HAVE_LSFREINITIALIZATION = xyes])
++
+ AC_MSG_RESULT($HAVE_LSFREINITIALIZATION)
++
+ dnl }}}
+ 
+ ])
+Index: ../trunk-jpl/src/c/analyses/SeaiceAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SeaiceAnalysis.h	(revision 0)
++++ ../trunk-jpl/src/c/analyses/SeaiceAnalysis.h	(revision 18492)
+@@ -0,0 +1,38 @@
++/*! \file SeaiceAnalysis.h 
++ *  \brief: header file for generic external result object
++ */
++
++#ifndef _SeaiceAnalysis_
++#define _SeaiceAnalysis_
++
++/*Headers*/
++#include "./Analysis.h"
++
++class SeaiceAnalysis: public Analysis{
++
++	public:
++		/*Model processing*/
++		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++
++		/*Finite element Analysis*/
++		void           Core(FemModel* femmodel);
++		ElementVector* CreateDVector(Element* element);
++		ElementMatrix* CreateJacobianMatrix(Element* element);
++		ElementMatrix* CreateKMatrix(Element* element);
++		ElementVector* CreatePVector(Element* element);
++		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void UpdateConstraints(FemModel* femmodel);
++
++		/*Sea ice specifics*/
++		void CreateCTensor(IssmDouble* C,Element* element,Gauss* gauss);
++		void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void GetM(IssmDouble* M,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++};
++#endif
+Index: ../trunk-jpl/src/c/analyses/EnumToAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnumToAnalysis.cpp	(revision 18491)
++++ ../trunk-jpl/src/c/analyses/EnumToAnalysis.cpp	(revision 18492)
+@@ -100,6 +100,9 @@
+ 		#ifdef _HAVE_GIA_
+ 		case GiaAnalysisEnum : return new GiaAnalysis();
+ 		#endif
++		#ifdef _HAVE_SEAICE_
++		case SeaiceAnalysisEnum : return new SeaiceAnalysis();
++		#endif
+ 		#ifdef _HAVE_MESHDEFORMATION_
+ 		case MeshdeformationAnalysisEnum : return new MeshdeformationAnalysis();
+ 		#endif
+Index: ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 0)
++++ ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18492)
+@@ -0,0 +1,343 @@
++#include "./SeaiceAnalysis.h"
++#include "../toolkits/toolkits.h"
++#include "../classes/classes.h"
++#include "../shared/shared.h"
++#include "../modules/modules.h"
++
++/*Model processing*/
++int  SeaiceAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
++	return 2;
++}/*}}}*/
++void SeaiceAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++}/*}}}*/
++void SeaiceAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
++
++	/*Make sure we are in 2D horizontal*/
++	if(iomodel->domaintype!=Domain2DhorizontalEnum) _error_("Only 2D model are supported");
++
++	/*Update the elements so that they are aware of this analysis*/
++	int counter=0;
++	for(int i=0;i<iomodel->numberofelements;i++){
++		if(iomodel->my_elements[i]){
++			Element* element=(Element*)elements->GetObjectByOffset(counter);
++			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
++			counter++;
++		}
++	}
++
++	/*Push to the elements all the inputs that we need*/
++	iomodel->FetchDataToInput(elements,SeaiceThicknessEnum);
++	iomodel->FetchDataToInput(elements,SeaiceConcentrationEnum);
++	iomodel->FetchDataToInput(elements,BasalforcingsOceanSshEnum);
++	iomodel->FetchDataToInput(elements,BasalforcingsOceanVxEnum);
++	iomodel->FetchDataToInput(elements,BasalforcingsOceanVyEnum);
++	iomodel->FetchDataToInput(elements,SurfaceforcingsWindVxEnum);
++	iomodel->FetchDataToInput(elements,SurfaceforcingsWindVyEnum);
++	iomodel->FetchDataToInput(elements,MaterialsDamageEnum);
++	iomodel->FetchDataToInput(elements,VxStarEnum);
++	iomodel->FetchDataToInput(elements,VyStarEnum);
++	iomodel->FetchDataToInput(elements,VxEnum);
++	iomodel->FetchDataToInput(elements,VyEnum);
++}/*}}}*/
++void SeaiceAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++
++	::CreateNodes(nodes,iomodel,SeaiceAnalysisEnum,P1Enum);
++
++}/*}}}*/
++void SeaiceAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++
++	const int finiteelement = P1Enum;
++	IoModelToConstraintsx(constraints,iomodel,SeaiceSpcvxEnum,SeaiceAnalysisEnum,finiteelement,0);
++	IoModelToConstraintsx(constraints,iomodel,SeaiceSpcvyEnum,SeaiceAnalysisEnum,finiteelement,1);
++}/*}}}*/
++void SeaiceAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++	return;
++}/*}}}*/
++
++/*Finite Element Analysis*/
++void           SeaiceAnalysis::Core(FemModel* femmodel){/*{{{*/
++	_error_("not implemented");
++}/*}}}*/
++ElementVector* SeaiceAnalysis::CreateDVector(Element* element){/*{{{*/
++	/*Default, return NULL*/
++	return NULL;
++}/*}}}*/
++ElementMatrix* SeaiceAnalysis::CreateJacobianMatrix(Element* element){/*{{{*/
++_error_("Not implemented");
++}/*}}}*/
++ElementMatrix* SeaiceAnalysis::CreateKMatrix(Element* element){/*{{{*/
++
++	/* Check if there is ice in this element */
++	Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input);
++	if(concentration_input->Max()==0.) return NULL;
++
++	/*Intermediaries */
++	IssmDouble  Jdet,D_scalar,dt;
++	IssmDouble  C[3][3];
++	IssmDouble* xyz_list = NULL;
++
++	/*Fetch number of nodes and dof for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++	int numdof   = numnodes*2;
++
++	/*Initialize Element vector and other vectors*/
++	ElementMatrix* Ke      = element->NewElementMatrix();
++	IssmDouble*    B       = xNew<IssmDouble>(3*numdof);
++	IssmDouble*    M       = xNew<IssmDouble>(numdof);
++
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinates(&xyz_list);
++	element->FindParam(&dt,TimesteppingTimeStepEnum);
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGauss(2);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++
++		gauss->GaussPoint(ig);
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++
++		/*Create first part of the stiffness matrix*/
++		this->GetM(M,element,xyz_list,gauss);
++		D_scalar=gauss->weight*Jdet;
++		TripleMultiply(M,1,numdof,1,
++					&D_scalar,1,1,0,
++					M,1,numdof,0,
++					&Ke->values[0],1);
++
++		/*Create Elasitc part*/
++		this->GetB(B,element,xyz_list,gauss);
++		this->CreateCTensor(&C[0][0],element,gauss);
++		for(int i=0;i<3;i++){
++			for(int j=0;j<3;j++){
++				C[i][j] = gauss->weight*Jdet*dt*C[i][j];
++			}
++		}
++		TripleMultiply(B,3,numdof,1,
++					&C[0][0],3,3,0,
++					B,3,numdof,0,
++					&Ke->values[0],1);
++	}
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(B);
++	delete gauss;
++	return Ke;
++}
++/*}}}*/
++ElementVector* SeaiceAnalysis::CreatePVector(Element* element){/*{{{*/
++
++	/* Check if there is ice in this element */
++	Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input);
++	if(concentration_input->Max()==0.) return NULL;
++
++	/*Intermediaries */
++	IssmDouble  concentration,thickness,dt,Jdet,vx,vy;
++	IssmDouble  rho_air,air_coef,air_lin_drag_coef,air_quad_drag_coef;
++	IssmDouble  windvx,windvy,wind_vnorm;
++	IssmDouble* xyz_list = NULL;
++
++	/*Fetch number of nodes and dof for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++	int numdof   = 2*numnodes;
++
++	/*Initialize Element vector and vectors*/
++	ElementVector* pe    = element->NewElementVector();
++	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
++
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinates(&xyz_list);
++	element->FindParam(&dt,TimesteppingTimeStepEnum);
++	element->FindParam(&rho_air,SurfaceforcingsRhoAirEnum);
++	element->FindParam(&air_coef,SurfaceforcingsAirCoefEnum);
++	element->FindParam(&air_lin_drag_coef,SurfaceforcingsAirLinDragCoefEnum);
++	element->FindParam(&air_quad_drag_coef,SurfaceforcingsAirQuadDragCoefEnum);
++	Input* vx_input            = element->GetInput(VxEnum);                    _assert_(vx_input);
++	Input* vy_input            = element->GetInput(VyEnum);                    _assert_(vy_input);
++	Input* windvx_input        = element->GetInput(SurfaceforcingsWindVxEnum); _assert_(windvx_input);
++	Input* windvy_input        = element->GetInput(SurfaceforcingsWindVyEnum); _assert_(windvy_input);
++	Input* thickness_input     = element->GetInput(SeaiceThicknessEnum);       _assert_(thickness_input);
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGauss(2);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++
++		gauss->GaussPoint(ig);
++
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		element->NodalFunctions(basis, gauss);
++
++		thickness_input->GetInputValue(&thickness,gauss);
++		concentration_input->GetInputValue(&concentration,gauss);
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		windvx_input->GetInputValue(&windvx,gauss);
++		windvy_input->GetInputValue(&windvy,gauss);
++
++		/*Atmespheric forcing*/
++		wind_vnorm = sqrt(windvx*windvx + windvy*windvy);
++
++		for(int i=0;i<numnodes;i++){
++			pe->values[i*2+0] += dt*concentration*air_coef*rho_air*(air_lin_drag_coef+air_quad_drag_coef*wind_vnorm)*windvx*Jdet*gauss->weight*basis[i];
++			pe->values[i*2+1] += dt*concentration*air_coef*rho_air*(air_lin_drag_coef+air_quad_drag_coef*wind_vnorm)*windvy*Jdet*gauss->weight*basis[i];
++		}
++	}
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(basis);
++	delete gauss;
++	return pe;
++}/*}}}*/
++void SeaiceAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++	   _error_("not implemented yet");
++}/*}}}*/
++void SeaiceAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++	_error_("Not implemented yet");
++}/*}}}*/
++void SeaiceAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++
++	/*Intermediaries*/
++	int*        doflist=NULL;
++	IssmDouble* xyz_list=NULL;
++
++	/*Fetch number of nodes and dof for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++	int numdof   = numnodes*2;
++
++	/*Fetch dof list and allocate solution vectors*/
++	element->GetDofList(&doflist,SSAApproximationEnum,GsetEnum);
++	IssmDouble* values    = xNew<IssmDouble>(numdof);
++	IssmDouble* vx        = xNew<IssmDouble>(numnodes);
++	IssmDouble* vy        = xNew<IssmDouble>(numnodes);
++	IssmDouble* vel       = xNew<IssmDouble>(numnodes);
++
++	/*Use the dof list to index into the solution vector: */
++	for(int i=0;i<numdof;i++) values[i]=solution[doflist[i]];
++
++	/*Ok, we have vx and vy in values, fill in vx and vy arrays: */
++	for(int i=0;i<numnodes;i++){
++		vx[i]=values[i*2+0];
++		vy[i]=values[i*2+1];
++		if(xIsNan<IssmDouble>(vx[i])) _error_("NaN found in solution vector");
++		if(xIsNan<IssmDouble>(vy[i])) _error_("NaN found in solution vector");
++	}
++
++	/*Compute vel*/
++	for(int i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i]);
++
++	/*Add vx and vy as inputs to the tria element: */
++	element->AddInput(VxEnum,vx,element->GetElementType());
++	element->AddInput(VyEnum,vy,element->GetElementType());
++	element->AddInput(VelEnum,vel,element->GetElementType());
++
++	/*Free ressources:*/
++	xDelete<IssmDouble>(vel);
++	xDelete<IssmDouble>(vy);
++	xDelete<IssmDouble>(vx);
++	xDelete<IssmDouble>(values);
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<int>(doflist);
++}/*}}}*/
++void SeaiceAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++	/*Default, do nothing*/
++	return;
++}/*}}}*/
++
++/*Intermediary functions*/
++void SeaiceAnalysis::CreateCTensor(IssmDouble* C,Element* element,Gauss* gauss){/*{{{*/
++
++	/*Intermediaries*/
++	IssmDouble D[3][3];
++	IssmDouble damage,thickness,concentration;
++
++	/*Get Material parameters*/
++	IssmDouble poisson          = element->GetMaterialParameter(MaterialsPoissonEnum);
++	IssmDouble young_modulus    = element->GetMaterialParameter(MaterialsYoungModulusEnum);
++	IssmDouble ridging_exponent = element->GetMaterialParameter(MaterialsRidgingExponentEnum);
++
++	/*Get damage input at this location*/
++	Input* damage_input        = element->GetInput(MaterialsDamageEnum);     _assert_(damage_input);
++	Input* thickness_input     = element->GetInput(SeaiceThicknessEnum);     _assert_(thickness_input);
++	Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input);
++	damage_input->GetInputValue(&damage,gauss);
++	thickness_input->GetInputValue(&thickness,gauss);
++	concentration_input->GetInputValue(&concentration,gauss);
++
++	/*Build D tensor once for all*/
++	D[0][0] = 1.;      D[0][1] = poisson; D[0][2] = 0.;
++	D[1][0] = poisson; D[1][1] = 1.;      D[1][2] = 0.;
++	D[2][0] = 0.;      D[2][1] = 0;       D[2][2] = (1.-poisson)/2.;
++	for(int i=0;i<3;i++){
++		for(int j=0;j<3;j++){
++			D[i][j] = D[i][j]/(1-poisson*poisson);
++		}
++	}
++
++	/*Get f(A), E*/
++	IssmDouble f = exp(ridging_exponent*(1.-concentration));
++	IssmDouble E = young_modulus*(1.-damage)*f;
++
++	/*Let's build C = hE*D */
++	for(int i=0;i<3;i++){
++		for(int j=0;j<3;j++){
++			C[i*3+j] = thickness*E*D[i][j];
++		}
++	}
++}/*}}}*/
++void SeaiceAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
++	 * For node i, Bi can be expressed in the actual coordinate system
++	 * by: 
++	 *       Bi=[ dN/dx           0    ] 
++	 *          [   0           dN/dy  ]      
++	 *          [ 1/2*dN/dy  1/2*dN/dx ]     
++	 * where N is the basis function for node i.
++	 *
++	 * We assume B has been allocated already           */
++
++	/*Fetch number of nodes for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++
++	/*Get nodal functions derivatives*/
++	IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);
++	element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
++
++	/*Build B: */
++	for(int i=0;i<numnodes;i++){
++		B[2*numnodes*0+2*i+0] = dbasis[0*numnodes+i];
++		B[2*numnodes*0+2*i+1] = 0.;
++		B[2*numnodes*1+2*i+0] = 0.;
++		B[2*numnodes*1+2*i+1] = dbasis[1*numnodes+i];
++		B[2*numnodes*2+2*i+0] = .5*dbasis[1*numnodes+i];
++		B[2*numnodes*2+2*i+1] = .5*dbasis[0*numnodes+i];
++	}
++
++	/*Clean-up*/
++	xDelete<IssmDouble>(dbasis);
++}/*}}}*/
++void SeaiceAnalysis::GetM(IssmDouble* M,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++	/*Compute M  matrix. M=[M1 M2 M3] where Mi is of size 3*NDOF2. 
++	 * For node i, Mi can be expressed in the actual coordinate system
++	 * by: 
++	 *       Mi=[ N  N ] 
++	 * where N is the basis function for node i.
++	 *
++	 * We assume M has been allocated already           */
++
++	/*Fetch number of nodes for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++
++	/*Get nodal functions derivatives*/
++	IssmDouble* basis=xNew<IssmDouble>(numnodes);
++	element->NodalFunctions(basis,gauss);
++
++	/*Build M: */
++	for(int i=0;i<numnodes;i++){
++		M[2*i+0] = basis[i];
++		M[2*i+1] = basis[i];
++	}
++
++	/*Clean-up*/
++	xDelete<IssmDouble>(basis);
++}/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/analyses.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/analyses.h	(revision 18491)
++++ ../trunk-jpl/src/c/analyses/analyses.h	(revision 18492)
+@@ -33,6 +33,7 @@
+ #include "./MeshdeformationAnalysis.h"
+ #include "./SmoothedSurfaceSlopeXAnalysis.h"
+ #include "./SmoothedSurfaceSlopeYAnalysis.h"
++#include "./SeaiceAnalysis.h"
+ #include "./StressbalanceAnalysis.h"
+ #include "./StressbalanceSIAAnalysis.h"
+ #include "./StressbalanceVerticalAnalysis.h"
+Index: ../trunk-jpl/src/c/bamg/Mesh.cpp
+===================================================================
+--- ../trunk-jpl/src/c/bamg/Mesh.cpp	(revision 18491)
++++ ../trunk-jpl/src/c/bamg/Mesh.cpp	(revision 18492)
+@@ -241,7 +241,7 @@
+ 			if (Gh.NbRef>0) Gh.NbRef--;
+ 			else if (Gh.NbRef==0) delete &Gh;
+ 		}
+-		if(&BTh && (&BTh != this)){
++		if(&BTh && (&BTh != this) && false){
+ 			if (BTh.NbRef>0) BTh.NbRef--;
+ 			else if (BTh.NbRef==0) delete &BTh;
+ 		}
+@@ -4504,308 +4504,295 @@
+ 		/*Get options*/
+ 		int verbose=bamgopts->verbose;
+ 
+-		Gh.NbRef++;// add a ref to Gh
++		/*Intermediaries*/
++		int                i,k;
++		int                nbcurves    = 0;
++		int                NbNewPoints,NbEdgeCurve;
++		double             lcurve,lstep,s;
++		const int          MaxSubEdge  = 10;
+ 
+-		/************************************************************************* 
+-		 * method in 2 steps
+-		 * 1 - compute the number of new edges to allocate
+-		 * 2 - construct the edges
+-		 * remark:
+-		 * in this part we suppose to have a background mesh with the same geometry 
+-		 * 
+-		 * To construct the discretization of the new mesh we have to 
+-		 * rediscretize the boundary of background Mesh 
+-		 * because we have only the pointeur from the background mesh to the geometry.
+-		 * We need the abcisse of the background mesh vertices on geometry
+-		 * so a vertex is 
+-		 * 0 on GeomVertex ;
+-		 * 1 on GeomEdge + abcisse
+-		 * 2 internal 
+-		 *************************************************************************/
++		R2          AB;
++		GeomVertex *a, *b;
++		BamgVertex *va,*vb;
++		GeomEdge   *e;
+ 
+-		//Check that background mesh and current mesh do have the same geometry
+-		_assert_(&BTh.Gh==&Gh);
+-		BTh.NbRef++; // add a ref to BackGround Mesh
++		// add a ref to GH to make sure that it is not destroyed by mistake
++		Gh.NbRef++;
+ 
+-		//Initialize new mesh
+-		BTh.SetVertexFieldOn();
+-		int* bcurve = new int[Gh.nbcurves]; // 
++		//build background mesh flag (1 if background, else 0)
++		bool background=(&BTh != this);
+ 
+-		/* There are 2 ways to make the loop 
+-		 * 1) on the geometry 
+-		 * 2) on the background mesh
+-		 *  if you do the loop on geometry, we don't have the pointeur on background,
+-		 *  and if you do the loop in background we have the pointeur on geometry
+-		 * so do the walk on  background */
++		/*Build VerticesOnGeomVertex*/
+ 
+-		NbVerticesOnGeomVertex=0;
+-		NbVerticesOnGeomEdge=0;
++		//Compute the number of geometrical vertices that we are going to use to mesh
++		for (i=0;i<Gh.nbv;i++){
++			if (Gh[i].Required()) NbVerticesOnGeomVertex++;
++		}
++		//allocate
++		VerticesOnGeomVertex = new VertexOnGeom[NbVerticesOnGeomVertex];  
++		if(NbVerticesOnGeomVertex >= maxnbv) _error_("too many vertices on geometry: " << NbVerticesOnGeomVertex << " >= " << maxnbv);
++		_assert_(nbv==0);
++		//Build VerticesOnGeomVertex
++		for (i=0;i<Gh.nbv;i++){
++			/* Add vertex only if required*/
++			if (Gh[i].Required()) {//Gh  vertices Required
+ 
+-		/*STEP 1 copy of Required vertices*/
++				//Add the vertex
++				_assert_(nbv<maxnbv);
++				vertices[nbv]=Gh[i];
+ 
+-		int i; 
+-		for (i=0;i<Gh.nbv;i++) if (Gh[i].Required()) NbVerticesOnGeomVertex++;
+-		printf("\n");
+-		if(NbVerticesOnGeomVertex >= maxnbv){
+-			_error_("too many vertices on geometry: " << NbVerticesOnGeomVertex << " >= " << maxnbv);
+-		}
++				//Add pointer from geometry (Gh) to vertex from mesh (Th)
++				Gh[i].MeshVertexHook=vertices+nbv;
+ 
+-		VerticesOnGeomVertex = new VertexOnGeom[  NbVerticesOnGeomVertex];
+-		VertexOnBThVertex    = new VertexOnVertex[NbVerticesOnGeomVertex];
++				//Build VerticesOnGeomVertex for current point
++				VerticesOnGeomVertex[nbv]=VertexOnGeom(*Gh[i].MeshVertexHook,Gh[i]);
+ 
+-		//At this point there is NO vertex but vertices should have been allocated by Init
+-		_assert_(vertices);
+-		for (i=0;i<Gh.nbv;i++){
+-			if (Gh[i].Required()) {//Gh vertices Required
+-				vertices[nbv]  =Gh[i];
+-				vertices[nbv].i=I2(0,0);
+-				Gh[i].MeshVertexHook = vertices + nbv;// save Geom -> Th
+-				VerticesOnGeomVertex[nbv]= VertexOnGeom(vertices[nbv],Gh[i]);
++				//nbv increment
+ 				nbv++;
+ 			}
+-			else Gh[i].MeshVertexHook=0;
+-		} 
+-		for (i=0;i<BTh.NbVerticesOnGeomVertex;i++){ 
+-			VertexOnGeom &vog=BTh.VerticesOnGeomVertex[i];
+-			if (vog.IsRequiredVertex()){
+-				GeomVertex* gv=vog;
+-				BamgVertex *bv = vog;
+-				_assert_(gv->MeshVertexHook); // use of Geom -> Th
+-				VertexOnBThVertex[NbVertexOnBThVertex++]=VertexOnVertex(gv->MeshVertexHook,bv);
+-				gv->MeshVertexHook->m = bv->m; // for taking the metric of the background mesh
+-			}
+ 		}
+-		_assert_(NbVertexOnBThVertex==NbVerticesOnGeomVertex); /*This might be due to MaxCornerAngle too small*/
+ 
+-		/*STEP 2: reseed boundary edges*/
++		/*Build VerticesOnGeomEdge*/
+ 
+-		//  find the begining of the curve in BTh
+-		Gh.UnMarkEdges();	
+-		int bfind=0;
+-		for (int i=0;i<Gh.nbcurves;i++) bcurve[i]=-1; 
++		//check that edges is still empty (Init)
++		_assert_(!edges);
+ 
+-		/*Loop over the backgrounf mesh BTh edges*/
+-		for (int iedge=0;iedge<BTh.nbe;iedge++){      
+-			Edge &ei = BTh.edges[iedge];
++		/* Now we are going to create the first edges corresponding
++		 * to the one present in the geometry provided.
++		 * We proceed in 2 steps
++		 *  -step 0: we count all the edges
++		 *           we allocate the number of edges at the end of step 0
++		 *  -step 1: the edges are created */
++		for (int step=0;step<2;step++){
+ 
+-			/*Loop over the 2 vertices of the current edge*/
+-			for(int je=0;je<2;je++){
++			//initialize number of edges and number of edges max
++			long nbex=0;
++			nbe=0;
++			long NbVerticesOnGeomEdge0=NbVerticesOnGeomEdge;
++			Gh.UnMarkEdges();	
++			nbcurves=0;
+ 
+-				/* If one of the vertex is required we are in a new curve*/
+-				if (ei[je].GeomEdgeHook->IsRequiredVertex()){ 
++			//go through the edges of the geometry
++			for (i=0;i<Gh.nbe;i++){
+ 
+-					/*Get curve number*/
+-					int nc=ei.GeomEdgeHook->CurveNumber;
++				//ei = current Geometrical edge
++				GeomEdge &ei=Gh.edges[i];   
+ 
+-					//_printf_("Dealing with curve number " << nc << "\n");
+-					//_printf_("edge on geometry is same as GhCurve? " << (ei.GeomEdgeHook==Gh.curves[nc].FirstEdge || ei.GeomEdgeHook==Gh.curves[nc].LastEdge)?"yes":"no\n");
+-					//if(ei.GeomEdgeHook==Gh.curves[nc].FirstEdge || ei.GeomEdgeHook==Gh.curves[nc].LastEdge){
+-					//	_printf_("Do we have the right extremity? curve first vertex -> " << ((GeomVertex *)*ei[je].GeomEdgeHook==&(*Gh.curves[nc].FirstEdge)[Gh.curves[nc].FirstVertexIndex])?"yes":"no\n");
+-					//	_printf_("Do we have the right extremity? curve last  vertex -> " << ((GeomVertex *)*ei[je].GeomEdgeHook==&(*Gh.curves[nc].LastEdge)[Gh.curves[nc].LastVertexIndex])?"yes":"no\n");
+-					//}
+-					//BUG FIX from original bamg
+-					/*Check that we are on the same edge and right vertex (0 or 1) */
+-					if(ei.GeomEdgeHook==Gh.curves[nc].FirstEdge  && (GeomVertex *)*ei[je].GeomEdgeHook==&(*Gh.curves[nc].FirstEdge)[Gh.curves[nc].FirstVertexIndex]){
+-						bcurve[nc]=iedge*2+je;
+-						bfind++;	
+-					}
+-					else if ((ei.GeomEdgeHook==Gh.curves[nc].LastEdge  && (GeomVertex *)*ei[je].GeomEdgeHook==&(*Gh.curves[nc].LastEdge)[Gh.curves[nc].LastVertexIndex]) && bcurve[nc]==-1){
+-						bcurve[nc]=iedge*2+je;
+-						bfind++;	
+-					}
+-				}
+-			}
+-		} 
+-		if (bfind!=Gh.nbcurves){
+-			delete [] bcurve;
+-			_error_("problem generating number of curves (" << Gh.nbcurves << " found in the geometry but " << bfind << " curve found in the mesh)");
+-		}
++				//loop over the two vertices of the edge ei
++				for(int j=0;j<2;j++) {
+ 
+-		// method in 2 + 1 step 
+-		//  0.0) compute the length and the number of vertex to do allocation
+-		//  1.0) recompute the length
+-		//  1.1) compute the  vertex 
++					/*Take only required vertices (corner->beginning of a new curve)*/
++					if (!ei.Mark() && ei[j].Required()){ 
+ 
+-		long nbex=0,NbVerticesOnGeomEdgex=0;
+-		for (int step=0; step <2;step++){
++						long  nbvend=0;
++						Edge* PreviousNewEdge=NULL;
++						lstep = -1;
+ 
+-			long NbOfNewPoints=0;
+-			long NbOfNewEdge=0;
+-			long iedge;
+-			Gh.UnMarkEdges();	
+-			double L=0;
++						/*If Edge is required (do that only once for the 2 vertices)*/
++						if(ei.Required()){
++							if (j==0){
++								//do not create internal points if required (take it as is)
++								if(step==0) nbe++;
++								else{ 
++									e=&ei;
++									a=ei(0);
++									b=ei(1);
+ 
+-			/*Go through all geometrical curve*/
+-			for (int icurve=0;icurve<Gh.nbcurves;icurve++){ 
++									//check that edges has been allocated
++									_assert_(edges);
++									edges[nbe].v[0]=a->MeshVertexHook;
++									edges[nbe].v[1]=b->MeshVertexHook;;
++									edges[nbe].ReferenceNumber = e->ReferenceNumber;
++									edges[nbe].GeomEdgeHook = e;
++									edges[nbe].adj[0] = 0;
++									edges[nbe].adj[1] = 0;
++									nbe++;
++								}
++							}
++						}
+ 
+-				/*Get edge and vertex (index) of background mesh on this curve*/
+-				iedge=bcurve[icurve]/2;
+-				int jedge=bcurve[icurve]%2;
++						/*If Edge is not required: we are on a curve*/
++						else {
++							for (int kstep=0;kstep<=step;kstep++){
++								//kstep=0, compute number of edges (discretize curve)
++								//kstep=1  create the points and edge
++								PreviousNewEdge=0;
++								NbNewPoints=0;
++								NbEdgeCurve=0;
++								if (nbvend>=maxnbv) _error_("maximum number of vertices too low! Check the domain outline or increase maxnbv");
++								lcurve =0;
++								s = lstep; //-1 initially, then length of each sub edge
+ 
+-				/*Get edge of Bth with index iedge*/
+-				Edge &ei = BTh.edges[iedge];
++								/*reminder: i = edge number, j=[0;1] vertex index in edge*/
++								k=j;            // k = vertex index in edge (0 or 1)
++								e=&ei;          // e = reference of current edge
++								a=ei(k);        // a = pointer toward the kth vertex of the current edge
++								va = a->MeshVertexHook; // va = pointer toward mesh vertex associated
++								e->SetMark();   // Mark edge
+ 
+-				/*Initialize variables*/
+-				double Lstep=0;             // step between two points   (phase==1) 
+-				long NbCreatePointOnCurve=0;// Nb of new points on curve (phase==1) 
++								/*Loop until we reach the end of the curve*/
++								for(;;){ 
++									k = 1-k;            // other vertx index of the curve
++									b = (*e)(k);        // b = pointer toward the other vertex of the current edge
++									AB= b->r - a->r;   // AB = vector of the current edge
++									Metric MA = background ? BTh.MetricAt(a->r) :a->m ;  //Get metric associated to A
++									Metric MB = background ? BTh.MetricAt(b->r) :b->m ;  //Get metric associated to B
++									double ledge = (MA(AB) + MB(AB))/2;                  //Get edge length in metric
+ 
+-				/*Do phase 0 to step*/
+-				for(int phase=0;phase<=step;phase++){
++									/* We are now creating the mesh edges from the geometrical edge selected above.
++									 * The edge will be divided according to the metric previously computed and cannot
++									 * be divided more than 10 times (MaxSubEdge). */
+ 
+-					/*Current curve pointer*/
+-					Curve *curve= Gh.curves+icurve;
++									//By default, there is only one subedge that is the geometrical edge itself
++									int NbSubEdge = 1;
+ 
+-					/*Get index of current curve*/
+-					int icurveequi= Gh.GetId(curve);
++									//initialize lSubEdge, holding the length of each subedge (cannot be higher than 10)
++									double lSubEdge[MaxSubEdge];
+ 
+-					/*For phase 0, check that we are at the begining of the curve only*/
+-					if(phase==0 &&  icurveequi!=icurve)  continue;
++									//Build Subedges according to the edge length
++									if (ledge < 1.5){
++										//if ledge < 1.5 (between one and 2), take the edge as is
++										lSubEdge[0] = ledge;
++									}
++									//else, divide the edge
++									else {
++										//compute number of subedges (division of the edge), Maximum is 10
++										NbSubEdge = Min( MaxSubEdge, (int) (ledge +0.5));
++										/*Now, we are going to divide the edge according to the metric.
++										 * Get segment by sement along the edge.
++										 * Build lSubEdge, which holds the distance between the first vertex
++										 * of the edge and the next point on the edge according to the 
++										 * discretization (each SubEdge is AB)*/
++										R2 A,B;
++										A=a->r;
++										Metric MAs=MA,MBs;
++										ledge=0; 
++										double x =0, xstep= 1./NbSubEdge;
++										for (int kk=0; kk < NbSubEdge; kk++,A=B,MAs=MBs ) {
++											x += xstep;
++											B =  e->F(k ? x : 1-x);
++											MBs= background ? BTh.MetricAt(B) : Metric(1-x,MA,x,MB);
++											AB = A-B;
++											lSubEdge[kk]=(ledge+=(MAs(AB)+MBs(AB))/2);
++										}
++									}
+ 
+-					int   k0=jedge,k1;
+-					Edge* pe=  BTh.edges+iedge;
+-					int   iedgeequi=bcurve[icurveequi]/2;
+-					int   jedgeequi=bcurve[icurveequi]%2;
++									double lcurveb = lcurve+ledge;
+ 
+-					int k0equi=jedgeequi,k1equi;		  
+-					Edge * peequi= BTh.edges+iedgeequi;
+-					GeomEdge *ongequi = peequi->GeomEdgeHook;
++									/*Now, create corresponding points*/
++									while(s>=lcurve && s<=lcurveb && nbv<nbvend){
+ 
+-					double sNew=Lstep;// abscisse of the new points (phase==1) 
+-					L=0;// length of the curve
+-					long i=0;// index of new points on the curve
+-					GeomVertex * GA0 = *(*peequi)[k0equi].GeomEdgeHook;
+-					BamgVertex *A0;
+-					A0 = GA0->MeshVertexHook;  // the vertex in new mesh
+-					BamgVertex *A1;
+-					VertexOnGeom *GA1;
+-					Edge* PreviousNewEdge = 0;
++										/*Schematic of current curve
++										 *
++										 *  a                   vb                  b          // vertex
++										 *  0              ll0     ll1              ledge      // length from a
++										 *  + --- + - ... - + --S-- + --- + - ... - +          // where is S
++										 *  0              kk0     kk1              NbSubEdge  // Sub edge index
++										 *
++										 */
+ 
+-					// New Curve phase 
+-					_assert_(A0-vertices>=0 && A0-vertices<nbv);
+-					if(ongequi->Required()){
+-						GeomVertex *GA1 = *(*peequi)[1-k0equi].GeomEdgeHook;
+-						A1 = GA1->MeshVertexHook;  //
+-					}       
+-					else {
+-						for(;;){
+-							Edge &ee=*pe; 
+-							Edge &eeequi=*peequi; 
+-							k1 = 1-k0; // next vertex of the edge 
+-							k1equi= 1 - k0equi;
+-							_assert_(pe && ee.GeomEdgeHook);
+-							ee.GeomEdgeHook->SetMark();
+-							BamgVertex & v0=ee[0], & v1=ee[1];
+-							R2 AB=(R2)v1-(R2)v0;
+-							double L0=L,LAB;
+-							LAB=LengthInterpole(v0.m,v1.m,AB);
+-							L+= LAB;
++										double ss = s-lcurve;
+ 
+-							if (phase){
+-								// computation of the new points for the given curve
+-								while ((i!=NbCreatePointOnCurve) && sNew<=L) { 
++										/*Find the SubEdge containing ss using Dichotomy*/
++										int kk0=-1,kk1=NbSubEdge-1,kkk;
++										double ll0=0,ll1=ledge,llk;
++										while (kk1-kk0>1){
++											if (ss < (llk=lSubEdge[kkk=(kk0+kk1)/2]))
++											 kk1=kkk,ll1=llk;
++											else
++											 kk0=kkk,ll0=llk;
++										}
++										_assert_(kk1!=kk0);
+ 
+-									//some checks
+-									_assert_(sNew>=L0);
+-									_assert_(LAB);
+-									_assert_(vertices && nbv<maxnbv);
+-									_assert_(edges && nbe<nbex);
+-									_assert_(VerticesOnGeomEdge && NbVerticesOnGeomEdge<NbVerticesOnGeomEdgex);
++										/*Curvilinear coordinate in [0 1] of ss in current edge*/
++										// WARNING: This is what we would do
++										// ssa = (ss-ll0)/(ll1-ll0);
++										// aa = (kk0+ssa)/NbSubEdge
++										// This is what Bamg does:
++										double sbb = (ss-ll0)/(ll1-ll0);
++										/*Curvilinear coordinate in [0 1] of ss in current curve*/
++										double bb = (kk1+sbb)/NbSubEdge;
++										double aa = 1-bb;
+ 
+-									// new vertex on edge
+-									A1=vertices+nbv++;
+-									GA1=VerticesOnGeomEdge+NbVerticesOnGeomEdge;
+-									Edge* e = edges + nbe++;
+-									double se= (sNew-L0)/LAB;
+-									if (se<0 || se>=1.000000001){
+-										_error_("Problem creating point on a boundary: se=" << se << " should be in [0 1]");
++										// new vertex on edge
++										vb = &vertices[nbv++];
++										vb->m = Metric(aa,a->m,bb,b->m);
++										vb->ReferenceNumber = e->ReferenceNumber;
++										vb->DirOfSearch =NoDirOfSearch;
++										double abcisse = k ? bb : aa;
++										vb->r =  e->F(abcisse);
++										VerticesOnGeomEdge[NbVerticesOnGeomEdge++]= VertexOnGeom(*vb,*e,abcisse);        
++
++										// to take into account the direction of the edge
++										s += lstep;
++										edges[nbe].v[0]=va;
++										edges[nbe].v[1]=vb;
++										edges[nbe].ReferenceNumber =e->ReferenceNumber;
++										edges[nbe].GeomEdgeHook = e;
++										edges[nbe].adj[0] = PreviousNewEdge;
++										if(PreviousNewEdge) PreviousNewEdge->adj[1]=&edges[nbe];
++										PreviousNewEdge=edges+nbe;
++										nbe++;
++										va = vb;
+ 									}
+-									se = abscisseInterpole(v0.m,v1.m,AB,se,1);
+-									if (se<0 || se>1){
+-										_error_("Problem creating point on a boundary: se=" << se << " should be in [0 1]");
+-									}
+-									se = k1         ? se : 1. - se;
+-									se = k1==k1equi ? se : 1. - se;
+-									VertexOnBThEdge[NbVerticesOnGeomEdge++] = VertexOnEdge(A1,&eeequi,se); // save 
+-									ongequi=Gh.ProjectOnCurve(eeequi,se,*A1,*GA1); 
+-									A1->ReferenceNumber = eeequi.ReferenceNumber;
+-									A1->DirOfSearch =NoDirOfSearch;
+-									e->GeomEdgeHook = ongequi;
+-									e->v[0]=A0;
+-									e->v[1]=A1;
+-									e->ReferenceNumber = eeequi.ReferenceNumber;
+-									e->adj[0]=PreviousNewEdge;
+ 
+-									if (PreviousNewEdge) PreviousNewEdge->adj[1]=e;
+-									PreviousNewEdge=e;
+-									A0=A1;
+-									sNew += Lstep;
+-									if (++i== NbCreatePointOnCurve) break;
++									/*We just added one edge to the curve: Go to the next one*/
++									lcurve = lcurveb;
++									e->SetMark();
++									a=b;
++
++									/*If b is required, we are on a new curve->break*/
++									if (b->Required()) break;
++									int kprev=k;
++									k = e->AdjVertexIndex[kprev];// next vertices
++									e = e->Adj[kprev];
++									_assert_(e);
++								}// for(;;)
++								vb = b->MeshVertexHook;
++
++								/*Number of edges in the last disretized curve*/
++								NbEdgeCurve = Max((long) (lcurve +0.5), (long) 1);
++								/*Number of internal vertices in the last disretized curve*/
++								NbNewPoints = NbEdgeCurve-1;
++								if(!kstep){
++									NbVerticesOnGeomEdge0 += NbNewPoints;
++									nbcurves++;
+ 								}
++								nbvend=nbv+NbNewPoints; 
++								lstep = lcurve / NbEdgeCurve; //approximately one
++							}// end of curve --
++							if (edges) { // last edges of the curves 
++								edges[nbe].v[0]=va;
++								edges[nbe].v[1]=vb;
++								edges[nbe].ReferenceNumber = e->ReferenceNumber;
++								edges[nbe].GeomEdgeHook = e;
++								edges[nbe].adj[0] = PreviousNewEdge;
++								edges[nbe].adj[1] = 0;
++								if(PreviousNewEdge) PreviousNewEdge->adj[1] = & edges[nbe];
++								nbe++;
+ 							}
+-
+-							//some checks
+-							_assert_(ee.GeomEdgeHook->CurveNumber==ei.GeomEdgeHook->CurveNumber);
+-							if (ee[k1].GeomEdgeHook->IsRequiredVertex()) {
+-								_assert_(eeequi[k1equi].GeomEdgeHook->IsRequiredVertex());
+-								GeomVertex * GA1 = *eeequi[k1equi].GeomEdgeHook;
+-								A1=GA1->MeshVertexHook;// the vertex in new mesh
+-								_assert_(A1-vertices>=0 && A1-vertices<nbv);
+-								break;
+-							}
+-							if (!ee.adj[k1]) {
+-								_error_("adj edge " << BTh.GetId(ee) << ", nbe=" << nbe << ", Gh.vertices=" << Gh.vertices);
+-							}
+-							pe = ee.adj[k1]; // next edge
+-							k0 = pe->Intersection(ee); 
+-							peequi= eeequi.adj[k1equi];  // next edge
+-							k0equi=peequi->Intersection(eeequi);            
+-						}// for(;;) end of the curve
++							else nbe += NbEdgeCurve;
++						} // end on  curve ---
+ 					}
++				}
++			} // for (i=0;i<nbe;i++)
++			if(!step) {
++				_assert_(!edges);
++				_assert_(!VerticesOnGeomEdge);
+ 
+-					if (phase){ // construction of the last edge
+-						Edge* e=edges + nbe++;
+-						e->GeomEdgeHook  = ongequi;
+-						e->v[0]=A0;
+-						e->v[1]=A1;
+-						e->ReferenceNumber = peequi->ReferenceNumber;
+-						e->adj[0]=PreviousNewEdge;
+-						e->adj[1]=0;
+-						if (PreviousNewEdge) PreviousNewEdge->adj[1]=e;
+-						PreviousNewEdge = e;
++				edges = new Edge[nbex=nbe];
++				if(NbVerticesOnGeomEdge0) VerticesOnGeomEdge = new VertexOnGeom[NbVerticesOnGeomEdge0];
+ 
+-						_assert_(i==NbCreatePointOnCurve);
+-					}
+-
+-					if (!phase)  { // 
+-						long NbSegOnCurve = Max((long)(L+0.5),(long) 1);// nb of seg
+-						Lstep = L/NbSegOnCurve; 
+-						NbCreatePointOnCurve = NbSegOnCurve-1;
+-						NbOfNewEdge += NbSegOnCurve;
+-						NbOfNewPoints += NbCreatePointOnCurve;
+-					}
+-				}
+-			}//  end of curve loop 
+-
+-			//Allocate memory
+-			if(step==0){
+-				if(nbv+NbOfNewPoints > maxnbv) {
+-					_error_("too many vertices on geometry: " << nbv+NbOfNewPoints << " >= " << maxnbv);
+-				}
+-				edges = new Edge[NbOfNewEdge];
+-				nbex = NbOfNewEdge;
+-				if(NbOfNewPoints) {
+-					VerticesOnGeomEdge    = new VertexOnGeom[NbOfNewPoints];
+-					NbVertexOnBThEdge     = NbOfNewPoints;
+-					VertexOnBThEdge       = new  VertexOnEdge[NbOfNewPoints];
+-					NbVerticesOnGeomEdgex = NbOfNewPoints;
+-				}
+-				NbOfNewPoints =0;
+-				NbOfNewEdge = 0;
++				// do the vertex on a geometrical vertex
++				_assert_(VerticesOnGeomEdge || NbVerticesOnGeomEdge0==0);
++				NbVerticesOnGeomEdge0 = NbVerticesOnGeomEdge;       
+ 			}
++			else{
++				_assert_(NbVerticesOnGeomEdge==NbVerticesOnGeomEdge0);
++			}
+ 		}
+-		_assert_(nbe!=0);
+-		delete [] bcurve;
+ 
++
+ 		//Insert points inside existing triangles
+ 		if (verbose>4) _printf_("      -- current number of vertices = " << nbv << "\n");
+ 		if (verbose>3) _printf_("      Creating initial Constrained Delaunay Triangulation...\n");
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18491)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18492)
+@@ -386,6 +386,8 @@
+ 	UzawaPressureAnalysisEnum,
+ 	GiaSolutionEnum,
+ 	GiaAnalysisEnum,
++	SeaiceSolutionEnum,
++	SeaiceAnalysisEnum,
+ 	MeshdeformationSolutionEnum,
+ 	MeshdeformationAnalysisEnum,
+ 	LevelsetAnalysisEnum,
+@@ -741,6 +743,39 @@
+ 	LevelsetfunctionSlopeYEnum,
+ 	LevelsetfunctionPicardEnum,
+ 	/*}}}*/
++	/*Sea Ice {{{*/
++	SeaiceatmEnum,
++	SeaiceoceanEnum,
++	SeaiceThicknessEnum,
++	SeaiceConcentrationEnum,
++	SeaiceSpcvxEnum,
++	SeaiceSpcvyEnum,
++	BasalforcingsRhoOceanEnum,
++	BasalforcingsOceanCoefEnum,
++	BasalforcingsOceanLinDragCoefEnum,
++	BasalforcingsOceanQuadDragCoefEnum,
++	BasalforcingsOceanTurningAngleEnum,
++	BasalforcingsOceanSshEnum,
++	BasalforcingsOceanVxEnum,
++	BasalforcingsOceanVyEnum,
++	SurfaceforcingsRhoAirEnum,
++	SurfaceforcingsAirCoefEnum,
++	SurfaceforcingsAirLinDragCoefEnum,
++	SurfaceforcingsAirQuadDragCoefEnum,
++	SurfaceforcingsWindVxEnum,
++	SurfaceforcingsWindVyEnum,
++	MatseaiceEnum,
++	MaterialsPoissonEnum,
++	MaterialsYoungModulusEnum,
++	MaterialsDamageEnum,
++	MaterialsRidgingExponentEnum,
++	MaterialsCohesionEnum,
++	MaterialsInternalFrictionCoefEnum,
++	MaterialsCompressionCoefEnum,
++	MaterialsTractionCoefEnum,
++	VxStarEnum,
++	VyStarEnum,
++	/*}}}*/
+ 	MaximumNumberOfDefinitionsEnum
+ };
+ 
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18491)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18492)
+@@ -389,6 +389,8 @@
+ 		case UzawaPressureAnalysisEnum : return "UzawaPressureAnalysis";
+ 		case GiaSolutionEnum : return "GiaSolution";
+ 		case GiaAnalysisEnum : return "GiaAnalysis";
++		case SeaiceSolutionEnum : return "SeaiceSolution";
++		case SeaiceAnalysisEnum : return "SeaiceAnalysis";
+ 		case MeshdeformationSolutionEnum : return "MeshdeformationSolution";
+ 		case MeshdeformationAnalysisEnum : return "MeshdeformationAnalysis";
+ 		case LevelsetAnalysisEnum : return "LevelsetAnalysis";
+@@ -701,6 +703,37 @@
+ 		case LevelsetfunctionSlopeXEnum : return "LevelsetfunctionSlopeX";
+ 		case LevelsetfunctionSlopeYEnum : return "LevelsetfunctionSlopeY";
+ 		case LevelsetfunctionPicardEnum : return "LevelsetfunctionPicard";
++		case SeaiceatmEnum : return "Seaiceatm";
++		case SeaiceoceanEnum : return "Seaiceocean";
++		case SeaiceThicknessEnum : return "SeaiceThickness";
++		case SeaiceConcentrationEnum : return "SeaiceConcentration";
++		case SeaiceSpcvxEnum : return "SeaiceSpcvx";
++		case SeaiceSpcvyEnum : return "SeaiceSpcvy";
++		case BasalforcingsRhoOceanEnum : return "BasalforcingsRhoOcean";
++		case BasalforcingsOceanCoefEnum : return "BasalforcingsOceanCoef";
++		case BasalforcingsOceanLinDragCoefEnum : return "BasalforcingsOceanLinDragCoef";
++		case BasalforcingsOceanQuadDragCoefEnum : return "BasalforcingsOceanQuadDragCoef";
++		case BasalforcingsOceanTurningAngleEnum : return "BasalforcingsOceanTurningAngle";
++		case BasalforcingsOceanSshEnum : return "BasalforcingsOceanSsh";
++		case BasalforcingsOceanVxEnum : return "BasalforcingsOceanVx";
++		case BasalforcingsOceanVyEnum : return "BasalforcingsOceanVy";
++		case SurfaceforcingsRhoAirEnum : return "SurfaceforcingsRhoAir";
++		case SurfaceforcingsAirCoefEnum : return "SurfaceforcingsAirCoef";
++		case SurfaceforcingsAirLinDragCoefEnum : return "SurfaceforcingsAirLinDragCoef";
++		case SurfaceforcingsAirQuadDragCoefEnum : return "SurfaceforcingsAirQuadDragCoef";
++		case SurfaceforcingsWindVxEnum : return "SurfaceforcingsWindVx";
++		case SurfaceforcingsWindVyEnum : return "SurfaceforcingsWindVy";
++		case MatseaiceEnum : return "Matseaice";
++		case MaterialsPoissonEnum : return "MaterialsPoisson";
++		case MaterialsYoungModulusEnum : return "MaterialsYoungModulus";
++		case MaterialsDamageEnum : return "MaterialsDamage";
++		case MaterialsRidgingExponentEnum : return "MaterialsRidgingExponent";
++		case MaterialsCohesionEnum : return "MaterialsCohesion";
++		case MaterialsInternalFrictionCoefEnum : return "MaterialsInternalFrictionCoef";
++		case MaterialsCompressionCoefEnum : return "MaterialsCompressionCoef";
++		case MaterialsTractionCoefEnum : return "MaterialsTractionCoef";
++		case VxStarEnum : return "VxStar";
++		case VyStarEnum : return "VyStar";
+ 		case MaximumNumberOfDefinitionsEnum : return "MaximumNumberOfDefinitions";
+ 		default : return "unknown";
+ 
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18491)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18492)
+@@ -398,6 +398,8 @@
+ 	      else if (strcmp(name,"UzawaPressureAnalysis")==0) return UzawaPressureAnalysisEnum;
+ 	      else if (strcmp(name,"GiaSolution")==0) return GiaSolutionEnum;
+ 	      else if (strcmp(name,"GiaAnalysis")==0) return GiaAnalysisEnum;
++	      else if (strcmp(name,"SeaiceSolution")==0) return SeaiceSolutionEnum;
++	      else if (strcmp(name,"SeaiceAnalysis")==0) return SeaiceAnalysisEnum;
+ 	      else if (strcmp(name,"MeshdeformationSolution")==0) return MeshdeformationSolutionEnum;
+ 	      else if (strcmp(name,"MeshdeformationAnalysis")==0) return MeshdeformationAnalysisEnum;
+ 	      else if (strcmp(name,"LevelsetAnalysis")==0) return LevelsetAnalysisEnum;
+@@ -503,12 +505,12 @@
+ 	      else if (strcmp(name,"MassFlux")==0) return MassFluxEnum;
+ 	      else if (strcmp(name,"MeltingOffset")==0) return MeltingOffsetEnum;
+ 	      else if (strcmp(name,"Misfit")==0) return MisfitEnum;
+-	      else if (strcmp(name,"Pressure")==0) return PressureEnum;
+-	      else if (strcmp(name,"PressurePicard")==0) return PressurePicardEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"AndroidFrictionCoefficient")==0) return AndroidFrictionCoefficientEnum;
++	      if (strcmp(name,"Pressure")==0) return PressureEnum;
++	      else if (strcmp(name,"PressurePicard")==0) return PressurePicardEnum;
++	      else if (strcmp(name,"AndroidFrictionCoefficient")==0) return AndroidFrictionCoefficientEnum;
+ 	      else if (strcmp(name,"ResetPenalties")==0) return ResetPenaltiesEnum;
+ 	      else if (strcmp(name,"SegmentOnIceShelf")==0) return SegmentOnIceShelfEnum;
+ 	      else if (strcmp(name,"SurfaceAbsVelMisfit")==0) return SurfaceAbsVelMisfitEnum;
+@@ -626,12 +628,12 @@
+ 	      else if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
+ 	      else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
+ 	      else if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
+-	      else if (strcmp(name,"MinVel")==0) return MinVelEnum;
+-	      else if (strcmp(name,"MaxVel")==0) return MaxVelEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"MinVx")==0) return MinVxEnum;
++	      if (strcmp(name,"MinVel")==0) return MinVelEnum;
++	      else if (strcmp(name,"MaxVel")==0) return MaxVelEnum;
++	      else if (strcmp(name,"MinVx")==0) return MinVxEnum;
+ 	      else if (strcmp(name,"MaxVx")==0) return MaxVxEnum;
+ 	      else if (strcmp(name,"MaxAbsVx")==0) return MaxAbsVxEnum;
+ 	      else if (strcmp(name,"MinVy")==0) return MinVyEnum;
+@@ -716,6 +718,37 @@
+ 	      else if (strcmp(name,"LevelsetfunctionSlopeX")==0) return LevelsetfunctionSlopeXEnum;
+ 	      else if (strcmp(name,"LevelsetfunctionSlopeY")==0) return LevelsetfunctionSlopeYEnum;
+ 	      else if (strcmp(name,"LevelsetfunctionPicard")==0) return LevelsetfunctionPicardEnum;
++	      else if (strcmp(name,"Seaiceatm")==0) return SeaiceatmEnum;
++	      else if (strcmp(name,"Seaiceocean")==0) return SeaiceoceanEnum;
++	      else if (strcmp(name,"SeaiceThickness")==0) return SeaiceThicknessEnum;
++	      else if (strcmp(name,"SeaiceConcentration")==0) return SeaiceConcentrationEnum;
++	      else if (strcmp(name,"SeaiceSpcvx")==0) return SeaiceSpcvxEnum;
++	      else if (strcmp(name,"SeaiceSpcvy")==0) return SeaiceSpcvyEnum;
++	      else if (strcmp(name,"BasalforcingsRhoOcean")==0) return BasalforcingsRhoOceanEnum;
++	      else if (strcmp(name,"BasalforcingsOceanCoef")==0) return BasalforcingsOceanCoefEnum;
++	      else if (strcmp(name,"BasalforcingsOceanLinDragCoef")==0) return BasalforcingsOceanLinDragCoefEnum;
++	      else if (strcmp(name,"BasalforcingsOceanQuadDragCoef")==0) return BasalforcingsOceanQuadDragCoefEnum;
++	      else if (strcmp(name,"BasalforcingsOceanTurningAngle")==0) return BasalforcingsOceanTurningAngleEnum;
++	      else if (strcmp(name,"BasalforcingsOceanSsh")==0) return BasalforcingsOceanSshEnum;
++	      else if (strcmp(name,"BasalforcingsOceanVx")==0) return BasalforcingsOceanVxEnum;
++	      else if (strcmp(name,"BasalforcingsOceanVy")==0) return BasalforcingsOceanVyEnum;
++	      else if (strcmp(name,"SurfaceforcingsRhoAir")==0) return SurfaceforcingsRhoAirEnum;
++	      else if (strcmp(name,"SurfaceforcingsAirCoef")==0) return SurfaceforcingsAirCoefEnum;
++	      else if (strcmp(name,"SurfaceforcingsAirLinDragCoef")==0) return SurfaceforcingsAirLinDragCoefEnum;
++	      else if (strcmp(name,"SurfaceforcingsAirQuadDragCoef")==0) return SurfaceforcingsAirQuadDragCoefEnum;
++	      else if (strcmp(name,"SurfaceforcingsWindVx")==0) return SurfaceforcingsWindVxEnum;
++	      else if (strcmp(name,"SurfaceforcingsWindVy")==0) return SurfaceforcingsWindVyEnum;
++	      else if (strcmp(name,"Matseaice")==0) return MatseaiceEnum;
++	      else if (strcmp(name,"MaterialsPoisson")==0) return MaterialsPoissonEnum;
++	      else if (strcmp(name,"MaterialsYoungModulus")==0) return MaterialsYoungModulusEnum;
++	      else if (strcmp(name,"MaterialsDamage")==0) return MaterialsDamageEnum;
++	      else if (strcmp(name,"MaterialsRidgingExponent")==0) return MaterialsRidgingExponentEnum;
++	      else if (strcmp(name,"MaterialsCohesion")==0) return MaterialsCohesionEnum;
++	      else if (strcmp(name,"MaterialsInternalFrictionCoef")==0) return MaterialsInternalFrictionCoefEnum;
++	      else if (strcmp(name,"MaterialsCompressionCoef")==0) return MaterialsCompressionCoefEnum;
++	      else if (strcmp(name,"MaterialsTractionCoef")==0) return MaterialsTractionCoefEnum;
++	      else if (strcmp(name,"VxStar")==0) return VxStarEnum;
++	      else if (strcmp(name,"VyStar")==0) return VyStarEnum;
+ 	      else if (strcmp(name,"MaximumNumberOfDefinitions")==0) return MaximumNumberOfDefinitionsEnum;
+          else stage=7;
+    }
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 18491)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 18492)
+@@ -42,10 +42,7 @@
+ 	/*Copy some constants from iomodel */
+ 	parameters->AddObject(iomodel->CopyConstantObject(DomainTypeEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(DomainDimensionEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(MeshElementtypeEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(SettingsOutputFrequencyEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(SteadystateReltolEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(SteadystateMaxiterEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(ConstantsYtsEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(TimesteppingStartTimeEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(TimesteppingFinalTimeEnum));
+@@ -56,37 +53,44 @@
+ 	parameters->AddObject(iomodel->CopyConstantObject(SettingsLowmemEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(DebugProfilingEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(MeshAverageVertexConnectivityEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(ConstantsReferencetemperatureEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(SettingsWaitonlockEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(MeshNumberofelementsEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(MeshNumberofverticesEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(SettingsResultsOnNodesEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(SettingsIoGatherEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(GroundinglineMigrationEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(TransientIsstressbalanceEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(TransientIsmasstransportEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(TransientIsthermalEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(TransientIsgroundinglineEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(TransientIsgiaEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(TransientIslevelsetEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(TransientIsdamageevolutionEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(TransientIshydrologyEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(MaterialsRheologyLawEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(AutodiffIsautodiffEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(QmuIsdakotaEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(InversionIscontrolEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(InversionTypeEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(GiaCrossSectionShapeEnum));
++	if(solution_type==SeaiceSolutionEnum){
++	}
++	else{
++		parameters->AddObject(iomodel->CopyConstantObject(MeshElementtypeEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(SteadystateReltolEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(SteadystateMaxiterEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(ConstantsReferencetemperatureEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(GroundinglineMigrationEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(TransientIsstressbalanceEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(TransientIsmasstransportEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(TransientIsthermalEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(TransientIsgroundinglineEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(TransientIsgiaEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(TransientIslevelsetEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(TransientIsdamageevolutionEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(TransientIshydrologyEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(MaterialsRheologyLawEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(GiaCrossSectionShapeEnum));
+ 
+-	/*For stress balance only*/
+-	parameters->AddObject(iomodel->CopyConstantObject(FlowequationIsFSEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceRiftPenaltyThresholdEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceMaxiterEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceRestolEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceReltolEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceAbstolEnum));
+-	if(iomodel->domaintype==Domain3DEnum)
+-	 parameters->AddObject(iomodel->CopyConstantObject(MeshNumberoflayersEnum));
++		/*For stress balance only*/
++		parameters->AddObject(iomodel->CopyConstantObject(FlowequationIsFSEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(StressbalanceRiftPenaltyThresholdEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(StressbalanceMaxiterEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(StressbalanceRestolEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(StressbalanceReltolEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(StressbalanceAbstolEnum));
++		if(iomodel->domaintype==Domain3DEnum)
++		 parameters->AddObject(iomodel->CopyConstantObject(MeshNumberoflayersEnum));
++	}
+ 
+ 	/*Surface mass balance parameters*/
+ 	parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsEnum));
+@@ -128,6 +132,12 @@
+ 		case SMBmeltcomponentsEnum:
+ 			/*Nothing to add to parameters*/
+ 			break;
++		case SeaiceatmEnum:
++			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsRhoAirEnum));
++			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsAirCoefEnum));
++			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsAirLinDragCoefEnum));
++			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsAirQuadDragCoefEnum));
++			break;
+ 		default:
+ 			_error_("Surface mass balance model "<<EnumToStringx(smb_model)<<" not supported yet");
+ 	}
+@@ -144,6 +154,13 @@
+ 			parameters->AddObject(iomodel->CopyConstantObject(BasalforcingsDeepwaterElevationEnum));
+ 			parameters->AddObject(iomodel->CopyConstantObject(BasalforcingsUpperwaterElevationEnum));
+ 			break;
++		case SeaiceoceanEnum:
++			parameters->AddObject(iomodel->CopyConstantObject(BasalforcingsRhoOceanEnum));
++			parameters->AddObject(iomodel->CopyConstantObject(BasalforcingsOceanCoefEnum));
++			parameters->AddObject(iomodel->CopyConstantObject(BasalforcingsOceanLinDragCoefEnum));
++			parameters->AddObject(iomodel->CopyConstantObject(BasalforcingsOceanQuadDragCoefEnum));
++			parameters->AddObject(iomodel->CopyConstantObject(BasalforcingsOceanTurningAngleEnum));
++			break;
+ 		default:
+ 			_error_("Basal forcing model "<<EnumToStringx(smb_model)<<" not supported yet");
+ 	}
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp	(revision 18491)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp	(revision 18492)
+@@ -78,6 +78,10 @@
+ 					_error_("Mesh not supported yet");
+ 			}
+ 			break;
++		case MatseaiceEnum:
++			iomodel->FetchDataToInput(elements,MaterialsDamageEnum);
++			for (i=0;i<iomodel->numberofelements;i++) if(iomodel->my_elements[i]) materials->AddObject(new Matseaice(i+1,i,iomodel));
++			break;
+ 		default:
+ 			_error_("Materials "<<EnumToStringx(materials_type)<<" not supported");
+ 	}
+Index: ../trunk-jpl/src/c/modules/Bamgx/Bamgx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/Bamgx/Bamgx.cpp	(revision 18491)
++++ ../trunk-jpl/src/c/modules/Bamgx/Bamgx.cpp	(revision 18492)
+@@ -199,13 +199,16 @@
+ 		BTh.WriteMetric(bamgopts);
+ 
+ 		/*clean up*/
++		printf("-------------- file: Bamgx.cpp line: %i\n",__LINE__); 
+ 		delete &Th;
++		printf("-------------- file: Bamgx.cpp line: %i\n",__LINE__); 
+ 		//delete &BTh;
+ 		/*}}}*/
+ 	}
+ 
+ 	/*No error return*/
+ 	if (verbosity>1) _printf_("   Exiting Bamg.\n");
++	printf("-------------- file: Bamgx.cpp line: %i\n",__LINE__); 
+ 	return noerr;
+ 
+ }
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 18491)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 18492)
+@@ -107,6 +107,8 @@
+ 					./classes/Materials/Materials.cpp\
+ 					./classes/Materials/Matice.h\
+ 					./classes/Materials/Matice.cpp\
++					./classes/Materials/Matseaice.h\
++					./classes/Materials/Matseaice.cpp\
+ 					./classes/Materials/Matpar.h\
+ 					./classes/Materials/Matpar.cpp\
+ 					./classes/Constraints/Constraints.h\
+@@ -648,6 +650,10 @@
+ if DEPTHAVERAGE
+ issm_sources += ./analyses/DepthAverageAnalysis.cpp
+ endif
++if SEAICE
++issm_sources += ./cores/seaice_core.cpp
++issm_sources += ./analyses/SeaiceAnalysis.cpp
++endif
+ if THERMAL
+ issm_sources += ./analyses/ThermalAnalysis.cpp
+ endif
+Index: ../trunk-jpl/src/c/cores/CorePointerFromSolutionEnum.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/CorePointerFromSolutionEnum.cpp	(revision 18491)
++++ ../trunk-jpl/src/c/cores/CorePointerFromSolutionEnum.cpp	(revision 18492)
+@@ -68,6 +68,9 @@
+ 		case DamageEvolutionSolutionEnum:
+ 			solutioncore=&damage_core;
+ 			break;
++		case SeaiceSolutionEnum:
++			solutioncore=&seaice_core;
++			break;
+ 		default:
+ 			_error_("solution type: " << EnumToStringx(solutiontype) << " not supported yet!");
+ 			break;
+Index: ../trunk-jpl/src/c/cores/seaice_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/seaice_core.cpp	(revision 0)
++++ ../trunk-jpl/src/c/cores/seaice_core.cpp	(revision 18492)
+@@ -0,0 +1,30 @@
++/*!\file: seaice_core.cpp
++ * \brief: core of the seaice solution 
++ */ 
++
++#include "./cores.h"
++#include "../toolkits/toolkits.h"
++#include "../classes/classes.h"
++#include "../shared/shared.h"
++#include "../modules/modules.h"
++#include "../solutionsequences/solutionsequences.h"
++
++void seaice_core(FemModel* femmodel){
++
++	/*parameters: */
++	bool save_results;
++
++	/*recover parameters: */
++	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
++
++	if(VerboseSolution()) _printf0_("call computational core:\n");
++	femmodel->SetCurrentConfiguration(SeaiceAnalysisEnum);
++	solutionsequence_linear(femmodel);
++
++	if(save_results){
++		if(VerboseSolution()) _printf0_("   saving results\n");
++		int outputs[6] = {VxEnum,VyEnum,VelEnum,SeaiceConcentrationEnum,SeaiceThicknessEnum,MaterialsDamageEnum};
++		femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],6);
++	}
++
++}
+Index: ../trunk-jpl/src/c/cores/AnalysisConfiguration.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/AnalysisConfiguration.cpp	(revision 18491)
++++ ../trunk-jpl/src/c/cores/AnalysisConfiguration.cpp	(revision 18492)
+@@ -147,6 +147,12 @@
+ 			analyses[19]=L2ProjectionEPLAnalysisEnum;
+ 			break;
+ 
++		case SeaiceSolutionEnum:
++			numanalyses=1;
++			analyses=xNew<int>(numanalyses);
++			analyses[0]=SeaiceAnalysisEnum;
++			break;
++
+ 		default:
+ 			_error_("solution type: " << EnumToStringx(solutiontype) << " not supported yet!");
+ 			break;
+Index: ../trunk-jpl/src/c/cores/cores.h
+===================================================================
+--- ../trunk-jpl/src/c/cores/cores.h	(revision 18491)
++++ ../trunk-jpl/src/c/cores/cores.h	(revision 18492)
+@@ -44,6 +44,7 @@
+ void dummy_core(FemModel* femmodel);
+ void gia_core(FemModel* femmodel);
+ void damage_core(FemModel* femmodel);
++void seaice_core(FemModel* femmodel);
+ IssmDouble objectivefunction(IssmDouble search_scalar,FemModel* femmodel);
+ 
+ //optimization
+Index: ../trunk-jpl/src/c/classes/Materials/Matseaice.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Matseaice.h	(revision 0)
++++ ../trunk-jpl/src/c/classes/Materials/Matseaice.h	(revision 18492)
+@@ -0,0 +1,75 @@
++/*!\file Matseaice.h
++ * \brief: header file for matice object
++ */
++
++#ifndef MATSEAICE_H_
++#define MATSEAICE_H_
++
++/*Headers:*/
++/*{{{*/
++#include "./Material.h"
++#include "../Hook.h"
++class IoModel;
++class Elements;
++class Element;
++class Loads;
++class Nodes;
++class Vertices;
++class Materials;
++class Parameters;
++/*}}}*/
++
++class Matseaice: public Material{
++
++	private: 
++		int      mid;
++		Hook    *helement;
++		Element *element;
++
++	public:
++		/*Matseaice constructors, destructors: {{{*/
++		Matseaice();
++		Matseaice(int mid,int i, IoModel* iomodel);
++		~Matseaice();
++		/*}}}*/
++		/*Object virtual functions definitions:{{{ */
++		void  Echo();
++		void  DeepEcho();
++		int   Id(); 
++		int   ObjectEnum();
++		Object* copy();
++		/*}}}*/
++		/*Update virtual funictions definitions: {{{*/
++		void  InputUpdateFromVector(IssmDouble* vector, int name, int type){_error_("not implemented");};
++		void  InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrow, int ncols, int name, int type){_error_("not implemented");};
++		void  InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){_error_("not implemented");};
++		void  InputUpdateFromConstant(IssmDouble constant, int name){_error_("not implemented");};
++		void  InputUpdateFromConstant(int constant, int name){_error_("not implemented");};
++		void  InputUpdateFromConstant(bool constant, int name){_error_("not implemented");};
++		void  InputUpdateFromIoModel(int index, IoModel* iomodel){_error_("not implemented");};
++		/*}}}*/
++		/*Material virtual functions resolution: {{{*/
++		void   Configure(Elements* elements);
++		Material*  copy2(Element* element);
++		void       SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
++		void       GetViscosity(IssmDouble* pviscosity, IssmDouble eps_eff){_error_("not supported for this material");};
++		void       GetViscosity_B(IssmDouble* pviscosity, IssmDouble eps_eff){_error_("not supported for this material");};
++		void       GetViscosity_D(IssmDouble* pviscosity, IssmDouble eps_eff){_error_("not supported for this material");};
++		void       GetViscosityBar(IssmDouble* pviscosity, IssmDouble eps_eff){_error_("not supported for this material");};
++		void       GetViscosityComplement(IssmDouble* pviscosity_complement, IssmDouble* pepsilon){_error_("not supported for this material");};
++		void       GetViscosityDComplement(IssmDouble*, IssmDouble*){_error_("not supported for this material");};
++		void       GetViscosityDerivativeEpsSquare(IssmDouble* pmu_prime, IssmDouble* pepsilon){_error_("not supported for this material");};
++		void       GetViscosity2dDerivativeEpsSquare(IssmDouble* pmu_prime, IssmDouble* pepsilon){_error_("not supported for this material");};
++		IssmDouble GetA(){_error_("not supported for this material");};
++		IssmDouble GetAbar(){_error_("not supported for this material");};
++		IssmDouble GetB(){_error_("not supported for this material");};
++		IssmDouble GetBbar(){_error_("not supported for this material");};
++		IssmDouble GetD(){_error_("not supported for this material");};
++		IssmDouble GetDbar(){_error_("not supported for this material");};
++		IssmDouble GetN(){_error_("not supported for this material");};
++		bool       IsDamage(){_error_("not supported for this material");};
++		void       ResetHooks();
++		/*}}}*/
++};
++
++#endif  /* _MATICE_H_ */
+Index: ../trunk-jpl/src/c/classes/Materials/Matpar.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 18491)
++++ ../trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 18492)
+@@ -19,76 +19,94 @@
+ Matpar::Matpar(int matpar_mid, IoModel* iomodel){/*{{{*/
+ 
+ 	bool isefficientlayer;
+-	int  hydrology_model,smb_model;
++	int  hydrology_model,smb_model,materials_type;
+ 	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
+ 	iomodel->Constant(&smb_model,SurfaceforcingsEnum);
++	iomodel->Constant(&materials_type,MaterialsEnum);
+ 
+ 	this->mid = matpar_mid;
+-	iomodel->Constant(&this->rho_ice,MaterialsRhoIceEnum);
+-	iomodel->Constant(&this->rho_water,MaterialsRhoSeawaterEnum);
+-	iomodel->Constant(&this->rho_freshwater,MaterialsRhoFreshwaterEnum);
+-	iomodel->Constant(&this->mu_water,MaterialsMuWaterEnum);
+-	iomodel->Constant(&this->heatcapacity,MaterialsHeatcapacityEnum);
+-	iomodel->Constant(&this->thermalconductivity,MaterialsThermalconductivityEnum);
+-	iomodel->Constant(&this->temperateiceconductivity,MaterialsTemperateiceconductivityEnum);
+-	iomodel->Constant(&this->latentheat,MaterialsLatentheatEnum);
+-	iomodel->Constant(&this->beta,MaterialsBetaEnum);
+-	iomodel->Constant(&this->meltingpoint,MaterialsMeltingpointEnum);
+-	iomodel->Constant(&this->referencetemperature,ConstantsReferencetemperatureEnum);
+-	iomodel->Constant(&this->mixed_layer_capacity,MaterialsMixedLayerCapacityEnum);
+-	iomodel->Constant(&this->thermal_exchange_velocity,MaterialsThermalExchangeVelocityEnum);
+-	iomodel->Constant(&this->g,ConstantsGEnum);
+ 
+-	switch(smb_model){
+-		case SMBEnum:
+-			/*Nothing to add*/
++	switch(materials_type){
++		case MaticeEnum:
++			iomodel->Constant(&this->rho_ice,MaterialsRhoIceEnum);
++			iomodel->Constant(&this->rho_water,MaterialsRhoSeawaterEnum);
++			iomodel->Constant(&this->rho_freshwater,MaterialsRhoFreshwaterEnum);
++			iomodel->Constant(&this->mu_water,MaterialsMuWaterEnum);
++			iomodel->Constant(&this->heatcapacity,MaterialsHeatcapacityEnum);
++			iomodel->Constant(&this->thermalconductivity,MaterialsThermalconductivityEnum);
++			iomodel->Constant(&this->temperateiceconductivity,MaterialsTemperateiceconductivityEnum);
++			iomodel->Constant(&this->latentheat,MaterialsLatentheatEnum);
++			iomodel->Constant(&this->beta,MaterialsBetaEnum);
++			iomodel->Constant(&this->meltingpoint,MaterialsMeltingpointEnum);
++			iomodel->Constant(&this->referencetemperature,ConstantsReferencetemperatureEnum);
++			iomodel->Constant(&this->mixed_layer_capacity,MaterialsMixedLayerCapacityEnum);
++			iomodel->Constant(&this->thermal_exchange_velocity,MaterialsThermalExchangeVelocityEnum);
++			iomodel->Constant(&this->g,ConstantsGEnum);
++
++			switch(smb_model){
++				case SMBEnum:
++					/*Nothing to add*/
++					break;
++				case SMBpddEnum:
++					iomodel->Constant(&this->desfac,SurfaceforcingsDesfacEnum);
++					iomodel->Constant(&this->s0p,SurfaceforcingsS0pEnum);
++					break;
++				case SMBgradientsEnum:
++					/*Nothing to add*/
++					break;
++				case SMBhenningEnum:
++					/*Nothing to add*/
++					break;
++				case SMBcomponentsEnum:
++					/*Nothing to add*/
++					break;
++				case SMBmeltcomponentsEnum:
++					/*Nothing to add*/
++					break;
++				default:
++					_error_("Surface mass balance model "<<EnumToStringx(smb_model)<<" not supported yet");
++			}
++			if(hydrology_model==HydrologydcEnum){
++				iomodel->Constant(&this->sediment_compressibility,HydrologydcSedimentCompressibilityEnum);
++				iomodel->Constant(&this->sediment_porosity,HydrologydcSedimentPorosityEnum);
++				iomodel->Constant(&this->sediment_thickness,HydrologydcSedimentThicknessEnum);
++				iomodel->Constant(&this->water_compressibility,HydrologydcWaterCompressibilityEnum);
++				iomodel->Constant(&isefficientlayer,HydrologydcIsefficientlayerEnum);
++
++				if(isefficientlayer){
++					iomodel->Constant(&this->epl_compressibility,HydrologydcEplCompressibilityEnum);
++					iomodel->Constant(&this->epl_porosity,HydrologydcEplPorosityEnum);
++					iomodel->Constant(&this->epl_init_thickness,HydrologydcEplInitialThicknessEnum);
++					iomodel->Constant(&this->epl_max_thickness,HydrologydcEplMaxThicknessEnum);
++					iomodel->Constant(&this->epl_conductivity,HydrologydcEplConductivityEnum);
++				}
++			}
++			else if(hydrology_model==HydrologyshreveEnum){
++				/*Nothing to add*/
++			}
++			else{
++				_error_("Hydrology model "<<EnumToStringx(hydrology_model)<<" not supported yet");
++			}
++
++			/*gia: */
++			iomodel->Constant(&this->lithosphere_shear_modulus,MaterialsLithosphereShearModulusEnum);
++			iomodel->Constant(&this->lithosphere_density,MaterialsLithosphereDensityEnum);
++			iomodel->Constant(&this->mantle_shear_modulus,MaterialsMantleShearModulusEnum);
++			iomodel->Constant(&this->mantle_density,MaterialsMantleDensityEnum);
+ 			break;
+-		case SMBpddEnum:
+-			iomodel->Constant(&this->desfac,SurfaceforcingsDesfacEnum);
+-			iomodel->Constant(&this->s0p,SurfaceforcingsS0pEnum);
++		case MatseaiceEnum:
++			iomodel->Constant(&this->poisson,MaterialsPoissonEnum);
++			iomodel->Constant(&this->young_modulus,MaterialsYoungModulusEnum);
++			iomodel->Constant(&this->ridging_exponent,MaterialsRidgingExponentEnum);
++			iomodel->Constant(&this->cohesion,MaterialsCohesionEnum);
++			iomodel->Constant(&this->internal_friction_coef,MaterialsInternalFrictionCoefEnum);
++			iomodel->Constant(&this->compression_coef,MaterialsCompressionCoefEnum);
++			iomodel->Constant(&this->traction_coef,MaterialsTractionCoefEnum);
++			iomodel->Constant(&this->g,ConstantsGEnum);
+ 			break;
+-		case SMBgradientsEnum:
+-			/*Nothing to add*/
+-			break;
+-		case SMBhenningEnum:
+-			/*Nothing to add*/
+-			break;
+-		case SMBcomponentsEnum:
+-			/*Nothing to add*/
+-			break;
+-		case SMBmeltcomponentsEnum:
+-			/*Nothing to add*/
+-			break;
+ 		default:
+-			_error_("Surface mass balance model "<<EnumToStringx(smb_model)<<" not supported yet");
++			_error_("Material not supported yet");
+ 	}
+-	if(hydrology_model==HydrologydcEnum){
+-		iomodel->Constant(&this->sediment_compressibility,HydrologydcSedimentCompressibilityEnum);
+-		iomodel->Constant(&this->sediment_porosity,HydrologydcSedimentPorosityEnum);
+-		iomodel->Constant(&this->sediment_thickness,HydrologydcSedimentThicknessEnum);
+-		iomodel->Constant(&this->water_compressibility,HydrologydcWaterCompressibilityEnum);
+-		iomodel->Constant(&isefficientlayer,HydrologydcIsefficientlayerEnum);
+-
+-		if(isefficientlayer){
+-				iomodel->Constant(&this->epl_compressibility,HydrologydcEplCompressibilityEnum);
+-				iomodel->Constant(&this->epl_porosity,HydrologydcEplPorosityEnum);
+-				iomodel->Constant(&this->epl_init_thickness,HydrologydcEplInitialThicknessEnum);
+-				iomodel->Constant(&this->epl_max_thickness,HydrologydcEplMaxThicknessEnum);
+-				iomodel->Constant(&this->epl_conductivity,HydrologydcEplConductivityEnum);
+-		}
+-	}
+-	else if(hydrology_model==HydrologyshreveEnum){
+-		/*Nothing to add*/
+-	}
+-	else{
+-		_error_("Hydrology model "<<EnumToStringx(hydrology_model)<<" not supported yet");
+-	}
+-
+-	/*gia: */
+-	iomodel->Constant(&this->lithosphere_shear_modulus,MaterialsLithosphereShearModulusEnum);
+-	iomodel->Constant(&this->lithosphere_density,MaterialsLithosphereDensityEnum);
+-	iomodel->Constant(&this->mantle_shear_modulus,MaterialsMantleShearModulusEnum);
+-	iomodel->Constant(&this->mantle_density,MaterialsMantleDensityEnum);
+ }
+ /*}}}*/
+ Matpar::~Matpar(){/*{{{*/
+@@ -292,6 +310,13 @@
+ 		case HydrologydcEplMaxThicknessEnum:         return this->epl_max_thickness;
+ 		case HydrologydcWaterCompressibilityEnum:    return this->water_compressibility;
+ 		case ConstantsGEnum:                         return this->g;
++		case MaterialsPoissonEnum:                   return this->poisson;
++		case MaterialsYoungModulusEnum:              return this->young_modulus;
++		case MaterialsRidgingExponentEnum:				return this->ridging_exponent;
++		case MaterialsCohesionEnum:		            return this->cohesion;
++		case MaterialsInternalFrictionCoefEnum:		return this->internal_friction_coef;
++		case MaterialsCompressionCoefEnum:				return this->compression_coef;
++		case MaterialsTractionCoefEnum:					return this->traction_coef;
+ 		default: _error_("Enum "<<EnumToStringx(enum_in)<<" not supported yet");
+ 	}
+ 
+Index: ../trunk-jpl/src/c/classes/Materials/Matpar.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Matpar.h	(revision 18491)
++++ ../trunk-jpl/src/c/classes/Materials/Matpar.h	(revision 18492)
+@@ -50,6 +50,15 @@
+ 		IssmDouble mantle_shear_modulus;
+ 		IssmDouble mantle_density;
+ 
++		/*Sea ice*/
++		IssmDouble poisson;
++		IssmDouble young_modulus;
++		IssmDouble ridging_exponent;
++		IssmDouble cohesion;
++		IssmDouble internal_friction_coef;
++		IssmDouble compression_coef;
++		IssmDouble traction_coef;
++
+ 	public:
+ 		Matpar();
+ 		Matpar(int matpar_id, IoModel* iomodel);
+Index: ../trunk-jpl/src/c/classes/Materials/Matseaice.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Matseaice.cpp	(revision 0)
++++ ../trunk-jpl/src/c/classes/Materials/Matseaice.cpp	(revision 18492)
+@@ -0,0 +1,136 @@
++/*!\file Matseaice.c
++ * \brief: implementation of the Matseaice object
++ */
++
++#ifdef HAVE_CONFIG_H
++	#include <config.h>
++#else
++#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
++#endif
++
++#include "./Matseaice.h"
++#include "./Materials.h"
++#include "../Inputs/Input.h"
++#include "../Inputs/Inputs.h"
++#include "../Inputs/TriaInput.h"
++#include "../Inputs/PentaInput.h"
++#include "../Inputs/ControlInput.h"
++#include "../Elements/Element.h"
++#include "../Elements/Tria.h"
++#include "../Elements/Penta.h"
++#include "../Params/Parameters.h"
++#include "../Vertex.h"
++#include "../Hook.h"
++#include "../Node.h"
++#include "../IoModel.h"
++#include "../../shared/shared.h"
++
++/*Matseaice constructors and destructor*/
++Matseaice::Matseaice(){/*{{{*/
++	this->helement=NULL;
++	this->element=NULL;
++	return;
++}
++/*}}}*/
++Matseaice::Matseaice(int matice_mid,int index, IoModel* iomodel){/*{{{*/
++
++	/*Intermediaries:*/
++	int    matice_eid;
++
++	/*Initialize id*/
++	this->mid=matice_mid;
++
++	/*Hooks: */
++	matice_eid=index+1;
++	this->helement=new Hook(&matice_eid,1);
++	this->element=NULL;
++
++	return;
++}
++/*}}}*/
++Matseaice::~Matseaice(){/*{{{*/
++	delete helement;
++	return;
++}
++/*}}}*/
++
++/*Object virtual functions definitions:*/
++void Matseaice::Echo(void){/*{{{*/
++
++	_printf_("Matseaice:\n");
++	_printf_("   mid: " << mid << "\n");
++	_printf_("   element:\n");
++	helement->Echo();
++}
++/*}}}*/
++void Matseaice::DeepEcho(void){/*{{{*/
++
++	_printf_("Matseaice:\n");
++	_printf_("   mid: " << mid << "\n");
++	_printf_("   element:\n");
++	helement->Echo();
++}		
++/*}}}*/
++int  Matseaice::Id(void){ return mid; }/*{{{*/
++/*}}}*/
++int Matseaice::ObjectEnum(void){/*{{{*/
++
++	return MatseaiceEnum;
++
++}
++/*}}}*/
++Object* Matseaice::copy() {/*{{{*/
++
++	/*Output*/
++	Matseaice* matice=NULL;
++
++	/*Initialize output*/
++	matice=new Matseaice();
++
++	/*copy fields: */
++	matice->mid=this->mid;
++	matice->helement=(Hook*)this->helement->copy();
++	matice->element =(Element*)this->helement->delivers();
++
++	return matice;
++}
++/*}}}*/
++Material* Matseaice::copy2(Element* element_in) {/*{{{*/
++
++	/*Output*/
++	Matseaice* matice=NULL;
++
++	/*Initialize output*/
++	matice=new Matseaice();
++
++	/*copy fields: */
++	matice->mid=this->mid;
++	matice->helement=(Hook*)this->helement->copy();
++	matice->element =element_in;
++
++	return matice;
++}
++/*}}}*/
++
++/*Matseaice management*/
++void  Matseaice::Configure(Elements* elementsin){/*{{{*/
++
++	/*Take care of hooking up all objects for this element, ie links the objects in the hooks to their respective 
++	 * datasets, using internal ids and offsets hidden in hooks: */
++	helement->configure((DataSet*)elementsin);
++	this->element  = (Element*)helement->delivers();
++}
++/*}}}*/
++void  Matseaice::SetCurrentConfiguration(Elements* elementsin,Loads* loadsin,Nodes* nodesin,Vertices* verticesin,Materials* materialsin,Parameters* parametersin){/*{{{*/
++
++}
++/*}}}*/
++void  Matseaice::ResetHooks(){/*{{{*/
++
++	this->element=NULL;
++
++	/*Get Element type*/
++	this->helement->reset();
++
++}
++/*}}}*/
+Index: ../trunk-jpl/src/c/classes/classes.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/classes.h	(revision 18491)
++++ ../trunk-jpl/src/c/classes/classes.h	(revision 18492)
+@@ -77,6 +77,7 @@
+ #include "./Materials/Materials.h"
+ #include "./Materials/Material.h"
+ #include "./Materials/Matice.h"
++#include "./Materials/Matseaice.h"
+ #include "./Materials/Matpar.h"
+ 
+ /*Params: */
+Index: ../trunk-jpl/src/c/classes/Vertex.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Vertex.cpp	(revision 18491)
++++ ../trunk-jpl/src/c/classes/Vertex.cpp	(revision 18492)
+@@ -31,17 +31,21 @@
+ 	this->z            = iomodel->Data(MeshZEnum)[i];
+ 	this->domaintype     = iomodel->domaintype;
+ 
+-	_assert_(iomodel->Data(BaseEnum) && iomodel->Data(ThicknessEnum) && iomodel->numbernodetoelementconnectivity);
+ 	switch(iomodel->domaintype){
+ 		case Domain3DEnum:
+-		case Domain2DhorizontalEnum:
++			_assert_(iomodel->Data(BaseEnum) && iomodel->Data(ThicknessEnum));
+ 			this->sigma = (iomodel->Data(MeshZEnum)[i]-iomodel->Data(BaseEnum)[i])/(iomodel->Data(ThicknessEnum)[i]);
+ 			break;
++		case Domain2DhorizontalEnum:
++			this->sigma = 0.;
++			break;
+ 		case Domain2DverticalEnum:
++			_assert_(iomodel->Data(BaseEnum) && iomodel->Data(ThicknessEnum));
+ 			this->sigma = (iomodel->Data(MeshYEnum)[i]-iomodel->Data(BaseEnum)[i])/(iomodel->Data(ThicknessEnum)[i]);
+ 			break;
+ 	}
+ 
++	_assert_(iomodel->numbernodetoelementconnectivity);
+ 	this->connectivity = iomodel->numbernodetoelementconnectivity[i];
+ 
+ }
+Index: ../trunk-jpl/src/m/consistency/ismodelselfconsistent.m
+===================================================================
+--- ../trunk-jpl/src/m/consistency/ismodelselfconsistent.m	(revision 18491)
++++ ../trunk-jpl/src/m/consistency/ismodelselfconsistent.m	(revision 18492)
+@@ -90,6 +90,9 @@
+ 	case DamageEvolutionSolutionEnum(),
+ 		analyses=[DamageEvolutionAnalysisEnum()];
+ 
++	case SeaiceSolutionEnum(),
++		analyses=[SeaiceAnalysisEnum()];
++
+ 	otherwise
+ 		error('%s%s%s',' solution type: ',EnumToString(solutiontype),' not supported yet!');
+ 
+Index: ../trunk-jpl/src/m/classes/mask.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mask.m	(revision 18491)
++++ ../trunk-jpl/src/m/classes/mask.m	(revision 18492)
+@@ -39,6 +39,9 @@
+ 
+ 		end % }}}
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
++			if (solution==SeaiceSolutionEnum()),
++				return;
++			end
+ 
+ 			md = checkfield(md,'fieldname','mask.groundedice_levelset','size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','mask.ice_levelset'        ,'size',[md.mesh.numberofvertices 1]);
+@@ -60,6 +63,10 @@
+ 			WriteData(fid,'object',obj,'fieldname','groundedice_levelset','format','DoubleMat','mattype',1);
+ 			WriteData(fid,'object',obj,'fieldname','ice_levelset','format','DoubleMat','mattype',1);
+ 
++			if(md.private.solution==SeaiceSolutionEnum()),
++				return;
++			end
++
+ 			% get mask of vertices of elements with ice
+ 			isice=md.mask.ice_levelset<=0.;
+ 			vlist = zeros(md.mesh.numberofvertices,1);
+Index: ../trunk-jpl/src/m/classes/seaice.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/seaice.m	(revision 0)
++++ ../trunk-jpl/src/m/classes/seaice.m	(revision 18492)
+@@ -0,0 +1,41 @@
++%SEAICE class definition
++%
++%   Usage:
++%      seaice=seaice();
++
++classdef seaice
++	properties (SetAccess=public) 
++		thickness     = NaN;
++		concentration = NaN;
++		spcvx         = NaN;
++		spcvy         = NaN;
++	end
++	methods
++		function obj = seaice(varargin) % {{{
++			switch nargin
++				case 0
++					return;
++				otherwise
++					error('constructor not supported');
++			end
++		end % }}}
++		function md = checkconsistency(obj,md,solution,analyses) % {{{
++			md = checkfield(md,'fieldname','seaice.thickness','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
++			md = checkfield(md,'fieldname','seaice.concentration','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
++			md = checkfield(md,'fieldname','seaice.spcvx','size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','seaice.spcvy','size',[md.mesh.numberofvertices 1]);
++		end % }}}
++		function disp(obj) % {{{
++			disp(sprintf('   seaice parameters:'));
++			fielddisplay(obj,'thickness','sea ice thickness [m]');
++			fielddisplay(obj,'spcvx','x-axis velocity constraint (NaN means no constraint) [m/s]');
++			fielddisplay(obj,'spcvy','y-axis velocity constraint (NaN means no constraint) [m/s]');
++		end % }}}
++		function marshall(obj,md,fid) % {{{
++			WriteData(fid,'object',obj,'fieldname','thickness','format','DoubleMat','mattype',2);
++			WriteData(fid,'object',obj,'fieldname','concentration','format','DoubleMat','mattype',2);
++			WriteData(fid,'object',obj,'fieldname','spcvx','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'fieldname','spcvy','format','DoubleMat','mattype',1);
++		end % }}}
++	end
++end
+Index: ../trunk-jpl/src/m/classes/geometry.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/geometry.m	(revision 18491)
++++ ../trunk-jpl/src/m/classes/geometry.m	(revision 18492)
+@@ -57,6 +57,10 @@
+ 		end % }}}
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+ 
++			if (solution==SeaiceSolutionEnum()),
++				return;
++			end
++
+ 			if (solution==TransientSolutionEnum() & md.transient.isgia) | (solution==GiaSolutionEnum()),
+ 				md = checkfield(md,'fieldname','geometry.thickness','forcing',1,'NaN',1,'>=',0);
+ 			else
+Index: ../trunk-jpl/src/m/classes/matseaice.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/matseaice.m	(revision 0)
++++ ../trunk-jpl/src/m/classes/matseaice.m	(revision 18492)
+@@ -0,0 +1,94 @@
++%MATSEAICE class definition
++%
++%   Usage:
++%      matseaice=matseaice();
++
++classdef matseaice
++	properties (SetAccess=public) 
++		poisson                = 0.;
++		young_modulus          = 0.;
++		damage                 = NaN;
++		ridging_exponent       = 0.;
++		cohesion               = 0.;
++		internal_friction_coef = 0.;
++		compression_coef       = 0.;
++		traction_coef          = 0.;
++	end
++	methods
++		function obj = matseaice(varargin) % {{{
++			switch nargin
++				case 0
++					obj=setdefaultparameters(obj);
++				case 1
++					inputstruct=varargin{1};
++					list1 = properties('matseaice');
++					list2 = fieldnames(inputstruct);
++					for i=1:length(list1)
++						fieldname = list1{i};
++						if ismember(fieldname,list2),
++							obj.(fieldname) = inputstruct.(fieldname);
++						end
++					end
++				otherwise
++					error('constructor not supported');
++			end
++		end % }}}
++		function obj = setdefaultparameters(obj) % {{{
++
++			%poisson modulus
++			obj.poisson=0.3;
++
++			%Young modulus
++			obj.young_modulus=9.e+9;
++
++			%ridging exponent
++			obj.ridging_exponent=-20.;
++
++			%Cohesion (Weiss 2007)
++			obj.cohesion = 40.e+3; %40 kPa
++
++			%internal_friction_coef 
++			obj.internal_friction_coef=0.7;
++
++			%compression_coef (Bouillon and Rampal 2014)
++			obj.compression_coef=5./2;
++
++			%traction_coef (Bouillon and Rampal 2014)
++			obj.traction_coef=5./6.;
++
++		end % }}}
++		function md = checkconsistency(obj,md,solution,analyses) % {{{
++			md = checkfield(md,'fieldname','materials.poisson','NaN',1,'>',0,'<',.5,'numel',1);
++			md = checkfield(md,'fieldname','materials.young_modulus','NaN',1,'>',0,'numel',1);
++			md = checkfield(md,'fieldname','materials.damage','NaN',1,'>=',0,'<',1,'size',[md.mesh.numberofelements 1]);
++			md = checkfield(md,'fieldname','materials.ridging_exponent','NaN',1,'<',0,'numel',1);
++			md = checkfield(md,'fieldname','materials.cohesion','NaN',1,'>',0,'numel',1);
++			md = checkfield(md,'fieldname','materials.internal_friction_coef','NaN',1,'>',0,'numel',1);
++			md = checkfield(md,'fieldname','materials.compression_coef','NaN',1,'>',1,'numel',1);
++			md = checkfield(md,'fieldname','materials.traction_coef','NaN',1,'>',0,'<',1,'numel',1);
++		end % }}}
++		function disp(obj) % {{{
++			disp(sprintf('   Sea Ice Material:'));
++
++			fielddisplay(obj,'poisson','poisson ratio for undamaged ice [no unit]');
++			fielddisplay(obj,'young_modulus','Young modulus for undamaged ice [Pa]');
++			fielddisplay(obj,'damage','damage, between 0 (no damage) and 1 (fully damaged)');
++			fielddisplay(obj,'ridging_exponent','Riging exponent (c, Hibler parameter) [no unit]');
++			fielddisplay(obj,'cohesion','cohesion (C) [Pa]');
++			fielddisplay(obj,'internal_friction_coef','Mohr-Coulomb internal friction coefficient (mu=tan(phi)) [no unit]');
++			fielddisplay(obj,'compression_coef','Ratio between cutoff compressive strength and the cohesion [no unit]');
++			fielddisplay(obj,'traction_coef','Ratio between cutoff tensile strength and Mohr-Coulomb tensile strength [no unit]');
++		end % }}}
++		function marshall(obj,md,fid) % {{{
++			WriteData(fid,'enum',MaterialsEnum(),'data',MatseaiceEnum(),'format','Integer');
++			WriteData(fid,'object',obj,'class','materials','fieldname','poisson','format','Double');
++			WriteData(fid,'object',obj,'class','materials','fieldname','young_modulus','format','Double');
++			WriteData(fid,'object',obj,'class','materials','fieldname','damage','format','DoubleMat','mattype',2);
++			WriteData(fid,'object',obj,'class','materials','fieldname','ridging_exponent','format','Double');
++			WriteData(fid,'object',obj,'class','materials','fieldname','cohesion','format','Double');
++			WriteData(fid,'object',obj,'class','materials','fieldname','internal_friction_coef','format','Double');
++			WriteData(fid,'object',obj,'class','materials','fieldname','compression_coef','format','Double');
++			WriteData(fid,'object',obj,'class','materials','fieldname','traction_coef','format','Double');
++		end % }}}
++	end
++end
+Index: ../trunk-jpl/src/m/classes/seaiceinitialization.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/seaiceinitialization.m	(revision 0)
++++ ../trunk-jpl/src/m/classes/seaiceinitialization.m	(revision 18492)
+@@ -0,0 +1,42 @@
++%SEAICEINITIALIZATION class definition
++%
++%   Usage:
++%      seaiceinitialization=seaiceinitialization();
++
++classdef seaiceinitialization
++	properties (SetAccess=public) 
++		vx          = NaN;
++		vy          = NaN;
++		vx_coriolis = NaN;
++		vy_coriolis = NaN;
++	end
++	methods
++		function obj = seaiceinitialization(varargin) % {{{
++			switch nargin
++				case 0
++					return;
++				otherwise
++					error('constructor not supported');
++			end
++		end % }}}
++		function md = checkconsistency(obj,md,solution,analyses) % {{{
++			md = checkfield(md,'fieldname','initialization.vx','NaN',1,'size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','initialization.vy','NaN',1,'size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','initialization.vx_coriolis','NaN',1,'size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','initialization.vy_coriolis','NaN',1,'size',[md.mesh.numberofvertices 1]);
++		end % }}}
++		function disp(obj) % {{{
++			disp(sprintf('   initial field values:'));
++			fielddisplay(obj,'vx','x component of the ice velocity [m/s]');
++			fielddisplay(obj,'vy','y component of the ice velocity [m/s]');
++			fielddisplay(obj,'vx_coriolis','x component of the ice velocity used to calculate coriolis forces [m/s]');
++			fielddisplay(obj,'vy_coriolis','y component of the ice velocity used to calculate coriolis forces [m/s]');
++		end % }}}
++		function marshall(obj,md,fid) % {{{
++			WriteData(fid,'data',obj.vx,'format','DoubleMat','mattype',1,'enum',VxEnum);
++			WriteData(fid,'data',obj.vy,'format','DoubleMat','mattype',1,'enum',VyEnum);
++			WriteData(fid,'data',obj.vx_coriolis,'format','DoubleMat','mattype',1,'enum',VxStarEnum);
++			WriteData(fid,'data',obj.vy_coriolis,'format','DoubleMat','mattype',1,'enum',VyStarEnum);
++		end % }}}
++	end
++end
+Index: ../trunk-jpl/src/m/classes/stressbalance.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/stressbalance.m	(revision 18491)
++++ ../trunk-jpl/src/m/classes/stressbalance.m	(revision 18492)
+@@ -209,6 +209,12 @@
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+ 
++			WriteData(fid,'object',obj,'class','stressbalance','fieldname','vertex_pairing','format','DoubleMat','mattype',3);
++
++			if md.private.solution==SeaiceSolutionEnum,
++				return;
++			end
++
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'object',obj,'class','stressbalance','fieldname','spcvx','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+@@ -222,7 +228,6 @@
+ 			WriteData(fid,'object',obj,'class','stressbalance','fieldname','viscosity_overshoot','format','Double');
+ 			WriteData(fid,'object',obj,'class','stressbalance','fieldname','maxiter','format','Integer');
+ 			WriteData(fid,'object',obj,'class','stressbalance','fieldname','shelf_dampening','format','Integer');
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','vertex_pairing','format','DoubleMat','mattype',3);
+ 			WriteData(fid,'object',obj,'class','stressbalance','fieldname','penalty_factor','format','Double');
+ 			WriteData(fid,'object',obj,'class','stressbalance','fieldname','rift_penalty_lock','format','Integer');
+ 			WriteData(fid,'object',obj,'class','stressbalance','fieldname','rift_penalty_threshold','format','Integer');
+Index: ../trunk-jpl/src/m/classes/seaiceatm.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/seaiceatm.m	(revision 0)
++++ ../trunk-jpl/src/m/classes/seaiceatm.m	(revision 18492)
+@@ -0,0 +1,65 @@
++%SEAICEATM Class definition
++%
++%   Usage:
++%      seaiceatm=seaiceatm();
++
++classdef seaiceatm
++	properties (SetAccess=public) 
++		rho_air            = 0.;
++		air_coef           = 0.;
++		air_lin_drag_coef  = 0.;
++		air_quad_drag_coef = 0.;
++		wind_vx            = NaN;
++		wind_vy            = NaN;
++	end
++	methods
++		function obj = seaiceatm(varargin) % {{{
++			switch nargin
++				case 0
++					obj=setdefaultparameters(obj);
++				otherwise
++					error('constructor not supported');
++			end
++		end % }}}
++		function obj = setdefaultparameters(obj) % {{{
++
++			%air density (kg/m^3)
++			obj.rho_air=1.3;
++
++			%By default, we apply the full stress
++			obj.air_coef = 1.;
++
++			%drag coefficients (different from Hibler 0.0012)
++			obj.air_lin_drag_coef  = 0.;
++			obj.air_quad_drag_coef = 0.003;
++
++		end % }}}
++		function md = checkconsistency(obj,md,solution,analyses) % {{{
++			md = checkfield(md,'fieldname','surfaceforcings.rho_air','NaN',1,'>',0.,'numel',1);
++			md = checkfield(md,'fieldname','surfaceforcings.air_coef','NaN',1,'>=',0.,'<=',1,'numel',1);
++			md = checkfield(md,'fieldname','surfaceforcings.air_lin_drag_coef','NaN',1,'>=',0.,'numel',1);
++			md = checkfield(md,'fieldname','surfaceforcings.air_quad_drag_coef','NaN',1,'>=',0.,'numel',1);
++			md = checkfield(md,'fieldname','surfaceforcings.wind_vx','NaN',1,'size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','surfaceforcings.wind_vy','NaN',1,'size',[md.mesh.numberofvertices 1]);
++		end % }}}
++		function disp(obj) % {{{
++			disp(sprintf('   Atmospheric forcings for sea ice:'));
++			disp(sprintf('\n     tau_a = air_coef*rho_air*(air_lin_drag_coef+air_quad_drag_coef*|v_wind|)*v_wind\n'));
++			fielddisplay(obj,'rho_air','air density [kg/m^3]');
++			fielddisplay(obj,'air_coef','atmospheric stress spin up coefficient (between 0 and 1)');
++			fielddisplay(obj,'air_lin_drag_coef','air linear drag coefficient (no unit)');
++			fielddisplay(obj,'air_quad_drag_coef','air quadratic drag coefficient [s/m]');
++			fielddisplay(obj,'wind_vx','wind speed x-component at 10 m elevation [m/s]');
++			fielddisplay(obj,'wind_vy','wind speed y-component at 10 m elevation [m/s]');
++		end % }}}
++		function marshall(obj,md,fid) % {{{
++			WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SeaiceatmEnum(),'format','Integer');
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','rho_air','format','Double');
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','air_coef','format','Double');
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','air_lin_drag_coef','format','Double');
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','air_quad_drag_coef','format','Double');
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','wind_vx','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','wind_vy','format','DoubleMat','mattype',1);
++		end % }}}
++	end
++end
+Index: ../trunk-jpl/src/m/classes/seaiceocean.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/seaiceocean.m	(revision 0)
++++ ../trunk-jpl/src/m/classes/seaiceocean.m	(revision 18492)
+@@ -0,0 +1,76 @@
++%SEAICEOCEAN Class definition
++%
++%   Usage:
++%      seaiceocean=seaiceocean();
++
++classdef seaiceocean
++	properties (SetAccess=public) 
++		rho_ocean            = 0.;
++		ocean_coef           = 0.;
++		ocean_lin_drag_coef  = 0.;
++		ocean_quad_drag_coef = 0.;
++		ocean_turning_angle  = 0.;
++		ocean_ssh            = NaN;
++		ocean_vx             = NaN;
++		ocean_vy             = NaN;
++	end
++	methods
++		function obj = seaiceocean(varargin) % {{{
++			switch nargin
++				case 0
++					obj=setdefaultparameters(obj);
++				otherwise
++					error('constructor not supported');
++			end
++		end % }}}
++		function obj = setdefaultparameters(obj) % {{{
++
++			%ocean density (kg/m^3)
++			obj.rho_ocean=1025.;
++
++			%By default, we apply the full stress
++			obj.ocean_coef = 1.;
++
++			%drag coefficients (different from Hibler 0.0055)
++			obj.ocean_lin_drag_coef  = 0.;
++			obj.ocean_quad_drag_coef = 0.004;
++
++			%Turning angle in degrees (McPhee 1998)
++			obj.ocean_turning_angle = 25.;
++
++		end % }}}
++		function md = checkconsistency(obj,md,solution,analyses) % {{{
++			md = checkfield(md,'fieldname','basalforcings.rho_ocean','NaN',1,'>',0.,'numel',1);
++			md = checkfield(md,'fieldname','basalforcings.ocean_coef','NaN',1,'>=',0.,'<=',1.,'numel',1);
++			md = checkfield(md,'fieldname','basalforcings.ocean_lin_drag_coef','NaN',1,'>=',0.,'numel',1);
++			md = checkfield(md,'fieldname','basalforcings.ocean_quad_drag_coef','NaN',1,'>=',0.,'numel',1);
++			md = checkfield(md,'fieldname','basalforcings.ocean_turning_angle','NaN',1,'>=',0.,'<',90,'numel',1);
++			md = checkfield(md,'fieldname','basalforcings.ocean_ssh','NaN',1,'size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','basalforcings.ocean_vx','NaN',1,'size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','basalforcings.ocean_vy','NaN',1,'size',[md.mesh.numberofvertices 1]);
++		end % }}}
++		function disp(obj) % {{{
++			disp(sprintf('   Ocean forcings for sea ice:'));
++			%disp(sprintf('\n     tau_b = ocean_coef*rho_ocean*...'));
++			fielddisplay(obj,'rho_ocean','ocean density [kg/m^3]');
++			fielddisplay(obj,'ocean_coef','ocean stress spin up coefficient (between 0 and 1)');
++			fielddisplay(obj,'ocean_lin_drag_coef','ocean linear drag coefficient [Pa/(m/s)]');
++			fielddisplay(obj,'ocean_quad_drag_coef','ocean quadratic drag coefficient [Pa/(m/s)^2]');
++			fielddisplay(obj,'ocean_turning_angle','ocean turning angle [degree]');
++			fielddisplay(obj,'ocean_ssh','ocean sea surface height [m]');
++			fielddisplay(obj,'ocean_vx','ocean speed x-component [m/s]');
++			fielddisplay(obj,'ocean_vy','ocean speed y-component [m/s]');
++		end % }}}
++		function marshall(obj,md,fid) % {{{
++			WriteData(fid,'enum',BasalforcingsEnum(),'data',SeaiceoceanEnum(),'format','Integer');
++			WriteData(fid,'object',obj,'class','basalforcings','fieldname','rho_ocean','format','Double');
++			WriteData(fid,'object',obj,'class','basalforcings','fieldname','ocean_coef','format','Double');
++			WriteData(fid,'object',obj,'class','basalforcings','fieldname','ocean_lin_drag_coef','format','Double');
++			WriteData(fid,'object',obj,'class','basalforcings','fieldname','ocean_quad_drag_coef','format','Double');
++			WriteData(fid,'object',obj,'class','basalforcings','fieldname','ocean_turning_angle','format','Double');
++			WriteData(fid,'object',obj,'class','basalforcings','fieldname','ocean_ssh','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'class','basalforcings','fieldname','ocean_vx','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'class','basalforcings','fieldname','ocean_vy','format','DoubleMat','mattype',1);
++		end % }}}
++	end
++end
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 18491)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 18492)
+@@ -38,6 +38,8 @@
+ 		transient        = 0;
+ 		gia              = 0;
+ 
++		seaice           = 0;
++
+ 		autodiff         = 0;
+ 		flaim            = 0;
+ 		inversion        = 0;
+@@ -131,6 +133,17 @@
+ 			switch nargin
+ 				case 0
+ 					md=setdefaultparameters(md);
++				case 1
++					if strcmpi(varargin{1},'seaice'),
++						md=setdefaultparameters(md);
++						md.materials = matseaice();
++						md.surfaceforcings = seaiceatm();
++						md.basalforcings   = seaiceocean();
++						md.initialization  = seaiceinitialization();
++					else
++						error('model constructor not supported yet');
++					end
++
+ 				otherwise
+ 					error('model constructor error message: 0 of 1 argument only in input.');
+ 				end
+@@ -1117,6 +1130,7 @@
+ 			md.steadystate      = steadystate();
+ 			md.transient        = transient();
+ 			md.gia              = gia();
++			md.seaice           = seaice();
+ 			md.autodiff         = autodiff();
+ 			md.flaim            = flaim();
+ 			md.inversion        = inversion();
+@@ -1294,6 +1308,7 @@
+ 			disp(sprintf('%19s: %-22s -- %s','results'         ,['[1x1 ' class(obj.results) ']'],'model results'));
+ 			disp(sprintf('%19s: %-22s -- %s','radaroverlay'    ,['[1x1 ' class(obj.radaroverlay) ']'],'radar image for plot overlay'));
+ 			disp(sprintf('%19s: %-22s -- %s','miscellaneous'   ,['[1x1 ' class(obj.miscellaneous) ']'],'miscellaneous fields'));
++			disp(sprintf('%19s: %-22s -- %s','seaice'       ,['[1x1 ' class(obj.seaice) ']'],'parameters for Sea Ice solution'));
+ 		end % }}}
+ 		function memory(obj) % {{{
+ 
+Index: ../trunk-jpl/src/m/enum/MaterialsYoungModulusEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsYoungModulusEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MaterialsYoungModulusEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=MaterialsYoungModulusEnum()
++%MATERIALSYOUNGMODULUSENUM - Enum of MaterialsYoungModulus
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MaterialsYoungModulusEnum()
++
++macro=StringToEnum('MaterialsYoungModulus');
+Index: ../trunk-jpl/src/m/enum/BasalforcingsOceanLinDragCoefEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BasalforcingsOceanLinDragCoefEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/BasalforcingsOceanLinDragCoefEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=BasalforcingsOceanLinDragCoefEnum()
++%BASALFORCINGSOCEANLINDRAGCOEFENUM - Enum of BasalforcingsOceanLinDragCoef
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=BasalforcingsOceanLinDragCoefEnum()
++
++macro=StringToEnum('BasalforcingsOceanLinDragCoef');
+Index: ../trunk-jpl/src/m/enum/MaterialsCohesionEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsCohesionEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MaterialsCohesionEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=MaterialsCohesionEnum()
++%MATERIALSCOHESIONENUM - Enum of MaterialsCohesion
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MaterialsCohesionEnum()
++
++macro=StringToEnum('MaterialsCohesion');
+Index: ../trunk-jpl/src/m/enum/MaterialsDamageEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsDamageEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MaterialsDamageEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=MaterialsDamageEnum()
++%MATERIALSDAMAGEENUM - Enum of MaterialsDamage
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MaterialsDamageEnum()
++
++macro=StringToEnum('MaterialsDamage');
+Index: ../trunk-jpl/src/m/enum/BasalforcingsRhoOceanEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BasalforcingsRhoOceanEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/BasalforcingsRhoOceanEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=BasalforcingsRhoOceanEnum()
++%BASALFORCINGSRHOOCEANENUM - Enum of BasalforcingsRhoOcean
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=BasalforcingsRhoOceanEnum()
++
++macro=StringToEnum('BasalforcingsRhoOcean');
+Index: ../trunk-jpl/src/m/enum/MaterialsInternalFrictionCoefEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsInternalFrictionCoefEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MaterialsInternalFrictionCoefEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=MaterialsInternalFrictionCoefEnum()
++%MATERIALSINTERNALFRICTIONCOEFENUM - Enum of MaterialsInternalFrictionCoef
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MaterialsInternalFrictionCoefEnum()
++
++macro=StringToEnum('MaterialsInternalFrictionCoef');
+Index: ../trunk-jpl/src/m/enum/SeaiceConcentrationEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceConcentrationEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SeaiceConcentrationEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=SeaiceConcentrationEnum()
++%SEAICECONCENTRATIONENUM - Enum of SeaiceConcentration
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SeaiceConcentrationEnum()
++
++macro=StringToEnum('SeaiceConcentration');
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsWindVxEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsWindVxEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsWindVxEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=SurfaceforcingsWindVxEnum()
++%SURFACEFORCINGSWINDVXENUM - Enum of SurfaceforcingsWindVx
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SurfaceforcingsWindVxEnum()
++
++macro=StringToEnum('SurfaceforcingsWindVx');
+Index: ../trunk-jpl/src/m/enum/VyStarEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/VyStarEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/VyStarEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=VyStarEnum()
++%VYSTARENUM - Enum of VyStar
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=VyStarEnum()
++
++macro=StringToEnum('VyStar');
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsAirLinDragCoefEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsAirLinDragCoefEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsAirLinDragCoefEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=SurfaceforcingsAirLinDragCoefEnum()
++%SURFACEFORCINGSAIRLINDRAGCOEFENUM - Enum of SurfaceforcingsAirLinDragCoef
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SurfaceforcingsAirLinDragCoefEnum()
++
++macro=StringToEnum('SurfaceforcingsAirLinDragCoef');
+Index: ../trunk-jpl/src/m/enum/SeaiceSolutionEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceSolutionEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SeaiceSolutionEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=SeaiceSolutionEnum()
++%SEAICESOLUTIONENUM - Enum of SeaiceSolution
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SeaiceSolutionEnum()
++
++macro=StringToEnum('SeaiceSolution');
+Index: ../trunk-jpl/src/m/enum/MaterialsPoissonEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsPoissonEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MaterialsPoissonEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=MaterialsPoissonEnum()
++%MATERIALSPOISSONENUM - Enum of MaterialsPoisson
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MaterialsPoissonEnum()
++
++macro=StringToEnum('MaterialsPoisson');
+Index: ../trunk-jpl/src/m/enum/MaterialsCompressionCoefEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsCompressionCoefEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MaterialsCompressionCoefEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=MaterialsCompressionCoefEnum()
++%MATERIALSCOMPRESSIONCOEFENUM - Enum of MaterialsCompressionCoef
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MaterialsCompressionCoefEnum()
++
++macro=StringToEnum('MaterialsCompressionCoef');
+Index: ../trunk-jpl/src/m/enum/BasalforcingsOceanCoefEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BasalforcingsOceanCoefEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/BasalforcingsOceanCoefEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=BasalforcingsOceanCoefEnum()
++%BASALFORCINGSOCEANCOEFENUM - Enum of BasalforcingsOceanCoef
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=BasalforcingsOceanCoefEnum()
++
++macro=StringToEnum('BasalforcingsOceanCoef');
+Index: ../trunk-jpl/src/m/enum/MaterialsTractionCoefEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsTractionCoefEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MaterialsTractionCoefEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=MaterialsTractionCoefEnum()
++%MATERIALSTRACTIONCOEFENUM - Enum of MaterialsTractionCoef
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MaterialsTractionCoefEnum()
++
++macro=StringToEnum('MaterialsTractionCoef');
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsAirCoefEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsAirCoefEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsAirCoefEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=SurfaceforcingsAirCoefEnum()
++%SURFACEFORCINGSAIRCOEFENUM - Enum of SurfaceforcingsAirCoef
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SurfaceforcingsAirCoefEnum()
++
++macro=StringToEnum('SurfaceforcingsAirCoef');
+Index: ../trunk-jpl/src/m/enum/BasalforcingsOceanVxEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BasalforcingsOceanVxEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/BasalforcingsOceanVxEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=BasalforcingsOceanVxEnum()
++%BASALFORCINGSOCEANVXENUM - Enum of BasalforcingsOceanVx
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=BasalforcingsOceanVxEnum()
++
++macro=StringToEnum('BasalforcingsOceanVx');
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsWindVyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsWindVyEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsWindVyEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=SurfaceforcingsWindVyEnum()
++%SURFACEFORCINGSWINDVYENUM - Enum of SurfaceforcingsWindVy
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SurfaceforcingsWindVyEnum()
++
++macro=StringToEnum('SurfaceforcingsWindVy');
+Index: ../trunk-jpl/src/m/enum/SeaiceatmEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceatmEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SeaiceatmEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=SeaiceatmEnum()
++%SEAICEATMENUM - Enum of Seaiceatm
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SeaiceatmEnum()
++
++macro=StringToEnum('Seaiceatm');
+Index: ../trunk-jpl/src/m/enum/SeaiceAnalysisEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceAnalysisEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SeaiceAnalysisEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=SeaiceAnalysisEnum()
++%SEAICEANALYSISENUM - Enum of SeaiceAnalysis
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SeaiceAnalysisEnum()
++
++macro=StringToEnum('SeaiceAnalysis');
+Index: ../trunk-jpl/src/m/enum/MaterialsRidgingExponentEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsRidgingExponentEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MaterialsRidgingExponentEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=MaterialsRidgingExponentEnum()
++%MATERIALSRIDGINGEXPONENTENUM - Enum of MaterialsRidgingExponent
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MaterialsRidgingExponentEnum()
++
++macro=StringToEnum('MaterialsRidgingExponent');
+Index: ../trunk-jpl/src/m/enum/BasalforcingsOceanVyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BasalforcingsOceanVyEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/BasalforcingsOceanVyEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=BasalforcingsOceanVyEnum()
++%BASALFORCINGSOCEANVYENUM - Enum of BasalforcingsOceanVy
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=BasalforcingsOceanVyEnum()
++
++macro=StringToEnum('BasalforcingsOceanVy');
+Index: ../trunk-jpl/src/m/enum/SeaiceThicknessEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceThicknessEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SeaiceThicknessEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=SeaiceThicknessEnum()
++%SEAICETHICKNESSENUM - Enum of SeaiceThickness
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SeaiceThicknessEnum()
++
++macro=StringToEnum('SeaiceThickness');
+Index: ../trunk-jpl/src/m/enum/BasalforcingsOceanSshEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BasalforcingsOceanSshEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/BasalforcingsOceanSshEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=BasalforcingsOceanSshEnum()
++%BASALFORCINGSOCEANSSHENUM - Enum of BasalforcingsOceanSsh
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=BasalforcingsOceanSshEnum()
++
++macro=StringToEnum('BasalforcingsOceanSsh');
+Index: ../trunk-jpl/src/m/enum/SeaiceSpcvxEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceSpcvxEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SeaiceSpcvxEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=SeaiceSpcvxEnum()
++%SEAICESPCVXENUM - Enum of SeaiceSpcvx
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SeaiceSpcvxEnum()
++
++macro=StringToEnum('SeaiceSpcvx');
+Index: ../trunk-jpl/src/m/enum/BasalforcingsOceanQuadDragCoefEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BasalforcingsOceanQuadDragCoefEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/BasalforcingsOceanQuadDragCoefEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=BasalforcingsOceanQuadDragCoefEnum()
++%BASALFORCINGSOCEANQUADDRAGCOEFENUM - Enum of BasalforcingsOceanQuadDragCoef
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=BasalforcingsOceanQuadDragCoefEnum()
++
++macro=StringToEnum('BasalforcingsOceanQuadDragCoef');
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsRhoAirEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsRhoAirEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsRhoAirEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=SurfaceforcingsRhoAirEnum()
++%SURFACEFORCINGSRHOAIRENUM - Enum of SurfaceforcingsRhoAir
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SurfaceforcingsRhoAirEnum()
++
++macro=StringToEnum('SurfaceforcingsRhoAir');
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsAirQuadDragCoefEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsAirQuadDragCoefEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsAirQuadDragCoefEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=SurfaceforcingsAirQuadDragCoefEnum()
++%SURFACEFORCINGSAIRQUADDRAGCOEFENUM - Enum of SurfaceforcingsAirQuadDragCoef
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SurfaceforcingsAirQuadDragCoefEnum()
++
++macro=StringToEnum('SurfaceforcingsAirQuadDragCoef');
+Index: ../trunk-jpl/src/m/enum/SeaiceoceanEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceoceanEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SeaiceoceanEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=SeaiceoceanEnum()
++%SEAICEOCEANENUM - Enum of Seaiceocean
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SeaiceoceanEnum()
++
++macro=StringToEnum('Seaiceocean');
+Index: ../trunk-jpl/src/m/enum/BasalforcingsOceanTurningAngleEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BasalforcingsOceanTurningAngleEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/BasalforcingsOceanTurningAngleEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=BasalforcingsOceanTurningAngleEnum()
++%BASALFORCINGSOCEANTURNINGANGLEENUM - Enum of BasalforcingsOceanTurningAngle
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=BasalforcingsOceanTurningAngleEnum()
++
++macro=StringToEnum('BasalforcingsOceanTurningAngle');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18491)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18492)
+@@ -381,6 +381,8 @@
+ def UzawaPressureAnalysisEnum(): return StringToEnum("UzawaPressureAnalysis")[0]
+ def GiaSolutionEnum(): return StringToEnum("GiaSolution")[0]
+ def GiaAnalysisEnum(): return StringToEnum("GiaAnalysis")[0]
++def SeaiceSolutionEnum(): return StringToEnum("SeaiceSolution")[0]
++def SeaiceAnalysisEnum(): return StringToEnum("SeaiceAnalysis")[0]
+ def MeshdeformationSolutionEnum(): return StringToEnum("MeshdeformationSolution")[0]
+ def MeshdeformationAnalysisEnum(): return StringToEnum("MeshdeformationAnalysis")[0]
+ def LevelsetAnalysisEnum(): return StringToEnum("LevelsetAnalysis")[0]
+@@ -693,4 +695,35 @@
+ def LevelsetfunctionSlopeXEnum(): return StringToEnum("LevelsetfunctionSlopeX")[0]
+ def LevelsetfunctionSlopeYEnum(): return StringToEnum("LevelsetfunctionSlopeY")[0]
+ def LevelsetfunctionPicardEnum(): return StringToEnum("LevelsetfunctionPicard")[0]
++def SeaiceatmEnum(): return StringToEnum("Seaiceatm")[0]
++def SeaiceoceanEnum(): return StringToEnum("Seaiceocean")[0]
++def SeaiceThicknessEnum(): return StringToEnum("SeaiceThickness")[0]
++def SeaiceConcentrationEnum(): return StringToEnum("SeaiceConcentration")[0]
++def SeaiceSpcvxEnum(): return StringToEnum("SeaiceSpcvx")[0]
++def SeaiceSpcvyEnum(): return StringToEnum("SeaiceSpcvy")[0]
++def BasalforcingsRhoOceanEnum(): return StringToEnum("BasalforcingsRhoOcean")[0]
++def BasalforcingsOceanCoefEnum(): return StringToEnum("BasalforcingsOceanCoef")[0]
++def BasalforcingsOceanLinDragCoefEnum(): return StringToEnum("BasalforcingsOceanLinDragCoef")[0]
++def BasalforcingsOceanQuadDragCoefEnum(): return StringToEnum("BasalforcingsOceanQuadDragCoef")[0]
++def BasalforcingsOceanTurningAngleEnum(): return StringToEnum("BasalforcingsOceanTurningAngle")[0]
++def BasalforcingsOceanSshEnum(): return StringToEnum("BasalforcingsOceanSsh")[0]
++def BasalforcingsOceanVxEnum(): return StringToEnum("BasalforcingsOceanVx")[0]
++def BasalforcingsOceanVyEnum(): return StringToEnum("BasalforcingsOceanVy")[0]
++def SurfaceforcingsRhoAirEnum(): return StringToEnum("SurfaceforcingsRhoAir")[0]
++def SurfaceforcingsAirCoefEnum(): return StringToEnum("SurfaceforcingsAirCoef")[0]
++def SurfaceforcingsAirLinDragCoefEnum(): return StringToEnum("SurfaceforcingsAirLinDragCoef")[0]
++def SurfaceforcingsAirQuadDragCoefEnum(): return StringToEnum("SurfaceforcingsAirQuadDragCoef")[0]
++def SurfaceforcingsWindVxEnum(): return StringToEnum("SurfaceforcingsWindVx")[0]
++def SurfaceforcingsWindVyEnum(): return StringToEnum("SurfaceforcingsWindVy")[0]
++def MatseaiceEnum(): return StringToEnum("Matseaice")[0]
++def MaterialsPoissonEnum(): return StringToEnum("MaterialsPoisson")[0]
++def MaterialsYoungModulusEnum(): return StringToEnum("MaterialsYoungModulus")[0]
++def MaterialsDamageEnum(): return StringToEnum("MaterialsDamage")[0]
++def MaterialsRidgingExponentEnum(): return StringToEnum("MaterialsRidgingExponent")[0]
++def MaterialsCohesionEnum(): return StringToEnum("MaterialsCohesion")[0]
++def MaterialsInternalFrictionCoefEnum(): return StringToEnum("MaterialsInternalFrictionCoef")[0]
++def MaterialsCompressionCoefEnum(): return StringToEnum("MaterialsCompressionCoef")[0]
++def MaterialsTractionCoefEnum(): return StringToEnum("MaterialsTractionCoef")[0]
++def VxStarEnum(): return StringToEnum("VxStar")[0]
++def VyStarEnum(): return StringToEnum("VyStar")[0]
+ def MaximumNumberOfDefinitionsEnum(): return StringToEnum("MaximumNumberOfDefinitions")[0]
+Index: ../trunk-jpl/src/m/enum/SeaiceSpcvyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceSpcvyEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SeaiceSpcvyEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=SeaiceSpcvyEnum()
++%SEAICESPCVYENUM - Enum of SeaiceSpcvy
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SeaiceSpcvyEnum()
++
++macro=StringToEnum('SeaiceSpcvy');
+Index: ../trunk-jpl/src/m/enum/VxStarEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/VxStarEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/VxStarEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=VxStarEnum()
++%VXSTARENUM - Enum of VxStar
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=VxStarEnum()
++
++macro=StringToEnum('VxStar');
+Index: ../trunk-jpl/src/m/enum/MatseaiceEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MatseaiceEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MatseaiceEnum.m	(revision 18492)
+@@ -0,0 +1,11 @@
++function macro=MatseaiceEnum()
++%MATSEAICEENUM - Enum of Matseaice
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MatseaiceEnum()
++
++macro=StringToEnum('Matseaice');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18492-18493.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18492-18493.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18492-18493.diff	(revision 19102)
@@ -0,0 +1,564 @@
+Index: ../trunk-jpl/src/c/bamg/Mesh.cpp
+===================================================================
+--- ../trunk-jpl/src/c/bamg/Mesh.cpp	(revision 18492)
++++ ../trunk-jpl/src/c/bamg/Mesh.cpp	(revision 18493)
+@@ -241,7 +241,7 @@
+ 			if (Gh.NbRef>0) Gh.NbRef--;
+ 			else if (Gh.NbRef==0) delete &Gh;
+ 		}
+-		if(&BTh && (&BTh != this) && false){
++		if(&BTh && (&BTh != this)){
+ 			if (BTh.NbRef>0) BTh.NbRef--;
+ 			else if (BTh.NbRef==0) delete &BTh;
+ 		}
+@@ -4504,295 +4504,308 @@
+ 		/*Get options*/
+ 		int verbose=bamgopts->verbose;
+ 
+-		/*Intermediaries*/
+-		int                i,k;
+-		int                nbcurves    = 0;
+-		int                NbNewPoints,NbEdgeCurve;
+-		double             lcurve,lstep,s;
+-		const int          MaxSubEdge  = 10;
++		Gh.NbRef++;// add a ref to Gh
+ 
+-		R2          AB;
+-		GeomVertex *a, *b;
+-		BamgVertex *va,*vb;
+-		GeomEdge   *e;
++		/************************************************************************* 
++		 * method in 2 steps
++		 * 1 - compute the number of new edges to allocate
++		 * 2 - construct the edges
++		 * remark:
++		 * in this part we suppose to have a background mesh with the same geometry 
++		 * 
++		 * To construct the discretization of the new mesh we have to 
++		 * rediscretize the boundary of background Mesh 
++		 * because we have only the pointeur from the background mesh to the geometry.
++		 * We need the abcisse of the background mesh vertices on geometry
++		 * so a vertex is 
++		 * 0 on GeomVertex ;
++		 * 1 on GeomEdge + abcisse
++		 * 2 internal 
++		 *************************************************************************/
+ 
+-		// add a ref to GH to make sure that it is not destroyed by mistake
+-		Gh.NbRef++;
++		//Check that background mesh and current mesh do have the same geometry
++		_assert_(&BTh.Gh==&Gh);
++		BTh.NbRef++; // add a ref to BackGround Mesh
+ 
+-		//build background mesh flag (1 if background, else 0)
+-		bool background=(&BTh != this);
++		//Initialize new mesh
++		BTh.SetVertexFieldOn();
++		int* bcurve = new int[Gh.nbcurves]; // 
+ 
+-		/*Build VerticesOnGeomVertex*/
++		/* There are 2 ways to make the loop 
++		 * 1) on the geometry 
++		 * 2) on the background mesh
++		 *  if you do the loop on geometry, we don't have the pointeur on background,
++		 *  and if you do the loop in background we have the pointeur on geometry
++		 * so do the walk on  background */
+ 
+-		//Compute the number of geometrical vertices that we are going to use to mesh
+-		for (i=0;i<Gh.nbv;i++){
+-			if (Gh[i].Required()) NbVerticesOnGeomVertex++;
+-		}
+-		//allocate
+-		VerticesOnGeomVertex = new VertexOnGeom[NbVerticesOnGeomVertex];  
+-		if(NbVerticesOnGeomVertex >= maxnbv) _error_("too many vertices on geometry: " << NbVerticesOnGeomVertex << " >= " << maxnbv);
+-		_assert_(nbv==0);
+-		//Build VerticesOnGeomVertex
+-		for (i=0;i<Gh.nbv;i++){
+-			/* Add vertex only if required*/
+-			if (Gh[i].Required()) {//Gh  vertices Required
++		NbVerticesOnGeomVertex=0;
++		NbVerticesOnGeomEdge=0;
+ 
+-				//Add the vertex
+-				_assert_(nbv<maxnbv);
+-				vertices[nbv]=Gh[i];
++		/*STEP 1 copy of Required vertices*/
+ 
+-				//Add pointer from geometry (Gh) to vertex from mesh (Th)
+-				Gh[i].MeshVertexHook=vertices+nbv;
++		int i; 
++		for (i=0;i<Gh.nbv;i++) if (Gh[i].Required()) NbVerticesOnGeomVertex++;
++		printf("\n");
++		if(NbVerticesOnGeomVertex >= maxnbv){
++			_error_("too many vertices on geometry: " << NbVerticesOnGeomVertex << " >= " << maxnbv);
++		}
+ 
+-				//Build VerticesOnGeomVertex for current point
+-				VerticesOnGeomVertex[nbv]=VertexOnGeom(*Gh[i].MeshVertexHook,Gh[i]);
++		VerticesOnGeomVertex = new VertexOnGeom[  NbVerticesOnGeomVertex];
++		VertexOnBThVertex    = new VertexOnVertex[NbVerticesOnGeomVertex];
+ 
+-				//nbv increment
++		//At this point there is NO vertex but vertices should have been allocated by Init
++		_assert_(vertices);
++		for (i=0;i<Gh.nbv;i++){
++			if (Gh[i].Required()) {//Gh vertices Required
++				vertices[nbv]  =Gh[i];
++				vertices[nbv].i=I2(0,0);
++				Gh[i].MeshVertexHook = vertices + nbv;// save Geom -> Th
++				VerticesOnGeomVertex[nbv]= VertexOnGeom(vertices[nbv],Gh[i]);
+ 				nbv++;
+ 			}
++			else Gh[i].MeshVertexHook=0;
++		} 
++		for (i=0;i<BTh.NbVerticesOnGeomVertex;i++){ 
++			VertexOnGeom &vog=BTh.VerticesOnGeomVertex[i];
++			if (vog.IsRequiredVertex()){
++				GeomVertex* gv=vog;
++				BamgVertex *bv = vog;
++				_assert_(gv->MeshVertexHook); // use of Geom -> Th
++				VertexOnBThVertex[NbVertexOnBThVertex++]=VertexOnVertex(gv->MeshVertexHook,bv);
++				gv->MeshVertexHook->m = bv->m; // for taking the metric of the background mesh
++			}
+ 		}
++		_assert_(NbVertexOnBThVertex==NbVerticesOnGeomVertex); /*This might be due to MaxCornerAngle too small*/
+ 
+-		/*Build VerticesOnGeomEdge*/
++		/*STEP 2: reseed boundary edges*/
+ 
+-		//check that edges is still empty (Init)
+-		_assert_(!edges);
++		//  find the begining of the curve in BTh
++		Gh.UnMarkEdges();	
++		int bfind=0;
++		for (int i=0;i<Gh.nbcurves;i++) bcurve[i]=-1; 
+ 
+-		/* Now we are going to create the first edges corresponding
+-		 * to the one present in the geometry provided.
+-		 * We proceed in 2 steps
+-		 *  -step 0: we count all the edges
+-		 *           we allocate the number of edges at the end of step 0
+-		 *  -step 1: the edges are created */
+-		for (int step=0;step<2;step++){
++		/*Loop over the backgrounf mesh BTh edges*/
++		for (int iedge=0;iedge<BTh.nbe;iedge++){      
++			Edge &ei = BTh.edges[iedge];
+ 
+-			//initialize number of edges and number of edges max
+-			long nbex=0;
+-			nbe=0;
+-			long NbVerticesOnGeomEdge0=NbVerticesOnGeomEdge;
+-			Gh.UnMarkEdges();	
+-			nbcurves=0;
++			/*Loop over the 2 vertices of the current edge*/
++			for(int je=0;je<2;je++){
+ 
+-			//go through the edges of the geometry
+-			for (i=0;i<Gh.nbe;i++){
++				/* If one of the vertex is required we are in a new curve*/
++				if (ei[je].GeomEdgeHook->IsRequiredVertex()){ 
+ 
+-				//ei = current Geometrical edge
+-				GeomEdge &ei=Gh.edges[i];   
++					/*Get curve number*/
++					int nc=ei.GeomEdgeHook->CurveNumber;
+ 
+-				//loop over the two vertices of the edge ei
+-				for(int j=0;j<2;j++) {
++					//_printf_("Dealing with curve number " << nc << "\n");
++					//_printf_("edge on geometry is same as GhCurve? " << (ei.GeomEdgeHook==Gh.curves[nc].FirstEdge || ei.GeomEdgeHook==Gh.curves[nc].LastEdge)?"yes":"no\n");
++					//if(ei.GeomEdgeHook==Gh.curves[nc].FirstEdge || ei.GeomEdgeHook==Gh.curves[nc].LastEdge){
++					//	_printf_("Do we have the right extremity? curve first vertex -> " << ((GeomVertex *)*ei[je].GeomEdgeHook==&(*Gh.curves[nc].FirstEdge)[Gh.curves[nc].FirstVertexIndex])?"yes":"no\n");
++					//	_printf_("Do we have the right extremity? curve last  vertex -> " << ((GeomVertex *)*ei[je].GeomEdgeHook==&(*Gh.curves[nc].LastEdge)[Gh.curves[nc].LastVertexIndex])?"yes":"no\n");
++					//}
++					//BUG FIX from original bamg
++					/*Check that we are on the same edge and right vertex (0 or 1) */
++					if(ei.GeomEdgeHook==Gh.curves[nc].FirstEdge  && (GeomVertex *)*ei[je].GeomEdgeHook==&(*Gh.curves[nc].FirstEdge)[Gh.curves[nc].FirstVertexIndex]){
++						bcurve[nc]=iedge*2+je;
++						bfind++;	
++					}
++					else if ((ei.GeomEdgeHook==Gh.curves[nc].LastEdge  && (GeomVertex *)*ei[je].GeomEdgeHook==&(*Gh.curves[nc].LastEdge)[Gh.curves[nc].LastVertexIndex]) && bcurve[nc]==-1){
++						bcurve[nc]=iedge*2+je;
++						bfind++;	
++					}
++				}
++			}
++		} 
++		if (bfind!=Gh.nbcurves){
++			delete [] bcurve;
++			_error_("problem generating number of curves (" << Gh.nbcurves << " found in the geometry but " << bfind << " curve found in the mesh)");
++		}
+ 
+-					/*Take only required vertices (corner->beginning of a new curve)*/
+-					if (!ei.Mark() && ei[j].Required()){ 
++		// method in 2 + 1 step 
++		//  0.0) compute the length and the number of vertex to do allocation
++		//  1.0) recompute the length
++		//  1.1) compute the  vertex 
+ 
+-						long  nbvend=0;
+-						Edge* PreviousNewEdge=NULL;
+-						lstep = -1;
++		long nbex=0,NbVerticesOnGeomEdgex=0;
++		for (int step=0; step <2;step++){
+ 
+-						/*If Edge is required (do that only once for the 2 vertices)*/
+-						if(ei.Required()){
+-							if (j==0){
+-								//do not create internal points if required (take it as is)
+-								if(step==0) nbe++;
+-								else{ 
+-									e=&ei;
+-									a=ei(0);
+-									b=ei(1);
++			long NbOfNewPoints=0;
++			long NbOfNewEdge=0;
++			long iedge;
++			Gh.UnMarkEdges();	
++			double L=0;
+ 
+-									//check that edges has been allocated
+-									_assert_(edges);
+-									edges[nbe].v[0]=a->MeshVertexHook;
+-									edges[nbe].v[1]=b->MeshVertexHook;;
+-									edges[nbe].ReferenceNumber = e->ReferenceNumber;
+-									edges[nbe].GeomEdgeHook = e;
+-									edges[nbe].adj[0] = 0;
+-									edges[nbe].adj[1] = 0;
+-									nbe++;
+-								}
+-							}
+-						}
++			/*Go through all geometrical curve*/
++			for (int icurve=0;icurve<Gh.nbcurves;icurve++){ 
+ 
+-						/*If Edge is not required: we are on a curve*/
+-						else {
+-							for (int kstep=0;kstep<=step;kstep++){
+-								//kstep=0, compute number of edges (discretize curve)
+-								//kstep=1  create the points and edge
+-								PreviousNewEdge=0;
+-								NbNewPoints=0;
+-								NbEdgeCurve=0;
+-								if (nbvend>=maxnbv) _error_("maximum number of vertices too low! Check the domain outline or increase maxnbv");
+-								lcurve =0;
+-								s = lstep; //-1 initially, then length of each sub edge
++				/*Get edge and vertex (index) of background mesh on this curve*/
++				iedge=bcurve[icurve]/2;
++				int jedge=bcurve[icurve]%2;
+ 
+-								/*reminder: i = edge number, j=[0;1] vertex index in edge*/
+-								k=j;            // k = vertex index in edge (0 or 1)
+-								e=&ei;          // e = reference of current edge
+-								a=ei(k);        // a = pointer toward the kth vertex of the current edge
+-								va = a->MeshVertexHook; // va = pointer toward mesh vertex associated
+-								e->SetMark();   // Mark edge
++				/*Get edge of Bth with index iedge*/
++				Edge &ei = BTh.edges[iedge];
+ 
+-								/*Loop until we reach the end of the curve*/
+-								for(;;){ 
+-									k = 1-k;            // other vertx index of the curve
+-									b = (*e)(k);        // b = pointer toward the other vertex of the current edge
+-									AB= b->r - a->r;   // AB = vector of the current edge
+-									Metric MA = background ? BTh.MetricAt(a->r) :a->m ;  //Get metric associated to A
+-									Metric MB = background ? BTh.MetricAt(b->r) :b->m ;  //Get metric associated to B
+-									double ledge = (MA(AB) + MB(AB))/2;                  //Get edge length in metric
++				/*Initialize variables*/
++				double Lstep=0;             // step between two points   (phase==1) 
++				long NbCreatePointOnCurve=0;// Nb of new points on curve (phase==1) 
+ 
+-									/* We are now creating the mesh edges from the geometrical edge selected above.
+-									 * The edge will be divided according to the metric previously computed and cannot
+-									 * be divided more than 10 times (MaxSubEdge). */
++				/*Do phase 0 to step*/
++				for(int phase=0;phase<=step;phase++){
+ 
+-									//By default, there is only one subedge that is the geometrical edge itself
+-									int NbSubEdge = 1;
++					/*Current curve pointer*/
++					Curve *curve= Gh.curves+icurve;
+ 
+-									//initialize lSubEdge, holding the length of each subedge (cannot be higher than 10)
+-									double lSubEdge[MaxSubEdge];
++					/*Get index of current curve*/
++					int icurveequi= Gh.GetId(curve);
+ 
+-									//Build Subedges according to the edge length
+-									if (ledge < 1.5){
+-										//if ledge < 1.5 (between one and 2), take the edge as is
+-										lSubEdge[0] = ledge;
+-									}
+-									//else, divide the edge
+-									else {
+-										//compute number of subedges (division of the edge), Maximum is 10
+-										NbSubEdge = Min( MaxSubEdge, (int) (ledge +0.5));
+-										/*Now, we are going to divide the edge according to the metric.
+-										 * Get segment by sement along the edge.
+-										 * Build lSubEdge, which holds the distance between the first vertex
+-										 * of the edge and the next point on the edge according to the 
+-										 * discretization (each SubEdge is AB)*/
+-										R2 A,B;
+-										A=a->r;
+-										Metric MAs=MA,MBs;
+-										ledge=0; 
+-										double x =0, xstep= 1./NbSubEdge;
+-										for (int kk=0; kk < NbSubEdge; kk++,A=B,MAs=MBs ) {
+-											x += xstep;
+-											B =  e->F(k ? x : 1-x);
+-											MBs= background ? BTh.MetricAt(B) : Metric(1-x,MA,x,MB);
+-											AB = A-B;
+-											lSubEdge[kk]=(ledge+=(MAs(AB)+MBs(AB))/2);
+-										}
+-									}
++					/*For phase 0, check that we are at the begining of the curve only*/
++					if(phase==0 &&  icurveequi!=icurve)  continue;
+ 
+-									double lcurveb = lcurve+ledge;
++					int   k0=jedge,k1;
++					Edge* pe=  BTh.edges+iedge;
++					int   iedgeequi=bcurve[icurveequi]/2;
++					int   jedgeequi=bcurve[icurveequi]%2;
+ 
+-									/*Now, create corresponding points*/
+-									while(s>=lcurve && s<=lcurveb && nbv<nbvend){
++					int k0equi=jedgeequi,k1equi;		  
++					Edge * peequi= BTh.edges+iedgeequi;
++					GeomEdge *ongequi = peequi->GeomEdgeHook;
+ 
+-										/*Schematic of current curve
+-										 *
+-										 *  a                   vb                  b          // vertex
+-										 *  0              ll0     ll1              ledge      // length from a
+-										 *  + --- + - ... - + --S-- + --- + - ... - +          // where is S
+-										 *  0              kk0     kk1              NbSubEdge  // Sub edge index
+-										 *
+-										 */
++					double sNew=Lstep;// abscisse of the new points (phase==1) 
++					L=0;// length of the curve
++					long i=0;// index of new points on the curve
++					GeomVertex * GA0 = *(*peequi)[k0equi].GeomEdgeHook;
++					BamgVertex *A0;
++					A0 = GA0->MeshVertexHook;  // the vertex in new mesh
++					BamgVertex *A1;
++					VertexOnGeom *GA1;
++					Edge* PreviousNewEdge = 0;
+ 
+-										double ss = s-lcurve;
++					// New Curve phase 
++					_assert_(A0-vertices>=0 && A0-vertices<nbv);
++					if(ongequi->Required()){
++						GeomVertex *GA1 = *(*peequi)[1-k0equi].GeomEdgeHook;
++						A1 = GA1->MeshVertexHook;  //
++					}       
++					else {
++						for(;;){
++							Edge &ee=*pe; 
++							Edge &eeequi=*peequi; 
++							k1 = 1-k0; // next vertex of the edge 
++							k1equi= 1 - k0equi;
++							_assert_(pe && ee.GeomEdgeHook);
++							ee.GeomEdgeHook->SetMark();
++							BamgVertex & v0=ee[0], & v1=ee[1];
++							R2 AB=(R2)v1-(R2)v0;
++							double L0=L,LAB;
++							LAB=LengthInterpole(v0.m,v1.m,AB);
++							L+= LAB;
+ 
+-										/*Find the SubEdge containing ss using Dichotomy*/
+-										int kk0=-1,kk1=NbSubEdge-1,kkk;
+-										double ll0=0,ll1=ledge,llk;
+-										while (kk1-kk0>1){
+-											if (ss < (llk=lSubEdge[kkk=(kk0+kk1)/2]))
+-											 kk1=kkk,ll1=llk;
+-											else
+-											 kk0=kkk,ll0=llk;
+-										}
+-										_assert_(kk1!=kk0);
++							if (phase){
++								// computation of the new points for the given curve
++								while ((i!=NbCreatePointOnCurve) && sNew<=L) { 
+ 
+-										/*Curvilinear coordinate in [0 1] of ss in current edge*/
+-										// WARNING: This is what we would do
+-										// ssa = (ss-ll0)/(ll1-ll0);
+-										// aa = (kk0+ssa)/NbSubEdge
+-										// This is what Bamg does:
+-										double sbb = (ss-ll0)/(ll1-ll0);
+-										/*Curvilinear coordinate in [0 1] of ss in current curve*/
+-										double bb = (kk1+sbb)/NbSubEdge;
+-										double aa = 1-bb;
++									//some checks
++									_assert_(sNew>=L0);
++									_assert_(LAB);
++									_assert_(vertices && nbv<maxnbv);
++									_assert_(edges && nbe<nbex);
++									_assert_(VerticesOnGeomEdge && NbVerticesOnGeomEdge<NbVerticesOnGeomEdgex);
+ 
+-										// new vertex on edge
+-										vb = &vertices[nbv++];
+-										vb->m = Metric(aa,a->m,bb,b->m);
+-										vb->ReferenceNumber = e->ReferenceNumber;
+-										vb->DirOfSearch =NoDirOfSearch;
+-										double abcisse = k ? bb : aa;
+-										vb->r =  e->F(abcisse);
+-										VerticesOnGeomEdge[NbVerticesOnGeomEdge++]= VertexOnGeom(*vb,*e,abcisse);        
+-
+-										// to take into account the direction of the edge
+-										s += lstep;
+-										edges[nbe].v[0]=va;
+-										edges[nbe].v[1]=vb;
+-										edges[nbe].ReferenceNumber =e->ReferenceNumber;
+-										edges[nbe].GeomEdgeHook = e;
+-										edges[nbe].adj[0] = PreviousNewEdge;
+-										if(PreviousNewEdge) PreviousNewEdge->adj[1]=&edges[nbe];
+-										PreviousNewEdge=edges+nbe;
+-										nbe++;
+-										va = vb;
++									// new vertex on edge
++									A1=vertices+nbv++;
++									GA1=VerticesOnGeomEdge+NbVerticesOnGeomEdge;
++									Edge* e = edges + nbe++;
++									double se= (sNew-L0)/LAB;
++									if (se<0 || se>=1.000000001){
++										_error_("Problem creating point on a boundary: se=" << se << " should be in [0 1]");
+ 									}
++									se = abscisseInterpole(v0.m,v1.m,AB,se,1);
++									if (se<0 || se>1){
++										_error_("Problem creating point on a boundary: se=" << se << " should be in [0 1]");
++									}
++									se = k1         ? se : 1. - se;
++									se = k1==k1equi ? se : 1. - se;
++									VertexOnBThEdge[NbVerticesOnGeomEdge++] = VertexOnEdge(A1,&eeequi,se); // save 
++									ongequi=Gh.ProjectOnCurve(eeequi,se,*A1,*GA1); 
++									A1->ReferenceNumber = eeequi.ReferenceNumber;
++									A1->DirOfSearch =NoDirOfSearch;
++									e->GeomEdgeHook = ongequi;
++									e->v[0]=A0;
++									e->v[1]=A1;
++									e->ReferenceNumber = eeequi.ReferenceNumber;
++									e->adj[0]=PreviousNewEdge;
+ 
+-									/*We just added one edge to the curve: Go to the next one*/
+-									lcurve = lcurveb;
+-									e->SetMark();
+-									a=b;
+-
+-									/*If b is required, we are on a new curve->break*/
+-									if (b->Required()) break;
+-									int kprev=k;
+-									k = e->AdjVertexIndex[kprev];// next vertices
+-									e = e->Adj[kprev];
+-									_assert_(e);
+-								}// for(;;)
+-								vb = b->MeshVertexHook;
+-
+-								/*Number of edges in the last disretized curve*/
+-								NbEdgeCurve = Max((long) (lcurve +0.5), (long) 1);
+-								/*Number of internal vertices in the last disretized curve*/
+-								NbNewPoints = NbEdgeCurve-1;
+-								if(!kstep){
+-									NbVerticesOnGeomEdge0 += NbNewPoints;
+-									nbcurves++;
++									if (PreviousNewEdge) PreviousNewEdge->adj[1]=e;
++									PreviousNewEdge=e;
++									A0=A1;
++									sNew += Lstep;
++									if (++i== NbCreatePointOnCurve) break;
+ 								}
+-								nbvend=nbv+NbNewPoints; 
+-								lstep = lcurve / NbEdgeCurve; //approximately one
+-							}// end of curve --
+-							if (edges) { // last edges of the curves 
+-								edges[nbe].v[0]=va;
+-								edges[nbe].v[1]=vb;
+-								edges[nbe].ReferenceNumber = e->ReferenceNumber;
+-								edges[nbe].GeomEdgeHook = e;
+-								edges[nbe].adj[0] = PreviousNewEdge;
+-								edges[nbe].adj[1] = 0;
+-								if(PreviousNewEdge) PreviousNewEdge->adj[1] = & edges[nbe];
+-								nbe++;
+ 							}
+-							else nbe += NbEdgeCurve;
+-						} // end on  curve ---
++
++							//some checks
++							_assert_(ee.GeomEdgeHook->CurveNumber==ei.GeomEdgeHook->CurveNumber);
++							if (ee[k1].GeomEdgeHook->IsRequiredVertex()) {
++								_assert_(eeequi[k1equi].GeomEdgeHook->IsRequiredVertex());
++								GeomVertex * GA1 = *eeequi[k1equi].GeomEdgeHook;
++								A1=GA1->MeshVertexHook;// the vertex in new mesh
++								_assert_(A1-vertices>=0 && A1-vertices<nbv);
++								break;
++							}
++							if (!ee.adj[k1]) {
++								_error_("adj edge " << BTh.GetId(ee) << ", nbe=" << nbe << ", Gh.vertices=" << Gh.vertices);
++							}
++							pe = ee.adj[k1]; // next edge
++							k0 = pe->Intersection(ee); 
++							peequi= eeequi.adj[k1equi];  // next edge
++							k0equi=peequi->Intersection(eeequi);            
++						}// for(;;) end of the curve
+ 					}
++
++					if (phase){ // construction of the last edge
++						Edge* e=edges + nbe++;
++						e->GeomEdgeHook  = ongequi;
++						e->v[0]=A0;
++						e->v[1]=A1;
++						e->ReferenceNumber = peequi->ReferenceNumber;
++						e->adj[0]=PreviousNewEdge;
++						e->adj[1]=0;
++						if (PreviousNewEdge) PreviousNewEdge->adj[1]=e;
++						PreviousNewEdge = e;
++
++						_assert_(i==NbCreatePointOnCurve);
++					}
++
++					if (!phase)  { // 
++						long NbSegOnCurve = Max((long)(L+0.5),(long) 1);// nb of seg
++						Lstep = L/NbSegOnCurve; 
++						NbCreatePointOnCurve = NbSegOnCurve-1;
++						NbOfNewEdge += NbSegOnCurve;
++						NbOfNewPoints += NbCreatePointOnCurve;
++					}
+ 				}
+-			} // for (i=0;i<nbe;i++)
+-			if(!step) {
+-				_assert_(!edges);
+-				_assert_(!VerticesOnGeomEdge);
++			}//  end of curve loop 
+ 
+-				edges = new Edge[nbex=nbe];
+-				if(NbVerticesOnGeomEdge0) VerticesOnGeomEdge = new VertexOnGeom[NbVerticesOnGeomEdge0];
+-
+-				// do the vertex on a geometrical vertex
+-				_assert_(VerticesOnGeomEdge || NbVerticesOnGeomEdge0==0);
+-				NbVerticesOnGeomEdge0 = NbVerticesOnGeomEdge;       
++			//Allocate memory
++			if(step==0){
++				if(nbv+NbOfNewPoints > maxnbv) {
++					_error_("too many vertices on geometry: " << nbv+NbOfNewPoints << " >= " << maxnbv);
++				}
++				edges = new Edge[NbOfNewEdge];
++				nbex = NbOfNewEdge;
++				if(NbOfNewPoints) {
++					VerticesOnGeomEdge    = new VertexOnGeom[NbOfNewPoints];
++					NbVertexOnBThEdge     = NbOfNewPoints;
++					VertexOnBThEdge       = new  VertexOnEdge[NbOfNewPoints];
++					NbVerticesOnGeomEdgex = NbOfNewPoints;
++				}
++				NbOfNewPoints =0;
++				NbOfNewEdge = 0;
+ 			}
+-			else{
+-				_assert_(NbVerticesOnGeomEdge==NbVerticesOnGeomEdge0);
+-			}
+ 		}
++		_assert_(nbe!=0);
++		delete [] bcurve;
+ 
+-
+ 		//Insert points inside existing triangles
+ 		if (verbose>4) _printf_("      -- current number of vertices = " << nbv << "\n");
+ 		if (verbose>3) _printf_("      Creating initial Constrained Delaunay Triangulation...\n");
Index: /issm/oecreview/Archive/18296-19100/ISSM-18493-18494.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18493-18494.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18493-18494.diff	(revision 19102)
@@ -0,0 +1,58 @@
+Index: ../trunk-jpl/src/m/classes/seaice.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/seaice.m	(revision 18493)
++++ ../trunk-jpl/src/m/classes/seaice.m	(revision 18494)
+@@ -20,6 +20,7 @@
+ 			end
+ 		end % }}}
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
++			if solution~=SeaiceSolutionEnum(), return; end
+ 			md = checkfield(md,'fieldname','seaice.thickness','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
+ 			md = checkfield(md,'fieldname','seaice.concentration','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
+ 			md = checkfield(md,'fieldname','seaice.spcvx','size',[md.mesh.numberofvertices 1]);
+Index: ../trunk-jpl/src/m/classes/matseaice.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/matseaice.m	(revision 18493)
++++ ../trunk-jpl/src/m/classes/matseaice.m	(revision 18494)
+@@ -5,6 +5,7 @@
+ 
+ classdef matseaice
+ 	properties (SetAccess=public) 
++		rho_ice                = 0.;
+ 		poisson                = 0.;
+ 		young_modulus          = 0.;
+ 		damage                 = NaN;
+@@ -35,6 +36,9 @@
+ 		end % }}}
+ 		function obj = setdefaultparameters(obj) % {{{
+ 
++			%Ice density
++			obj.rho_ice = 917.; %kg/m^3
++
+ 			%poisson modulus
+ 			obj.poisson=0.3;
+ 
+@@ -58,6 +62,7 @@
+ 
+ 		end % }}}
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
++			md = checkfield(md,'fieldname','materials.rho_ice','NaN',1,'>',0,'numel',1);
+ 			md = checkfield(md,'fieldname','materials.poisson','NaN',1,'>',0,'<',.5,'numel',1);
+ 			md = checkfield(md,'fieldname','materials.young_modulus','NaN',1,'>',0,'numel',1);
+ 			md = checkfield(md,'fieldname','materials.damage','NaN',1,'>=',0,'<',1,'size',[md.mesh.numberofelements 1]);
+@@ -70,6 +75,7 @@
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   Sea Ice Material:'));
+ 
++			fielddisplay(obj,'rho_ice','ice density [kg/m^3]');
+ 			fielddisplay(obj,'poisson','poisson ratio for undamaged ice [no unit]');
+ 			fielddisplay(obj,'young_modulus','Young modulus for undamaged ice [Pa]');
+ 			fielddisplay(obj,'damage','damage, between 0 (no damage) and 1 (fully damaged)');
+@@ -81,6 +87,7 @@
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+ 			WriteData(fid,'enum',MaterialsEnum(),'data',MatseaiceEnum(),'format','Integer');
++			WriteData(fid,'object',obj,'class','materials','fieldname','rho_ice','format','Double');
+ 			WriteData(fid,'object',obj,'class','materials','fieldname','poisson','format','Double');
+ 			WriteData(fid,'object',obj,'class','materials','fieldname','young_modulus','format','Double');
+ 			WriteData(fid,'object',obj,'class','materials','fieldname','damage','format','DoubleMat','mattype',2);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18494-18495.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18494-18495.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18494-18495.diff	(revision 19102)
@@ -0,0 +1,174 @@
+Index: ../trunk-jpl/externalpackages/vim/addons/vim/syntax/c.vim
+===================================================================
+--- ../trunk-jpl/externalpackages/vim/addons/vim/syntax/c.vim	(revision 18494)
++++ ../trunk-jpl/externalpackages/vim/addons/vim/syntax/c.vim	(revision 18495)
+@@ -411,14 +411,13 @@
+ "ISSM's objects begin
+ syn keyword cType BoolInput
+ syn keyword cType BoolParam
+-syn keyword cType classes
+ syn keyword cType Constraint
+ syn keyword cType Constraints
+ syn keyword cType Contour
+ syn keyword cType Contours
+ syn keyword cType ControlInput
++syn keyword cType DataSetParam
+ syn keyword cType DatasetInput
+-syn keyword cType DataSetParam
+ syn keyword cType Definition
+ syn keyword cType DependentObject
+ syn keyword cType DofIndexing
+@@ -431,20 +430,19 @@
+ syn keyword cType Element
+ syn keyword cType ElementHook
+ syn keyword cType ElementMatrix
++syn keyword cType ElementVector
+ syn keyword cType Elements
+-syn keyword cType ElementVector
+ syn keyword cType ExponentialVariogram
+ syn keyword cType ExternalResult
+ syn keyword cType FemModel
+ syn keyword cType FileParam
+ syn keyword cType Friction
+ syn keyword cType Gauss
+-syn keyword cType GaussianVariogram
+-syn keyword cType gaussobjects
+ syn keyword cType GaussPenta
+ syn keyword cType GaussSeg
+ syn keyword cType GaussTetra
+ syn keyword cType GaussTria
++syn keyword cType GaussianVariogram
+ syn keyword cType GenericExternalResult
+ syn keyword cType GenericOption
+ syn keyword cType GenericParam
+@@ -458,7 +456,6 @@
+ syn keyword cType IntParam
+ syn keyword cType IntVecParam
+ syn keyword cType IoModel
+-syn keyword cType krigingobjects
+ syn keyword cType Load
+ syn keyword cType Loads
+ syn keyword cType Massfluxatgate
+@@ -466,8 +463,8 @@
+ syn keyword cType Materials
+ syn keyword cType Matice
+ syn keyword cType Matpar
+-syn keyword cType matrixobjects
+ syn keyword cType MatrixParam
++syn keyword cType Matseaice
+ syn keyword cType Misfit
+ syn keyword cType Node
+ syn keyword cType Nodes
+@@ -475,8 +472,8 @@
+ syn keyword cType Observation
+ syn keyword cType Observations
+ syn keyword cType Option
++syn keyword cType OptionUtilities
+ syn keyword cType Options
+-syn keyword cType OptionUtilities
+ syn keyword cType Param
+ syn keyword cType Parameters
+ syn keyword cType Pengrid
+@@ -488,12 +485,12 @@
+ syn keyword cType Profiler
+ syn keyword cType Quadtree
+ syn keyword cType Results
++syn keyword cType RiftStruct
+ syn keyword cType Riftfront
+-syn keyword cType RiftStruct
+ syn keyword cType Seg
+ syn keyword cType SegInput
++syn keyword cType SegRef
+ syn keyword cType Segment
+-syn keyword cType SegRef
+ syn keyword cType SpcDynamic
+ syn keyword cType SpcStatic
+ syn keyword cType SpcTransient
+@@ -513,6 +510,10 @@
+ syn keyword cType VectorParam
+ syn keyword cType Vertex
+ syn keyword cType Vertices
++syn keyword cType classes
++syn keyword cType gaussobjects
++syn keyword cType krigingobjects
++syn keyword cType matrixobjects
+ syn keyword cType AdjointBalancethickness2Analysis
+ syn keyword cType AdjointBalancethicknessAnalysis
+ syn keyword cType AdjointHorizAnalysis
+@@ -541,6 +542,7 @@
+ syn keyword cType MasstransportAnalysis
+ syn keyword cType MeltingAnalysis
+ syn keyword cType MeshdeformationAnalysis
++syn keyword cType SeaiceAnalysis
+ syn keyword cType SmoothedSurfaceSlopeXAnalysis
+ syn keyword cType SmoothedSurfaceSlopeYAnalysis
+ syn keyword cType StressbalanceAnalysis
+@@ -842,11 +844,7 @@
+ syn keyword cConstant BalancethicknessSpcpotentialEnum
+ syn keyword cConstant BalancethicknessApparentMassbalanceEnum
+ syn keyword cConstant Balancethickness2MisfitEnum
+-syn keyword cConstant BalancethicknessNuxEnum
+-syn keyword cConstant BalancethicknessNuyEnum
+-syn keyword cConstant BalancethicknessVxObsEnum
+-syn keyword cConstant BalancethicknessVyObsEnum
+-syn keyword cConstant BalancethicknessThicknessObsEnum
++syn keyword cConstant BalancethicknessDiffusionCoefficientEnum
+ syn keyword cConstant SurfaceforcingsEnum
+ syn keyword cConstant SMBEnum
+ syn keyword cConstant SurfaceforcingsMassBalanceEnum
+@@ -927,6 +925,8 @@
+ syn keyword cConstant UzawaPressureAnalysisEnum
+ syn keyword cConstant GiaSolutionEnum
+ syn keyword cConstant GiaAnalysisEnum
++syn keyword cConstant SeaiceSolutionEnum
++syn keyword cConstant SeaiceAnalysisEnum
+ syn keyword cConstant MeshdeformationSolutionEnum
+ syn keyword cConstant MeshdeformationAnalysisEnum
+ syn keyword cConstant LevelsetAnalysisEnum
+@@ -1127,6 +1127,7 @@
+ syn keyword cConstant XTaylorHoodEnum
+ syn keyword cConstant OneLayerP4zEnum
+ syn keyword cConstant CrouzeixRaviartEnum
++syn keyword cConstant LACrouzeixRaviartEnum
+ syn keyword cConstant SaveResultsEnum
+ syn keyword cConstant BoolExternalResultEnum
+ syn keyword cConstant DoubleExternalResultEnum
+@@ -1238,6 +1239,38 @@
+ syn keyword cConstant LevelsetfunctionSlopeXEnum
+ syn keyword cConstant LevelsetfunctionSlopeYEnum
+ syn keyword cConstant LevelsetfunctionPicardEnum
++syn keyword cConstant SeaiceatmEnum
++syn keyword cConstant SeaiceoceanEnum
++syn keyword cConstant SeaiceThicknessEnum
++syn keyword cConstant SeaiceConcentrationEnum
++syn keyword cConstant SeaiceSpcvxEnum
++syn keyword cConstant SeaiceSpcvyEnum
++syn keyword cConstant SeaiceCoriolisFactorEnum
++syn keyword cConstant BasalforcingsRhoOceanEnum
++syn keyword cConstant BasalforcingsOceanCoefEnum
++syn keyword cConstant BasalforcingsOceanLinDragCoefEnum
++syn keyword cConstant BasalforcingsOceanQuadDragCoefEnum
++syn keyword cConstant BasalforcingsOceanTurningAngleEnum
++syn keyword cConstant BasalforcingsOceanSshEnum
++syn keyword cConstant BasalforcingsOceanVxEnum
++syn keyword cConstant BasalforcingsOceanVyEnum
++syn keyword cConstant SurfaceforcingsRhoAirEnum
++syn keyword cConstant SurfaceforcingsAirCoefEnum
++syn keyword cConstant SurfaceforcingsAirLinDragCoefEnum
++syn keyword cConstant SurfaceforcingsAirQuadDragCoefEnum
++syn keyword cConstant SurfaceforcingsWindVxEnum
++syn keyword cConstant SurfaceforcingsWindVyEnum
++syn keyword cConstant MatseaiceEnum
++syn keyword cConstant MaterialsPoissonEnum
++syn keyword cConstant MaterialsYoungModulusEnum
++syn keyword cConstant MaterialsDamageEnum
++syn keyword cConstant MaterialsRidgingExponentEnum
++syn keyword cConstant MaterialsCohesionEnum
++syn keyword cConstant MaterialsInternalFrictionCoefEnum
++syn keyword cConstant MaterialsCompressionCoefEnum
++syn keyword cConstant MaterialsTractionCoefEnum
++syn keyword cConstant VxStarEnum
++syn keyword cConstant VyStarEnum
+ "ISSM's Enums end
+ """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18495-18496.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18495-18496.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18495-18496.diff	(revision 19102)
@@ -0,0 +1,156 @@
+Index: ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18495)
++++ ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18496)
+@@ -38,6 +38,7 @@
+ 	iomodel->FetchDataToInput(elements,VyStarEnum);
+ 	iomodel->FetchDataToInput(elements,VxEnum);
+ 	iomodel->FetchDataToInput(elements,VyEnum);
++	iomodel->FetchDataToInput(elements,SeaiceCoriolisFactorEnum);
+ }/*}}}*/
+ void SeaiceAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 
+@@ -72,7 +73,7 @@
+ 	if(concentration_input->Max()==0.) return NULL;
+ 
+ 	/*Intermediaries */
+-	IssmDouble  Jdet,D_scalar,dt;
++	IssmDouble  Jdet,D_scalar,dt,thickness,concentration;
+ 	IssmDouble  C[3][3];
+ 	IssmDouble* xyz_list = NULL;
+ 
+@@ -88,17 +89,23 @@
+ 	/*Retrieve all inputs and parameters*/
+ 	element->GetVerticesCoordinates(&xyz_list);
+ 	element->FindParam(&dt,TimesteppingTimeStepEnum);
++	IssmDouble rho_i               = element->GetMaterialParameter(MaterialsRhoIceEnum);
++	Input*     thickness_input     = element->GetInput(SeaiceThicknessEnum);     _assert_(thickness_input);
+ 
+ 	/* Start  looping on the number of gaussian points: */
+ 	Gauss* gauss=element->NewGauss(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 
+ 		gauss->GaussPoint(ig);
++
++		/*Get Jacobian Determinant and thickness*/
+ 		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		thickness_input->GetInputValue(&thickness,gauss);
++		concentration_input->GetInputValue(&concentration,gauss);
+ 
+ 		/*Create first part of the stiffness matrix*/
+ 		this->GetM(M,element,xyz_list,gauss);
+-		D_scalar=gauss->weight*Jdet;
++		D_scalar=rho_i*thickness*gauss->weight*Jdet;
+ 		TripleMultiply(M,1,numdof,1,
+ 					&D_scalar,1,1,0,
+ 					M,1,numdof,0,
+@@ -116,6 +123,8 @@
+ 					&C[0][0],3,3,0,
+ 					B,3,numdof,0,
+ 					&Ke->values[0],1);
++
++		/*Create Coriolis part*/
+ 	}
+ 
+ 	/*Clean up and return*/
+@@ -132,9 +141,13 @@
+ 	if(concentration_input->Max()==0.) return NULL;
+ 
+ 	/*Intermediaries */
+-	IssmDouble  concentration,thickness,dt,Jdet,vx,vy;
+-	IssmDouble  rho_air,air_coef,air_lin_drag_coef,air_quad_drag_coef;
+-	IssmDouble  windvx,windvy,wind_vnorm;
++	IssmDouble  air_coef,ocean_coef,constant_part;
++	IssmDouble  rho_ice,rho_air,rho_ocean,gravity;
++	IssmDouble  vx,vy,vxstar,vystar,windvx,windvy,oceanvx,oceanvy,vnorm;
++	IssmDouble  air_lin_drag_coef,air_quad_drag_coef;
++	IssmDouble  ocean_lin_drag_coef,ocean_quad_drag_coef;
++	IssmDouble  concentration,thickness,coriolis_factor,dt,Jdet;
++	IssmDouble  ocean_turning_angle,dssh[2];
+ 	IssmDouble* xyz_list = NULL;
+ 
+ 	/*Fetch number of nodes and dof for this finite element*/
+@@ -152,11 +165,25 @@
+ 	element->FindParam(&air_coef,SurfaceforcingsAirCoefEnum);
+ 	element->FindParam(&air_lin_drag_coef,SurfaceforcingsAirLinDragCoefEnum);
+ 	element->FindParam(&air_quad_drag_coef,SurfaceforcingsAirQuadDragCoefEnum);
++	element->FindParam(&rho_ocean,BasalforcingsRhoOceanEnum);
++	element->FindParam(&ocean_coef,BasalforcingsOceanCoefEnum);
++	element->FindParam(&ocean_lin_drag_coef,BasalforcingsOceanLinDragCoefEnum);
++	element->FindParam(&ocean_quad_drag_coef,BasalforcingsOceanQuadDragCoefEnum);
++	element->FindParam(&ocean_quad_drag_coef,BasalforcingsOceanQuadDragCoefEnum);
++	element->FindParam(&ocean_turning_angle,BasalforcingsOceanTurningAngleEnum);
++	rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum);
++	gravity = element->GetMaterialParameter(ConstantsGEnum);
++	Input* thickness_input     = element->GetInput(SeaiceThicknessEnum);       _assert_(thickness_input);
++	Input* coriolis_fact_input = element->GetInput(SeaiceCoriolisFactorEnum);  _assert_(coriolis_fact_input);
+ 	Input* vx_input            = element->GetInput(VxEnum);                    _assert_(vx_input);
+ 	Input* vy_input            = element->GetInput(VyEnum);                    _assert_(vy_input);
++	Input* vxstar_input        = element->GetInput(VxStarEnum);                _assert_(vxstar_input);
++	Input* vystar_input        = element->GetInput(VyStarEnum);                _assert_(vystar_input);
+ 	Input* windvx_input        = element->GetInput(SurfaceforcingsWindVxEnum); _assert_(windvx_input);
+ 	Input* windvy_input        = element->GetInput(SurfaceforcingsWindVyEnum); _assert_(windvy_input);
+-	Input* thickness_input     = element->GetInput(SeaiceThicknessEnum);       _assert_(thickness_input);
++	Input* oceanvx_input       = element->GetInput(BasalforcingsOceanVxEnum);  _assert_(oceanvx_input);
++	Input* oceanvy_input       = element->GetInput(BasalforcingsOceanVyEnum);  _assert_(oceanvy_input);
++	Input* oceanssh_input      = element->GetInput(BasalforcingsOceanSshEnum); _assert_(oceanssh_input);
+ 
+ 	/* Start  looping on the number of gaussian points: */
+ 	Gauss* gauss=element->NewGauss(2);
+@@ -167,20 +194,53 @@
+ 		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+ 		element->NodalFunctions(basis, gauss);
+ 
++		/*Get all inputs on gauss point*/
+ 		thickness_input->GetInputValue(&thickness,gauss);
+ 		concentration_input->GetInputValue(&concentration,gauss);
++		coriolis_fact_input->GetInputValue(&coriolis_factor,gauss);
+ 		vx_input->GetInputValue(&vx,gauss);
+ 		vy_input->GetInputValue(&vy,gauss);
++		vxstar_input->GetInputValue(&vxstar,gauss);
++		vystar_input->GetInputValue(&vystar,gauss);
+ 		windvx_input->GetInputValue(&windvx,gauss);
+ 		windvy_input->GetInputValue(&windvy,gauss);
++		oceanvx_input->GetInputValue(&oceanvx,gauss);
++		oceanvy_input->GetInputValue(&oceanvy,gauss);
++		oceanssh_input->GetInputDerivativeValue(&dssh[2],xyz_list,gauss);
+ 
++		/*Previous speed (finite differencing)*/
++		for(int i=0;i<numnodes;i++){
++			pe->values[i*2+0]+=Jdet*gauss->weight*rho_ice*thickness*vx*basis[i];
++			pe->values[i*2+1]+=Jdet*gauss->weight*rho_ice*thickness*vy*basis[i];
++		}
++
+ 		/*Atmespheric forcing*/
+-		wind_vnorm = sqrt(windvx*windvx + windvy*windvy);
++		vnorm    = sqrt(windvx*windvx + windvy*windvy);
++		constant_part = concentration*air_coef*rho_air*(air_lin_drag_coef+air_quad_drag_coef*vnorm);
++		for(int i=0;i<numnodes;i++){
++			pe->values[i*2+0] += dt*constant_part*windvx*Jdet*gauss->weight*basis[i];
++			pe->values[i*2+1] += dt*constant_part*windvy*Jdet*gauss->weight*basis[i];
++		}
+ 
++		/*Ocean forcing*/
++		vnorm = sqrt(pow(oceanvx-vx,2) + pow(oceanvy-vy,2));
++		constant_part = concentration*air_coef*rho_air*(air_lin_drag_coef+air_quad_drag_coef*vnorm);
+ 		for(int i=0;i<numnodes;i++){
+-			pe->values[i*2+0] += dt*concentration*air_coef*rho_air*(air_lin_drag_coef+air_quad_drag_coef*wind_vnorm)*windvx*Jdet*gauss->weight*basis[i];
+-			pe->values[i*2+1] += dt*concentration*air_coef*rho_air*(air_lin_drag_coef+air_quad_drag_coef*wind_vnorm)*windvy*Jdet*gauss->weight*basis[i];
++			pe->values[i*2+0] += dt*constant_part*(oceanvy-vy)*sin(ocean_turning_angle)*Jdet*gauss->weight*basis[i];
++			pe->values[i*2+1] += dt*constant_part*(vx-oceanvx)*sin(ocean_turning_angle)*Jdet*gauss->weight*basis[i];
++
++			pe->values[i*2+0] += dt*constant_part*oceanvx*cos(ocean_turning_angle)*Jdet*gauss->weight*basis[i];
++			pe->values[i*2+1] += dt*constant_part*oceanvy*cos(ocean_turning_angle)*Jdet*gauss->weight*basis[i];
+ 		}
++
++		/*Coriolis forces (use ustar)*/
++		for(int i=0;i<numnodes;i++){
++			pe->values[i*2+0] += dt*(-rho_ice*thickness*coriolis_factor*vystar)*Jdet*gauss->weight*basis[i];
++			pe->values[i*2+1] += dt*(+rho_ice*thickness*coriolis_factor*vxstar)*Jdet*gauss->weight*basis[i];
++
++			pe->values[i*2+0] += dt*(-rho_ice*thickness*gravity*dssh[0])*Jdet*gauss->weight*basis[i];
++			pe->values[i*2+1] += dt*(-rho_ice*thickness*gravity*dssh[1])*Jdet*gauss->weight*basis[i];
++		}
+ 	}
+ 
+ 	/*Clean up and return*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18496-18497.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18496-18497.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18496-18497.diff	(revision 19102)
@@ -0,0 +1,192 @@
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18496)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18497)
+@@ -750,6 +750,7 @@
+ 	SeaiceConcentrationEnum,
+ 	SeaiceSpcvxEnum,
+ 	SeaiceSpcvyEnum,
++	SeaiceCoriolisFactorEnum,
+ 	BasalforcingsRhoOceanEnum,
+ 	BasalforcingsOceanCoefEnum,
+ 	BasalforcingsOceanLinDragCoefEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18496)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18497)
+@@ -709,6 +709,7 @@
+ 		case SeaiceConcentrationEnum : return "SeaiceConcentration";
+ 		case SeaiceSpcvxEnum : return "SeaiceSpcvx";
+ 		case SeaiceSpcvyEnum : return "SeaiceSpcvy";
++		case SeaiceCoriolisFactorEnum : return "SeaiceCoriolisFactor";
+ 		case BasalforcingsRhoOceanEnum : return "BasalforcingsRhoOcean";
+ 		case BasalforcingsOceanCoefEnum : return "BasalforcingsOceanCoef";
+ 		case BasalforcingsOceanLinDragCoefEnum : return "BasalforcingsOceanLinDragCoef";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18496)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18497)
+@@ -724,6 +724,7 @@
+ 	      else if (strcmp(name,"SeaiceConcentration")==0) return SeaiceConcentrationEnum;
+ 	      else if (strcmp(name,"SeaiceSpcvx")==0) return SeaiceSpcvxEnum;
+ 	      else if (strcmp(name,"SeaiceSpcvy")==0) return SeaiceSpcvyEnum;
++	      else if (strcmp(name,"SeaiceCoriolisFactor")==0) return SeaiceCoriolisFactorEnum;
+ 	      else if (strcmp(name,"BasalforcingsRhoOcean")==0) return BasalforcingsRhoOceanEnum;
+ 	      else if (strcmp(name,"BasalforcingsOceanCoef")==0) return BasalforcingsOceanCoefEnum;
+ 	      else if (strcmp(name,"BasalforcingsOceanLinDragCoef")==0) return BasalforcingsOceanLinDragCoefEnum;
+Index: ../trunk-jpl/src/c/classes/Materials/Matpar.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 18496)
++++ ../trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 18497)
+@@ -95,6 +95,7 @@
+ 			iomodel->Constant(&this->mantle_density,MaterialsMantleDensityEnum);
+ 			break;
+ 		case MatseaiceEnum:
++			iomodel->Constant(&this->rho_ice,MaterialsRhoIceEnum);
+ 			iomodel->Constant(&this->poisson,MaterialsPoissonEnum);
+ 			iomodel->Constant(&this->young_modulus,MaterialsYoungModulusEnum);
+ 			iomodel->Constant(&this->ridging_exponent,MaterialsRidgingExponentEnum);
+Index: ../trunk-jpl/src/c/classes/Materials/Matseaice.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Matseaice.cpp	(revision 18496)
++++ ../trunk-jpl/src/c/classes/Materials/Matseaice.cpp	(revision 18497)
+@@ -32,17 +32,17 @@
+ 	return;
+ }
+ /*}}}*/
+-Matseaice::Matseaice(int matice_mid,int index, IoModel* iomodel){/*{{{*/
++Matseaice::Matseaice(int matseaice_mid,int index, IoModel* iomodel){/*{{{*/
+ 
+ 	/*Intermediaries:*/
+-	int    matice_eid;
++	int    matseaice_eid;
+ 
+ 	/*Initialize id*/
+-	this->mid=matice_mid;
++	this->mid=matseaice_mid;
+ 
+ 	/*Hooks: */
+-	matice_eid=index+1;
+-	this->helement=new Hook(&matice_eid,1);
++	matseaice_eid=index+1;
++	this->helement=new Hook(&matseaice_eid,1);
+ 	this->element=NULL;
+ 
+ 	return;
+@@ -82,33 +82,33 @@
+ Object* Matseaice::copy() {/*{{{*/
+ 
+ 	/*Output*/
+-	Matseaice* matice=NULL;
++	Matseaice* matseaice=NULL;
+ 
+ 	/*Initialize output*/
+-	matice=new Matseaice();
++	matseaice=new Matseaice();
+ 
+ 	/*copy fields: */
+-	matice->mid=this->mid;
+-	matice->helement=(Hook*)this->helement->copy();
+-	matice->element =(Element*)this->helement->delivers();
++	matseaice->mid=this->mid;
++	matseaice->helement=(Hook*)this->helement->copy();
++	matseaice->element =(Element*)this->helement->delivers();
+ 
+-	return matice;
++	return matseaice;
+ }
+ /*}}}*/
+ Material* Matseaice::copy2(Element* element_in) {/*{{{*/
+ 
+ 	/*Output*/
+-	Matseaice* matice=NULL;
++	Matseaice* matseaice=NULL;
+ 
+ 	/*Initialize output*/
+-	matice=new Matseaice();
++	matseaice=new Matseaice();
+ 
+ 	/*copy fields: */
+-	matice->mid=this->mid;
+-	matice->helement=(Hook*)this->helement->copy();
+-	matice->element =element_in;
++	matseaice->mid=this->mid;
++	matseaice->helement=(Hook*)this->helement->copy();
++	matseaice->element =element_in;
+ 
+-	return matice;
++	return matseaice;
+ }
+ /*}}}*/
+ 
+Index: ../trunk-jpl/src/m/classes/seaice.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/seaice.m	(revision 18496)
++++ ../trunk-jpl/src/m/classes/seaice.m	(revision 18497)
+@@ -5,10 +5,11 @@
+ 
+ classdef seaice
+ 	properties (SetAccess=public) 
+-		thickness     = NaN;
+-		concentration = NaN;
+-		spcvx         = NaN;
+-		spcvy         = NaN;
++		thickness       = NaN;
++		concentration   = NaN;
++		spcvx           = NaN;
++		spcvy           = NaN;
++		coriolis_factor = NaN;
+ 	end
+ 	methods
+ 		function obj = seaice(varargin) % {{{
+@@ -25,18 +26,22 @@
+ 			md = checkfield(md,'fieldname','seaice.concentration','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
+ 			md = checkfield(md,'fieldname','seaice.spcvx','size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','seaice.spcvy','size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','seaice.coriolis_factor','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
+ 		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   seaice parameters:'));
+ 			fielddisplay(obj,'thickness','sea ice thickness [m]');
++			fielddisplay(obj,'concentration','sea ice concentration (between 0 and 1)');
+ 			fielddisplay(obj,'spcvx','x-axis velocity constraint (NaN means no constraint) [m/s]');
+ 			fielddisplay(obj,'spcvy','y-axis velocity constraint (NaN means no constraint) [m/s]');
++			fielddisplay(obj,'coriolis_factor','factor applied to Coriolis forces (latitude dependent)');
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+ 			WriteData(fid,'object',obj,'fieldname','thickness','format','DoubleMat','mattype',2);
+ 			WriteData(fid,'object',obj,'fieldname','concentration','format','DoubleMat','mattype',2);
+ 			WriteData(fid,'object',obj,'fieldname','spcvx','format','DoubleMat','mattype',1);
+ 			WriteData(fid,'object',obj,'fieldname','spcvy','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'fieldname','coriolis_factor','format','DoubleMat','mattype',2);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/enum/SeaiceCoriolisFactorEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceCoriolisFactorEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SeaiceCoriolisFactorEnum.m	(revision 18497)
+@@ -0,0 +1,11 @@
++function macro=SeaiceCoriolisFactorEnum()
++%SEAICECORIOLISFACTORENUM - Enum of SeaiceCoriolisFactor
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SeaiceCoriolisFactorEnum()
++
++macro=StringToEnum('SeaiceCoriolisFactor');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18496)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18497)
+@@ -701,6 +701,7 @@
+ def SeaiceConcentrationEnum(): return StringToEnum("SeaiceConcentration")[0]
+ def SeaiceSpcvxEnum(): return StringToEnum("SeaiceSpcvx")[0]
+ def SeaiceSpcvyEnum(): return StringToEnum("SeaiceSpcvy")[0]
++def SeaiceCoriolisFactorEnum(): return StringToEnum("SeaiceCoriolisFactor")[0]
+ def BasalforcingsRhoOceanEnum(): return StringToEnum("BasalforcingsRhoOcean")[0]
+ def BasalforcingsOceanCoefEnum(): return StringToEnum("BasalforcingsOceanCoef")[0]
+ def BasalforcingsOceanLinDragCoefEnum(): return StringToEnum("BasalforcingsOceanLinDragCoef")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18497-18498.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18497-18498.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18497-18498.diff	(revision 19102)
@@ -0,0 +1,30 @@
+Index: ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18497)
++++ ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18498)
+@@ -130,6 +130,7 @@
+ 	/*Clean up and return*/
+ 	xDelete<IssmDouble>(xyz_list);
+ 	xDelete<IssmDouble>(B);
++	xDelete<IssmDouble>(M);
+ 	delete gauss;
+ 	return Ke;
+ }
+@@ -206,7 +207,7 @@
+ 		windvy_input->GetInputValue(&windvy,gauss);
+ 		oceanvx_input->GetInputValue(&oceanvx,gauss);
+ 		oceanvy_input->GetInputValue(&oceanvy,gauss);
+-		oceanssh_input->GetInputDerivativeValue(&dssh[2],xyz_list,gauss);
++		oceanssh_input->GetInputDerivativeValue(&dssh[0],xyz_list,gauss);
+ 
+ 		/*Previous speed (finite differencing)*/
+ 		for(int i=0;i<numnodes;i++){
+@@ -214,7 +215,7 @@
+ 			pe->values[i*2+1]+=Jdet*gauss->weight*rho_ice*thickness*vy*basis[i];
+ 		}
+ 
+-		/*Atmespheric forcing*/
++		/*Atmospheric forcing*/
+ 		vnorm    = sqrt(windvx*windvx + windvy*windvy);
+ 		constant_part = concentration*air_coef*rho_air*(air_lin_drag_coef+air_quad_drag_coef*vnorm);
+ 		for(int i=0;i<numnodes;i++){
Index: /issm/oecreview/Archive/18296-19100/ISSM-18498-18499.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18498-18499.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18498-18499.diff	(revision 19102)
@@ -0,0 +1,4 @@
+Index: ../trunk-jpl/test/Archives/Archive514.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
Index: /issm/oecreview/Archive/18296-19100/ISSM-18499-18500.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18499-18500.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18499-18500.diff	(revision 19102)
@@ -0,0 +1,21 @@
+Index: ../trunk-jpl/src/c/modules/Bamgx/Bamgx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/Bamgx/Bamgx.cpp	(revision 18499)
++++ ../trunk-jpl/src/c/modules/Bamgx/Bamgx.cpp	(revision 18500)
+@@ -199,16 +199,13 @@
+ 		BTh.WriteMetric(bamgopts);
+ 
+ 		/*clean up*/
+-		printf("-------------- file: Bamgx.cpp line: %i\n",__LINE__); 
+ 		delete &Th;
+-		printf("-------------- file: Bamgx.cpp line: %i\n",__LINE__); 
+ 		//delete &BTh;
+ 		/*}}}*/
+ 	}
+ 
+ 	/*No error return*/
+ 	if (verbosity>1) _printf_("   Exiting Bamg.\n");
+-	printf("-------------- file: Bamgx.cpp line: %i\n",__LINE__); 
+ 	return noerr;
+ 
+ }
Index: /issm/oecreview/Archive/18296-19100/ISSM-18500-18501.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18500-18501.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18500-18501.diff	(revision 19102)
@@ -0,0 +1,68 @@
+Index: ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18500)
++++ ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18501)
+@@ -74,6 +74,8 @@
+ 
+ 	/*Intermediaries */
+ 	IssmDouble  Jdet,D_scalar,dt,thickness,concentration;
++	IssmDouble  ocean_coef,rho_ocean,ocean_lin_drag_coef,ocean_quad_drag_coef;
++	IssmDouble  vx,vy,oceanvx,oceanvy,vnorm,ocean_turning_angle;
+ 	IssmDouble  C[3][3];
+ 	IssmDouble* xyz_list = NULL;
+ 
+@@ -89,8 +91,16 @@
+ 	/*Retrieve all inputs and parameters*/
+ 	element->GetVerticesCoordinates(&xyz_list);
+ 	element->FindParam(&dt,TimesteppingTimeStepEnum);
+-	IssmDouble rho_i               = element->GetMaterialParameter(MaterialsRhoIceEnum);
+-	Input*     thickness_input     = element->GetInput(SeaiceThicknessEnum);     _assert_(thickness_input);
++	element->FindParam(&ocean_coef,BasalforcingsOceanCoefEnum);
++	element->FindParam(&ocean_lin_drag_coef,BasalforcingsOceanLinDragCoefEnum);
++	element->FindParam(&ocean_quad_drag_coef,BasalforcingsOceanQuadDragCoefEnum);
++	element->FindParam(&ocean_turning_angle,BasalforcingsOceanTurningAngleEnum);
++	IssmDouble rho_i           = element->GetMaterialParameter(MaterialsRhoIceEnum);
++	Input*     thickness_input = element->GetInput(SeaiceThicknessEnum);       _assert_(thickness_input);
++	Input*     vx_input        = element->GetInput(VxEnum);                    _assert_(vx_input);
++	Input*     vy_input        = element->GetInput(VyEnum);                    _assert_(vy_input);
++	Input*     oceanvx_input   = element->GetInput(BasalforcingsOceanVxEnum);  _assert_(oceanvx_input);
++	Input*     oceanvy_input   = element->GetInput(BasalforcingsOceanVyEnum);  _assert_(oceanvy_input);
+ 
+ 	/* Start  looping on the number of gaussian points: */
+ 	Gauss* gauss=element->NewGauss(2);
+@@ -124,7 +134,17 @@
+ 					B,3,numdof,0,
+ 					&Ke->values[0],1);
+ 
+-		/*Create Coriolis part*/
++		/*Create Ocean forcing part*/
++		oceanvx_input->GetInputValue(&oceanvx,gauss);
++		oceanvy_input->GetInputValue(&oceanvy,gauss);
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		vnorm = sqrt(pow(oceanvx-vx,2) + pow(oceanvy-vy,2));
++		D_scalar = dt*concentration*ocean_coef*rho_ocean*(ocean_lin_drag_coef+ocean_quad_drag_coef*vnorm)*cos(ocean_turning_angle)*gauss->weight*Jdet;
++		TripleMultiply(M,1,numdof,1,
++					&D_scalar,1,1,0,
++					M,1,numdof,0,
++					&Ke->values[0],1);
+ 	}
+ 
+ 	/*Clean up and return*/
+@@ -170,7 +190,6 @@
+ 	element->FindParam(&ocean_coef,BasalforcingsOceanCoefEnum);
+ 	element->FindParam(&ocean_lin_drag_coef,BasalforcingsOceanLinDragCoefEnum);
+ 	element->FindParam(&ocean_quad_drag_coef,BasalforcingsOceanQuadDragCoefEnum);
+-	element->FindParam(&ocean_quad_drag_coef,BasalforcingsOceanQuadDragCoefEnum);
+ 	element->FindParam(&ocean_turning_angle,BasalforcingsOceanTurningAngleEnum);
+ 	rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum);
+ 	gravity = element->GetMaterialParameter(ConstantsGEnum);
+@@ -225,7 +244,7 @@
+ 
+ 		/*Ocean forcing*/
+ 		vnorm = sqrt(pow(oceanvx-vx,2) + pow(oceanvy-vy,2));
+-		constant_part = concentration*air_coef*rho_air*(air_lin_drag_coef+air_quad_drag_coef*vnorm);
++		constant_part = concentration*ocean_coef*rho_ocean*(ocean_lin_drag_coef+ocean_quad_drag_coef*vnorm);
+ 		for(int i=0;i<numnodes;i++){
+ 			pe->values[i*2+0] += dt*constant_part*(oceanvy-vy)*sin(ocean_turning_angle)*Jdet*gauss->weight*basis[i];
+ 			pe->values[i*2+1] += dt*constant_part*(vx-oceanvx)*sin(ocean_turning_angle)*Jdet*gauss->weight*basis[i];
Index: /issm/oecreview/Archive/18296-19100/ISSM-18501-18502.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18501-18502.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18501-18502.diff	(revision 19102)
@@ -0,0 +1,204 @@
+Index: ../trunk-jpl/src/c/analyses/SeaiceAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SeaiceAnalysis.h	(revision 18501)
++++ ../trunk-jpl/src/c/analyses/SeaiceAnalysis.h	(revision 18502)
+@@ -31,6 +31,7 @@
+ 		void UpdateConstraints(FemModel* femmodel);
+ 
+ 		/*Sea ice specifics*/
++		void UpdateDamageAndStress(FemModel* femmodel);
+ 		void CreateCTensor(IssmDouble* C,Element* element,Gauss* gauss);
+ 		void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+ 		void GetM(IssmDouble* M,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+Index: ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18501)
++++ ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18502)
+@@ -320,8 +320,49 @@
+ 	xDelete<int>(doflist);
+ }/*}}}*/
+ void SeaiceAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+-	/*Default, do nothing*/
+-	return;
++
++	/*Intermediaries*/
++	Vector<IssmDouble>* mask        = NULL;
++	IssmDouble*         serial_mask = NULL;
++
++	/*Step 1: update mask of active nodes*/
++	mask=new Vector<IssmDouble>(femmodel->nodes->NumberOfNodes(SeaiceAnalysisEnum));
++	for (int i=0;i<femmodel->elements->Size();i++){
++		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++
++		/*Get current concentration of element and decide whether it is an active element*/
++		int    numnodes            = element->GetNumberOfNodes();
++		Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input);
++		if(concentration_input->Max()>0.){
++			for(int in=0;in<numnodes;in++) mask->SetValue(element->nodes[in]->Sid(),1.,INS_VAL);
++		}
++	}
++
++	/*Assemble and serialize*/
++	mask->Assemble();
++	serial_mask=mask->ToMPISerial();
++	delete mask;
++
++	/*Update node activation accordingly*/
++	int counter =0;
++	for(int i=0;i<femmodel->nodes->Size();i++){
++		Node* node=dynamic_cast<Node*>(femmodel->nodes->GetObjectByOffset(i));
++		if(node->InAnalysis(SeaiceAnalysisEnum)){
++			if(serial_mask[node->Sid()]==1.){
++				node->Activate();
++				counter++;
++			}
++			else{
++				node->Deactivate();
++			}
++		}
++	}
++	xDelete<IssmDouble>(serial_mask);
++
++	/*Display number of active nodes*/
++	int sum_counter;
++	ISSM_MPI_Reduce(&counter,&sum_counter,1,ISSM_MPI_INT,ISSM_MPI_SUM,0,IssmComm::GetComm() );
++	if(VerboseSolution()) _printf0_("   Number of active nodes: "<< sum_counter <<"\n");
+ }/*}}}*/
+ 
+ /*Intermediary functions*/
+@@ -421,3 +462,122 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(basis);
+ }/*}}}*/
++void SeaiceAnalysis::UpdateDamageAndStress(FemModel* femmodel){/*{{{*/
++	/* The damage variable is updated as a function of the actual elastic deformation
++	 * In both cases, a Coulombic enveloppe is used, define by the cohesion C, tan(phi) and tract_coef.
++	 * In both cases, a maximal compressive strength is fixed at compr_max
++	 * The enveloppe is defined in N/m^2.
++	 * The coeficients of the internal stress are then multiplied by the ice thickness to be used in the vertical integrated momentiom equation.
++	 */
++
++	/* Mohr-Coulomb criterion calculation
++	 * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
++	 *                                                                   
++	 *                            sigma_s                                
++	 *        Mohr.Coulomb branch     |                                  
++	 *                     \          |                                  
++	 *                      * |       |                                  
++	 *                        *       |   cohesion (C=cfix+calea)        
++	 *                        | *     |  /                               
++	 *                        |   *   | /    tract                       
++	 *                        |     * |/    /                            
++	 *             -comp_max  |       *    /                             
++	 *                      \ |       | * /                              
++	 *                       \|      0| | *                              
++	 *             -------------------------*------------ sigma_n        
++	 *                        |       | | *                              
++	 *                        |       | *                                
++	 *                        |       *                                  
++	 *                        |     * |                                  
++	 *                        |   *   |                                  
++	 *                        | *     |                                  
++	 *                        *       |                                  
++	 *                      * |       |                                  
++	 *                    *           |                                  
++	 *                                |                                  
++	 *                                |                                  
++	 *                                                                   
++	 * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
++	 */
++
++	/*Intermediaties*/
++	IssmDouble sigma_xx,sigma_yy,sigma_xy,sigma_s,sigma_n,sigma_target;
++	IssmDouble compression_coef,traction_coef,cohesion,tan_phi;
++	IssmDouble traction,compression_max;
++	IssmDouble damage_test,damage_new,damage,tmp;
++
++	/*Loop over the elements of this partition and update accordingly*/
++	for(int i=0;i<femmodel->elements->Size();i++){
++		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++
++		/*Get Mohr-Coulomb parameters*/
++		compression_coef = element->GetMaterialParameter(MaterialsCompressionCoefEnum);
++		traction_coef    = element->GetMaterialParameter(MaterialsTractionCoefEnum);
++		cohesion         = element->GetMaterialParameter(MaterialsCohesionEnum); //C
++		tan_phi          = element->GetMaterialParameter(MaterialsInternalFrictionCoefEnum); //mu = tan(phi)
++
++		/*Get current stress state*/
++		Input*   sigma_xx_input = element->GetInput(StressTensorxxEnum);
++		Input*   sigma_yy_input = element->GetInput(StressTensoryyEnum);
++		Input*   sigma_xy_input = element->GetInput(StressTensorxyEnum);
++		if(sigma_xx_input) sigma_xx_input->GetInputAverage(&sigma_xx);
++		else               sigma_xx = 0.;
++		if(sigma_yy_input) sigma_yy_input->GetInputAverage(&sigma_yy);
++		else               sigma_yy = 0.;
++		if(sigma_xy_input) sigma_xy_input->GetInputAverage(&sigma_xy);
++		else               sigma_xy = 0.;
++
++		/* Compute the invariants of the elastic deformation and instantaneous deformation rate */
++		sigma_s=sqrt(pow((sigma_xx-sigma_yy)/2.,2)+pow(sigma_xy,2));
++		sigma_n=(sigma_xx+sigma_yy)/2.;
++
++		/* same maximal tensile strength */
++		traction=traction_coef*cohesion/tan_phi;
++		compression_max=compression_coef*cohesion;
++
++		/* estimate the internal constraints using the current elastic deformation */
++		Input* damage_input    = element->GetInput(MaterialsDamageEnum); _assert_(damage_input);
++		Input* damagenew_input = element->GetInput(MaterialsDamageEnum); _assert_(damagenew_input);//FIXME
++		damage_input->GetInputAverage(&damage);
++		damagenew_input->GetInputAverage(&damage_new);
++		damage_test = damage;
++		if(sigma_n>traction || sigma_n<-compression_max){
++			if(sigma_n>traction){
++				sigma_target=traction;
++			}
++			else{
++				sigma_target=-compression_max;
++			}
++
++			tmp=1.-sigma_target/sigma_n*(1.-damage);
++			if(tmp<1. && tmp>damage_new){
++				damage_test=((damage_test>tmp)?(damage_test):(tmp)); /* max(damage_test,tmp); */
++			}
++		}
++		if(sigma_s>cohesion-sigma_n*tan_phi){
++			tmp=1.0-cohesion/(sigma_s+sigma_n*tan_phi)*(1-damage);
++			if(tmp<1. && tmp>damage_new){
++				damage_test=((damage_test>tmp)?(damage_test):(tmp)); /*max(damage_test,tmp); */
++			}
++		}
++
++		/* The damage variable is changed */
++		damage_new=damage_test;
++		element->AddInput(MaterialsDamageEnum,&damage_test,P0Enum);//FIXME
++
++		/* Recompute the internal stress*/
++		if(damage<1.){
++			sigma_xx = (1.-damage_new)/(1.-damage)*sigma_xx;
++			sigma_yy = (1.-damage_new)/(1.-damage)*sigma_yy;
++			sigma_xy = (1.-damage_new)/(1.-damage)*sigma_xy;
++		}
++		else{
++			sigma_xx = 0.;
++			sigma_yy = 0.;
++			sigma_xy = 0.;
++		}
++		element->AddInput(StressTensorxxEnum,&sigma_xx,P0Enum);
++		element->AddInput(StressTensoryyEnum,&sigma_yy,P0Enum);
++		element->AddInput(StressTensorxyEnum,&sigma_xy,P0Enum);
++	}
++}/*}}}*/
+Index: ../trunk-jpl/src/c/cores/seaice_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/seaice_core.cpp	(revision 18501)
++++ ../trunk-jpl/src/c/cores/seaice_core.cpp	(revision 18502)
+@@ -17,7 +17,7 @@
+ 	/*recover parameters: */
+ 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+ 
+-	if(VerboseSolution()) _printf0_("call computational core:\n");
++	/*Launch solution sequence for the only analysis we are interested in*/
+ 	femmodel->SetCurrentConfiguration(SeaiceAnalysisEnum);
+ 	solutionsequence_linear(femmodel);
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18502-18503.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18502-18503.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18502-18503.diff	(revision 19102)
@@ -0,0 +1,607 @@
+Index: ../trunk-jpl/src/m/classes/seaice.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/seaice.m	(revision 18502)
++++ ../trunk-jpl/src/m/classes/seaice.m	(revision 18503)
+@@ -5,16 +5,18 @@
+ 
+ classdef seaice
+ 	properties (SetAccess=public) 
+-		thickness       = NaN;
+-		concentration   = NaN;
+-		spcvx           = NaN;
+-		spcvy           = NaN;
+-		coriolis_factor = NaN;
++		min_concentration = 0.;
++		min_thickness     = 0.;
++		max_thickness     = 0.;
++		spcvx             = NaN;
++		spcvy             = NaN;
++		coriolis_factor   = NaN;
+ 	end
+ 	methods
+ 		function obj = seaice(varargin) % {{{
+ 			switch nargin
+ 				case 0
++					obj=setdefaultparameters(obj);
+ 					return;
+ 				otherwise
+ 					error('constructor not supported');
+@@ -22,23 +24,38 @@
+ 		end % }}}
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+ 			if solution~=SeaiceSolutionEnum(), return; end
+-			md = checkfield(md,'fieldname','seaice.thickness','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
+-			md = checkfield(md,'fieldname','seaice.concentration','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
++			md = checkfield(md,'fieldname','seaice.min_concentration','NaN',1,'>=',0,'numel',1);
++			md = checkfield(md,'fieldname','seaice.min_thickness','NaN',1,'>=',0,'numel',1);
++			md = checkfield(md,'fieldname','seaice.max_thickness','NaN',1,'>',0,'numel',1);
+ 			md = checkfield(md,'fieldname','seaice.spcvx','size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','seaice.spcvy','size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','seaice.coriolis_factor','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
+ 		end % }}}
++		function obj = setdefaultparameters(obj) % {{{
++
++			%Minimum ice concentration allowed in the simulation
++			obj.min_concentration=0.;
++
++			%Minimum ice thickness allowed in the simulation
++			obj.min_thickness=0.;
++
++			%Maxmimum ice thickness allowed in the simulation
++			obj.max_thickness=25.;
++
++		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   seaice parameters:'));
+-			fielddisplay(obj,'thickness','sea ice thickness [m]');
+-			fielddisplay(obj,'concentration','sea ice concentration (between 0 and 1)');
++			fielddisplay(obj,'min_concentration','minimum ice concentration allowed in the simulation [no unit]');
++			fielddisplay(obj,'min_thickness','minimum ice thickness allowed in the simulation [m]');
++			fielddisplay(obj,'max_thickness','maximum ice thickness allowed in the simulation [m]');
+ 			fielddisplay(obj,'spcvx','x-axis velocity constraint (NaN means no constraint) [m/s]');
+ 			fielddisplay(obj,'spcvy','y-axis velocity constraint (NaN means no constraint) [m/s]');
+ 			fielddisplay(obj,'coriolis_factor','factor applied to Coriolis forces (latitude dependent)');
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'object',obj,'fieldname','thickness','format','DoubleMat','mattype',2);
+-			WriteData(fid,'object',obj,'fieldname','concentration','format','DoubleMat','mattype',2);
++			WriteData(fid,'object',obj,'fieldname','min_concentration','format','Double');
++			WriteData(fid,'object',obj,'fieldname','min_thickness','format','Double');
++			WriteData(fid,'object',obj,'fieldname','max_thickness','format','Double');
+ 			WriteData(fid,'object',obj,'fieldname','spcvx','format','DoubleMat','mattype',1);
+ 			WriteData(fid,'object',obj,'fieldname','spcvy','format','DoubleMat','mattype',1);
+ 			WriteData(fid,'object',obj,'fieldname','coriolis_factor','format','DoubleMat','mattype',2);
+Index: ../trunk-jpl/src/m/classes/matseaice.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/matseaice.m	(revision 18502)
++++ ../trunk-jpl/src/m/classes/matseaice.m	(revision 18503)
+@@ -8,12 +8,13 @@
+ 		rho_ice                = 0.;
+ 		poisson                = 0.;
+ 		young_modulus          = 0.;
+-		damage                 = NaN;
+ 		ridging_exponent       = 0.;
+ 		cohesion               = 0.;
+ 		internal_friction_coef = 0.;
+ 		compression_coef       = 0.;
+ 		traction_coef          = 0.;
++		time_relaxation_stress  = 0.;
++		time_relaxation_damage  = 0.;
+ 	end
+ 	methods
+ 		function obj = matseaice(varargin) % {{{
+@@ -60,42 +61,51 @@
+ 			%traction_coef (Bouillon and Rampal 2014)
+ 			obj.traction_coef=5./6.;
+ 
++			%Time relaxation stress
++			%1e20 for the elastic case (perfect memory of the stress), equal to the timestep for the viscous case (no memory of the stress)
++			obj.time_relaxation_stress=1.e+20;
++
++			%Time relaxation damage
++			%1e20 for the brittle case (perfect memory of the damage), equal to the timestep for the plastic case (no memory of the damage)
++			obj.time_relaxation_damage=1.e+20;
++
+ 		end % }}}
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+ 			md = checkfield(md,'fieldname','materials.rho_ice','NaN',1,'>',0,'numel',1);
+ 			md = checkfield(md,'fieldname','materials.poisson','NaN',1,'>',0,'<',.5,'numel',1);
+ 			md = checkfield(md,'fieldname','materials.young_modulus','NaN',1,'>',0,'numel',1);
+-			md = checkfield(md,'fieldname','materials.damage','NaN',1,'>=',0,'<',1,'size',[md.mesh.numberofelements 1]);
+ 			md = checkfield(md,'fieldname','materials.ridging_exponent','NaN',1,'<',0,'numel',1);
+ 			md = checkfield(md,'fieldname','materials.cohesion','NaN',1,'>',0,'numel',1);
+ 			md = checkfield(md,'fieldname','materials.internal_friction_coef','NaN',1,'>',0,'numel',1);
+ 			md = checkfield(md,'fieldname','materials.compression_coef','NaN',1,'>',1,'numel',1);
+ 			md = checkfield(md,'fieldname','materials.traction_coef','NaN',1,'>',0,'<',1,'numel',1);
++			md = checkfield(md,'fieldname','materials.time_relaxation_stress','NaN',1,'>',md.timestepping.time_step,'numel',1);
+ 		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   Sea Ice Material:'));
+-
+ 			fielddisplay(obj,'rho_ice','ice density [kg/m^3]');
+ 			fielddisplay(obj,'poisson','poisson ratio for undamaged ice [no unit]');
+ 			fielddisplay(obj,'young_modulus','Young modulus for undamaged ice [Pa]');
+-			fielddisplay(obj,'damage','damage, between 0 (no damage) and 1 (fully damaged)');
+ 			fielddisplay(obj,'ridging_exponent','Riging exponent (c, Hibler parameter) [no unit]');
+ 			fielddisplay(obj,'cohesion','cohesion (C) [Pa]');
+ 			fielddisplay(obj,'internal_friction_coef','Mohr-Coulomb internal friction coefficient (mu=tan(phi)) [no unit]');
+ 			fielddisplay(obj,'compression_coef','Ratio between cutoff compressive strength and the cohesion [no unit]');
+ 			fielddisplay(obj,'traction_coef','Ratio between cutoff tensile strength and Mohr-Coulomb tensile strength [no unit]');
++			fielddisplay(obj,'time_relaxation_stress','Relaxation time for stress (1e+20: elastic, dt: viscous) [s]');
++			fielddisplay(obj,'time_relaxation_damage','Relaxation time for damage (1e+20: brittle, dt: plastic) [s]');
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+ 			WriteData(fid,'enum',MaterialsEnum(),'data',MatseaiceEnum(),'format','Integer');
+ 			WriteData(fid,'object',obj,'class','materials','fieldname','rho_ice','format','Double');
+ 			WriteData(fid,'object',obj,'class','materials','fieldname','poisson','format','Double');
+ 			WriteData(fid,'object',obj,'class','materials','fieldname','young_modulus','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','damage','format','DoubleMat','mattype',2);
+ 			WriteData(fid,'object',obj,'class','materials','fieldname','ridging_exponent','format','Double');
+ 			WriteData(fid,'object',obj,'class','materials','fieldname','cohesion','format','Double');
+ 			WriteData(fid,'object',obj,'class','materials','fieldname','internal_friction_coef','format','Double');
+ 			WriteData(fid,'object',obj,'class','materials','fieldname','compression_coef','format','Double');
+ 			WriteData(fid,'object',obj,'class','materials','fieldname','traction_coef','format','Double');
++			WriteData(fid,'object',obj,'class','materials','fieldname','time_relaxation_stress','format','Double');
++			WriteData(fid,'object',obj,'class','materials','fieldname','time_relaxation_damage','format','Double');
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/seaiceinitialization.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/seaiceinitialization.m	(revision 18502)
++++ ../trunk-jpl/src/m/classes/seaiceinitialization.m	(revision 18503)
+@@ -5,10 +5,18 @@
+ 
+ classdef seaiceinitialization
+ 	properties (SetAccess=public) 
+-		vx          = NaN;
+-		vy          = NaN;
+-		vx_coriolis = NaN;
+-		vy_coriolis = NaN;
++		thickness          = NaN;
++		concentration      = NaN;
++		vx                 = NaN;
++		vy                 = NaN;
++		vx_coriolis        = NaN;
++		vy_coriolis        = NaN;
++		sigma_predictor_xx = NaN;
++		sigma_predictor_yy = NaN;
++		sigma_predictor_xy = NaN;
++		damage             = NaN;
++		mesh_x             = NaN;
++		mesh_y             = NaN;
+ 	end
+ 	methods
+ 		function obj = seaiceinitialization(varargin) % {{{
+@@ -20,23 +28,47 @@
+ 			end
+ 		end % }}}
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
++			md = checkfield(md,'fieldname','initialization.thickness','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
++			md = checkfield(md,'fieldname','initialization.concentration','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
+ 			md = checkfield(md,'fieldname','initialization.vx','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','initialization.vy','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','initialization.vx_coriolis','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','initialization.vy_coriolis','NaN',1,'size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','initialization.sigma_predictor_xx','NaN',1,'>=',0,'<',1,'size',[md.mesh.numberofelements 1]);
++			md = checkfield(md,'fieldname','initialization.sigma_predictor_yy','NaN',1,'>=',0,'<',1,'size',[md.mesh.numberofelements 1]);
++			md = checkfield(md,'fieldname','initialization.sigma_predictor_xy','NaN',1,'>=',0,'<',1,'size',[md.mesh.numberofelements 1]);
++			md = checkfield(md,'fieldname','initialization.damage','NaN',1,'>=',0,'<',1,'size',[md.mesh.numberofelements 1]);
++			md = checkfield(md,'fieldname','initialization.mesh_x','NaN',1,'size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','initialization.mesh_y','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   initial field values:'));
++			fielddisplay(obj,'thickness','sea ice thickness [m]');
++			fielddisplay(obj,'concentration','sea ice concentration (between 0 and 1)');
+ 			fielddisplay(obj,'vx','x component of the ice velocity [m/s]');
+ 			fielddisplay(obj,'vy','y component of the ice velocity [m/s]');
+ 			fielddisplay(obj,'vx_coriolis','x component of the ice velocity used to calculate coriolis forces [m/s]');
+ 			fielddisplay(obj,'vy_coriolis','y component of the ice velocity used to calculate coriolis forces [m/s]');
++			fielddisplay(obj,'sigma_predictor_xx','Predictor for the xx component of the Cauchy stress tensor [Pa]');
++			fielddisplay(obj,'sigma_predictor_yy','Predictor for the yy component of the Cauchy stress tensor [Pa]');
++			fielddisplay(obj,'sigma_predictor_xy','Predictor for the xy component of the Cauchy stress tensor [Pa]');
++			fielddisplay(obj,'damage','damage, between 0 (no damage) and 1 (fully damaged)');
++			fielddisplay(obj,'mesh_x','x position of each vertex of the mesh using a Lagrangian approach');
++			fielddisplay(obj,'mesh_y','y position of each vertex of the mesh using a Lagrangian approach');
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
++			WriteData(fid,'data',obj.thickness,'format','DoubleMat','mattype',2,'enum',SeaiceThicknessEnum());
++			WriteData(fid,'data',obj.concentration,'format','DoubleMat','mattype',2,'enum',SeaiceConcentrationEnum());
+ 			WriteData(fid,'data',obj.vx,'format','DoubleMat','mattype',1,'enum',VxEnum);
+ 			WriteData(fid,'data',obj.vy,'format','DoubleMat','mattype',1,'enum',VyEnum);
+-			WriteData(fid,'data',obj.vx_coriolis,'format','DoubleMat','mattype',1,'enum',VxStarEnum);
+-			WriteData(fid,'data',obj.vy_coriolis,'format','DoubleMat','mattype',1,'enum',VyStarEnum);
++			WriteData(fid,'data',obj.vx_coriolis,'format','DoubleMat','mattype',1,'enum',VxStarEnum());
++			WriteData(fid,'data',obj.vy_coriolis,'format','DoubleMat','mattype',1,'enum',VyStarEnum());
++			WriteData(fid,'data',obj.sigma_predictor_xx,'format','DoubleMat','mattype',2,'enum',StressTensorPredictorxxEnum());
++			WriteData(fid,'data',obj.sigma_predictor_yy,'format','DoubleMat','mattype',2,'enum',StressTensorPredictoryyEnum());
++			WriteData(fid,'data',obj.sigma_predictor_xy,'format','DoubleMat','mattype',2,'enum',StressTensorPredictorxyEnum());
++			WriteData(fid,'data',obj.damage,'format','DoubleMat','mattype',2,'enum',DamageEnum());
++			WriteData(fid,'data',obj.mesh_x,'format','DoubleMat','mattype',1,'enum',MeshXEnum());
++			WriteData(fid,'data',obj.mesh_y,'format','DoubleMat','mattype',1,'enum',MeshYEnum());
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/timestepping.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/timestepping.m	(revision 18502)
++++ ../trunk-jpl/src/m/classes/timestepping.m	(revision 18503)
+@@ -11,6 +11,7 @@
+ 		time_adapt      = 0;
+ 		cfl_coefficient = 0.;
+ 		interp_forcings = 1;
++		in_years        = 0;
+ 	end
+ 	methods
+        function createxml(obj,fid) % {{{
+@@ -49,6 +50,9 @@
+ 
+ 			%should we interpolate forcings between timesteps?
+ 			obj.interp_forcings=1;
++
++			%In years by default
++			obj.in_years = 1;
+ 		end % }}}
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+ 
+@@ -65,21 +69,30 @@
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   timestepping parameters:'));
+ 
+-			fielddisplay(obj,'start_time','simulation starting time [yr]');
+-			fielddisplay(obj,'final_time','final time to stop the simulation [yr]');
+-			fielddisplay(obj,'time_step','length of time steps [yr]');
++			if(obj.in_years)
++				unit = 'yr';
++			else
++				unit = 's';
++			end
++			fielddisplay(obj,'start_time',['simulation starting time [' unit ']']);
++			fielddisplay(obj,'final_time',['final time to stop the simulation [' unit ']']);
++			fielddisplay(obj,'time_step',['length of time steps [' unit ']']);
+ 			fielddisplay(obj,'time_adapt','use cfl condition to define time step ? (0 or 1) ');
+ 			fielddisplay(obj,'cfl_coefficient','coefficient applied to cfl condition');
+ 			fielddisplay(obj,'interp_forcings','interpolate in time between requested forcing values ? (0 or 1)');
++			fielddisplay(obj,'in_years','time unit, 1: years, 0: seconds');
+ 
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+ 
+-			yts=365.0*24.0*3600.0;
+-
+-			WriteData(fid,'object',obj,'fieldname','start_time','format','Double','scale',yts);
+-			WriteData(fid,'object',obj,'fieldname','final_time','format','Double','scale',yts);
+-			WriteData(fid,'object',obj,'fieldname','time_step','format','Double','scale',yts);
++			if obj.in_years,
++				scale = 365.0*24.0*3600.0;
++			else
++				scale = 1.;
++			end
++			WriteData(fid,'object',obj,'fieldname','start_time','format','Double','scale',scale);
++			WriteData(fid,'object',obj,'fieldname','final_time','format','Double','scale',scale);
++			WriteData(fid,'object',obj,'fieldname','time_step','format','Double','scale',scale);
+ 			WriteData(fid,'object',obj,'fieldname','time_adapt','format','Boolean');
+ 			WriteData(fid,'object',obj,'fieldname','cfl_coefficient','format','Double');
+ 			WriteData(fid,'object',obj,'fieldname','interp_forcings','format','Boolean');
+Index: ../trunk-jpl/src/m/classes/constants.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/constants.m	(revision 18502)
++++ ../trunk-jpl/src/m/classes/constants.m	(revision 18503)
+@@ -5,9 +5,10 @@
+ 
+ classdef constants
+ 	properties (SetAccess=public) 
+-		g                    = 0;
+-		yts                  = 0;
+-		referencetemperature = 0;
++		g                    = 0.;
++		omega                = 0.;
++		yts                  = 0.;
++		referencetemperature = 0.;
+ 	end
+ 	methods
+         function createxml(obj,fid) % {{{
+@@ -30,6 +31,9 @@
+ 			%acceleration due to gravity (m/s^2)
+ 			obj.g=9.81;
+ 
++			%Earth's rotation speed 
++			obj.omega = 7.292*1e-5;
++
+ 			%converstion from year to seconds
+ 			obj.yts=365*24*3600;
+ 
+@@ -39,7 +43,8 @@
+ 		end % }}}
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+ 
+-%			md = checkfield(md,'fieldname','constants.g','>',0,'size',[1 1]);
++			md = checkfield(md,'fieldname','constants.g','>=',0,'size',[1 1]); %We allow 0 for validation tests
++			md = checkfield(md,'fieldname','constants.omega','>=',0,'size',[1 1]);
+ 			md = checkfield(md,'fieldname','constants.yts','>',0,'size',[1 1]);
+ 			md = checkfield(md,'fieldname','constants.referencetemperature','size',[1 1]);
+ 
+@@ -48,12 +53,14 @@
+ 			disp(sprintf('   constants parameters:'));
+ 
+ 			fielddisplay(obj,'g','gravitational acceleration [m/s^2]');
++			fielddisplay(obj,'omega','angular velocity of Earth [rad/s]');
+ 			fielddisplay(obj,'yts','number of seconds in a year [s/yr]');
+ 			fielddisplay(obj,'referencetemperature','reference temperature used in the enthalpy model [K]');
+ 
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+ 			WriteData(fid,'object',obj,'fieldname','g','format','Double');
++			WriteData(fid,'object',obj,'fieldname','omega','format','Double');
+ 			WriteData(fid,'object',obj,'fieldname','yts','format','Double');
+ 			WriteData(fid,'object',obj,'fieldname','referencetemperature','format','Double');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/seaiceocean.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/seaiceocean.m	(revision 18502)
++++ ../trunk-jpl/src/m/classes/seaiceocean.m	(revision 18503)
+@@ -36,7 +36,7 @@
+ 			obj.ocean_quad_drag_coef = 0.004;
+ 
+ 			%Turning angle in degrees (McPhee 1998)
+-			obj.ocean_turning_angle = 25.;
++			obj.ocean_turning_angle = deg2rad(25.);
+ 
+ 		end % }}}
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+@@ -56,7 +56,7 @@
+ 			fielddisplay(obj,'ocean_coef','ocean stress spin up coefficient (between 0 and 1)');
+ 			fielddisplay(obj,'ocean_lin_drag_coef','ocean linear drag coefficient [Pa/(m/s)]');
+ 			fielddisplay(obj,'ocean_quad_drag_coef','ocean quadratic drag coefficient [Pa/(m/s)^2]');
+-			fielddisplay(obj,'ocean_turning_angle','ocean turning angle [degree]');
++			fielddisplay(obj,'ocean_turning_angle','ocean turning angle [rad]');
+ 			fielddisplay(obj,'ocean_ssh','ocean sea surface height [m]');
+ 			fielddisplay(obj,'ocean_vx','ocean speed x-component [m/s]');
+ 			fielddisplay(obj,'ocean_vy','ocean speed y-component [m/s]');
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 18502)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 18503)
+@@ -136,10 +136,16 @@
+ 				case 1
+ 					if strcmpi(varargin{1},'seaice'),
+ 						md=setdefaultparameters(md);
+-						md.materials = matseaice();
++
++						%Specific subject for sea ice model
++						md.materials       = matseaice();
+ 						md.surfaceforcings = seaiceatm();
+ 						md.basalforcings   = seaiceocean();
+ 						md.initialization  = seaiceinitialization();
++
++						%Change some of the defauls
++						md.timestepping.in_years = false;
++						md.constants.g           = 9.80616; %Same as TOPAZ
+ 					else
+ 						error('model constructor not supported yet');
+ 					end
+Index: ../trunk-jpl/src/m/enum/MaterialsDamageEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsDamageEnum.m	(revision 18502)
++++ ../trunk-jpl/src/m/enum/MaterialsDamageEnum.m	(revision 18503)
+@@ -1,11 +0,0 @@
+-function macro=MaterialsDamageEnum()
+-%MATERIALSDAMAGEENUM - Enum of MaterialsDamage
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=MaterialsDamageEnum()
+-
+-macro=StringToEnum('MaterialsDamage');
+Index: ../trunk-jpl/src/m/enum/StressTensorPredictorxxEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressTensorPredictorxxEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/StressTensorPredictorxxEnum.m	(revision 18503)
+@@ -0,0 +1,11 @@
++function macro=StressTensorPredictorxxEnum()
++%STRESSTENSORPREDICTORXXENUM - Enum of StressTensorPredictorxx
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=StressTensorPredictorxxEnum()
++
++macro=StringToEnum('StressTensorPredictorxx');
+Index: ../trunk-jpl/src/m/enum/MaterialsTimeRelaxationDamageEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsTimeRelaxationDamageEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MaterialsTimeRelaxationDamageEnum.m	(revision 18503)
+@@ -0,0 +1,11 @@
++function macro=MaterialsTimeRelaxationDamageEnum()
++%MATERIALSTIMERELAXATIONDAMAGEENUM - Enum of MaterialsTimeRelaxationDamage
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MaterialsTimeRelaxationDamageEnum()
++
++macro=StringToEnum('MaterialsTimeRelaxationDamage');
+Index: ../trunk-jpl/src/m/enum/StressTensorPredictorxyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressTensorPredictorxyEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/StressTensorPredictorxyEnum.m	(revision 18503)
+@@ -0,0 +1,11 @@
++function macro=StressTensorPredictorxyEnum()
++%STRESSTENSORPREDICTORXYENUM - Enum of StressTensorPredictorxy
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=StressTensorPredictorxyEnum()
++
++macro=StringToEnum('StressTensorPredictorxy');
+Index: ../trunk-jpl/src/m/enum/SeaiceMaxThicknessEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceMaxThicknessEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SeaiceMaxThicknessEnum.m	(revision 18503)
+@@ -0,0 +1,11 @@
++function macro=SeaiceMaxThicknessEnum()
++%SEAICEMAXTHICKNESSENUM - Enum of SeaiceMaxThickness
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SeaiceMaxThicknessEnum()
++
++macro=StringToEnum('SeaiceMaxThickness');
+Index: ../trunk-jpl/src/m/enum/StressTensorPredictoryyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressTensorPredictoryyEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/StressTensorPredictoryyEnum.m	(revision 18503)
+@@ -0,0 +1,11 @@
++function macro=StressTensorPredictoryyEnum()
++%STRESSTENSORPREDICTORYYENUM - Enum of StressTensorPredictoryy
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=StressTensorPredictoryyEnum()
++
++macro=StringToEnum('StressTensorPredictoryy');
+Index: ../trunk-jpl/src/m/enum/ConstantsOmegaEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/ConstantsOmegaEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/ConstantsOmegaEnum.m	(revision 18503)
+@@ -0,0 +1,11 @@
++function macro=ConstantsOmegaEnum()
++%CONSTANTSOMEGAENUM - Enum of ConstantsOmega
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=ConstantsOmegaEnum()
++
++macro=StringToEnum('ConstantsOmega');
+Index: ../trunk-jpl/src/m/enum/SeaiceMinThicknessEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceMinThicknessEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SeaiceMinThicknessEnum.m	(revision 18503)
+@@ -0,0 +1,11 @@
++function macro=SeaiceMinThicknessEnum()
++%SEAICEMINTHICKNESSENUM - Enum of SeaiceMinThickness
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SeaiceMinThicknessEnum()
++
++macro=StringToEnum('SeaiceMinThickness');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18502)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18503)
+@@ -49,6 +49,7 @@
+ def BedEnum(): return StringToEnum("Bed")[0]
+ def BaseEnum(): return StringToEnum("Base")[0]
+ def ConstantsGEnum(): return StringToEnum("ConstantsG")[0]
++def ConstantsOmegaEnum(): return StringToEnum("ConstantsOmega")[0]
+ def ConstantsReferencetemperatureEnum(): return StringToEnum("ConstantsReferencetemperature")[0]
+ def ConstantsYtsEnum(): return StringToEnum("ConstantsYts")[0]
+ def DependentObjectEnum(): return StringToEnum("DependentObject")[0]
+@@ -197,6 +198,7 @@
+ def DamageEquivStressEnum(): return StringToEnum("DamageEquivStress")[0]
+ def DamageEvolutionNumRequestedOutputsEnum(): return StringToEnum("DamageEvolutionNumRequestedOutputs")[0]
+ def DamageEvolutionRequestedOutputsEnum(): return StringToEnum("DamageEvolutionRequestedOutputs")[0]
++def DamageEnum(): return StringToEnum("Damage")[0]
+ def NewDamageEnum(): return StringToEnum("NewDamage")[0]
+ def MaterialsRhoIceEnum(): return StringToEnum("MaterialsRhoIce")[0]
+ def MaterialsRhoSeawaterEnum(): return StringToEnum("MaterialsRhoSeawater")[0]
+@@ -699,6 +701,9 @@
+ def SeaiceoceanEnum(): return StringToEnum("Seaiceocean")[0]
+ def SeaiceThicknessEnum(): return StringToEnum("SeaiceThickness")[0]
+ def SeaiceConcentrationEnum(): return StringToEnum("SeaiceConcentration")[0]
++def SeaiceMinConcentrationEnum(): return StringToEnum("SeaiceMinConcentration")[0]
++def SeaiceMinThicknessEnum(): return StringToEnum("SeaiceMinThickness")[0]
++def SeaiceMaxThicknessEnum(): return StringToEnum("SeaiceMaxThickness")[0]
+ def SeaiceSpcvxEnum(): return StringToEnum("SeaiceSpcvx")[0]
+ def SeaiceSpcvyEnum(): return StringToEnum("SeaiceSpcvy")[0]
+ def SeaiceCoriolisFactorEnum(): return StringToEnum("SeaiceCoriolisFactor")[0]
+@@ -719,7 +724,8 @@
+ def MatseaiceEnum(): return StringToEnum("Matseaice")[0]
+ def MaterialsPoissonEnum(): return StringToEnum("MaterialsPoisson")[0]
+ def MaterialsYoungModulusEnum(): return StringToEnum("MaterialsYoungModulus")[0]
+-def MaterialsDamageEnum(): return StringToEnum("MaterialsDamage")[0]
++def MaterialsTimeRelaxationStressEnum(): return StringToEnum("MaterialsTimeRelaxationStress")[0]
++def MaterialsTimeRelaxationDamageEnum(): return StringToEnum("MaterialsTimeRelaxationDamage")[0]
+ def MaterialsRidgingExponentEnum(): return StringToEnum("MaterialsRidgingExponent")[0]
+ def MaterialsCohesionEnum(): return StringToEnum("MaterialsCohesion")[0]
+ def MaterialsInternalFrictionCoefEnum(): return StringToEnum("MaterialsInternalFrictionCoef")[0]
+@@ -727,4 +733,7 @@
+ def MaterialsTractionCoefEnum(): return StringToEnum("MaterialsTractionCoef")[0]
+ def VxStarEnum(): return StringToEnum("VxStar")[0]
+ def VyStarEnum(): return StringToEnum("VyStar")[0]
++def StressTensorPredictorxxEnum(): return StringToEnum("StressTensorPredictorxx")[0]
++def StressTensorPredictoryyEnum(): return StringToEnum("StressTensorPredictoryy")[0]
++def StressTensorPredictorxyEnum(): return StringToEnum("StressTensorPredictorxy")[0]
+ def MaximumNumberOfDefinitionsEnum(): return StringToEnum("MaximumNumberOfDefinitions")[0]
+Index: ../trunk-jpl/src/m/enum/SeaiceMinConcentrationEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceMinConcentrationEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SeaiceMinConcentrationEnum.m	(revision 18503)
+@@ -0,0 +1,11 @@
++function macro=SeaiceMinConcentrationEnum()
++%SEAICEMINCONCENTRATIONENUM - Enum of SeaiceMinConcentration
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SeaiceMinConcentrationEnum()
++
++macro=StringToEnum('SeaiceMinConcentration');
+Index: ../trunk-jpl/src/m/enum/MaterialsTimeRelaxationStressEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsTimeRelaxationStressEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MaterialsTimeRelaxationStressEnum.m	(revision 18503)
+@@ -0,0 +1,11 @@
++function macro=MaterialsTimeRelaxationStressEnum()
++%MATERIALSTIMERELAXATIONSTRESSENUM - Enum of MaterialsTimeRelaxationStress
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MaterialsTimeRelaxationStressEnum()
++
++macro=StringToEnum('MaterialsTimeRelaxationStress');
+Index: ../trunk-jpl/src/m/enum/DamageEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/DamageEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/DamageEnum.m	(revision 18503)
+@@ -0,0 +1,11 @@
++function macro=DamageEnum()
++%DAMAGEENUM - Enum of Damage
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=DamageEnum()
++
++macro=StringToEnum('Damage');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18503-18504.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18503-18504.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18503-18504.diff	(revision 19102)
@@ -0,0 +1,620 @@
+Index: ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18503)
++++ ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18504)
+@@ -9,6 +9,9 @@
+ 	return 2;
+ }/*}}}*/
+ void SeaiceAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++	parameters->AddObject(iomodel->CopyConstantObject(SeaiceMinConcentrationEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(SeaiceMinThicknessEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(SeaiceMaxThicknessEnum));
+ }/*}}}*/
+ void SeaiceAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+@@ -33,12 +36,17 @@
+ 	iomodel->FetchDataToInput(elements,BasalforcingsOceanVyEnum);
+ 	iomodel->FetchDataToInput(elements,SurfaceforcingsWindVxEnum);
+ 	iomodel->FetchDataToInput(elements,SurfaceforcingsWindVyEnum);
+-	iomodel->FetchDataToInput(elements,MaterialsDamageEnum);
++	iomodel->FetchDataToInput(elements,DamageEnum);
+ 	iomodel->FetchDataToInput(elements,VxStarEnum);
+ 	iomodel->FetchDataToInput(elements,VyStarEnum);
+ 	iomodel->FetchDataToInput(elements,VxEnum);
+ 	iomodel->FetchDataToInput(elements,VyEnum);
+ 	iomodel->FetchDataToInput(elements,SeaiceCoriolisFactorEnum);
++	iomodel->FetchDataToInput(elements,StressTensorPredictorxxEnum);
++	iomodel->FetchDataToInput(elements,StressTensorPredictoryyEnum);
++	iomodel->FetchDataToInput(elements,StressTensorPredictorxyEnum);
++	iomodel->FetchDataToInput(elements,MeshXEnum);
++	iomodel->FetchDataToInput(elements,MeshYEnum);
+ }/*}}}*/
+ void SeaiceAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 
+@@ -70,7 +78,8 @@
+ 
+ 	/* Check if there is ice in this element */
+ 	Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input);
+-	if(concentration_input->Max()==0.) return NULL;
++	IssmDouble c_min; element->FindParam(&c_min,SeaiceMinConcentrationEnum);
++	if(concentration_input->Max()<=c_min) return NULL;
+ 
+ 	/*Intermediaries */
+ 	IssmDouble  Jdet,D_scalar,dt,thickness,concentration;
+@@ -95,13 +104,18 @@
+ 	element->FindParam(&ocean_lin_drag_coef,BasalforcingsOceanLinDragCoefEnum);
+ 	element->FindParam(&ocean_quad_drag_coef,BasalforcingsOceanQuadDragCoefEnum);
+ 	element->FindParam(&ocean_turning_angle,BasalforcingsOceanTurningAngleEnum);
+-	IssmDouble rho_i           = element->GetMaterialParameter(MaterialsRhoIceEnum);
++	IssmDouble rho_i                  = element->GetMaterialParameter(MaterialsRhoIceEnum);
++	IssmDouble time_relaxation_stress = element->GetMaterialParameter(MaterialsTimeRelaxationStressEnum);
+ 	Input*     thickness_input = element->GetInput(SeaiceThicknessEnum);       _assert_(thickness_input);
+ 	Input*     vx_input        = element->GetInput(VxEnum);                    _assert_(vx_input);
+ 	Input*     vy_input        = element->GetInput(VyEnum);                    _assert_(vy_input);
+ 	Input*     oceanvx_input   = element->GetInput(BasalforcingsOceanVxEnum);  _assert_(oceanvx_input);
+ 	Input*     oceanvy_input   = element->GetInput(BasalforcingsOceanVyEnum);  _assert_(oceanvy_input);
+ 
++	/*Get minimum inertia to avoid 0 in the line, and time_ratio*/
++	IssmDouble minimum_inertia = rho_i*0.01;
++	IssmDouble time_ratio=(1-dt/time_relaxation_stress);
++
+ 	/* Start  looping on the number of gaussian points: */
+ 	Gauss* gauss=element->NewGauss(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+@@ -115,18 +129,18 @@
+ 
+ 		/*Create first part of the stiffness matrix*/
+ 		this->GetM(M,element,xyz_list,gauss);
+-		D_scalar=rho_i*thickness*gauss->weight*Jdet;
++		D_scalar=(rho_i*thickness+minimum_inertia)/dt*gauss->weight*Jdet;
+ 		TripleMultiply(M,1,numdof,1,
+ 					&D_scalar,1,1,0,
+ 					M,1,numdof,0,
+ 					&Ke->values[0],1);
+ 
+-		/*Create Elasitc part*/
++		/*Create Elastic part*/
+ 		this->GetB(B,element,xyz_list,gauss);
+ 		this->CreateCTensor(&C[0][0],element,gauss);
+ 		for(int i=0;i<3;i++){
+ 			for(int j=0;j<3;j++){
+-				C[i][j] = gauss->weight*Jdet*dt*C[i][j];
++				C[i][j] = dt*time_ratio*gauss->weight*Jdet*C[i][j];
+ 			}
+ 		}
+ 		TripleMultiply(B,3,numdof,1,
+@@ -140,7 +154,7 @@
+ 		vx_input->GetInputValue(&vx,gauss);
+ 		vy_input->GetInputValue(&vy,gauss);
+ 		vnorm = sqrt(pow(oceanvx-vx,2) + pow(oceanvy-vy,2));
+-		D_scalar = dt*concentration*ocean_coef*rho_ocean*(ocean_lin_drag_coef+ocean_quad_drag_coef*vnorm)*cos(ocean_turning_angle)*gauss->weight*Jdet;
++		D_scalar = concentration*ocean_coef*rho_ocean*(ocean_lin_drag_coef+ocean_quad_drag_coef*vnorm)*cos(ocean_turning_angle)*gauss->weight*Jdet;
+ 		TripleMultiply(M,1,numdof,1,
+ 					&D_scalar,1,1,0,
+ 					M,1,numdof,0,
+@@ -159,15 +173,17 @@
+ 
+ 	/* Check if there is ice in this element */
+ 	Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input);
+-	if(concentration_input->Max()==0.) return NULL;
++	IssmDouble c_min; element->FindParam(&c_min,SeaiceMinConcentrationEnum);
++	if(concentration_input->Max()<=c_min) return NULL;
+ 
+ 	/*Intermediaries */
+-	IssmDouble  air_coef,ocean_coef,constant_part;
+-	IssmDouble  rho_ice,rho_air,rho_ocean,gravity;
++	IssmDouble  air_coef,ocean_coef,constant_part,time_relaxation_stress;
++	IssmDouble  rho_ice,rho_air,rho_ocean,gravity,omega;
+ 	IssmDouble  vx,vy,vxstar,vystar,windvx,windvy,oceanvx,oceanvy,vnorm;
+ 	IssmDouble  air_lin_drag_coef,air_quad_drag_coef;
+ 	IssmDouble  ocean_lin_drag_coef,ocean_quad_drag_coef;
+-	IssmDouble  concentration,thickness,coriolis_factor,dt,Jdet;
++	IssmDouble  concentration,thickness,coriolis_factor,dt,Jdet,D_scalar;
++	IssmDouble  sigma_xx,sigma_yy,sigma_xy,sigma_vec[3];
+ 	IssmDouble  ocean_turning_angle,dssh[2];
+ 	IssmDouble* xyz_list = NULL;
+ 
+@@ -176,8 +192,10 @@
+ 	int numdof   = 2*numnodes;
+ 
+ 	/*Initialize Element vector and vectors*/
+-	ElementVector* pe    = element->NewElementVector();
+-	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
++	ElementVector* pe      = element->NewElementVector();
++	IssmDouble*    B       = xNew<IssmDouble>(3*numdof);
++	IssmDouble*    basis   = xNew<IssmDouble>(numnodes);
++	IssmDouble     D[3][3] = {0.};
+ 
+ 	/*Retrieve all inputs and parameters*/
+ 	element->GetVerticesCoordinates(&xyz_list);
+@@ -191,8 +209,10 @@
+ 	element->FindParam(&ocean_lin_drag_coef,BasalforcingsOceanLinDragCoefEnum);
+ 	element->FindParam(&ocean_quad_drag_coef,BasalforcingsOceanQuadDragCoefEnum);
+ 	element->FindParam(&ocean_turning_angle,BasalforcingsOceanTurningAngleEnum);
+-	rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum);
+-	gravity = element->GetMaterialParameter(ConstantsGEnum);
++	rho_ice                = element->GetMaterialParameter(MaterialsRhoIceEnum);
++	gravity                = element->GetMaterialParameter(ConstantsGEnum);
++	omega                  = element->GetMaterialParameter(ConstantsOmegaEnum);
++	time_relaxation_stress = element->GetMaterialParameter(MaterialsTimeRelaxationStressEnum);
+ 	Input* thickness_input     = element->GetInput(SeaiceThicknessEnum);       _assert_(thickness_input);
+ 	Input* coriolis_fact_input = element->GetInput(SeaiceCoriolisFactorEnum);  _assert_(coriolis_fact_input);
+ 	Input* vx_input            = element->GetInput(VxEnum);                    _assert_(vx_input);
+@@ -204,7 +224,13 @@
+ 	Input* oceanvx_input       = element->GetInput(BasalforcingsOceanVxEnum);  _assert_(oceanvx_input);
+ 	Input* oceanvy_input       = element->GetInput(BasalforcingsOceanVyEnum);  _assert_(oceanvy_input);
+ 	Input* oceanssh_input      = element->GetInput(BasalforcingsOceanSshEnum); _assert_(oceanssh_input);
++	Input* sigma_xx_input      = element->GetInput(StressTensorxxEnum);        _assert_(sigma_xx_input);
++	Input* sigma_yy_input      = element->GetInput(StressTensoryyEnum);        _assert_(sigma_yy_input);
++	Input* sigma_xy_input      = element->GetInput(StressTensorxyEnum);        _assert_(sigma_xy_input);
+ 
++	/*Calculate time_ratio*/
++	IssmDouble time_ratio=(1-dt/time_relaxation_stress);
++
+ 	/* Start  looping on the number of gaussian points: */
+ 	Gauss* gauss=element->NewGauss(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+@@ -213,6 +239,7 @@
+ 
+ 		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+ 		element->NodalFunctions(basis, gauss);
++		this->GetB(B,element,xyz_list,gauss);
+ 
+ 		/*Get all inputs on gauss point*/
+ 		thickness_input->GetInputValue(&thickness,gauss);
+@@ -226,6 +253,9 @@
+ 		windvy_input->GetInputValue(&windvy,gauss);
+ 		oceanvx_input->GetInputValue(&oceanvx,gauss);
+ 		oceanvy_input->GetInputValue(&oceanvy,gauss);
++		sigma_xx_input->GetInputValue(&sigma_xx,gauss);
++		sigma_yy_input->GetInputValue(&sigma_yy,gauss);
++		sigma_xy_input->GetInputValue(&sigma_xy,gauss);
+ 		oceanssh_input->GetInputDerivativeValue(&dssh[0],xyz_list,gauss);
+ 
+ 		/*Previous speed (finite differencing)*/
+@@ -238,34 +268,45 @@
+ 		vnorm    = sqrt(windvx*windvx + windvy*windvy);
+ 		constant_part = concentration*air_coef*rho_air*(air_lin_drag_coef+air_quad_drag_coef*vnorm);
+ 		for(int i=0;i<numnodes;i++){
+-			pe->values[i*2+0] += dt*constant_part*windvx*Jdet*gauss->weight*basis[i];
+-			pe->values[i*2+1] += dt*constant_part*windvy*Jdet*gauss->weight*basis[i];
++			pe->values[i*2+0] += constant_part*windvx*Jdet*gauss->weight*basis[i];
++			pe->values[i*2+1] += constant_part*windvy*Jdet*gauss->weight*basis[i];
+ 		}
+ 
+ 		/*Ocean forcing*/
+ 		vnorm = sqrt(pow(oceanvx-vx,2) + pow(oceanvy-vy,2));
+ 		constant_part = concentration*ocean_coef*rho_ocean*(ocean_lin_drag_coef+ocean_quad_drag_coef*vnorm);
+ 		for(int i=0;i<numnodes;i++){
+-			pe->values[i*2+0] += dt*constant_part*(oceanvy-vy)*sin(ocean_turning_angle)*Jdet*gauss->weight*basis[i];
+-			pe->values[i*2+1] += dt*constant_part*(vx-oceanvx)*sin(ocean_turning_angle)*Jdet*gauss->weight*basis[i];
++			pe->values[i*2+0] += constant_part*omega*(oceanvy-vy)*sin(ocean_turning_angle)*Jdet*gauss->weight*basis[i];
++			pe->values[i*2+1] += constant_part*omega*(vx-oceanvx)*sin(ocean_turning_angle)*Jdet*gauss->weight*basis[i];
+ 
+-			pe->values[i*2+0] += dt*constant_part*oceanvx*cos(ocean_turning_angle)*Jdet*gauss->weight*basis[i];
+-			pe->values[i*2+1] += dt*constant_part*oceanvy*cos(ocean_turning_angle)*Jdet*gauss->weight*basis[i];
++			pe->values[i*2+0] += constant_part*oceanvx*cos(ocean_turning_angle)*Jdet*gauss->weight*basis[i];
++			pe->values[i*2+1] += constant_part*oceanvy*cos(ocean_turning_angle)*Jdet*gauss->weight*basis[i];
++
++			pe->values[i*2+0] += (-rho_ice*thickness*gravity*omega*dssh[0])*Jdet*gauss->weight*basis[i];
++			pe->values[i*2+1] += (-rho_ice*thickness*gravity*omega*dssh[1])*Jdet*gauss->weight*basis[i];
+ 		}
+ 
+ 		/*Coriolis forces (use ustar)*/
+ 		for(int i=0;i<numnodes;i++){
+-			pe->values[i*2+0] += dt*(-rho_ice*thickness*coriolis_factor*vystar)*Jdet*gauss->weight*basis[i];
+-			pe->values[i*2+1] += dt*(+rho_ice*thickness*coriolis_factor*vxstar)*Jdet*gauss->weight*basis[i];
+-
+-			pe->values[i*2+0] += dt*(-rho_ice*thickness*gravity*dssh[0])*Jdet*gauss->weight*basis[i];
+-			pe->values[i*2+1] += dt*(-rho_ice*thickness*gravity*dssh[1])*Jdet*gauss->weight*basis[i];
++			pe->values[i*2+0] += (-rho_ice*thickness*coriolis_factor*vystar)*Jdet*gauss->weight*basis[i];
++			pe->values[i*2+1] += (+rho_ice*thickness*coriolis_factor*vxstar)*Jdet*gauss->weight*basis[i];
+ 		}
++		
++		/*Add elastic part of previous time step*/
++		sigma_vec[0] = sigma_xx;
++		sigma_vec[1] = sigma_yy;
++		sigma_vec[2] = sigma_xy;
++		D[0][0] = D[1][1] = D[2][2] = time_ratio*thickness*Jdet*gauss->weight;
++		TripleMultiply(B,3,numdof,1,
++					&D[0][0],3,3,0,
++					&sigma_vec[0],3,1,0,
++					&pe->values[0],1);
+ 	}
+ 
+ 	/*Clean up and return*/
+ 	xDelete<IssmDouble>(xyz_list);
+ 	xDelete<IssmDouble>(basis);
++	xDelete<IssmDouble>(B);
+ 	delete gauss;
+ 	return pe;
+ }/*}}}*/
+@@ -322,9 +363,13 @@
+ void SeaiceAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 
+ 	/*Intermediaries*/
++	IssmDouble          c_min;
+ 	Vector<IssmDouble>* mask        = NULL;
+ 	IssmDouble*         serial_mask = NULL;
+ 
++	/*Get minimum concentration allowed*/
++	femmodel->parameters->FindParam(&c_min,SeaiceMinConcentrationEnum);
++
+ 	/*Step 1: update mask of active nodes*/
+ 	mask=new Vector<IssmDouble>(femmodel->nodes->NumberOfNodes(SeaiceAnalysisEnum));
+ 	for (int i=0;i<femmodel->elements->Size();i++){
+@@ -333,7 +378,7 @@
+ 		/*Get current concentration of element and decide whether it is an active element*/
+ 		int    numnodes            = element->GetNumberOfNodes();
+ 		Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input);
+-		if(concentration_input->Max()>0.){
++		if(concentration_input->Max()>c_min){
+ 			for(int in=0;in<numnodes;in++) mask->SetValue(element->nodes[in]->Sid(),1.,INS_VAL);
+ 		}
+ 	}
+@@ -378,7 +423,7 @@
+ 	IssmDouble ridging_exponent = element->GetMaterialParameter(MaterialsRidgingExponentEnum);
+ 
+ 	/*Get damage input at this location*/
+-	Input* damage_input        = element->GetInput(MaterialsDamageEnum);     _assert_(damage_input);
++	Input* damage_input        = element->GetInput(DamageEnum);              _assert_(damage_input);
+ 	Input* thickness_input     = element->GetInput(SeaiceThicknessEnum);     _assert_(thickness_input);
+ 	Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input);
+ 	damage_input->GetInputValue(&damage,gauss);
+@@ -517,15 +562,12 @@
+ 		tan_phi          = element->GetMaterialParameter(MaterialsInternalFrictionCoefEnum); //mu = tan(phi)
+ 
+ 		/*Get current stress state*/
+-		Input*   sigma_xx_input = element->GetInput(StressTensorxxEnum);
+-		Input*   sigma_yy_input = element->GetInput(StressTensoryyEnum);
+-		Input*   sigma_xy_input = element->GetInput(StressTensorxyEnum);
+-		if(sigma_xx_input) sigma_xx_input->GetInputAverage(&sigma_xx);
+-		else               sigma_xx = 0.;
+-		if(sigma_yy_input) sigma_yy_input->GetInputAverage(&sigma_yy);
+-		else               sigma_yy = 0.;
+-		if(sigma_xy_input) sigma_xy_input->GetInputAverage(&sigma_xy);
+-		else               sigma_xy = 0.;
++		Input*   sigma_xx_input = element->GetInput(StressTensorPredictorxxEnum); _assert_(sigma_xx_input);
++		Input*   sigma_yy_input = element->GetInput(StressTensorPredictoryyEnum); _assert_(sigma_yy_input);
++		Input*   sigma_xy_input = element->GetInput(StressTensorPredictorxyEnum); _assert_(sigma_xy_input);
++		sigma_xx_input->GetInputAverage(&sigma_xx);
++		sigma_yy_input->GetInputAverage(&sigma_yy);
++		sigma_xy_input->GetInputAverage(&sigma_xy);
+ 
+ 		/* Compute the invariants of the elastic deformation and instantaneous deformation rate */
+ 		sigma_s=sqrt(pow((sigma_xx-sigma_yy)/2.,2)+pow(sigma_xy,2));
+@@ -536,11 +578,10 @@
+ 		compression_max=compression_coef*cohesion;
+ 
+ 		/* estimate the internal constraints using the current elastic deformation */
+-		Input* damage_input    = element->GetInput(MaterialsDamageEnum); _assert_(damage_input);
+-		Input* damagenew_input = element->GetInput(MaterialsDamageEnum); _assert_(damagenew_input);//FIXME
++		Input* damage_input    = element->GetInput(DamageEnum); _assert_(damage_input);
+ 		damage_input->GetInputAverage(&damage);
+-		damagenew_input->GetInputAverage(&damage_new);
+ 		damage_test = damage;
++		damage_new  = damage;
+ 		if(sigma_n>traction || sigma_n<-compression_max){
+ 			if(sigma_n>traction){
+ 				sigma_target=traction;
+@@ -563,7 +604,7 @@
+ 
+ 		/* The damage variable is changed */
+ 		damage_new=damage_test;
+-		element->AddInput(MaterialsDamageEnum,&damage_test,P0Enum);//FIXME
++		element->AddInput(DamageEnum,&damage_new,P0Enum);
+ 
+ 		/* Recompute the internal stress*/
+ 		if(damage<1.){
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18503)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18504)
+@@ -49,6 +49,7 @@
+ 	BedEnum,
+ 	BaseEnum,
+ 	ConstantsGEnum,
++	ConstantsOmegaEnum,
+ 	ConstantsReferencetemperatureEnum,
+ 	ConstantsYtsEnum,
+ 	DependentObjectEnum,
+@@ -197,6 +198,7 @@
+ 	DamageEquivStressEnum,
+ 	DamageEvolutionNumRequestedOutputsEnum,
+ 	DamageEvolutionRequestedOutputsEnum,
++	DamageEnum,
+ 	NewDamageEnum,
+ 	MaterialsRhoIceEnum,
+ 	MaterialsRhoSeawaterEnum,
+@@ -748,6 +750,9 @@
+ 	SeaiceoceanEnum,
+ 	SeaiceThicknessEnum,
+ 	SeaiceConcentrationEnum,
++	SeaiceMinConcentrationEnum,
++	SeaiceMinThicknessEnum,
++	SeaiceMaxThicknessEnum,
+ 	SeaiceSpcvxEnum,
+ 	SeaiceSpcvyEnum,
+ 	SeaiceCoriolisFactorEnum,
+@@ -768,7 +773,8 @@
+ 	MatseaiceEnum,
+ 	MaterialsPoissonEnum,
+ 	MaterialsYoungModulusEnum,
+-	MaterialsDamageEnum,
++	MaterialsTimeRelaxationStressEnum,
++	MaterialsTimeRelaxationDamageEnum,
+ 	MaterialsRidgingExponentEnum,
+ 	MaterialsCohesionEnum,
+ 	MaterialsInternalFrictionCoefEnum,
+@@ -776,6 +782,9 @@
+ 	MaterialsTractionCoefEnum,
+ 	VxStarEnum,
+ 	VyStarEnum,
++	StressTensorPredictorxxEnum,
++	StressTensorPredictoryyEnum,
++	StressTensorPredictorxyEnum,
+ 	/*}}}*/
+ 	MaximumNumberOfDefinitionsEnum
+ };
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18503)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18504)
+@@ -57,6 +57,7 @@
+ 		case BedEnum : return "Bed";
+ 		case BaseEnum : return "Base";
+ 		case ConstantsGEnum : return "ConstantsG";
++		case ConstantsOmegaEnum : return "ConstantsOmega";
+ 		case ConstantsReferencetemperatureEnum : return "ConstantsReferencetemperature";
+ 		case ConstantsYtsEnum : return "ConstantsYts";
+ 		case DependentObjectEnum : return "DependentObject";
+@@ -205,6 +206,7 @@
+ 		case DamageEquivStressEnum : return "DamageEquivStress";
+ 		case DamageEvolutionNumRequestedOutputsEnum : return "DamageEvolutionNumRequestedOutputs";
+ 		case DamageEvolutionRequestedOutputsEnum : return "DamageEvolutionRequestedOutputs";
++		case DamageEnum : return "Damage";
+ 		case NewDamageEnum : return "NewDamage";
+ 		case MaterialsRhoIceEnum : return "MaterialsRhoIce";
+ 		case MaterialsRhoSeawaterEnum : return "MaterialsRhoSeawater";
+@@ -707,6 +709,9 @@
+ 		case SeaiceoceanEnum : return "Seaiceocean";
+ 		case SeaiceThicknessEnum : return "SeaiceThickness";
+ 		case SeaiceConcentrationEnum : return "SeaiceConcentration";
++		case SeaiceMinConcentrationEnum : return "SeaiceMinConcentration";
++		case SeaiceMinThicknessEnum : return "SeaiceMinThickness";
++		case SeaiceMaxThicknessEnum : return "SeaiceMaxThickness";
+ 		case SeaiceSpcvxEnum : return "SeaiceSpcvx";
+ 		case SeaiceSpcvyEnum : return "SeaiceSpcvy";
+ 		case SeaiceCoriolisFactorEnum : return "SeaiceCoriolisFactor";
+@@ -727,7 +732,8 @@
+ 		case MatseaiceEnum : return "Matseaice";
+ 		case MaterialsPoissonEnum : return "MaterialsPoisson";
+ 		case MaterialsYoungModulusEnum : return "MaterialsYoungModulus";
+-		case MaterialsDamageEnum : return "MaterialsDamage";
++		case MaterialsTimeRelaxationStressEnum : return "MaterialsTimeRelaxationStress";
++		case MaterialsTimeRelaxationDamageEnum : return "MaterialsTimeRelaxationDamage";
+ 		case MaterialsRidgingExponentEnum : return "MaterialsRidgingExponent";
+ 		case MaterialsCohesionEnum : return "MaterialsCohesion";
+ 		case MaterialsInternalFrictionCoefEnum : return "MaterialsInternalFrictionCoef";
+@@ -735,6 +741,9 @@
+ 		case MaterialsTractionCoefEnum : return "MaterialsTractionCoef";
+ 		case VxStarEnum : return "VxStar";
+ 		case VyStarEnum : return "VyStar";
++		case StressTensorPredictorxxEnum : return "StressTensorPredictorxx";
++		case StressTensorPredictoryyEnum : return "StressTensorPredictoryy";
++		case StressTensorPredictorxyEnum : return "StressTensorPredictorxy";
+ 		case MaximumNumberOfDefinitionsEnum : return "MaximumNumberOfDefinitions";
+ 		default : return "unknown";
+ 
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18503)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18504)
+@@ -57,6 +57,7 @@
+ 	      else if (strcmp(name,"Bed")==0) return BedEnum;
+ 	      else if (strcmp(name,"Base")==0) return BaseEnum;
+ 	      else if (strcmp(name,"ConstantsG")==0) return ConstantsGEnum;
++	      else if (strcmp(name,"ConstantsOmega")==0) return ConstantsOmegaEnum;
+ 	      else if (strcmp(name,"ConstantsReferencetemperature")==0) return ConstantsReferencetemperatureEnum;
+ 	      else if (strcmp(name,"ConstantsYts")==0) return ConstantsYtsEnum;
+ 	      else if (strcmp(name,"DependentObject")==0) return DependentObjectEnum;
+@@ -135,11 +136,11 @@
+ 	      else if (strcmp(name,"HydrologydcIsefficientlayer")==0) return HydrologydcIsefficientlayerEnum;
+ 	      else if (strcmp(name,"HydrologydcSedimentlimitFlag")==0) return HydrologydcSedimentlimitFlagEnum;
+ 	      else if (strcmp(name,"HydrologydcSedimentlimit")==0) return HydrologydcSedimentlimitEnum;
+-	      else if (strcmp(name,"HydrologydcTransferFlag")==0) return HydrologydcTransferFlagEnum;
+          else stage=2;
+    }
+    if(stage==2){
+-	      if (strcmp(name,"HydrologydcLeakageFactor")==0) return HydrologydcLeakageFactorEnum;
++	      if (strcmp(name,"HydrologydcTransferFlag")==0) return HydrologydcTransferFlagEnum;
++	      else if (strcmp(name,"HydrologydcLeakageFactor")==0) return HydrologydcLeakageFactorEnum;
+ 	      else if (strcmp(name,"HydrologydcPenaltyFactor")==0) return HydrologydcPenaltyFactorEnum;
+ 	      else if (strcmp(name,"HydrologydcPenaltyLock")==0) return HydrologydcPenaltyLockEnum;
+ 	      else if (strcmp(name,"HydrologydcBasalMoulinInput")==0) return HydrologydcBasalMoulinInputEnum;
+@@ -208,6 +209,7 @@
+ 	      else if (strcmp(name,"DamageEquivStress")==0) return DamageEquivStressEnum;
+ 	      else if (strcmp(name,"DamageEvolutionNumRequestedOutputs")==0) return DamageEvolutionNumRequestedOutputsEnum;
+ 	      else if (strcmp(name,"DamageEvolutionRequestedOutputs")==0) return DamageEvolutionRequestedOutputsEnum;
++	      else if (strcmp(name,"Damage")==0) return DamageEnum;
+ 	      else if (strcmp(name,"NewDamage")==0) return NewDamageEnum;
+ 	      else if (strcmp(name,"MaterialsRhoIce")==0) return MaterialsRhoIceEnum;
+ 	      else if (strcmp(name,"MaterialsRhoSeawater")==0) return MaterialsRhoSeawaterEnum;
+@@ -257,12 +259,12 @@
+ 	      else if (strcmp(name,"MassFluxSegments")==0) return MassFluxSegmentsEnum;
+ 	      else if (strcmp(name,"MassFluxSegmentsPresent")==0) return MassFluxSegmentsPresentEnum;
+ 	      else if (strcmp(name,"QmuMassFluxSegmentsPresent")==0) return QmuMassFluxSegmentsPresentEnum;
+-	      else if (strcmp(name,"QmuNumberofpartitions")==0) return QmuNumberofpartitionsEnum;
+-	      else if (strcmp(name,"QmuNumberofresponses")==0) return QmuNumberofresponsesEnum;
+          else stage=3;
+    }
+    if(stage==3){
+-	      if (strcmp(name,"QmuPartition")==0) return QmuPartitionEnum;
++	      if (strcmp(name,"QmuNumberofpartitions")==0) return QmuNumberofpartitionsEnum;
++	      else if (strcmp(name,"QmuNumberofresponses")==0) return QmuNumberofresponsesEnum;
++	      else if (strcmp(name,"QmuPartition")==0) return QmuPartitionEnum;
+ 	      else if (strcmp(name,"QmuResponsedescriptors")==0) return QmuResponsedescriptorsEnum;
+ 	      else if (strcmp(name,"QmuVariabledescriptors")==0) return QmuVariabledescriptorsEnum;
+ 	      else if (strcmp(name,"RiftsNumrifts")==0) return RiftsNumriftsEnum;
+@@ -380,12 +382,12 @@
+ 	      else if (strcmp(name,"MasstransportAnalysis")==0) return MasstransportAnalysisEnum;
+ 	      else if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum;
+ 	      else if (strcmp(name,"FreeSurfaceBaseAnalysis")==0) return FreeSurfaceBaseAnalysisEnum;
+-	      else if (strcmp(name,"FreeSurfaceTopAnalysis")==0) return FreeSurfaceTopAnalysisEnum;
+-	      else if (strcmp(name,"SurfaceNormalVelocity")==0) return SurfaceNormalVelocityEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"ExtrudeFromBaseAnalysis")==0) return ExtrudeFromBaseAnalysisEnum;
++	      if (strcmp(name,"FreeSurfaceTopAnalysis")==0) return FreeSurfaceTopAnalysisEnum;
++	      else if (strcmp(name,"SurfaceNormalVelocity")==0) return SurfaceNormalVelocityEnum;
++	      else if (strcmp(name,"ExtrudeFromBaseAnalysis")==0) return ExtrudeFromBaseAnalysisEnum;
+ 	      else if (strcmp(name,"ExtrudeFromTopAnalysis")==0) return ExtrudeFromTopAnalysisEnum;
+ 	      else if (strcmp(name,"DepthAverageAnalysis")==0) return DepthAverageAnalysisEnum;
+ 	      else if (strcmp(name,"SteadystateSolution")==0) return SteadystateSolutionEnum;
+@@ -503,12 +505,12 @@
+ 	      else if (strcmp(name,"Friction")==0) return FrictionEnum;
+ 	      else if (strcmp(name,"Internal")==0) return InternalEnum;
+ 	      else if (strcmp(name,"MassFlux")==0) return MassFluxEnum;
+-	      else if (strcmp(name,"MeltingOffset")==0) return MeltingOffsetEnum;
+-	      else if (strcmp(name,"Misfit")==0) return MisfitEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"Pressure")==0) return PressureEnum;
++	      if (strcmp(name,"MeltingOffset")==0) return MeltingOffsetEnum;
++	      else if (strcmp(name,"Misfit")==0) return MisfitEnum;
++	      else if (strcmp(name,"Pressure")==0) return PressureEnum;
+ 	      else if (strcmp(name,"PressurePicard")==0) return PressurePicardEnum;
+ 	      else if (strcmp(name,"AndroidFrictionCoefficient")==0) return AndroidFrictionCoefficientEnum;
+ 	      else if (strcmp(name,"ResetPenalties")==0) return ResetPenaltiesEnum;
+@@ -626,12 +628,12 @@
+ 	      else if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
+ 	      else if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
+ 	      else if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
+-	      else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
+-	      else if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"MinVel")==0) return MinVelEnum;
++	      if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
++	      else if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
++	      else if (strcmp(name,"MinVel")==0) return MinVelEnum;
+ 	      else if (strcmp(name,"MaxVel")==0) return MaxVelEnum;
+ 	      else if (strcmp(name,"MinVx")==0) return MinVxEnum;
+ 	      else if (strcmp(name,"MaxVx")==0) return MaxVxEnum;
+@@ -722,6 +724,9 @@
+ 	      else if (strcmp(name,"Seaiceocean")==0) return SeaiceoceanEnum;
+ 	      else if (strcmp(name,"SeaiceThickness")==0) return SeaiceThicknessEnum;
+ 	      else if (strcmp(name,"SeaiceConcentration")==0) return SeaiceConcentrationEnum;
++	      else if (strcmp(name,"SeaiceMinConcentration")==0) return SeaiceMinConcentrationEnum;
++	      else if (strcmp(name,"SeaiceMinThickness")==0) return SeaiceMinThicknessEnum;
++	      else if (strcmp(name,"SeaiceMaxThickness")==0) return SeaiceMaxThicknessEnum;
+ 	      else if (strcmp(name,"SeaiceSpcvx")==0) return SeaiceSpcvxEnum;
+ 	      else if (strcmp(name,"SeaiceSpcvy")==0) return SeaiceSpcvyEnum;
+ 	      else if (strcmp(name,"SeaiceCoriolisFactor")==0) return SeaiceCoriolisFactorEnum;
+@@ -742,16 +747,23 @@
+ 	      else if (strcmp(name,"Matseaice")==0) return MatseaiceEnum;
+ 	      else if (strcmp(name,"MaterialsPoisson")==0) return MaterialsPoissonEnum;
+ 	      else if (strcmp(name,"MaterialsYoungModulus")==0) return MaterialsYoungModulusEnum;
+-	      else if (strcmp(name,"MaterialsDamage")==0) return MaterialsDamageEnum;
++	      else if (strcmp(name,"MaterialsTimeRelaxationStress")==0) return MaterialsTimeRelaxationStressEnum;
++	      else if (strcmp(name,"MaterialsTimeRelaxationDamage")==0) return MaterialsTimeRelaxationDamageEnum;
+ 	      else if (strcmp(name,"MaterialsRidgingExponent")==0) return MaterialsRidgingExponentEnum;
+ 	      else if (strcmp(name,"MaterialsCohesion")==0) return MaterialsCohesionEnum;
+-	      else if (strcmp(name,"MaterialsInternalFrictionCoef")==0) return MaterialsInternalFrictionCoefEnum;
++         else stage=7;
++   }
++   if(stage==7){
++	      if (strcmp(name,"MaterialsInternalFrictionCoef")==0) return MaterialsInternalFrictionCoefEnum;
+ 	      else if (strcmp(name,"MaterialsCompressionCoef")==0) return MaterialsCompressionCoefEnum;
+ 	      else if (strcmp(name,"MaterialsTractionCoef")==0) return MaterialsTractionCoefEnum;
+ 	      else if (strcmp(name,"VxStar")==0) return VxStarEnum;
+ 	      else if (strcmp(name,"VyStar")==0) return VyStarEnum;
++	      else if (strcmp(name,"StressTensorPredictorxx")==0) return StressTensorPredictorxxEnum;
++	      else if (strcmp(name,"StressTensorPredictoryy")==0) return StressTensorPredictoryyEnum;
++	      else if (strcmp(name,"StressTensorPredictorxy")==0) return StressTensorPredictorxyEnum;
+ 	      else if (strcmp(name,"MaximumNumberOfDefinitions")==0) return MaximumNumberOfDefinitionsEnum;
+-         else stage=7;
++         else stage=8;
+    }
+ 	/*If we reach this point, the string provided has not been found*/
+ 	if(notfounderror)
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp	(revision 18503)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp	(revision 18504)
+@@ -79,7 +79,7 @@
+ 			}
+ 			break;
+ 		case MatseaiceEnum:
+-			iomodel->FetchDataToInput(elements,MaterialsDamageEnum);
++			iomodel->FetchDataToInput(elements,DamageEnum);
+ 			for (i=0;i<iomodel->numberofelements;i++) if(iomodel->my_elements[i]) materials->AddObject(new Matseaice(i+1,i,iomodel));
+ 			break;
+ 		default:
+Index: ../trunk-jpl/src/c/cores/seaice_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/seaice_core.cpp	(revision 18503)
++++ ../trunk-jpl/src/c/cores/seaice_core.cpp	(revision 18504)
+@@ -19,11 +19,13 @@
+ 
+ 	/*Launch solution sequence for the only analysis we are interested in*/
+ 	femmodel->SetCurrentConfiguration(SeaiceAnalysisEnum);
++	SeaiceAnalysis* analysis = new SeaiceAnalysis();
++	analysis->UpdateDamageAndStress(femmodel);
+ 	solutionsequence_linear(femmodel);
+ 
+ 	if(save_results){
+ 		if(VerboseSolution()) _printf0_("   saving results\n");
+-		int outputs[6] = {VxEnum,VyEnum,VelEnum,SeaiceConcentrationEnum,SeaiceThicknessEnum,MaterialsDamageEnum};
++		int outputs[6] = {VxEnum,VyEnum,VelEnum,SeaiceConcentrationEnum,SeaiceThicknessEnum,DamageEnum};
+ 		femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],6);
+ 	}
+ 
+Index: ../trunk-jpl/src/c/classes/Materials/Matpar.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 18503)
++++ ../trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 18504)
+@@ -104,6 +104,9 @@
+ 			iomodel->Constant(&this->compression_coef,MaterialsCompressionCoefEnum);
+ 			iomodel->Constant(&this->traction_coef,MaterialsTractionCoefEnum);
+ 			iomodel->Constant(&this->g,ConstantsGEnum);
++			iomodel->Constant(&this->omega,ConstantsOmegaEnum);
++			iomodel->Constant(&this->time_relaxation_stress,MaterialsTimeRelaxationStressEnum);
++			iomodel->Constant(&this->time_relaxation_damage,MaterialsTimeRelaxationDamageEnum);
+ 			break;
+ 		default:
+ 			_error_("Material not supported yet");
+@@ -318,6 +321,9 @@
+ 		case MaterialsInternalFrictionCoefEnum:		return this->internal_friction_coef;
+ 		case MaterialsCompressionCoefEnum:				return this->compression_coef;
+ 		case MaterialsTractionCoefEnum:					return this->traction_coef;
++		case ConstantsOmegaEnum:							return this->omega;
++		case MaterialsTimeRelaxationStressEnum:		return this->time_relaxation_stress;
++		case MaterialsTimeRelaxationDamageEnum:		return this->time_relaxation_damage;
+ 		default: _error_("Enum "<<EnumToStringx(enum_in)<<" not supported yet");
+ 	}
+ 
+Index: ../trunk-jpl/src/c/classes/Materials/Matpar.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Matpar.h	(revision 18503)
++++ ../trunk-jpl/src/c/classes/Materials/Matpar.h	(revision 18504)
+@@ -29,6 +29,7 @@
+ 		IssmDouble  mixed_layer_capacity;
+ 		IssmDouble  thermal_exchange_velocity;
+ 		IssmDouble  g;
++		IssmDouble  omega;
+ 		IssmDouble  desfac;
+ 		IssmDouble  s0p;
+ 
+@@ -58,6 +59,8 @@
+ 		IssmDouble internal_friction_coef;
+ 		IssmDouble compression_coef;
+ 		IssmDouble traction_coef;
++		IssmDouble time_relaxation_stress;
++		IssmDouble time_relaxation_damage;
+ 
+ 	public:
+ 		Matpar();
Index: /issm/oecreview/Archive/18296-19100/ISSM-18504-18505.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18504-18505.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18504-18505.diff	(revision 19102)
@@ -0,0 +1,259 @@
+Index: ../trunk-jpl/src/c/analyses/SeaiceAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SeaiceAnalysis.h	(revision 18504)
++++ ../trunk-jpl/src/c/analyses/SeaiceAnalysis.h	(revision 18505)
+@@ -35,5 +35,6 @@
+ 		void CreateCTensor(IssmDouble* C,Element* element,Gauss* gauss);
+ 		void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+ 		void GetM(IssmDouble* M,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void PostProcess(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18504)
++++ ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18505)
+@@ -140,7 +140,7 @@
+ 		this->CreateCTensor(&C[0][0],element,gauss);
+ 		for(int i=0;i<3;i++){
+ 			for(int j=0;j<3;j++){
+-				C[i][j] = dt*time_ratio*gauss->weight*Jdet*C[i][j];
++				C[i][j] = dt*thickness*time_ratio*gauss->weight*Jdet*C[i][j];
+ 			}
+ 		}
+ 		TripleMultiply(B,3,numdof,1,
+@@ -319,8 +319,7 @@
+ void SeaiceAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	/*Intermediaries*/
+-	int*        doflist=NULL;
+-	IssmDouble* xyz_list=NULL;
++	int* doflist=NULL;
+ 
+ 	/*Fetch number of nodes and dof for this finite element*/
+ 	int numnodes = element->GetNumberOfNodes();
+@@ -357,7 +356,6 @@
+ 	xDelete<IssmDouble>(vy);
+ 	xDelete<IssmDouble>(vx);
+ 	xDelete<IssmDouble>(values);
+-	xDelete<IssmDouble>(xyz_list);
+ 	xDelete<int>(doflist);
+ }/*}}}*/
+ void SeaiceAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+@@ -415,7 +413,7 @@
+ 
+ 	/*Intermediaries*/
+ 	IssmDouble D[3][3];
+-	IssmDouble damage,thickness,concentration;
++	IssmDouble damage,concentration;
+ 
+ 	/*Get Material parameters*/
+ 	IssmDouble poisson          = element->GetMaterialParameter(MaterialsPoissonEnum);
+@@ -424,10 +422,8 @@
+ 
+ 	/*Get damage input at this location*/
+ 	Input* damage_input        = element->GetInput(DamageEnum);              _assert_(damage_input);
+-	Input* thickness_input     = element->GetInput(SeaiceThicknessEnum);     _assert_(thickness_input);
+ 	Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input);
+ 	damage_input->GetInputValue(&damage,gauss);
+-	thickness_input->GetInputValue(&thickness,gauss);
+ 	concentration_input->GetInputValue(&concentration,gauss);
+ 
+ 	/*Build D tensor once for all*/
+@@ -447,7 +443,7 @@
+ 	/*Let's build C = hE*D */
+ 	for(int i=0;i<3;i++){
+ 		for(int j=0;j<3;j++){
+-			C[i*3+j] = thickness*E*D[i][j];
++			C[i*3+j] = E*D[i][j];
+ 		}
+ 	}
+ }/*}}}*/
+@@ -622,3 +618,151 @@
+ 		element->AddInput(StressTensorxyEnum,&sigma_xy,P0Enum);
+ 	}
+ }/*}}}*/
++void SeaiceAnalysis::PostProcess(FemModel* femmodel){/*{{{*/
++
++	/*Intermediaties*/
++	IssmDouble *xyz_list = NULL;
++	IssmDouble *xyz_list_old = NULL;
++	IssmDouble *xyz_list_new = NULL;
++	IssmDouble  dt,meshx,meshy,vx,vy,eps_xx,eps_yy,eps_zz,area_old,area_new;
++	IssmDouble  time_relaxation_stress,time_relaxation_damage,damage,concentration,thickness;
++	IssmDouble  sigma_dot_xx,sigma_dot_yy,sigma_dot_xy;
++	IssmDouble  sigma_pred_xx,sigma_pred_yy,sigma_pred_xy;
++	IssmDouble  sigma_xx,sigma_yy,sigma_xy;
++	IssmDouble  min_c,min_h,max_h;
++	IssmDouble  epsilon[3]; /*eps_xx,eps_yy,eps_xy*/
++	IssmDouble  C[3][3];
++
++	/*Fetch the parameters once for all*/
++	femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
++	femmodel->parameters->FindParam(&min_c,SeaiceMinConcentrationEnum);
++	femmodel->parameters->FindParam(&min_h,SeaiceMinThicknessEnum);
++	femmodel->parameters->FindParam(&max_h,SeaiceMaxThicknessEnum);
++
++	/*Loop over the elements of this partition and update accordingly*/
++	for(int i=0;i<femmodel->elements->Size();i++){
++		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++
++		/*Get some inputs needed for the update*/
++		element->GetVerticesCoordinates(&xyz_list);
++		time_relaxation_stress = element->GetMaterialParameter(MaterialsTimeRelaxationStressEnum);
++		time_relaxation_damage = element->GetMaterialParameter(MaterialsTimeRelaxationDamageEnum);
++		Input* meshx_input = element->GetInput(MeshXEnum); _assert_(meshx_input);
++		Input* meshy_input = element->GetInput(MeshYEnum); _assert_(meshy_input);
++		Input* vx_input    = element->GetInput(VxEnum);    _assert_(vx_input);
++		Input* vy_input    = element->GetInput(VyEnum);    _assert_(vy_input);
++
++		/*Preallocate future inputs*/
++		int numvertices=element->GetNumberOfVertices();
++		IssmDouble* meshx_new_list = xNew<IssmDouble>(numvertices);
++		IssmDouble* meshy_new_list = xNew<IssmDouble>(numvertices);
++		xyz_list_old = xNew<IssmDouble>(numvertices*3);
++		xyz_list_new = xNew<IssmDouble>(numvertices*3);
++
++		/*1. update vertex positions (using a Gauss object for convenience)*/
++		Gauss* gauss=element->NewGauss();
++		for (int iv=0;iv<numvertices;iv++){
++			gauss->GaussVertex(iv);
++
++			meshx_input->GetInputValue(&meshx,gauss);
++			meshy_input->GetInputValue(&meshy,gauss);
++			vx_input->GetInputValue(&vx,gauss);
++			vy_input->GetInputValue(&vy,gauss);
++
++			meshx_new_list[iv] = meshx + vx*dt;
++			meshy_new_list[iv] = meshy + vy*dt;
++
++			xyz_list_old[iv*3+0] = meshx;
++			xyz_list_old[iv*3+1] = meshy;
++			xyz_list_old[iv*3+2] = 0.;
++
++			xyz_list_new[iv*3+0] = meshx_new_list[iv];
++			xyz_list_new[iv*3+1] = meshy_new_list[iv];
++			xyz_list_new[iv*3+2] = 0.;
++		}
++		element->AddInput(MeshXEnum,meshx_new_list,P1Enum);
++		element->AddInput(MeshYEnum,meshy_new_list,P1Enum);
++
++		/*Now we are going to use a point in the center of the element, because we are P0 for the stress*/
++		gauss->GaussNode(P0Enum,0);
++
++		/*Calculate sigma_dot*/
++		sigma_dot_xx=sigma_dot_yy=sigma_dot_xy=0.;
++		this->CreateCTensor(&C[0][0],element,gauss);
++		element->StrainRateSSA(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
++		for(int j=0;j<3;j++){
++			sigma_dot_xx += C[0][j]*epsilon[0];
++			sigma_dot_yy += C[1][j]*epsilon[1];
++			sigma_dot_xy += C[2][j]*epsilon[2];
++		}
++
++		/*Get predicted stress state*/
++		Input* sigma_xx_input = element->GetInput(StressTensorPredictorxxEnum); _assert_(sigma_xx_input);
++		Input* sigma_yy_input = element->GetInput(StressTensorPredictoryyEnum); _assert_(sigma_yy_input);
++		Input* sigma_xy_input = element->GetInput(StressTensorPredictorxyEnum); _assert_(sigma_xy_input);
++		sigma_xx_input->GetInputAverage(&sigma_xx);
++		sigma_yy_input->GetInputAverage(&sigma_yy);
++		sigma_xy_input->GetInputAverage(&sigma_xy);
++
++		/*Calculate new stress and push to element*/
++		sigma_xx = sigma_xx + dt*(sigma_dot_xx - sigma_xx/time_relaxation_stress);
++		sigma_yy = sigma_yy + dt*(sigma_dot_yy - sigma_yy/time_relaxation_stress);
++		sigma_xy = sigma_xy + dt*(sigma_dot_xy - sigma_xy/time_relaxation_stress);
++		element->AddInput(StressTensorxxEnum,&sigma_xx,P0Enum);
++		element->AddInput(StressTensoryyEnum,&sigma_yy,P0Enum);
++		element->AddInput(StressTensorxyEnum,&sigma_xy,P0Enum);
++
++		/*Update Damage According*/
++		Input* damage_input = element->GetInput(DamageEnum); _assert_(damage_input);
++		damage_input->GetInputAverage(&damage);
++		damage = damage*(1.-dt/time_relaxation_damage);
++		element->AddInput(DamageEnum,&damage,P0Enum);
++
++		/*Prepare new predictor*/
++		this->CreateCTensor(&C[0][0],element,gauss); /*C is updated now that there is a new damage in inputs*/
++		for(int j=0;j<3;j++){
++			sigma_pred_xx += C[0][j]*epsilon[0];
++			sigma_pred_yy += C[1][j]*epsilon[1];
++			sigma_pred_xy += C[2][j]*epsilon[2];
++		}
++		element->AddInput(StressTensorPredictorxxEnum,&sigma_pred_xx,P0Enum);
++		element->AddInput(StressTensorPredictoryyEnum,&sigma_pred_yy,P0Enum);
++		element->AddInput(StressTensorPredictorxyEnum,&sigma_pred_xy,P0Enum);
++
++		/*Calculate Old and new area (FIXME: for now we assume trianlges...)*/
++		element->JacobianDeterminant(&area_old,xyz_list_old,gauss);
++		element->JacobianDeterminant(&area_new,xyz_list_new,gauss);
++		area_old = area_old/SQRT3;
++		area_new = area_new/SQRT3;
++
++		/*Update ice thickness and concentration using element distortion*/
++		Input* thickness_input     = element->GetInput(SeaiceThicknessEnum);     _assert_(thickness_input);
++		Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input);
++		thickness_input->GetInputAverage(&thickness);
++		concentration_input->GetInputAverage(&concentration);
++		IssmDouble ice_area   = concentration*area_old;
++		IssmDouble ice_volume = thickness*area_old;
++		if(concentration>min_c){
++			concentration = ice_area  /area_new;
++			thickness     = ice_volume/area_new;
++
++			/* lower bounds */
++			concentration = ((concentration>min_c)?(concentration):(min_c));
++			thickness     = ((thickness    >min_h)?(thickness    ):(min_h));
++
++			/* upper bounds (only for the concentration) */
++			concentration    = ((concentration<1.   )?(concentration):(1));
++			thickness        = ((thickness    <max_h)?(thickness    ):(max_h));
++		}
++		element->AddInput(SeaiceConcentrationEnum,&concentration,P0Enum);
++		element->AddInput(SeaiceThicknessEnum,&thickness,P0Enum);
++
++		/*Clean up*/
++		xDelete<IssmDouble>(meshx_new_list);
++		xDelete<IssmDouble>(meshy_new_list);
++		xDelete<IssmDouble>(xyz_list);
++		xDelete<IssmDouble>(xyz_list_old);
++		xDelete<IssmDouble>(xyz_list_new);
++	}
++
++}/*}}}*/
+Index: ../trunk-jpl/src/c/cores/seaice_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/seaice_core.cpp	(revision 18504)
++++ ../trunk-jpl/src/c/cores/seaice_core.cpp	(revision 18505)
+@@ -12,21 +12,26 @@
+ void seaice_core(FemModel* femmodel){
+ 
+ 	/*parameters: */
+-	bool save_results;
++	bool           save_results;
++	SeaiceAnalysis analysis = SeaiceAnalysis();
+ 
+ 	/*recover parameters: */
+ 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+ 
+ 	/*Launch solution sequence for the only analysis we are interested in*/
+ 	femmodel->SetCurrentConfiguration(SeaiceAnalysisEnum);
+-	SeaiceAnalysis* analysis = new SeaiceAnalysis();
+-	analysis->UpdateDamageAndStress(femmodel);
++	analysis.UpdateDamageAndStress(femmodel);
+ 	solutionsequence_linear(femmodel);
++	analysis.PostProcess(femmodel);
+ 
+ 	if(save_results){
+ 		if(VerboseSolution()) _printf0_("   saving results\n");
+-		int outputs[6] = {VxEnum,VyEnum,VelEnum,SeaiceConcentrationEnum,SeaiceThicknessEnum,DamageEnum};
+-		femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],6);
++		int outputs[14] = {VxEnum,VyEnum,VelEnum,
++			SeaiceConcentrationEnum,SeaiceThicknessEnum,DamageEnum,
++			StressTensorPredictorxxEnum,StressTensorPredictoryyEnum,StressTensorPredictorxyEnum,
++			StressTensorxxEnum,StressTensoryyEnum,StressTensorxyEnum,
++			MeshXEnum,MeshYEnum};
++		femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],14);
+ 	}
+ 
+ }
Index: /issm/oecreview/Archive/18296-19100/ISSM-18505-18506.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18505-18506.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18505-18506.diff	(revision 19102)
@@ -0,0 +1,66 @@
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 18505)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 18506)
+@@ -125,6 +125,10 @@
+ 					md.mesh=mesh2dvertical(md.mesh);
+ 				end
+ 			end
++			%2014 September 11
++			if (size(setdiff(fieldnames(md),'seaice'),1)==size(fieldnames(md),1));
++				md.seaice=seaice()
++	    end
+ 		end% }}}
+ 	end
+ 	methods
+@@ -204,7 +208,8 @@
+ 			if ~isnan(md.initialization.vy),md.initialization.vy=DepthAverage(md,md.initialization.vy);end;
+ 			if ~isnan(md.initialization.vz),md.initialization.vz=DepthAverage(md,md.initialization.vz);end;
+ 			if ~isnan(md.initialization.vel),md.initialization.vel=DepthAverage(md,md.initialization.vel);end;
+-			if ~isnan(md.initialization.temperature),md.initialization.temperature=DepthAverage(md,md.initialization.temperature);end;
++			if ~isnan(md.initialization.temperature),	md.initialization.temperature=DepthAverage(md,md.initialization.temperature);end;
++			if ~isnan(md.initialization.pressure),md.initialization.pressure=project2d(md,md.initialization.pressure,1);end;
+ 
+ 			%gia
+ 			if ~isnan(md.gia.mantle_viscosity), md.gia.mantle_viscosity=project2d(md,md.gia.mantle_viscosity,1); end
+@@ -229,6 +234,17 @@
+ 			if ~isnan(md.damage.spcdamage), md.damage.spcdamage=project2d(md,md.damage.spcdamage,md.mesh.numberoflayers); end
+ 			md.thermal.spctemperature=project2d(md,md.thermal.spctemperature,md.mesh.numberoflayers);
+ 
++			% Hydrologydc variables
++			if isa(md.hydrology,'hydrologydc');
++				md.hydrology.spcsediment_head=project2d(md,md.hydrology.spcsediment_head,1);
++				md.hydrology.mask_eplactive_node=project2d(md,md.hydrology.mask_eplactive_node,1);
++				md.hydrology.sediment_transmitivity=project2d(md,md.hydrology.sediment_transmitivity,1);
++				md.hydrology.basal_moulin_input=project2d(md,md.hydrology.basal_moulin_input,1);
++				if(md.hydrology.isefficientlayer==1)
++					md.hydrology.spcepl_head=project2d(md,md.hydrology.spcepl_head,1);
++		    end
++	    end
++			
+ 			%materials
+ 			md.materials.rheology_B=DepthAverage(md,md.materials.rheology_B);
+ 			md.materials.rheology_n=project2d(md,md.materials.rheology_n,1);
+@@ -781,10 +797,12 @@
+ 			% Hydrologydc variables
+ 			if isa(md.hydrology,'hydrologydc');
+ 				md.hydrology.spcsediment_head=project3d(md,'vector',md.hydrology.spcsediment_head,'type','node','layer',1);
+-				md.hydrology.spcepl_head=project3d(md,'vector',md.hydrology.spcepl_head,'type','node','layer',1);
+ 				md.hydrology.mask_eplactive_node=project3d(md,'vector',md.hydrology.mask_eplactive_node,'type','node','layer',1);
+ 				md.hydrology.sediment_transmitivity=project3d(md,'vector',md.hydrology.sediment_transmitivity,'type','node','layer',1);
+ 				md.hydrology.basal_moulin_input=project3d(md,'vector',md.hydrology.basal_moulin_input,'type','node','layer',1);
++				if(md.hydrology.isefficientlayer==1);
++					md.hydrology.spcepl_head=project3d(md,'vector',md.hydrology.spcepl_head,'type','node','layer',1);
++		    end
+ 	    end
+ 
+ 			%connectivity
+@@ -824,7 +842,7 @@
+ 			%Put lithostatic pressure if there is an existing pressure
+ 			if ~isnan(md.initialization.pressure),
+ 				md.initialization.pressure=md.constants.g*md.materials.rho_ice*(md.geometry.surface-md.mesh.z);
+-			end
++	    end
+ 
+ 			%special for thermal modeling:
+ 			md.basalforcings.groundedice_melting_rate=project3d(md,'vector',md.basalforcings.groundedice_melting_rate,'type','node','layer',1); 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18506-18507.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18506-18507.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18506-18507.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 18506)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 18507)
+@@ -126,7 +126,7 @@
+ 				end
+ 			end
+ 			%2014 September 11
+-			if (size(setdiff(fieldnames(md),'seaice'),1)==size(fieldnames(md),1));
++			if (md.seaice==0);
+ 				md.seaice=seaice()
+ 	    end
+ 		end% }}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18507-18508.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18507-18508.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18507-18508.diff	(revision 19102)
@@ -0,0 +1,31 @@
+Index: ../trunk-jpl/src/m/classes/hydrologydc.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologydc.m	(revision 18507)
++++ ../trunk-jpl/src/m/classes/hydrologydc.m	(revision 18508)
+@@ -29,7 +29,7 @@
+ 		epl_compressibility      = 0;
+ 		epl_porosity             = 0;
+ 		epl_initial_thickness    = 0;
+-		epl_max_thickness    = 0;
++		epl_max_thickness        = 0;
+ 		epl_conductivity         = 0;
+   end
+ 	methods
+@@ -72,7 +72,7 @@
+ 			obj.epl_compressibility      = 1.0e-08;
+ 			obj.epl_porosity             = 0.4;
+ 			obj.epl_initial_thickness    = 1.0;
+-			obj.epl_max_thickness    = 5.0;
++			obj.epl_max_thickness        = 5.0;
+ 			obj.epl_conductivity         = 8.0e-02;
+ 
+ 		end 
+@@ -140,7 +140,7 @@
+ 			if obj.transfer_flag==1,
+ 				fielddisplay(obj,'leakage_factor','user defined leakage factor [m]');
+ 	    end
+-			fielddisplay(obj,'basal_moulin_input','Figure out what it is');
++			fielddisplay(obj,'basal_moulin_input','water flux at a given point [m3 s-1]');
+ 			disp(sprintf('   - for the sediment layer'));
+ 			fielddisplay(obj,'spcsediment_head','sediment water head constraints (NaN means no constraint) [m above MSL]');
+ 			fielddisplay(obj,'sediment_compressibility','sediment compressibility [Pa^-1]');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18508-18509.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18508-18509.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18508-18509.diff	(revision 19102)
@@ -0,0 +1,21 @@
+Index: ../trunk-jpl/src/c/classes/Materials/Matpar.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 18508)
++++ ../trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 18509)
+@@ -28,6 +28,7 @@
+ 
+ 	switch(materials_type){
+ 		case MaticeEnum:
++		case MatdamageiceEnum:
+ 			iomodel->Constant(&this->rho_ice,MaterialsRhoIceEnum);
+ 			iomodel->Constant(&this->rho_water,MaterialsRhoSeawaterEnum);
+ 			iomodel->Constant(&this->rho_freshwater,MaterialsRhoFreshwaterEnum);
+@@ -109,7 +110,7 @@
+ 			iomodel->Constant(&this->time_relaxation_damage,MaterialsTimeRelaxationDamageEnum);
+ 			break;
+ 		default:
+-			_error_("Material not supported yet");
++			_error_("Material "<< EnumToStringx(materials_type) <<" not supported yet");
+ 	}
+ }
+ /*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18509-18510.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18509-18510.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18509-18510.diff	(revision 19102)
@@ -0,0 +1,146 @@
+Index: ../trunk-jpl/externalpackages/valgrind/install-win32.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/valgrind/install-win32.sh	(revision 18509)
++++ ../trunk-jpl/externalpackages/valgrind/install-win32.sh	(revision 18510)
+@@ -2,18 +2,18 @@
+ set -eu
+ 
+ #Some cleanup
+-rm -rf install valgrind-3.8.1
++rm -rf install valgrind-3.10.0
+ mkdir install
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/valgrind-3.8.1.tar.bz2' 'valgrind-3.8.1.tar.bz2'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/valgrind-3.10.0.tar.bz2' 'valgrind-3.10.0.tar.bz2'
+ 
+ #Untar 
+-tar -jxvf  valgrind-3.8.1.tar.bz2
++tar -jxvf  valgrind-3.10.0.tar.bz2
+ 
+ #Move valgrind into install directory
+-mv valgrind-3.8.1/* install
+-rm -rf valgrind-3.8.1
++mv valgrind-3.10.0/* install
++rm -rf valgrind-3.10.0
+ 
+ #configure
+ cd install
+Index: ../trunk-jpl/externalpackages/valgrind/install-macosx64.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/valgrind/install-macosx64.sh	(revision 18509)
++++ ../trunk-jpl/externalpackages/valgrind/install-macosx64.sh	(revision 18510)
+@@ -2,23 +2,24 @@
+ set -eu
+ 
+ #Some cleanup
+-rm -rf install valgrind-3.8.1
++rm -rf install valgrind-3.10.0
+ mkdir install
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/valgrind-3.8.1.tar.bz2' 'valgrind-3.8.1.tar.bz2'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/valgrind-3.10.0.tar.bz2' 'valgrind-3.10.0.tar.bz2'
+ 
+ #Untar 
+-tar -jxvf  valgrind-3.8.1.tar.bz2
++tar -jxvf  valgrind-3.10.0.tar.bz2
+ 
+ #Move valgrind into install directory
+-mv valgrind-3.8.1/* install
+-rm -rf valgrind-3.8.1
++mv valgrind-3.10.0/* install
++rm -rf valgrind-3.10.0
+ 
+ #configure
+ cd install
+ ./configure  --prefix="$ISSM_DIR/externalpackages/valgrind/install" --enable-only64bit
+ 
+ #Compile valgrind
++
+ make  -j 8
+ make install
+Index: ../trunk-jpl/externalpackages/valgrind/install-linux64.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/valgrind/install-linux64.sh	(revision 18509)
++++ ../trunk-jpl/externalpackages/valgrind/install-linux64.sh	(revision 18510)
+@@ -2,18 +2,18 @@
+ set -eu
+ 
+ #Some cleanup
+-rm -rf install valgrind-3.8.1
++rm -rf install valgrind-3.10.0
+ mkdir install
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/valgrind-3.8.1.tar.bz2' 'valgrind-3.8.1.tar.bz2'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/valgrind-3.10.0.tar.bz2' 'valgrind-3.10.0.tar.bz2'
+ 
+ #Untar 
+-tar -jxvf  valgrind-3.8.1.tar.bz2
++tar -jxvf  valgrind-3.10.0.tar.bz2
+ 
+ #Move valgrind into install directory
+-mv valgrind-3.8.1/* install
+-rm -rf valgrind-3.8.1
++mv valgrind-3.10.0/* install
++rm -rf valgrind-3.10.0
+ 
+ #configure
+ cd install
+Index: ../trunk-jpl/externalpackages/valgrind/install-altix64.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/valgrind/install-altix64.sh	(revision 18509)
++++ ../trunk-jpl/externalpackages/valgrind/install-altix64.sh	(revision 18510)
+@@ -2,18 +2,18 @@
+ set -eu
+ 
+ #Some cleanup
+-rm -rf install valgrind-3.8.1
++rm -rf install valgrind-3.10.0
+ mkdir install
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/valgrind-3.8.1.tar.bz2' 'valgrind-3.8.1.tar.bz2'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/valgrind-3.10.0.tar.bz2' 'valgrind-3.10.0.tar.bz2'
+ 
+ #Untar 
+-tar -jxvf  valgrind-3.8.1.tar.bz2
++tar -jxvf  valgrind-3.10.0.tar.bz2
+ 
+ #Move valgrind into install directory
+-mv valgrind-3.8.1/* install
+-rm -rf valgrind-3.8.1
++mv valgrind-3.10.0/* install
++rm -rf valgrind-3.10.0
+ 
+ #configure
+ cd install
+Index: ../trunk-jpl/externalpackages/valgrind/install-macosx32.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/valgrind/install-macosx32.sh	(revision 18509)
++++ ../trunk-jpl/externalpackages/valgrind/install-macosx32.sh	(revision 18510)
+@@ -2,18 +2,18 @@
+ set -eu
+ 
+ #Some cleanup
+-rm -rf install valgrind-3.8.1
++rm -rf install valgrind-3.10.0
+ mkdir install
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/valgrind-3.8.1.tar.bz2' 'valgrind-3.8.1.tar.bz2'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/valgrind-3.10.0.tar.bz2' 'valgrind-3.10.0.tar.bz2'
+ 
+ #Untar 
+-tar -jxvf  valgrind-3.8.1.tar.bz2
++tar -jxvf  valgrind-3.10.0.tar.bz2
+ 
+ #Move valgrind into install directory
+-mv valgrind-3.8.1/* install
+-rm -rf valgrind-3.8.1
++mv valgrind-3.10.0/* install
++rm -rf valgrind-3.10.0
+ 
+ #configure
+ cd install
Index: /issm/oecreview/Archive/18296-19100/ISSM-18510-18511.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18510-18511.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18510-18511.diff	(revision 19102)
@@ -0,0 +1,217 @@
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18510)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18511)
+@@ -87,6 +87,7 @@
+ 	FlowequationFeHOEnum,
+ 	FlowequationFeFSEnum,
+ 	FlowequationVertexEquationEnum,
++	FrictionAsEnum,
+ 	FrictionCoefficientEnum,
+ 	FrictionPEnum,
+ 	FrictionQEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18510)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18511)
+@@ -95,6 +95,7 @@
+ 		case FlowequationFeHOEnum : return "FlowequationFeHO";
+ 		case FlowequationFeFSEnum : return "FlowequationFeFS";
+ 		case FlowequationVertexEquationEnum : return "FlowequationVertexEquation";
++		case FrictionAsEnum : return "FrictionAs";
+ 		case FrictionCoefficientEnum : return "FrictionCoefficient";
+ 		case FrictionPEnum : return "FrictionP";
+ 		case FrictionQEnum : return "FrictionQ";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18510)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18511)
+@@ -95,6 +95,7 @@
+ 	      else if (strcmp(name,"FlowequationFeHO")==0) return FlowequationFeHOEnum;
+ 	      else if (strcmp(name,"FlowequationFeFS")==0) return FlowequationFeFSEnum;
+ 	      else if (strcmp(name,"FlowequationVertexEquation")==0) return FlowequationVertexEquationEnum;
++	      else if (strcmp(name,"FrictionAs")==0) return FrictionAsEnum;
+ 	      else if (strcmp(name,"FrictionCoefficient")==0) return FrictionCoefficientEnum;
+ 	      else if (strcmp(name,"FrictionP")==0) return FrictionPEnum;
+ 	      else if (strcmp(name,"FrictionQ")==0) return FrictionQEnum;
+@@ -135,11 +136,11 @@
+ 	      else if (strcmp(name,"HydrologydcEplConductivity")==0) return HydrologydcEplConductivityEnum;
+ 	      else if (strcmp(name,"HydrologydcIsefficientlayer")==0) return HydrologydcIsefficientlayerEnum;
+ 	      else if (strcmp(name,"HydrologydcSedimentlimitFlag")==0) return HydrologydcSedimentlimitFlagEnum;
+-	      else if (strcmp(name,"HydrologydcSedimentlimit")==0) return HydrologydcSedimentlimitEnum;
+          else stage=2;
+    }
+    if(stage==2){
+-	      if (strcmp(name,"HydrologydcTransferFlag")==0) return HydrologydcTransferFlagEnum;
++	      if (strcmp(name,"HydrologydcSedimentlimit")==0) return HydrologydcSedimentlimitEnum;
++	      else if (strcmp(name,"HydrologydcTransferFlag")==0) return HydrologydcTransferFlagEnum;
+ 	      else if (strcmp(name,"HydrologydcLeakageFactor")==0) return HydrologydcLeakageFactorEnum;
+ 	      else if (strcmp(name,"HydrologydcPenaltyFactor")==0) return HydrologydcPenaltyFactorEnum;
+ 	      else if (strcmp(name,"HydrologydcPenaltyLock")==0) return HydrologydcPenaltyLockEnum;
+@@ -258,11 +259,11 @@
+ 	      else if (strcmp(name,"QmuIsdakota")==0) return QmuIsdakotaEnum;
+ 	      else if (strcmp(name,"MassFluxSegments")==0) return MassFluxSegmentsEnum;
+ 	      else if (strcmp(name,"MassFluxSegmentsPresent")==0) return MassFluxSegmentsPresentEnum;
+-	      else if (strcmp(name,"QmuMassFluxSegmentsPresent")==0) return QmuMassFluxSegmentsPresentEnum;
+          else stage=3;
+    }
+    if(stage==3){
+-	      if (strcmp(name,"QmuNumberofpartitions")==0) return QmuNumberofpartitionsEnum;
++	      if (strcmp(name,"QmuMassFluxSegmentsPresent")==0) return QmuMassFluxSegmentsPresentEnum;
++	      else if (strcmp(name,"QmuNumberofpartitions")==0) return QmuNumberofpartitionsEnum;
+ 	      else if (strcmp(name,"QmuNumberofresponses")==0) return QmuNumberofresponsesEnum;
+ 	      else if (strcmp(name,"QmuPartition")==0) return QmuPartitionEnum;
+ 	      else if (strcmp(name,"QmuResponsedescriptors")==0) return QmuResponsedescriptorsEnum;
+@@ -381,11 +382,11 @@
+ 	      else if (strcmp(name,"MeltingAnalysis")==0) return MeltingAnalysisEnum;
+ 	      else if (strcmp(name,"MasstransportAnalysis")==0) return MasstransportAnalysisEnum;
+ 	      else if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum;
+-	      else if (strcmp(name,"FreeSurfaceBaseAnalysis")==0) return FreeSurfaceBaseAnalysisEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"FreeSurfaceTopAnalysis")==0) return FreeSurfaceTopAnalysisEnum;
++	      if (strcmp(name,"FreeSurfaceBaseAnalysis")==0) return FreeSurfaceBaseAnalysisEnum;
++	      else if (strcmp(name,"FreeSurfaceTopAnalysis")==0) return FreeSurfaceTopAnalysisEnum;
+ 	      else if (strcmp(name,"SurfaceNormalVelocity")==0) return SurfaceNormalVelocityEnum;
+ 	      else if (strcmp(name,"ExtrudeFromBaseAnalysis")==0) return ExtrudeFromBaseAnalysisEnum;
+ 	      else if (strcmp(name,"ExtrudeFromTopAnalysis")==0) return ExtrudeFromTopAnalysisEnum;
+@@ -504,11 +505,11 @@
+ 	      else if (strcmp(name,"FractionIncrement")==0) return FractionIncrementEnum;
+ 	      else if (strcmp(name,"Friction")==0) return FrictionEnum;
+ 	      else if (strcmp(name,"Internal")==0) return InternalEnum;
+-	      else if (strcmp(name,"MassFlux")==0) return MassFluxEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"MeltingOffset")==0) return MeltingOffsetEnum;
++	      if (strcmp(name,"MassFlux")==0) return MassFluxEnum;
++	      else if (strcmp(name,"MeltingOffset")==0) return MeltingOffsetEnum;
+ 	      else if (strcmp(name,"Misfit")==0) return MisfitEnum;
+ 	      else if (strcmp(name,"Pressure")==0) return PressureEnum;
+ 	      else if (strcmp(name,"PressurePicard")==0) return PressurePicardEnum;
+@@ -627,11 +628,11 @@
+ 	      else if (strcmp(name,"MisfitObservationEnum")==0) return MisfitObservationEnumEnum;
+ 	      else if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
+ 	      else if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
+-	      else if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
++	      if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
++	      else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
+ 	      else if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
+ 	      else if (strcmp(name,"MinVel")==0) return MinVelEnum;
+ 	      else if (strcmp(name,"MaxVel")==0) return MaxVelEnum;
+@@ -750,11 +751,11 @@
+ 	      else if (strcmp(name,"MaterialsTimeRelaxationStress")==0) return MaterialsTimeRelaxationStressEnum;
+ 	      else if (strcmp(name,"MaterialsTimeRelaxationDamage")==0) return MaterialsTimeRelaxationDamageEnum;
+ 	      else if (strcmp(name,"MaterialsRidgingExponent")==0) return MaterialsRidgingExponentEnum;
+-	      else if (strcmp(name,"MaterialsCohesion")==0) return MaterialsCohesionEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"MaterialsInternalFrictionCoef")==0) return MaterialsInternalFrictionCoefEnum;
++	      if (strcmp(name,"MaterialsCohesion")==0) return MaterialsCohesionEnum;
++	      else if (strcmp(name,"MaterialsInternalFrictionCoef")==0) return MaterialsInternalFrictionCoefEnum;
+ 	      else if (strcmp(name,"MaterialsCompressionCoef")==0) return MaterialsCompressionCoefEnum;
+ 	      else if (strcmp(name,"MaterialsTractionCoef")==0) return MaterialsTractionCoefEnum;
+ 	      else if (strcmp(name,"VxStar")==0) return VxStarEnum;
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.h	(revision 18510)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.h	(revision 18511)
+@@ -31,6 +31,7 @@
+ 		void  GetAlpha2(IssmDouble* palpha2,Gauss* gauss);
+ 		void  GetAlpha2Viscous(IssmDouble* palpha2,Gauss* gauss);
+ 		void  GetAlpha2Weertman(IssmDouble* palpha2,Gauss* gauss);
++		void  GetAlpha2Hydro(IssmDouble* palpha2,Gauss* gauss);
+ 		void  GetAlphaComplement(IssmDouble* alpha_complement,Gauss* gauss);
+ };
+ 
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18510)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18511)
+@@ -47,8 +47,10 @@
+ 			break;
+ 		case 2:
+ 			GetAlpha2Weertman(palpha2,gauss);
++	  case 3:
++			GetAlpha2Hydro(palpha2,gauss);
+ 			break;
+-		default:
++	  default:
+ 			_error_("not supported");
+ 	}
+ 
+@@ -154,6 +156,68 @@
+ 	/*Assign output pointers:*/
+ 	*palpha2=alpha2;
+ }/*}}}*/
++void Friction::GetAlpha2Hydro(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
++
++	/*This routine calculates the basal friction coefficient 
++		Based on Gagliardini 2007, needs a good effective pressure computation
++	  alpha2= C*Neff*[|vel|/{(C^n*Neff^n*As)*(1+alpha*Chi^q)}]^(1/n)  with
++		-Chi=|vel|/(C^n*Neff^n*As)
++		-alpha=(q-1)^(q-1)/q^q  **/
++
++	/*diverse: */
++	IssmDouble  q_exp;
++	IssmDouble  C_param;
++	IssmDouble  As;
++
++	IssmDouble  Neff;
++	IssmDouble  n;
++
++	IssmDouble  alpha;
++	IssmDouble  Chi;
++
++	IssmDouble  vx,vy,vz,vmag;
++	IssmDouble  alpha2;
++
++	/*Recover parameters: */
++	element->GetInputValue(&q_exp,FrictionQEnum);
++	element->GetInputValue(&C_param,FrictionCEnum);
++	element->GetInputValue(&As,FrictionAsEnum);
++
++	element->GetInputValue(&Neff,gauss,EffectivePressureEnum);
++	element->GetInputValue(&n,gauss,MaterialsRheologyNEnum);
++	
++	if(Neff<0)Neff=0;
++
++	switch(dim){
++		case 1:
++			element->GetInputValue(&vx,gauss,VxEnum);
++			vmag=sqrt(vx*vx);
++			break;
++		case 2:
++			element->GetInputValue(&vx,gauss,VxEnum);
++			element->GetInputValue(&vy,gauss,VyEnum);
++			vmag=sqrt(vx*vx+vy*vy);
++			break;
++		case 3:
++			element->GetInputValue(&vx,gauss,VxEnum);
++			element->GetInputValue(&vy,gauss,VyEnum);
++			element->GetInputValue(&vz,gauss,VzEnum);
++			vmag=sqrt(vx*vx+vy*vy+vz*vz);
++			break;
++		default:
++			_error_("not supported");
++	}
++
++	//compute alpha and Chi coefficients: */
++	alpha=(pow(q_exp-1,q_exp-1))/pow(q_exp,q_exp);
++	Chi=vmag/(pow(C_param,n)*pow(Neff,n)*As);
++
++	alpha2=C_param*Neff*pow((Chi/(1+alpha*pow(Chi,q_exp))),1./n);
++	_assert_(!xIsNan<IssmDouble>(alpha2));
++	
++	/*Assign output pointers:*/
++	*palpha2=alpha2;
++}/*}}}*/
+ void Friction::GetAlphaComplement(IssmDouble* palpha_complement, Gauss* gauss){/*{{{*/
+ 
+ 	/* FrictionGetAlpha2 computes alpha2= drag^2 * Neff ^r * vel ^s, with Neff=rho_ice*g*thickness+rho_ice*g*bed, r=q/p and s=1/p. 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18511-18512.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18511-18512.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18511-18512.diff	(revision 19102)
@@ -0,0 +1,78 @@
+Index: ../trunk-jpl/src/m/classes/frictionhydro.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionhydro.m	(revision 0)
++++ ../trunk-jpl/src/m/classes/frictionhydro.m	(revision 18512)
+@@ -0,0 +1,45 @@
++%FRICTIONWEERTMAN class definition
++%
++%   Usage:
++%      frictionweertman=frictionhydro();
++
++classdef frictionhydro
++	properties (SetAccess=public) 
++		q  = NaN;
++		C  = NaN;
++		As = NaN;
++	end
++	methods
++		function obj = frictionhydro(varargin) % {{{
++			switch nargin
++				case 0
++					obj=setdefaultparameters(obj);
++				otherwise
++					error('constructor not supported');
++			end
++		end % }}}
++		function obj = setdefaultparameters(obj) % {{{
++
++		end % }}}
++		function md = checkconsistency(obj,md,solution,analyses) % {{{
++
++			%Early return
++			if ~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(ThermalAnalysisEnum(),analyses), return; end
++			md = checkfield(md,'fieldname','frictionhydro.q','NaN',1,'size',[md.mesh.numberofelements 1]);
++			md = checkfield(md,'fieldname','frictionhydro.C','NaN',1,'size',[md.mesh.numberofelements 1]);
++			md = checkfield(md,'fieldname','frictionhydro.As','NaN',1,'size',[md.mesh.numberofelements 1]);
++		end % }}}
++		function disp(obj) % {{{
++			disp(sprintf('Effective Pressure based friction law described in Gagliardini 2007')
++			fielddisplay(obj,'q','friction law exponent q>=1');
++			fielddisplay(obj,'C','friction law max value [SI]');
++			fielddisplay(obj,'As','Sliding Parameter without cavitation [m Pa^-n s^-1]');
++		end % }}}
++		function marshall(obj,md,fid) % {{{
++			WriteData(fid,'enum',FrictionLawEnum,'data',3,'format','Integer');
++			WriteData(fid,'class','friction','object',obj,'fieldname','q','format','DoubleMat','mattype',2);
++			WriteData(fid,'class','friction','object',obj,'fieldname','C','format','DoubleMat','mattype',2);
++			WriteData(fid,'class','friction','object',obj,'fieldname','As','format','DoubleMat','mattype',2);
++		end % }}}
++	end
++end
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18511)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18512)
+@@ -87,6 +87,7 @@
+ def FlowequationFeHOEnum(): return StringToEnum("FlowequationFeHO")[0]
+ def FlowequationFeFSEnum(): return StringToEnum("FlowequationFeFS")[0]
+ def FlowequationVertexEquationEnum(): return StringToEnum("FlowequationVertexEquation")[0]
++def FrictionAsEnum(): return StringToEnum("FrictionAs")[0]
+ def FrictionCoefficientEnum(): return StringToEnum("FrictionCoefficient")[0]
+ def FrictionPEnum(): return StringToEnum("FrictionP")[0]
+ def FrictionQEnum(): return StringToEnum("FrictionQ")[0]
+Index: ../trunk-jpl/src/m/enum/FrictionAsEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/FrictionAsEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/FrictionAsEnum.m	(revision 18512)
+@@ -0,0 +1,11 @@
++function macro=FrictionAsEnum()
++%FRICTIONASENUM - Enum of FrictionAs
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=FrictionAsEnum()
++
++macro=StringToEnum('FrictionAs');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18512-18513.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18512-18513.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18512-18513.diff	(revision 19102)
@@ -0,0 +1,329 @@
+Index: ../trunk-jpl/src/m/contrib/paraview/exportVTK.m
+===================================================================
+--- ../trunk-jpl/src/m/contrib/paraview/exportVTK.m	(revision 18512)
++++ ../trunk-jpl/src/m/contrib/paraview/exportVTK.m	(revision 18513)
+@@ -24,13 +24,16 @@
+ %get the element related variables
+ if dimension(model.mesh)==2,
+ 	points=[model.mesh.x model.mesh.y zeros(model.mesh.numberofvertices,1)];
++	[num_of_points,dim]=size(points);
++	[num_of_elt]=size(model.mesh.elements,1);
++	[point_per_elt]=size(model.mesh.elements,2);
+ else
+ 	points=[model.mesh.x model.mesh.y model.mesh.z];
++	[num_of_points,dim]=size(points);
++	[num_of_elt]=size(model.mesh.elements,1);
++	[point_per_elt]=size(model.mesh.elements,2);
+ end
+ 
+-[num_of_points,dim]=size(points);
+-[num_of_elt]=size(model.mesh.elements,1);
+-[point_per_elt]=size(model.mesh.elements,2);
+ 
+ %Select the type of element function of the number of nodes per elements
+ if point_per_elt==3;
+@@ -85,7 +88,7 @@
+ 		s=horzcat(s,{' %d'});
+   end
+ 	s=cell2mat(horzcat(s,{'\n'}));
+-	fprintf(fid,s,[(point_per_elt)*ones(num_of_elt,1) model.mesh.elements-1]');
++		fprintf(fid,s,[(point_per_elt)*ones(num_of_elt,1)	model.mesh.elements-1]');
+ 	
+ 	fprintf(fid,'CELL_TYPES %d\n',num_of_elt);
+ 	s='%d\n';
+Index: ../trunk-jpl/src/m/contrib/paraview/enveloppeVTK.m
+===================================================================
+--- ../trunk-jpl/src/m/contrib/paraview/enveloppeVTK.m	(revision 0)
++++ ../trunk-jpl/src/m/contrib/paraview/enveloppeVTK.m	(revision 18513)
+@@ -0,0 +1,155 @@
++function enveloppeVTK(filename,model,varargin)
++% vtk export
++% function enveloppeVTK(filename,model)
++% creates a directory with the vtk files for displays in paraview
++% only export the enveloppe result (surface and base) on trias
++%
++% input: filename   destination 
++%                   (string)
++%------------------------------------------------------------------
++%        model      this is md 
++%------------------------------------------------------------------
++% By default only the results are exported, you can add whichever
++% field you need as a string:
++% add 'geometry' to export md.geometry
++%
++% Basile de Fleurian:
++
++[path,name,ext]=fileparts(filename);
++separator=filesep;
++mkdir(filename);
++IsEnveloppe=find(model.mesh.vertexonbase | model.mesh.vertexonsurface);
++
++%get the element related variables
++if dimension(model.mesh)==2,
++	points=[model.mesh.x model.mesh.y zeros(model.mesh.numberofvertices,1)];
++	[num_of_elt]=size(model.mesh.elements,1);
++	[point_per_elt]=size(model.mesh.elements,2);
++else
++	points=[model.mesh.x(IsEnveloppe) model.mesh.y(IsEnveloppe) model.mesh.z(IsEnveloppe)];
++	[num_of_elt]=size(find(isnan(model.mesh.lowerelements)),1)+size(find(isnan(model.mesh.upperelements)),1);
++	[low_elt_num]=size(find(isnan(model.mesh.lowerelements)),1);
++	[top_elt_num]=size(find(isnan(model.mesh.upperelements)),1);
++end
++
++celltype=5; %triangles
++[num_of_points,dim]=size(points);
++tot_points=model.mesh.numberofvertices;
++
++%this is the result structure
++res_struct=model.results;
++%checking for results
++if (length(fields(res_struct))>0);
++	%Getting all the solutions of the model
++	solnames=fields(res_struct);
++	num_of_sols=length(solnames);
++	num_of_timesteps=1;
++	%building solution structure 
++	for i=1:num_of_sols
++		sol_struct{i}=res_struct.(solnames{i});
++		%looking for multiple time steps
++		if(size(sol_struct{i},2)>num_of_timesteps);
++			num_of_timesteps=size(sol_struct{i},2);
++  end
++ end
++else
++	num_of_timesteps=1;
++end
++for step=1:num_of_timesteps;
++	
++	timestep=step;
++
++	fid = fopen(strcat(path,filesep,name,filesep,name,'.vtk',int2str(timestep),'.vtk'),'w+');
++	fprintf(fid,'# vtk DataFile Version 2.0 \n');
++	fprintf(fid,'Data for run %s \n',model.miscellaneous.name);
++	fprintf(fid,'ASCII \n');
++	fprintf(fid,'DATASET UNSTRUCTURED_GRID \n');
++	
++	fprintf(fid,'POINTS %d float\n',num_of_points);
++	if(dim==3);
++		s='%f %f %f \n';
++	elseif(dim==2);
++		s='%f %f \n';
++  end
++	P=[points zeros(num_of_points,3-dim)];
++	fprintf(fid,s,P');
++	
++	fprintf(fid,'CELLS %d %d\n',num_of_elt,num_of_elt*(3+1));
++	s='%d';
++	for j=1:3
++		s=horzcat(s,{' %d'});
++  end
++	s=cell2mat(horzcat(s,{'\n'}));
++
++	%build the connection matrix for the top and bottom elements
++	if exist('low_elt_num')
++		triaconnect=zeros(num_of_elt,3);
++		triaconnect(1:low_elt_num,:)= ...
++				model.mesh.elements(find(isnan(model.mesh.lowerelements)),1:3);
++		upshift=-min(min(model.mesh.elements(find(isnan(model.mesh.upperelements)),4:6)))...
++						+1+max(max(model.mesh.elements(find(isnan(model.mesh.lowerelements)),1:3)));
++		triaconnect(1+low_elt_num:num_of_elt,:)=model.mesh.elements(find(isnan(model.mesh.upperelements)),4:6)+upshift;
++		fprintf(fid,s,[(3)*ones(num_of_elt,1) triaconnect-1]');
++	else
++		fprintf(fid,s,[(point_per_elt)*ones(num_of_elt,1)	model.mesh.elements-1]');
++  end
++
++	fprintf(fid,'CELL_TYPES %d\n',num_of_elt);
++	s='%d\n';
++	fprintf(fid,s,celltype*ones(num_of_elt,1));
++	fprintf(fid,'POINT_DATA %s \n',num2str(num_of_points));
++
++	%loop over the different solution structures
++	if (exist('num_of_sols'));
++		for j=1:num_of_sols
++			%dealing with results on different timesteps
++			if(size(sol_struct{j},2)>timestep);
++				timestep = step;
++			else
++				timestep = size(sol_struct{j},2);
++	    end
++			
++			%getting the number of fields in the solution
++			fieldnames=fields(sol_struct{j}(timestep));
++			num_of_fields=length(fieldnames);
++			
++			%check which field is a real result and print
++			for k=1:num_of_fields
++				if ((numel(sol_struct{j}(timestep).(fieldnames{k})))==tot_points);
++					%paraview does not like NaN, replacing
++					nanval=find(isnan(sol_struct{j}(timestep).(fieldnames{k})));
++					sol_struct{j}(timestep).(fieldnames{k})(nanval)=-9999;
++					%also checking for verry small value that mess up
++					smallval=(abs(sol_struct{j}(timestep).(fieldnames{k}))<1.0e-20);
++					sol_struct{j}(timestep).(fieldnames{k})(smallval)=0.0;
++					fprintf(fid,'SCALARS %s float 1 \n',fieldnames{k});
++					fprintf(fid,'LOOKUP_TABLE default\n');
++					s='%e\n';
++					fprintf(fid,s,sol_struct{j}(timestep).(fieldnames{k})(IsEnveloppe));
++		    end		
++	    end 
++	  end
++  end
++	%loop on arguments, if something other than result is asked, do
++	%it now
++	for j= 1:nargin-2
++		res_struct=model.(varargin{j});
++		fieldnames=fields(res_struct);
++		num_of_fields=length(fieldnames);
++		for k=1:num_of_fields
++			if ((numel(res_struct.(fieldnames{k})))==tot_points);
++				%paraview does not like NaN, replacing
++				nanval=find(isnan(res_struct.(fieldnames{k})));
++				res_struct.(fieldnames{k})(nanval)=-9999;
++				%also checking for verry small value that mess up
++				smallval=(abs(res_struct.(fieldnames{k}))<1.0e-20);
++				res_struct.(fieldnames{k})(smallval)=0.0;
++				fprintf(fid,'SCALARS %s float 1 \n',fieldnames{k});
++				fprintf(fid,'LOOKUP_TABLE default\n');
++				s='%e\n';
++				fprintf(fid,s,res_struct.(fieldnames{k})(IsEnveloppe));
++	    end		
++		end 
++	end
++	fclose(fid);
++end
+Index: ../trunk-jpl/src/m/contrib/paraview/exportVTK.py
+===================================================================
+--- ../trunk-jpl/src/m/contrib/paraview/exportVTK.py	(revision 0)
++++ ../trunk-jpl/src/m/contrib/paraview/exportVTK.py	(revision 18513)
+@@ -0,0 +1,131 @@
++import numpy
++
++def exportVTK(filename,model,options):
++    '''
++    vtk export
++    function exportVTK(filename,model)
++    creates a directory with the vtk files for displays in paraview
++    (only work for triangle and wedges based on their number of nodes)
++    
++    Give only the results for nw but could be extended to geometry, mask... 
++    
++    input: filename   destination 
++    (string)
++    ------------------------------------------------------------------
++    model      this is md 
++    ------------------------------------------------------------------
++    By default only the results are exported, you can add whichever
++    field you need as a string:
++    add 'geometry' to export md.geometry
++    
++    Basile de Fleurian:
++    '''
++
++[path,name,ext]=fileparts(filename)
++separator=filesep
++mkdir(filename)
++
++#get the element related variables
++points=[model.mesh.x model.mesh.y model.mesh.z]
++[num_of_points,dim]=numpy.size(points)
++[num_of_elt]=numpy.size(model.mesh.elements,1)
++[point_per_elt]=numpy.size(model.mesh.elements,2)
++
++#Select the type of element function of the number of nodes per elements
++if point_per_elt==3:
++    celltype=5 #triangles
++elif point_per_elt==6:
++    celltype=13 #wedges
++else:
++    error('Your Element definition is not taken into account \n')
++    
++#this is the result structure
++res_struct=model.results
++#Getting all the solutions of the model
++solnames=fields(res_struct)
++num_of_sols=numpy.length(solnames)
++num_of_timesteps=1
++#%building solutionstructure 
++for solution in num_of_sols:
++    sol_struct{i}=res_struct.(solnames{i});
++    #looking for multiple time steps
++    if(numpy.size(sol_struct{i},2)>num_of_timesteps):
++        num_of_timesteps=numpy.size(sol_struct{i},2);
++
++for step in num_of_timesteps:
++    
++    timestep=step
++    
++    fid = open(strcat(path,filesep,name,filesep,name,'.vtk',int2str(timestep),'.vtk'),'w+')
++    fid.write('# vtk DataFile Version 2.0 \n')
++    fid.write('Data for run %s \n' % model.miscellaneous.name)
++    fid.write('ASCII \n')
++    fid.write('DATASET UNSTRUCTURED_GRID \n')
++	
++    fid.write(fid,'POINTS %d float\n',num_of_points)
++    if(dim==3):
++        s='%f %f %f \n'
++    elif(dim==2):
++        s='%f %f \n'
++    
++    P=[points zeros(num_of_points,3-dim)]
++    fid.write(fid,s,transpose de P)
++	
++    fid.write('CELLS %d %d\n' % num_of_elt % num_of_elt*(point_per_elt+1))
++	s='%d'
++	for j=1:point_per_elt:
++            s=horzcat(s,{' %d'})
++        
++	s=cell2mat(horzcat(s,{'\n'}))
++	fid.write(fid,s,[(point_per_elt)*ones(num_of_elt,1) model.mesh.elements-1]transpose)
++	
++	fid.write(fid,'CELL_TYPES %d\n',num_of_elt)
++	s='%d\n'
++	fid.write(fid,s,celltype*ones(num_of_elt,1))
++	fid.write(fid,'POINT_DATA %s \n',num2str(num_of_points))
++
++	#loop over the different solution structures
++	for j=1:num_of_sols:
++            #dealing with results on different timesteps
++            if(numpy.size(sol_struct{j},2)>timestep):
++                timestep = step
++            else:
++                timestep = numpy.size(sol_struct{j},2)
++	  
++            #getting the number of fields in the solution
++            fieldnames=fields(sol_struct{j}(timestep))
++            num_of_fields=numpy.length(fieldnames)
++		
++            #check which field is a real result and print
++            for k=1:num_of_fields:
++                if ((numel(sol_struct{j}(timestep).(fieldnames{k})))==num_of_points):
++                    #paraview does not like NaN, replacing
++                    nanval=find(isnan(sol_struct{j}(timestep).(fieldnames{k})))
++                    sol_struct{j}(timestep).(fieldnames{k})(nanval)=-9999
++                    #also checking for verry small value that mess up
++                    smallval=(abs(sol_struct{j}(timestep).(fieldnames{k}))<1.0e-20)
++                    sol_struct{j}(timestep).(fieldnames{k})(smallval)=0.0
++                    fid.write('SCALARS %s float 1 \n' % fieldnames{k})
++                    fid.write('LOOKUP_TABLE default\n')
++                    s='%e\n'
++                    fid.write(s % sol_struct{j}(timestep).(fieldnames{k}))
++                    
++                    #loop on arguments, if something other than result is asked, do
++                    #it now
++                for j= 1:nargin-2:
++                    res_struct=model.(varargin{j})
++                    fieldnames=fields(res_struct)
++                    num_of_fields=numpy.length(fieldnames)
++                    for k=1:num_of_fields:
++			if ((numel(res_struct.(fieldnames{k})))==num_of_points)
++				#paraview does not like NaN, replacing
++				nanval=find(isnan(res_struct.(fieldnames{k})))
++				res_struct.(fieldnames{k})(nanval)=-9999
++				#also checking for verry small value that mess up
++				smallval=(abs(res_struct.(fieldnames{k}))<1.0e-20)
++				res_struct.(fieldnames{k})(smallval)=0.0
++				fid.write(fid,'SCALARS %s float 1 \n',fieldnames{k})
++				fid.write(fid,'LOOKUP_TABLE default\n')
++				s='%e\n'
++				fid.write(fid,s,res_struct.(fieldnames{k}))
++	fid.close();
Index: /issm/oecreview/Archive/18296-19100/ISSM-18515-18516.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18515-18516.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18515-18516.diff	(revision 19102)
@@ -0,0 +1,30 @@
+Index: ../trunk-jpl/src/m/contrib/paraview/exportVTK.py
+===================================================================
+--- ../trunk-jpl/src/m/contrib/paraview/exportVTK.py	(revision 18515)
++++ ../trunk-jpl/src/m/contrib/paraview/exportVTK.py	(revision 18516)
+@@ -26,9 +26,9 @@
+ 
+ #get the element related variables
+ if model.mesh.shape[0]==2:
+-    points=[model.mesh.x model.mesh.y zeros(model.mesh.numberofvertices,1)];
++    points=[model.mesh.x,model.mesh.y,zeros(model.mesh.numberofvertices,1)];
+ else:
+-    points=[model.mesh.x model.mesh.y model.mesh.z]
++    points=[model.mesh.x,model.mesh.y,model.mesh.z]
+ 
+ [num_of_points,dim]=numpy.size(points)
+ [num_of_elt]=numpy.size(model.mesh.elements,1)
+@@ -51,10 +51,10 @@
+     num_of_timesteps=1
+     #%building solutionstructure 
+     for solution in num_of_sols:
+-        sol_struct{i}=res_struct.(solnames{i});
++        sol_struct[i]=res_struct.(solnames[i]);
+         #looking for multiple time steps
+-        if(numpy.size(sol_struct{i},2)>num_of_timesteps):
+-            num_of_timesteps=numpy.size(sol_struct{i},2);
++        if(numpy.size(sol_struct[i],2)>num_of_timesteps):
++            num_of_timesteps=numpy.size(sol_struct[i],2);
+ 
+ else:
+     num_of_timesteps=1
Index: /issm/oecreview/Archive/18296-19100/ISSM-18516-18517.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18516-18517.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18516-18517.diff	(revision 19102)
@@ -0,0 +1,25 @@
+Index: ../trunk-jpl/test/Archives/Archive432.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive325.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive431.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18516)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18517)
+@@ -587,7 +587,7 @@
+ 		pressure_input->GetInputValue(&pressure,gauss);
+ 		watercolumn_input->GetInputValue(&watercolumn,gauss);
+ 
+-		if((watercolumn<=0.) && (enthalpy<PureIceEnthalpy(element,pressure))){
++		if((dt==0.) || ((watercolumn<=0.) && (enthalpy<PureIceEnthalpy(element,pressure)))){
+ 			/* the above check is equivalent to 
+ 			 NOT [(watercolumn>0.) AND (enthalpy<PIE)] AND (enthalpy<PIE)*/
+ 			geothermalflux_input->GetInputValue(&geothermalflux,gauss);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18517-18518.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18517-18518.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18517-18518.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/jenkins/jenkins.sh
+===================================================================
+--- ../trunk-jpl/jenkins/jenkins.sh	(revision 18517)
++++ ../trunk-jpl/jenkins/jenkins.sh	(revision 18518)
+@@ -189,7 +189,7 @@
+ 	exit
+ EOF
+ 	cd $ISSM_DIR/test/NightlyRun
+-	matlab -nojvm -nosplash -r "addpath $ISSM_DIR/src/m/dev; devpath; addpath $ISSM_DIR/nightlylog/; matlab_run$i" -logfile $ISSM_DIR/nightlylog/matlab_log$i.log &
++	$MATLAB_PATH/bin/matlab -nojvm -nosplash -r "addpath $ISSM_DIR/src/m/dev; devpath; addpath $ISSM_DIR/nightlylog/; matlab_run$i" -logfile $ISSM_DIR/nightlylog/matlab_log$i.log &
+ done
+ 
+ #wait until matlab closes
Index: /issm/oecreview/Archive/18296-19100/ISSM-18518-18519.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18518-18519.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18518-18519.diff	(revision 19102)
@@ -0,0 +1,29 @@
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 18518)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 18519)
+@@ -126,9 +126,9 @@
+ 				end
+ 			end
+ 			%2014 September 11
+-			if (md.seaice==0);
++			if isa(md.seaice,'double');
+ 				md.seaice=seaice()
+-	    end
++			end
+ 		end% }}}
+ 	end
+ 	methods
+@@ -148,8 +148,10 @@
+ 						md.initialization  = seaiceinitialization();
+ 
+ 						%Change some of the defauls
+-						md.timestepping.in_years = false;
+-						md.constants.g           = 9.80616; %Same as TOPAZ
++						md.timestepping.in_years   = false;
++						md.timestepping.time_step  = 600;
++						md.timestepping.final_time = 600;
++						md.constants.g             = 9.80616; %Same as TOPAZ
+ 					else
+ 						error('model constructor not supported yet');
+ 					end
Index: /issm/oecreview/Archive/18296-19100/ISSM-18519-18520.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18519-18520.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18519-18520.diff	(revision 19102)
@@ -0,0 +1,26 @@
+Index: ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18519)
++++ ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18520)
+@@ -440,7 +440,7 @@
+ 	IssmDouble f = exp(ridging_exponent*(1.-concentration));
+ 	IssmDouble E = young_modulus*(1.-damage)*f;
+ 
+-	/*Let's build C = hE*D */
++	/*Let's build C = E*D */
+ 	for(int i=0;i<3;i++){
+ 		for(int j=0;j<3;j++){
+ 			C[i*3+j] = E*D[i][j];
+@@ -471,8 +471,10 @@
+ 		B[2*numnodes*0+2*i+1] = 0.;
+ 		B[2*numnodes*1+2*i+0] = 0.;
+ 		B[2*numnodes*1+2*i+1] = dbasis[1*numnodes+i];
+-		B[2*numnodes*2+2*i+0] = .5*dbasis[1*numnodes+i];
+-		B[2*numnodes*2+2*i+1] = .5*dbasis[0*numnodes+i];
++		//B[2*numnodes*2+2*i+0] = .5*dbasis[1*numnodes+i];
++		//B[2*numnodes*2+2*i+1] = .5*dbasis[0*numnodes+i];
++		B[2*numnodes*2+2*i+0] = dbasis[1*numnodes+i];
++		B[2*numnodes*2+2*i+1] = dbasis[0*numnodes+i];
+ 	}
+ 
+ 	/*Clean-up*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18520-18521.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18520-18521.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18520-18521.diff	(revision 19102)
@@ -0,0 +1,2594 @@
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18521)
+@@ -398,7 +398,7 @@
+ 	
+ 	/* set NaN on elements intersected by zero levelset */
+ 	for(i=0;i<femmodel->elements->Size();i++){
+-		element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		if(element->IsZeroLevelset(MaskIceLevelsetEnum))
+ 			for(k=0;k<element->GetNumberOfVertices();k++)
+ 				vec_dist_zerolevelset->SetValue(element->vertices[k]->Sid(),NAN,INS_VAL); 
+@@ -406,7 +406,7 @@
+ 
+ 	/* set distance on elements intersected by zero levelset */
+ 	for(i=0;i<femmodel->elements->Size();i++){
+-		element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		if(element->IsZeroLevelset(MaskIceLevelsetEnum)){
+ 			SetDistanceToZeroLevelsetElement(vec_dist_zerolevelset, element);
+ 
+Index: ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18521)
+@@ -371,7 +371,7 @@
+ 	/*Step 1: update mask of active nodes*/
+ 	mask=new Vector<IssmDouble>(femmodel->nodes->NumberOfNodes(SeaiceAnalysisEnum));
+ 	for (int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 
+ 		/*Get current concentration of element and decide whether it is an active element*/
+ 		int    numnodes            = element->GetNumberOfNodes();
+@@ -389,7 +389,7 @@
+ 	/*Update node activation accordingly*/
+ 	int counter =0;
+ 	for(int i=0;i<femmodel->nodes->Size();i++){
+-		Node* node=dynamic_cast<Node*>(femmodel->nodes->GetObjectByOffset(i));
++		Node* node=xDynamicCast<Node*>(femmodel->nodes->GetObjectByOffset(i));
+ 		if(node->InAnalysis(SeaiceAnalysisEnum)){
+ 			if(serial_mask[node->Sid()]==1.){
+ 				node->Activate();
+@@ -551,7 +551,7 @@
+ 
+ 	/*Loop over the elements of this partition and update accordingly*/
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 
+ 		/*Get Mohr-Coulomb parameters*/
+ 		compression_coef = element->GetMaterialParameter(MaterialsCompressionCoefEnum);
+@@ -643,7 +643,7 @@
+ 
+ 	/*Loop over the elements of this partition and update accordingly*/
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 
+ 		/*Get some inputs needed for the update*/
+ 		element->GetVerticesCoordinates(&xyz_list);
+Index: ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18521)
+@@ -795,7 +795,7 @@
+ 
+ 	/*Create and assemble matrix*/
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element*       element = dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element*       element = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		ElementMatrix* MLe     = this->CreateMassMatrix(element);
+ 		if(MLe){
+ 			MLe->Lump();
+@@ -816,7 +816,7 @@
+ 
+ 	/*Create and assemble matrix*/
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element*       element = dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element*       element = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		ElementMatrix* MLe     = this->CreateMassMatrix(element);
+ 		if(MLe){
+ 			MLe->AddToGlobal(Mff);
+@@ -879,7 +879,7 @@
+ 
+ 	/*Create and assemble matrix*/
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element*       element = dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element*       element = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		ElementMatrix* Ke     = this->CreateFctKMatrix(element);
+ 		if(Ke) Ke->AddToGlobal(Kff,Kfs);
+ 		delete Ke;
+Index: ../trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.cpp	(revision 18521)
+@@ -368,7 +368,7 @@
+ 
+ 	/* deactivate all spcs */
+ 	for(i=0;i<femmodel->elements->Size();i++){
+-		element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		for(k=0;k<element->GetNumberOfNodes();k++){
+ 			node=element->GetNode(k);
+ 			if(node->IsActive()){
+@@ -381,7 +381,7 @@
+ 
+ 	/* reactivate spcs on elements intersected by zero levelset */
+ 	for(i=0;i<femmodel->elements->Size();i++){
+-		element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		if(element->IsZeroLevelset(MaskIceLevelsetEnum)){
+ 			/*iterate over nodes and set spc */
+ 			numnodes=element->GetNumberOfNodes();
+@@ -413,7 +413,7 @@
+ 	
+ 	/* set distance on elements intersected by zero levelset */
+ 	for(i=0;i<femmodel->elements->Size();i++){
+-		element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		if(element->IsZeroLevelset(MaskIceLevelsetEnum)){
+ 			SetDistanceToZeroLevelsetElement(vec_dist_zerolevelset, element);
+ 		}
+Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18521)
+@@ -5031,7 +5031,7 @@
+ 	parameters->FindParam(&dim,DomainDimensionEnum);
+ 
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 
+ 		/*Get inputs and parameters*/
+ 		element->GetVerticesCoordinates(&xyz_list);
+@@ -5205,7 +5205,7 @@
+ 	else       tausize = 6;
+ 
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 
+ 		/*Get inputs and parameters*/
+ 		element->GetVerticesCoordinates(&xyz_list);
+@@ -5418,7 +5418,7 @@
+ 	else       tausize = 6;
+ 
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 
+ 		/*Get inputs and parameters*/
+ 		element->GetVerticesCoordinates(&xyz_list);
+@@ -6787,7 +6787,7 @@
+ 
+ 	/*Cast gauss to GaussPenta*/
+ 	_assert_(gauss_in->Enum()==GaussPentaEnum);
+-	GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in);
++	GaussPenta* gauss = xDynamicCast<GaussPenta*>(gauss_in);
+ 
+ 	/*Get basis in actual coordinate system: */
+ 	basis[0]=gauss->coord1*(1-gauss->coord4)/2.0;
+@@ -6836,7 +6836,7 @@
+ 
+ 	/*Cast gauss to GaussPenta*/
+ 	_assert_(gauss_in->Enum()==GaussPentaEnum);
+-	GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in);
++	GaussPenta* gauss = xDynamicCast<GaussPenta*>(gauss_in);
+ 
+ 	/*Get basis in actual coordinate system: */
+ 	basis[0]=gauss->coord1*(1-gauss->coord4)/2.0;
+@@ -6935,7 +6935,7 @@
+ 
+ 	/*Cast gauss to GaussPenta*/
+ 	_assert_(gauss_in->Enum()==GaussPentaEnum);
+-	GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in);
++	GaussPenta* gauss = xDynamicCast<GaussPenta*>(gauss_in);
+ 
+ 	/*Get basis in actual coordinate system: */
+ 	basis[0]=gauss->coord1*(1-gauss->coord4)/2.0;
+@@ -6973,7 +6973,7 @@
+ 
+ 	/*Cast gauss to GaussPenta*/
+ 	_assert_(gauss_in->Enum()==GaussPentaEnum);
+-	GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in);
++	GaussPenta* gauss = xDynamicCast<GaussPenta*>(gauss_in);
+ 
+ 	/*Get basis in actual coordinate system: */
+ 	basis[0]=gauss->coord1*(1-gauss->coord4)/2.0;
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18521)
+@@ -691,7 +691,7 @@
+ 	Element* element=NULL;
+ 
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 
+ 		int numvertices = element->GetNumberOfVertices();
+ 		Input* node_mask_input = element->GetInput(HydrologydcMaskEplactiveNodeEnum);
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18521)
+@@ -879,7 +879,7 @@
+ 	if(isdrainage){
+ 		/*Drain excess water fraction in ice column: */
+ 		for(i=0;i<femmodel->elements->Size();i++){
+-			Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++			Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 			DrainWaterfractionIcecolumn(element);
+ 		}
+ 	}
+@@ -887,7 +887,7 @@
+ 	if(computebasalmeltingrates){
+ 		/*Compute basal melting rates: */
+ 		for(i=0;i<femmodel->elements->Size();i++){
+-			Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++			Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 			ComputeBasalMeltingrate(element);
+ 		}
+ 	}
+@@ -897,7 +897,7 @@
+ 		femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
+ 		if(solution_type==TransientSolutionEnum){
+ 			for(i=0;i<femmodel->elements->Size();i++){
+-				Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++				Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 				UpdateBasalConstraints(element);
+ 			}
+ 		}
+Index: ../trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.cpp	(revision 18521)
+@@ -376,7 +376,7 @@
+ 
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+ 
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		if(!element->IsOnBase()) continue;
+ 
+ 		int             numnodes = element->GetNumberOfNodes();
+Index: ../trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp	(revision 18521)
+@@ -349,7 +349,7 @@
+ void ExtrapolationAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		this->SetConstraintsOnIce(element);
+ 	}
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/main/kriging.cpp
+===================================================================
+--- ../trunk-jpl/src/c/main/kriging.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/main/kriging.cpp	(revision 18521)
+@@ -57,7 +57,7 @@
+ 		results->AddObject(new GenericExternalResult<double*>(results->Size()+1,0,predictions,ninterp,1,1,0));
+ 		results->AddObject(new GenericExternalResult<double*>(results->Size()+1,1,error,ninterp,1,1,0));
+ 		for(int i=0;i<results->Size();i++){
+-			ExternalResult* result=dynamic_cast<ExternalResult*>(results->GetObjectByOffset(i));
++			ExternalResult* result=xDynamicCast<ExternalResult*>(results->GetObjectByOffset(i));
+ 			result->WriteData(output_fid,1);
+ 		}
+ 		pfclose(output_fid,outbinfilename);
+Index: ../trunk-jpl/src/c/shared/Numerics/recast.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Numerics/recast.h	(revision 18520)
++++ ../trunk-jpl/src/c/shared/Numerics/recast.h	(revision 18521)
+@@ -39,4 +39,15 @@
+ 
+ #endif
+ 
++/*Morlighem's change: we do not want dynamic_casts because of performance
++ * issue, so for now, we just use C-like cast*/
++template<class To,class From> To xDynamicCast(const From& from) {
++
++	/*C-like cast (fast but not safe)*/
++	return (To) from;
++
++	/*C++ dynamic_cast, poor performance but safer*/
++	//return dynamic_cast<To>(from);
++}
++
+ #endif
+Index: ../trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp	(revision 18521)
+@@ -21,7 +21,7 @@
+ 	femmodel->parameters->FindParam(&domaintype,DomainTypeEnum);
+ 
+ 	for(i=0;i<elements->Size();i++){
+-		Element    *element  = dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element    *element  = xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		int         numnodes = element->GetNumberOfNodes();
+ 		IssmDouble *mask     = xNew<IssmDouble>(numnodes);
+ 		// include switch for elements with multiple different sets of nodes
+@@ -103,7 +103,7 @@
+ 	Vector<IssmDouble>* vec_mask_ice=new Vector<IssmDouble>(numvertices); //vertices that have ice at next time step
+ 	/*Fill vector with values: */
+ 	for(i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		SetMaskOfIceElement(vec_mask_ice, element);
+ 	}
+ 
+Index: ../trunk-jpl/src/c/modules/InputUpdateFromMatrixDakotax/InputUpdateFromMatrixDakotax.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/InputUpdateFromMatrixDakotax/InputUpdateFromMatrixDakotax.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/InputUpdateFromMatrixDakotax/InputUpdateFromMatrixDakotax.cpp	(revision 18521)
+@@ -19,7 +19,7 @@
+ 
+ 		/*Update elements, nodes, loads and materials from inputs: */
+ 		for(i=0;i<femmodel->elements->Size();i++){
+-			Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++			Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 			element->InputUpdateFromMatrixDakota(matrix,nrows,ncols,name,type);
+ 		}
+ 		for(i=0;i<femmodel->loads->Size();i++){
+Index: ../trunk-jpl/src/c/modules/AverageOntoPartitionx/AverageOntoPartitionx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/AverageOntoPartitionx/AverageOntoPartitionx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/AverageOntoPartitionx/AverageOntoPartitionx.cpp	(revision 18521)
+@@ -40,7 +40,7 @@
+ 
+ 	/*loop on each element, and add contribution of the element to the partition (surface weighted average): */
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		element->AverageOntoPartition(partition_contributions,partition_areas,vertex_response,qmu_part);
+ 	}
+ 
+Index: ../trunk-jpl/src/c/modules/InputUpdateFromVectorx/InputUpdateFromVectorx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/InputUpdateFromVectorx/InputUpdateFromVectorx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/InputUpdateFromVectorx/InputUpdateFromVectorx.cpp	(revision 18521)
+@@ -19,7 +19,7 @@
+ 
+ 	/*Update elements, nodes, loads and materials from inputs: */
+ 	for(i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		element->InputUpdateFromVector(vector,name,type);
+ 	}
+ 	for(i=0;i<femmodel->loads->Size();i++){
+Index: ../trunk-jpl/src/c/modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.cpp	(revision 18521)
+@@ -19,7 +19,7 @@
+ 	/*Now, go through the output definitions, and retrieve the object which corresponds to our requested response, output_string: */
+ 	for(int i=0;i<output_definitions->Size();i++){
+ 		
+-		definition=dynamic_cast<Definition*>(output_definitions->GetObjectByOffset(i));
++		definition=xDynamicCast<Definition*>(output_definitions->GetObjectByOffset(i));
+ 
+ 		char* name = definition->Name();
+ 		if (strcmp(name,output_string)==0){
+Index: ../trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp	(revision 18521)
+@@ -46,7 +46,7 @@
+ 
+ 	/*Migrate grounding line : */
+ 	for(int i=0;i<elements->Size();i++){
+-		element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		element->MigrateGroundingLine(phi_ungrounding);
+ 	}
+ 
+@@ -71,7 +71,7 @@
+ 
+ 	/*Fill vector vertices_potentially_floating: */
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		element->FSContactMigration(vertexgrounded,vertexfloating);
+ 	}
+ 
+@@ -119,7 +119,7 @@
+ 
+ 	/*Fill vector vertices_potentially_floating: */
+ 	for(i=0;i<elements->Size();i++){
+-		element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		element->PotentialUngrounding(vec_vertices_potentially_ungrounding);
+ 	}
+ 
+@@ -147,7 +147,7 @@
+ 	/*recover vec_phi*/
+ 	vec_phi=new Vector<IssmDouble>(vertices->NumberOfVertices());
+ 	for(i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		element->GetVectorFromInputs(vec_phi,MaskGroundediceLevelsetEnum);
+ 	}
+ 	vec_phi->Assemble();
+@@ -161,7 +161,7 @@
+ 
+ 		/*Figure out if any of the nodes of the element will be floating -> elements neighbouting the floating ice*/
+ 		for(i=0;i<elements->Size();i++){
+-			element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++			element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 			vec_elements_neighboring_floatingice->SetValue(element->Sid(),element->IsNodeOnShelfFromFlags(phi)?1.0:0.0,INS_VAL);
+ 		}
+ 
+@@ -172,7 +172,7 @@
+ 		/*Go through elements_neighboring_floatingce, and update vector of the nodes that will start floating*/
+ 		local_nflipped=0;
+ 		for(i=0;i<elements->Size();i++){
+-			element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++			element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 			if(reCast<int,IssmDouble>(elements_neighboring_floatingce[element->Sid()])){
+ 				local_nflipped+=element->UpdatePotentialUngrounding(vertices_potentially_ungrounding,vec_phi,phi);
+ 			}
+Index: ../trunk-jpl/src/c/modules/AllocateSystemMatricesx/AllocateSystemMatricesx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/AllocateSystemMatricesx/AllocateSystemMatricesx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/AllocateSystemMatricesx/AllocateSystemMatricesx.cpp	(revision 18521)
+@@ -133,7 +133,7 @@
+ 
+ 	k=0;
+ 	for(i=0;i<femmodel->elements->Size();i++){
+-		element = dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		element = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		lidlist = xNew<int>(element->GetNumberOfNodes());
+ 		element->GetNodesLidList(lidlist);
+ 
+@@ -156,7 +156,7 @@
+ 	count2offset_l = xNew<int>(femmodel->loads->Size(configuration_type)*numnodesperload);
+ 	k=0;
+ 	for(i=0;i<femmodel->loads->Size();i++){
+-		load = dynamic_cast<Load*>(femmodel->loads->GetObjectByOffset(i));
++		load = xDynamicCast<Load*>(femmodel->loads->GetObjectByOffset(i));
+ 		if(!load->InAnalysis(configuration_type)) continue;
+ 		lidlist = xNew<int>(load->GetNumberOfNodes());
+ 		load->GetNodesLidList(lidlist);
+@@ -189,7 +189,7 @@
+ 
+ 	/*Create connectivity vector*/
+ 	for(i=0;i<femmodel->nodes->Size();i++){
+-		Node* node=dynamic_cast<Node*>(femmodel->nodes->GetObjectByOffset(i));
++		Node* node=xDynamicCast<Node*>(femmodel->nodes->GetObjectByOffset(i));
+ 		if(node->InAnalysis(configuration_type)){
+ 
+ 			/*Reinitialize flags to false*/
+@@ -213,7 +213,7 @@
+ 			//}
+ 			for(j=head_e[node->Lid()];j!=-1;j=next_e[j]){
+ 				offset=count2offset_e[j];
+-				element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(offset));
++				element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(offset));
+ 				element->SetwiseNodeConnectivity(&d_nz,&o_nz,node,flags,flagsindices,set1enum,set2enum);
+ 				if(node->IsClone()){
+ 					connectivity_clone[node->Sid()]+=d_nz+o_nz;
+@@ -225,7 +225,7 @@
+ 			}
+ 			for(j=head_l[node->Lid()];j!=-1;j=next_l[j]){
+ 				offset=count2offset_l[j];
+-				load=dynamic_cast<Load*>(femmodel->loads->GetObjectByOffset(offset));
++				load=xDynamicCast<Load*>(femmodel->loads->GetObjectByOffset(offset));
+ 				load->SetwiseNodeConnectivity(&d_nz,&o_nz,node,flags,flagsindices,set1enum,set2enum);
+ 				if(node->IsClone()){
+ 					connectivity_clone[node->Sid()]+=d_nz+o_nz;
+@@ -255,7 +255,7 @@
+ 		d_nnz=xNew<int>(m);
+ 		o_nnz=xNew<int>(m);
+ 		for(i=0;i<femmodel->nodes->Size();i++){
+-			Node* node=dynamic_cast<Node*>(femmodel->nodes->GetObjectByOffset(i));
++			Node* node=xDynamicCast<Node*>(femmodel->nodes->GetObjectByOffset(i));
+ 			if(node->InAnalysis(configuration_type) && !node->IsClone()){
+ 				for(j=0;j<node->indexing.fsize;j++){
+ 					_assert_(count<m);
+Index: ../trunk-jpl/src/c/modules/InputDuplicatex/InputDuplicatex.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/InputDuplicatex/InputDuplicatex.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/InputDuplicatex/InputDuplicatex.cpp	(revision 18521)
+@@ -10,7 +10,7 @@
+ void InputDuplicatex(FemModel* femmodel,int original_enum, int new_enum){
+ 	/*Go through elemnets, and ask to reinitialie the input: */
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		element->InputDuplicate(original_enum,new_enum);
+ 	}
+ }
+Index: ../trunk-jpl/src/c/modules/InputExtrudex/InputExtrudex.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/InputExtrudex/InputExtrudex.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/InputExtrudex/InputExtrudex.cpp	(revision 18521)
+@@ -9,7 +9,7 @@
+ 
+ void InputExtrudex(FemModel* femmodel,int input_enum,int start){
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		element->InputExtrude(input_enum,start);
+ 	}
+ }
+Index: ../trunk-jpl/src/c/modules/GetSolutionFromInputsx/GetSolutionFromInputsx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/GetSolutionFromInputsx/GetSolutionFromInputsx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/GetSolutionFromInputsx/GetSolutionFromInputsx.cpp	(revision 18521)
+@@ -31,7 +31,7 @@
+ 	/*Go through elements and plug solution: */
+ 	Analysis* analysis = EnumToAnalysis(analysisenum);
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		analysis->GetSolutionFromInputs(solution,element);
+ 	}
+ 	delete analysis;
+Index: ../trunk-jpl/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp	(revision 18521)
+@@ -16,7 +16,7 @@
+ 
+ 	/*Compute Misfit: */
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		J+=SurfaceAverageVelMisfit(element);
+ 	}
+ 
+Index: ../trunk-jpl/src/c/modules/InputScalex/InputScalex.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/InputScalex/InputScalex.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/InputScalex/InputScalex.cpp	(revision 18521)
+@@ -14,7 +14,7 @@
+ 
+ 	/*Go through elemnets, and ask to reinitialie the input: */
+ 	for(i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		element->InputScale(enum_type,scale_factor);
+ 	}
+ 
+Index: ../trunk-jpl/src/c/modules/SurfaceAreax/SurfaceAreax.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/SurfaceAreax/SurfaceAreax.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/SurfaceAreax/SurfaceAreax.cpp	(revision 18521)
+@@ -19,7 +19,7 @@
+ 
+ 	/*Compute gradients: */
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		S+=element->SurfaceArea();
+ 	}
+ 
+Index: ../trunk-jpl/src/c/modules/InputUpdateFromSolutionx/InputUpdateFromSolutionx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/InputUpdateFromSolutionx/InputUpdateFromSolutionx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/InputUpdateFromSolutionx/InputUpdateFromSolutionx.cpp	(revision 18521)
+@@ -29,7 +29,7 @@
+ 
+ 	Analysis* analysis = EnumToAnalysis(analysisenum);
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		analysis->InputUpdateFromSolution(solution,element);
+ 	}
+ 	delete analysis;
+Index: ../trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp	(revision 18521)
+@@ -18,7 +18,7 @@
+ 
+ 		/*Look up in elements*/
+ 		for(i=0;i<femmodel->elements->Size();i++){
+-			Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++			Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 			element->GetVectorFromInputs(vector,name);
+ 		}
+ 	}
+Index: ../trunk-jpl/src/c/modules/ThicknessAlongGradientx/ThicknessAlongGradientx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ThicknessAlongGradientx/ThicknessAlongGradientx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/ThicknessAlongGradientx/ThicknessAlongGradientx.cpp	(revision 18521)
+@@ -15,7 +15,7 @@
+ 
+ 	/*Compute Misfit: */
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		J+=ThicknessAlongGradient(element);
+ 	}
+ 
+Index: ../trunk-jpl/src/c/modules/NodalValuex/NodalValuex.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/NodalValuex/NodalValuex.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/NodalValuex/NodalValuex.cpp	(revision 18521)
+@@ -19,7 +19,7 @@
+ 	/*This is the vertex id for which we want to collect the data. Go through elements, and for each 
+ 	 *element, figure out  if they hold the vertex, and the data. If so, return it: */
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		found=element->NodalValue(&value,index,natureofdataenum);
+ 		if(found){
+ 			cpu_found=IssmComm::GetRank();
+Index: ../trunk-jpl/src/c/modules/ConfigureObjectsx/ConfigureObjectsx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ConfigureObjectsx/ConfigureObjectsx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/ConfigureObjectsx/ConfigureObjectsx.cpp	(revision 18521)
+@@ -23,7 +23,7 @@
+ 
+ 	if(VerboseMProcessor()) _printf0_("      Configuring elements...\n");
+ 	for(i=0;i<elements->Size();i++){
+-		element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		element->Configure(elements,loads,nodes,vertices,materials,parameters);
+ 	}
+ 	if(VerboseMProcessor()) _printf0_("      Configuring loads...\n");
+Index: ../trunk-jpl/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp	(revision 18521)
+@@ -15,7 +15,7 @@
+ 
+ 	/*Compute Misfit: */
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		J+=ThicknessAbsMisfit(element);
+ 	}
+ 
+Index: ../trunk-jpl/src/c/modules/InputUpdateFromVectorDakotax/InputUpdateFromVectorDakotax.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/InputUpdateFromVectorDakotax/InputUpdateFromVectorDakotax.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/InputUpdateFromVectorDakotax/InputUpdateFromVectorDakotax.cpp	(revision 18521)
+@@ -21,7 +21,7 @@
+ 
+ 	/*Update elements, nodes, loads and materials from inputs: */
+ 	for(i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		element->InputUpdateFromVectorDakota(vector,name,type);
+ 	}
+ 	for(i=0;i<femmodel->loads->Size();i++){
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 18521)
+@@ -83,7 +83,7 @@
+ 
+ 					/*Now, for this particular misfit object, make sure we plug into the elements: the observation, and the weights.*/
+ 					for(i=0;i<elements->Size();i++){
+-						Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++						Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 						element->InputCreate(misfit_observation_s[j], iomodel,misfit_observation_M_s[j],misfit_observation_N_s[j],1,misfit_observation_enum_s[j],7);
+ 						element->InputCreate(misfit_weights_s[j], iomodel,misfit_weights_M_s[j],misfit_weights_N_s[j],1,misfit_weights_enum_s[j],7);
+ 					}
+Index: ../trunk-jpl/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp	(revision 18521)
+@@ -15,7 +15,7 @@
+ 
+ 	/*Compute Misfit: */
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		J+=SurfaceLogVxVyMisfit(element);
+ 	}
+ 
+Index: ../trunk-jpl/src/c/modules/InputControlUpdatex/InputControlUpdatex.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/InputControlUpdatex/InputControlUpdatex.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/InputControlUpdatex/InputControlUpdatex.cpp	(revision 18521)
+@@ -11,7 +11,7 @@
+ 
+ 	/*Go through elemnets, and ask to carry out the operation on inputs: */
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		element->InputControlUpdate(scalar,save_parameter);
+ 	}
+ }
+Index: ../trunk-jpl/src/c/modules/SystemMatricesx/SystemMatricesx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/SystemMatricesx/SystemMatricesx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/SystemMatricesx/SystemMatricesx.cpp	(revision 18521)
+@@ -39,7 +39,7 @@
+ 
+ 		/*Get complete stiffness matrix without penalties*/
+ 		for (i=0;i<femmodel->elements->Size();i++){
+-			element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++			element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 			ElementMatrix* Ke = analysis->CreateKMatrix(element);
+ 			ElementVector* pe = analysis->CreatePVector(element);
+ 			element->ReduceMatrices(Ke,pe);
+@@ -49,7 +49,7 @@
+ 		}
+ 
+ 		for (i=0;i<femmodel->loads->Size();i++){
+-			load=dynamic_cast<Load*>(femmodel->loads->GetObjectByOffset(i));
++			load=xDynamicCast<Load*>(femmodel->loads->GetObjectByOffset(i));
+ 			if(load->InAnalysis(configuration_type)) load->CreateKMatrix(Kff_temp,NULL);
+ 		}
+ 		Kff_temp->Assemble();
+@@ -70,7 +70,7 @@
+ 
+ 	/*Fill stiffness matrix and load vector from elements*/
+ 	for (i=0;i<femmodel->elements->Size();i++){
+-		element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		ElementMatrix* Ke = analysis->CreateKMatrix(element);
+ 		ElementVector* pe = analysis->CreatePVector(element);
+ 		element->ReduceMatrices(Ke,pe);
+@@ -84,7 +84,7 @@
+ 
+ 	/*Fill stiffness matrix and load vector from loads*/
+ 	for(i=0;i<femmodel->loads->Size();i++){
+-		load=dynamic_cast<Load*>(femmodel->loads->GetObjectByOffset(i));
++		load=xDynamicCast<Load*>(femmodel->loads->GetObjectByOffset(i));
+ 		if(load->InAnalysis(configuration_type)){
+ 			load->CreateKMatrix(Kff,Kfs);
+ 			load->CreatePVector(pf);
+@@ -94,7 +94,7 @@
+ 	/*Now deal with penalties (only in loads)*/
+ 	if(femmodel->loads->IsPenalty(configuration_type)){
+ 		for (i=0;i<femmodel->loads->Size();i++){
+-			load=dynamic_cast<Load*>(femmodel->loads->GetObjectByOffset(i));
++			load=xDynamicCast<Load*>(femmodel->loads->GetObjectByOffset(i));
+ 			if(load->InAnalysis(configuration_type)){
+ 				load->PenaltyCreateKMatrix(Kff,Kfs,kmax);
+ 				load->PenaltyCreatePVector(pf,kmax);
+@@ -105,7 +105,7 @@
+ 	/*Create dof vector for stiffness matrix preconditioning*/
+ 	if(pdf){
+ 		for(i=0;i<femmodel->elements->Size();i++){
+-			element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++			element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 			ElementVector* de=analysis->CreateDVector(element);
+ 			if(de) de->InsertIntoGlobal(df);
+ 			delete de;
+Index: ../trunk-jpl/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp	(revision 18521)
+@@ -15,7 +15,7 @@
+ 
+ 	/*Compute Misfit: */
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		J+=SurfaceLogVelMisfit(element);
+ 	}
+ 
+Index: ../trunk-jpl/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp	(revision 18521)
+@@ -15,7 +15,7 @@
+ 
+ 	/*Compute Misfit: */
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		J+=SurfaceRelVelMisfit(element);
+ 	}
+ 
+Index: ../trunk-jpl/src/c/modules/CreateJacobianMatrixx/CreateJacobianMatrixx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/CreateJacobianMatrixx/CreateJacobianMatrixx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/CreateJacobianMatrixx/CreateJacobianMatrixx.cpp	(revision 18521)
+@@ -28,7 +28,7 @@
+ 
+ 	/*Create and assemble matrix*/
+ 	for(i=0;i<femmodel->elements->Size();i++){
+-		element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		ElementMatrix* Je = analysis->CreateJacobianMatrix(element);
+ 		if(Je) Je->AddToGlobal(Jff);
+ 		delete Je;
+Index: ../trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp	(revision 18521)
+@@ -32,7 +32,7 @@
+ void LinearFloatingiceMeltingRatex(FemModel* femmodel){/*{{{*/
+ 
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		element->LinearFloatingiceMeltingRate();
+ 	}
+ 
+Index: ../trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 18521)
+@@ -63,7 +63,7 @@
+ 
+ 	/*Loop over all the elements of this partition*/
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 
+ 		/*Allocate all arrays*/
+ 		int         numvertices = element->GetNumberOfVertices();
+@@ -112,7 +112,7 @@
+ void Delta18oParameterizationx(FemModel* femmodel){/*{{{*/
+ 
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		element->Delta18oParameterization();
+ 	}
+ 
+@@ -203,7 +203,7 @@
+ 	//     *******END initialize PDD
+ 
+ 	for(i=0;i<femmodel->elements->Size();i++){
+-		element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		element->PositiveDegreeDay(pdds,pds,signorm);
+ 	}
+ 
+@@ -233,7 +233,7 @@
+     
+ 	/*Loop over all the elements of this partition*/
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 
+ 		/*Get reference SMB (uncorrected) and allocate all arrays*/
+ 		int         numvertices = element->GetNumberOfVertices();
+@@ -291,7 +291,7 @@
+ 
+ 	/*Loop over all the elements of this partition*/
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 
+ 		/*Allocate all arrays*/
+ 		int         numvertices = element->GetNumberOfVertices();
+@@ -332,7 +332,7 @@
+ 
+ 	/*Loop over all the elements of this partition*/
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 
+ 		/*Allocate all arrays*/
+ 		int         numvertices = element->GetNumberOfVertices();
+Index: ../trunk-jpl/src/c/modules/ResetFSBasalBoundaryConditionx/ResetFSBasalBoundaryConditionx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ResetFSBasalBoundaryConditionx/ResetFSBasalBoundaryConditionx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/ResetFSBasalBoundaryConditionx/ResetFSBasalBoundaryConditionx.cpp	(revision 18521)
+@@ -11,7 +11,7 @@
+ 	Element *element = NULL;
+ 
+ 	for (int i=0;i<elements->Size();i++){
+-		element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		element->ResetFSBasalBoundaryCondition();
+ 	}
+ 
+Index: ../trunk-jpl/src/c/modules/InputDepthAverageAtBasex/InputDepthAverageAtBasex.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/InputDepthAverageAtBasex/InputDepthAverageAtBasex.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/InputDepthAverageAtBasex/InputDepthAverageAtBasex.cpp	(revision 18521)
+@@ -9,7 +9,7 @@
+ 
+ void InputDepthAverageAtBasex(FemModel* femmodel,int original_enum, int new_enum){
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		element->InputDepthAverageAtBase(original_enum,new_enum);
+ 	}
+ }
+Index: ../trunk-jpl/src/c/modules/InputUpdateFromConstantx/InputUpdateFromConstantx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/InputUpdateFromConstantx/InputUpdateFromConstantx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/InputUpdateFromConstantx/InputUpdateFromConstantx.cpp	(revision 18521)
+@@ -13,7 +13,7 @@
+ 
+ 	/*Elements and loads drive the update: */
+ 	for(i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		element->InputUpdateFromConstant(constant,name);
+ 	}
+ 
+@@ -34,7 +34,7 @@
+ 
+ 	/*Elements and loads drive the update: */
+ 	for(i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		element->InputUpdateFromConstant(constant,name);
+ 	}
+ 
+@@ -55,7 +55,7 @@
+ 
+ 	/*Elements and loads drive the update: */
+ 	for(i=0;i<femmodel->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		element->InputUpdateFromConstant(constant,name);
+ 	}
+ 
+@@ -77,7 +77,7 @@
+ 
+ 	/*Elements and loads drive the update: */
+ 	for(i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		element->InputUpdateFromConstant(constant,name);
+ 	}
+ }
+Index: ../trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp	(revision 18521)
+@@ -15,7 +15,7 @@
+ 
+ 	/*Compute Misfit: */
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		J+=SurfaceAbsVelMisfit(element);
+ 	}
+ 
+Index: ../trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp	(revision 18521)
+@@ -15,7 +15,7 @@
+ 
+ 	/*Compute Misfit: */
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		J+=DragCoefficientAbsGradient(element);
+ 	}
+ 
+Index: ../trunk-jpl/src/c/modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.cpp	(revision 18521)
+@@ -15,7 +15,7 @@
+ 
+ 	/*Compute Misfit: */
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		J+=RheologyBbarAbsGradient(element);
+ 	}
+ 
+Index: ../trunk-jpl/src/c/modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.cpp	(revision 18521)
+@@ -15,7 +15,7 @@
+ 
+ 	/*Compute Misfit: */
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		J+=ThicknessAcrossGradient(element);
+ 	}
+ 
+Index: ../trunk-jpl/src/c/toolkits/gsl/DenseGslSolve.cpp
+===================================================================
+--- ../trunk-jpl/src/c/toolkits/gsl/DenseGslSolve.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/toolkits/gsl/DenseGslSolve.cpp	(revision 18521)
+@@ -234,7 +234,7 @@
+         IssmPDouble* pdoubleEDFin=xNew<IssmPDouble>(n*(n+1)); // provide space to transfer inputs during call_ext_fct
+ 	IssmPDouble* pdoubleEDFout=xNew<IssmPDouble>(n);           // provide space to transfer outputs during call_ext_fct
+ 	// call the wrapped solver through the registry entry we retrieve from parameters
+-	call_ext_fct(dynamic_cast<GenericParam<Adolc_edf> * >(parameters->FindParamObject(AdolcParamEnum))->GetParameterValue().myEDF_for_solverx_p,
++	call_ext_fct(xDynamicCast<GenericParam<Adolc_edf> * >(parameters->FindParamObject(AdolcParamEnum))->GetParameterValue().myEDF_for_solverx_p,
+ 	             n*(n+1), pdoubleEDFin, adoubleEDFin,
+ 	             n, pdoubleEDFout,X);
+ 	// for(int i=0; i<n;  i++) {ADOLC_DUMP_MACRO(X[i]);}
+Index: ../trunk-jpl/src/c/toolkits/mumps/MpiDenseMumpsSolve.cpp
+===================================================================
+--- ../trunk-jpl/src/c/toolkits/mumps/MpiDenseMumpsSolve.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/toolkits/mumps/MpiDenseMumpsSolve.cpp	(revision 18521)
+@@ -243,7 +243,7 @@
+   IssmPDouble *passivePack_A_rhs=xNew<IssmPDouble>(local_nnz+n);
+   IssmPDouble *passiveSol=xNew<IssmPDouble>(n);
+   IssmDouble *sol=xNew<IssmDouble>(n);
+-  call_ext_fct(dynamic_cast<GenericParam<Adolc_edf> * >(parameters->FindParamObject(AdolcParamEnum))->GetParameterValue().myEDF_for_solverx_p,
++  call_ext_fct(xDynamicCast<GenericParam<Adolc_edf> * >(parameters->FindParamObject(AdolcParamEnum))->GetParameterValue().myEDF_for_solverx_p,
+ 	       packedDimsSparseArrLength, packedDimsSparseArr,
+ 	       local_nnz+n, passivePack_A_rhs, pack_A_rhs, 
+ 	       n, passiveSol,sol);
+Index: ../trunk-jpl/src/c/toolkits/mumps/MumpsSolve.cpp
+===================================================================
+--- ../trunk-jpl/src/c/toolkits/mumps/MumpsSolve.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/toolkits/mumps/MumpsSolve.cpp	(revision 18521)
+@@ -323,7 +323,7 @@
+   IssmPDouble *passivePack_A_rhs=xNew<IssmPDouble>(local_nnz+n);
+   IssmPDouble *passiveSol=xNew<IssmPDouble>(n);
+   IssmDouble *sol=xNew<IssmDouble>(n);
+-  call_ext_fct(dynamic_cast<GenericParam<Adolc_edf> * >(parameters->FindParamObject(AdolcParamEnum))->GetParameterValue().myEDF_for_solverx_p,
++  call_ext_fct(xDynamicCast<GenericParam<Adolc_edf> * >(parameters->FindParamObject(AdolcParamEnum))->GetParameterValue().myEDF_for_solverx_p,
+ 	       packedDimsSparseArrLength, packedDimsSparseArr,
+ 	       local_nnz+n, passivePack_A_rhs, pack_A_rhs, 
+ 	       n, passiveSol,sol);
+Index: ../trunk-jpl/src/c/cores/ad_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/ad_core.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/cores/ad_core.cpp	(revision 18521)
+@@ -110,7 +110,7 @@
+ 			}
+ 
+ 			/*get the EDF pointer:*/
+-			ext_diff_fct *anEDF_for_solverx_p=dynamic_cast<GenericParam<Adolc_edf> * >(femmodel->parameters->FindParamObject(AdolcParamEnum))->GetParameterValue().myEDF_for_solverx_p;
++			ext_diff_fct *anEDF_for_solverx_p=xDynamicCast<GenericParam<Adolc_edf> * >(femmodel->parameters->FindParamObject(AdolcParamEnum))->GetParameterValue().myEDF_for_solverx_p;
+ 
+ 			/*Branch according to AD driver: */
+ 			femmodel->parameters->FindParam(&driver,AutodiffDriverEnum);
+Index: ../trunk-jpl/src/c/classes/Materials/Materials.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Materials.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/Materials/Materials.cpp	(revision 18521)
+@@ -36,7 +36,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		material=dynamic_cast<Material*>(*object);
++		material=xDynamicCast<Material*>(*object);
+ 		material->Configure(elements);
+ 
+ 	}
+@@ -50,7 +50,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		material=dynamic_cast<Material*>((*object));
++		material=xDynamicCast<Material*>((*object));
+ 		material->ResetHooks();
+ 
+ 	}
+Index: ../trunk-jpl/src/c/classes/Params/Parameters.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Params/Parameters.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/Params/Parameters.cpp	(revision 18521)
+@@ -56,7 +56,7 @@
+ 	Param* param=NULL;
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+-		param=dynamic_cast<Param*>(*object);
++		param=xDynamicCast<Param*>(*object);
+ 		if(param->InstanceEnum()==enum_type) return true;
+ 	}
+ 	return false;
+@@ -69,7 +69,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		param=dynamic_cast<Param*>(*object);
++		param=xDynamicCast<Param*>(*object);
+ 		if(param->InstanceEnum()==enum_type){
+ 			param->GetParameterValue(pbool);
+ 			return;
+@@ -85,7 +85,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		param=dynamic_cast<Param*>(*object);
++		param=xDynamicCast<Param*>(*object);
+ 		if(param->InstanceEnum()==enum_type){
+ 			param->GetParameterValue(pinteger);
+ 			return;
+@@ -101,7 +101,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		param=dynamic_cast<Param*>(*object);
++		param=xDynamicCast<Param*>(*object);
+ 		if(param->InstanceEnum()==enum_type){
+ 			param->GetParameterValue(pscalar);
+ 			return;
+@@ -117,7 +117,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		param=dynamic_cast<Param*>(*object);
++		param=xDynamicCast<Param*>(*object);
+ 		if(param->InstanceEnum()==enum_type){
+ 			param->GetParameterValue(pscalar,time);
+ 			return;
+@@ -133,7 +133,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		param=dynamic_cast<Param*>(*object);
++		param=xDynamicCast<Param*>(*object);
+ 		if(param->InstanceEnum()==enum_type){
+ 			param->GetParameterValue(pstring);
+ 			return;
+@@ -150,7 +150,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		param=dynamic_cast<Param*>(*object);
++		param=xDynamicCast<Param*>(*object);
+ 		if(param->InstanceEnum()==enum_type){
+ 			param->GetParameterValue(pstringarray,pM);
+ 			return;
+@@ -167,7 +167,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		param=dynamic_cast<Param*>(*object);
++		param=xDynamicCast<Param*>(*object);
+ 		if(param->InstanceEnum()==enum_type){
+ 			param->GetParameterValue(pintarray,pM);
+ 			return;
+@@ -184,7 +184,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		param=dynamic_cast<Param*>(*object);
++		param=xDynamicCast<Param*>(*object);
+ 		if(param->InstanceEnum()==enum_type){
+ 			param->GetParameterValue(pintarray,pM,pN);
+ 			return;
+@@ -201,7 +201,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		param=dynamic_cast<Param*>(*object);
++		param=xDynamicCast<Param*>(*object);
+ 		if(param->InstanceEnum()==enum_type){
+ 			param->GetParameterValue(pIssmDoublearray,pM);
+ 			return;
+@@ -218,7 +218,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		param=dynamic_cast<Param*>(*object);
++		param=xDynamicCast<Param*>(*object);
+ 		if(param->InstanceEnum()==enum_type){
+ 			param->GetParameterValue(pIssmDoublearray,pM,pN);
+ 			return;
+@@ -235,7 +235,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		param=dynamic_cast<Param*>(*object);
++		param=xDynamicCast<Param*>(*object);
+ 		if(param->InstanceEnum()==enum_type){
+ 			param->GetParameterValue(parray,pM,pmdims_array,pndims_array);
+ 			return;
+@@ -251,7 +251,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		param=dynamic_cast<Param*>(*object);
++		param=xDynamicCast<Param*>(*object);
+ 		if(param->InstanceEnum()==enum_type){
+ 			param->GetParameterValue(pvec);
+ 			return;
+@@ -268,7 +268,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		param=dynamic_cast<Param*>(*object);
++		param=xDynamicCast<Param*>(*object);
+ 		if(param->InstanceEnum()==enum_type){
+ 			param->GetParameterValue(pmat);
+ 			return;
+@@ -285,7 +285,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		param=dynamic_cast<Param*>(*object);
++		param=xDynamicCast<Param*>(*object);
+ 		if(param->InstanceEnum()==enum_type){
+ 			param->GetParameterValue(pfid);
+ 			return;
+@@ -302,7 +302,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		param=dynamic_cast<Param*>(*object);
++		param=xDynamicCast<Param*>(*object);
+ 		if(param->InstanceEnum()==enum_type){
+ 			param->GetParameterValue(pdataset);
+ 			return;
+@@ -317,7 +317,7 @@
+ 	Param* param=NULL;
+ 
+ 	/*first, figure out if the param has already been created: */
+-	param=dynamic_cast<Param*>(this->FindParamObject(enum_type));
++	param=xDynamicCast<Param*>(this->FindParamObject(enum_type));
+ 
+ 	if(param) param->SetValue(boolean); //already exists, just set it.
+ 	else this->AddObject(new BoolParam(enum_type,boolean)); //just add the new parameter.
+@@ -328,7 +328,7 @@
+ 	Param* param=NULL;
+ 
+ 	/*first, figure out if the param has already been created: */
+-	param=dynamic_cast<Param*>(this->FindParamObject(enum_type));
++	param=xDynamicCast<Param*>(this->FindParamObject(enum_type));
+ 
+ 	if(param) param->SetValue(integer); //already exists, just set it.
+ 	else this->AddObject(new IntParam(enum_type,integer)); //just add the new parameter.
+@@ -339,7 +339,7 @@
+ 	Param* param=NULL;
+ 
+ 	/*first, figure out if the param has already been created: */
+-	param=dynamic_cast<Param*>(this->FindParamObject(enum_type));
++	param=xDynamicCast<Param*>(this->FindParamObject(enum_type));
+ 
+ 	if(param) param->SetValue(scalar); //already exists, just set it.
+ 	else this->AddObject(new DoubleParam(enum_type,scalar)); //just add the new parameter.
+@@ -350,7 +350,7 @@
+ 	Param* param=NULL;
+ 
+ 	/*first, figure out if the param has already been created: */
+-	param=dynamic_cast<Param*>(this->FindParamObject(enum_type));
++	param=xDynamicCast<Param*>(this->FindParamObject(enum_type));
+ 
+ 	if(param) param->SetValue(string); //already exists, just set it.
+ 	else this->AddObject(new StringParam(enum_type,string)); //just add the new parameter.
+@@ -361,7 +361,7 @@
+ 	Param* param=NULL;
+ 
+ 	/*first, figure out if the param has already been created: */
+-	param=dynamic_cast<Param*>(this->FindParamObject(enum_type));
++	param=xDynamicCast<Param*>(this->FindParamObject(enum_type));
+ 
+ 	if(param) param->SetValue(stringarray,M); //already exists, just set it.
+ 	else this->AddObject(new StringArrayParam(enum_type,stringarray,M)); //just add the new parameter.
+@@ -372,7 +372,7 @@
+ 	Param* param=NULL;
+ 
+ 	/*first, figure out if the param has already been created: */
+-	param=dynamic_cast<Param*>(this->FindParamObject(enum_type));
++	param=xDynamicCast<Param*>(this->FindParamObject(enum_type));
+ 
+ 	if(param) param->SetValue(IssmDoublearray,M); //already exists, just set it.
+ 	else this->AddObject(new DoubleVecParam(enum_type,IssmDoublearray,M)); //just add the new parameter.
+@@ -383,7 +383,7 @@
+ 	Param* param=NULL;
+ 
+ 	/*first, figure out if the param has already been created: */
+-	param=dynamic_cast<Param*>(this->FindParamObject(enum_type));
++	param=xDynamicCast<Param*>(this->FindParamObject(enum_type));
+ 
+ 	if(param) param->SetValue(IssmDoublearray,M,N); //already exists, just set it.
+ 	else this->AddObject(new DoubleMatParam(enum_type,IssmDoublearray,M,N)); //just add the new parameter.
+@@ -394,7 +394,7 @@
+ 	Param* param=NULL;
+ 
+ 	/*first, figure out if the param has already been created: */
+-	param=dynamic_cast<Param*>(this->FindParamObject(enum_type));
++	param=xDynamicCast<Param*>(this->FindParamObject(enum_type));
+ 
+ 	if(param) param->SetValue(intarray,M); //already exists, just set it.
+ 	else this->AddObject(new IntVecParam(enum_type,intarray,M)); //just add the new parameter.
+@@ -405,7 +405,7 @@
+ 	Param* param=NULL;
+ 
+ 	/*first, figure out if the param has already been created: */
+-	param=dynamic_cast<Param*>(this->FindParamObject(enum_type));
++	param=xDynamicCast<Param*>(this->FindParamObject(enum_type));
+ 
+ 	if(param) param->SetValue(intarray,M,N); //already exists, just set it.
+ 	else this->AddObject(new IntMatParam(enum_type,intarray,M,N)); //just add the new parameter.
+@@ -416,7 +416,7 @@
+ 	Param* param=NULL;
+ 
+ 	/*first, figure out if the param has already been created: */
+-	param=dynamic_cast<Param*>(this->FindParamObject(enum_type));
++	param=xDynamicCast<Param*>(this->FindParamObject(enum_type));
+ 
+ 	if(param) param->SetValue(vector); //already exists, just set it.
+ 	else this->AddObject(new VectorParam(enum_type,vector)); //just add the new parameter.
+@@ -427,7 +427,7 @@
+ 	Param* param=NULL;
+ 
+ 	/*first, figure out if the param has already been created: */
+-	param=dynamic_cast<Param*>(this->FindParamObject(enum_type));
++	param=xDynamicCast<Param*>(this->FindParamObject(enum_type));
+ 
+ 	if(param) param->SetValue(matrix); //already exists, just set it.
+ 	else this->AddObject(new MatrixParam(enum_type,matrix)); //just add the new parameter.
+@@ -438,7 +438,7 @@
+ 	Param* param=NULL;
+ 
+ 	/*first, figure out if the param has already been created: */
+-	param=dynamic_cast<Param*>(this->FindParamObject(enum_type));
++	param=xDynamicCast<Param*>(this->FindParamObject(enum_type));
+ 
+ 	if(param) param->SetValue(fid); //already exists, just set it.
+ 	else this->AddObject(new FileParam(enum_type,fid)); //just add the new parameter.
+@@ -449,7 +449,7 @@
+ 	Param* param=NULL;
+ 
+ 	/*first, figure out if the param has already been created: */
+-	param=dynamic_cast<Param*>(this->FindParamObject(enum_type));
++	param=xDynamicCast<Param*>(this->FindParamObject(enum_type));
+ 
+ 	if(param) param->SetValue(dataset); //already exists, just set it.
+ 	else this->AddObject(new DataSetParam(enum_type,dataset)); //just add the new parameter.
+@@ -463,7 +463,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		param=dynamic_cast<Param*>(*object);
++		param=xDynamicCast<Param*>(*object);
+ 		if(param->InstanceEnum()==enum_type){
+ 			return (*object);
+ 		}
+Index: ../trunk-jpl/src/c/classes/kriging/Observations.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/Observations.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/kriging/Observations.cpp	(revision 18521)
+@@ -88,7 +88,7 @@
+ 		/*First check that this observation is not too close from another one*/
+ 		this->quadtree->ClosestObs(&index,x[i],y[i]);
+ 		if(index>=0){
+-			observation=dynamic_cast<Observation*>(this->GetObjectByOffset(index));
++			observation=xDynamicCast<Observation*>(this->GetObjectByOffset(index));
+ 			if(pow(observation->x-x[i],2)+pow(observation->y-y[i],2) < minspacing) continue;
+ 		}
+ 
+@@ -130,7 +130,7 @@
+ 	/*First, find closest point in Quadtree (fast but might not be the true closest obs)*/
+ 	this->quadtree->ClosestObs(&index,x_interp,y_interp);
+ 	if(index>=0){
+-		observation=dynamic_cast<Observation*>(this->GetObjectByOffset(index));
++		observation=xDynamicCast<Observation*>(this->GetObjectByOffset(index));
+ 		hmin = sqrt((observation->x-x_interp)*(observation->x-x_interp) + (observation->y-y_interp)*(observation->y-y_interp));
+ 		if(hmin<radius) radius=hmin;
+ 	}
+@@ -138,7 +138,7 @@
+ 	/*Find all observations that are in radius*/
+ 	this->quadtree->RangeSearch(&indices,&nobs,x_interp,y_interp,radius);
+ 	for (i=0;i<nobs;i++){
+-		observation=dynamic_cast<Observation*>(this->GetObjectByOffset(indices[i]));
++		observation=xDynamicCast<Observation*>(this->GetObjectByOffset(indices[i]));
+ 		h2 = (observation->x-x_interp)*(observation->x-x_interp) + (observation->y-y_interp)*(observation->y-y_interp);
+ 		if(i==0){
+ 			hmin2 = h2;
+@@ -154,7 +154,7 @@
+ 
+ 	/*Assign output pointer*/
+ 	if(nobs || hmin==radius){
+-		observation=dynamic_cast<Observation*>(this->GetObjectByOffset(index));
++		observation=xDynamicCast<Observation*>(this->GetObjectByOffset(index));
+ 		*px   = observation->x;
+ 		*py   = observation->y;
+ 		*pobs = observation->value;
+@@ -209,7 +209,7 @@
+ 	}
+ 	nobs = 0;
+ 	for(i=0;i<tempnobs;i++){
+-		observation=dynamic_cast<Observation*>(this->GetObjectByOffset(tempindices[i]));
++		observation=xDynamicCast<Observation*>(this->GetObjectByOffset(tempindices[i]));
+ 		h2 = (observation->x-x_interp)*(observation->x-x_interp) + (observation->y-y_interp)*(observation->y-y_interp);
+ 
+ 		if(nobs==maxdata && h2>radius2) continue;
+@@ -251,7 +251,7 @@
+ 
+ 		/*Loop over all observations and fill in x, y and obs*/
+ 		for(i=0;i<nobs;i++){
+-			observation=dynamic_cast<Observation*>(this->GetObjectByOffset(indices[i]));
++			observation=xDynamicCast<Observation*>(this->GetObjectByOffset(indices[i]));
+ 			observation->WriteXYObs(&x[i],&y[i],&obs[i]);
+ 		}
+ 	}
+@@ -279,7 +279,7 @@
+ 		y   = xNew<IssmPDouble>(nobs);
+ 		obs = xNew<IssmPDouble>(nobs);
+ 		for(int i=0;i<this->Size();i++){
+-			observation=dynamic_cast<Observation*>(this->GetObjectByOffset(i));
++			observation=xDynamicCast<Observation*>(this->GetObjectByOffset(i));
+ 			observation->WriteXYObs(&x[i],&y[i],&obs[i]);
+ 		}
+ 	}
+@@ -531,10 +531,10 @@
+ 	for(j=0;j<n;j++) gamma[j]   = 0.0;
+ 
+ 	for(i=0;i<this->Size();i++){
+-		observation1=dynamic_cast<Observation*>(this->GetObjectByOffset(i));
++		observation1=xDynamicCast<Observation*>(this->GetObjectByOffset(i));
+ 
+ 		for(j=i+1;j<this->Size();j++){
+-			observation2=dynamic_cast<Observation*>(this->GetObjectByOffset(j));
++			observation2=xDynamicCast<Observation*>(this->GetObjectByOffset(j));
+ 
+ 			distance=sqrt(pow(observation1->x - observation2->x,2) + pow(observation1->y - observation2->y,2));
+ 			if(distance>x[n-1]) continue;
+Index: ../trunk-jpl/src/c/classes/Options/Options.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Options/Options.h	(revision 18520)
++++ ../trunk-jpl/src/c/classes/Options/Options.h	(revision 18521)
+@@ -25,7 +25,7 @@
+ 		template <class OptionType> void Get(OptionType* pvalue,const char* name){ /*{{{*/
+ 
+ 			/*Get option*/
+-			GenericOption<OptionType>* genericoption=dynamic_cast<GenericOption<OptionType>*>(GetOption(name));
++			GenericOption<OptionType>* genericoption=xDynamicCast<GenericOption<OptionType>*>(GetOption(name));
+ 
+ 			/*If the pointer is not NULL, the option has been found*/
+ 			if(genericoption){
+@@ -40,7 +40,7 @@
+ 		template <class OptionType> void Get(OptionType* pvalue,int* pnumel, const char* name){ /*{{{*/
+ 
+ 			/*Get option*/
+-			GenericOption<OptionType>* genericoption=dynamic_cast<GenericOption<OptionType>*>(GetOption(name));
++			GenericOption<OptionType>* genericoption=xDynamicCast<GenericOption<OptionType>*>(GetOption(name));
+ 
+ 			/*If the pointer is not NULL, the option has been found*/
+ 			if(genericoption){
+@@ -56,7 +56,7 @@
+ 		template <class OptionType> void Get(OptionType* pvalue,const char* name,OptionType default_value){ /*{{{*/
+ 
+ 			/*Get option*/
+-			GenericOption<OptionType>* genericoption=dynamic_cast<GenericOption<OptionType>*>(GetOption(name));
++			GenericOption<OptionType>* genericoption=xDynamicCast<GenericOption<OptionType>*>(GetOption(name));
+ 
+ 			/*If the pointer is not NULL, the option has been found*/
+ 			if(genericoption){
+@@ -71,7 +71,7 @@
+ 		template <class OptionType> void Get(OptionType* pvalue,int* pnumel, const char* name,OptionType default_value){ /*{{{*/
+ 
+ 			/*Get option*/
+-			GenericOption<OptionType>* genericoption=dynamic_cast<GenericOption<OptionType>*>(GetOption(name));
++			GenericOption<OptionType>* genericoption=xDynamicCast<GenericOption<OptionType>*>(GetOption(name));
+ 
+ 			/*If the pointer is not NULL, the option has been found*/
+ 			if(genericoption){
+@@ -91,7 +91,7 @@
+ template <> inline void Options::Get(char** pvalue,const char* name,char* default_value){ /*{{{*/
+ 
+ 	/*Get option*/
+-	GenericOption<char*>* genericoption=dynamic_cast<GenericOption<char*>*>(GetOption(name));
++	GenericOption<char*>* genericoption=xDynamicCast<GenericOption<char*>*>(GetOption(name));
+ 
+ 	/*If the pointer is not NULL, the option has been found*/
+ 	if(genericoption){
+Index: ../trunk-jpl/src/c/classes/Options/Options.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Options/Options.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/Options/Options.cpp	(revision 18521)
+@@ -51,7 +51,7 @@
+ 	/*Finally, check that no option of the same name already exists in the dataset*/
+ 	for(object=objects.begin();object<objects.end();object++){
+ 
+-		option=dynamic_cast<Option*>(*object);
++		option=xDynamicCast<Option*>(*object);
+ 		if (!strcmp(option->Name(),name)){
+ 			_error_("Options \"" << name << "\" found multiple times");
+ 			break;
+@@ -72,7 +72,7 @@
+ 	/*Go through options and find option: */
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		option=dynamic_cast<Option*>(*object);
++		option=xDynamicCast<Option*>(*object);
+ 		//option=(Option*)(*object); //C-like cast
+ 		/*There is a crash on some machines (Einar Olason) that needs to be fixed*/
+ 		if(!option){
+Index: ../trunk-jpl/src/c/classes/Loads/Loads.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Loads.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/Loads/Loads.cpp	(revision 18521)
+@@ -40,7 +40,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		load=dynamic_cast<Load*>(*object);
++		load=xDynamicCast<Load*>(*object);
+ 		load->Configure(elements,loads,nodes,vertices,materials,parameters);
+ 
+ 	}
+@@ -54,7 +54,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		load=dynamic_cast<Load*>((*object));
++		load=xDynamicCast<Load*>((*object));
+ 		load->ResetHooks();
+ 
+ 	}
+@@ -69,7 +69,7 @@
+ 	/*Now go through all loads, and get how many nodes they own, unless they are clone nodes: */
+ 	for(int i=0;i<this->Size();i++){
+ 
+-		Load* load=dynamic_cast<Load*>(this->GetObjectByOffset(i));
++		Load* load=xDynamicCast<Load*>(this->GetObjectByOffset(i));
+ 		if (load->InAnalysis(analysis_type)){
+ 			if(load->IsPenalty()) ispenalty++;
+ 		}
+@@ -94,7 +94,7 @@
+ 	/*Now go through all loads, and get how many nodes they own, unless they are clone nodes: */
+ 	for(int i=0;i<this->Size();i++){
+ 
+-		Load* load=dynamic_cast<Load*>(this->GetObjectByOffset(i));
++		Load* load=xDynamicCast<Load*>(this->GetObjectByOffset(i));
+ 		if (load->InAnalysis(analysis_type)){
+ 			numnodes=load->GetNumberOfNodes();
+ 			if(numnodes>max)max=numnodes;
+@@ -131,7 +131,7 @@
+ 	/*Get number of local loads*/
+ 	for(int i=0;i<this->Size();i++){
+ 
+-		Load* load=dynamic_cast<Load*>(this->GetObjectByOffset(i));
++		Load* load=xDynamicCast<Load*>(this->GetObjectByOffset(i));
+ 
+ 		/*Check that this load corresponds to our analysis currently being carried out: */
+ 		if (load->InAnalysis(analysis_type)) localloads++;
+@@ -156,7 +156,7 @@
+ 	/*Get number of local loads*/
+ 	for(int i=0;i<this->Size();i++){
+ 
+-		Load* load=dynamic_cast<Load*>(this->GetObjectByOffset(i));
++		Load* load=xDynamicCast<Load*>(this->GetObjectByOffset(i));
+ 
+ 		/*Check that this load corresponds to our analysis currently being carried out: */
+ 		if (load->InAnalysis(analysis_type)) localloads++;
+@@ -172,7 +172,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		load=dynamic_cast<Load*>(*object);
++		load=xDynamicCast<Load*>(*object);
+ 		load->SetCurrentConfiguration(elements,loads,nodes,vertices,materials,parameters);
+ 
+ 	}
+Index: ../trunk-jpl/src/c/classes/ExternalResults/Results.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/ExternalResults/Results.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/ExternalResults/Results.cpp	(revision 18521)
+@@ -40,7 +40,7 @@
+ 	parameters->FindParam(&io_gather,SettingsIoGatherEnum);
+ 
+ 	for(int i=0;i<this->Size();i++){
+-		ExternalResult* result=dynamic_cast<ExternalResult*>(this->GetObjectByOffset(i));
++		ExternalResult* result=xDynamicCast<ExternalResult*>(this->GetObjectByOffset(i));
+ 		result->WriteData(fid,io_gather);
+ 	}
+ 
+@@ -56,7 +56,7 @@
+ 	_assert_(in_result);
+ 
+ 	for(int i=0;i<this->Size();i++){
+-		ExternalResult* result=dynamic_cast<ExternalResult*>(this->GetObjectByOffset(i));
++		ExternalResult* result=xDynamicCast<ExternalResult*>(this->GetObjectByOffset(i));
+ 
+ 		if(result->GetStep()==in_result->GetStep()){
+ 			char*    result_name =    result->GetResultName();
+@@ -80,7 +80,7 @@
+ int Results::DeleteResult(int result_enum,int result_step){/*{{{*/
+ 
+ 	for(int i=0;i<this->Size();i++){
+-		ExternalResult* result=dynamic_cast<ExternalResult*>(this->GetObjectByOffset(i));
++		ExternalResult* result=xDynamicCast<ExternalResult*>(this->GetObjectByOffset(i));
+ 
+ 		if(result->GetStep()==result_step){
+ 			if(strcmp(result->GetResultName(),EnumToStringx(result_enum))==0){
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18521)
+@@ -602,7 +602,7 @@
+ 
+ 					/*Get interpolation (and compute input if necessary)*/
+ 					for(int j=0;j<elements->Size();j++){
+-						Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(j));
++						Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(j));
+ 						element->ResultInterpolation(&rank_interpolation,&rank_nodesperelement,output_enum);
+ 					}
+ 
+@@ -621,7 +621,7 @@
+ 
+ 						/*Fill-in matrix*/
+ 						for(int j=0;j<elements->Size();j++){
+-							Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(j));
++							Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(j));
+ 							element->ResultToPatch(values,nodesperelement,output_enum);
+ 						}
+ 
+@@ -738,7 +738,7 @@
+ 	element=(Element*)elements->GetObjectByOffset(0); min_dt=element->TimeAdapt();
+ 
+ 	for (i=1;i<elements->Size();i++){
+-		element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		dt=element->TimeAdapt();
+ 		if(dt<min_dt)min_dt=dt;
+ 	}
+@@ -755,7 +755,7 @@
+ void FemModel::UpdateConstraintsExtrudeFromBasex(void){ /*{{{*/
+ 
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		element->UpdateConstraintsExtrudeFromBase();
+ 	}
+ 
+@@ -764,7 +764,7 @@
+ void FemModel::UpdateConstraintsExtrudeFromTopx(void){ /*{{{*/
+ 
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		element->UpdateConstraintsExtrudeFromTop();
+ 	}
+ 
+@@ -838,7 +838,7 @@
+ 	/*Go through elements, and request velocity: */
+ 	maxabsvx=-INFINITY;
+ 	for(i=0;i<this->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+ 		element_maxabsvx=element->inputs->MaxAbs(VxEnum);
+ 		if(element_maxabsvx>maxabsvx) maxabsvx=element_maxabsvx;
+ 	}
+@@ -862,7 +862,7 @@
+ 	/*Go through elements, and request velocity: */
+ 	maxabsvy=-INFINITY;
+ 	for(i=0;i<this->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+ 		element_maxabsvy=element->inputs->MaxAbs(VyEnum);
+ 		if(element_maxabsvy>maxabsvy) maxabsvy=element_maxabsvy;
+ 	}
+@@ -886,7 +886,7 @@
+ 	/*Go through elements, and request velocity: */
+ 	maxabsvz=-INFINITY;
+ 	for(i=0;i<this->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+ 		element_maxabsvz=element->inputs->MaxAbs(VzEnum);
+ 		if(element_maxabsvz>maxabsvz) maxabsvz=element_maxabsvz;
+ 	}
+@@ -910,7 +910,7 @@
+ 	/*Go through elements, and request velocity: */
+ 	maxvel=-INFINITY;
+ 	for(i=0;i<this->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+ 		element_maxvel = element->inputs->Max(VelEnum);
+ 		if(element_maxvel>maxvel) maxvel=element_maxvel;
+ 	}
+@@ -934,7 +934,7 @@
+ 	/*Go through elements, and request velocity: */
+ 	maxvx=-INFINITY;
+ 	for(i=0;i<this->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+ 		element_maxvx = element->inputs->Max(VxEnum);
+ 		if(element_maxvx>maxvx) maxvx=element_maxvx;
+ 	}
+@@ -958,7 +958,7 @@
+ 	/*Go through elements, and request velocity: */
+ 	maxvy=-INFINITY;
+ 	for(i=0;i<this->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+ 		element_maxvy = element->inputs->Max(VyEnum);
+ 		if(element_maxvy>maxvy) maxvy=element_maxvy;
+ 	}
+@@ -982,7 +982,7 @@
+ 	/*Go through elements, and request velocity: */
+ 	maxvz=-INFINITY;
+ 	for(i=0;i<this->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+ 		element_maxvz = element->inputs->Max(VzEnum);
+ 		if(element_maxvz>maxvz) maxvz=element_maxvz;
+ 	}
+@@ -1006,7 +1006,7 @@
+ 	/*Go through elements, and request velocity: */
+ 	minvel=INFINITY;
+ 	for(i=0;i<this->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+ 		element_minvel = element->inputs->Min(VelEnum);
+ 		if(element_minvel<minvel) minvel=element_minvel;
+ 	}
+@@ -1030,7 +1030,7 @@
+ 	/*Go through elements, and request velocity: */
+ 	minvx=INFINITY;
+ 	for(i=0;i<this->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+ 		element_minvx = element->inputs->Min(VxEnum);
+ 		if(element_minvx<minvx) minvx=element_minvx;
+ 	}
+@@ -1054,7 +1054,7 @@
+ 	/*Go through elements, and request velocity: */
+ 	minvy=INFINITY;
+ 	for(i=0;i<this->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+ 		element_minvy = element->inputs->Min(VyEnum);
+ 		if(element_minvy<minvy) minvy=element_minvy;
+ 	}
+@@ -1078,7 +1078,7 @@
+ 	/*Go through elements, and request velocity: */
+ 	minvz=INFINITY;
+ 	for(i=0;i<this->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+ 		element_minvz = element->inputs->Min(VzEnum);
+ 		if(element_minvz<minvz) minvz=element_minvz;
+ 	}
+@@ -1098,7 +1098,7 @@
+ 	IssmDouble total_smb;
+ 
+ 	for(int i=0;i<this->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+ 		local_smb+=element->TotalSmb();
+ 	}
+ 	ISSM_MPI_Reduce(&local_smb,&total_smb,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+@@ -1114,7 +1114,7 @@
+ 	IssmDouble total_divergence;
+ 
+ 	for(int i=0;i<this->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+ 		local_divergence+=element->Divergence();
+ 	}
+ 	ISSM_MPI_Reduce(&local_divergence,&total_divergence,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+@@ -1142,7 +1142,7 @@
+ 	}
+ 
+ 	for(int i=0;i<this->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+ 		element->GetInputLocalMinMaxOnNodes(uLmin_local,uLmax_local,ug);
+ 	}
+ 
+@@ -1163,7 +1163,7 @@
+ 	IssmDouble total_ice_volume;
+ 
+ 	for(int i=0;i<this->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+ 		local_ice_volume+=element->IceVolume();
+ 	}
+ 	ISSM_MPI_Reduce(&local_ice_volume,&total_ice_volume,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+@@ -1179,7 +1179,7 @@
+ 	IssmDouble total_ice_volume_af;
+ 
+ 	for(int i=0;i<this->elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+ 		local_ice_volume_af+=element->IceVolumeAboveFloatation();
+ 	}
+ 	ISSM_MPI_Reduce(&local_ice_volume_af,&total_ice_volume_af,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+@@ -1204,7 +1204,7 @@
+ 
+ 	/*now, go through our elements, and retrieve the one with this id: index: */
+ 	for(int i=0;i<this->elements->Size();i++){
+-		element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+ 		if (element->Id()==index){
+ 			found=1;
+ 			cpu_found=my_rank;
+@@ -1242,7 +1242,7 @@
+ 
+ 	/*Compute Misfit: */
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 
+ 		/*If on water, return 0: */
+ 		if(!element->IsIceInElement()) continue;
+@@ -1310,7 +1310,7 @@
+ 
+ 	/*Compute Misfit: */
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 
+ 		/*If on water, return 0: */
+ 		if(!element->IsIceInElement()) continue;
+@@ -1340,7 +1340,7 @@
+ 
+ 	/*Compute Misfit: */
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 
+ 		/*If on water, return 0: */
+ 		if(!element->IsIceInElement()) continue;
+@@ -1571,7 +1571,7 @@
+ 
+ 	/*Go through elements, and add contribution from each element to the deflection vector wg:*/
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		element->GiaDeflection(wg,dwgdt, x,y);
+ 	}
+ }
+@@ -1589,7 +1589,7 @@
+ 	mask=new Vector<IssmDouble>(nodes->NumberOfNodes(HydrologyDCEfficientAnalysisEnum));
+ 
+ 	for (int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		effanalysis->HydrologyEPLGetMask(mask,element);
+ 	}
+ 
+@@ -1605,7 +1605,7 @@
+ 	/*Step 2: update node activity. If one element is connected to mask=1, all nodes are active*/
+ 	active=new Vector<IssmDouble>(nodes->NumberOfNodes(HydrologyDCEfficientAnalysisEnum));
+ 	for (int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		effanalysis->HydrologyEPLGetActive(active,element);
+ 	}
+ 
+@@ -1617,7 +1617,7 @@
+ 	/*Update node activation accordingly*/
+ 	int counter =0;
+ 	for (int i=0;i<nodes->Size();i++){
+-		Node* node=dynamic_cast<Node*>(nodes->GetObjectByOffset(i));
++		Node* node=xDynamicCast<Node*>(nodes->GetObjectByOffset(i));
+ 		if(node->InAnalysis(HydrologyDCEfficientAnalysisEnum)){
+ 			if(serial_active[node->Sid()]==1.){
+ 				node->Activate();
+@@ -1650,7 +1650,7 @@
+ 	/*update node activity. If one element is connected to mask=1, all nodes are active*/
+ 	active=new Vector<IssmDouble>(nodes->NumberOfNodes(HydrologyDCEfficientAnalysisEnum));
+ 	for (int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		effanalysis->HydrologyEPLGetActive(active,element);
+ 	}
+ 
+@@ -1663,7 +1663,7 @@
+ 	/*Update node activation accordingly*/
+ 	int counter =0;
+ 	for (int i=0;i<nodes->Size();i++){
+-		Node* node=dynamic_cast<Node*>(nodes->GetObjectByOffset(i));
++		Node* node=xDynamicCast<Node*>(nodes->GetObjectByOffset(i));
+ 		if(node->InAnalysis(L2ProjectionEPLAnalysisEnum)){
+ 			if(serial_active[node->Sid()]==1.){
+ 				node->Activate();
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18521)
+@@ -1795,7 +1795,7 @@
+ 	seg->inputs=(Inputs*)this->inputs->SpawnSegInputs(index1,index2);
+ 	seg->parameters=this->parameters;
+ 	seg->element_type=P1Enum; //Only P1 CG for now (TO BE CHANGED)
+-	this->SpawnSegHook(dynamic_cast<ElementHook*>(seg),index1,index2);
++	this->SpawnSegHook(xDynamicCast<ElementHook*>(seg),index1,index2);
+ 
+ 	/*Spawn material*/
+ 	seg->material=(Material*)this->material->copy2(seg);
+Index: ../trunk-jpl/src/c/classes/Elements/PentaRef.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/PentaRef.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/Elements/PentaRef.cpp	(revision 18521)
+@@ -47,7 +47,7 @@
+ 
+ 	/*Cast gauss to GaussPenta*/
+ 	_assert_(gauss_in->Enum()==GaussPentaEnum);
+-	GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in);
++	GaussPenta* gauss = xDynamicCast<GaussPenta*>(gauss_in);
+ 
+ 	/*Figure out xi,eta and zi (parametric coordinates), for this gaussian point: */
+ 	A1  = gauss->coord1;
+@@ -159,7 +159,7 @@
+ 
+ 	/*Cast gauss to GaussPenta*/
+ 	_assert_(gauss_in->Enum()==GaussPentaEnum);
+-	GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in);
++	GaussPenta* gauss = xDynamicCast<GaussPenta*>(gauss_in);
+ 
+ 	/*Get current coordinates in reference element*/
+ 	IssmDouble zeta=gauss->coord4;
+@@ -364,7 +364,7 @@
+ 
+ 	/*Cast gauss to GaussPenta*/
+ 	_assert_(gauss_in->Enum()==GaussPentaEnum);
+-	GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in);
++	GaussPenta* gauss = xDynamicCast<GaussPenta*>(gauss_in);
+ 
+ 	/*Get current coordinates in reference element*/
+ 	IssmDouble zeta=gauss->coord4;
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18521)
+@@ -1969,7 +1969,7 @@
+ 	tria->inputs=(Inputs*)this->inputs->SpawnTriaInputs(index1,index2,index3);
+ 	tria->parameters=this->parameters;
+ 	tria->element_type=P1Enum; //Only P1 CG for now (TO BE CHANGED)
+-	this->SpawnTriaHook(dynamic_cast<ElementHook*>(tria),index1,index2,index3);
++	this->SpawnTriaHook(xDynamicCast<ElementHook*>(tria),index1,index2,index3);
+ 
+ 	/*Spawn material*/
+ 	tria->material=(Material*)this->material->copy2(tria);
+Index: ../trunk-jpl/src/c/classes/Elements/TetraRef.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/TetraRef.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/Elements/TetraRef.cpp	(revision 18521)
+@@ -36,7 +36,7 @@
+ 
+ 	/*Cast gauss to GaussTetra*/
+ 	_assert_(gauss_in->Enum()==GaussTetraEnum);
+-	GaussTetra* gauss = dynamic_cast<GaussTetra*>(gauss_in);
++	GaussTetra* gauss = xDynamicCast<GaussTetra*>(gauss_in);
+ 
+ 	switch(finiteelement){
+ 		case P0Enum:
+Index: ../trunk-jpl/src/c/classes/Elements/Elements.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Elements.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/Elements/Elements.cpp	(revision 18521)
+@@ -40,7 +40,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		element=dynamic_cast<Element*>((*object));
++		element=xDynamicCast<Element*>((*object));
+ 		element->Configure(elements,loads,nodes,vertices,materials,parameters);
+ 
+ 	}
+@@ -54,7 +54,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		element=dynamic_cast<Element*>((*object));
++		element=xDynamicCast<Element*>((*object));
+ 		element->SetCurrentConfiguration(elements,loads,nodes,materials,parameters);
+ 
+ 	}
+@@ -68,7 +68,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		element=dynamic_cast<Element*>((*object));
++		element=xDynamicCast<Element*>((*object));
+ 		element->ResetHooks();
+ 
+ 	}
+@@ -84,7 +84,7 @@
+ 	/*Now go through all elements, and get how many nodes they own, unless they are clone nodes: */
+ 	for(int i=0;i<this->Size();i++){
+ 
+-		Element* element=dynamic_cast<Element*>(this->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(this->GetObjectByOffset(i));
+ 		numnodes=element->GetNumberOfNodes();
+ 		if(numnodes>max)max=numnodes;
+ 	}
+@@ -110,7 +110,7 @@
+ void Elements::InputDuplicate(int input_enum,int output_enum){/*{{{*/
+ 
+ 	for(int i=0;i<this->Size();i++){
+-		Element* element=dynamic_cast<Element*>(this->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(this->GetObjectByOffset(i));
+ 		element->InputDuplicate(input_enum,output_enum);
+ 	}
+ }
+Index: ../trunk-jpl/src/c/classes/Elements/Tetra.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tetra.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/Elements/Tetra.cpp	(revision 18521)
+@@ -823,7 +823,7 @@
+ 	tria->inputs=(Inputs*)this->inputs->SpawnTriaInputs(index1,index2,index3);
+ 	tria->parameters=this->parameters;
+ 	tria->element_type=P1Enum; //Only P1 CG for now (TO BE CHANGED)
+-	this->SpawnTriaHook(dynamic_cast<ElementHook*>(tria),index1,index2,index3);
++	this->SpawnTriaHook(xDynamicCast<ElementHook*>(tria),index1,index2,index3);
+ 
+ 	/*Spawn material*/
+ 	tria->material=(Material*)this->material->copy2(tria);
+Index: ../trunk-jpl/src/c/classes/Elements/TriaRef.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/TriaRef.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/Elements/TriaRef.cpp	(revision 18521)
+@@ -145,7 +145,7 @@
+ 
+ 	/*Cast gauss to GaussTria*/
+ 	_assert_(gauss_in->Enum()==GaussTriaEnum);
+-	GaussTria* gauss = dynamic_cast<GaussTria*>(gauss_in);
++	GaussTria* gauss = xDynamicCast<GaussTria*>(gauss_in);
+ 
+ 	switch(finiteelement){
+ 		case NoneEnum:
+@@ -270,7 +270,7 @@
+ 
+ 	/*Cast gauss to GaussTria*/
+ 	_assert_(gauss_in->Enum()==GaussTriaEnum);
+-	GaussTria* gauss = dynamic_cast<GaussTria*>(gauss_in);
++	GaussTria* gauss = xDynamicCast<GaussTria*>(gauss_in);
+ 
+ 	switch(finiteelement){
+ 		case P0Enum:
+Index: ../trunk-jpl/src/c/classes/Hook.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Hook.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/Hook.cpp	(revision 18521)
+@@ -167,7 +167,7 @@
+ 
+ 		/*Now, for this->objects that did not get resolved, and for which we have no offset, chase them in the dataset, by id: */
+ 		if(this->objects[i]==NULL){
+-			this->objects[i]=dynamic_cast<Object*>(dataset->GetObjectById(this->offsets+i,this->ids[i])); //remember the offset for later on.
++			this->objects[i]=xDynamicCast<Object*>(dataset->GetObjectById(this->offsets+i,this->ids[i])); //remember the offset for later on.
+ 			/*check the id is correct!: */
+ 			if (this->objects[i]->Id()!=this->ids[i]) _error_("wrong id: " << this->objects[i]->Id() << " vs " << this->ids[i] << "  in resolved pointer!");
+ 		}
+Index: ../trunk-jpl/src/c/classes/gauss/GaussPenta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/gauss/GaussPenta.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/gauss/GaussPenta.cpp	(revision 18521)
+@@ -7,6 +7,7 @@
+ #include "../../shared/io/Print/Print.h"
+ #include "../../shared/Exceptions/exceptions.h"
+ #include "../../shared/MemOps/MemOps.h"
++#include "../../shared/Numerics/recast.h"
+ #include "../../shared/Enum/Enum.h"
+ #include "../../shared/Numerics/GaussPoints.h"
+ #include "../../shared/Numerics/constants.h"
+@@ -749,7 +750,7 @@
+ void GaussPenta::SynchronizeGaussBase(Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussTriaEnum);
+-	GaussTria* gauss_tria = dynamic_cast<GaussTria*>(gauss);
++	GaussTria* gauss_tria = xDynamicCast<GaussTria*>(gauss);
+ 
+ 	gauss_tria->coord1=this->coord1;
+ 	gauss_tria->coord2=this->coord2;
+Index: ../trunk-jpl/src/c/classes/Inputs/ControlInput.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/ControlInput.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/Inputs/ControlInput.cpp	(revision 18521)
+@@ -86,11 +86,11 @@
+ 	output->enum_type=this->enum_type;
+ 	output->control_id=this->control_id;
+ 
+-	if(values)      output->values      = dynamic_cast<Input*>(this->values->copy());
+-	if(savedvalues) output->savedvalues = dynamic_cast<Input*>(this->savedvalues->copy());
+-	if(minvalues)   output->minvalues   = dynamic_cast<Input*>(this->minvalues->copy());
+-	if(maxvalues)   output->maxvalues   = dynamic_cast<Input*>(this->maxvalues->copy());
+-	if(gradient)    output->gradient    = dynamic_cast<Input*>(this->gradient->copy());
++	if(values)      output->values      = xDynamicCast<Input*>(this->values->copy());
++	if(savedvalues) output->savedvalues = xDynamicCast<Input*>(this->savedvalues->copy());
++	if(minvalues)   output->minvalues   = xDynamicCast<Input*>(this->minvalues->copy());
++	if(maxvalues)   output->maxvalues   = xDynamicCast<Input*>(this->maxvalues->copy());
++	if(gradient)    output->gradient    = xDynamicCast<Input*>(this->gradient->copy());
+ 
+ 	return output;
+ }
+@@ -233,14 +233,14 @@
+ 	if(!values) _error_("Values of " << EnumToStringx(this->enum_type) << " not found");
+ 
+ 	if(savedvalues) delete this->savedvalues;
+-	this->savedvalues=dynamic_cast<Input*>(this->values->copy());
++	this->savedvalues=xDynamicCast<Input*>(this->values->copy());
+ }/*}}}*/
+ void ControlInput::UpdateValue(IssmDouble scalar){/*{{{*/
+ 	if(!gradient)    _error_("Gradient of " << EnumToStringx(this->enum_type) << " not found");
+ 	if(!savedvalues) _error_("Values of " << EnumToStringx(this->enum_type) << " not found");
+ 
+ 	if(values) delete this->values;
+-	this->values=dynamic_cast<Input*>(this->savedvalues->copy());
++	this->values=xDynamicCast<Input*>(this->savedvalues->copy());
+ 	this->values->AXPY(gradient,scalar);
+ }/*}}}*/
+ void ControlInput::VerticallyIntegrate(Input* thickness_input){/*{{{*/
+Index: ../trunk-jpl/src/c/classes/Inputs/DatasetInput.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/DatasetInput.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/Inputs/DatasetInput.cpp	(revision 18521)
+@@ -80,7 +80,7 @@
+ 	/*Create new Datasetinput (copy of current input)*/
+ 	outinput=new DatasetInput();
+ 	outinput->enum_type=this->enum_type;
+-	outinput->inputs=dynamic_cast<Inputs*>(this->inputs->SpawnTriaInputs(index1,index2,index3));
++	outinput->inputs=xDynamicCast<Inputs*>(this->inputs->SpawnTriaInputs(index1,index2,index3));
+ 	outinput->numids=this->numids;
+ 	outinput->ids=xNew<int>(this->numids);
+ 	xMemCpy(outinput->ids,this->ids,this->numids);
+@@ -97,7 +97,7 @@
+ 	/*Create new Datasetinput (copy of current input)*/
+ 	outinput=new DatasetInput();
+ 	outinput->enum_type=this->enum_type;
+-	outinput->inputs=dynamic_cast<Inputs*>(this->inputs->SpawnSegInputs(index1,index2));
++	outinput->inputs=xDynamicCast<Inputs*>(this->inputs->SpawnSegInputs(index1,index2));
+ 	outinput->numids=this->numids;
+ 	outinput->ids=xNew<int>(this->numids);
+ 	xMemCpy(outinput->ids,this->ids,this->numids);
+@@ -156,7 +156,7 @@
+ 	for(int i=0;i<this->numids;i++) if(this->ids[i]==id) offset=i;
+ 	if(offset<0) _error_("Could not find input of id "<<id );
+ 
+-	Input* input=dynamic_cast<Input*>(this->inputs->GetObjectByOffset(offset));
++	Input* input=xDynamicCast<Input*>(this->inputs->GetObjectByOffset(offset));
+ 	input->GetInputValue(pvalue,gauss);
+ }
+ /*}}}*/
+Index: ../trunk-jpl/src/c/classes/Inputs/Inputs.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/Inputs.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/Inputs/Inputs.cpp	(revision 18521)
+@@ -37,7 +37,7 @@
+ 	/*Go through inputs and check whether any input with the same name is already in: */
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		input=dynamic_cast<Input*>(*object);
++		input=xDynamicCast<Input*>(*object);
+ 		if (input->InstanceEnum()==enum_type){
+ 			found=true;
+ 			break;
+@@ -64,7 +64,7 @@
+ 	/*Go through inputs and check whether any input with the same name is already in: */
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		input=dynamic_cast<Input*>(*object);
++		input=xDynamicCast<Input*>(*object);
+ 		if (input->InstanceEnum()==enum_type){
+ 			found=true;
+ 			break;
+@@ -91,7 +91,7 @@
+ 	/*Go through inputs and check whether any input with the same name is already in: */
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		input=dynamic_cast<Input*>(*object); 
++		input=xDynamicCast<Input*>(*object); 
+ 		if (input->InstanceEnum()==enum_type){
+ 			found=true;
+ 			break;
+@@ -118,7 +118,7 @@
+ 	/*Go through inputs and check whether any input with the same name is already in: */
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		input=dynamic_cast<Input*>(*object);
++		input=xDynamicCast<Input*>(*object);
+ 		if (input->InstanceEnum()==enum_type){
+ 			found=true;
+ 			break;
+@@ -149,7 +149,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		input=dynamic_cast<Input*>(*object);
++		input=xDynamicCast<Input*>(*object);
+ 
+ 		if (input->InstanceEnum()==in_input->InstanceEnum()){
+ 			this->DeleteObject(input);
+@@ -170,7 +170,7 @@
+ 
+ 	/*Delete existing input of newenumtype if it exists*/
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+-		input=dynamic_cast<Input*>(*object);
++		input=xDynamicCast<Input*>(*object);
+ 
+ 		if (input->InstanceEnum()==newenumtype){
+ 			this->DeleteObject(input);
+@@ -181,7 +181,7 @@
+ 	/*Change enum_type of input of oldenumtype*/
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		input=dynamic_cast<Input*>(*object);
++		input=xDynamicCast<Input*>(*object);
+ 
+ 		if (input->InstanceEnum()==oldenumtype){
+ 			input->ChangeEnum(newenumtype);
+@@ -193,7 +193,7 @@
+ void  Inputs::ConstrainMin(int constrain_enum, IssmDouble minimum){/*{{{*/
+ 
+ 	/*Find x and y inputs: */
+-	Input* constrain_input=dynamic_cast<Input*>(this->GetInput(constrain_enum));
++	Input* constrain_input=xDynamicCast<Input*>(this->GetInput(constrain_enum));
+ 
+ 	/*some checks: */
+ 	if(!constrain_input) _error_("input " << EnumToStringx(constrain_enum) << " could not be found!");
+@@ -208,7 +208,7 @@
+ 	IssmDouble norm;
+ 
+ 	/*Get input*/
+-	Input* input=dynamic_cast<Input*>(this->GetInput(enumtype));
++	Input* input=xDynamicCast<Input*>(this->GetInput(enumtype));
+ 
+ 	/*Apply ContrainMin: */
+ 	if (input){
+@@ -228,7 +228,7 @@
+ 	IssmDouble max;
+ 
+ 	/*Get input*/
+-	Input* input=dynamic_cast<Input*>(this->GetInput(enumtype));
++	Input* input=xDynamicCast<Input*>(this->GetInput(enumtype));
+ 
+ 	/*Apply ContrainMin: */
+ 	if (input){
+@@ -248,7 +248,7 @@
+ 	IssmDouble max;
+ 
+ 	/*Get input*/
+-	Input* input=dynamic_cast<Input*>(this->GetInput(enumtype));
++	Input* input=xDynamicCast<Input*>(this->GetInput(enumtype));
+ 
+ 	/*Apply ContrainMin: */
+ 	if (input){
+@@ -268,7 +268,7 @@
+ 	IssmDouble min;
+ 
+ 	/*Get input*/
+-	Input* input=dynamic_cast<Input*>(this->GetInput(enumtype));
++	Input* input=xDynamicCast<Input*>(this->GetInput(enumtype));
+ 
+ 	/*Apply ContrainMin: */
+ 	if (input){
+@@ -288,7 +288,7 @@
+ 	IssmDouble min;
+ 
+ 	/*Get input*/
+-	Input* input=dynamic_cast<Input*>(this->GetInput(enumtype));
++	Input* input=xDynamicCast<Input*>(this->GetInput(enumtype));
+ 
+ 	/*Apply ContrainMin: */
+ 	if (input){
+@@ -309,7 +309,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		input=dynamic_cast<Input*>(*object);
++		input=xDynamicCast<Input*>(*object);
+ 
+ 		if (input->InstanceEnum()==enum_name){
+ 			return input;
+@@ -325,7 +325,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		input=dynamic_cast<Input*>(*object);
++		input=xDynamicCast<Input*>(*object);
+ 
+ 		if (input->InstanceEnum()==enum_type){
+ 			this->DeleteObject(input);
+@@ -340,15 +340,15 @@
+ void  Inputs::DuplicateInput(int original_enum,int new_enum){/*{{{*/
+ 
+ 	/*Make a copy of the original input: */
+-	Input* original=dynamic_cast<Input*>(this->GetInput(original_enum));
++	Input* original=xDynamicCast<Input*>(this->GetInput(original_enum));
+ 	if(!original)_error_("could not find input with enum: " << EnumToStringx(original_enum)); 
+-	Input* copy=dynamic_cast<Input*>(original->copy());
++	Input* copy=xDynamicCast<Input*>(original->copy());
+ 
+ 	/*Change copy enum to reinitialized_enum: */
+ 	copy->ChangeEnum(new_enum);
+ 
+ 	/*Add copy into inputs, it will wipe off the one already there: */
+-	this->AddInput(dynamic_cast<Input*>(copy));
++	this->AddInput(xDynamicCast<Input*>(copy));
+ }
+ /*}}}*/
+ Inputs* Inputs::SpawnTriaInputs(int index1,int index2,int index3){/*{{{*/
+@@ -365,7 +365,7 @@
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+ 		/*Create new input*/
+-		inputin=dynamic_cast<Input*>(*object);
++		inputin=xDynamicCast<Input*>(*object);
+ 		inputout=inputin->SpawnTriaInput(index1,index2,index3);
+ 
+ 		/*Add input to new inputs*/
+@@ -390,7 +390,7 @@
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+ 		/*Create new input*/
+-		inputin=dynamic_cast<Input*>(*object);
++		inputin=xDynamicCast<Input*>(*object);
+ 		inputout=inputin->SpawnSegInput(index1,index2);
+ 
+ 		/*Add input to new inputs*/
+@@ -404,8 +404,8 @@
+ void  Inputs::AXPY(int inputy_enum, IssmDouble scalar, int inputx_enum){/*{{{*/
+ 
+ 	/*Find x and y inputs: */
+-	Input* xinput=dynamic_cast<Input*>(this->GetInput(inputx_enum));
+-	Input* yinput=dynamic_cast<Input*>(this->GetInput(inputy_enum));
++	Input* xinput=xDynamicCast<Input*>(this->GetInput(inputx_enum));
++	Input* yinput=xDynamicCast<Input*>(this->GetInput(inputy_enum));
+ 
+ 	/*some checks: */
+ 	if(!xinput) _error_("input " << EnumToStringx(inputx_enum) << " could not be found!");
+@@ -422,7 +422,7 @@
+ 
+ 	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-		input=dynamic_cast<Input*>(*object);
++		input=xDynamicCast<Input*>(*object);
+ 		input->Configure(parameters);
+ 
+ 	}
+Index: ../trunk-jpl/src/c/classes/Nodes.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Nodes.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/Nodes.cpp	(revision 18521)
+@@ -48,7 +48,7 @@
+ 
+ 	/*Go through objects, and distribute dofs locally, from 0 to numberofdofsperobject*/
+ 	for(i=0;i<this->Size();i++){
+-		Node* node=dynamic_cast<Node*>(this->GetObjectByOffset(i));
++		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+ 
+ 		/*Check that this node corresponds to our analysis currently being carried out: */
+ 		if(node->InAnalysis(analysis_type)){
+@@ -71,7 +71,7 @@
+ 	}
+ 	for(i=0;i<this->Size();i++){
+ 		/*Check that this node corresponds to our analysis currently being carried out: */
+-		Node* node=dynamic_cast<Node*>(this->GetObjectByOffset(i));
++		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+ 		if (node->InAnalysis(analysis_type)){
+ 			node->OffsetDofs(dofcount,setenum);
+ 		}
+@@ -88,7 +88,7 @@
+ 	}
+ 
+ 	for(i=0;i<this->Size();i++){
+-		Node* node=dynamic_cast<Node*>(this->GetObjectByOffset(i));
++		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+ 		if (node->InAnalysis(analysis_type)){
+ 			node->ShowTrueDofs(truedofs,maxdofspernode,setenum);//give maxdofspernode, column size, so that nodes can index into truedofs
+ 		}
+@@ -98,7 +98,7 @@
+ 
+ 	/* Now every cpu knows the true dofs of everyone else that is not a clone*/
+ 	for(i=0;i<this->Size();i++){
+-		Node* node=dynamic_cast<Node*>(this->GetObjectByOffset(i));
++		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+ 		if (node->InAnalysis(analysis_type)){
+ 			node->UpdateCloneDofs(alltruedofs,maxdofspernode,setenum);
+ 		}
+@@ -106,7 +106,7 @@
+ 
+ 	/*Update indexingupdateflag*/
+ 	for(i=0;i<this->Size();i++){
+-		Node* node=dynamic_cast<Node*>(this->GetObjectByOffset(i));
++		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+ 		if (node->InAnalysis(analysis_type)){
+ 			node->ReindexingDone();
+ 		}
+@@ -147,7 +147,7 @@
+ 	/*Now go through all objects, and use minranks to flag which objects are cloned: */
+ 	for(i=0;i<this->Size();i++){
+ 
+-		Node* node=dynamic_cast<Node*>(this->GetObjectByOffset(i));
++		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+ 
+ 		/*Check that this node corresponds to our analysis currently being carried out: */
+ 		if (node->InAnalysis(analysis_type)){
+@@ -171,7 +171,7 @@
+ 	/*Now go through all nodes, and get how many dofs they own, unless they are clone nodes: */
+ 	for(int i=0;i<this->Size();i++){
+ 
+-		Node* node=dynamic_cast<Node*>(this->GetObjectByOffset(i));
++		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+ 
+ 		/*Check that this node corresponds to our analysis currently being carried out: */
+ 		if (node->InAnalysis(analysis_type)){
+@@ -196,7 +196,7 @@
+ 	/*Now go through all nodes, and get how many dofs they own, unless they are clone nodes: */
+ 	if(!sorted){
+ 		for(int i=0;i<this->Size();i++){
+-			Node* node=dynamic_cast<Node*>(this->GetObjectByOffset(i));
++			Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+ 			id=node->Id();
+ 			if(id>max)max=id;
+ 		}
+@@ -206,7 +206,7 @@
+ 			max = 0;
+ 		}
+ 		else{
+-			Node* node=dynamic_cast<Node*>(this->GetObjectByOffset(this->Size()-1));
++			Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(this->Size()-1));
+ 			max = node->Id();
+ 		}
+ 	}
+@@ -237,7 +237,7 @@
+ 	/*Now go through all nodes, and get how many dofs they own, unless they are clone nodes: */
+ 	for(int i=0;i<this->Size();i++){
+ 
+-		Node* node=dynamic_cast<Node*>(this->GetObjectByOffset(i));
++		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+ 
+ 		/*Check that this node corresponds to our analysis currently being carried out: */
+ 		if (node->InAnalysis(analysis_type)){
+@@ -261,7 +261,7 @@
+ 
+ 	/*Now go through all nodes, and get how many dofs they own, unless they are clone nodes: */
+ 	for(int i=0;i<this->Size();i++){
+-		Node* node=dynamic_cast<Node*>(this->GetObjectByOffset(i));
++		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+ 
+ 		/*Ok, this object is a node, ask it to plug values into partition: */
+ 		if (!node->IsClone()) numnodes++;
+@@ -283,7 +283,7 @@
+ 
+ 	for(i=0;i<this->Size();i++){
+ 
+-		Node* node=dynamic_cast<Node*>(this->GetObjectByOffset(i));
++		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+ 
+ 		/*Check that this node corresponds to our analysis currently being carried out: */
+ 		if (node->InAnalysis(analysis_type)){
+@@ -315,7 +315,7 @@
+ 	/*Go through nodes, and for each object, report it cpu: */
+ 	for(int i=0;i<this->Size();i++){
+ 
+-		Node* node=dynamic_cast<Node*>(this->GetObjectByOffset(i));
++		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+ 
+ 		/*Check that this node corresponds to our analysis currently being carried out: */
+ 		if (node->InAnalysis(analysis_type)){
+@@ -334,7 +334,7 @@
+ 	/*Now go through all nodes, and get how many dofs they own, unless they are clone nodes: */
+ 	for(int i=0;i<this->Size();i++){
+ 
+-		Node* node=dynamic_cast<Node*>(this->GetObjectByOffset(i));
++		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+ 
+ 		/*Check that this node corresponds to our analysis currently being carried out: */
+ 		if(node->InAnalysis(analysis_type)){
+Index: ../trunk-jpl/src/c/classes/Vertices.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Vertices.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/Vertices.cpp	(revision 18521)
+@@ -51,7 +51,7 @@
+ 
+ 	/*Go through objects, and distribute pids locally, from 0 to numberofpidsperobject*/
+ 	for (i=0;i<this->Size();i++){
+-		Vertex* vertex=dynamic_cast<Vertex*>(this->GetObjectByOffset(i));
++		Vertex* vertex=xDynamicCast<Vertex*>(this->GetObjectByOffset(i));
+ 		vertex->DistributePids(&pidcount);
+ 	}
+ 
+@@ -71,7 +71,7 @@
+ 		}
+ 	}
+ 	for (i=0;i<this->Size();i++){
+-		Vertex* vertex=dynamic_cast<Vertex*>(this->GetObjectByOffset(i));
++		Vertex* vertex=xDynamicCast<Vertex*>(this->GetObjectByOffset(i));
+ 		vertex->OffsetPids(pidcount);
+ 	}
+ 
+@@ -81,14 +81,14 @@
+ 	truepids   =xNewZeroInit<int>(numberofobjects);
+ 	alltruepids=xNewZeroInit<int>(numberofobjects);
+ 	for (i=0;i<this->Size();i++){
+-		Vertex* vertex=dynamic_cast<Vertex*>(this->GetObjectByOffset(i));
++		Vertex* vertex=xDynamicCast<Vertex*>(this->GetObjectByOffset(i));
+ 		vertex->ShowTruePids(truepids);
+ 	}
+ 	ISSM_MPI_Allreduce((void*)truepids,(void*)alltruepids,numberofobjects,ISSM_MPI_INT,ISSM_MPI_MAX,IssmComm::GetComm());
+ 
+ 	/* Now every cpu knows the true pids of everyone else that is not a clone*/
+ 	for(i=0;i<this->Size();i++){
+-		Vertex* vertex=dynamic_cast<Vertex*>(this->GetObjectByOffset(i));
++		Vertex* vertex=xDynamicCast<Vertex*>(this->GetObjectByOffset(i));
+ 		vertex->UpdateClonePids(alltruepids);
+ 	}
+ 
+@@ -127,7 +127,7 @@
+ 	/*Now go through all objects, and use minranks to flag which objects are cloned: */
+ 	for(i=0;i<this->Size();i++){
+ 		/*For this object, decide whether it is a clone: */
+-		Vertex* vertex=dynamic_cast<Vertex*>(this->GetObjectByOffset(i));
++		Vertex* vertex=xDynamicCast<Vertex*>(this->GetObjectByOffset(i));
+ 		vertex->SetClone(minranks);
+ 	}
+ 
+@@ -144,7 +144,7 @@
+ 	int vertex_max_sid;
+ 
+ 	for(i=0;i<this->Size();i++){
+-		Vertex* vertex=dynamic_cast<Vertex*>(this->GetObjectByOffset(i));
++		Vertex* vertex=xDynamicCast<Vertex*>(this->GetObjectByOffset(i));
+ 		sid=vertex->Sid();
+ 		if (sid>max_sid)max_sid=sid;
+ 	}
+@@ -171,7 +171,7 @@
+ 	/*Go through a dataset, and for each object, report it cpu: */
+ 	for(int i=0;i<this->Size();i++){
+ 		/*Plug rank into ranks, according to id: */
+-		Vertex* vertex=dynamic_cast<Vertex*>(this->GetObjectByOffset(i));
++		Vertex* vertex=xDynamicCast<Vertex*>(this->GetObjectByOffset(i));
+ 		sid=vertex->Sid();
+ 		ranks[sid]=my_rank; 
+ 	}
+@@ -201,7 +201,7 @@
+ 	for(i=0;i<this->Size();i++){
+ 
+ 		/*let vertex fill matrix: */
+-		Vertex* vertex=dynamic_cast<Vertex*>(this->GetObjectByOffset(i));
++		Vertex* vertex=xDynamicCast<Vertex*>(this->GetObjectByOffset(i));
+ 		vertex->ToXYZ(xyz);
+ 	}
+ 
+Index: ../trunk-jpl/src/c/classes/IoModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/IoModel.cpp	(revision 18520)
++++ ../trunk-jpl/src/c/classes/IoModel.cpp	(revision 18521)
+@@ -258,10 +258,10 @@
+ 	_assert_(this->constants);
+ 
+ 	/*Find constant*/
+-	Param* param=dynamic_cast<Param*>(this->constants->FindParamObject(constant_enum));
++	Param* param=xDynamicCast<Param*>(this->constants->FindParamObject(constant_enum));
+ 	if(!param) _error_("Constant " << EnumToStringx(constant_enum) << " not found in iomodel");
+ 
+-	return dynamic_cast<Param*>(param->copy());
++	return xDynamicCast<Param*>(param->copy());
+ }
+ /*}}}*/
+ IssmDouble* IoModel::Data(int data_enum){/*{{{*/
+@@ -1454,7 +1454,7 @@
+ 	this->FetchData(&doublearray,&M,&N,vector_enum);
+ 
+ 	for(int i=0;i<elements->Size();i++){
+-		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		if(!doublearray) element->AddInput(vector_enum,&default_value,P0Enum); 
+ 		else             element->InputCreate(doublearray,this,M,N,vector_layout,vector_enum,code);//we need i to index into elements.
+ 	}
+@@ -1484,21 +1484,21 @@
+ 		case 1: //boolean constant
+ 			this->FetchData(&boolean,vector_enum);
+ 			for(i=0;i<elements->Size();i++){
+-				Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 				element->InputUpdateFromConstant(boolean,vector_enum);
+ 			}
+ 			break;
+ 		case 2: //integer constant
+ 			this->FetchData(&integer,vector_enum);
+ 			for(i=0;i<elements->Size();i++){
+-				Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 				element->InputUpdateFromConstant(integer,vector_enum);
+ 			}
+ 			break;
+ 		case 3: //IssmDouble constant
+ 			this->FetchData(&scalar,vector_enum);
+ 			for(i=0;i<elements->Size();i++){
+-				Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 				element->InputUpdateFromConstant(scalar,vector_enum);
+ 			}
+ 			break; 
+@@ -1506,7 +1506,7 @@
+ 			this->FetchData(&doublearray,&M,&N,vector_enum); //we still have a doublearray, because it might include times in transient mode
+ 			if(!doublearray) _error_(EnumToStringx(vector_enum)<<" not found in binary file");
+ 			for(i=0;i<elements->Size();i++){
+-				Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 				element->InputCreate(doublearray,this,M,N,vector_layout,vector_enum,code);//we need i to index into elements.
+ 			}
+ 			break;
+@@ -1514,7 +1514,7 @@
+ 			this->FetchData(&doublearray,&M,&N,vector_enum); //we still have a doublearray, because it might include times in transient mode
+ 			if(!doublearray) _error_(EnumToStringx(vector_enum)<<" not found in binary file");
+ 			for(i=0;i<elements->Size();i++){
+-				Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 				element->InputCreate(doublearray,this,M,N,vector_layout,vector_enum,code);//we need i to index into elements.
+ 			}
+ 			break;
+@@ -1522,7 +1522,7 @@
+ 			this->FetchData(&doublearray,&M,&N,vector_enum);
+ 			if(!doublearray) _error_(EnumToStringx(vector_enum)<<" not found in binary file");
+ 			for(i=0;i<elements->Size();i++){
+-				Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
++				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 				element->InputCreate(doublearray,this,M,N,vector_layout,vector_enum,code);//we need i to index into elements.
+ 			}
+ 			break;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18521-18522.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18521-18522.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18521-18522.diff	(revision 19102)
@@ -0,0 +1,33 @@
+Index: ../trunk-jpl/src/c/modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.cpp	(revision 18521)
++++ ../trunk-jpl/src/c/modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.cpp	(revision 18522)
+@@ -9,23 +9,20 @@
+ 
+ IssmDouble OutputDefinitionsResponsex(FemModel* femmodel,const char* output_string){
+ 
+-	Definition *definition         = NULL;
+-	DataSet    *output_definitions = NULL;
+-	IssmDouble  return_value;
+-
+ 	/*Ok, go find the output definitions dataset in the parameters, where our responses are hiding: */
+-	output_definitions=((DataSetParam*)femmodel->parameters->FindParamObject(OutputdefinitionEnum))->value;
++	DataSet* output_definitions=((DataSetParam*)femmodel->parameters->FindParamObject(OutputdefinitionEnum))->value;
+ 
+ 	/*Now, go through the output definitions, and retrieve the object which corresponds to our requested response, output_string: */
+ 	for(int i=0;i<output_definitions->Size();i++){
+ 		
+-		definition=xDynamicCast<Definition*>(output_definitions->GetObjectByOffset(i));
++		//Definition* definition=xDynamicCast<Definition*>(output_definitions->GetObjectByOffset(i));
++		Definition* definition=dynamic_cast<Definition*>(output_definitions->GetObjectByOffset(i));
+ 
+ 		char* name = definition->Name();
+-		if (strcmp(name,output_string)==0){
++		if(strcmp(name,output_string)==0){
+ 
+ 			/*This is the object that we have been chasing for. compute the response and return: */
+-			return_value=definition->Response(femmodel);
++			IssmDouble return_value=definition->Response(femmodel);
+ 		
+ 			/*cleanup: */
+ 			xDelete<char>(name);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18522-18523.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18522-18523.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18522-18523.diff	(revision 19102)
@@ -0,0 +1,336 @@
+Index: ../trunk-jpl/src/c/classes/Elements/PentaRef.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/PentaRef.cpp	(revision 18522)
++++ ../trunk-jpl/src/c/classes/Elements/PentaRef.cpp	(revision 18523)
+@@ -1,4 +1,4 @@
+-/*!\file PentaRef.c
++/*!\file PentaRef.cpp
+  * \brief: implementation of the PentaRef object
+  */
+ 
+@@ -25,6 +25,7 @@
+ #define NUMNODESP2    18
+ #define NUMNODESP2b   19
+ #define NUMNODESP2xP4 30
++#define NUMNODESMAX   30
+ 
+ /*Object constructors and destructor*/
+ PentaRef::PentaRef(){/*{{{*/
+@@ -885,24 +886,25 @@
+ }
+ /*}}}*/
+ void PentaRef::GetInputValue(IssmDouble* pvalue,IssmDouble* plist,Gauss* gauss,int finiteelement){/*{{{*/
++	/* WARNING: For a significant gain in performance, it is better to use
++	 * static memory allocation instead of dynamic.*/
+ 
+-	/*Output*/
+-	IssmDouble value =0.;
++	/*Allocate basis functions*/
++	IssmDouble  basis[NUMNODESMAX];
+ 
+ 	/*Fetch number of nodes for this finite element*/
+ 	int numnodes = this->NumberofNodes(finiteelement);
++	_assert_(numnodes<=NUMNODESMAX);
+ 
+-	/*Get nodal functions*/
+-	IssmDouble* basis=xNew<IssmDouble>(numnodes);
+-	GetNodalFunctions(basis, gauss,finiteelement);
++	/*Get basis functions at this point*/
++	GetNodalFunctions(&basis[0],gauss,finiteelement);
+ 
+ 	/*Calculate parameter for this Gauss point*/
++	IssmDouble value =0.;
+ 	for(int i=0;i<numnodes;i++) value += basis[i]*plist[i];
+ 
+ 	/*Assign output pointer*/
+-	xDelete<IssmDouble>(basis);
+ 	*pvalue = value;
+-
+ }
+ /*}}}*/
+ void PentaRef::GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, Gauss* gauss,int finiteelement){/*{{{*/
+@@ -914,31 +916,33 @@
+ 	 *   dp/dz=p_list[0]*dh1/dz+p_list[1]*dh2/dz+p_list[2]*dh3/dz+p_list[3]*dh4/dz+p_list[4]*dh5/dz+p_list[5]*dh6/dz;
+ 	 *
+ 	 *   p is a vector of size 3x1 already allocated.
++	 *
++	 * WARNING: For a significant gain in performance, it is better to use
++	 * static memory allocation instead of dynamic.
+ 	 */
+ 
+-	/*Output*/
+-	IssmDouble dpx=0.;
+-	IssmDouble dpy=0.;
+-	IssmDouble dpz=0.;
++	/*Allocate derivatives of basis functions*/
++	IssmDouble  dbasis[3*NUMNODESMAX];
+ 
+ 	/*Fetch number of nodes for this finite element*/
+ 	int numnodes = this->NumberofNodes(finiteelement);
++	_assert_(numnodes<=NUMNODESMAX);
+ 
+-	/*Get nodal functions derivatives*/
+-	IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
+-	GetNodalFunctionsDerivatives(dbasis,xyz_list,gauss,finiteelement);
++	/*Get basis functions derivatives at this point*/
++	GetNodalFunctionsDerivatives(&dbasis[0],xyz_list,gauss,finiteelement);
+ 
+ 	/*Calculate parameter for this Gauss point*/
++	IssmDouble dpx=0.;
++	IssmDouble dpy=0.;
++	IssmDouble dpz=0.;
+ 	for(int i=0;i<numnodes;i++) dpx += dbasis[0*numnodes+i]*plist[i];
+ 	for(int i=0;i<numnodes;i++) dpy += dbasis[1*numnodes+i]*plist[i];
+ 	for(int i=0;i<numnodes;i++) dpz += dbasis[2*numnodes+i]*plist[i];
+ 
+ 	/*Assign values*/
+-	xDelete<IssmDouble>(dbasis);
+ 	p[0]=dpx;
+ 	p[1]=dpy;
+ 	p[2]=dpz;
+-
+ }
+ /*}}}*/
+ int  PentaRef::NumberofNodes(int finiteelement){/*{{{*/
+Index: ../trunk-jpl/src/c/classes/Elements/SegRef.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/SegRef.cpp	(revision 18522)
++++ ../trunk-jpl/src/c/classes/Elements/SegRef.cpp	(revision 18523)
+@@ -17,6 +17,7 @@
+ /*Element macros*/
+ #define NUMNODESP0  1
+ #define NUMNODESP1  2
++#define NUMNODESMAX 2
+ 
+ /*Object constructors and destructor*/
+ SegRef::SegRef(){/*{{{*/
+@@ -114,44 +115,48 @@
+ 	 *   dp/dx=plist[0]*dh1/dx+plist[1]*dh2/dx
+ 	 *
+ 	 * p is a vector already allocated.
++	 *
++	 * WARNING: For a significant gain in performance, it is better to use
++	 * static memory allocation instead of dynamic.
+ 	 */
+ 
+-	/*Output*/
+-	IssmDouble dpx = 0.;
++	/*Allocate derivatives of basis functions*/
++	IssmDouble  dbasis[1*NUMNODESMAX];
+ 
+ 	/*Fetch number of nodes for this finite element*/
+ 	int numnodes = this->NumberofNodes(finiteelement);
++	_assert_(numnodes<=NUMNODESMAX);
+ 
+-	/*Get nodal functions derivatives*/
+-	IssmDouble* dbasis=xNew<IssmDouble>(1*numnodes);
+-	GetNodalFunctionsDerivatives(dbasis,xyz_list,gauss,finiteelement);
++	/*Get basis functions derivatives at this point*/
++	GetNodalFunctionsDerivatives(&dbasis[0],xyz_list,gauss,finiteelement);
+ 
+ 	/*Calculate parameter for this Gauss point*/
+-	for(int i=0;i<numnodes;i++) dpx += dbasis[i]*plist[i];
++	IssmDouble dpx=0.;
++	for(int i=0;i<numnodes;i++) dpx += dbasis[0*numnodes+i]*plist[i];
+ 
+ 	/*Assign values*/
+-	xDelete<IssmDouble>(dbasis);
+-	*p=dpx;
+-
++	p[0]=dpx;
+ }
+ /*}}}*/
+ void SegRef::GetInputValue(IssmDouble* p, IssmDouble* plist, GaussSeg* gauss,int finiteelement){/*{{{*/
++	/* WARNING: For a significant gain in performance, it is better to use
++	 * static memory allocation instead of dynamic.*/
+ 
+-	/*Output*/
+-	IssmDouble value =0.;
++	/*Allocate basis functions*/
++	IssmDouble  basis[NUMNODESMAX];
+ 
+ 	/*Fetch number of nodes for this finite element*/
+ 	int numnodes = this->NumberofNodes(finiteelement);
++	_assert_(numnodes<=NUMNODESMAX);
+ 
+-	/*Get nodal functions*/
+-	IssmDouble* basis=xNew<IssmDouble>(numnodes);
+-	GetNodalFunctions(basis, gauss,finiteelement);
++	/*Get basis functions at this point*/
++	GetNodalFunctions(&basis[0],gauss,finiteelement);
+ 
+ 	/*Calculate parameter for this Gauss point*/
++	IssmDouble value =0.;
+ 	for(int i=0;i<numnodes;i++) value += basis[i]*plist[i];
+ 
+ 	/*Assign output pointer*/
+-	xDelete<IssmDouble>(basis);
+ 	*p = value;
+ }
+ /*}}}*/
+Index: ../trunk-jpl/src/c/classes/Elements/TetraRef.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/TetraRef.cpp	(revision 18522)
++++ ../trunk-jpl/src/c/classes/Elements/TetraRef.cpp	(revision 18523)
+@@ -19,6 +19,7 @@
+ #define NUMNODESP1  4
+ #define NUMNODESP1b 5
+ #define NUMNODESP2  10
++#define NUMNODESMAX 10
+ 
+ /*Object constructors and destructor*/
+ TetraRef::TetraRef(){/*{{{*/
+@@ -216,49 +217,54 @@
+ 	 *   dp/dz=p_list[0]*dh1/dz+p_list[1]*dh2/dz+p_list[2]*dh3/dz+p_list[3]*dh4/dz+p_list[4]*dh5/dz+p_list[5]*dh6/dz;
+ 	 *
+ 	 *   p is a vector of size 3x1 already allocated.
++	 *
++	 * WARNING: For a significant gain in performance, it is better to use
++	 * static memory allocation instead of dynamic.
+ 	 */
+ 
+-	/*Output*/
+-	IssmDouble dpx=0.;
+-	IssmDouble dpy=0.;
+-	IssmDouble dpz=0.;
++	/*Allocate derivatives of basis functions*/
++	IssmDouble  dbasis[3*NUMNODESMAX];
+ 
+ 	/*Fetch number of nodes for this finite element*/
+ 	int numnodes = this->NumberofNodes(finiteelement);
++	_assert_(numnodes<=NUMNODESMAX);
+ 
+-	/*Get nodal functions derivatives*/
+-	IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
+-	GetNodalFunctionsDerivatives(dbasis,xyz_list,gauss,finiteelement);
++	/*Get basis functions derivatives at this point*/
++	GetNodalFunctionsDerivatives(&dbasis[0],xyz_list,gauss,finiteelement);
+ 
+ 	/*Calculate parameter for this Gauss point*/
++	IssmDouble dpx=0.;
++	IssmDouble dpy=0.;
++	IssmDouble dpz=0.;
+ 	for(int i=0;i<numnodes;i++) dpx += dbasis[0*numnodes+i]*plist[i];
+ 	for(int i=0;i<numnodes;i++) dpy += dbasis[1*numnodes+i]*plist[i];
+ 	for(int i=0;i<numnodes;i++) dpz += dbasis[2*numnodes+i]*plist[i];
+ 
+ 	/*Assign values*/
+-	xDelete<IssmDouble>(dbasis);
+ 	p[0]=dpx;
+ 	p[1]=dpy;
+ 	p[2]=dpz;
+ }
+ /*}}}*/
+ void TetraRef::GetInputValue(IssmDouble* p, IssmDouble* plist, Gauss* gauss,int finiteelement){/*{{{*/
++	/* WARNING: For a significant gain in performance, it is better to use
++	 * static memory allocation instead of dynamic.*/
+ 
+-	/*Output*/
+-	IssmDouble value =0.;
++	/*Allocate basis functions*/
++	IssmDouble  basis[NUMNODESMAX];
+ 
+ 	/*Fetch number of nodes for this finite element*/
+ 	int numnodes = this->NumberofNodes(finiteelement);
++	_assert_(numnodes<=NUMNODESMAX);
+ 
+-	/*Get nodal functions*/
+-	IssmDouble* basis=xNew<IssmDouble>(numnodes);
+-	GetNodalFunctions(basis, gauss,finiteelement);
++	/*Get basis functions at this point*/
++	GetNodalFunctions(&basis[0],gauss,finiteelement);
+ 
+ 	/*Calculate parameter for this Gauss point*/
++	IssmDouble value =0.;
+ 	for(int i=0;i<numnodes;i++) value += basis[i]*plist[i];
+ 
+ 	/*Assign output pointer*/
+-	xDelete<IssmDouble>(basis);
+ 	*p = value;
+ }
+ /*}}}*/
+Index: ../trunk-jpl/src/c/classes/Elements/TriaRef.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/TriaRef.cpp	(revision 18522)
++++ ../trunk-jpl/src/c/classes/Elements/TriaRef.cpp	(revision 18523)
+@@ -20,6 +20,7 @@
+ #define NUMNODESP1b 4
+ #define NUMNODESP2  6
+ #define NUMNODESP2b 7
++#define NUMNODESMAX 7
+ 
+ /*Object constructors and destructor*/
+ TriaRef::TriaRef(){/*{{{*/
+@@ -353,54 +354,58 @@
+ }
+ /*}}}*/
+ void TriaRef::GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, Gauss* gauss,int finiteelement){/*{{{*/
+-
+ 	/*From node values of parameter p (plist[0],plist[1],plist[2]), return parameter derivative value at gaussian 
+ 	 * point specified by gauss_basis:
+ 	 *   dp/dx=plist[0]*dh1/dx+plist[1]*dh2/dx+plist[2]*dh3/dx
+ 	 *   dp/dx=plist[0]*dh1/dx+plist[1]*dh2/dx+plist[2]*dh3/dx
+ 	 *
+ 	 * p is a vector already allocated.
++	 *
++	 * WARNING: For a significant gain in performance, it is better to use
++	 * static memory allocation instead of dynamic.
+ 	 */
+ 
+-	/*Output*/
+-	IssmDouble dpx=0.;
+-	IssmDouble dpy=0.;
++	/*Allocate derivatives of basis functions*/
++	IssmDouble  dbasis[2*NUMNODESMAX];
+ 
+ 	/*Fetch number of nodes for this finite element*/
+ 	int numnodes = this->NumberofNodes(finiteelement);
++	_assert_(numnodes<=NUMNODESMAX);
+ 
+-	/*Get nodal functions derivatives*/
+-	IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);
+-	GetNodalFunctionsDerivatives(dbasis,xyz_list,gauss,finiteelement);
++	/*Get basis functions derivatives at this point*/
++	GetNodalFunctionsDerivatives(&dbasis[0],xyz_list,gauss,finiteelement);
+ 
+ 	/*Calculate parameter for this Gauss point*/
++	IssmDouble dpx=0.;
++	IssmDouble dpy=0.;
+ 	for(int i=0;i<numnodes;i++) dpx += dbasis[0*numnodes+i]*plist[i];
+ 	for(int i=0;i<numnodes;i++) dpy += dbasis[1*numnodes+i]*plist[i];
+ 
+ 	/*Assign values*/
+-	xDelete<IssmDouble>(dbasis);
+ 	p[0]=dpx;
+ 	p[1]=dpy;
+ 
+ }
+ /*}}}*/
+ void TriaRef::GetInputValue(IssmDouble* p, IssmDouble* plist, Gauss* gauss,int finiteelement){/*{{{*/
++	/* WARNING: For a significant gain in performance, it is better to use
++	 * static memory allocation instead of dynamic.*/
+ 
+-	/*Output*/
+-	IssmDouble value =0.;
++	/*Allocate basis functions*/
++	IssmDouble  basis[NUMNODESMAX];
+ 
+ 	/*Fetch number of nodes for this finite element*/
+ 	int numnodes = this->NumberofNodes(finiteelement);
++	_assert_(numnodes<=NUMNODESMAX);
+ 
+-	/*Get nodal functions*/
+-	IssmDouble* basis=xNew<IssmDouble>(numnodes);
+-	GetNodalFunctions(basis, gauss,finiteelement);
++	/*Get basis functions at this point*/
++	GetNodalFunctions(&basis[0],gauss,finiteelement);
+ 
+ 	/*Calculate parameter for this Gauss point*/
++	IssmDouble value =0.;
+ 	for(int i=0;i<numnodes;i++) value += basis[i]*plist[i];
+ 
+ 	/*Assign output pointer*/
+-	xDelete<IssmDouble>(basis);
+ 	*p = value;
+ }
+ /*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18523-18524.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18523-18524.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18523-18524.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/jenkins/jenkins.sh
+===================================================================
+--- ../trunk-jpl/jenkins/jenkins.sh	(revision 18523)
++++ ../trunk-jpl/jenkins/jenkins.sh	(revision 18524)
+@@ -159,6 +159,8 @@
+ #}}}
+ echo "Cleaning up execution directory"
+ rm -rf $ISSM_DIR/execution/*
++rm -rf $ISSM_DIR/nightlylog
++mkdir  $ISSM_DIR/nightlylog
+ 
+ #matlab tests
+ if [ $MATLAB_TEST -eq 1 ]; then
Index: /issm/oecreview/Archive/18296-19100/ISSM-18524-18525.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18524-18525.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18524-18525.diff	(revision 19102)
@@ -0,0 +1,11 @@
+Index: ../trunk-jpl/packagers/ubuntu/package.sh
+===================================================================
+--- ../trunk-jpl/packagers/ubuntu/package.sh	(revision 18524)
++++ ../trunk-jpl/packagers/ubuntu/package.sh	(revision 18525)
+@@ -30,5 +30,5 @@
+ tar -czf $tarball_name ./bin ./lib ./test ./examples
+ ls -lah $tarball_name
+ 
+-echo "Shipping binaris to website"
++echo "Shipping binaries to website"
+ scp $tarball_name websites:/home/larour/files/$tarball_name
Index: /issm/oecreview/Archive/18296-19100/ISSM-18525-18526.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18525-18526.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18525-18526.diff	(revision 19102)
@@ -0,0 +1,20 @@
+Index: ../trunk-jpl/packagers/ubuntu/package.sh
+===================================================================
+--- ../trunk-jpl/packagers/ubuntu/package.sh	(revision 18525)
++++ ../trunk-jpl/packagers/ubuntu/package.sh	(revision 18526)
+@@ -31,4 +31,4 @@
+ ls -lah $tarball_name
+ 
+ echo "Shipping binaries to website"
+-scp $tarball_name websites:/home/larour/files/$tarball_name
++scp $tarball_name websites.jpl.nasa.gov:/home/larour/files/$tarball_name
+Index: ../trunk-jpl/packagers/macosx/package.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/package.sh	(revision 18525)
++++ ../trunk-jpl/packagers/macosx/package.sh	(revision 18526)
+@@ -32,4 +32,4 @@
+ ls -lah $tarball_name
+ 
+ echo "Shipping binaries to website"
+-scp $tarball_name websites:/home/larour/files/$tarball_name
++scp $tarball_name websites.jpl.nasa.gov:/home/larour/files/$tarball_name
Index: /issm/oecreview/Archive/18296-19100/ISSM-18526-18527.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18526-18527.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18526-18527.diff	(revision 19102)
@@ -0,0 +1,16 @@
+Index: ../trunk-jpl/packagers/macosx/package.sh
+===================================================================
+--- ../trunk-jpl/packagers/macosx/package.sh	(revision 18526)
++++ ../trunk-jpl/packagers/macosx/package.sh	(revision 18527)
+@@ -28,7 +28,10 @@
+ 
+ echo "Creating tarball: ${tarball_name}"
+ cd $ISSM_DIR
+-tar -czf $tarball_name ./bin ./lib ./test ./examples
++rm -rf trunk
++mkdir trunk
++cp -rf bin lib test examples trunk/
++tar -czf $tarball_name trunk
+ ls -lah $tarball_name
+ 
+ echo "Shipping binaries to website"
Index: /issm/oecreview/Archive/18296-19100/ISSM-18527-18528.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18527-18528.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18527-18528.diff	(revision 19102)
@@ -0,0 +1,150 @@
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18527)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18528)
+@@ -579,6 +579,7 @@
+ 	StrainRateyzEnum,
+ 	StrainRatezzEnum,
+ 	DivergenceEnum,
++	MaxDivergenceEnum,
+ 	GiaCrossSectionShapeEnum,
+ 	GiadWdtEnum,
+ 	GiaWEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18527)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18528)
+@@ -570,6 +570,7 @@
+ 		case StrainRateyzEnum : return "StrainRateyz";
+ 		case StrainRatezzEnum : return "StrainRatezz";
+ 		case DivergenceEnum : return "Divergence";
++		case MaxDivergenceEnum : return "MaxDivergence";
+ 		case GiaCrossSectionShapeEnum : return "GiaCrossSectionShape";
+ 		case GiadWdtEnum : return "GiadWdt";
+ 		case GiaWEnum : return "GiaW";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18527)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18528)
+@@ -582,6 +582,7 @@
+ 	      else if (strcmp(name,"StrainRateyz")==0) return StrainRateyzEnum;
+ 	      else if (strcmp(name,"StrainRatezz")==0) return StrainRatezzEnum;
+ 	      else if (strcmp(name,"Divergence")==0) return DivergenceEnum;
++	      else if (strcmp(name,"MaxDivergence")==0) return MaxDivergenceEnum;
+ 	      else if (strcmp(name,"GiaCrossSectionShape")==0) return GiaCrossSectionShapeEnum;
+ 	      else if (strcmp(name,"GiadWdt")==0) return GiadWdtEnum;
+ 	      else if (strcmp(name,"GiaW")==0) return GiaWEnum;
+@@ -627,11 +628,11 @@
+ 	      else if (strcmp(name,"MisfitObservation")==0) return MisfitObservationEnum;
+ 	      else if (strcmp(name,"MisfitObservationEnum")==0) return MisfitObservationEnumEnum;
+ 	      else if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
+-	      else if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
++	      if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
++	      else if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
+ 	      else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
+ 	      else if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
+ 	      else if (strcmp(name,"MinVel")==0) return MinVelEnum;
+@@ -750,11 +751,11 @@
+ 	      else if (strcmp(name,"MaterialsYoungModulus")==0) return MaterialsYoungModulusEnum;
+ 	      else if (strcmp(name,"MaterialsTimeRelaxationStress")==0) return MaterialsTimeRelaxationStressEnum;
+ 	      else if (strcmp(name,"MaterialsTimeRelaxationDamage")==0) return MaterialsTimeRelaxationDamageEnum;
+-	      else if (strcmp(name,"MaterialsRidgingExponent")==0) return MaterialsRidgingExponentEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"MaterialsCohesion")==0) return MaterialsCohesionEnum;
++	      if (strcmp(name,"MaterialsRidgingExponent")==0) return MaterialsRidgingExponentEnum;
++	      else if (strcmp(name,"MaterialsCohesion")==0) return MaterialsCohesionEnum;
+ 	      else if (strcmp(name,"MaterialsInternalFrictionCoef")==0) return MaterialsInternalFrictionCoefEnum;
+ 	      else if (strcmp(name,"MaterialsCompressionCoef")==0) return MaterialsCompressionCoefEnum;
+ 	      else if (strcmp(name,"MaterialsTractionCoef")==0) return MaterialsTractionCoefEnum;
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18527)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18528)
+@@ -488,6 +488,7 @@
+ 	switch (response_descriptor_enum){
+ 
+ 		case DivergenceEnum:               this->Divergencex(responses); break;
++		case MaxDivergenceEnum:            this->MaxDivergencex(responses); break;
+ 		case IceVolumeEnum:                this->IceVolumex(responses); break;
+ 		case IceVolumeAboveFloatationEnum: this->IceVolumeAboveFloatationx(responses); break;
+ 		case MinVelEnum:                   this->MinVelx(responses); break;
+@@ -562,6 +563,7 @@
+ 
+ 				/*Scalar output*/
+ 				case DivergenceEnum:               this->Divergencex(&double_result);               break;
++				case MaxDivergenceEnum:            this->MaxDivergencex(&double_result);            break;
+ 				case IceVolumeEnum:                this->IceVolumex(&double_result);                break;
+ 				case IceVolumeAboveFloatationEnum: this->IceVolumeAboveFloatationx(&double_result); break;
+ 				case MinVelEnum:                   this->MinVelx(&double_result);                   break;
+@@ -1124,6 +1126,25 @@
+ 	*pdiv=total_divergence;
+ 
+ }/*}}}*/
++void FemModel::MaxDivergencex(IssmDouble* pdiv){/*{{{*/
++
++	IssmDouble local_divergence;
++	IssmDouble node_max_divergence;
++	IssmDouble max_divergence = -INFINITY;
++
++	for(int i=0;i<this->elements->Size();i++){
++		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
++		local_divergence=element->Divergence();
++		if(fabs(local_divergence)>max_divergence) max_divergence=fabs(local_divergence);
++	}
++	ISSM_MPI_Reduce(&max_divergence,&node_max_divergence,1,ISSM_MPI_DOUBLE,ISSM_MPI_MAX,0,IssmComm::GetComm() );
++	ISSM_MPI_Bcast(&node_max_divergence,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
++	max_divergence=node_max_divergence;
++
++	/*Assign output pointers: */
++	*pdiv=max_divergence;
++
++}/*}}}*/
+ void FemModel::GetInputLocalMinMaxOnNodesx(IssmDouble** pmin,IssmDouble** pmax,IssmDouble* ug){/*{{{*/
+ 
+ 	/*Get vector sizes for current configuration*/
+Index: ../trunk-jpl/src/c/classes/FemModel.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.h	(revision 18527)
++++ ../trunk-jpl/src/c/classes/FemModel.h	(revision 18528)
+@@ -75,6 +75,7 @@
+ 		void MinVzx(IssmDouble* presponse);
+ 		void TotalSmbx(IssmDouble* pSmb);
+ 		void Divergencex(IssmDouble* pdiv);
++		void MaxDivergencex(IssmDouble* pdiv);
+ 		void IceVolumex(IssmDouble* pV);
+ 		void IceVolumeAboveFloatationx(IssmDouble* pV);
+ 		void ElementResponsex(IssmDouble* presponse,int response_enum);
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18527)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18528)
+@@ -562,6 +562,7 @@
+ def StrainRateyzEnum(): return StringToEnum("StrainRateyz")[0]
+ def StrainRatezzEnum(): return StringToEnum("StrainRatezz")[0]
+ def DivergenceEnum(): return StringToEnum("Divergence")[0]
++def MaxDivergenceEnum(): return StringToEnum("MaxDivergence")[0]
+ def GiaCrossSectionShapeEnum(): return StringToEnum("GiaCrossSectionShape")[0]
+ def GiadWdtEnum(): return StringToEnum("GiadWdt")[0]
+ def GiaWEnum(): return StringToEnum("GiaW")[0]
+Index: ../trunk-jpl/src/m/enum/MaxDivergenceEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaxDivergenceEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MaxDivergenceEnum.m	(revision 18528)
+@@ -0,0 +1,11 @@
++function macro=MaxDivergenceEnum()
++%MAXDIVERGENCEENUM - Enum of MaxDivergence
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MaxDivergenceEnum()
++
++macro=StringToEnum('MaxDivergence');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18528-18529.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18528-18529.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18528-18529.diff	(revision 19102)
@@ -0,0 +1,494 @@
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp	(revision 18528)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp	(revision 18529)
+@@ -12,7 +12,7 @@
+ #include "../../shared/shared.h"
+ #include "./ModelProcessorx.h"
+ 
+-void ModelProcessorx(Elements** pelements, Nodes** pnodes, Vertices** pvertices, Materials** pmaterials, Constraints** pconstraints, Loads** ploads, Parameters** pparameters, FILE* IOMODEL,FILE* toolkitfile, char* rootpath,const int solution_enum,const int nummodels,const int* analysis_enum_list){
++void ModelProcessorx(Elements** pelements, Nodes** pnodes, Vertices** pvertices, Materials** pmaterials, Constraints** pconstraints, Loads** ploads, Parameters** pparameters,IoModel* iomodel,FILE* toolkitfile, char* rootpath,const int solution_enum,const int nummodels,const int* analysis_enum_list){
+ 
+ 	int   i,analysis_enum,verbose;
+ 	bool  isthermal,ismasstransport,isstressbalance,isgroundingline,isenthalpy,islevelset,isdamage,ishydrology;
+@@ -26,9 +26,6 @@
+ 	Loads       *loads       = new Loads();
+ 	Parameters  *parameters  = new Parameters();
+ 
+-	/*Initialize IoModel from input file*/
+-	IoModel* iomodel = new IoModel(IOMODEL);
+-
+ 	/*Fetch parameters: */
+ 	iomodel->Constant(&verbose,VerboseEnum);
+ 	iomodel->Constant(&isthermal,TransientIsthermalEnum);
+@@ -127,9 +124,6 @@
+ 	parameters->Presort();
+ 	if(VerboseMProcessor()) _printf0_("   done with model processor \n");
+ 
+-	/*Free resources:*/
+-	delete iomodel;
+-
+ 	/*Assign output pointers:*/
+ 	*pelements    = elements;
+ 	*pnodes       = nodes;
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 18528)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 18529)
+@@ -8,7 +8,7 @@
+ #include "../../classes/classes.h"
+ #include "../../analyses/analyses.h"
+ 
+-void ModelProcessorx(Elements** pelements, Nodes** pnodes, Vertices** pvertices, Materials** pmaterials, Constraints** pconstraints, Loads** ploads, Parameters** pparameters, FILE* iomodel_handle,FILE* toolkitfile, char* rootpath,const int solution_type,const int nummodels,const int* analysis_type_listh);
++void ModelProcessorx(Elements** pelements, Nodes** pnodes, Vertices** pvertices, Materials** pmaterials, Constraints** pconstraints, Loads** ploads, Parameters** pparameters,IoModel* iomodel,FILE* toolkitfile, char* rootpath,const int solution_type,const int nummodels,const int* analysis_type_listh);
+ 
+ /*Creation of fem datasets: general drivers*/
+ void CreateElementsVerticesAndMaterials(Elements* elements,Vertices* vertices,Materials* materials, IoModel* iomodel,const int nummodels);
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 18528)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 18529)
+@@ -341,7 +341,6 @@
+ 					./modules/Mergesolutionfromftogx/Mergesolutionfromftogx.h\
+ 					./cores/ProcessArguments.cpp\
+ 					./cores/ResetBoundaryConditions.cpp\
+-					./cores/AnalysisConfiguration.cpp\
+ 					./cores/WrapperCorePointerFromSolutionEnum.cpp\
+ 					./cores/CorePointerFromSolutionEnum.cpp\
+ 					./cores/ad_core.cpp\
+Index: ../trunk-jpl/src/c/cores/AnalysisConfiguration.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/AnalysisConfiguration.cpp	(revision 18528)
++++ ../trunk-jpl/src/c/cores/AnalysisConfiguration.cpp	(revision 18529)
+@@ -1,165 +0,0 @@
+-/*!\file:  AnalysisConfiguration.cpp
+- * \brief: return type of analyses, number of analyses 
+- */ 
+-
+-#ifdef HAVE_CONFIG_H
+-	#include <config.h>
+-#else
+-#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+-#endif
+-
+-#include "./cores.h"
+-#include "../toolkits/toolkits.h"
+-#include "../classes/classes.h"
+-#include "../shared/shared.h"
+-#include "../modules/modules.h"
+-#include "../solutionsequences/solutionsequences.h"
+-
+-void AnalysisConfiguration(int** panalyses,int* pnumanalyses, int solutiontype){
+-
+-	/*output: */
+-	int  numanalyses;
+-	int* analyses=NULL;
+-
+-	/*Analyses lists*/
+-	switch(solutiontype){
+-
+-		case StressbalanceSolutionEnum:
+-			numanalyses=6;
+-			analyses=xNew<int>(numanalyses);
+-			analyses[0]=StressbalanceAnalysisEnum;
+-			analyses[1]=StressbalanceVerticalAnalysisEnum;
+-			analyses[2]=StressbalanceSIAAnalysisEnum;
+-			analyses[3]=L2ProjectionBaseAnalysisEnum;
+-			analyses[4]=ExtrudeFromBaseAnalysisEnum;
+-			analyses[5]=DepthAverageAnalysisEnum;
+-			//analyses[6]=UzawaPressureAnalysisEnum;
+-			break;
+-
+-		case SteadystateSolutionEnum:
+-			numanalyses=7;
+-			analyses=xNew<int>(numanalyses);
+-			analyses[0]=StressbalanceAnalysisEnum;
+-			analyses[1]=StressbalanceVerticalAnalysisEnum;
+-			analyses[2]=StressbalanceSIAAnalysisEnum;
+-			analyses[3]=L2ProjectionBaseAnalysisEnum;
+-			analyses[4]=EnthalpyAnalysisEnum;
+-			analyses[5]=ThermalAnalysisEnum;
+-			analyses[6]=MeltingAnalysisEnum;
+-			break;
+-
+-		case ThermalSolutionEnum:
+-			numanalyses=3;
+-			analyses=xNew<int>(numanalyses);
+-			analyses[0]=ThermalAnalysisEnum;
+-			analyses[1]=MeltingAnalysisEnum;
+-			analyses[2]=EnthalpyAnalysisEnum;
+-			break;
+-
+-		case HydrologySolutionEnum:
+-			numanalyses=5;
+-			analyses=xNew<int>(numanalyses);
+-			analyses[0]=HydrologyShreveAnalysisEnum;
+-			analyses[1]=HydrologyDCInefficientAnalysisEnum;
+-			analyses[2]=HydrologyDCEfficientAnalysisEnum;
+-			analyses[3]=L2ProjectionBaseAnalysisEnum;
+-			analyses[4]=L2ProjectionEPLAnalysisEnum;
+-			break;
+-
+-		case MasstransportSolutionEnum:
+-			numanalyses=1;
+-			analyses=xNew<int>(numanalyses);
+-			analyses[0]=MasstransportAnalysisEnum;
+-			break;
+-
+-		case BalancethicknessSolutionEnum:
+-			numanalyses=1;
+-			analyses=xNew<int>(numanalyses);
+-			analyses[0]=BalancethicknessAnalysisEnum;
+-			break;
+-
+-		case Balancethickness2SolutionEnum:
+-			numanalyses=1;
+-			analyses=xNew<int>(numanalyses);
+-			analyses[0]=Balancethickness2AnalysisEnum;
+-			break;
+-
+-		case BalancethicknessSoftSolutionEnum:
+-			numanalyses=1;
+-			analyses=xNew<int>(numanalyses);
+-			analyses[0]=BalancethicknessAnalysisEnum;
+-			break;
+-
+-		case BalancevelocitySolutionEnum:
+-			numanalyses=3;
+-			analyses=xNew<int>(numanalyses);
+-			analyses[0]=BalancevelocityAnalysisEnum;
+-			analyses[1]=SmoothedSurfaceSlopeXAnalysisEnum;
+-			analyses[2]=SmoothedSurfaceSlopeYAnalysisEnum;
+-			break;
+-
+-		case SurfaceSlopeSolutionEnum:
+-			numanalyses=1;
+-			analyses=xNew<int>(numanalyses);
+-			analyses[0]=L2ProjectionBaseAnalysisEnum;
+-			break;
+-
+-		case BedSlopeSolutionEnum:
+-			numanalyses=1;
+-			analyses=xNew<int>(numanalyses);
+-			analyses[0]=L2ProjectionBaseAnalysisEnum;
+-			break;
+-
+-		case GiaSolutionEnum:
+-			numanalyses=1;
+-			analyses=xNew<int>(numanalyses);
+-			analyses[0]=GiaAnalysisEnum;
+-			break;
+-		
+-		case DamageEvolutionSolutionEnum:
+-			numanalyses=1;
+-			analyses=xNew<int>(numanalyses);
+-			analyses[0]=DamageEvolutionAnalysisEnum;
+-			break;
+-
+-		case TransientSolutionEnum:
+-			numanalyses=20;
+-			analyses=xNew<int>(numanalyses);
+-			analyses[ 0]=StressbalanceAnalysisEnum;
+-			analyses[ 1]=StressbalanceVerticalAnalysisEnum;
+-			analyses[ 2]=StressbalanceSIAAnalysisEnum;
+-			analyses[ 3]=L2ProjectionBaseAnalysisEnum;
+-			analyses[ 4]=ThermalAnalysisEnum;
+-			analyses[ 5]=MeltingAnalysisEnum;
+-			analyses[ 6]=EnthalpyAnalysisEnum;
+-			analyses[ 7]=MasstransportAnalysisEnum;
+-			analyses[ 8]=FreeSurfaceBaseAnalysisEnum;
+-			analyses[ 9]=FreeSurfaceTopAnalysisEnum;
+-			analyses[10]=ExtrudeFromBaseAnalysisEnum;
+-			analyses[11]=ExtrudeFromTopAnalysisEnum;
+-			analyses[12]=LevelsetAnalysisEnum;
+-			analyses[13]=ExtrapolationAnalysisEnum;
+-			analyses[14]=LsfReinitializationAnalysisEnum;
+-			analyses[15]=DamageEvolutionAnalysisEnum;
+-			analyses[16]=HydrologyShreveAnalysisEnum;
+-			analyses[17]=HydrologyDCInefficientAnalysisEnum;
+-			analyses[18]=HydrologyDCEfficientAnalysisEnum;
+-			analyses[19]=L2ProjectionEPLAnalysisEnum;
+-			break;
+-
+-		case SeaiceSolutionEnum:
+-			numanalyses=1;
+-			analyses=xNew<int>(numanalyses);
+-			analyses[0]=SeaiceAnalysisEnum;
+-			break;
+-
+-		default:
+-			_error_("solution type: " << EnumToStringx(solutiontype) << " not supported yet!");
+-			break;
+-	}
+-
+-	/*Assign output pointers:*/
+-	if(pnumanalyses) *pnumanalyses=numanalyses;
+-	if(panalyses)    *panalyses=analyses;
+-	else              xDelete<int>(analyses);
+-}
+Index: ../trunk-jpl/src/c/cores/cores.h
+===================================================================
+--- ../trunk-jpl/src/c/cores/cores.h	(revision 18528)
++++ ../trunk-jpl/src/c/cores/cores.h	(revision 18529)
+@@ -57,7 +57,6 @@
+ void PrintBanner(void);
+ 
+ //solution configuration
+-void AnalysisConfiguration(int** pcores,int* pnumcores, int solutiontype);
+ void CorePointerFromSolutionEnum(void (**psolutioncore)(FemModel*),Parameters* parameters,int solutiontype);
+ void WrapperCorePointerFromSolutionEnum(void (**psolutioncore)(FemModel*),Parameters* parameters,int solutiontype,bool nodakotacore=false);
+ void AdjointCorePointerFromSolutionEnum(void (**padjointcore)(FemModel*),int solutiontype);
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18528)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18529)
+@@ -74,12 +74,9 @@
+ 	/*From command line arguments, retrieve different filenames needed to create the FemModel: */
+ 	ProcessArguments(&solution_type,&binfilename,&outbinfilename,&petscfilename,&lockfilename,&rootpath,argc,argv);
+ 
+-	/*out of solution_type, figure out types of analyses needed in the femmodel: */
+-	AnalysisConfiguration(&analyses,&numanalyses,solution_type);
+-
+ 	/*Create femmodel from input files: */
+ 	profiler->Tag(StartInit);
+-	this->InitFromFiles(rootpath,binfilename,outbinfilename,petscfilename,lockfilename,solution_type,analyses,numanalyses);
++	this->InitFromFiles(rootpath,binfilename,outbinfilename,petscfilename,lockfilename,solution_type);
+ 	profiler->Tag(FinishInit);
+ 
+ 	/*Free resources */
+@@ -92,13 +89,6 @@
+ 
+ }
+ /*}}}*/
+-FemModel::FemModel(char* rootpath, char* inputfilename, char* outputfilename, char* toolkitsfilename, char* lockfilename, const int in_solution_type,const int* analyses,const int nummodels){/*{{{*/
+-
+-	/*Call InitFromFiles. This constructor is just a wrapper: */
+-	this->InitFromFiles(rootpath, inputfilename, outputfilename, toolkitsfilename, lockfilename, in_solution_type,analyses,nummodels);
+-
+-}
+-/*}}}*/
+ FemModel::~FemModel(){/*{{{*/
+ 
+ 	/*Intermediary*/
+@@ -140,7 +130,7 @@
+ 
+ }
+ /*}}}*/
+-void FemModel::InitFromFiles(char* rootpath, char* inputfilename, char* outputfilename, char* toolkitsfilename, char* lockfilename, const int in_solution_type,const int* analyses,const int nummodels){/*{{{*/
++void FemModel::InitFromFiles(char* rootpath, char* inputfilename, char* outputfilename, char* toolkitsfilename, char* lockfilename, const int in_solution_type){/*{{{*/
+ 
+ 	/*intermediary*/
+ 	int         i;
+@@ -153,26 +143,23 @@
+ 	/*recover my_rank:*/
+ 	my_rank=IssmComm::GetRank();
+ 
+-	/*Open input file on cpu 0: */
+-	if(my_rank==0) IOMODEL = pfopen0(inputfilename ,"rb");
+-
+-	/*Open toolkits file: */
+-	toolkitsoptionsfid=pfopen(toolkitsfilename,"r");
+-
+ 	/*Initialize internal data: */
+-	this->nummodels        = nummodels;
+ 	this->solution_type    = in_solution_type;
+ 	this->analysis_counter = nummodels-1;   //point to last analysis_type carried out.
+ 	this->results          = new Results(); //not initialized by CreateDataSets
+ 
+-	/*Dynamically allocate whatever is a list of length nummodels: */
+-	analysis_type_list=xNew<int>(nummodels);
++	/*Open input file on cpu 0 and create IoModel */
++	if(my_rank==0) IOMODEL = pfopen0(inputfilename ,"rb");
++	IoModel* iomodel = new IoModel(IOMODEL);
+ 
+-	/*Initialize: */
+-	for(i=0;i<nummodels;i++)analysis_type_list[i]=analyses[i];
++	/*Figure out what analyses are activated for this solution*/
++	SolutionAnalysesList(&this->analysis_type_list,&this->nummodels,iomodel,this->solution_type);
+ 
++	/*Open toolkits file: */
++	toolkitsoptionsfid=pfopen(toolkitsfilename,"r");
++
+ 	/*create datasets for all analyses*/
+-	ModelProcessorx(&this->elements,&this->nodes,&this->vertices,&this->materials,&this->constraints,&this->loads,&this->parameters,IOMODEL,toolkitsoptionsfid,rootpath,this->solution_type,nummodels,analyses);
++	ModelProcessorx(&this->elements,&this->nodes,&this->vertices,&this->materials,&this->constraints,&this->loads,&this->parameters,iomodel,toolkitsoptionsfid,rootpath,this->solution_type,this->nummodels,this->analysis_type_list);
+ 
+ 	/*do the post-processing of the datasets to get an FemModel that can actually run analyses: */
+ 	for(i=0;i<nummodels;i++){
+@@ -208,8 +195,9 @@
+ 	/*Save lock file name for later: */
+ 	this->parameters->AddObject(new StringParam(LockFileNameEnum,lockfilename));
+ 
+-	}
+-/*}}}*/
++	/*Clean up*/
++	delete iomodel;
++}/*}}}*/
+ void FemModel::CleanUp(void){/*{{{*/
+ 
+ 	/*Intermediary*/
+@@ -411,7 +399,144 @@
+ 	return output;
+ }
+ /*}}}*/
++void  FemModel::SolutionAnalysesList(int** panalyses,int* pnumanalyses,IoModel* iomodel,int solutiontype){/*{{{*/
+ 
++	/*output: */
++	int  numanalyses = 0;
++	int* analyses=NULL;
++
++	/*Intermediaries*/
++	const int MAXANALYSES = 30;
++	int   analyses_temp[MAXANALYSES];
++
++	/*Analyses lists*/
++	switch(solutiontype){
++
++		case StressbalanceSolutionEnum:{
++			bool isSIA,isFS;
++			int  fe_FS;
++			iomodel->Constant(&fe_FS,FlowequationFeFSEnum);
++			iomodel->Constant(&isSIA,FlowequationIsSIAEnum);
++			iomodel->Constant(&isFS,FlowequationIsFSEnum);
++			analyses_temp[numanalyses++]=StressbalanceAnalysisEnum;
++			analyses_temp[numanalyses++]=StressbalanceVerticalAnalysisEnum;
++			if(isSIA){
++				analyses_temp[numanalyses++]=StressbalanceSIAAnalysisEnum;
++			}
++			analyses_temp[numanalyses++]=L2ProjectionBaseAnalysisEnum;
++			analyses_temp[numanalyses++]=ExtrudeFromBaseAnalysisEnum;
++			analyses_temp[numanalyses++]=DepthAverageAnalysisEnum;
++			if(fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum){
++				analyses_temp[numanalyses++]=UzawaPressureAnalysisEnum;
++			}
++			}
++			break;
++
++		case SteadystateSolutionEnum:
++			analyses_temp[numanalyses++]=StressbalanceAnalysisEnum;
++			analyses_temp[numanalyses++]=StressbalanceVerticalAnalysisEnum;
++			analyses_temp[numanalyses++]=StressbalanceSIAAnalysisEnum;
++			analyses_temp[numanalyses++]=L2ProjectionBaseAnalysisEnum;
++			analyses_temp[numanalyses++]=EnthalpyAnalysisEnum;
++			analyses_temp[numanalyses++]=ThermalAnalysisEnum;
++			analyses_temp[numanalyses++]=MeltingAnalysisEnum;
++			break;
++
++		case ThermalSolutionEnum:
++			analyses[numanalyses++]=ThermalAnalysisEnum;
++			analyses[numanalyses++]=MeltingAnalysisEnum;
++			analyses[numanalyses++]=EnthalpyAnalysisEnum;
++			break;
++
++		case HydrologySolutionEnum:
++			analyses[numanalyses++]=HydrologyShreveAnalysisEnum;
++			analyses[numanalyses++]=HydrologyDCInefficientAnalysisEnum;
++			analyses[numanalyses++]=HydrologyDCEfficientAnalysisEnum;
++			analyses[numanalyses++]=L2ProjectionBaseAnalysisEnum;
++			analyses[numanalyses++]=L2ProjectionEPLAnalysisEnum;
++			break;
++
++		case MasstransportSolutionEnum:
++			analyses[numanalyses++]=MasstransportAnalysisEnum;
++			break;
++
++		case BalancethicknessSolutionEnum:
++			analyses[numanalyses++]=BalancethicknessAnalysisEnum;
++			break;
++
++		case Balancethickness2SolutionEnum:
++			analyses[numanalyses++]=Balancethickness2AnalysisEnum;
++			break;
++
++		case BalancethicknessSoftSolutionEnum:
++			analyses[numanalyses++]=BalancethicknessAnalysisEnum;
++			break;
++
++		case BalancevelocitySolutionEnum:
++			analyses[numanalyses++]=BalancevelocityAnalysisEnum;
++			analyses[numanalyses++]=SmoothedSurfaceSlopeXAnalysisEnum;
++			analyses[numanalyses++]=SmoothedSurfaceSlopeYAnalysisEnum;
++			break;
++
++		case SurfaceSlopeSolutionEnum:
++			analyses[numanalyses++]=L2ProjectionBaseAnalysisEnum;
++			break;
++
++		case BedSlopeSolutionEnum:
++			analyses[numanalyses++]=L2ProjectionBaseAnalysisEnum;
++			break;
++
++		case GiaSolutionEnum:
++			analyses[numanalyses++]=GiaAnalysisEnum;
++			break;
++		
++		case DamageEvolutionSolutionEnum:
++			analyses[numanalyses++]=DamageEvolutionAnalysisEnum;
++			break;
++
++		case TransientSolutionEnum:
++			analyses_temp[numanalyses++]=StressbalanceAnalysisEnum;
++			analyses_temp[numanalyses++]=StressbalanceVerticalAnalysisEnum;
++			analyses_temp[numanalyses++]=StressbalanceSIAAnalysisEnum;
++			analyses_temp[numanalyses++]=L2ProjectionBaseAnalysisEnum;
++			analyses_temp[numanalyses++]=ThermalAnalysisEnum;
++			analyses_temp[numanalyses++]=MeltingAnalysisEnum;
++			analyses_temp[numanalyses++]=EnthalpyAnalysisEnum;
++			analyses_temp[numanalyses++]=MasstransportAnalysisEnum;
++			analyses_temp[numanalyses++]=FreeSurfaceBaseAnalysisEnum;
++			analyses_temp[numanalyses++]=FreeSurfaceTopAnalysisEnum;
++			analyses_temp[numanalyses++]=ExtrudeFromBaseAnalysisEnum;
++			analyses_temp[numanalyses++]=ExtrudeFromTopAnalysisEnum;
++			analyses_temp[numanalyses++]=LevelsetAnalysisEnum;
++			analyses_temp[numanalyses++]=ExtrapolationAnalysisEnum;
++			analyses_temp[numanalyses++]=LsfReinitializationAnalysisEnum;
++			analyses_temp[numanalyses++]=DamageEvolutionAnalysisEnum;
++			analyses_temp[numanalyses++]=HydrologyShreveAnalysisEnum;
++			analyses_temp[numanalyses++]=HydrologyDCInefficientAnalysisEnum;
++			analyses_temp[numanalyses++]=HydrologyDCEfficientAnalysisEnum;
++			analyses_temp[numanalyses++]=L2ProjectionEPLAnalysisEnum;
++			break;
++
++		case SeaiceSolutionEnum:
++			analyses_temp[numanalyses++]=SeaiceAnalysisEnum;
++			break;
++
++		default:
++			_error_("solution type: " << EnumToStringx(solutiontype) << " not supported yet!");
++			break;
++	}
++
++	/*Copy analyses from temp to output*/
++	_assert_(numanalyses<MAXANALYSES);
++	analyses=xNew<int>(numanalyses);
++	for(int i=0;i<numanalyses;i++) analyses[i]=analyses_temp[i];
++
++	/*Assign output pointers:*/
++	if(pnumanalyses) *pnumanalyses=numanalyses;
++	if(panalyses)    *panalyses=analyses;
++	else              xDelete<int>(analyses);
++}/*}}}*/
++
+ /*Modules:*/
+ int  FemModel::UpdateVertexPositionsx(void){ /*{{{*/
+ 
+Index: ../trunk-jpl/src/c/classes/FemModel.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.h	(revision 18528)
++++ ../trunk-jpl/src/c/classes/FemModel.h	(revision 18529)
+@@ -46,13 +46,13 @@
+ 
+ 		/*constructors, destructors: */
+ 		FemModel(int argc,char** argv,ISSM_MPI_Comm comm_init);
+-		FemModel(char* rootpath, char* inputfilename, char* outputfilename, char* petscfilename, char* lockfilename, const int solution_type,const int* analyses,const int nummodels);
+ 		~FemModel();
+ 
+ 		/*Methods:*/
+ 		void Echo();
+ 		FemModel* copy();
+-		void InitFromFiles(char* rootpath, char* inputfilename, char* outputfilename, char* petscfilename, char* lockfilename, const int solution_type,const int* analyses,const int nummodels);
++		void InitFromFiles(char* rootpath, char* inputfilename, char* outputfilename, char* petscfilename, char* lockfilename, const int solution_type);
++		void SolutionAnalysesList(int** panalyses,int* pnumanalyses,IoModel* iomodel,int solutiontype);
+ 		void CleanUp(void);
+ 		void Solve(void);
+ 		void SetStaticComm();
Index: /issm/oecreview/Archive/18296-19100/ISSM-18529-18530.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18529-18530.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18529-18530.diff	(revision 19102)
@@ -0,0 +1,79 @@
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18529)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18530)
+@@ -443,55 +443,55 @@
+ 			break;
+ 
+ 		case ThermalSolutionEnum:
+-			analyses[numanalyses++]=ThermalAnalysisEnum;
+-			analyses[numanalyses++]=MeltingAnalysisEnum;
+-			analyses[numanalyses++]=EnthalpyAnalysisEnum;
++			analyses_temp[numanalyses++]=ThermalAnalysisEnum;
++			analyses_temp[numanalyses++]=MeltingAnalysisEnum;
++			analyses_temp[numanalyses++]=EnthalpyAnalysisEnum;
+ 			break;
+ 
+ 		case HydrologySolutionEnum:
+-			analyses[numanalyses++]=HydrologyShreveAnalysisEnum;
+-			analyses[numanalyses++]=HydrologyDCInefficientAnalysisEnum;
+-			analyses[numanalyses++]=HydrologyDCEfficientAnalysisEnum;
+-			analyses[numanalyses++]=L2ProjectionBaseAnalysisEnum;
+-			analyses[numanalyses++]=L2ProjectionEPLAnalysisEnum;
++			analyses_temp[numanalyses++]=HydrologyShreveAnalysisEnum;
++			analyses_temp[numanalyses++]=HydrologyDCInefficientAnalysisEnum;
++			analyses_temp[numanalyses++]=HydrologyDCEfficientAnalysisEnum;
++			analyses_temp[numanalyses++]=L2ProjectionBaseAnalysisEnum;
++			analyses_temp[numanalyses++]=L2ProjectionEPLAnalysisEnum;
+ 			break;
+ 
+ 		case MasstransportSolutionEnum:
+-			analyses[numanalyses++]=MasstransportAnalysisEnum;
++			analyses_temp[numanalyses++]=MasstransportAnalysisEnum;
+ 			break;
+ 
+ 		case BalancethicknessSolutionEnum:
+-			analyses[numanalyses++]=BalancethicknessAnalysisEnum;
++			analyses_temp[numanalyses++]=BalancethicknessAnalysisEnum;
+ 			break;
+ 
+ 		case Balancethickness2SolutionEnum:
+-			analyses[numanalyses++]=Balancethickness2AnalysisEnum;
++			analyses_temp[numanalyses++]=Balancethickness2AnalysisEnum;
+ 			break;
+ 
+ 		case BalancethicknessSoftSolutionEnum:
+-			analyses[numanalyses++]=BalancethicknessAnalysisEnum;
++			analyses_temp[numanalyses++]=BalancethicknessAnalysisEnum;
+ 			break;
+ 
+ 		case BalancevelocitySolutionEnum:
+-			analyses[numanalyses++]=BalancevelocityAnalysisEnum;
+-			analyses[numanalyses++]=SmoothedSurfaceSlopeXAnalysisEnum;
+-			analyses[numanalyses++]=SmoothedSurfaceSlopeYAnalysisEnum;
++			analyses_temp[numanalyses++]=BalancevelocityAnalysisEnum;
++			analyses_temp[numanalyses++]=SmoothedSurfaceSlopeXAnalysisEnum;
++			analyses_temp[numanalyses++]=SmoothedSurfaceSlopeYAnalysisEnum;
+ 			break;
+ 
+ 		case SurfaceSlopeSolutionEnum:
+-			analyses[numanalyses++]=L2ProjectionBaseAnalysisEnum;
++			analyses_temp[numanalyses++]=L2ProjectionBaseAnalysisEnum;
+ 			break;
+ 
+ 		case BedSlopeSolutionEnum:
+-			analyses[numanalyses++]=L2ProjectionBaseAnalysisEnum;
++			analyses_temp[numanalyses++]=L2ProjectionBaseAnalysisEnum;
+ 			break;
+ 
+ 		case GiaSolutionEnum:
+-			analyses[numanalyses++]=GiaAnalysisEnum;
++			analyses_temp[numanalyses++]=GiaAnalysisEnum;
+ 			break;
+ 		
+ 		case DamageEvolutionSolutionEnum:
+-			analyses[numanalyses++]=DamageEvolutionAnalysisEnum;
++			analyses_temp[numanalyses++]=DamageEvolutionAnalysisEnum;
+ 			break;
+ 
+ 		case TransientSolutionEnum:
Index: /issm/oecreview/Archive/18296-19100/ISSM-18530-18531.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18530-18531.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18530-18531.diff	(revision 19102)
@@ -0,0 +1,76 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18530)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18531)
+@@ -166,14 +166,15 @@
+ void       Tria::ComputeSigmaNN(){/*{{{*/
+ 
+ 	if(!IsOnBase()){
+-		IssmDouble sigma_nn=0;
+-		this->inputs->AddInput(new TriaInput(SigmaNNEnum,&sigma_nn,P0Enum));
++		IssmDouble sigma_nn[3]={0.};
++		this->inputs->AddInput(new TriaInput(SigmaNNEnum,&sigma_nn[0],P1Enum));
+ 		return;
+ 	}
+ 	else{
+ 		IssmDouble* xyz_list=NULL;
+ 		IssmDouble *xyz_list_base=NULL;
+-		IssmDouble  pressure,viscosity,sigma_nn;
++		IssmDouble  pressure,viscosity;
++		IssmDouble  sigma_nn[3];
+ 		IssmDouble  sigma_xx,sigma_xy,sigma_yy;
+ 		IssmDouble  epsilon[3]; /* epsilon=[exx,eyy,exy];*/
+ 		IssmDouble  base_normal[2]; 
+@@ -191,27 +192,29 @@
+ 		Input* vy_input=inputs->GetInput(VyEnum);             _assert_(vy_input);
+ 
+ 		/* Start looping on the number of vertices: */
+-		Gauss* gauss=NewGaussBase(1);
+-		gauss->GaussPoint(0);
++		Gauss* gauss = this->NewGauss();
++		for(int i=0;i<NUMVERTICES;i++){
++			gauss->GaussNode(P1Enum,i);
+ 
+-		/*Compute strain rate viscosity and pressure: */
+-		this->StrainRateSSA(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
+-		this->ViscosityFS(&viscosity,dim,xyz_list,gauss,vx_input,vy_input,NULL);
+-		pressure_input->GetInputValue(&pressure,gauss);
++			/*Compute strain rate viscosity and pressure: */
++			this->StrainRateSSA(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
++			this->ViscosityFS(&viscosity,dim,xyz_list,gauss,vx_input,vy_input,NULL);
++			pressure_input->GetInputValue(&pressure,gauss);
+ 
+-		/*Compute Stress*/
+-		sigma_xx=2*viscosity*epsilon[0]-pressure; // sigma = nu eps - pressure
+-		sigma_yy=2*viscosity*epsilon[1]-pressure;
+-		sigma_xy=2*viscosity*epsilon[2];
++			/*Compute Stress*/
++			sigma_xx=2*viscosity*epsilon[0]-pressure; // sigma = nu eps - pressure
++			sigma_yy=2*viscosity*epsilon[1]-pressure;
++			sigma_xy=2*viscosity*epsilon[2];
+ 
+-		/*Get normal vector to the bed */
+-		NormalBase(&base_normal[0],xyz_list_base);
++			/*Get normal vector to the bed */
++			NormalBase(&base_normal[0],xyz_list_base);
+ 
+-		/*Compute sigma_nn*/
+-		sigma_nn=sigma_xx*base_normal[0]*base_normal[0] + 2*sigma_xy*base_normal[0]*base_normal[1] + sigma_yy*base_normal[1]*base_normal[1];
++			/*Compute sigma_nn*/
++			sigma_nn[i]=sigma_xx*base_normal[0]*base_normal[0] + 2*sigma_xy*base_normal[0]*base_normal[1] + sigma_yy*base_normal[1]*base_normal[1];
++		}
+ 
+ 		/*Add Stress tensor components into inputs*/
+-		this->inputs->AddInput(new TriaInput(SigmaNNEnum,&sigma_nn,P0Enum));
++		this->inputs->AddInput(new TriaInput(SigmaNNEnum,&sigma_nn[0],P1Enum));
+ 
+ 		/*Clean up and return*/
+ 		xDelete<IssmDouble>(xyz_list);
+@@ -1744,6 +1747,7 @@
+ 			xz_plane[0]=cos(theta);       xz_plane[3]=0.;  
+ 			xz_plane[1]=sin(theta);       xz_plane[4]=0.;  
+ 			xz_plane[2]=0.;               xz_plane[5]=1.;          
++
+ 			if(groundedice>=0){
+ 				this->nodes[i]->DofInSSet(1); //vy
+ 			}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18531-18532.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18531-18532.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18531-18532.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/NodesPartitioning.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/NodesPartitioning.cpp	(revision 18531)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/NodesPartitioning.cpp	(revision 18532)
+@@ -64,7 +64,7 @@
+ 	bool* my_nodes=xNewZeroInit<bool>(3*iomodel->numberofelements);
+ 
+ 	/*First: add all the nodes of all the elements belonging to this cpu*/
+-	if(iomodel->domaintype==Domain2DhorizontalEnum){
++	if(iomodel->domaintype==Domain2DhorizontalEnum || iomodel->domaintype==Domain2DverticalEnum){
+ 		for (i=0;i<iomodel->numberofelements;i++){
+ 			if (my_elements[i]){
+ 				my_nodes[3*i+0]=true;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18532-18533.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18532-18533.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18532-18533.diff	(revision 19102)
@@ -0,0 +1,885 @@
+Index: ../trunk-jpl/test/NightlyRun/test4001.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test4001.m	(revision 0)
++++ ../trunk-jpl/test/NightlyRun/test4001.m	(revision 18533)
+@@ -0,0 +1,880 @@
++%ISSM/MITgcm coupled set-up
++%
++%Script control parameters
++steps=1:15;
++final_time=1;
++
++%Organizer
++mkdir Models
++org=organizer('repository','Models/','prefix','IceOcean.2013#','steps',steps);
++
++presentdirectory=pwd; 
++addpath([pwd '/../MITgcm/tools']);
++
++% {{{ Parameters: 
++if perform(org,'Parameters'),
++	Nx=20; %number of longitude cells
++	Ny=40; %number of latitude cells
++	Nz=30; %number of MITgcm vertical cells
++	nPx=2; %number of MITgcm processes to use in x direction
++	nPy=4; %number of MITgcm processes to use in y direction
++	xgOrigin=0; %origin of longitude
++	ygOrigin=-80; %origin of latitude
++	dLong=.25; %longitude grid spacing
++	dLat=.05; %latitude grid spacing
++        delZ=30; %thickness of vertical levels
++	icefront_position_ratio=.75; 
++	ice_thickness=100;
++	rho_ice=917;
++	rho_water=1028.14;
++	di=rho_ice/rho_water;
++        
++        % MITgcm initial and lateral boundary conditions
++        iniSalt  = 34.4; % initial salinity (PSU)
++        iniTheta = -1.9; % initial potential temperature (deg C)
++        obcSalt  = 34.4; % open boundary salinity (PSU)
++        obcTheta =  1.0; % open boundary potential temperature (deg C)
++        mlDepth  = 120.; % mixed layer depth (m)
++        mlSalt   = 33.4; % open boundary salinity (PSU)
++        mlTheta  = -1.9; % open boundary potential temperature (deg C)
++        obcUvel  = -0.1; % open boundary velocity (m/s)        
++
++	MITgcmDeltaT=600; % MITgcm time step in seconds
++	y2s=31536000; % year to seconds conversion, i.e., seconds per year
++
++	% start_time, final_time, and time_step
++	start_time=0; % in decimal years
++	time_step=1/12; % coupling interval in decimal years
++        async_step_MITgcm_multiplier=1/30; % used to reduce run time for MItgcm
++        
++	% bedrock/bathymetry
++	hmax=1000;
++	trough_depth=200;
++	deltah=300;
++	sea_level=1095;
++
++	% issm settings:
++	higherorder=0;
++	numlayers=10;
++
++	savedata(org, Nx, Ny, nPx, nPy, Nz, dLong, dLat, delZ, xgOrigin, ...
++                 ygOrigin, icefront_position_ratio, ice_thickness, rho_ice, ...
++                 rho_water, di, hmax, trough_depth, deltah, sea_level, ...
++                 iniSalt, iniTheta, obcSalt, obcTheta, mlDepth, mlSalt, ...
++                 mlTheta, obcUvel, start_time, time_step, MITgcmDeltaT, y2s,...
++                 higherorder,numlayers,async_step_MITgcm_multiplier);
++end
++% }}}
++% {{{ Bathymetry: 
++if perform(org,'Bathymetry'),
++
++    loaddata(org,'Parameters');
++    %create lat,long
++    lat=(ygOrigin+dLat/2):dLat:(ygOrigin+Ny*dLat);
++    long=(xgOrigin+dLong/2):dLong:(xgOrigin+Nx*dLong);
++    [lat long]=meshgrid(lat,long);
++
++    longmin=min(long(:));
++    longmax=max(long(:));
++    latmin=min(lat(:));
++    latmax=max(lat(:));
++
++    %create bedrock/bathymetry:
++    bedrock=zeros(Nx,Ny);
++    bedrock=hmax-deltah*tanh(pi*(2*(lat-latmin)./(latmax-latmin)-1))+ ...
++            trough_depth*cos(2*pi*long./(longmax-longmin));
++
++    %save bathymetry file for MITgcm
++    bathymetry=bedrock-sea_level;
++    savedata(org,lat,long,bathymetry);
++
++end
++% }}}
++% {{{ IceSheetGeometry: 
++if perform(org,'IceSheetGeometry'),
++	
++	loaddata(org,'Parameters');
++	loaddata(org,'Bathymetry');
++	latmin=min(lat(:));
++	latmax=max(lat(:));
++
++	%put ice_thickness constant layer of ice over the bathymetry, unless it floats: 
++	s=size(bathymetry);
++	thickness=ice_thickness*ones(s);
++
++	%figure out ice shelf: 
++	pos=find(-di*thickness>bathymetry);
++	iceshelf_mask=zeros(s);
++	iceshelf_mask(pos)=1;
++
++	ice_mask=ones(s);
++	pos=find((lat-latmin)/(latmax-latmin)>(icefront_position_ratio));
++	ice_mask(pos)=0;
++	iceshelf_mask(pos)=0;
++
++	%compute draft of ice shelf: 
++	draft=bathymetry;
++	pos=find(iceshelf_mask);
++	draft(pos)=-di*thickness(pos);
++	pos=find(~ice_mask); 
++	draft(pos)=0;
++
++	savedata(org,ice_mask,iceshelf_mask,draft,thickness);
++end
++% }}}
++
++%Configure MITgcm
++% {{{ GetMITgcm: 
++if perform(org,'GetMITgcm'),
++  %system([pwd '/../MITgcm/get_mitgcm.sh']);
++end
++% }}}
++% {{{ BuildMITgcm: 
++if perform(org,'BuildMITgcm'),
++
++    %load data: 
++    loaddata(org,'Parameters');
++
++    %specify computational grid in SIZE.h
++    fidi=fopen('../MITgcm/code/SIZE.h.bak','r');
++    fido=fopen('../MITgcm/code/SIZE.h','w');
++    tline = fgetl(fidi);
++    fprintf(fido,'%s\n',tline);
++    while 1
++        tline = fgetl(fidi);
++        if ~ischar(tline), break, end
++        %do the change here: 
++        if strcmpi(tline,'     &           sNx =  20,'),
++            fprintf(fido,'%s%i%s\n','     &           sNx =  ',round(Nx/nPx),',');
++            continue;
++        end
++        if strcmpi(tline,'     &           sNy =  20,'),
++            fprintf(fido,'%s%i%s\n','     &           sNy =  ',round(Ny/nPy),',');
++            continue;
++        end
++        if strcmpi(tline,'     &           nPx =   1,'),
++            fprintf(fido,'%s%i%s\n','     &           nPx = ',nPx,',');
++            continue;
++        end
++        if strcmpi(tline,'     &           nPy =   2,'),
++            fprintf(fido,'%s%i%s\n','     &           nPy = ',nPy,',');
++            continue;
++        end
++        fprintf(fido,'%s\n',tline);
++    end
++    %close  files
++    fclose(fidi);
++    fclose(fido);
++
++	system('./build_mitgcm.sh generic');
++end
++% }}}
++% {{{ RunUncoupledMITgcm: 
++if perform(org,'RunUncoupledMITgcm'),
++
++    %load data: 
++    loaddata(org,'Parameters');
++    loaddata(org,'Bathymetry');
++    loaddata(org,'IceSheetGeometry');
++    endtime = round(MITgcmDeltaT * ...
++     floor(time_step*y2s*async_step_MITgcm_multiplier/MITgcmDeltaT));
++
++    % {{{ prepare MITgcm 
++    % rename previous run directory and create new one
++    if exist ('run.old')
++        !\rm -rf run.old
++    end
++    if exist ('run')
++        !\mv run run.old
++    end
++    !\mkdir run
++    !\cp ../MITgcm/build/mitgcmuv run
++    !\cp ../MITgcm/input/* run
++    
++    %load data: 
++    loaddata(org,'Parameters');
++
++    % initial salinity
++    S=iniSalt*ones(Nx,Ny,Nz);
++    writebin('run/Salt.bin',S);
++    
++    % initial temperature
++    T=iniTheta*ones(Nx,Ny,Nz);
++    writebin('run/Theta.bin',T);
++    
++    % initial velocity
++    Z=zeros(Nx,Ny,Nz);
++    writebin('run/Uvel.bin',Z);
++    writebin('run/Vvel.bin',Z);
++    
++    % initial sea surface height
++    Z=zeros(Nx,Ny);
++    writebin('run/Etan.bin',Z);
++
++    % salinity boundary conditions
++    S=obcSalt*ones(Ny,Nz);
++    thk=delZ*ones(Nz,1);
++    bot=cumsum(thk);
++    ik=find(bot<=mlDepth);
++    S(:,ik)=mlSalt;
++    writebin('run/OBs.bin',S);
++
++    % temperature boundary conditions
++    T=obcTheta*ones(Ny,Nz);
++    T(:,ik)=mlTheta;
++    writebin('run/OBt.bin',T);
++
++    % zonal velocity boundary conditions
++    U=obcUvel*ones(Ny,Nz);
++    writebin('run/OBu.bin',U);
++    
++    % zero boundary conditions
++    Z=zeros(Ny,Nz);
++    writebin('run/zeros.bin',Z);
++
++    % build parameter file data.obcs
++    fidi=fopen('../MITgcm/input/data.obcs','r');
++    fido=fopen('run/data.obcs','w');
++    tline = fgetl(fidi);
++    fprintf(fido,'%s\n',tline);
++    while 1
++        tline = fgetl(fidi);
++        if ~ischar(tline), break, end
++        %do the change here: 
++        if strcmpi(tline,' OB_Iwest = 40*1,'),
++            fprintf(fido,'%s%i%s\n',' OB_Iwest = ',Ny,'*1,');
++            continue;
++        end
++        if strcmpi(tline,' OB_Ieast = 40*-1,'),
++            fprintf(fido,'%s%i%s\n',' OB_Ieast = ',Ny,'*-1,');
++            continue;
++        end
++        fprintf(fido,'%s\n',tline);
++    end
++    %close  files
++    fclose(fidi);
++    fclose(fido);
++
++    %save bathymetry and bedrock in run directory
++    writebin('run/bathymetry.bin',bathymetry);
++    writebin('run/icetopo.bin',draft);
++    % }}}
++
++    %start looping:  
++    for t=start_time:time_step:final_time,
++        disp(['Year: ' num2str(t)])
++        % {{{ generate MITgcm parameter file data 
++        fidi=fopen('../MITgcm/input/data','r');
++        fido=fopen('run/data','w');
++        tline = fgetl(fidi);
++        fprintf(fido,'%s\n',tline);
++        while 1
++            tline = fgetl(fidi);
++            if ~ischar(tline), break, end
++            %do the change here: 
++            if strcmpi(tline,' xgOrigin = 0.0,'),
++                fprintf(fido,'%s%i%s\n',' xgOrigin = ',xgOrigin,',');
++                continue;
++            end
++            if strcmpi(tline,' ygOrigin = -80.0,'),
++                fprintf(fido,'%s%i%s\n',' ygOrigin = ',ygOrigin,',');
++                continue;
++            end
++            if strcmpi(tline,' delX = 20*0.25,'),
++                fprintf(fido,'%s%i*%g%s\n',' delX = ',Nx,dLong,',');
++                continue;
++            end
++            if strcmpi(tline,' delY = 20*0.25,'),
++                fprintf(fido,'%s%i*%g%s\n',' delY = ',Ny,dLat,',');
++                continue;
++            end
++            if strcmpi(tline,' delZ = 30*30.0,'),
++                fprintf(fido,'%s%i*%g%s\n',' delZ = ',Nz,delZ,',');
++                continue;
++            end
++            if strcmpi(tline,' endTime=2592000.,'),
++                fprintf(fido,'%s%i%s\n',' endTime= ',endtime,',');
++                continue;
++            end
++            if strcmpi(tline,' deltaT=1200.0,'),
++                fprintf(fido,'%s%i%s\n',' deltaT= ',MITgcmDeltaT,',');
++                continue;
++            end
++            if strcmpi(tline,' pChkptFreq=2592000.,'),
++                fprintf(fido,'%s%i%s\n',' pChkptFreq= ',endtime,',');
++                continue;
++            end
++            if strcmpi(tline,' taveFreq=2592000.,'),
++                fprintf(fido,'%s%i%s\n',' taveFreq= ',endtime,',');
++                continue;
++            end
++            if strcmpi(tline,' rhoConst=1030.,'),
++                fprintf(fido,'%s%i%s\n',' rhoConst= ',rho_water,',');
++                continue;
++            end
++            if strcmpi(tline,' rhoNil=1030.,'),
++                fprintf(fido,'%s%i%s\n',' rhoNil= ',rho_water,',');
++                continue;
++            end
++            fprintf(fido,'%s\n',tline);
++        end
++        %close  files
++        fclose(fidi);
++        fclose(fido);
++        % }}}
++        % {{{ generate initial MITgcm conditions
++
++        ds=round(endtime/MITgcmDeltaT);
++        if t>start_time
++            % Read pickup file
++            fnm=['run/pickup.' myint2str(ds,10) '.data'];
++            U=readbin(fnm,[Nx Ny Nz],1,'real*8',0);
++            V=readbin(fnm,[Nx Ny Nz],1,'real*8',1);
++            T=readbin(fnm,[Nx Ny Nz],1,'real*8',2);
++            S=readbin(fnm,[Nx Ny Nz],1,'real*8',3);
++            E=readbin(fnm,[Nx Ny],1,'real*8',8*Nz);
++            writebin('run/Salt.bin' ,S);
++            writebin('run/Theta.bin',T);
++            writebin('run/Uvel.bin' ,U);
++            writebin('run/Vvel.bin' ,V);
++            writebin('run/Etan.bin' ,E);
++        end
++
++        % }}}
++        % {{{ system call to run MITgcm
++        cd run
++        eval(['!mpirun -np ' int2str(nPx*nPy) ' ./mitgcmuv']);
++        ts=round((t+time_step)*y2s/MITgcmDeltaT);
++        eval(['!\mv STDERR.0000 STDERR_' myint2str(ts,10) '.data'])
++        eval(['!\mv STDOUT.0000 STDOUT_' myint2str(ts,10) '.data'])
++        eval(['!\cp hFacC.data hFacC_' myint2str(ts,10) '.data'])
++        eval(['!\cp icetopo.bin icetopo_' myint2str(ts,10) '.data'])
++        for fld={'S','T','U','V','Eta', ...
++                 'SHICE_heatFluxtave','SHICE_fwFluxtave'}
++            eval(['!\mv ' fld{1} '.' myint2str(ds,10) '.data ' ...
++                  fld{1} '_' myint2str(ts,10) '.data'])
++        end
++        cd ..
++        % }}}
++    end
++end
++% }}}
++
++%Configure ISSM
++% {{{ CreateMesh: 
++if perform(org,'CreateMesh'),
++	
++	loaddata(org,'Parameters');
++	loaddata(org,'Bathymetry');
++	loaddata(org,'IceSheetGeometry');
++
++	%create model: 
++	md=model();
++	
++	%Grab lat,long from MITgcm: 
++	lat=lat(:);
++	long=long(:);
++
++	%project lat,long: 
++	[x,y]=ll2xy(lat,long,-1);
++
++	index=[];
++
++	%  C  D
++	%  A  B 
++	for j=1:Ny-1,
++		for i=1:Nx-1, 
++			A=(j-1)*Nx+i;
++			B=(j-1)*Nx+i+1;
++			C=j*Nx+i;
++			D=j*Nx+i+1;
++			index(end+1,:)=[A B C];
++			index(end+1,:)=[C B D];
++		end
++	end
++
++	%fill mesh and model: 
++	md=meshconvert(md,index,x,y);
++	md.mesh.lat=lat;
++	md.mesh.long=long;
++
++	savemodel(org,md);
++
++end
++% }}}
++% {{{ MeshGeometry: 
++if perform(org,'MeshGeometry'),
++	
++	loaddata(org,'Parameters');
++	loaddata(org,'CreateMesh');
++	loaddata(org,'Bathymetry');
++	loaddata(org,'IceSheetGeometry');
++
++	%transfer to vertices: 
++	bathymetry=bathymetry(:);
++	iceshelf_mask=iceshelf_mask(:);
++	ice_mask=ice_mask(:);
++	thickness=thickness(:);
++	draft=draft(:);
++
++	%start filling some of the fields 
++	md.geometry.bed=bathymetry;
++	md.geometry.thickness=thickness;
++	md.geometry.base=md.geometry.bed; 
++	pos=find(iceshelf_mask); md.geometry.base(pos)=draft(pos);
++	md.geometry.surface=md.geometry.base+md.geometry.thickness;
++
++	%nothing passes icefront: 
++	pos=find(~ice_mask);
++	md.geometry.thickness(pos)=1;
++	md.geometry.surface(pos)=(1-di)*md.geometry.thickness(pos);
++	md.geometry.base(pos)=-di*md.geometry.thickness(pos);
++
++	%level sets: 
++	md.mask.groundedice_levelset=-ones(md.mesh.numberofvertices,1);
++	md.mask.ice_levelset=ones(md.mesh.numberofvertices,1);
++
++	pos=find(ice_mask); md.mask.ice_levelset(pos)=-1; 
++	pos=find(~iceshelf_mask & ice_mask); md.mask.groundedice_levelset(pos)=1;
++
++	%identify edges of grounded ice: 
++	groundedice_levelset=md.mask.groundedice_levelset;
++	for i=1:md.mesh.numberofelements,
++		m=groundedice_levelset(md.mesh.elements(i,:));
++		if abs(sum(m))~=3,
++			pos=find(m==1); md.mask.groundedice_levelset(md.mesh.elements(i,pos))=0;
++		end
++	end
++
++	%identify edges of ice: 
++	ice_levelset=md.mask.ice_levelset;
++	for i=1:md.mesh.numberofelements,
++		m=ice_levelset(md.mesh.elements(i,:));
++		if abs(sum(m))~=3,
++			pos=find(m==-1); md.mask.ice_levelset(md.mesh.elements(i,pos))=0;
++		end
++	end
++
++	savemodel(org,md);
++end
++% }}}
++% {{{ ParameterizeIce: 
++if perform(org,'ParameterizeIce'),
++	
++	loaddata(org,'Parameters');
++	loaddata(org,'CreateMesh');
++	loaddata(org,'MeshGeometry');
++
++	%miscellaneous
++	md.miscellaneous.name='IceOcean';
++
++	%initial velocity: 
++	md.initialization.vx=zeros(md.mesh.numberofvertices,1);
++	md.initialization.vy=zeros(md.mesh.numberofvertices,1);
++	md.initialization.vz=zeros(md.mesh.numberofvertices,1);
++
++	%friction: 
++	md.friction.coefficient=30*ones(md.mesh.numberofvertices,1);
++	pos=find(md.mask.groundedice_levelset<=0);
++	md.friction.coefficient(pos)=0;
++	
++	md.friction.p=ones(md.mesh.numberofelements,1);
++	md.friction.q=ones(md.mesh.numberofelements,1);
++
++	%temperatures and surface mass balance:
++	md.initialization.temperature=(273.15-20)*ones(md.mesh.numberofvertices,1);
++	md.initialization.pressure=md.materials.rho_ice*md.constants.g*(md.geometry.surface-md.geometry.base);
++	md.surfaceforcings.mass_balance = [1*ones(md.mesh.numberofvertices,1); 1];
++
++	%Flow law 
++	md.materials.rheology_B=paterson(md.initialization.temperature);
++	md.materials.rheology_n=3*ones(md.mesh.numberofelements,1);
++	md.damage.D=zeros(md.mesh.numberofvertices,1);
++	md.damage.spcdamage=NaN*ones(md.mesh.numberofvertices,1);
++	
++	% {{{ Deal with boundary conditions: we have the level sets right, just a matter of getting
++
++	%the spcs going.  
++	md.stressbalance.spcvx=NaN*ones(md.mesh.numberofvertices,1);
++	md.stressbalance.spcvy=NaN*ones(md.mesh.numberofvertices,1);
++	md.stressbalance.spcvz=NaN*ones(md.mesh.numberofvertices,1);
++	md.stressbalance.referential=NaN*ones(md.mesh.numberofvertices,6);
++	md.stressbalance.loadingforce=0*ones(md.mesh.numberofvertices,3);
++	md.masstransport.spcthickness=NaN*ones(md.mesh.numberofvertices,1); 
++
++	%deal with water: 
++	pos=find(md.mask.ice_levelset>0); 
++	md.stressbalance.spcvx(pos)=0;
++	md.stressbalance.spcvy(pos)=0;
++	md.stressbalance.spcvz(pos)=0;
++	md.masstransport.spcthickness(pos)=0;
++
++	%get some flux at the ice divide: 
++	pos=find(md.mesh.lat==min(md.mesh.lat));
++	md.stressbalance.spcvy(pos)=200;
++
++	%deal with boundaries, excluding icefront: 
++	vertex_on_boundary=zeros(md.mesh.numberofvertices,1);
++	vertex_on_boundary(md.mesh.segments(:,1:2))=1;
++	pos=find(vertex_on_boundary & md.mask.groundedice_levelset<=0);
++	md.stressbalance.spcvx(pos)=md.initialization.vx(pos);
++	md.stressbalance.spcvy(pos)=md.initialization.vy(pos);
++	md.stressbalance.spcvz(pos)=md.initialization.vz(pos);
++	md.masstransport.spcthickness(pos)=md.geometry.thickness(pos);
++	% }}}
++
++	md.basalforcings.groundedice_melting_rate=zeros(md.mesh.numberofvertices,1);
++	md.basalforcings.floatingice_melting_rate=zeros(md.mesh.numberofvertices,1);
++	md.thermal.spctemperature=[md.initialization.temperature; 1]; %impose observed temperature on surface
++	md.basalforcings.geothermalflux=.064*ones(md.mesh.numberofvertices,1);
++
++	%flow equations: 
++	md=setflowequation(md,'SSA','all');
++
++	savemodel(org,md);
++end
++% }}}
++% {{{ Extrude: 
++if perform(org,'Extrude'),
++	
++	loaddata(org,'Parameters');
++	loaddata(org,'ParameterizeIce');
++
++	if higherorder,
++		md=extrude(md,numlayers,3);
++		md=setflowequation(md,'HO','all');
++
++		%water needs to be spc'd: 
++		pos=find(md.mask.ice_levelset>0); 
++		md.stressbalance.spcvx(pos)=0;
++		md.stressbalance.spcvy(pos)=0;
++		md.stressbalance.spcvz(pos)=0;
++		md.masstransport.spcthickness(pos)=0;
++	end
++
++	savemodel(org,md);
++end
++% }}}
++% {{{ RunUncoupledISSM: 
++if perform(org,'RunUncoupledISSM'),
++	
++	loaddata(org,'Parameters');
++	loaddata(org,'Extrude');
++
++	%timestepping: 
++	md.timestepping.final_time=final_time;
++	md.timestepping.time_step=time_step;
++	md.timestepping.time_adapt=0;
++	md.transient.isgroundingline=1;
++	md.transient.isthermal=0;
++	md.groundingline.migration='SubelementMigration2';
++
++	md.cluster=generic('name',oshostname(),'np',2);
++	md=solve(md,TransientSolutionEnum);
++
++	savemodel(org,md);
++end
++% }}}
++
++%Run MITgcm/ISSM
++% {{{ RunCoupledMITgcmISSM: 
++if perform(org,'RunCoupledMITgcmISSM'),
++
++	%load data: 
++	loaddata(org,'Parameters');
++	loaddata(org,'Extrude');
++	loaddata(org,'Bathymetry');
++	loaddata(org,'IceSheetGeometry');
++        endtime = round(MITgcmDeltaT * ...
++         floor(time_step*y2s*async_step_MITgcm_multiplier/MITgcmDeltaT));
++
++        % {{{ prepare MITgcm 
++        % rename previous run directory and create new one
++        if exist ('run.old')
++            !\rm -rf run.old
++        end
++        if exist ('run')
++            !\mv run run.old
++        end
++        !\mkdir run
++        !\cp ../MITgcm/build/mitgcmuv run
++        !\cp ../MITgcm/input/* run
++
++        %load data: 
++        loaddata(org,'Parameters');
++
++        % initial salinity
++        S=iniSalt*ones(Nx,Ny,Nz);
++        writebin('run/Salt.bin',S);
++
++        % initial temperature
++        T=iniTheta*ones(Nx,Ny,Nz);
++        writebin('run/Theta.bin',T);
++
++        % initial velocity
++        Z=zeros(Nx,Ny,Nz);
++        writebin('run/Uvel.bin',Z);
++        writebin('run/Vvel.bin',Z);
++
++        % initial sea surface height
++        Z=zeros(Nx,Ny);
++        writebin('run/Etan.bin',Z);
++
++        % salinity boundary conditions
++        S=obcSalt*ones(Ny,Nz);
++        thk=delZ*ones(Nz,1);
++        bot=cumsum(thk);
++        ik=find(bot<=mlDepth);
++        S(:,ik)=mlSalt;
++        writebin('run/OBs.bin',S);
++
++        % temperature boundary conditions
++        T=obcTheta*ones(Ny,Nz);
++        T(:,ik)=mlTheta;
++        writebin('run/OBt.bin',T);
++
++        % zonal velocity boundary conditions
++        U=obcUvel*ones(Ny,Nz);
++        writebin('run/OBu.bin',U);
++
++        % zero boundary conditions
++        Z=zeros(Ny,Nz);
++        writebin('run/zeros.bin',Z);
++
++        % build parameter file data.obcs
++        fidi=fopen('../MITgcm/input/data.obcs','r');
++        fido=fopen('run/data.obcs','w');
++        tline = fgetl(fidi);
++        fprintf(fido,'%s\n',tline);
++        while 1
++            tline = fgetl(fidi);
++            if ~ischar(tline), break, end
++            %do the change here: 
++            if strcmpi(tline,' OB_Iwest = 40*1,'),
++                fprintf(fido,'%s%i%s\n',' OB_Iwest = ',Ny,'*1,');
++                continue;
++            end
++            if strcmpi(tline,' OB_Ieast = 40*-1,'),
++                fprintf(fido,'%s%i%s\n',' OB_Ieast = ',Ny,'*-1,');
++                continue;
++            end
++            fprintf(fido,'%s\n',tline);
++        end
++        %close  files
++        fclose(fidi);
++        fclose(fido);
++
++        %save bathymetry in MITgcm run directory
++        writebin('run/bathymetry.bin',bathymetry);
++        % }}}
++            
++	% {{{ ISSM settings:
++
++	setenv('DYLD_LIBRARY_PATH', '/usr/local/gfortran/lib') 
++	%timestepping: 
++	md.timestepping.start_time=start_time;
++	md.timestepping.final_time=final_time;
++	md.timestepping.time_step=time_step;
++	md.timestepping.time_adapt=0;
++	md.cluster=generic('name',oshostname(),'np',2);
++	md.results.TransientSolution.Base=md.geometry.base;
++	md.transient.isgroundingline=1;
++	md.transient.isthermal=0;
++	md.groundingline.migration='SubelementMigration2';
++
++	% }}}
++
++	%start looping:
++	results=md.results;
++
++	for t=start_time:time_step:final_time
++            disp(['Year: ' num2str(t)])
++
++	    %send draft from ISSM to MITgcm:
++	    draft=md.results.TransientSolution(end).Base;
++	    pos=find(md.mask.ice_levelset>0); draft(pos)=0;
++            if md.mesh.dimension==3, 
++                %collapse onto bottom layer: 
++                draft=project2d(md,draft,1);
++            end
++            if t>start_time
++                old_draft=readbin('run/icetopo.bin',[Nx,Ny]);
++            end
++            writebin('run/icetopo.bin',draft);
++
++	    % {{{ generate MITgcm parameter file data 
++	    fidi=fopen('../MITgcm/input/data','r');
++	    fido=fopen('run/data','w');
++	    tline = fgetl(fidi);
++	    fprintf(fido,'%s\n',tline);
++            while 1
++                tline = fgetl(fidi);
++                if ~ischar(tline), break, end
++		%do the change here: 
++		if strcmpi(tline,' xgOrigin = 0.0,'),
++		    fprintf(fido,'%s%i%s\n',' xgOrigin = ',xgOrigin,',');
++		    continue;
++		end
++		if strcmpi(tline,' ygOrigin = -80.0,'),
++		    fprintf(fido,'%s%i%s\n',' ygOrigin = ',ygOrigin,',');
++		    continue;
++		end
++		if strcmpi(tline,' delX = 20*0.25,'),
++		    fprintf(fido,'%s%i*%g%s\n',' delX = ',Nx,dLong,',');
++		    continue;
++		end
++		if strcmpi(tline,' delY = 20*0.25,'),
++		    fprintf(fido,'%s%i*%g%s\n',' delY = ',Ny,dLat,',');
++		    continue;
++		end
++                if strcmpi(tline,' delZ = 30*30.0,'),
++                    fprintf(fido,'%s%i*%g%s\n',' delZ = ',Nz,delZ,',');
++                    continue;
++                end
++		if strcmpi(tline,' endTime=2592000.,'),
++		    fprintf(fido,'%s%i%s\n',' endTime= ',endtime,',');
++		    continue;
++		end
++		if strcmpi(tline,' deltaT=1200.0,'),
++		    fprintf(fido,'%s%i%s\n',' deltaT= ',MITgcmDeltaT,',');
++		    continue;
++		end
++		if strcmpi(tline,' pChkptFreq=2592000.,'),
++		    fprintf(fido,'%s%i%s\n',' pChkptFreq= ',endtime,',');
++		    continue;
++		end
++		if strcmpi(tline,' taveFreq=2592000.,'),
++		    fprintf(fido,'%s%i%s\n',' taveFreq= ',endtime,',');
++		    continue;
++		end
++                if strcmpi(tline,' rhoConst=1030.,'),
++                    fprintf(fido,'%s%i%s\n',' rhoConst= ',rho_water,',');
++                    continue;
++                end
++                if strcmpi(tline,' rhoNil=1030.,'),
++                    fprintf(fido,'%s%i%s\n',' rhoNil= ',rho_water,',');
++                    continue;
++                end
++		fprintf(fido,'%s\n',tline);
++	    end
++	    %close  files
++	    fclose(fidi);
++	    fclose(fido);
++	    % }}}
++
++	    % {{{ generate initial MITgcm conditions
++            ds=round(endtime/MITgcmDeltaT);
++            if t>start_time
++                % Read pickup file
++                fnm=['run/pickup.' myint2str(ds,10) '.data'];
++                U=readbin(fnm,[Nx Ny Nz],1,'real*8',0);
++                V=readbin(fnm,[Nx Ny Nz],1,'real*8',1);
++                T=readbin(fnm,[Nx Ny Nz],1,'real*8',2);
++                S=readbin(fnm,[Nx Ny Nz],1,'real*8',3);
++                E=readbin(fnm,[Nx Ny],1,'real*8',8*Nz);
++
++                % find indices of locations where ice shelf retreated
++                h=readbin('run/hFacC.data',[Nx Ny Nz]);
++                msk=sum(h,3);
++                msk(find(msk))=1;
++                [iw jw]=find(msk); % horizontal indices where there is water
++                tmp=reshape(draft,[Nx,Ny])-old_draft;
++                tmp(find(tmp<0))=0;
++                [im jm]=find(tmp); % horizontal indices where there is melt
++                
++                % Extrapolate T/S to locations where ice shelf retreated
++                for i=1:length(im)
++
++                    % first try vertical extrapolation
++                    in=find(h(im(i),jm(i),:));
++                    if length(in)>0;
++                        S(im(i),jm(i),1:min(in)  ) = S(im(i),jm(i),min(in));
++                        T(im(i),jm(i),1:min(in)  ) = T(im(i),jm(i),min(in));
++                        continue
++                    end
++
++                    % if not succesful, use closest neighbor horizontal extrapolation
++                    [y c]=min((iw-im(i)).^2+(jw-jm(i)).^2);
++                    salt=squeeze(S(iw(c),jw(c),:)); % salinity profile of closest neighbor
++                    temp=squeeze(T(iw(c),jw(c),:)); % salinity profile of closest neighbor
++                    in=find(h(iw(c),jw(c),:));
++                    salt(1:min(in))=salt(min(in));
++                    temp(1:min(in))=temp(min(in));
++                    salt(max(in):end)=salt(max(in));
++                    temp(max(in):end)=temp(max(in));
++                    S(im(i),jm(i),:)=salt;
++                    T(im(i),jm(i),:)=temp;
++                end
++
++                % Write initial conditions
++                writebin('run/Salt.bin' ,S);
++                writebin('run/Theta.bin',T);
++                writebin('run/Uvel.bin' ,U);
++                writebin('run/Vvel.bin' ,V);
++                writebin('run/Etan.bin' ,E);
++            end
++            % }}}
++
++            % {{{ system call to run MITgcm 
++            cd run
++            eval(['!mpirun -np ' int2str(nPx*nPy) ' ./mitgcmuv']);
++            ts=round((t+time_step)*y2s/MITgcmDeltaT);
++            eval(['!\mv STDERR.0000 STDERR_' myint2str(ts,10) '.data'])
++            eval(['!\mv STDOUT.0000 STDOUT_' myint2str(ts,10) '.data'])
++            eval(['!\cp hFacC.data hFacC_' myint2str(ts,10) '.data'])
++            eval(['!\cp icetopo.bin icetopo_' myint2str(ts,10) '.data'])
++            for fld={'S','T','U','V','Eta', ...
++                     'SHICE_heatFluxtave','SHICE_fwFluxtave'}
++                eval(['!\mv ' fld{1} '.' myint2str(ds,10) '.data ' ...
++                      fld{1} '_' myint2str(ts,10) '.data'])
++            end
++            cd ..
++            % }}}
++
++	    %get melting rates from MITgcm
++	    %upward fresh water flux (kg/m^2/s):
++	    fnm=['run/SHICE_fwFluxtave_' myint2str(ts,10) '.data'];
++	    melting_rate=readbin(fnm,[Nx Ny]);
++
++	    %send averaged melting rate to ISSM
++	    %downward fresh water flux (m/y):
++	    melting_rate=-melting_rate(:)*y2s/rho_ice;
++		if md.mesh.dimension==3,
++			md.basalforcings.floatingice_melting_rate=project3d(md,'vector',melting_rate,'type','node');
++		else
++			md.basalforcings.floatingice_melting_rate=melting_rate;
++		end
++
++	    % {{{ run ISSM and recover results 
++
++	    md.timestepping.start_time=t;
++	    md.timestepping.final_time=t+time_step;;
++		md=solve(md,TransientSolutionEnum);
++
++		base=md.results.TransientSolution(end).Base;
++		thickness=md.results.TransientSolution(end).Thickness;
++		if md.mesh.dimension==3,
++			md.mesh.z=base+thickness./md.geometry.thickness.*(md.mesh.z-md.geometry.bed);
++			md.initialization.vz=md.results.TransientSolution(end).Vz;
++		end
++		md.geometry.base=base;
++		md.geometry.thickness=thickness;
++		md.geometry.surface=md.geometry.base+md.geometry.thickness;
++		md.initialization.vx=md.results.TransientSolution(end).Vx;
++		md.initialization.vy=md.results.TransientSolution(end).Vy;
++		md.initialization.vel=md.results.TransientSolution(end).Vel;
++		md.initialization.pressure=md.results.TransientSolution(end).Pressure;
++		md.mask.groundedice_levelset=md.results.TransientSolution(end).MaskGroundediceLevelset;
++		md.results.TransientSolution(end).FloatingiceMeltingRate=md.basalforcings.floatingice_melting_rate;
++		
++		%save these results in the model, otherwise, they'll be wiped out
++		results(end+1)=md.results;
++
++		% }}}
++
++	end
++
++	md.results=results;
++	savemodel(org,md);
++end
++% }}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18533-18534.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18533-18534.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18533-18534.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18533)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18534)
+@@ -1726,7 +1726,6 @@
+ 	inputs->GetInputValue(&approximation,ApproximationEnum);
+ 	if(!HasNodeOnBase() ||  approximation!=FSApproximationEnum) return;
+ 
+-	//printf("element number %i \n",this->id);
+ 	/*Get inputs*/
+ 	Input* slope_input=inputs->GetInput(BedSlopeXEnum);                             _assert_(slope_input);
+ 	Input* groundedicelevelset_input=inputs->GetInput(MaskGroundediceLevelsetEnum); _assert_(groundedicelevelset_input);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18534-18535.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18534-18535.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18534-18535.diff	(revision 19102)
@@ -0,0 +1,437 @@
+Index: ../trunk-jpl/test/MITgcm/build/mitgcmuv
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/MITgcm/build/mitgcmuv
+===================================================================
+--- ../trunk-jpl/test/MITgcm/build/mitgcmuv	(revision 18534)
++++ ../trunk-jpl/test/MITgcm/build/mitgcmuv	(revision 18535)
+
+Property changes on: ../trunk-jpl/test/MITgcm/build/mitgcmuv
+___________________________________________________________________
+Added: svn:mime-type
+## -0,0 +1 ##
++application/octet-stream
+\ No newline at end of property
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/test/MITgcm/input/eedata
+===================================================================
+--- ../trunk-jpl/test/MITgcm/input/eedata	(revision 0)
++++ ../trunk-jpl/test/MITgcm/input/eedata	(revision 18535)
+@@ -0,0 +1,9 @@
++# Example "eedata" file
++# Lines beginning "#" are comments
++# nTx - No. threads per process in X
++# nTy - No. threads per process in Y
++ &EEPARMS
++ &
++# Note: Some systems use & as the
++# namelist terminator. Other systems
++# use a / character (as shown here).
+Index: ../trunk-jpl/test/MITgcm/input/data
+===================================================================
+--- ../trunk-jpl/test/MITgcm/input/data	(revision 0)
++++ ../trunk-jpl/test/MITgcm/input/data	(revision 18535)
+@@ -0,0 +1,74 @@
++# ====================
++# | Model parameters |
++# ====================
++#
++# Continuous equation parameters
++ &PARM01
++ Tref = 30*-1.9,
++ Sref = 30*34.4,
++ viscAz=1.E-3,
++ viscAh=600.0,
++ no_slip_sides=.FALSE.,
++ no_slip_bottom=.FALSE.,
++ diffKhT=100.0,
++ diffKzT=5.E-5,
++ diffKhS=100.0,
++ diffKzS=5.E-5,
++ bottomDragQuadratic=2.5E-3,
++ eosType='JMD95Z', 
++ HeatCapacity_cp = 3974.0,
++ rhoConst=1030.,
++ rhoNil=1030.,
++ gravity=9.81,
++ convertFW2Salt = 33.4,
++ rigidLid=.FALSE.,
++ implicitFreeSurface=.TRUE.,
++ exactConserv=.TRUE.,
++ hFacMin=0.05,
++ nonHydrostatic=.FALSE.,
++ globalfiles = .TRUE.,
++ useSingleCpuIO = .TRUE.,
++ &
++
++# Elliptic solver parameters
++ &PARM02
++ cg2dMaxIters=1000,
++ cg2dTargetResidual=1.E-13,
++ cg3dMaxIters=400,
++ cg3dTargetResidual=1.E-13,
++ &
++
++# Time stepping parameters
++ &PARM03
++ startTime=0.,
++ endTime=2592000.,
++ deltaT=1200.0,
++ abEps=0.1,
++ cAdjFreq = 1.,
++ pChkptFreq=2592000.,
++ chkptFreq=0.,
++ dumpFreq=0.,
++ taveFreq=2592000.,
++ monitorFreq=86400.,
++ monitorSelect=2,
++ &
++
++# Gridding parameters
++ &PARM04
++ usingSphericalPolarGrid=.TRUE.,
++ xgOrigin = 0.0,
++ ygOrigin = -80.0,
++ delX = 20*0.25,
++ delY = 40*0.05,
++ delZ = 30*30.0,
++ &
++
++# Input datasets
++ &PARM05
++ bathyFile       = 'bathymetry.bin',
++ hydrogSaltFile  = 'Salt.bin',
++ hydrogThetaFile = 'Theta.bin',
++ uVelInitFile    = 'Uvel.bin',
++ vVelInitFile    = 'Vvel.bin',
++ pSurfInitFile   = 'Etan.bin',
++ &
+Index: ../trunk-jpl/test/MITgcm/input/data.pkg
+===================================================================
+--- ../trunk-jpl/test/MITgcm/input/data.pkg	(revision 0)
++++ ../trunk-jpl/test/MITgcm/input/data.pkg	(revision 18535)
+@@ -0,0 +1,5 @@
++# Packages
++ &PACKAGES
++ useShelfIce = .TRUE.,
++ useOBCS     = .TRUE.,
++ &
+Index: ../trunk-jpl/test/MITgcm/input/data.shelfice
+===================================================================
+--- ../trunk-jpl/test/MITgcm/input/data.shelfice	(revision 0)
++++ ../trunk-jpl/test/MITgcm/input/data.shelfice	(revision 18535)
+@@ -0,0 +1,9 @@
++# ===================================
++# | Parameters for SHELFICE package |
++# ===================================
++ &SHELFICE_PARM01
++ SHELFICEconserve = .TRUE.,
++ SHELFICEboundaryLayer = .TRUE.,
++ SHELFICEtopoFile='icetopo.bin',
++ SHELFICEwriteState = .TRUE.,
++ &
+Index: ../trunk-jpl/test/MITgcm/input/data.obcs
+===================================================================
+--- ../trunk-jpl/test/MITgcm/input/data.obcs	(revision 0)
++++ ../trunk-jpl/test/MITgcm/input/data.obcs	(revision 18535)
+@@ -0,0 +1,18 @@
++# ***************
++# Open boundaries
++# ***************
++ &OBCS_PARM01
++ OB_Iwest = 40*1,
++ OB_Ieast = 40*-1,
++#
++ useOBCSprescribe = .TRUE.,
++#
++ OBWsFile = 'OBs.bin',
++ OBWtFile = 'OBt.bin',
++ OBWuFile = 'OBu.bin',
++ OBWvFile = 'zeros.bin',
++ OBEsFile = 'OBs.bin',
++ OBEtFile = 'OBt.bin',
++ OBEuFile = 'OBu.bin',
++ OBEvFile = 'zeros.bin',
++ &
+Index: ../trunk-jpl/test/MITgcm/install.sh
+===================================================================
+--- ../trunk-jpl/test/MITgcm/install.sh	(revision 0)
++++ ../trunk-jpl/test/MITgcm/install.sh	(revision 18535)
+@@ -0,0 +1,17 @@
++#!/bin/bash
++
++#Some cleanup
++\rm -rf install
++
++#Add cvs repository
++export CVSROOT=':pserver:cvsanon@mitgcm.org:/u/gcmpack'
++
++#Download code from server
++echo loging into MITgcm CVS server
++echo enter MITgcm CVS password: cvsanon
++#Login only the first time
++#cvs login
++cvs co -P MITgcm_code
++
++#Move
++mv MITgcm install
+
+Property changes on: ../trunk-jpl/test/MITgcm/install.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/test/MITgcm/tools/readbin.m
+===================================================================
+--- ../trunk-jpl/test/MITgcm/tools/readbin.m	(revision 0)
++++ ../trunk-jpl/test/MITgcm/tools/readbin.m	(revision 18535)
+@@ -0,0 +1,68 @@
++function fld=readbin(fnam,siz,typ,prec,skip,mform)
++
++% Function fld=readbin(fnam,siz,typ,prec,skip,mform)
++% read in N-D binary field
++%
++% INPUTS
++% fnam  input path and file name
++% siz   grid dimension (default [360 224 46])
++% typ   0: sequential FORTRAN;  1: plain binary (the default)
++% prec  numeric precision (see fread; default: 'real*4')
++% skip  records to skip before reading (default 0)
++% mform machine format (see fopen; default: 'ieee-be')
++%
++% OUTPUTS
++% fld    output array of dimension siz
++%
++% SEE ALSO
++% read_ijk read_ijkt writebin
++
++if nargin < 6, mform='ieee-be'; end
++if nargin < 5, skip=0; end
++if nargin < 4, prec='real*4'; end
++if nargin < 3, typ=1; end
++if nargin < 2, siz=[360 224 46]; end
++if nargin < 1, error('please specify input file name'); end
++
++fid=fopen(fnam,'r',mform);
++
++if skip>0
++  if typ==0
++    for n=1:skip
++      tmp=read_record(fid,prec);
++    end
++  else
++    switch prec
++      case {'int8','integer*1'}
++        reclength=prod(siz);
++      case {'int16','integer*2','uint16','integer*2'}
++        reclength=2*prod(siz);
++      case {'int32','integer*4','uint32','single','real*4','float32'}
++        reclength=4*prod(siz);
++      case {'int64','integer*8','uint64','double','real*8','float64'}
++        reclength=8*prod(siz);
++    end
++    if(fseek(fid,skip*reclength,'bof')<0), error('past end of file'); end
++  end
++end
++
++switch typ
++  case 0
++    tmp=read_record(fid,prec);
++  case 1
++    tmp=fread(fid,[siz(1),prod(siz(2:length(siz)))],prec);
++end
++fid=fclose(fid);
++
++switch length(siz)
++  case 2
++    fld=reshape(tmp,siz(1),siz(2));
++  case 3
++    fld=reshape(tmp,siz(1),siz(2),siz(3));
++  case 4
++    fld=reshape(tmp,siz(1),siz(2),siz(3),siz(4));
++  case 5
++    fld=reshape(tmp,siz(1),siz(2),siz(3),siz(4),siz(5));
++  otherwise
++    fld=tmp;
++end
+Index: ../trunk-jpl/test/MITgcm/tools/myint2str.m
+===================================================================
+--- ../trunk-jpl/test/MITgcm/tools/myint2str.m	(revision 0)
++++ ../trunk-jpl/test/MITgcm/tools/myint2str.m	(revision 18535)
+@@ -0,0 +1,12 @@
++function s=myint2str(x,n);
++%MYIN2STR(X,N)   convert integer to string with leading zeros
++%                padds integer X with zeros to N locations
++
++if nargin < 2, n=2;  end
++if nargin < 1, help myint2str, return, end
++
++s=int2str(x);
++n=n-length(s);
++for i=1:n
++  s=['0' s];
++end
+Index: ../trunk-jpl/test/MITgcm/get_mitgcm.sh
+===================================================================
+--- ../trunk-jpl/test/MITgcm/get_mitgcm.sh	(revision 0)
++++ ../trunk-jpl/test/MITgcm/get_mitgcm.sh	(revision 18535)
+@@ -0,0 +1,9 @@
++#!/bin/bash
++
++if [ -e ~/.bashrc ]; then 
++	source ~/.bashrc
++fi
++
++# Download fresh copy of MITgcm
++cd ../MITgcm/
++source install.sh
+
+Property changes on: ../trunk-jpl/test/MITgcm/get_mitgcm.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/test/MITgcm/code/SIZE.h
+===================================================================
+--- ../trunk-jpl/test/MITgcm/code/SIZE.h	(revision 0)
++++ ../trunk-jpl/test/MITgcm/code/SIZE.h	(revision 18535)
+@@ -0,0 +1,64 @@
++C $Header: /u/gcmpack/MITgcm/model/inc/SIZE.h,v 1.28 2009/05/17 21:15:07 jmc Exp $
++C $Name:  $
++C
++CBOP
++C    !ROUTINE: SIZE.h
++C    !INTERFACE:
++C    include SIZE.h
++C    !DESCRIPTION: \bv
++C     *==========================================================*
++C     | SIZE.h Declare size of underlying computational grid.     
++C     *==========================================================*
++C     | The design here support a three-dimensional model grid    
++C     | with indices I,J and K. The three-dimensional domain      
++C     | is comprised of nPx*nSx blocks of size sNx along one axis 
++C     | nPy*nSy blocks of size sNy along another axis and one     
++C     | block of size Nz along the final axis.                    
++C     | Blocks have overlap regions of size OLx and OLy along the 
++C     | dimensions that are subdivided.                           
++C     *==========================================================*
++C     \ev
++CEOP
++C     Voodoo numbers controlling data layout.
++C     sNx :: No. X points in sub-grid.
++C     sNy :: No. Y points in sub-grid.
++C     OLx :: Overlap extent in X.
++C     OLy :: Overlat extent in Y.
++C     nSx :: No. sub-grids in X.
++C     nSy :: No. sub-grids in Y.
++C     nPx :: No. of processes to use in X.
++C     nPy :: No. of processes to use in Y.
++C     Nx  :: No. points in X for the total domain.
++C     Ny  :: No. points in Y for the total domain.
++C     Nr  :: No. points in Z for full process domain.
++      INTEGER sNx
++      INTEGER sNy
++      INTEGER OLx
++      INTEGER OLy
++      INTEGER nSx
++      INTEGER nSy
++      INTEGER nPx
++      INTEGER nPy
++      INTEGER Nx
++      INTEGER Ny
++      INTEGER Nr
++      PARAMETER (
++     &           sNx =  10,
++     &           sNy =  10,
++     &           OLx =   3,
++     &           OLy =   3,
++     &           nSx =   1,
++     &           nSy =   1,
++     &           nPx = 2,
++     &           nPy = 4,
++     &           Nx  = sNx*nSx*nPx,
++     &           Ny  = sNy*nSy*nPy,
++     &           Nr  =  30)
++
++C     MAX_OLX :: Set to the maximum overlap region size of any array
++C     MAX_OLY    that will be exchanged. Controls the sizing of exch
++C                routine buffers.
++      INTEGER MAX_OLX
++      INTEGER MAX_OLY
++      PARAMETER ( MAX_OLX = OLx,
++     &            MAX_OLY = OLy )
+Index: ../trunk-jpl/test/MITgcm/code/SIZE.h.bak
+===================================================================
+--- ../trunk-jpl/test/MITgcm/code/SIZE.h.bak	(revision 0)
++++ ../trunk-jpl/test/MITgcm/code/SIZE.h.bak	(revision 18535)
+@@ -0,0 +1,64 @@
++C $Header: /u/gcmpack/MITgcm/model/inc/SIZE.h,v 1.28 2009/05/17 21:15:07 jmc Exp $
++C $Name:  $
++C
++CBOP
++C    !ROUTINE: SIZE.h
++C    !INTERFACE:
++C    include SIZE.h
++C    !DESCRIPTION: \bv
++C     *==========================================================*
++C     | SIZE.h Declare size of underlying computational grid.     
++C     *==========================================================*
++C     | The design here support a three-dimensional model grid    
++C     | with indices I,J and K. The three-dimensional domain      
++C     | is comprised of nPx*nSx blocks of size sNx along one axis 
++C     | nPy*nSy blocks of size sNy along another axis and one     
++C     | block of size Nz along the final axis.                    
++C     | Blocks have overlap regions of size OLx and OLy along the 
++C     | dimensions that are subdivided.                           
++C     *==========================================================*
++C     \ev
++CEOP
++C     Voodoo numbers controlling data layout.
++C     sNx :: No. X points in sub-grid.
++C     sNy :: No. Y points in sub-grid.
++C     OLx :: Overlap extent in X.
++C     OLy :: Overlat extent in Y.
++C     nSx :: No. sub-grids in X.
++C     nSy :: No. sub-grids in Y.
++C     nPx :: No. of processes to use in X.
++C     nPy :: No. of processes to use in Y.
++C     Nx  :: No. points in X for the total domain.
++C     Ny  :: No. points in Y for the total domain.
++C     Nr  :: No. points in Z for full process domain.
++      INTEGER sNx
++      INTEGER sNy
++      INTEGER OLx
++      INTEGER OLy
++      INTEGER nSx
++      INTEGER nSy
++      INTEGER nPx
++      INTEGER nPy
++      INTEGER Nx
++      INTEGER Ny
++      INTEGER Nr
++      PARAMETER (
++     &           sNx =  20,
++     &           sNy =  20,
++     &           OLx =   3,
++     &           OLy =   3,
++     &           nSx =   1,
++     &           nSy =   1,
++     &           nPx =   1,
++     &           nPy =   2,
++     &           Nx  = sNx*nSx*nPx,
++     &           Ny  = sNy*nSy*nPy,
++     &           Nr  =  30)
++
++C     MAX_OLX :: Set to the maximum overlap region size of any array
++C     MAX_OLY    that will be exchanged. Controls the sizing of exch
++C                routine buffers.
++      INTEGER MAX_OLX
++      INTEGER MAX_OLY
++      PARAMETER ( MAX_OLX = OLx,
++     &            MAX_OLY = OLy )
Index: /issm/oecreview/Archive/18296-19100/ISSM-18535-18536.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18535-18536.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18535-18536.diff	(revision 19102)
@@ -0,0 +1,93 @@
+Index: ../trunk-jpl/test/NightlyRun/test4001.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test4001.m	(revision 18535)
++++ ../trunk-jpl/test/NightlyRun/test4001.m	(revision 18536)
+@@ -126,7 +126,7 @@
+ %Configure MITgcm
+ % {{{ GetMITgcm: 
+ if perform(org,'GetMITgcm'),
+-  %system([pwd '/../MITgcm/get_mitgcm.sh']);
++  system([pwd '/../MITgcm/get_mitgcm.sh']);
+ end
+ % }}}
+ % {{{ BuildMITgcm: 
+@@ -693,10 +693,6 @@
+ 	    %send draft from ISSM to MITgcm:
+ 	    draft=md.results.TransientSolution(end).Base;
+ 	    pos=find(md.mask.ice_levelset>0); draft(pos)=0;
+-            if md.mesh.dimension==3, 
+-                %collapse onto bottom layer: 
+-                draft=project2d(md,draft,1);
+-            end
+             if t>start_time
+                 old_draft=readbin('run/icetopo.bin',[Nx,Ny]);
+             end
+@@ -839,11 +835,7 @@
+ 	    %send averaged melting rate to ISSM
+ 	    %downward fresh water flux (m/y):
+ 	    melting_rate=-melting_rate(:)*y2s/rho_ice;
+-		if md.mesh.dimension==3,
+-			md.basalforcings.floatingice_melting_rate=project3d(md,'vector',melting_rate,'type','node');
+-		else
+-			md.basalforcings.floatingice_melting_rate=melting_rate;
+-		end
++		 md.basalforcings.floatingice_melting_rate=melting_rate;
+ 
+ 	    % {{{ run ISSM and recover results 
+ 
+@@ -853,10 +845,6 @@
+ 
+ 		base=md.results.TransientSolution(end).Base;
+ 		thickness=md.results.TransientSolution(end).Thickness;
+-		if md.mesh.dimension==3,
+-			md.mesh.z=base+thickness./md.geometry.thickness.*(md.mesh.z-md.geometry.bed);
+-			md.initialization.vz=md.results.TransientSolution(end).Vz;
+-		end
+ 		md.geometry.base=base;
+ 		md.geometry.thickness=thickness;
+ 		md.geometry.surface=md.geometry.base+md.geometry.thickness;
+@@ -878,3 +866,44 @@
+ 	savemodel(org,md);
+ end
+ % }}}
++
++%Fields and tolerances to track changes
++fnm=['run/SHICE_fwFluxtave_0000004380.data'];
++melting_rate_1=readbin(fnm,[Nx Ny]);
++fnm=['run/SHICE_fwFluxtave_0000008760.data'];
++melting_rate_2=readbin(fnm,[Nx Ny]);
++fnm=['run/SHICE_fwFluxtave_0000013140.data'];
++melting_rate_3=readbin(fnm,[Nx Ny]);
++fnm=['run/SHICE_fwFluxtave_0000017520.data'];
++melting_rate_4=readbin(fnm,[Nx Ny]);
++field_names     ={'Base1','Melting1','Vx2','Vy2','Thickness2','Base2','MaskGroundediceLevelset2','FloatingiceMeltingRate2',...
++	'Melting2','Vx3','Vy3','Thickness3','Base3','MaskGroundediceLevelset3','FloatingiceMeltingRate3',...
++	'Melting3','Vx4','Vy4','Thickness4','Base4','MaskGroundediceLevelset4','FloatingiceMeltingRate4','Melting4'};
++field_tolerances={2e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,...
++	1e-13, 1e-13, 1e-13, 1e-13, 1e-13, 1e-13, 1e-13,...
++	1e-13, 1e-13, 1e-13, 1e-13, 1e-13, 1e-13, 1e-13, 1e-13 };
++field_values={...
++	(md.results(1).TransientSolution(end).Base),...
++	(melting_rate_1(:)),...
++	(md.results(2).TransientSolution(end).Vx),...
++	(md.results(2).TransientSolution(end).Vy),...
++	(md.results(2).TransientSolution(end).Thickness),...
++	(md.results(2).TransientSolution(end).Base),...
++	(md.results(2).TransientSolution(end).MaskGroundediceLevelset),...
++	(md.results(2).TransientSolution(end).FloatingiceMeltingRate),...
++	(melting_rate_2(:)),...
++	(md.results(3).TransientSolution(end).Vx),...
++	(md.results(3).TransientSolution(end).Vy),...
++	(md.results(3).TransientSolution(end).Thickness),...
++	(md.results(3).TransientSolution(end).Base),...
++	(md.results(3).TransientSolution(end).MaskGroundediceLevelset),...
++	(md.results(3).TransientSolution(end).FloatingiceMeltingRate),...
++	(melting_rate_3(:)),...
++	(md.results(4).TransientSolution(end).Vx),...
++	(md.results(4).TransientSolution(end).Vy),...
++	(md.results(4).TransientSolution(end).Thickness),...
++	(md.results(4).TransientSolution(end).Base),...
++	(md.results(4).TransientSolution(end).MaskGroundediceLevelset),...
++	(md.results(4).TransientSolution(end).FloatingiceMeltingRate),...
++	(melting_rate_4(:)),...
++	};
Index: /issm/oecreview/Archive/18296-19100/ISSM-18536-18537.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18536-18537.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18536-18537.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/classes/timestepping.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/timestepping.m	(revision 18536)
++++ ../trunk-jpl/src/m/classes/timestepping.m	(revision 18537)
+@@ -11,7 +11,7 @@
+ 		time_adapt      = 0;
+ 		cfl_coefficient = 0.;
+ 		interp_forcings = 1;
+-		in_years        = 0;
++		in_years        = 1;
+ 	end
+ 	methods
+        function createxml(obj,fid) % {{{
Index: /issm/oecreview/Archive/18296-19100/ISSM-18537-18538.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18537-18538.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18537-18538.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 18537)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 18538)
+@@ -127,7 +127,7 @@
+ 			end
+ 			%2014 September 11
+ 			if isa(md.seaice,'double');
+-				md.seaice=seaice()
++				md.seaice=seaice();
+ 			end
+ 		end% }}}
+ 	end
Index: /issm/oecreview/Archive/18296-19100/ISSM-18538-18539.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18538-18539.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18538-18539.diff	(revision 19102)
@@ -0,0 +1,4 @@
+Index: ../trunk-jpl/test/Archives/Archive701.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
Index: /issm/oecreview/Archive/18296-19100/ISSM-18539-18540.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18539-18540.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18539-18540.diff	(revision 19102)
@@ -0,0 +1,105 @@
+Index: ../trunk-jpl/jenkins/linux64_murdo_iceocean
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_murdo_iceocean	(revision 0)
++++ ../trunk-jpl/jenkins/linux64_murdo_iceocean	(revision 18540)
+@@ -0,0 +1,93 @@
++#
++########### Configuration file for Eric Larour's Jenkins run on Murdo ############
++
++#-------------------------------#
++# 1: ISSM general configuration #
++#-------------------------------#
++
++#Nightly run name
++NAME="ISSM ice-ocean tests on Linux64 (murdo)"
++
++#ISSM CONFIGURATION 
++ISSM_CONFIG='--prefix=$ISSM_DIR\
++	--with-matlab-dir=$MATLAB_DIR \
++	--with-triangle-dir=$ISSM_DIR/externalpackages/triangle/install \
++	--with-mpi-include=$ISSM_DIR/externalpackages/mpich/install/include  \
++	--with-mpi-libflags="-L$ISSM_DIR/externalpackages/mpich/install/lib -lmpich" \
++	--with-petsc-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-metis-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-fortran-lib="-L/usr/lib/gcc/x86_64-linux-gnu/4.6/ -lgfortran" \
++	--with-numthreads=18 \
++	--enable-development \
++	--enable-debugging '
++
++#MATLAB path
++MATLAB_PATH="/usr/local/matlab80/"
++
++#PYTHON and MATLAB testing
++MATLAB_TEST=1
++PYTHON_TEST=0
++
++#execution path used for parallel runs
++EXECUTION_PATH=$ISSM_DIR/execution
++
++#repo:
++REPOSITORY="https://issm.ess.uci.edu/svn/issm/issm/trunk-jpl"
++
++#-----------------------------------#
++# 3: External packages installation #
++#-----------------------------------#
++
++#ISSM_EXTERNALPACKAGES can have 3 values:
++# - "install" install all external packages listed below
++# - "copy"    copy existing directories (EXTERNALPACKAGESDIR)
++# - "none"    leave external packages as is
++#             ->skip to section 4
++ISSM_EXTERNALPACKAGES="install"
++EXTERNALPACKAGESDIR=$ISSM_DIR/externalpackages
++
++#List of external pakages to be installed and their installation scripts
++EXTERNALPACKAGES="autotools     install.sh                
++						matlab        install.sh                
++						mpich         install-3.0-linux64.sh    
++						cmake         install.sh                
++						petsc         install-3.5-linux64.sh    
++						triangle      install-linux64.sh        
++						nose          install-linux64-python2.sh  
++						blas          install-linux64.sh          
++						lapack        install-linux64.sh          
++						git           install.sh                  
++						hdf5          install.sh                  
++						netcdf        install.sh                  
++						netcdf-python install.sh
++						shell2junit   install.sh"
++
++
++#---------------------#
++# 4: ISSM Compilation #
++#---------------------#
++
++#ISSM_COMPILATION can have 2 values:
++# - "yes" compile ISSM
++# - "no"  do not compile ISSM
++ISSM_COMPILATION="yes"
++
++#------------------------#
++# 5: Nightly run options #
++#------------------------#
++
++#number of cpus used in ISSM installation and compilation (one is usually
++#safer as some packages are very sensitive to parallel compilation)
++NUMCPUS_INSTALL=8
++
++#number of cpus used in the nightly runs.
++NUMCPUS_RUN=8
++
++#Nightly run options. The matlab routine runme.m will be called
++#as follows: runme($MATLAB_NROPTIONS). The options must be understandable
++#by Matlab and runme.m
++#ex: "'id',[101 102 103]"
++MATLAB_NROPTIONS="'benchmark','all','id','4001'"
++PYTHON_NROPTIONS=""
+
+Property changes on: ../trunk-jpl/jenkins/linux64_murdo_iceocean
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18540-18541.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18540-18541.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18540-18541.diff	(revision 19102)
@@ -0,0 +1,18 @@
+Index: ../trunk-jpl/jenkins/linux64_murdo_iceocean
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_murdo_iceocean	(revision 18540)
++++ ../trunk-jpl/jenkins/linux64_murdo_iceocean	(revision 18541)
+@@ -55,13 +55,6 @@
+ 						cmake         install.sh                
+ 						petsc         install-3.5-linux64.sh    
+ 						triangle      install-linux64.sh        
+-						nose          install-linux64-python2.sh  
+-						blas          install-linux64.sh          
+-						lapack        install-linux64.sh          
+-						git           install.sh                  
+-						hdf5          install.sh                  
+-						netcdf        install.sh                  
+-						netcdf-python install.sh
+ 						shell2junit   install.sh"
+ 
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18541-18542.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18541-18542.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18541-18542.diff	(revision 19102)
@@ -0,0 +1,18 @@
+Index: ../trunk-jpl/jenkins/linux64_murdo_iceocean
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_murdo_iceocean	(revision 18541)
++++ ../trunk-jpl/jenkins/linux64_murdo_iceocean	(revision 18542)
+@@ -76,11 +76,11 @@
+ NUMCPUS_INSTALL=8
+ 
+ #number of cpus used in the nightly runs.
+-NUMCPUS_RUN=8
++NUMCPUS_RUN=1
+ 
+ #Nightly run options. The matlab routine runme.m will be called
+ #as follows: runme($MATLAB_NROPTIONS). The options must be understandable
+ #by Matlab and runme.m
+ #ex: "'id',[101 102 103]"
+-MATLAB_NROPTIONS="'benchmark','all','id','4001'"
++MATLAB_NROPTIONS="'benchmark','all','id',4001"
+ PYTHON_NROPTIONS=""
Index: /issm/oecreview/Archive/18296-19100/ISSM-18542-18543.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18542-18543.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18542-18543.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/test/NightlyRun/IdToName.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/IdToName.m	(revision 18542)
++++ ../trunk-jpl/test/NightlyRun/IdToName.m	(revision 18543)
+@@ -257,6 +257,7 @@
+ 	case 3115, name='SquareShelfConstrainedMasstransp2dAdolcForwardDifferenceMumps';
+ 	case 3019, name='SquareShelfConstrainedTherTranAdolcReverseVsForward';
+ 	case 3120, name='SquareShelfConstrainedTranAdolcReverseVsForwardMumps';
++	case 4001, name='IceOcean';
+ 
+ 
+ 	otherwise, name='N/A';
Index: /issm/oecreview/Archive/18296-19100/ISSM-18543-18544.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18543-18544.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18543-18544.diff	(revision 19102)
@@ -0,0 +1,186 @@
+Index: ../trunk-jpl/test/MITgcm/build.sh
+===================================================================
+--- ../trunk-jpl/test/MITgcm/build.sh	(revision 0)
++++ ../trunk-jpl/test/MITgcm/build.sh	(revision 18544)
+@@ -0,0 +1,35 @@
++#!/bin/bash
++#This script compiles and links MITgcm
++
++#recover hostname and model path:
++hostname="$1"
++modelpath="$2"
++
++if [ -e ~/.bashrc ]; then
++	source ~/.bashrc
++fi
++
++# Clean up build directory
++cd $modelpath
++if [ ! -d "build" ]; then mkdir build; fi
++\rm -f build/*
++
++# Get MITgcm code, if needed
++if [ ! -d "$SLR_DIR/components/mitgcm/install" ]; then
++   cd $modelpath/../MITgcm
++   source install.sh
++   cd $modelpath
++fi
++
++#create MITgcm makefile and code links for this run
++cd build
++if [ ! -f Makefile ]; then
++
++	if [ $hostname == "pleiades" ]; then 
++		$SLR_DIR/components/mitgcm/install/tools/genmake2 -of $SLR_DIR/models/ice-ocean/configs/linux_amd64_gfortran+mpi_ice_nas -mo ../code -rd $SLR_DIR/components/mitgcm/install
++	else
++		$modelpath/../MITgcm/install/tools/genmake2 -mpi -mo $modelpath/../MITgcm/code -rd $modelpath/../MITgcm/install
++	fi
++    make depend
++fi
++make -j 8
+
+Property changes on: ../trunk-jpl/test/MITgcm/build.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/test/NightlyRun/test4001.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test4001.m	(revision 18543)
++++ ../trunk-jpl/test/NightlyRun/test4001.m	(revision 18544)
+@@ -9,7 +9,7 @@
+ org=organizer('repository','Models/','prefix','IceOcean.2013#','steps',steps);
+ 
+ presentdirectory=pwd; 
+-addpath([pwd '/../MITgcm/tools']);
++addpath(recursivepath([pwd '/../MITgcm']));
+ 
+ % {{{ Parameters: 
+ if perform(org,'Parameters'),
+@@ -22,31 +22,31 @@
+ 	ygOrigin=-80; %origin of latitude
+ 	dLong=.25; %longitude grid spacing
+ 	dLat=.05; %latitude grid spacing
+-        delZ=30; %thickness of vertical levels
++	delZ=30; %thickness of vertical levels
+ 	icefront_position_ratio=.75; 
+ 	ice_thickness=100;
+ 	rho_ice=917;
+ 	rho_water=1028.14;
+ 	di=rho_ice/rho_water;
+-        
+-        % MITgcm initial and lateral boundary conditions
+-        iniSalt  = 34.4; % initial salinity (PSU)
+-        iniTheta = -1.9; % initial potential temperature (deg C)
+-        obcSalt  = 34.4; % open boundary salinity (PSU)
+-        obcTheta =  1.0; % open boundary potential temperature (deg C)
+-        mlDepth  = 120.; % mixed layer depth (m)
+-        mlSalt   = 33.4; % open boundary salinity (PSU)
+-        mlTheta  = -1.9; % open boundary potential temperature (deg C)
+-        obcUvel  = -0.1; % open boundary velocity (m/s)        
+ 
++	% MITgcm initial and lateral boundary conditions
++	iniSalt  = 34.4; % initial salinity (PSU)
++	iniTheta = -1.9; % initial potential temperature (deg C)
++	obcSalt  = 34.4; % open boundary salinity (PSU)
++	obcTheta =  1.0; % open boundary potential temperature (deg C)
++	mlDepth  = 120.; % mixed layer depth (m)
++	mlSalt   = 33.4; % open boundary salinity (PSU)
++	mlTheta  = -1.9; % open boundary potential temperature (deg C)
++	obcUvel  = -0.1; % open boundary velocity (m/s)        
++
+ 	MITgcmDeltaT=600; % MITgcm time step in seconds
+ 	y2s=31536000; % year to seconds conversion, i.e., seconds per year
+ 
+ 	% start_time, final_time, and time_step
+ 	start_time=0; % in decimal years
+ 	time_step=1/12; % coupling interval in decimal years
+-        async_step_MITgcm_multiplier=1/30; % used to reduce run time for MItgcm
+-        
++	async_step_MITgcm_multiplier=1/30; % used to reduce run time for MItgcm
++
+ 	% bedrock/bathymetry
+ 	hmax=1000;
+ 	trough_depth=200;
+@@ -54,15 +54,14 @@
+ 	sea_level=1095;
+ 
+ 	% issm settings:
+-	higherorder=0;
+ 	numlayers=10;
+ 
+ 	savedata(org, Nx, Ny, nPx, nPy, Nz, dLong, dLat, delZ, xgOrigin, ...
+-                 ygOrigin, icefront_position_ratio, ice_thickness, rho_ice, ...
+-                 rho_water, di, hmax, trough_depth, deltah, sea_level, ...
+-                 iniSalt, iniTheta, obcSalt, obcTheta, mlDepth, mlSalt, ...
+-                 mlTheta, obcUvel, start_time, time_step, MITgcmDeltaT, y2s,...
+-                 higherorder,numlayers,async_step_MITgcm_multiplier);
++		ygOrigin, icefront_position_ratio, ice_thickness, rho_ice, ...
++		rho_water, di, hmax, trough_depth, deltah, sea_level, ...
++		iniSalt, iniTheta, obcSalt, obcTheta, mlDepth, mlSalt, ...
++		mlTheta, obcUvel, start_time, time_step, MITgcmDeltaT, y2s,...
++		numlayers,async_step_MITgcm_multiplier);
+ end
+ % }}}
+ % {{{ Bathymetry: 
+@@ -166,7 +165,7 @@
+     fclose(fidi);
+     fclose(fido);
+ 
+-	system('./build_mitgcm.sh generic');
++	 system(['../MITgcm/build.sh generic ' pwd]);
+ end
+ % }}}
+ % {{{ RunUncoupledMITgcm: 
+@@ -176,8 +175,8 @@
+     loaddata(org,'Parameters');
+     loaddata(org,'Bathymetry');
+     loaddata(org,'IceSheetGeometry');
+-    endtime = round(MITgcmDeltaT * ...
+-     floor(time_step*y2s*async_step_MITgcm_multiplier/MITgcmDeltaT));
++	 endtime = round(MITgcmDeltaT * ...
++		 floor(time_step*y2s*async_step_MITgcm_multiplier/MITgcmDeltaT));
+ 
+     % {{{ prepare MITgcm 
+     % rename previous run directory and create new one
+@@ -534,27 +533,6 @@
+ 	savemodel(org,md);
+ end
+ % }}}
+-% {{{ Extrude: 
+-if perform(org,'Extrude'),
+-	
+-	loaddata(org,'Parameters');
+-	loaddata(org,'ParameterizeIce');
+-
+-	if higherorder,
+-		md=extrude(md,numlayers,3);
+-		md=setflowequation(md,'HO','all');
+-
+-		%water needs to be spc'd: 
+-		pos=find(md.mask.ice_levelset>0); 
+-		md.stressbalance.spcvx(pos)=0;
+-		md.stressbalance.spcvy(pos)=0;
+-		md.stressbalance.spcvz(pos)=0;
+-		md.masstransport.spcthickness(pos)=0;
+-	end
+-
+-	savemodel(org,md);
+-end
+-% }}}
+ % {{{ RunUncoupledISSM: 
+ if perform(org,'RunUncoupledISSM'),
+ 	
+@@ -597,8 +575,11 @@
+             !\mv run run.old
+         end
+         !\mkdir run
++		  disp('-------------- file: test4001.m line: 578'); 
+         !\cp ../MITgcm/build/mitgcmuv run
++		  disp('-------------- file: test4001.m line: 580'); 
+         !\cp ../MITgcm/input/* run
++		  disp('-------------- file: test4001.m line: 582'); 
+ 
+         %load data: 
+         loaddata(org,'Parameters');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18544-18545.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18544-18545.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18544-18545.diff	(revision 19102)
@@ -0,0 +1,94 @@
+Index: ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18544)
++++ ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18545)
+@@ -29,6 +29,7 @@
+ 	iomodel->FetchDataToInput(elements,SurfaceEnum);
+ 	iomodel->FetchDataToInput(elements,BaseEnum);
+ 	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
++	iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
+ 	iomodel->FetchDataToInput(elements,BasalforcingsGroundediceMeltingRateEnum);
+ 	iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum);
+ 	iomodel->FetchDataToInput(elements,BalancethicknessThickeningRateEnum);
+@@ -104,7 +105,7 @@
+ ElementVector* Balancethickness2Analysis::CreatePVector(Element* element){/*{{{*/
+ 
+ 	/*Intermediaries */
+-	IssmDouble  dhdt,mb,ms,dD[2],db[2],Jdet;
++	IssmDouble  dhdt,mb,ms,D,db[2],Jdet;
+ 	IssmDouble* xyz_list = NULL;
+ 
+ 	/*Fetch number of nodes and dof for this finite element*/
+@@ -113,6 +114,7 @@
+ 	/*Initialize Element vector and other vectors*/
+ 	ElementVector* pe    = element->NewElementVector();
+ 	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
++	IssmDouble*   dbasis = xNew<IssmDouble>(2*numnodes);
+ 
+ 	/*Retrieve all inputs and parameters*/
+ 	element->GetVerticesCoordinates(&xyz_list);
+@@ -129,17 +131,20 @@
+ 
+ 		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+ 		element->NodalFunctions(basis,gauss);
++		element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+ 
+ 		ms_input->GetInputValue(&ms,gauss);
+ 		mb_input->GetInputValue(&mb,gauss);
+ 		dhdt_input->GetInputValue(&dhdt,gauss);
++		D_input->GetInputValue(&D,gauss);
+ 		bed_input->GetInputDerivativeValue(&db[0],xyz_list,gauss);
+-		D_input->GetInputDerivativeValue(&dD[0],xyz_list,gauss);
+-		db[0]=0.;
+-		db[1]=0.;
++		//db[0]=0.;
++		//db[1]=0.;
+ 
+-		/*Since grad(b) is constant div(D grad(b) ) = grad(D).grad(b)*/
+-		for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(ms-mb-dhdt +dD[0]*db[0]+dD[1]*db[1])*basis[i];
++		for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(
++					(ms-mb-dhdt)*basis[i]
++					-D*db[0]*dbasis[0*numnodes+i] - D*db[1]*dbasis[1*numnodes+i]
++					);
+ 	}
+ 
+ 	/*Clean up and return*/
+@@ -166,8 +171,8 @@
+ void Balancethickness2Analysis::CreateDiffusionCoefficient(Element* element){/*{{{*/
+ 
+ 	/*Intermediaries */
+-	IssmDouble       omega,h,mu0,ds[2],Cmu,B;
+-	const int        n = 3.;
++	IssmDouble       Gamma,h,mu0,ds[2],Cmu,B,k;
++	const int        n = 3;
+ 	const IssmDouble Hstar = 500.;
+ 	const IssmDouble Lstar = 500.e+3;
+ 	IssmDouble *xyz_list  = NULL;
+@@ -182,6 +187,7 @@
+ 	Input* thickness_input  = element->GetInput(ThicknessEnum);          _assert_(thickness_input);
+ 	Input* surface_input    = element->GetInput(SurfaceEnum);            _assert_(surface_input);
+ 	Input* B_input          = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);
++	Input* k_input          = element->GetInput(FrictionCoefficientEnum);_assert_(k_input);
+ 	IssmDouble rhog = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum);
+ 
+ 	/*Calculate damage evolution source term: */
+@@ -190,14 +196,15 @@
+ 		gauss->GaussNode(element->GetElementType(),i);
+ 		
+ 		B_input->GetInputValue(&B,gauss);
++		k_input->GetInputValue(&k,gauss);
+ 		thickness_input->GetInputValue(&h,gauss);
+ 		surface_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);
+ 
+-		mu0   = pow(2.,(1.-3*n)/(2.*n)) * B;
+-		omega = pow(rhog,3) * pow(Hstar,2*(n+1)) * pow(Hstar/Lstar,2*(n+1)) * 1./pow(mu0,n);
+-		Cmu   = 0.;
++		mu0   = pow(2.,(1-3*n)/(2.*n)) * B;
++		Gamma = pow(rhog,n) * pow(Hstar,2*(n+1)) * pow(Hstar/Lstar,2*(n+1)) * 1./pow(mu0,n);
++		Cmu   = mu0/Hstar/(k*k);
+ 
+-		D[i] = omega*(ds[0]*ds[0]+ds[1]*ds[1])*pow(h,4)*(1./5.*h - Cmu);
++		D[i] = Gamma*pow(ds[0]*ds[0]+ds[1]*ds[1],(n-1)/2)*pow(h,n+1)*(1./(n+2.)*h - Cmu);
+ 	}
+ 
+ 	/*Add input*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18545-18546.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18545-18546.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18545-18546.diff	(revision 19102)
@@ -0,0 +1,22 @@
+Index: ../trunk-jpl/test/NightlyRun/test4001.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test4001.m	(revision 18545)
++++ ../trunk-jpl/test/NightlyRun/test4001.m	(revision 18546)
+@@ -537,7 +537,7 @@
+ if perform(org,'RunUncoupledISSM'),
+ 	
+ 	loaddata(org,'Parameters');
+-	loaddata(org,'Extrude');
++	loaddata(org,'ParameterizeIce');
+ 
+ 	%timestepping: 
+ 	md.timestepping.final_time=final_time;
+@@ -560,7 +560,7 @@
+ 
+ 	%load data: 
+ 	loaddata(org,'Parameters');
+-	loaddata(org,'Extrude');
++	loaddata(org,'ParameterizeIce');
+ 	loaddata(org,'Bathymetry');
+ 	loaddata(org,'IceSheetGeometry');
+         endtime = round(MITgcmDeltaT * ...
Index: /issm/oecreview/Archive/18296-19100/ISSM-18546-18547.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18546-18547.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18546-18547.diff	(revision 19102)
@@ -0,0 +1,15 @@
+Index: ../trunk-jpl/test/Archives/Archive4001.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive4001.nc
+===================================================================
+--- ../trunk-jpl/test/Archives/Archive4001.nc	(revision 18546)
++++ ../trunk-jpl/test/Archives/Archive4001.nc	(revision 18547)
+
+Property changes on: ../trunk-jpl/test/Archives/Archive4001.nc
+___________________________________________________________________
+Added: svn:mime-type
+## -0,0 +1 ##
++application/octet-stream
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18547-18548.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18547-18548.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18547-18548.diff	(revision 19102)
@@ -0,0 +1,48 @@
+Index: ../trunk-jpl/test/NightlyRun/test4001.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test4001.m	(revision 18547)
++++ ../trunk-jpl/test/NightlyRun/test4001.m	(revision 18548)
+@@ -6,7 +6,7 @@
+ 
+ %Organizer
+ mkdir Models
+-org=organizer('repository','Models/','prefix','IceOcean.2013#','steps',steps);
++org=organizer('repository','Models/','prefix','IceOcean_','steps',steps);
+ 
+ presentdirectory=pwd; 
+ addpath(recursivepath([pwd '/../MITgcm']));
+@@ -378,7 +378,6 @@
+ 	[x,y]=ll2xy(lat,long,-1);
+ 
+ 	index=[];
+-
+ 	%  C  D
+ 	%  A  B 
+ 	for j=1:Ny-1,
+@@ -476,7 +475,6 @@
+ 	md.friction.coefficient=30*ones(md.mesh.numberofvertices,1);
+ 	pos=find(md.mask.groundedice_levelset<=0);
+ 	md.friction.coefficient(pos)=0;
+-	
+ 	md.friction.p=ones(md.mesh.numberofelements,1);
+ 	md.friction.q=ones(md.mesh.numberofelements,1);
+ 
+@@ -491,9 +489,7 @@
+ 	md.damage.D=zeros(md.mesh.numberofvertices,1);
+ 	md.damage.spcdamage=NaN*ones(md.mesh.numberofvertices,1);
+ 	
+-	% {{{ Deal with boundary conditions: we have the level sets right, just a matter of getting
+-
+-	%the spcs going.  
++	%the spcs going
+ 	md.stressbalance.spcvx=NaN*ones(md.mesh.numberofvertices,1);
+ 	md.stressbalance.spcvy=NaN*ones(md.mesh.numberofvertices,1);
+ 	md.stressbalance.spcvz=NaN*ones(md.mesh.numberofvertices,1);
+@@ -520,7 +516,6 @@
+ 	md.stressbalance.spcvy(pos)=md.initialization.vy(pos);
+ 	md.stressbalance.spcvz(pos)=md.initialization.vz(pos);
+ 	md.masstransport.spcthickness(pos)=md.geometry.thickness(pos);
+-	% }}}
+ 
+ 	md.basalforcings.groundedice_melting_rate=zeros(md.mesh.numberofvertices,1);
+ 	md.basalforcings.floatingice_melting_rate=zeros(md.mesh.numberofvertices,1);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18548-18549.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18548-18549.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18548-18549.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/test/NightlyRun/test4001.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test4001.m	(revision 18548)
++++ ../trunk-jpl/test/NightlyRun/test4001.m	(revision 18549)
+@@ -6,7 +6,7 @@
+ 
+ %Organizer
+ mkdir Models
+-org=organizer('repository','Models/','prefix','IceOcean_','steps',steps);
++org=organizer('repository','Models/','prefix','IceOcean.','steps',steps);
+ 
+ presentdirectory=pwd; 
+ addpath(recursivepath([pwd '/../MITgcm']));
Index: /issm/oecreview/Archive/18296-19100/ISSM-18549-18550.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18549-18550.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18549-18550.diff	(revision 19102)
@@ -0,0 +1,253 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 18549)
++++ ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 18550)
+@@ -132,7 +132,7 @@
+ void GSLsquarefit(Matrix** pX,Matrix* A,Matrix* B);
+ double signe(double a);
+ void filtergrav(Matrix* A,Matrix* Ain,double ctr,double sd,int mx,int my);
+-void newmodelgen(Matrix* m0,Matrix* m1,Matrix* bathy,Matrix* icethick,int mx,int my,double T,double ptval,double mmax,double mmax2,double ctr,double sd);
++void newmodelgen(Matrix* m0,Matrix* m1,Matrix* bathy,Matrix* icethick,int mx,int my,double T,double ptval,double mmax,double mmax2,double ctr,double sd, Matrix *landmask);
+ double coolshed(double T0,double k,double c,double D);
+ /*}}}*/
+ 
+@@ -164,11 +164,11 @@
+ 	// Pobs->Echo();
+ 
+ 
+-	Matrix *Pp=new Matrix(mx*my,2); /* data positions */
++	Matrix *Pp=new Matrix(mx*my,2); /* prisms positions */
+ 	makep(Pp,mx,my,dx,dy);
+ 	// Pp->Echo();
+ 
+-	double  rhoi = 917;           /* ice density     */
++	double  rhoi = 890;           /* ice density     */
+ 	double  rhow = 1030;          /* water density   */
+ 	// double  rhos = 2013;		      /* sediment density */
+ 	double  rhoc = 2670;          /* bedrock density */
+@@ -184,6 +184,8 @@
+ 	rho2->SetValue(0,0,rhoi-rhoc);
+ 	rho2->SetValue(0,1,rhow-rhoc);
+ 
++	double dlevel=860;         /* level of data acquisition */
++
+ 	double ctr=1;            /* parameter for filtering */
+ 	double sd=0.5;
+ 
+@@ -194,7 +196,6 @@
+ 	//	xobs->Echo();
+ 	//	yobs->Echo();
+ 
+-	double dlevel= 860;                /* mean level of data acquisition */
+ 
+ 	double mmax  = 1000;               /* max value for layer interfaces */
+ 	double mmax2 = 1000;
+@@ -222,11 +223,21 @@
+ 	/*}}}*/     
+ 	/* load the data {{{*/
+ 
++	/*landmask */
++
++	ifstream file("landmask.txt");
++	Matrix * landmask= new Matrix(nx*ny,1);
++	double inputnumber;
++	for(int i=0;i<ny*nx; i++){ 
++		file >> inputnumber;
++		landmask->SetValue(i,0,inputnumber);
++	}
++	file.close();
++
+ 	/* Observed gravity anomaly */
+ 
+ 	ifstream file1("store_fa500_36s.txt");
+ 	Matrix * gobs= new Matrix(nx*ny,1);
+-	double inputnumber;
+ 	for(int i=0;i<ny*nx; i++){ 
+ 		file1 >> inputnumber;
+ 		gobs->SetValue(i,0, inputnumber*1e-5);
+@@ -260,8 +271,8 @@
+ 
+ 
+ 	ifstream file4("store_flag_eval500.txt");
+-	Matrix * evalid= new Matrix(mx*my,1);
+-	for(int s=0;s<mx*my; s++){ 
++	Matrix * evalid= new Matrix(nx*ny,1);
++	for(int s=0;s<nx*ny; s++){ 
+ 		file4 >> inputnumber;
+ 		evalid->SetValue(s,0,inputnumber);
+ 	}
+@@ -345,7 +356,7 @@
+ 
+ 		/* update model and calculate energy */
+ 
+-		newmodelgen(m_old,m_new,bathy,icethick,mx,my,Tm,ptval,mmax,mmax2,ctr,sd);  /* new model */
++		newmodelgen(m_old,m_new,bathy,icethick,mx,my,Tm,ptval,mmax,mmax2,ctr,sd, landmask);  /* new model */
+ 		E_new=misfit(m_new,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my, my_rank, num_procs); /* new energy */
+ 		dE=E_new-E_old;                                        /* energy difference */
+ 
+@@ -507,6 +518,8 @@
+ 					m1->SetValue(i,j,m->GetValue(i,j));
+ 					m2->SetValue(i,j,i*1e-10);
+ 				}
++				m1->SetValue(i,j,m1->GetValue(i,j));
++				m2->SetValue(i,j,m2->GetValue(i,j));
+ 			}
+ 			else{
+ 				m1->SetValue(i,j,1e-10);
+@@ -618,9 +631,9 @@
+ 	Matrix* g2=new Matrix(nx*ny,1);
+ 	Matrix* g=new Matrix(nx*ny,1);
+ 	Matrix* gcalgr=new Matrix(ny,nx);
+-	Matrix* gcalvec=new Matrix(mx*my,1);
+-	Matrix* df=new Matrix(mx*my,1);
+-	Matrix* G=new Matrix(mx*my,3);
++	Matrix* gcalvec=new Matrix(nx*ny,1);
++	Matrix* df=new Matrix(nx*ny,1);
++	Matrix* G=new Matrix(nx*ny,3);
+ 	double a=0;
+ 	double b=0;
+ 	double e=0;
+@@ -629,8 +642,8 @@
+ 	plouff(g2,Pobs,Pp,m2,rho2,dx,dy,dn,mx*my,nx*ny,3, my_rank, num_procs);
+ 	g->MatrixSum(g1,g2);
+ 	vec2gridsimple(g,gcalgr,nx,ny);
+-	reshape(gcalgr,gcalvec,mx,my);
+-	for (int i=0;i<mx*my;i++){
++	reshape(gcalgr,gcalvec,nx,ny);
++	for (int i=0;i<nx*ny;i++){
+ 		df->SetValue(i,0,evalid->GetValue(i,0)*(gobs->GetValue(i,0)-gcalvec->GetValue(i,0)));
+ 		G->SetValue(i,0,evalid->GetValue(i,0)*Pobs->GetValue(i,0));
+ 		G->SetValue(i,1,evalid->GetValue(i,0)*Pobs->GetValue(i,1));
+@@ -639,13 +652,13 @@
+ 	Matrix* M = NULL;
+ 	GSLsquarefit(&M,G,df);
+ 
+-	for (int i=0;i<my;i++){
+-		for(int j=0;j<mx;j++){
++	for (int i=0;i<ny;i++){
++		for(int j=0;j<nx;j++){
+ 			gcalgr->SetValue(i,j,gcalgr->GetValue(i,j)+xobs->GetValue(i,j)*M->GetValue(0,0)+yobs->GetValue(i,j)*M->GetValue(1,0)+M->GetValue(2,0));
+ 		}
+ 	}
+-	reshape(gcalgr,g,mx,my);
+-	for (int i=0;i<mx*my;i++){
++	reshape(gcalgr,g,nx,ny);
++	for (int i=0;i<nx*ny;i++){
+ 		a=a+fabs(evalid->GetValue(i,0)*(gobs->GetValue(i,0)-g->GetValue(i,0)));
+ 		b=b+fabs(evalid->GetValue(i,0)*(gobs->GetValue(i,0)+g->GetValue(i,0)));
+ 	}
+@@ -664,7 +677,7 @@
+ 
+ 	return e;
+ }/*}}}*/
+-void newmodelgen(Matrix* m0,Matrix* m1,Matrix* bathy,Matrix* icethick,int mx,int my,double T,double ptval,double mmax,double mmax2,double ctr,double sd){/*{{{*/
++void newmodelgen(Matrix* m0,Matrix* m1,Matrix* bathy,Matrix* icethick,int mx,int my,double T,double ptval,double mmax,double mmax2,double ctr,double sd, Matrix *landmask){/*{{{*/
+ 	Matrix* m1gr=new Matrix(my,mx);
+ 	Matrix* m1grsm=new Matrix(my,mx);
+ 	Matrix* m1col=new Matrix(mx*my,1);
+@@ -678,18 +691,33 @@
+ 	nptflag->MatrixSum(icethick,bathy);
+ 	/* first layer: ice */
+ 	for (int i=0;i<mx*my;i++){
+-		if(nptflag->GetValue(i,0)==0){
+-			u=double(rand())/double(RAND_MAX);
+-			y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
+-			m1->SetValue(i,1,m0->GetValue(i,1)+y*ptval);
+-			m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
+-			if(m1->GetValue(i,1)<=m1->GetValue(i,0)){
+-				m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
++		if(landmask->GetValue(i,0)==2){
++			if(nptflag->GetValue(i,0)==0){
++				u=double(rand())/double(RAND_MAX);
++				y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
++				m1->SetValue(i,1,m0->GetValue(i,1)+y*ptval);
+ 				m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++				if(m1->GetValue(i,1)<=m1->GetValue(i,0)){
++					m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
++					m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++				}
++				if(m1->GetValue(i,1)>=m1->GetValue(i,0)+mmax){
++					m1->SetValue(i,1,m1->GetValue(i,0)+mmax);
++					m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++				}
+ 			}
+-			if(m1->GetValue(i,1)>=m1->GetValue(i,0)+mmax){
+-				m1->SetValue(i,1,m1->GetValue(i,0)+mmax);
+-				m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++		}
++		else if(landmask->GetValue(i,0)==0){
++			if(nptflag->GetValue(i,0)==0){
++				u=double(rand())/double(RAND_MAX);
++				y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
++				m1->SetValue(i,2,m0->GetValue(i,2)+y*ptval);
++				if(m1->GetValue(i,2)<=m1->GetValue(i,0)){
++					m1->SetValue(i,2,m1->GetValue(i,0)+1e-10);
++				}
++				if(m1->GetValue(i,2)>=m1->GetValue(i,0)+mmax2){
++					m1->SetValue(i,2,m1->GetValue(i,0)+mmax2);
++				}
+ 			}
+ 		}
+ 	}
+@@ -704,18 +732,52 @@
+ 	reshape(m1grsm2,m1col2,mx,my);
+ 
+ 	for (int i=0;i<mx*my;i++){
+-		if(nptflag->GetValue(i,0)==0){
+-			m1->SetValue(i,1,m1col->GetValue(i,0));
+-			m1->SetValue(i,2,m1col2->GetValue(i,0));
+-			if(m1->GetValue(i,1)<m1->GetValue(i,0)){
+-				m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
+-				m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++		if(landmask->GetValue(i,0)==2){
++			if(nptflag->GetValue(i,0)==0){
++				m1->SetValue(i,1,m1col->GetValue(i,0));
++				m1->SetValue(i,2,m1col2->GetValue(i,0));
++				if(m1->GetValue(i,1)<=m1->GetValue(i,0)){
++					m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
++					m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++				}
++				if(fabs(m1->GetValue(i,2)-m1->GetValue(i,1))>1){
++					m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++				}
+ 			}
++			else{
++				m1->SetValue(i,1,m0->GetValue(i,1));
++				m1->SetValue(i,2,m0->GetValue(i,2));
++			}
+ 		}
+-		else{
+-			m1->SetValue(i,1,m0->GetValue(i,1));
+-			m1->SetValue(i,2,m0->GetValue(i,2));
++		else if(landmask->GetValue(i,0)==0){
++			if(nptflag->GetValue(i,0)==0){
++				m1->SetValue(i,2,m1col2->GetValue(i,0));
++				if(m1->GetValue(i,2)<=m1->GetValue(i,0)){
++					m1->SetValue(i,2,m1->GetValue(i,0)+1e-10);
++				}
++				if(fabs(m1->GetValue(i,0)-m1->GetValue(i,1))>1){
++					m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
++				}
++			}
++			else{
++				m1->SetValue(i,1,m0->GetValue(i,1));
++				m1->SetValue(i,2,m0->GetValue(i,2));
++			}
+ 		}
++		else {
++			if(nptflag->GetValue(i,0)==0){
++				if(fabs(m1->GetValue(i,0)-m1->GetValue(i,1))>1){
++					m1->SetValue(i,1,m1->GetValue(i,0));
++				}
++				if(fabs(m1->GetValue(i,0)-m1->GetValue(i,2))>1){
++					m1->SetValue(i,2,m1->GetValue(i,0));
++				}
++			}
++			else{
++				m1->SetValue(i,1,m0->GetValue(i,1));
++				m1->SetValue(i,2,m0->GetValue(i,2));
++			}
++		}
+ 	}
+ 
+ 				/* second layer: water */
Index: /issm/oecreview/Archive/18296-19100/ISSM-18550-18551.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18550-18551.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18550-18551.diff	(revision 19102)
@@ -0,0 +1,347 @@
+Index: ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18550)
++++ ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18551)
+@@ -33,6 +33,7 @@
+ 	iomodel->FetchDataToInput(elements,BasalforcingsGroundediceMeltingRateEnum);
+ 	iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum);
+ 	iomodel->FetchDataToInput(elements,BalancethicknessThickeningRateEnum);
++	iomodel->FetchDataToInput(elements,BalancethicknessCmuEnum);
+ }/*}}}*/
+ void Balancethickness2Analysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 
+@@ -143,7 +144,7 @@
+ 
+ 		for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(
+ 					(ms-mb-dhdt)*basis[i]
+-					-D*db[0]*dbasis[0*numnodes+i] - D*db[1]*dbasis[1*numnodes+i]
++					//-D*db[0]*dbasis[0*numnodes+i] - D*db[1]*dbasis[1*numnodes+i]
+ 					);
+ 	}
+ 
+@@ -154,13 +155,63 @@
+ 	return pe;
+ }/*}}}*/
+ void Balancethickness2Analysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+-	   _error_("not implemented yet");
++		element->GetSolutionFromInputsOneDof(solution,SurfaceEnum);
+ }/*}}}*/
+ void Balancethickness2Analysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+ void Balancethickness2Analysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+-	element->InputUpdateFromSolutionOneDof(solution,ThicknessEnum);
++
++	/*Intermediaries*/
++	IssmDouble  ds[2],s,b,D;
++	IssmDouble* xyz_list = NULL;
++
++	//element->InputUpdateFromSolutionOneDof(solution,ThicknessEnum);
++	element->InputUpdateFromSolutionOneDof(solution,SurfaceEnum);
++
++	/*Fetch number of vertices and allocate velocity vectors*/
++	int numvertices = element->GetNumberOfVertices();
++	IssmDouble* vel_list = xNew<IssmDouble>(numvertices);
++	IssmDouble* vx_list  = xNew<IssmDouble>(numvertices);
++	IssmDouble* vy_list  = xNew<IssmDouble>(numvertices);
++
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinates(&xyz_list);
++	Input* D_input   = element->GetInput(BalancethicknessDiffusionCoefficientEnum);
++	Input* H_input   = element->GetInput(ThicknessEnum);                            _assert_(H_input);
++	Input* s_input   = element->GetInput(SurfaceEnum);                              _assert_(s_input);
++	Input* b_input   = element->GetInput(BaseEnum);                                 _assert_(b_input);
++
++	/*Calculate velocities*/
++	Gauss* gauss=element->NewGauss();
++	for(int iv=0;iv<numvertices;iv++){
++		gauss->GaussVertex(iv);
++
++		if(D_input){
++			D_input->GetInputValue(&D,gauss);
++		}
++		else{
++			D = 0.;
++		}
++		b_input->GetInputValue(&b,gauss);
++		s_input->GetInputValue(&s,gauss);
++		s_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);
++
++		vx_list[iv] = -1./(s-b)*D*ds[0];
++		vy_list[iv] = -1./(s-b)*D*ds[1];
++		vel_list[iv] = sqrt(pow(vx_list[iv],2) + pow(vy_list[iv],2));
++	}
++
++	/*Add vx and vy as inputs to the tria element: */
++	element->AddInput(VxEnum,vx_list,P1Enum);
++	element->AddInput(VyEnum,vy_list,P1Enum);
++	element->AddInput(VelEnum,vel_list,P1Enum);
++
++	/*Free ressources:*/
++	xDelete<IssmDouble>(vy_list);
++	xDelete<IssmDouble>(vx_list);
++	xDelete<IssmDouble>(vel_list);
++	xDelete<IssmDouble>(xyz_list);
+ }/*}}}*/
+ void Balancethickness2Analysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+@@ -171,7 +222,7 @@
+ void Balancethickness2Analysis::CreateDiffusionCoefficient(Element* element){/*{{{*/
+ 
+ 	/*Intermediaries */
+-	IssmDouble       Gamma,h,mu0,ds[2],Cmu,B,k;
++	IssmDouble       Gamma,h,mu0,ds[2],Cmu,B,k,s,b;
+ 	const int        n = 3;
+ 	const IssmDouble Hstar = 500.;
+ 	const IssmDouble Lstar = 500.e+3;
+@@ -184,10 +235,11 @@
+ 
+ 	/*retrieve what we need: */
+ 	element->GetVerticesCoordinates(&xyz_list);
+-	Input* thickness_input  = element->GetInput(ThicknessEnum);          _assert_(thickness_input);
++	Input* bed_input        = element->GetInput(BaseEnum);               _assert_(bed_input);
+ 	Input* surface_input    = element->GetInput(SurfaceEnum);            _assert_(surface_input);
+ 	Input* B_input          = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);
+ 	Input* k_input          = element->GetInput(FrictionCoefficientEnum);_assert_(k_input);
++	Input* Cmu_input        = element->GetInput(BalancethicknessCmuEnum);_assert_(Cmu_input);
+ 	IssmDouble rhog = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum);
+ 
+ 	/*Calculate damage evolution source term: */
+@@ -197,14 +249,18 @@
+ 		
+ 		B_input->GetInputValue(&B,gauss);
+ 		k_input->GetInputValue(&k,gauss);
+-		thickness_input->GetInputValue(&h,gauss);
++		//thickness_input->GetInputValue(&h,gauss);
+ 		surface_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);
++		surface_input->GetInputValue(&s,gauss);
++		bed_input->GetInputValue(&b,gauss);
++		h = s-b;
+ 
+ 		mu0   = pow(2.,(1-3*n)/(2.*n)) * B;
+ 		Gamma = pow(rhog,n) * pow(Hstar,2*(n+1)) * pow(Hstar/Lstar,2*(n+1)) * 1./pow(mu0,n);
+-		Cmu   = mu0/Hstar/(k*k);
++		//Cmu   = pow(mu0,n)/Hstar/(k*k);
++		Cmu_input->GetInputValue(&Cmu,gauss);
+ 
+-		D[i] = Gamma*pow(ds[0]*ds[0]+ds[1]*ds[1],(n-1)/2)*pow(h,n+1)*(1./(n+2.)*h - Cmu);
++		D[i] = Gamma*pow(ds[0]*ds[0]+ds[1]*ds[1],(n-1)/2)*pow(h,n+1)*(1./(n+2.)*h + Cmu);
+ 	}
+ 
+ 	/*Add input*/
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18550)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18551)
+@@ -304,6 +304,7 @@
+ 	BalancethicknessApparentMassbalanceEnum,
+ 	Balancethickness2MisfitEnum,
+ 	BalancethicknessDiffusionCoefficientEnum,
++	BalancethicknessCmuEnum,
+ 	/*}}}*/
+ 	/*Surfaceforcings{{{*/
+ 	SurfaceforcingsEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18550)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18551)
+@@ -312,6 +312,7 @@
+ 		case BalancethicknessApparentMassbalanceEnum : return "BalancethicknessApparentMassbalance";
+ 		case Balancethickness2MisfitEnum : return "Balancethickness2Misfit";
+ 		case BalancethicknessDiffusionCoefficientEnum : return "BalancethicknessDiffusionCoefficient";
++		case BalancethicknessCmuEnum : return "BalancethicknessCmu";
+ 		case SurfaceforcingsEnum : return "Surfaceforcings";
+ 		case SMBEnum : return "SMB";
+ 		case SurfaceforcingsMassBalanceEnum : return "SurfaceforcingsMassBalance";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18550)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18551)
+@@ -318,6 +318,7 @@
+ 	      else if (strcmp(name,"BalancethicknessApparentMassbalance")==0) return BalancethicknessApparentMassbalanceEnum;
+ 	      else if (strcmp(name,"Balancethickness2Misfit")==0) return Balancethickness2MisfitEnum;
+ 	      else if (strcmp(name,"BalancethicknessDiffusionCoefficient")==0) return BalancethicknessDiffusionCoefficientEnum;
++	      else if (strcmp(name,"BalancethicknessCmu")==0) return BalancethicknessCmuEnum;
+ 	      else if (strcmp(name,"Surfaceforcings")==0) return SurfaceforcingsEnum;
+ 	      else if (strcmp(name,"SMB")==0) return SMBEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsMassBalance")==0) return SurfaceforcingsMassBalanceEnum;
+@@ -381,11 +382,11 @@
+ 	      else if (strcmp(name,"HydrologySolution")==0) return HydrologySolutionEnum;
+ 	      else if (strcmp(name,"MeltingAnalysis")==0) return MeltingAnalysisEnum;
+ 	      else if (strcmp(name,"MasstransportAnalysis")==0) return MasstransportAnalysisEnum;
+-	      else if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"FreeSurfaceBaseAnalysis")==0) return FreeSurfaceBaseAnalysisEnum;
++	      if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum;
++	      else if (strcmp(name,"FreeSurfaceBaseAnalysis")==0) return FreeSurfaceBaseAnalysisEnum;
+ 	      else if (strcmp(name,"FreeSurfaceTopAnalysis")==0) return FreeSurfaceTopAnalysisEnum;
+ 	      else if (strcmp(name,"SurfaceNormalVelocity")==0) return SurfaceNormalVelocityEnum;
+ 	      else if (strcmp(name,"ExtrudeFromBaseAnalysis")==0) return ExtrudeFromBaseAnalysisEnum;
+@@ -504,11 +505,11 @@
+ 	      else if (strcmp(name,"Fill")==0) return FillEnum;
+ 	      else if (strcmp(name,"FractionIncrement")==0) return FractionIncrementEnum;
+ 	      else if (strcmp(name,"Friction")==0) return FrictionEnum;
+-	      else if (strcmp(name,"Internal")==0) return InternalEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"MassFlux")==0) return MassFluxEnum;
++	      if (strcmp(name,"Internal")==0) return InternalEnum;
++	      else if (strcmp(name,"MassFlux")==0) return MassFluxEnum;
+ 	      else if (strcmp(name,"MeltingOffset")==0) return MeltingOffsetEnum;
+ 	      else if (strcmp(name,"Misfit")==0) return MisfitEnum;
+ 	      else if (strcmp(name,"Pressure")==0) return PressureEnum;
+@@ -627,11 +628,11 @@
+ 	      else if (strcmp(name,"MisfitModelEnum")==0) return MisfitModelEnumEnum;
+ 	      else if (strcmp(name,"MisfitObservation")==0) return MisfitObservationEnum;
+ 	      else if (strcmp(name,"MisfitObservationEnum")==0) return MisfitObservationEnumEnum;
+-	      else if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
++	      if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
++	      else if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
+ 	      else if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
+ 	      else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
+ 	      else if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
+@@ -750,11 +751,11 @@
+ 	      else if (strcmp(name,"MaterialsPoisson")==0) return MaterialsPoissonEnum;
+ 	      else if (strcmp(name,"MaterialsYoungModulus")==0) return MaterialsYoungModulusEnum;
+ 	      else if (strcmp(name,"MaterialsTimeRelaxationStress")==0) return MaterialsTimeRelaxationStressEnum;
+-	      else if (strcmp(name,"MaterialsTimeRelaxationDamage")==0) return MaterialsTimeRelaxationDamageEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"MaterialsRidgingExponent")==0) return MaterialsRidgingExponentEnum;
++	      if (strcmp(name,"MaterialsTimeRelaxationDamage")==0) return MaterialsTimeRelaxationDamageEnum;
++	      else if (strcmp(name,"MaterialsRidgingExponent")==0) return MaterialsRidgingExponentEnum;
+ 	      else if (strcmp(name,"MaterialsCohesion")==0) return MaterialsCohesionEnum;
+ 	      else if (strcmp(name,"MaterialsInternalFrictionCoef")==0) return MaterialsInternalFrictionCoefEnum;
+ 	      else if (strcmp(name,"MaterialsCompressionCoef")==0) return MaterialsCompressionCoefEnum;
+Index: ../trunk-jpl/src/c/cores/balancethickness2_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/balancethickness2_core.cpp	(revision 18550)
++++ ../trunk-jpl/src/c/cores/balancethickness2_core.cpp	(revision 18551)
+@@ -21,12 +21,15 @@
+ 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+ 
+ 	if(VerboseSolution()) _printf0_("call computational core:\n");
+-	solutionsequence_linear(femmodel);
++	//solutionsequence_linear(femmodel);
++	solutionsequence_nonlinear(femmodel,false);
+ 
+ 	if(save_results){
+ 		if(VerboseSolution()) _printf0_("   saving results\n");
+-		int outputs[1] = {ThicknessEnum};
+-		femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],1);
++		const int numoutputs = 5;
++		//int outputs[numoutputs] = {ThicknessEnum};
++		int outputs[numoutputs] = {SurfaceEnum,VxEnum,VyEnum,VelEnum,BalancethicknessDiffusionCoefficientEnum};
++		femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],numoutputs);
+ 	}
+ 
+ }
+Index: ../trunk-jpl/src/m/plot/plot_googlemaps.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/plot_googlemaps.m	(revision 18550)
++++ ../trunk-jpl/src/m/plot/plot_googlemaps.m	(revision 18551)
+@@ -35,6 +35,8 @@
+ 			[linspace(ylim(1),ylim(1),100) linspace(ylim(1),ylim(2),100) linspace(ylim(2),ylim(2),100) linspace(ylim(2),ylim(1),100)],...
+ 			-1,0,71);
+ 	else
++		latlist = md.mesh.lat; %That might work?
++		lonlist = md.mesh.long;
+ 		error('field hemisphere should either be ''n'' or ''s''');
+ 	end
+ 
+Index: ../trunk-jpl/src/m/plot/googlemaps.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/googlemaps.m	(revision 18550)
++++ ../trunk-jpl/src/m/plot/googlemaps.m	(revision 18551)
+@@ -53,6 +53,8 @@
+ 	EPSGlocal = 'EPSG:3413'; % UPS Greenland  http://www.spatialreference.org/ref/epsg/3413/
+ elseif strcmpi(md.mesh.hemisphere,'s'),
+ 	EPSGlocal = 'EPSG:3031'; % UPS Antarctica http://www.spatialreference.org/ref/epsg/3031/
++elseif strcmpi(md.mesh.hemisphere,'UTM18N'),
++	EPSGlocal = 'EPSG:32218'; % UTM 18 N Patagonia
+ else
+ 	error('field hemisphere should either be ''n'' or ''s''');
+ end
+Index: ../trunk-jpl/src/m/classes/balancethickness.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/balancethickness.m	(revision 18550)
++++ ../trunk-jpl/src/m/classes/balancethickness.m	(revision 18551)
+@@ -8,22 +8,10 @@
+ 		spcthickness      = NaN;
+ 		thickening_rate   = NaN;
+ 		stabilization     = 0;
++
++		Cmu               = NaN;
+ 	end
+ 	methods
+-        function createxml(obj,fid) % {{{
+-            fprintf(fid, '\n\n');
+-            fprintf(fid, '%s\n', '<!-- balancethickness -->');
+-            
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcthickness" type="',   	class(obj.spcthickness),'" default="',        convert2str(obj.spcthickness),'">',	'     <section name="balancethickness" />','     <help> thickness constraints (NaN means no constraint) [m] </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="thickening_rate" type="', 	class(obj.thickening_rate),'" default="',            convert2str(obj.thickening_rate),'">',     '     <section name="balancethickness" />','     <help> ice thickening rate used in the mass conservation (dh/dt) [m/yr] </help>','</parameter>');
+-            
+-            % balancethickness drop-down (1,2, or 3)
+-            fprintf(fid,'%s\n%s\n%s\n',        '<parameter key ="stabilization" type="alternative" optional="false">','     <section name="balancethickness" />','     <help> 0: None, 1: SU, 2: SSAs artificial diffusivity, 3:DG </help>');
+-            fprintf(fid,'%s\n','       <option value="1" type="string" default="true"> </option>');
+-            fprintf(fid,'%s\n','       <option value="2" type="string" default="false"> </option>');
+-            fprintf(fid,'%s\n%s\n','       <option value="3" type="string" default="false"> </option>','</parameter>');
+-
+-        end % }}}
+ 		function obj = balancethickness(varargin) % {{{
+ 			switch nargin
+ 				case 0
+@@ -45,6 +33,8 @@
+ 			md = checkfield(md,'fieldname','balancethickness.spcthickness');
+ 			md = checkfield(md,'fieldname','balancethickness.thickening_rate','size',[md.mesh.numberofvertices 1],'NaN',1);
+ 			md = checkfield(md,'fieldname','balancethickness.stabilization','size',[1 1],'values',[0 1 2 3]);
++
++			md = checkfield(md,'fieldname','balancethickness.Cmu','size',[md.mesh.numberofvertices 1],'NaN',1,'>=',0);
+ 		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   balance thickness solution parameters:'));
+@@ -61,6 +51,8 @@
+ 			WriteData(fid,'object',obj,'fieldname','spcthickness','format','DoubleMat','mattype',1);
+ 			WriteData(fid,'object',obj,'fieldname','thickening_rate','format','DoubleMat','mattype',1,'scale',1./yts);
+ 			WriteData(fid,'object',obj,'fieldname','stabilization','format','Integer');
++
++			WriteData(fid,'object',obj,'fieldname','Cmu','format','DoubleMat','mattype',1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/enum/BalancethicknessCmuEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BalancethicknessCmuEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/BalancethicknessCmuEnum.m	(revision 18551)
+@@ -0,0 +1,11 @@
++function macro=BalancethicknessCmuEnum()
++%BALANCETHICKNESSCMUENUM - Enum of BalancethicknessCmu
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=BalancethicknessCmuEnum()
++
++macro=StringToEnum('BalancethicknessCmu');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18550)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18551)
+@@ -304,6 +304,7 @@
+ def BalancethicknessApparentMassbalanceEnum(): return StringToEnum("BalancethicknessApparentMassbalance")[0]
+ def Balancethickness2MisfitEnum(): return StringToEnum("Balancethickness2Misfit")[0]
+ def BalancethicknessDiffusionCoefficientEnum(): return StringToEnum("BalancethicknessDiffusionCoefficient")[0]
++def BalancethicknessCmuEnum(): return StringToEnum("BalancethicknessCmu")[0]
+ def SurfaceforcingsEnum(): return StringToEnum("Surfaceforcings")[0]
+ def SMBEnum(): return StringToEnum("SMB")[0]
+ def SurfaceforcingsMassBalanceEnum(): return StringToEnum("SurfaceforcingsMassBalance")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18551-18552.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18551-18552.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18551-18552.diff	(revision 19102)
@@ -0,0 +1,170 @@
+Index: ../trunk-jpl/test/Par/SquareThermal.par
+===================================================================
+--- ../trunk-jpl/test/Par/SquareThermal.par	(revision 18551)
++++ ../trunk-jpl/test/Par/SquareThermal.par	(revision 18552)
+@@ -21,6 +21,9 @@
+ 
+ disp('      creating temperatures');
+ md.initialization.temperature=(273.-20.)*ones(md.mesh.numberofvertices,1);
++md.initialization.pressure=zeros(md.mesh.numberofvertices,1);
++md.initialization.waterfraction=zeros(md.mesh.numberofvertices,1);
++md.initialization.watercolumn=zeros(md.mesh.numberofvertices,1);
+ 
+ disp('      creating flow law parameter');
+ md.materials.rheology_B=paterson(md.initialization.temperature);
+Index: ../trunk-jpl/test/NightlyRun/test436.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test436.m	(revision 0)
++++ ../trunk-jpl/test/NightlyRun/test436.m	(revision 18552)
+@@ -0,0 +1,26 @@
++md=triangle(model(),'../Exp/Square.exp',150000.);
++md=setmask(md,'../Exp/SquareShelf.exp','');
++md=parameterize(md,'../Par/SquareSheetShelf.par');
++md=extrude(md,3,2.);
++md=setflowequation(md,'HO','all');
++md.cluster=generic('name',oshostname(),'np',3);
++md.timestepping.time_step=0.;
++md.thermal.isenthalpy=1;
++md.materials.rheology_law='LliboutryDuval';
++md.initialization.waterfraction=zeros(md.mesh.numberofvertices,1);
++md.initialization.watercolumn=zeros(md.mesh.numberofvertices,1);
++md=solve(md,SteadystateSolutionEnum());
++
++%Fields and tolerances to track changes
++field_names     ={'Vx','Vy','Vz','Vel','Pressure','Temperature','Water fraction','Enthalpy'};
++field_tolerances={2e-09,1e-09,1e-09,1e-09,1e-13,1e-10,1e-10,1e-10};
++field_values={...
++	(md.results.SteadystateSolution.Vx),...
++	(md.results.SteadystateSolution.Vy),...
++	(md.results.SteadystateSolution.Vz),...
++	(md.results.SteadystateSolution.Vel),...
++	(md.results.SteadystateSolution.Pressure),...
++	(md.results.SteadystateSolution.Temperature),...
++	(md.results.SteadystateSolution.Waterfraction),...
++	(md.results.SteadystateSolution.Enthalpy),...
++	};
+Index: ../trunk-jpl/test/NightlyRun/test437.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test437.m	(revision 0)
++++ ../trunk-jpl/test/NightlyRun/test437.m	(revision 18552)
+@@ -0,0 +1,77 @@
++md=triangle(model(),'../Exp/Square.exp',500000.);
++md=setmask(md,'','');
++md=parameterize(md,'../Par/SquareThermal.par');
++
++h=100.;
++md.geometry.thickness=h*ones(md.mesh.numberofvertices,1);
++md.geometry.base=-h*ones(md.mesh.numberofvertices,1);
++md.geometry.surface=md.geometry.base+md.geometry.thickness;
++
++md=extrude(md,41,2.);
++md=setflowequation(md,'HO','all');
++md.thermal.isenthalpy=1;
++md.thermal.isdynamicbasalspc=1;
++
++%Basal forcing
++Ts=273.15-3.; Tb=273.15-1.; Tsw=Tb;
++qgeo=md.materials.thermalconductivity/max(md.geometry.thickness)*(Tb-Ts); %qgeo=kappa*(Tb-Ts)/H
++md.basalforcings.geothermalflux(find(md.mesh.vertexonbase))=qgeo;
++md.initialization.temperature=qgeo/md.materials.thermalconductivity.*(md.geometry.surface-md.mesh.z)+Ts;
++
++%Surface forcing
++pos=find(md.mesh.vertexonsurface);
++SPC_cold=NaN(md.mesh.numberofvertices,1);
++SPC_warm=NaN(md.mesh.numberofvertices,1);
++SPC_cold(pos)=Ts;
++SPC_warm(pos)=Tsw;
++md.thermal.spctemperature=SPC_cold;
++md.timestepping.time_step=5.;
++t0=0.;
++t1=10.;
++t2=100.;
++md.timestepping.final_time=400.;
++md.thermal.spctemperature=[SPC_cold SPC_cold SPC_warm SPC_warm SPC_cold];
++md.thermal.spctemperature=[md.thermal.spctemperature; t0 t1-1 t1 t2-1 t2];
++
++%Additional settings
++md.transient.ismasstransport=0;
++md.transient.isstressbalance=0;
++md.transient.isthermal=1;
++md.thermal.stabilization = 0;
++
++%Go solve
++md.cluster=generic('name',oshostname(),'np',3);
++md=solve(md, TransientSolutionEnum());
++
++%Fields and tolerances to track changes
++field_names     ={'Enthalpy1','Temperature1','Waterfraction1','BasalMeltingRate1','Watercolumn1',...
++						'Enthalpy2','Temperature2','Waterfraction2','BasalMeltingRate2','Watercolumn2',...
++						'Enthalpy3','Temperature3','Waterfraction3','BasalMeltingRate3','Watercolumn3',...
++						'Enthalpy4','Temperature4','Waterfraction4','BasalMeltingRate4','Watercolumn4'};
++field_tolerances={1.e-10,1.e-10,1.e-10,1.e-10,1.e-10,...
++						1.e-10,1.e-10,1.e-10,1.e-10,1.e-10,...
++						1.e-10,1.e-10,1.e-10,1.e-10,1.e-10,...
++						1.e-10,1.e-10,1.e-10,1.e-10,1.e-10};
++i1=1;	i2=ceil(t2/md.timestepping.time_step)+2;	i3=ceil(md.timestepping.final_time/(2.*md.timestepping.time_step));	i4=size(md.results.TransientSolution,2);
++field_values={...
++	(md.results.TransientSolution(i1).Enthalpy),...
++	(md.results.TransientSolution(i1).Temperature),...
++	(md.results.TransientSolution(i1).Waterfraction),...
++	(md.results.TransientSolution(i1).BasalforcingsGroundediceMeltingRate),...
++	(md.results.TransientSolution(i1).Watercolumn),...
++	(md.results.TransientSolution(i2).Enthalpy),...
++	(md.results.TransientSolution(i2).Temperature),...
++	(md.results.TransientSolution(i2).Waterfraction),...
++	(md.results.TransientSolution(i2).BasalforcingsGroundediceMeltingRate),...
++	(md.results.TransientSolution(i2).Watercolumn),...
++	(md.results.TransientSolution(i3).Enthalpy),...
++	(md.results.TransientSolution(i3).Temperature),...
++	(md.results.TransientSolution(i3).Waterfraction),...
++	(md.results.TransientSolution(i3).BasalforcingsGroundediceMeltingRate),...
++	(md.results.TransientSolution(i3).Watercolumn),...
++	(md.results.TransientSolution(i4).Enthalpy),...
++	(md.results.TransientSolution(i4).Temperature),...
++	(md.results.TransientSolution(i4).Waterfraction),...
++	(md.results.TransientSolution(i4).BasalforcingsGroundediceMeltingRate),...
++	(md.results.TransientSolution(i4).Watercolumn),...
++	};
+Index: ../trunk-jpl/test/NightlyRun/IdToName.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/IdToName.m	(revision 18551)
++++ ../trunk-jpl/test/NightlyRun/IdToName.m	(revision 18552)
+@@ -150,6 +150,8 @@
+ 	case 433, name='RoundSheetShelfGLMigrationSSA3d';
+ 	case 434, name='SquareSheetShelfL1L2';
+ 	case 435, name='MISMIP3DHO';
++	case 436, name='SquareSheetShelfSteaEnthalpyLliboutryDuvalHO';
++	case 437, name='ThermalEnthBasalcondsTrans';
+ 	case 450, name='SquareSheetShelfStressSSAHigherOrder';
+ 	case 455, name='SquareSheetShelfStressHOHigherOrder';
+ 	case 501, name='PigStressSSA2d';
+Index: ../trunk-jpl/test/Archives/Archive437.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive437.nc
+===================================================================
+--- ../trunk-jpl/test/Archives/Archive437.nc	(revision 18551)
++++ ../trunk-jpl/test/Archives/Archive437.nc	(revision 18552)
+
+Property changes on: ../trunk-jpl/test/Archives/Archive437.nc
+___________________________________________________________________
+Added: svn:mime-type
+## -0,0 +1 ##
++application/octet-stream
+\ No newline at end of property
+Index: ../trunk-jpl/test/Archives/Archive436.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive436.nc
+===================================================================
+--- ../trunk-jpl/test/Archives/Archive436.nc	(revision 18551)
++++ ../trunk-jpl/test/Archives/Archive436.nc	(revision 18552)
+
+Property changes on: ../trunk-jpl/test/Archives/Archive436.nc
+___________________________________________________________________
+Added: svn:mime-type
+## -0,0 +1 ##
++application/octet-stream
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18552-18553.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18552-18553.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18552-18553.diff	(revision 19102)
@@ -0,0 +1,177 @@
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18552)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18553)
+@@ -273,6 +273,7 @@
+ 	SurfaceEnum,
+ 	ThermalIsenthalpyEnum,
+ 	ThermalIsdynamicbasalspcEnum,
++	ThermalReltolEnum,
+ 	ThermalMaxiterEnum,
+ 	ThermalPenaltyFactorEnum,
+ 	ThermalPenaltyLockEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18552)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18553)
+@@ -281,6 +281,7 @@
+ 		case SurfaceEnum : return "Surface";
+ 		case ThermalIsenthalpyEnum : return "ThermalIsenthalpy";
+ 		case ThermalIsdynamicbasalspcEnum : return "ThermalIsdynamicbasalspc";
++		case ThermalReltolEnum : return "ThermalReltol";
+ 		case ThermalMaxiterEnum : return "ThermalMaxiter";
+ 		case ThermalPenaltyFactorEnum : return "ThermalPenaltyFactor";
+ 		case ThermalPenaltyLockEnum : return "ThermalPenaltyLock";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18552)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18553)
+@@ -287,6 +287,7 @@
+ 	      else if (strcmp(name,"Surface")==0) return SurfaceEnum;
+ 	      else if (strcmp(name,"ThermalIsenthalpy")==0) return ThermalIsenthalpyEnum;
+ 	      else if (strcmp(name,"ThermalIsdynamicbasalspc")==0) return ThermalIsdynamicbasalspcEnum;
++	      else if (strcmp(name,"ThermalReltol")==0) return ThermalReltolEnum;
+ 	      else if (strcmp(name,"ThermalMaxiter")==0) return ThermalMaxiterEnum;
+ 	      else if (strcmp(name,"ThermalPenaltyFactor")==0) return ThermalPenaltyFactorEnum;
+ 	      else if (strcmp(name,"ThermalPenaltyLock")==0) return ThermalPenaltyLockEnum;
+@@ -381,11 +382,11 @@
+ 	      else if (strcmp(name,"HydrologyDCEfficientAnalysis")==0) return HydrologyDCEfficientAnalysisEnum;
+ 	      else if (strcmp(name,"HydrologySolution")==0) return HydrologySolutionEnum;
+ 	      else if (strcmp(name,"MeltingAnalysis")==0) return MeltingAnalysisEnum;
+-	      else if (strcmp(name,"MasstransportAnalysis")==0) return MasstransportAnalysisEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum;
++	      if (strcmp(name,"MasstransportAnalysis")==0) return MasstransportAnalysisEnum;
++	      else if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum;
+ 	      else if (strcmp(name,"FreeSurfaceBaseAnalysis")==0) return FreeSurfaceBaseAnalysisEnum;
+ 	      else if (strcmp(name,"FreeSurfaceTopAnalysis")==0) return FreeSurfaceTopAnalysisEnum;
+ 	      else if (strcmp(name,"SurfaceNormalVelocity")==0) return SurfaceNormalVelocityEnum;
+@@ -504,11 +505,11 @@
+ 	      else if (strcmp(name,"Converged")==0) return ConvergedEnum;
+ 	      else if (strcmp(name,"Fill")==0) return FillEnum;
+ 	      else if (strcmp(name,"FractionIncrement")==0) return FractionIncrementEnum;
+-	      else if (strcmp(name,"Friction")==0) return FrictionEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"Internal")==0) return InternalEnum;
++	      if (strcmp(name,"Friction")==0) return FrictionEnum;
++	      else if (strcmp(name,"Internal")==0) return InternalEnum;
+ 	      else if (strcmp(name,"MassFlux")==0) return MassFluxEnum;
+ 	      else if (strcmp(name,"MeltingOffset")==0) return MeltingOffsetEnum;
+ 	      else if (strcmp(name,"Misfit")==0) return MisfitEnum;
+@@ -627,11 +628,11 @@
+ 	      else if (strcmp(name,"MisfitName")==0) return MisfitNameEnum;
+ 	      else if (strcmp(name,"MisfitModelEnum")==0) return MisfitModelEnumEnum;
+ 	      else if (strcmp(name,"MisfitObservation")==0) return MisfitObservationEnum;
+-	      else if (strcmp(name,"MisfitObservationEnum")==0) return MisfitObservationEnumEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
++	      if (strcmp(name,"MisfitObservationEnum")==0) return MisfitObservationEnumEnum;
++	      else if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
+ 	      else if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
+ 	      else if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
+ 	      else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
+@@ -750,11 +751,11 @@
+ 	      else if (strcmp(name,"Matseaice")==0) return MatseaiceEnum;
+ 	      else if (strcmp(name,"MaterialsPoisson")==0) return MaterialsPoissonEnum;
+ 	      else if (strcmp(name,"MaterialsYoungModulus")==0) return MaterialsYoungModulusEnum;
+-	      else if (strcmp(name,"MaterialsTimeRelaxationStress")==0) return MaterialsTimeRelaxationStressEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"MaterialsTimeRelaxationDamage")==0) return MaterialsTimeRelaxationDamageEnum;
++	      if (strcmp(name,"MaterialsTimeRelaxationStress")==0) return MaterialsTimeRelaxationStressEnum;
++	      else if (strcmp(name,"MaterialsTimeRelaxationDamage")==0) return MaterialsTimeRelaxationDamageEnum;
+ 	      else if (strcmp(name,"MaterialsRidgingExponent")==0) return MaterialsRidgingExponentEnum;
+ 	      else if (strcmp(name,"MaterialsCohesion")==0) return MaterialsCohesionEnum;
+ 	      else if (strcmp(name,"MaterialsInternalFrictionCoef")==0) return MaterialsInternalFrictionCoefEnum;
+Index: ../trunk-jpl/src/m/classes/thermal.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/thermal.m	(revision 18552)
++++ ../trunk-jpl/src/m/classes/thermal.m	(revision 18553)
+@@ -8,6 +8,7 @@
+ 		spctemperature    = NaN;
+ 		penalty_threshold = 0;
+ 		stabilization     = 0;
++		reltol				= 0;
+ 		maxiter           = 0;
+ 		penalty_lock      = 0;
+ 		penalty_factor    = 0;
+@@ -30,6 +31,7 @@
+             fprintf(fid,'%s\n%s\n','       <option value="2" type="string" default="false"> </option>','</parameter>');
+ 
+             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="stabilization" type="',class(obj.stabilization),'" default="',convert2str(obj.stabilization),'">','     <section name="thermal" />','     <help> maximum number of non linear iterations </help>','  </parameter>');
++				fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="reltol" type="',class(obj.reltol),'" default="',convert2str(obj.reltol),'">','     <section name="steadystate" />','     <help> relative tolerance criterion [K] </help>','  </parameter>');
+             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="maxiter" type="',class(obj.maxiter),'" default="',convert2str(obj.maxiter),'">','     <section name="thermal" />','     <help> stabilize unstable thermal constraints that keep zigzagging after n iteration (default is 0, no stabilization) </help>','  </parameter>');
+             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="penalty_lock" type="',class(obj.penalty_lock),'" default="',convert2str(obj.penalty_lock),'">','     <section name="thermal" />','     <help> threshold to declare convergence of thermal solution (default is 0)  </help>','  </parameter>');
+             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="penalty_factor" type="',class(obj.penalty_factor),'" default="',convert2str(obj.penalty_factor),'">','     <section name="thermal" />','     <help> scaling exponent (default is 3) </help>','  </parameter>');
+@@ -64,6 +66,9 @@
+ 			%Type of stabilization used
+ 			obj.stabilization=1;
+ 
++			%Relative tolerance for the enthalpy convergence
++			obj.reltol=0.01;
++
+ 			%Maximum number of iterations
+ 			obj.maxiter=100;
+ 
+@@ -93,6 +98,10 @@
+ 				md = checkfield(md,'fieldname','thermal.isenthalpy','numel',[1],'values',[0 1]);
+ 				md = checkfield(md,'fieldname','thermal.isdynamicbasalspc','numel', [1],'values',[0 1]);
+ 				if(md.thermal.isenthalpy)
++					md = checkfield(md,'fieldname','thermal.reltol','>',0.,'message','reltol must be larger than zero');
++					if isnan(md.stressbalance.reltol),
++						md = checkmessage(md,['for a steadystate computation, stressbalance.reltol (relative convergence criterion) must be defined!']);
++					end
+ 					md = checkfield(md,'fieldname','thermal.isdynamicbasalspc','numel', [1],'values',[1], 'message',['for enthalpy run thermal.isdynamicbasalspc should be 1']);
+ 				end
+ 	    end
+@@ -104,6 +113,7 @@
+ 
+ 			fielddisplay(obj,'spctemperature','temperature constraints (NaN means no constraint) [K]');
+ 			fielddisplay(obj,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG');
++			fielddisplay(obj,'reltol','relative tolerance convergence criterion for enthalpy');
+ 			fielddisplay(obj,'maxiter','maximum number of non linear iterations');
+ 			fielddisplay(obj,'penalty_lock','stabilize unstable thermal constraints that keep zigzagging after n iteration (default is 0, no stabilization)');
+ 			fielddisplay(obj,'penalty_threshold','threshold to declare convergence of thermal solution (default is 0)');
+@@ -117,6 +127,7 @@
+ 			WriteData(fid,'object',obj,'fieldname','spctemperature','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
+ 			WriteData(fid,'object',obj,'fieldname','penalty_threshold','format','Integer');
+ 			WriteData(fid,'object',obj,'fieldname','stabilization','format','Integer');
++			WriteData(fid,'object',obj,'fieldname','reltol','format','Double');
+ 			WriteData(fid,'object',obj,'fieldname','maxiter','format','Integer');
+ 			WriteData(fid,'object',obj,'fieldname','penalty_lock','format','Integer');
+ 			WriteData(fid,'object',obj,'fieldname','penalty_factor','format','Double');
+Index: ../trunk-jpl/src/m/enum/ThermalReltolEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/ThermalReltolEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/ThermalReltolEnum.m	(revision 18553)
+@@ -0,0 +1,11 @@
++function macro=ThermalReltolEnum()
++%THERMALRELTOLENUM - Enum of ThermalReltol
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=ThermalReltolEnum()
++
++macro=StringToEnum('ThermalReltol');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18552)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18553)
+@@ -273,6 +273,7 @@
+ def SurfaceEnum(): return StringToEnum("Surface")[0]
+ def ThermalIsenthalpyEnum(): return StringToEnum("ThermalIsenthalpy")[0]
+ def ThermalIsdynamicbasalspcEnum(): return StringToEnum("ThermalIsdynamicbasalspc")[0]
++def ThermalReltolEnum(): return StringToEnum("ThermalReltol")[0]
+ def ThermalMaxiterEnum(): return StringToEnum("ThermalMaxiter")[0]
+ def ThermalPenaltyFactorEnum(): return StringToEnum("ThermalPenaltyFactor")[0]
+ def ThermalPenaltyLockEnum(): return StringToEnum("ThermalPenaltyLock")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18553-18554.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18553-18554.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18553-18554.diff	(revision 19102)
@@ -0,0 +1,64 @@
+Index: ../trunk-jpl/src/m/classes/thermal.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/thermal.py	(revision 18553)
++++ ../trunk-jpl/src/m/classes/thermal.py	(revision 18554)
+@@ -17,6 +17,7 @@
+ 		self.spctemperature    = float('NaN')
+ 		self.penalty_threshold = 0
+ 		self.stabilization     = 0
++		self.reltol            = 0
+ 		self.maxiter           = 0
+ 		self.penalty_lock      = 0
+ 		self.penalty_factor    = 0
+@@ -33,6 +34,7 @@
+ 		string="%s\n%s"%(string,fielddisplay(self,'spctemperature','temperature constraints (NaN means no constraint) [K]'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'maxiter','maximum number of non linear iterations'))
++		string="%s\n%s"%(string,fielddisplay(self,'reltol','relative tolerance criterion'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'penalty_lock','stabilize unstable thermal constraints that keep zigzagging after n iteration (default is 0, no stabilization)'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'penalty_threshold','threshold to declare convergence of thermal solution (default is 0)'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'isenthalpy','use an enthalpy formulation to include temperate ice (default is 0)'))
+@@ -56,6 +58,9 @@
+ 		#Type of stabilization used
+ 		self.stabilization=1
+ 
++		#Relative tolerance for the enthalpy convergence
++		self.reltol=0.01
++
+ 		#Maximum number of iterations
+ 		self.maxiter=100
+ 
+@@ -88,6 +93,9 @@
+ 			md = checkfield(md,'fieldname','thermal.isenthalpy','numel',[1],'values',[0,1])
+ 			md = checkfield(md,'fieldname','thermal.isdynamicbasalspc','numel',[1],'values',[0,1]);
+ 			if(md.thermal.isenthalpy):
++				if numpy.isnan(md.stressbalance.reltol):
++					md.checkmessage("for a steadystate computation, stressbalance.reltol (relative convergence criterion) must be defined!")
++				md = checkfield(md,'fieldname','thermal.reltol','>',0.,'message',"reltol must be larger than zero");
+ 				md = checkfield(md,'fieldname','thermal.isdynamicbasalspc','numel', [1],'values',[1], 'message',"for enthalpy run thermal.isdynamicbasalspc should be true")
+ 		md = checkfield(md,'fieldname','thermal.requested_outputs','stringrow',1)
+ 
+@@ -97,6 +105,7 @@
+ 		WriteData(fid,'object',self,'fieldname','spctemperature','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
+ 		WriteData(fid,'object',self,'fieldname','penalty_threshold','format','Integer')
+ 		WriteData(fid,'object',self,'fieldname','stabilization','format','Integer')
++		WriteData(fid,'object',self,'fieldname','reltol','format','Double');
+ 		WriteData(fid,'object',self,'fieldname','maxiter','format','Integer')
+ 		WriteData(fid,'object',self,'fieldname','penalty_lock','format','Integer')
+ 		WriteData(fid,'object',self,'fieldname','penalty_factor','format','Double')
+Index: ../trunk-jpl/src/m/classes/thermal.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/thermal.m	(revision 18553)
++++ ../trunk-jpl/src/m/classes/thermal.m	(revision 18554)
+@@ -98,10 +98,10 @@
+ 				md = checkfield(md,'fieldname','thermal.isenthalpy','numel',[1],'values',[0 1]);
+ 				md = checkfield(md,'fieldname','thermal.isdynamicbasalspc','numel', [1],'values',[0 1]);
+ 				if(md.thermal.isenthalpy)
+-					md = checkfield(md,'fieldname','thermal.reltol','>',0.,'message','reltol must be larger than zero');
+ 					if isnan(md.stressbalance.reltol),
+ 						md = checkmessage(md,['for a steadystate computation, stressbalance.reltol (relative convergence criterion) must be defined!']);
+ 					end
++					md = checkfield(md,'fieldname','thermal.reltol','>',0.,'message','reltol must be larger than zero');
+ 					md = checkfield(md,'fieldname','thermal.isdynamicbasalspc','numel', [1],'values',[1], 'message',['for enthalpy run thermal.isdynamicbasalspc should be 1']);
+ 				end
+ 	    end
Index: /issm/oecreview/Archive/18296-19100/ISSM-18554-18555.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18554-18555.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18554-18555.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/classes/balancethickness.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/balancethickness.m	(revision 18554)
++++ ../trunk-jpl/src/m/classes/balancethickness.m	(revision 18555)
+@@ -34,7 +34,7 @@
+ 			md = checkfield(md,'fieldname','balancethickness.thickening_rate','size',[md.mesh.numberofvertices 1],'NaN',1);
+ 			md = checkfield(md,'fieldname','balancethickness.stabilization','size',[1 1],'values',[0 1 2 3]);
+ 
+-			md = checkfield(md,'fieldname','balancethickness.Cmu','size',[md.mesh.numberofvertices 1],'NaN',1,'>=',0);
++			%md = checkfield(md,'fieldname','balancethickness.Cmu','size',[md.mesh.numberofvertices 1],'NaN',1,'>=',0);
+ 		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   balance thickness solution parameters:'));
Index: /issm/oecreview/Archive/18296-19100/ISSM-18555-18556.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18555-18556.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18555-18556.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/m4/issm_options.m4
+===================================================================
+--- ../trunk-jpl/m4/issm_options.m4	(revision 18555)
++++ ../trunk-jpl/m4/issm_options.m4	(revision 18556)
+@@ -287,7 +287,7 @@
+ 				fi
+ 
+ 				dnl Make sure mexFunction.map is not in MEXLIB to avoid problems with global variables
+-				MEXLINK=$(echo $MEXLINK | sed -e "s/-[[^ ]]*mexFunction\\.map//g")
++				MEXLINK=$(echo $MEXLINK | sed -e "s/,-expo.*mexFunction\\.map\"//g" | sed -e "s/-[[^ ]]*mexFunction\\.map//g")
+ 
+   			;;
+       esac
Index: /issm/oecreview/Archive/18296-19100/ISSM-18556-18557.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18556-18557.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18556-18557.diff	(revision 19102)
@@ -0,0 +1,42 @@
+Index: ../trunk-jpl/src/c/shared/FSanalyticals/fsanalyticals.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/FSanalyticals/fsanalyticals.cpp	(revision 18556)
++++ ../trunk-jpl/src/c/shared/FSanalyticals/fsanalyticals.cpp	(revision 18557)
+@@ -50,6 +50,9 @@
+ 		case 12:
+ 			z=y;
+ 			return 32.0/5.0*pow(PI, 2)*sin(8*PI*z);
++		case 13:
++			z=y;
++			return 8.0*pow(PI, 2)*pow(x, 2)*(z - 2)*sin(4*PI*x*z) - 4.0*PI*x*cos(4*PI*x*z) + 16.0*pow(PI, 2)*pow(z, 2)*(z - 2)*sin(4*PI*x*z) - 0.25*PI*((16*pow(PI, 2)*x*z*(PI*x*z - PI*x)*cos(4*PI*x*z) + 4*pow(PI, 2)*x*z*(8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*sin(4*PI*x*z) + 4*pow(PI, 2)*x*z*sin(4*PI*x*z) - 4*PI*x*(-PI*z + PI)*sin(4*PI*x*z) - 16*PI*x*(pow(PI, 2)*x*pow(z, 2) - 2*pow(PI, 2)*x*z)*cos(4*PI*x*z) - 16*PI*z*(pow(PI, 2)*pow(x, 2)*z - pow(PI, 2)*pow(x, 2))*cos(4*PI*x*z) + 4*PI*(PI*x*z - PI*x)*sin(4*PI*x*z) - 8*(pow(PI, 2)*x*z - pow(PI, 2)*x)*sin(4*PI*x*z) - PI*(8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*cos(4*PI*x*z) - PI*cos(4*PI*x*z))/(pow(PI, 3)*pow(x, 3)) + 3*(-4*PI*x*(PI*x*z - PI*x)*sin(4*PI*x*z) + PI*x*(8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*cos(4*PI*x*z) + PI*x*cos(4*PI*x*z) + 4*(pow(PI, 2)*pow(x, 2)*z - pow(PI, 2)*pow(x, 2))*sin(4*PI*x*z))/(pow(PI, 3)*pow(x, 4))) + 4*PI*sin(4*PI*z)*cos(4*PI*x);
+ 		case 21:
+ 			z=y;
+ 			return z - 4.0L/3.0L*pow(2, 1.0L/3.0L)*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(4*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(pow(x, 2)*z*(z - 1)*(2*z - 1) + 4*x*z*(x - 1)*(z - 1)*(2*z - 1) + z*pow(x - 1, 2)*(z - 1)*(2*z - 1)) + 4*(2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) + z*(6*pow(x, 2) - 6*x + 1))*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x)) + (2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1))*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1) - 3*pow(z, 4)*(2*x - 1) + 6*pow(z, 3)*(2*x - 1) - 3*pow(z, 2)*(2*x - 1)))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 4.0L/3.0L) - 1.0L/3.0L*pow(2, 1.0L/3.0L)*(4*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1)) + 4*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x))*(2*pow(x, 3) - 3*pow(x, 2) + x + 6*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 6*z*(2*pow(x, 3) - 3*pow(x, 2) + x)) + (2*pow(x, 2)*z*pow(x - 1, 2) + 2*pow(x, 2)*pow(x - 1, 2)*(z - 1) + pow(x, 2)*pow(x - 1, 2)*(2*z - 1) - 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) + 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) - z*(6*pow(x, 2) - 6*x + 1))*(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1)))*(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 4.0L/3.0L) + 2*pow(2, 1.0L/3.0L)*(pow(x, 2)*z*(z - 1)*(2*z - 1) + 4*x*z*(x - 1)*(z - 1)*(2*z - 1) + z*pow(x - 1, 2)*(z - 1)*(2*z - 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 1.0L/3.0L) - 1.0L/2.0L + pow(2, 1.0L/3.0L)*(2*pow(x, 2)*z*pow(x - 1, 2) + 2*pow(x, 2)*pow(x - 1, 2)*(z - 1) + pow(x, 2)*pow(x - 1, 2)*(2*z - 1) - 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) + 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) - z*(6*pow(x, 2) - 6*x + 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 1.0L/3.0L);
+@@ -98,6 +101,9 @@
+ 		case 12:
+ 			z=y;
+ 			return 32.0/5.0*pow(PI, 2)*sin(8*PI*x) - 100;
++		case 13:
++			z=y;
++			return 8.0*pow(PI, 2)*x*z*(z - 2)*sin(4*PI*x*z) - 2.0*PI*z*cos(4*PI*x*z) - 2.0*PI*(z - 2)*cos(4*PI*x*z) + 0.25*PI*(32*cos(4*PI*x)/pow(x, 2) - 4*(8*pow(PI, 2)*pow(x, 2) + 1)*sin(4*PI*x)/(PI*pow(x, 3)) - 4*(4*pow(PI, 2)*pow(z, 2)*(PI*x*z - PI*x)*cos(4*PI*x*z) + pow(PI, 2)*pow(z, 2)*(8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*sin(4*PI*x*z) - 2*PI*z*(-PI*z + PI)*sin(4*PI*x*z) - 8*PI*z*(pow(PI, 2)*x*pow(z, 2) - 2*pow(PI, 2)*x*z)*cos(4*PI*x*z) - (pow(PI, 2)*pow(z, 2) - 2*pow(PI, 2)*z)*sin(4*PI*x*z))/(pow(PI, 3)*pow(x, 3)) - 20*sin(4*PI*x)/(PI*pow(x, 3)) - 6*(8*pow(PI, 2)*pow(x, 2) + 1)*cos(4*PI*x)/(pow(PI, 2)*pow(x, 4)) - 6*(-4*PI*z*(PI*x*z - PI*x)*sin(4*PI*x*z) + PI*z*(8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*cos(4*PI*x*z) - (-PI*z + PI)*cos(4*PI*x*z) + 4*(pow(PI, 2)*x*pow(z, 2) - 2*pow(PI, 2)*x*z)*sin(4*PI*x*z))/(pow(PI, 3)*pow(x, 4)) + 3*(8*pow(PI, 2)*pow(x, 2) + 1)*sin(4*PI*x)/(pow(PI, 3)*pow(x, 5)) + 3*(4*(PI*x*z - PI*x)*cos(4*PI*x*z) + (8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*sin(4*PI*x*z))/(pow(PI, 3)*pow(x, 5))) + 4*PI*sin(4*PI*x)*cos(4*PI*z) + (8.0L/5.0L)*pow(PI, 2)*sin(4*PI*x) + 2*(-4.0*pow(PI, 2)*pow(x, 2)*(PI*x*z - PI*x)*cos(4*PI*x*z) - 1.0*pow(PI, 2)*pow(x, 2)*(8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*sin(4*PI*x*z) - 1.0*pow(PI, 2)*pow(x, 2)*sin(4*PI*x*z) + 8.0*PI*x*(pow(PI, 2)*pow(x, 2)*z - pow(PI, 2)*pow(x, 2))*cos(4*PI*x*z))/(pow(PI, 2)*pow(x, 3));
+ 		case 21:
+ 			z=y;
+ 			return x + (4.0L/3.0L)*pow(2, 1.0L/3.0L)*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x))*(4*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1)) + 4*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x))*(2*pow(x, 3) - 3*pow(x, 2) + x + 6*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 6*z*(2*pow(x, 3) - 3*pow(x, 2) + x)) + (2*pow(x, 2)*z*pow(x - 1, 2) + 2*pow(x, 2)*pow(x - 1, 2)*(z - 1) + pow(x, 2)*pow(x - 1, 2)*(2*z - 1) - 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) + 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) - z*(6*pow(x, 2) - 6*x + 1))*(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1)))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 4.0L/3.0L) - 1.0L/3.0L*pow(2, 1.0L/3.0L)*(4*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(pow(x, 2)*z*(z - 1)*(2*z - 1) + 4*x*z*(x - 1)*(z - 1)*(2*z - 1) + z*pow(x - 1, 2)*(z - 1)*(2*z - 1)) + 4*(2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) + z*(6*pow(x, 2) - 6*x + 1))*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x)) + (2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1))*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1) - 3*pow(z, 4)*(2*x - 1) + 6*pow(z, 3)*(2*x - 1) - 3*pow(z, 2)*(2*x - 1)))*(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 4.0L/3.0L) - 1.0L/2.0L - 2*pow(2, 1.0L/3.0L)*(2*pow(x, 3) - 3*pow(x, 2) + x + 6*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 6*z*(2*pow(x, 3) - 3*pow(x, 2) + x))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 1.0L/3.0L) + pow(2, 1.0L/3.0L)*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1) - 3*pow(z, 4)*(2*x - 1) + 6*pow(z, 3)*(2*x - 1) - 3*pow(z, 2)*(2*x - 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 1.0L/3.0L);
+@@ -117,7 +123,7 @@
+ 	IssmDouble a = 1.0;
+ 
+ 	switch(testid){
+-		case 1: case 2: case 7: case 8: case 11:  case 12: case 18: case 21:
++		case 1: case 2: case 7: case 8: case 11:  case 12: case 13: case 18: case 21:
+ 			return 0.;
+ 		case 3: 
+ 			return 2*pow(x, 2)*y*z*(x - 1)*(y - 1)*(2*y - 1) + 2*pow(x, 2)*y*(x - 1)*(y - 1)*(2*y - 1)*(z - 1) - 2*x*pow(y, 2)*z*(x - 1)*(2*x - 1)*(y - 1) - 2*x*pow(y, 2)*(x - 1)*(2*x - 1)*(y - 1)*(z - 1) + 2*x*y*z*pow(x - 1, 2)*(y - 1)*(2*y - 1) - 2*x*y*z*(x - 1)*(2*x - 1)*pow(y - 1, 2) + 2*x*y*pow(x - 1, 2)*(y - 1)*(2*y - 1)*(z - 1) - 2*x*y*(x - 1)*(2*x - 1)*pow(y - 1, 2)*(z - 1);
+@@ -143,7 +149,7 @@
+ 	IssmDouble q = 2.0;   
+ 
+ 	switch(testid){
+-		case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 21:
++		case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 21:
+ 			return 0.;
+ 		case 18:
+ 			return (120.0L/109.0L)*sqrt(109.)/(10*x - 3*z);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18557-18558.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18557-18558.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18557-18558.diff	(revision 19102)
@@ -0,0 +1,1078 @@
+Index: ../trunk-jpl/src/m/plot/radarpower.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/radarpower.m	(revision 18557)
++++ ../trunk-jpl/src/m/plot/radarpower.m	(revision 18558)
+@@ -35,7 +35,7 @@
+ 
+ %figure out if we should go look for Greenland or Antarctica geotiff, or if user provided one.
+ if ~exist(options,'overlay_image'),
+-	if strcmpi(md.mesh.hemisphere,'n'),
++	if md.mesh.epsg==3413,
+ 		%if ~exist(['/u/astrid-r1b/ModelData/MOG/mog150_greenland_map.jpg']),
+ 		%	error(['radarpower error message: file ' '/u/astrid-r1b/ModelData/MOG/mog150_greenland_map.jpg not found.']);
+ 		%end
+@@ -105,7 +105,7 @@
+ 		%Erase image
+ 		system('rm -rf ./temp.tif');
+ 
+-	elseif strcmpi(md.mesh.hemisphere,'s'),
++	elseif md.mesh.epsg==3031,
+ 		if ~exist(options,'geotiff_name'),
+ 			if highres,
+ 				if ~exist(['/u/astrid-r1b/ModelData/MosaicTiffRsat/amm125m_v2_200m.tif']),
+@@ -137,7 +137,7 @@
+ 		system('rm -rf ./temp.tif');
+ 
+ 	else
+-		error('field hemisphere should either be ''n'' or ''s''');
++		error('EPSG code not supported yet (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)');
+ 	end
+ else
+ 	%user provided an image. check we also have overlay_xlim and overlay_ylim  options, to know what range of coordinates the image covers.
+Index: ../trunk-jpl/src/m/plot/showregion.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/showregion.m	(revision 18557)
++++ ../trunk-jpl/src/m/plot/showregion.m	(revision 18558)
+@@ -14,12 +14,12 @@
+ axes('pos',PosInset);
+ axis equal off
+ %box off
+-if strcmpi(md.mesh.hemisphere,'n') | strcmpi(md.mesh.hemisphere,'north'),
++if md.mesh.epsg==3413,
+ 	A=expread(['/u/astrid-r1b/ModelData/Exp/Greenland.exp']);
+-elseif strcmpi(md.mesh.hemisphere,'s') | strcmpi(md.mesh.hemisphere,'south'),
++elseif md.mesh.epsg==3031,
+ 	A=expread(['/u/astrid-r1b/ModelData/Exp/Antarctica.exp']);
+ else
+-	error('applyoptions error message: hemisphere not defined');
++	error('md.mesh.epsg not supported yet');
+ end
+ 
+ Ax=[min(A.x) max(A.x)];
+Index: ../trunk-jpl/src/m/plot/plot_googlemaps.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/plot_googlemaps.m	(revision 18557)
++++ ../trunk-jpl/src/m/plot/plot_googlemaps.m	(revision 18558)
+@@ -24,12 +24,12 @@
+ 	%Get xlim and ylim (used to extract radar image)
+ 	xlim=getfieldvalue(options,'xlim',[min(x) max(x)]);
+ 	ylim=getfieldvalue(options,'ylim',[min(y) max(y)]);
+-	if strcmpi(md.mesh.hemisphere,'n'),
++	if md.mesh.epsg==3413,
+ 		[latlist lonlist]= xy2ll(...
+ 			[linspace(xlim(1),xlim(2),100) linspace(xlim(2),xlim(2),100) linspace(xlim(2),xlim(1),100) linspace(xlim(1),xlim(1),100)],...
+ 			[linspace(ylim(1),ylim(1),100) linspace(ylim(1),ylim(2),100) linspace(ylim(2),ylim(2),100) linspace(ylim(2),ylim(1),100)],...
+ 			+1,45,70);
+-	elseif strcmpi(md.mesh.hemisphere,'s'),
++	elseif md.mesh.epsg==3031,
+ 		[latlist lonlist]= xy2ll(...
+ 			[linspace(xlim(1),xlim(2),100) linspace(xlim(2),xlim(2),100) linspace(xlim(2),xlim(1),100) linspace(xlim(1),xlim(1),100)],...
+ 			[linspace(ylim(1),ylim(1),100) linspace(ylim(1),ylim(2),100) linspace(ylim(2),ylim(2),100) linspace(ylim(2),ylim(1),100)],...
+@@ -37,7 +37,7 @@
+ 	else
+ 		latlist = md.mesh.lat; %That might work?
+ 		lonlist = md.mesh.long;
+-		error('field hemisphere should either be ''n'' or ''s''');
++		error('EPSG code not supported yet');
+ 	end
+ 
+ 	%Image corners in lat/long
+Index: ../trunk-jpl/src/m/plot/latlonoverlay.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/latlonoverlay.m	(revision 18557)
++++ ../trunk-jpl/src/m/plot/latlonoverlay.m	(revision 18558)
+@@ -65,13 +65,13 @@
+ 	longitudes=0:resolution:360;
+ 	latitudes =lat*ones(size(longitudes));
+ 
+-	if strcmpi(md.mesh.hemisphere,'n'),
++	if md.mesh.epsg==3413,
+ 		if lat<0, continue; end
+ 		[x,y]=ll2xy(latitudes,longitudes,+1,45,70);
+-	elseif strcmpi(md.mesh.hemisphere,'s'),
++	elseif md.mesh.epsg==3031,
+ 		if lat>0, continue; end
+ 		[x,y]=ll2xy(latitudes,longitudes,-1, 0,71);
+-	else error('field hemisphere should either be ''n'' or ''s'''); end
++	else error('field md.mesh.epsg not supported yet'); end
+ 
+ 	pos=find(x<=xlimits(2) & x>=xlimits(1) & y<=ylimits(2) & y>=ylimits(1));
+ 	if length(pos)<=1, continue; end
+@@ -104,16 +104,16 @@
+ %lon
+ for lon=-180:lonstep:180
+ 
+-	if strcmpi(md.mesh.hemisphere,'n'),
++	if md.mesh.epsg==3413,
+ 		latitudes =0:resolution:90;
+ 		longitudes=lon*ones(size(latitudes));
+ 		[x,y]=ll2xy(latitudes,longitudes,+1,45,70);
+-	elseif strcmpi(md.mesh.hemisphere,'s'),
++	elseif md.mesh.epsg==3031,
+ 		latitudes =-90:resolution:0;
+ 		longitudes=lon*ones(size(latitudes));
+ 		[x,y]=ll2xy(latitudes,longitudes,-1, 0,71);
+ 	else
+-		error('field hemisphere should either be ''n'' or ''s'''); 
++		error('field md.mesh.epsg not supported yet'); 
+ 	end
+ 
+ 	pos=find(x<=xlimits(2) & x>=xlimits(1) & y<=ylimits(2) & y>=ylimits(1));
+Index: ../trunk-jpl/src/m/plot/googlemaps.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/googlemaps.m	(revision 18557)
++++ ../trunk-jpl/src/m/plot/googlemaps.m	(revision 18558)
+@@ -21,22 +21,26 @@
+ 		options=pairoptions(varargin{:});
+ 	end
+ end
++
++if md.mesh.epsg==0,
++	error('md.mesh.epsg not defined');
++end
+ if nargin==1,
+ 	%Get xlim and ylim (used to extract Google maps image)
+ 	xlim=getfieldvalue(options,'xlim',[min(md.mesh.x) max(md.mesh.x)]);
+ 	ylim=getfieldvalue(options,'ylim',[min(md.mesh.y) max(md.mesh.y)]);
+-	if strcmpi(md.mesh.hemisphere,'n'),
++	if md.mesh.epsg==3413,
+ 		[latlist lonlist]= xy2ll(...
+ 			[linspace(xlim(1),xlim(2),100) linspace(xlim(2),xlim(2),100) linspace(xlim(2),xlim(1),100) linspace(xlim(1),xlim(1),100)],...
+ 			[linspace(ylim(1),ylim(1),100) linspace(ylim(1),ylim(2),100) linspace(ylim(2),ylim(2),100) linspace(ylim(2),ylim(1),100)],...
+ 			+1,45,70);
+-	elseif strcmpi(md.mesh.hemisphere,'s'),
++	elseif md.mesh.epsg==3031,
+ 		[latlist lonlist]= xy2ll(...
+ 			[linspace(xlim(1),xlim(2),100) linspace(xlim(2),xlim(2),100) linspace(xlim(2),xlim(1),100) linspace(xlim(1),xlim(1),100)],...
+ 			[linspace(ylim(1),ylim(1),100) linspace(ylim(1),ylim(2),100) linspace(ylim(2),ylim(2),100) linspace(ylim(2),ylim(1),100)],...
+ 			-1,0,71);
+ 	else
+-		error('field hemisphere should either be ''n'' or ''s''');
++		error('EPSG code not supported yet');
+ 	end
+ 
+ 	%Image corners in lat/long
+@@ -49,15 +53,7 @@
+ 
+ %Get region specific projection parameters
+ EPSGgoogle = 'EPSG:3785';   % Mercator       http://www.spatialreference.org/ref/epsg/3785/
+-if strcmpi(md.mesh.hemisphere,'n'),
+-	EPSGlocal = 'EPSG:3413'; % UPS Greenland  http://www.spatialreference.org/ref/epsg/3413/
+-elseif strcmpi(md.mesh.hemisphere,'s'),
+-	EPSGlocal = 'EPSG:3031'; % UPS Antarctica http://www.spatialreference.org/ref/epsg/3031/
+-elseif strcmpi(md.mesh.hemisphere,'UTM18N'),
+-	EPSGlocal = 'EPSG:32218'; % UTM 18 N Patagonia
+-else
+-	error('field hemisphere should either be ''n'' or ''s''');
+-end
++EPSGlocal  = ['EPSG:' md.mesh.epsg]
+ 
+ %Find optimal zoom
+ if exist(options,'zoom'),
+@@ -131,12 +127,12 @@
+ 	disp('googlemaps info: gdal not found or not working properly, the Google image will not be transformed');
+ 	[gX gY]=meshgrid(ulx:ulx+size(final,2)-1,uly:-1:uly-size(final,1)+1);
+ 	[LAT LON]=pixelstolatlon(gX,gY, zoom);
+-	if strcmpi(md.mesh.hemisphere,'n'),
++	if md.mesh.epsg==3413,
+ 		[X Y]=ll2xy(LAT,LON,+1,45,70);
+-	elseif strcmpi(md.mesh.hemisphere,'s'),
++	elseif md.mesh.epsg==3031,
+ 		[X Y]=ll2xy(LAT,LON,-1,0,71);
+ 	else
+-		error('field hemisphere should either be ''n'' or ''s''');
++		error('EPSG code not supported yet');
+ 	end
+ 	md.radaroverlay.pwr=final;
+ 	md.radaroverlay.x=X;
+@@ -154,12 +150,12 @@
+ 	disp(result);
+ 	[gX gY]=meshgrid(ulx:ulx+size(final,2)-1,uly:-1:uly-size(final,1)+1);
+ 	[LAT LON]=pixelstolatlon(gX,gY, zoom);
+-	if strcmpi(md.mesh.hemisphere,'n'),
++	if md.mesh.epsg==3413,
+ 		[X Y]=ll2xy(LAT,LON,+1,45,70);
+-	elseif strcmpi(md.mesh.hemisphere,'s'),
++	elseif md.mesh.epsg==3031,
+ 		[X Y]=ll2xy(LAT,LON,-1,0,71);
+ 	else
+-		error('field hemisphere should either be ''n'' or ''s''');
++		error('EPSG code not supported yet');
+ 	end
+ 	md.radaroverlay.pwr=final;
+ 	md.radaroverlay.x=X;
+Index: ../trunk-jpl/src/m/plot/applyoptions.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/applyoptions.py	(revision 18557)
++++ ../trunk-jpl/src/m/plot/applyoptions.py	(revision 18558)
+@@ -24,10 +24,6 @@
+ 		See also: PLOTMODEL, PARSE_OPTIONS
+ 	'''
+ 
+-	#some defaults (this seems to be adding a field that already exists...)
+-	#if not isnan(md.mesh.hemisphere):
+-	#	options.addfielddefault('hemisphere',md.mesh.hemisphere)
+-
+ 	# get handle to current figure and axes instance
+ 	#fig = p.gcf()
+ 	#ax=p.gca()
+Index: ../trunk-jpl/src/m/plot/applyoptions.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/applyoptions.m	(revision 18557)
++++ ../trunk-jpl/src/m/plot/applyoptions.m	(revision 18558)
+@@ -6,13 +6,6 @@
+ %
+ %   See also: PLOTMODEL, PARSE_OPTIONS
+ 
+-%some defaults
+-if isfield(md.mesh,'hemisphere'),
+-	if strcmpi(md.mesh.hemisphere,'n'), options=addfielddefault(options,'hemisphere','n'); 
+-	elseif strcmpi(md.mesh.hemisphere,'s'), options=addfielddefault(options,'hemisphere','s'); 
+-	end
+-end
+-
+ %fontsize
+ fontsize=getfieldvalue(options,'fontsize',14);
+ 
+@@ -364,15 +357,15 @@
+ 	axes('pos',PosInset);
+ 	axis equal off
+ 	%box off
+-	if strcmpi(md.mesh.hemisphere,'n') | strcmpi(md.mesh.hemisphere,'north'),
++	if md.mesh.epsg==3413,
+ 		A=expread('/u/astrid-r1b/ModelData/Exp/GreenlandBoxFront.exp');
+ 		[A.x A.y]=ll2xy(A.x,A.y,+1,45,70);
+ 		A.x = A.x(1:30:end);
+ 		A.y = A.y(1:30:end);
+-	elseif strcmpi(md.mesh.hemisphere,'s') | strcmpi(md.mesh.hemisphere,'south'),
++	elseif md.mesh.epsg==3031,
+ 		A=expread('/u/astrid-r1b/ModelData/Exp/Antarctica.exp');
+ 	else
+-		error('applyoptions error message: hemisphere not defined');
++		error('applyoptions error message: md.mesh.epsg not defined');
+ 	end
+ 	offset=3*10^4;
+ 	Ax=[min(A.x)-offset max(A.x)+offset];
+Index: ../trunk-jpl/src/m/plot/plotdoc.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/plotdoc.m	(revision 18557)
++++ ../trunk-jpl/src/m/plot/plotdoc.m	(revision 18558)
+@@ -56,7 +56,6 @@
+ disp('       ''alloptions'': apply the options to all subplots if ''on''');
+ disp('       ''axis'': same as standard matlab option (''equal'',''off'',''equal on'',...)');
+ disp('       ''basin'': zoom on a given basin (''pineislandglacier'',''ronneiceshelf'', use isbasin to identify a basin');
+-disp('                 ''hemisphere'': specify +1 or -1');
+ disp('                 ''basindeltax'': in m');
+ disp('                 ''showbasins'': write lables for every existing basin name around the center of the plot');
+ disp('       ''caxis'': modify  colorbar range. (array of type [a b] where b>=a)');
+@@ -108,7 +107,6 @@
+ disp('       ''overlay_image'': path to overlay image. provide overlay_xlim, overlay_ylim, overlay_xposting and overlay_yposting options also');
+ disp('       ''contrast'': (default 1) coefficient to add contrast to the radar amplitude image used in overlays');
+ disp('       ''highres'': resolution of overlayed radar amplitude image (default is 0, high resolution is 1).');
+-disp('       ''hem'': specify hemisphere ''n'' or ''s'' (default is ''s'').');
+ disp('       ''alpha'': transparency coefficient (the higher, the more transparent). Default is 1.5');
+ disp('       ''scaling'': scaling factor used by quiver plots. Default is 0.4');
+ disp('       ''autoscale'': set to ''off'' to have all the quivers with the same size. Default is ''on''');
+Index: ../trunk-jpl/src/m/classes/mesh3dprisms.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/mesh3dprisms.py	(revision 18557)
++++ ../trunk-jpl/src/m/classes/mesh3dprisms.py	(revision 18558)
+@@ -24,9 +24,9 @@
+ 		
+ 		self.lat                         = float('NaN');
+ 		self.long                        = float('NaN');
+-		self.hemisphere                  = float('NaN');
++		self.epsg                        = 0;
+ 
+-		self.vertexonbase                 = float('NaN');
++		self.vertexonbase                = float('NaN');
+ 		self.vertexonsurface             = float('NaN');
+ 		self.lowerelements               = float('NaN');
+ 		self.lowervertex                 = float('NaN');
+@@ -89,7 +89,7 @@
+ 		string="%s%s"%(string,"\n\n      Projection:")
+ 		string="%s\n%s"%(string,fielddisplay(self,"lat","vertices latitude [degrees]"))
+ 		string="%s\n%s"%(string,fielddisplay(self,"long","vertices longitude [degrees]"))
+-		string="%s\n%s"%(string,fielddisplay(self,"hemisphere","Indicate hemisphere 'n' or 's'"))
++		string="%s\n%s"%(string,fielddisplay(self,"epsg","EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)"))
+ 		return string
+ 		#}}}
+ 	def setdefaultparameters(self): # {{{
+@@ -115,7 +115,6 @@
+ 		md = checkfield(md,'fieldname','mesh.numberoflayers','>=',0)
+ 		md = checkfield(md,'fieldname','mesh.numberofelements','>',0)
+ 		md = checkfield(md,'fieldname','mesh.numberofvertices','>',0)
+-		#no checks for numberofedges lat long and hemisphere
+ 		md = checkfield(md,'fieldname','mesh.vertexonbase','size',[md.mesh.numberofvertices],'values',[0,1])
+ 		md = checkfield(md,'fieldname','mesh.vertexonsurface','size',[md.mesh.numberofvertices],'values',[0,1])
+ 		md = checkfield(md,'fieldname','mesh.average_vertex_connectivity','>=',24,'message',"'mesh.average_vertex_connectivity' should be at least 24 in 3d")
+Index: ../trunk-jpl/src/m/classes/mesh3dprisms.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mesh3dprisms.m	(revision 18557)
++++ ../trunk-jpl/src/m/classes/mesh3dprisms.m	(revision 18558)
+@@ -7,91 +7,113 @@
+ 	properties (SetAccess=public) 
+ 		x                           = NaN;
+ 		y                           = NaN;
+-		z                           = NaN
+-		elements                    = NaN
++		z                           = NaN;
++		elements                    = NaN;
+ 		numberoflayers              = 0;
+ 		numberofelements            = 0;
+ 		numberofvertices            = 0;
+ 
+-		lat                         = NaN
+-		long                        = NaN
+-		hemisphere                  = NaN
++		lat                         = NaN;
++		long                        = NaN;
++		epsg                        = 0;
+ 
+-		vertexonbase                 = NaN
+-		vertexonsurface             = NaN
+-		lowerelements               = NaN
+-		lowervertex                 = NaN
+-		upperelements               = NaN
+-		uppervertex                 = NaN
+-		vertexonboundary            = NaN
++		vertexonbase                = NaN;
++		vertexonsurface             = NaN;
++		lowerelements               = NaN;
++		lowervertex                 = NaN;
++		upperelements               = NaN;
++		uppervertex                 = NaN;
++		vertexonboundary            = NaN;
+ 
+-		vertexconnectivity          = NaN
+-		elementconnectivity         = NaN
++		vertexconnectivity          = NaN;
++		elementconnectivity         = NaN;
+ 		average_vertex_connectivity = 0;
+ 
+-		x2d                         = NaN
+-		y2d                         = NaN
+-		elements2d                  = NaN
++		x2d                         = NaN;
++		y2d                         = NaN;
++		elements2d                  = NaN;
+ 		numberofvertices2d          = 0;
+ 		numberofelements2d          = 0;
+ 
+-		extractedvertices           = NaN
+-		extractedelements           = NaN
++		extractedvertices           = NaN;
++		extractedelements           = NaN;
+ 	end
++	methods (Static)
++		function self = loadself(self) % {{{
++			% This function is directly called by matlab when a model selfect is
++			% loaded. Update old properties here
++
++			%2014 Oct. 1st
++			if isstruct(self),
++				oldself=self;
++				%Assign property values from struct
++				self=structtoself(mesh3dprisms(),oldself)
++				if isfield(oldself,'hemisphere'),
++					disp('md.mesh.hemisphere has been automatically converted to EPSG code');
++					if strcmpi(oldself.hemisphere,'n'),
++						self.epsg=3413;
++					else
++						self.epsg=3031;
++					end
++				end
++			end
++
++		end% }}}
++	end
+ 	methods
+-           function createxml(obj,fid) % {{{
+-            fprintf(fid, '<!-- 3D prism Mesh -->\n');
+-            
+-            % Elements and verticies of the original 2d mesh
+-            fprintf(fid,'%s\n%s\n%s\n','       <frame key="1" label="Elements and vertices of the orginal 2d mesh">','       <section name="mesh3dprisms" />');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements2d" type="',class(obj.numberofelements2d),'" default="',convert2str(obj.numberofelements2d),'">','              <help> number of elements </help>','          </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices2d" type="',class(obj.numberofvertices2d),'" default="',convert2str(obj.numberofvertices2d),'">','              <help> number of vertices </help>','          </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements2d" type="',class(obj.elements2d),'" default="',convert2str(obj.elements2d),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x2d" type="',class(obj.x2d),'" default="',convert2str(obj.x2d),'">','     <section name="mesh3dprisms" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y2d" type="',class(obj.y2d),'" default="',convert2str(obj.y2d),'">','     <section name="mesh3dprisms" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
+-            fprintf(fid,'%s\n%s\n','       </frame>');
+-            
+-            % Elements and vertices of the extruded 3d mesh
+-            fprintf(fid,'%s\n%s\n%s\n','       <frame key="2" label="Elements and vertices of the orginal 3d mesh">','       <section name="mesh3dprisms" />');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements" type="',class(obj.numberofelements),'" default="',convert2str(obj.numberofelements),'">','              <help> number of elements </help>','          </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices" type="',class(obj.numberofvertices),'" default="',convert2str(obj.numberofvertices),'">','              <help> number of vertices </help>','          </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements" type="',class(obj.elements),'" default="',convert2str(obj.elements),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x" type="',class(obj.x),'" default="',convert2str(obj.x),'">','     <section name="mesh3dprisms" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y" type="',class(obj.y),'" default="',convert2str(obj.y),'">','     <section name="mesh3dprisms" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="z" type="',class(obj.y),'" default="',convert2str(obj.y),'">','     <section name="mesh3dprisms" />','     <help> vertices z coordinate [m] </help>','  </parameter>');
+-            fprintf(fid,'%s\n%s\n','       </frame>');
+-     
+-            % properties
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="3" label="Properties">','<section name="mesh3dprisms" />');             
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberoflayers" type="',class(obj.numberoflayers),'" default="',convert2str(obj.numberoflayers),'">','     <section name="mesh3dprisms" />','     <help> number of extrusion layers </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonbase" type="',class(obj.vertexonbase),'" default="',convert2str(obj.vertexonbase),'">','     <section name="mesh3dprisms" />','     <help> lower vertices flags list </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementontbase" type="',class(obj.elementontbase),'" default="',convert2str(obj.elementontbase),'">','     <section name="mesh3dprisms" />','     <help> lower elements flags list </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonsurface" type="',class(obj.vertexonsurface),'" default="',convert2str(obj.vertexonsurface),'">','     <section name="mesh3dprisms" />','     <help> upper vertices flags list </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementontsurface" type="',class(obj.elementontsurface),'" default="',convert2str(obj.elementontsurface),'">','     <section name="mesh3dprisms" />','     <help> upper elements flags list </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="uppervertex" type="',class(obj.uppervertex),'" default="',convert2str(obj.uppervertex),'">','     <section name="mesh3dprisms" />','     <help> upper vertex list (NaN for vertex on the upper surface) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="upperelements" type="',class(obj.upperelements),'" default="',convert2str(obj.upperelements),'">','     <section name="mesh3dprisms" />','     <help> upper element list (NaN for element on the upper layer) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lowervertex" type="',class(obj.lowervertex),'" default="',convert2str(obj.lowervertex),'">','     <section name="mesh3dprisms" />','     <help> lower vertex list (NaN for vertex on the lower surface) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lowerelements" type="',class(obj.lowerelements),'" default="',convert2str(obj.lowerelements),'">','     <section name="mesh3dprisms" />','     <help> element list (NaN for element on the lower layer) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonboundary" type="',class(obj.vertexonboundary),'" default="',convert2str(obj.vertexonboundary),'">','     <section name="mesh3dprisms" />','     <help> vertices on the boundary of the domain flag list </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexconnectivity" type="',class(obj.vertexconnectivity),'" default="',convert2str(obj.vertexconnectivity),'">','     <section name="mesh3dprisms" />','     <help> list of vertices connected to vertex_i </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementconnectivity" type="',class(obj.elementconnectivity),'" default="',convert2str(obj.elementconnectivity),'">','     <section name="mesh3dprisms" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="average_vertex_connectivity" type="',class(obj.average_vertex_connectivity),'" default="',convert2str(obj.average_vertex_connectivity),'">','     <section name="mesh3dprisms" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-            
+-            % Extracted model
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="4" label="Extracted Model">','<section name="mesh3dprisms" />'); 
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedvertices" type="',class(obj.extractedvertices),'" default="',convert2str(obj.extractedvertices),'">','     <section name="mesh3dprisms" />','     <help> vertices extracted from the model </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedelements" type="',class(obj.extractedelements),'" default="',convert2str(obj.extractedelements),'">','     <section name="mesh3dprisms" />','     <help> elements extracted from the model </help>','  </parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-            
+-            % Projection
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="5" label="Projection">','<section name="mesh3dprisms" />'); 
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lat" type="',class(obj.lat),'" default="',convert2str(obj.lat),'">','     <section name="mesh3dprisms" />','     <help> vertices latitude [degrees] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="long" type="',class(obj.long),'" default="',convert2str(obj.long),'">','     <section name="mesh3dprisms" />','     <help> verticies longitude [degrees] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="hemisphere" type="',class(obj.hemisphere),'" default="',convert2str(obj.hemisphere),'">','     <section name="mesh3dprisms" />','     <help> Indicate hemisphere ''n'' or ''s'' </help>','  </parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-        
+-        end % }}}cd
++		function createxml(obj,fid) % {{{
++			fprintf(fid, '<!-- 3D prism Mesh -->\n');
++
++			% Elements and verticies of the original 2d mesh
++			fprintf(fid,'%s\n%s\n%s\n','       <frame key="1" label="Elements and vertices of the orginal 2d mesh">','       <section name="mesh3dprisms" />');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements2d" type="',class(obj.numberofelements2d),'" default="',convert2str(obj.numberofelements2d),'">','              <help> number of elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices2d" type="',class(obj.numberofvertices2d),'" default="',convert2str(obj.numberofvertices2d),'">','              <help> number of vertices </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements2d" type="',class(obj.elements2d),'" default="',convert2str(obj.elements2d),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x2d" type="',class(obj.x2d),'" default="',convert2str(obj.x2d),'">','     <section name="mesh3dprisms" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y2d" type="',class(obj.y2d),'" default="',convert2str(obj.y2d),'">','     <section name="mesh3dprisms" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','       </frame>');
++
++			% Elements and vertices of the extruded 3d mesh
++			fprintf(fid,'%s\n%s\n%s\n','       <frame key="2" label="Elements and vertices of the orginal 3d mesh">','       <section name="mesh3dprisms" />');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements" type="',class(obj.numberofelements),'" default="',convert2str(obj.numberofelements),'">','              <help> number of elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices" type="',class(obj.numberofvertices),'" default="',convert2str(obj.numberofvertices),'">','              <help> number of vertices </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements" type="',class(obj.elements),'" default="',convert2str(obj.elements),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x" type="',class(obj.x),'" default="',convert2str(obj.x),'">','     <section name="mesh3dprisms" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y" type="',class(obj.y),'" default="',convert2str(obj.y),'">','     <section name="mesh3dprisms" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="z" type="',class(obj.y),'" default="',convert2str(obj.y),'">','     <section name="mesh3dprisms" />','     <help> vertices z coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','       </frame>');
++
++			% properties
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="3" label="Properties">','<section name="mesh3dprisms" />');             
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberoflayers" type="',class(obj.numberoflayers),'" default="',convert2str(obj.numberoflayers),'">','     <section name="mesh3dprisms" />','     <help> number of extrusion layers </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonbase" type="',class(obj.vertexonbase),'" default="',convert2str(obj.vertexonbase),'">','     <section name="mesh3dprisms" />','     <help> lower vertices flags list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementontbase" type="',class(obj.elementontbase),'" default="',convert2str(obj.elementontbase),'">','     <section name="mesh3dprisms" />','     <help> lower elements flags list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonsurface" type="',class(obj.vertexonsurface),'" default="',convert2str(obj.vertexonsurface),'">','     <section name="mesh3dprisms" />','     <help> upper vertices flags list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementontsurface" type="',class(obj.elementontsurface),'" default="',convert2str(obj.elementontsurface),'">','     <section name="mesh3dprisms" />','     <help> upper elements flags list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="uppervertex" type="',class(obj.uppervertex),'" default="',convert2str(obj.uppervertex),'">','     <section name="mesh3dprisms" />','     <help> upper vertex list (NaN for vertex on the upper surface) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="upperelements" type="',class(obj.upperelements),'" default="',convert2str(obj.upperelements),'">','     <section name="mesh3dprisms" />','     <help> upper element list (NaN for element on the upper layer) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lowervertex" type="',class(obj.lowervertex),'" default="',convert2str(obj.lowervertex),'">','     <section name="mesh3dprisms" />','     <help> lower vertex list (NaN for vertex on the lower surface) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lowerelements" type="',class(obj.lowerelements),'" default="',convert2str(obj.lowerelements),'">','     <section name="mesh3dprisms" />','     <help> element list (NaN for element on the lower layer) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonboundary" type="',class(obj.vertexonboundary),'" default="',convert2str(obj.vertexonboundary),'">','     <section name="mesh3dprisms" />','     <help> vertices on the boundary of the domain flag list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexconnectivity" type="',class(obj.vertexconnectivity),'" default="',convert2str(obj.vertexconnectivity),'">','     <section name="mesh3dprisms" />','     <help> list of vertices connected to vertex_i </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementconnectivity" type="',class(obj.elementconnectivity),'" default="',convert2str(obj.elementconnectivity),'">','     <section name="mesh3dprisms" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="average_vertex_connectivity" type="',class(obj.average_vertex_connectivity),'" default="',convert2str(obj.average_vertex_connectivity),'">','     <section name="mesh3dprisms" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++
++			% Extracted model
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="4" label="Extracted Model">','<section name="mesh3dprisms" />'); 
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedvertices" type="',class(obj.extractedvertices),'" default="',convert2str(obj.extractedvertices),'">','     <section name="mesh3dprisms" />','     <help> vertices extracted from the model </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedelements" type="',class(obj.extractedelements),'" default="',convert2str(obj.extractedelements),'">','     <section name="mesh3dprisms" />','     <help> elements extracted from the model </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++
++			% Projection
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="5" label="Projection">','<section name="mesh3dprisms" />'); 
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lat" type="',class(obj.lat),'" default="',convert2str(obj.lat),'">','     <section name="mesh3dprisms" />','     <help> vertices latitude [degrees] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="long" type="',class(obj.long),'" default="',convert2str(obj.long),'">','     <section name="mesh3dprisms" />','     <help> verticies longitude [degrees] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="epsg" type="',class(obj.epsg),'" default="',convert2str(obj.epsg),'">','     <section name="mesh3dprisms" />','     <help> Indicate epsg ''n'' or ''s'' </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++
++		end % }}}cd
+ 		function self = mesh3dprisms(varargin) % {{{
+ 			switch nargin
+ 				case 0
+@@ -132,7 +154,6 @@
+ 			md = checkfield(md,'fieldname','mesh.numberoflayers','>=',0);
+ 			md = checkfield(md,'fieldname','mesh.numberofelements','>',0);
+ 			md = checkfield(md,'fieldname','mesh.numberofvertices','>',0);
+-			%no checks for numberofedges lat long and hemisphere
+ 			md = checkfield(md,'fieldname','mesh.vertexonbase','size',[md.mesh.numberofvertices 1],'values',[0 1]);
+ 			md = checkfield(md,'fieldname','mesh.vertexonsurface','size',[md.mesh.numberofvertices 1],'values',[0 1]);
+ 			md = checkfield(md,'fieldname','mesh.z','>=',md.geometry.base-10^-10,'message','''mesh.z'' lower than bedrock');
+@@ -178,7 +199,7 @@
+ 			disp(sprintf('\n      Projection:'));
+ 			fielddisplay(obj,'lat','vertices latitude [degrees]');
+ 			fielddisplay(obj,'long','vertices longitude [degrees]');
+-			fielddisplay(obj,'hemisphere','Indicate hemisphere ''n'' or ''s'' ');
++			fielddisplay(obj,'epsg','EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)');
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+ 			WriteData(fid,'enum',DomainTypeEnum(),'data',StringToEnum(['Domain' domaintype(obj)]),'format','Integer');
+Index: ../trunk-jpl/src/m/classes/mesh3dtetras.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mesh3dtetras.m	(revision 18557)
++++ ../trunk-jpl/src/m/classes/mesh3dtetras.m	(revision 18558)
+@@ -7,91 +7,113 @@
+ 	properties (SetAccess=public) 
+ 		x                           = NaN;
+ 		y                           = NaN;
+-		z                           = NaN
+-		elements                    = NaN
++		z                           = NaN;
++		elements                    = NaN;
+ 		numberoflayers              = 0;
+ 		numberofelements            = 0;
+ 		numberofvertices            = 0;
+ 
+-		lat                         = NaN
+-		long                        = NaN
+-		hemisphere                  = NaN
++		lat                         = NaN;
++		long                        = NaN;
++		epsg                        = 0;
+ 
+-		vertexonbase                 = NaN
+-		vertexonsurface             = NaN
+-		lowerelements               = NaN
+-		lowervertex                 = NaN
+-		upperelements               = NaN
+-		uppervertex                 = NaN
+-		vertexonboundary            = NaN
++		vertexonbase                = NaN;
++		vertexonsurface             = NaN;
++		lowerelements               = NaN;
++		lowervertex                 = NaN;
++		upperelements               = NaN;
++		uppervertex                 = NaN;
++		vertexonboundary            = NaN;
+ 
+-		vertexconnectivity          = NaN
+-		elementconnectivity         = NaN
++		vertexconnectivity          = NaN;
++		elementconnectivity         = NaN;
+ 		average_vertex_connectivity = 0;
+ 
+-		x2d                         = NaN
+-		y2d                         = NaN
+-		elements2d                  = NaN
++		x2d                         = NaN;
++		y2d                         = NaN;
++		elements2d                  = NaN;
+ 		numberofvertices2d          = 0;
+ 		numberofelements2d          = 0;
+ 
+-		extractedvertices           = NaN
+-		extractedelements           = NaN
++		extractedvertices           = NaN;
++		extractedelements           = NaN;
+ 	end
++	methods (Static)
++		function self = loadself(self) % {{{
++			% This function is directly called by matlab when a model selfect is
++			% loaded. Update old properties here
++
++			%2014 Oct. 1st
++			if isstruct(self),
++				oldself=self;
++				%Assign property values from struct
++				self=structtoself(mesh3dtetras(),oldself)
++				if isfield(oldself,'hemisphere'),
++					disp('md.mesh.hemisphere has been automatically converted to EPSG code');
++					if strcmpi(oldself.hemisphere,'n'),
++						self.epsg=3413;
++					else
++						self.epsg=3031;
++					end
++				end
++			end
++
++		end% }}}
++	end
+ 	methods
+-        function createxml(obj,fid) % {{{
+-            fprintf(fid, '<!-- 3D Tetra Mesh -->\n');
+-            
+-            % Elements and verticies of the original 2d mesh
+-            fprintf(fid,'%s\n%s\n%s\n','       <frame key="1" label="Elements and vertices of the orginal 2d mesh">','       <section name="mesh3dprisms" />');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements2d" type="',class(obj.numberofelements2d),'" default="',convert2str(obj.numberofelements2d),'">','              <help> number of elements </help>','          </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices2d" type="',class(obj.numberofvertices2d),'" default="',convert2str(obj.numberofvertices2d),'">','              <help> number of vertices </help>','          </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements2d" type="',class(obj.elements2d),'" default="',convert2str(obj.elements2d),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x2d" type="',class(obj.x2d),'" default="',convert2str(obj.x2d),'">','     <section name="mesh3dprisms" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y2d" type="',class(obj.y2d),'" default="',convert2str(obj.y2d),'">','     <section name="mesh3dprisms" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
+-            fprintf(fid,'%s\n%s\n','       </frame>');
+-            
+-            % Elements and vertices of the extruded 3d mesh
+-            fprintf(fid,'%s\n%s\n%s\n','       <frame key="2" label="Elements and vertices of the orginal 3d mesh">','       <section name="mesh3dprisms" />');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements" type="',class(obj.numberofelements),'" default="',convert2str(obj.numberofelements),'">','              <help> number of elements </help>','          </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices" type="',class(obj.numberofvertices),'" default="',convert2str(obj.numberofvertices),'">','              <help> number of vertices </help>','          </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements" type="',class(obj.elements),'" default="',convert2str(obj.elements),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x" type="',class(obj.x),'" default="',convert2str(obj.x),'">','     <section name="mesh3dprisms" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y" type="',class(obj.y),'" default="',convert2str(obj.y),'">','     <section name="mesh3dprisms" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="z" type="',class(obj.y),'" default="',convert2str(obj.y),'">','     <section name="mesh3dprisms" />','     <help> vertices z coordinate [m] </help>','  </parameter>');
+-            fprintf(fid,'%s\n%s\n','       </frame>');
+-     
+-            % properties
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="3" label="Properties">','<section name="mesh3dprisms" />');             
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberoflayers" type="',class(obj.numberoflayers),'" default="',convert2str(obj.numberoflayers),'">','     <section name="mesh3dprisms" />','     <help> number of extrusion layers </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonbase" type="',class(obj.vertexonbase),'" default="',convert2str(obj.vertexonbase),'">','     <section name="mesh3dprisms" />','     <help> lower vertices flags list </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementontbase" type="',class(obj.elementontbase),'" default="',convert2str(obj.elementontbase),'">','     <section name="mesh3dprisms" />','     <help> lower elements flags list </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonsurface" type="',class(obj.vertexonsurface),'" default="',convert2str(obj.vertexonsurface),'">','     <section name="mesh3dprisms" />','     <help> upper vertices flags list </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementontsurface" type="',class(obj.elementontsurface),'" default="',convert2str(obj.elementontsurface),'">','     <section name="mesh3dprisms" />','     <help> upper elements flags list </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="uppervertex" type="',class(obj.uppervertex),'" default="',convert2str(obj.uppervertex),'">','     <section name="mesh3dprisms" />','     <help> upper vertex list (NaN for vertex on the upper surface) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="upperelements" type="',class(obj.upperelements),'" default="',convert2str(obj.upperelements),'">','     <section name="mesh3dprisms" />','     <help> upper element list (NaN for element on the upper layer) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lowervertex" type="',class(obj.lowervertex),'" default="',convert2str(obj.lowervertex),'">','     <section name="mesh3dprisms" />','     <help> lower vertex list (NaN for vertex on the lower surface) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lowerelements" type="',class(obj.lowerelements),'" default="',convert2str(obj.lowerelements),'">','     <section name="mesh3dprisms" />','     <help> element list (NaN for element on the lower layer) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonboundary" type="',class(obj.vertexonboundary),'" default="',convert2str(obj.vertexonboundary),'">','     <section name="mesh3dprisms" />','     <help> vertices on the boundary of the domain flag list </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexconnectivity" type="',class(obj.vertexconnectivity),'" default="',convert2str(obj.vertexconnectivity),'">','     <section name="mesh3dprisms" />','     <help> list of vertices connected to vertex_i </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementconnectivity" type="',class(obj.elementconnectivity),'" default="',convert2str(obj.elementconnectivity),'">','     <section name="mesh3dprisms" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="average_vertex_connectivity" type="',class(obj.average_vertex_connectivity),'" default="',convert2str(obj.average_vertex_connectivity),'">','     <section name="mesh3dprisms" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-            
+-            % Extracted model
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="4" label="Extracted Model">','<section name="mesh3dprisms" />'); 
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedvertices" type="',class(obj.extractedvertices),'" default="',convert2str(obj.extractedvertices),'">','     <section name="mesh3dprisms" />','     <help> vertices extracted from the model </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedelements" type="',class(obj.extractedelements),'" default="',convert2str(obj.extractedelements),'">','     <section name="mesh3dprisms" />','     <help> elements extracted from the model </help>','  </parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-            
+-            % Projection
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="5" label="Projection">','<section name="mesh3dprisms" />'); 
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lat" type="',class(obj.lat),'" default="',convert2str(obj.lat),'">','     <section name="mesh3dprisms" />','     <help> vertices latitude [degrees] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="long" type="',class(obj.long),'" default="',convert2str(obj.long),'">','     <section name="mesh3dprisms" />','     <help> verticies longitude [degrees] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="hemisphere" type="',class(obj.hemisphere),'" default="',convert2str(obj.hemisphere),'">','     <section name="mesh3dprisms" />','     <help> Indicate hemisphere ''n'' or ''s'' </help>','  </parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-        
+-        end % }}}cd
++		function createxml(obj,fid) % {{{
++			fprintf(fid, '<!-- 3D Tetra Mesh -->\n');
++
++			% Elements and verticies of the original 2d mesh
++			fprintf(fid,'%s\n%s\n%s\n','       <frame key="1" label="Elements and vertices of the orginal 2d mesh">','       <section name="mesh3dprisms" />');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements2d" type="',class(obj.numberofelements2d),'" default="',convert2str(obj.numberofelements2d),'">','              <help> number of elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices2d" type="',class(obj.numberofvertices2d),'" default="',convert2str(obj.numberofvertices2d),'">','              <help> number of vertices </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements2d" type="',class(obj.elements2d),'" default="',convert2str(obj.elements2d),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x2d" type="',class(obj.x2d),'" default="',convert2str(obj.x2d),'">','     <section name="mesh3dprisms" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y2d" type="',class(obj.y2d),'" default="',convert2str(obj.y2d),'">','     <section name="mesh3dprisms" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','       </frame>');
++
++			% Elements and vertices of the extruded 3d mesh
++			fprintf(fid,'%s\n%s\n%s\n','       <frame key="2" label="Elements and vertices of the orginal 3d mesh">','       <section name="mesh3dprisms" />');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements" type="',class(obj.numberofelements),'" default="',convert2str(obj.numberofelements),'">','              <help> number of elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices" type="',class(obj.numberofvertices),'" default="',convert2str(obj.numberofvertices),'">','              <help> number of vertices </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements" type="',class(obj.elements),'" default="',convert2str(obj.elements),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x" type="',class(obj.x),'" default="',convert2str(obj.x),'">','     <section name="mesh3dprisms" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y" type="',class(obj.y),'" default="',convert2str(obj.y),'">','     <section name="mesh3dprisms" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="z" type="',class(obj.y),'" default="',convert2str(obj.y),'">','     <section name="mesh3dprisms" />','     <help> vertices z coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','       </frame>');
++
++			% properties
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="3" label="Properties">','<section name="mesh3dprisms" />');             
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberoflayers" type="',class(obj.numberoflayers),'" default="',convert2str(obj.numberoflayers),'">','     <section name="mesh3dprisms" />','     <help> number of extrusion layers </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonbase" type="',class(obj.vertexonbase),'" default="',convert2str(obj.vertexonbase),'">','     <section name="mesh3dprisms" />','     <help> lower vertices flags list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementontbase" type="',class(obj.elementontbase),'" default="',convert2str(obj.elementontbase),'">','     <section name="mesh3dprisms" />','     <help> lower elements flags list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonsurface" type="',class(obj.vertexonsurface),'" default="',convert2str(obj.vertexonsurface),'">','     <section name="mesh3dprisms" />','     <help> upper vertices flags list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementontsurface" type="',class(obj.elementontsurface),'" default="',convert2str(obj.elementontsurface),'">','     <section name="mesh3dprisms" />','     <help> upper elements flags list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="uppervertex" type="',class(obj.uppervertex),'" default="',convert2str(obj.uppervertex),'">','     <section name="mesh3dprisms" />','     <help> upper vertex list (NaN for vertex on the upper surface) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="upperelements" type="',class(obj.upperelements),'" default="',convert2str(obj.upperelements),'">','     <section name="mesh3dprisms" />','     <help> upper element list (NaN for element on the upper layer) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lowervertex" type="',class(obj.lowervertex),'" default="',convert2str(obj.lowervertex),'">','     <section name="mesh3dprisms" />','     <help> lower vertex list (NaN for vertex on the lower surface) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lowerelements" type="',class(obj.lowerelements),'" default="',convert2str(obj.lowerelements),'">','     <section name="mesh3dprisms" />','     <help> element list (NaN for element on the lower layer) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonboundary" type="',class(obj.vertexonboundary),'" default="',convert2str(obj.vertexonboundary),'">','     <section name="mesh3dprisms" />','     <help> vertices on the boundary of the domain flag list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexconnectivity" type="',class(obj.vertexconnectivity),'" default="',convert2str(obj.vertexconnectivity),'">','     <section name="mesh3dprisms" />','     <help> list of vertices connected to vertex_i </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementconnectivity" type="',class(obj.elementconnectivity),'" default="',convert2str(obj.elementconnectivity),'">','     <section name="mesh3dprisms" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="average_vertex_connectivity" type="',class(obj.average_vertex_connectivity),'" default="',convert2str(obj.average_vertex_connectivity),'">','     <section name="mesh3dprisms" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++
++			% Extracted model
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="4" label="Extracted Model">','<section name="mesh3dprisms" />'); 
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedvertices" type="',class(obj.extractedvertices),'" default="',convert2str(obj.extractedvertices),'">','     <section name="mesh3dprisms" />','     <help> vertices extracted from the model </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedelements" type="',class(obj.extractedelements),'" default="',convert2str(obj.extractedelements),'">','     <section name="mesh3dprisms" />','     <help> elements extracted from the model </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++
++			% Projection
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="5" label="Projection">','<section name="mesh3dprisms" />'); 
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lat" type="',class(obj.lat),'" default="',convert2str(obj.lat),'">','     <section name="mesh3dprisms" />','     <help> vertices latitude [degrees] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="long" type="',class(obj.long),'" default="',convert2str(obj.long),'">','     <section name="mesh3dprisms" />','     <help> verticies longitude [degrees] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="epsg" type="',class(obj.epsg),'" default="',convert2str(obj.epsg),'">','     <section name="mesh3dprisms" />','     <help> Indicate epsg ''n'' or ''s'' </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++
++		end % }}}cd
+ 		function self = mesh3dtetras(varargin) % {{{
+ 			switch nargin
+ 				case 0
+@@ -132,7 +154,6 @@
+ 			md = checkfield(md,'fieldname','mesh.numberoflayers','>=',0);
+ 			md = checkfield(md,'fieldname','mesh.numberofelements','>',0);
+ 			md = checkfield(md,'fieldname','mesh.numberofvertices','>',0);
+-			%no checks for numberofedges lat long and hemisphere
+ 			md = checkfield(md,'fieldname','mesh.vertexonbase','size',[md.mesh.numberofvertices 1],'values',[0 1]);
+ 			md = checkfield(md,'fieldname','mesh.vertexonsurface','size',[md.mesh.numberofvertices 1],'values',[0 1]);
+ 			md = checkfield(md,'fieldname','mesh.z','>=',md.geometry.base-10^-10,'message','''mesh.z'' lower than bedrock');
+@@ -178,7 +199,7 @@
+ 			disp(sprintf('\n      Projection:'));
+ 			fielddisplay(obj,'lat','vertices latitude [degrees]');
+ 			fielddisplay(obj,'long','vertices longitude [degrees]');
+-			fielddisplay(obj,'hemisphere','Indicate hemisphere ''n'' or ''s'' ');
++			fielddisplay(obj,'epsg','EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)');
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+ 			WriteData(fid,'enum',DomainTypeEnum(),'data',StringToEnum(['Domain' domaintype(obj)]),'format','Integer');
+Index: ../trunk-jpl/src/m/classes/mesh2dvertical.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mesh2dvertical.m	(revision 18557)
++++ ../trunk-jpl/src/m/classes/mesh2dvertical.m	(revision 18558)
+@@ -7,60 +7,82 @@
+ 	properties (SetAccess=public) 
+ 		x                           = NaN;
+ 		y                           = NaN;
+-		elements                    = NaN
++		elements                    = NaN;
+ 		numberofelements            = 0;
+ 		numberofvertices            = 0;
+ 		numberofedges               = 0;
+ 
+-		lat                         = NaN
+-		long                        = NaN
+-		hemisphere                  = NaN
++		lat                         = NaN;
++		long                        = NaN;
++		epsg                        = NaN;
+ 
+-		vertexonboundary            = NaN
+-		vertexonbase                 = NaN
+-		vertexonsurface             = NaN
++		vertexonboundary            = NaN;
++		vertexonbase                = NaN;
++		vertexonsurface             = NaN;
+ 
+-		edges                       = NaN
+-		segments                    = NaN
+-		segmentmarkers              = NaN
+-		vertexconnectivity          = NaN
+-		elementconnectivity         = NaN
++		edges                       = NaN;
++		segments                    = NaN;
++		segmentmarkers              = NaN;
++		vertexconnectivity          = NaN;
++		elementconnectivity         = NaN;
+ 		average_vertex_connectivity = 0;
+ 	end
++	methods (Static)
++		function self = loadself(self) % {{{
++			% This function is directly called by matlab when a model selfect is
++			% loaded. Update old properties here
++
++			%2014 Oct. 1st
++			if isstruct(self),
++				oldself=self;
++				%Assign property values from struct
++				self=structtoself(mesh2dvertical(),oldself)
++				if isfield(oldself,'hemisphere'),
++					disp('md.mesh.hemisphere has been automatically converted to EPSG code');
++					if strcmpi(oldself.hemisphere,'n'),
++						self.epsg=3413;
++					else
++						self.epsg=3031;
++					end
++				end
++			end
++
++		end% }}}
++	end
+ 	methods
+-                function createxml(obj,fid) % {{{
+-            fprintf(fid, '<!-- 2d Mesh (Vertical) -->\n');
+-            
+-            %elements and vertices
+-            fprintf(fid,'%s\n%s\n%s\n','       <frame key="1" label="Elements and vertices">','       <section name="mesh" />');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements" type="',class(obj.numberofelements),'" default="',convert2str(obj.numberofelements),'">','              <help> number of elements </help>','          </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices" type="',class(obj.numberofvertices),'" default="',convert2str(obj.numberofvertices),'">','              <help> number of vertices </help>','          </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements" type="',class(obj.elements),'" default="',convert2str(obj.elements),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x" type="',class(obj.x),'" default="',convert2str(obj.x),'">','     <section name="mesh" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y" type="',class(obj.y),'" default="',convert2str(obj.y),'">','     <section name="mesh" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="edges" type="',class(obj.edges),'" default="',convert2str(obj.edges),'">','     <section name="mesh" />','     <help> edges of the 2d mesh (vertex1 vertex2 element1 element2) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberofedges" type="',class(obj.numberofedges),'" default="',convert2str(obj.numberofedges),'">','     <section name="mesh" />','     <help> number of edges of the 2d mesh </help>','  </parameter>');
+-            fprintf(fid,'%s\n%s\n','       </frame>');
+-     
+-            % properties
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="2" label="Properties">','<section name="mesh" />');             
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonboundary" type="',class(obj.vertexonboundary),'" default="',convert2str(obj.vertexonboundary),'">','     <section name="mesh" />','     <help> vertices on the boundary of the domain flag list </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonbase" type="',class(obj.vertexonbase),'" default="',convert2str(obj.vertexonbase),'">','     <section name="mesh" />','     <help> vertices on the bed of the domain flag list </help>','  </parameter>');            
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="segments" type="',class(obj.segments),'" default="',convert2str(obj.segments),'">','     <section name="mesh" />','     <help> edges on domain boundary (vertex1 vertex2 element) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="segmentmarkers" type="',class(obj.segmentmarkers),'" default="',convert2str(obj.segmentmarkers),'">','     <section name="mesh" />','     <help> number associated to each segment </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexconnectivity" type="',class(obj.vertexconnectivity),'" default="',convert2str(obj.vertexconnectivity),'">','     <section name="mesh" />','     <help> list of vertices connected to vertex_i </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementconnectivity" type="',class(obj.elementconnectivity),'" default="',convert2str(obj.elementconnectivity),'">','     <section name="mesh" />','     <help> list of vertices connected to element_i </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="average_vertex_connectivity" type="',class(obj.average_vertex_connectivity),'" default="',convert2str(obj.average_vertex_connectivity),'">','     <section name="mesh" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
++		function createxml(obj,fid) % {{{
++			fprintf(fid, '<!-- 2d Mesh (Vertical) -->\n');
+ 
+-            %projection
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="3" label="Projection">','<section name="mesh" />'); 
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lat" type="',class(obj.lat),'" default="',convert2str(obj.lat),'">','     <section name="mesh" />','     <help> vertices latitude [degrees] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="long" type="',class(obj.long),'" default="',convert2str(obj.long),'">','     <section name="mesh" />','     <help> verticies longitude [degrees] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="hemisphere" type="',class(obj.hemisphere),'" default="',convert2str(obj.hemisphere),'">','     <section name="mesh" />','     <help> Indicate hemisphere ''n'' or ''s'' </help>','  </parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-        
+-        end % }}}
++			%elements and vertices
++			fprintf(fid,'%s\n%s\n%s\n','       <frame key="1" label="Elements and vertices">','       <section name="mesh" />');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements" type="',class(obj.numberofelements),'" default="',convert2str(obj.numberofelements),'">','              <help> number of elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices" type="',class(obj.numberofvertices),'" default="',convert2str(obj.numberofvertices),'">','              <help> number of vertices </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements" type="',class(obj.elements),'" default="',convert2str(obj.elements),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x" type="',class(obj.x),'" default="',convert2str(obj.x),'">','     <section name="mesh" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y" type="',class(obj.y),'" default="',convert2str(obj.y),'">','     <section name="mesh" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="edges" type="',class(obj.edges),'" default="',convert2str(obj.edges),'">','     <section name="mesh" />','     <help> edges of the 2d mesh (vertex1 vertex2 element1 element2) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberofedges" type="',class(obj.numberofedges),'" default="',convert2str(obj.numberofedges),'">','     <section name="mesh" />','     <help> number of edges of the 2d mesh </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','       </frame>');
++
++			% properties
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="2" label="Properties">','<section name="mesh" />');             
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonboundary" type="',class(obj.vertexonboundary),'" default="',convert2str(obj.vertexonboundary),'">','     <section name="mesh" />','     <help> vertices on the boundary of the domain flag list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonbase" type="',class(obj.vertexonbase),'" default="',convert2str(obj.vertexonbase),'">','     <section name="mesh" />','     <help> vertices on the bed of the domain flag list </help>','  </parameter>');            
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="segments" type="',class(obj.segments),'" default="',convert2str(obj.segments),'">','     <section name="mesh" />','     <help> edges on domain boundary (vertex1 vertex2 element) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="segmentmarkers" type="',class(obj.segmentmarkers),'" default="',convert2str(obj.segmentmarkers),'">','     <section name="mesh" />','     <help> number associated to each segment </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexconnectivity" type="',class(obj.vertexconnectivity),'" default="',convert2str(obj.vertexconnectivity),'">','     <section name="mesh" />','     <help> list of vertices connected to vertex_i </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementconnectivity" type="',class(obj.elementconnectivity),'" default="',convert2str(obj.elementconnectivity),'">','     <section name="mesh" />','     <help> list of vertices connected to element_i </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="average_vertex_connectivity" type="',class(obj.average_vertex_connectivity),'" default="',convert2str(obj.average_vertex_connectivity),'">','     <section name="mesh" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++
++			%projection
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="3" label="Projection">','<section name="mesh" />'); 
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lat" type="',class(obj.lat),'" default="',convert2str(obj.lat),'">','     <section name="mesh" />','     <help> vertices latitude [degrees] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="long" type="',class(obj.long),'" default="',convert2str(obj.long),'">','     <section name="mesh" />','     <help> verticies longitude [degrees] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="epsg" type="',class(obj.epsg),'" default="',convert2str(obj.epsg),'">','     <section name="mesh" />','     <help> Indicate epsg ''n'' or ''s'' </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++
++		end % }}}
+ 		function obj = mesh2dvertical(varargin) % {{{
+ 			switch nargin
+ 				case 0
+@@ -133,7 +155,7 @@
+ 			disp(sprintf('\n      Projection:'));
+ 			fielddisplay(obj,'lat','vertices latitude [degrees]');
+ 			fielddisplay(obj,'long','vertices longitude [degrees]');
+-			fielddisplay(obj,'hemisphere','Indicate hemisphere ''n'' or ''s'' ');
++			fielddisplay(obj,'epsg','EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)');
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+ 			WriteData(fid,'enum',DomainTypeEnum(),'data',StringToEnum(['Domain' domaintype(obj)]),'format','Integer');
+Index: ../trunk-jpl/src/m/classes/model.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.py	(revision 18557)
++++ ../trunk-jpl/src/m/classes/model.py	(revision 18558)
+@@ -516,7 +516,7 @@
+ 
+ 		md.mesh.lat                         = mesh2d.lat
+ 		md.mesh.long                        = mesh2d.long
+-		md.mesh.hemisphere                  = mesh2d.hemisphere
++		md.mesh.epsg                        = mesh2d.epsg
+ 
+ 		md.mesh.vertexonboundary            = mesh2d.vertexonboundary
+ 		md.mesh.vertexconnectivity          = mesh2d.vertexconnectivity
+Index: ../trunk-jpl/src/m/classes/mesh2d.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mesh2d.m	(revision 18557)
++++ ../trunk-jpl/src/m/classes/mesh2d.m	(revision 18558)
+@@ -7,27 +7,49 @@
+ 	properties (SetAccess=public) 
+ 		x                           = NaN;
+ 		y                           = NaN;
+-		elements                    = NaN
++		elements                    = NaN;
+ 		numberofelements            = 0;
+ 		numberofvertices            = 0;
+ 		numberofedges               = 0;
+ 
+-		lat                         = NaN
+-		long                        = NaN
+-		hemisphere                  = NaN
++		lat                         = NaN;
++		long                        = NaN;
++		epsg                        = 0;
+ 
+-		vertexonboundary            = NaN
++		vertexonboundary            = NaN;
+ 
+-		edges                       = NaN
+-		segments                    = NaN
+-		segmentmarkers              = NaN
+-		vertexconnectivity          = NaN
+-		elementconnectivity         = NaN
++		edges                       = NaN;
++		segments                    = NaN;
++		segmentmarkers              = NaN;
++		vertexconnectivity          = NaN;
++		elementconnectivity         = NaN;
+ 		average_vertex_connectivity = 0;
+ 
+-		extractedvertices           = NaN
+-		extractedelements           = NaN
++		extractedvertices           = NaN;
++		extractedelements           = NaN;
+ 	end
++	methods (Static)
++		function self = loadself(self) % {{{
++			% This function is directly called by matlab when a model selfect is
++			% loaded. Update old properties here
++
++			%2014 Oct. 1st
++			if isstruct(self),
++				oldself=self;
++				%Assign property values from struct
++				self=structtoself(mesh2d(),oldself)
++				if isfield(oldself,'hemisphere'),
++					disp('md.mesh.hemisphere has been automatically converted to EPSG code');
++					if strcmpi(oldself.hemisphere,'n'),
++						self.epsg=3413;
++					else
++						self.epsg=3031;
++					end
++				end
++			end
++
++		end% }}}
++	end
+ 	methods
+ 		function self = mesh2d(varargin) % {{{
+ 			switch nargin
+@@ -101,50 +123,50 @@
+ 			disp(sprintf('\n      Projection:'));
+ 			fielddisplay(obj,'lat','vertices latitude [degrees]');
+ 			fielddisplay(obj,'long','vertices longitude [degrees]');
+-			fielddisplay(obj,'hemisphere','Indicate hemisphere ''n'' or ''s'' ');
++			fielddisplay(obj,'epsg','EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)');
+ 		end % }}}
+-        function createxml(obj,fid) % {{{
+-            fprintf(fid, '<!-- 2D tria Mesh (horizontal) -->\n');
+-            
+-            %elements and vertices
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Elements and vertices">','<section name="mesh" />');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="numberofelements" type="',class(obj.numberofelements),'" default="',convert2str(obj.numberofelements),'">','     <section name="mesh" />','     <help> number of elements </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="numberofvertices" type="',class(obj.numberofvertices),'" default="',convert2str(obj.numberofvertices),'">','     <section name="mesh" />','     <help> number of vertices </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="elements" type="',class(obj.elements),'" default="',convert2str(obj.elements),'">','     <section name="mesh" />','     <help> vertex indices of the mesh elements </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x" type="',class(obj.x),'" default="',convert2str(obj.x),'">','     <section name="mesh" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y" type="',class(obj.y),'" default="',convert2str(obj.y),'">','     <section name="mesh" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="edges" type="',class(obj.edges),'" default="',convert2str(obj.edges),'">','     <section name="mesh" />','     <help> edges of the 2d mesh (vertex1 vertex2 element1 element2) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberofedges" type="',class(obj.numberofedges),'" default="',convert2str(obj.numberofedges),'">','     <section name="mesh" />','     <help> number of edges of the 2d mesh </help>','  </parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-     
+-            % properties
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="2" label="Properties">','<section name="mesh" />');             
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonboundary" type="',class(obj.vertexonboundary),'" default="',convert2str(obj.vertexonboundary),'">','     <section name="mesh" />','     <help> vertices on the boundary of the domain flag list </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="segments" type="',class(obj.segments),'" default="',convert2str(obj.segments),'">','     <section name="mesh" />','     <help> edges on domain boundary (vertex1 vertex2 element) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="segmentmarkers" type="',class(obj.segmentmarkers),'" default="',convert2str(obj.segmentmarkers),'">','     <section name="mesh" />','     <help> number associated to each segment </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexconnectivity" type="',class(obj.vertexconnectivity),'" default="',convert2str(obj.vertexconnectivity),'">','     <section name="mesh" />','     <help> list of vertices connected to vertex_i </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementconnectivity" type="',class(obj.elementconnectivity),'" default="',convert2str(obj.elementconnectivity),'">','     <section name="mesh" />','     <help> list of vertices connected to element_i </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="average_vertex_connectivity" type="',class(obj.average_vertex_connectivity),'" default="',convert2str(obj.average_vertex_connectivity),'">','     <section name="mesh" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-            
+-            %extracted model
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="3" label="Extracted Model">','<section name="mesh" />'); 
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedvertices" type="',class(obj.extractedvertices),'" default="',convert2str(obj.extractedvertices),'">','     <section name="mesh" />','     <help> vertices extracted from the model </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedelements" type="',class(obj.extractedelements),'" default="',convert2str(obj.extractedelements),'">','     <section name="mesh" />','     <help> elements extracted from the model </help>','  </parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-            
+-            %projection
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="4" label="Projection">','<section name="mesh" />'); 
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lat" type="',class(obj.lat),'" default="',convert2str(obj.lat),'">','     <section name="mesh" />','     <help> vertices latitude [degrees] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="long" type="',class(obj.long),'" default="',convert2str(obj.long),'">','     <section name="mesh" />','     <help> verticies longitude [degrees] </help>','  </parameter>');
+-            % choice (hemisphere) 'n' or 's'
+-            fprintf(fid,'%s\n%s\n%s\n','  <parameter key ="hemisphere" type="alternative" optional="false">','     <section name="mesh" />','     <help> Indicate hemisphere ''n'' or ''s'' </help>');
+-            fprintf(fid,'%s\n','       <option value="n" type="string" default="true"> </option>');
+-            fprintf(fid,'%s\n','       <option value="s" type="string" default="false"> </option>');
+-            fprintf(fid,'%s\n','  </parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-        
+-        end % }}}
++		function createxml(obj,fid) % {{{
++			fprintf(fid, '<!-- 2D tria Mesh (horizontal) -->\n');
++
++			%elements and vertices
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Elements and vertices">','<section name="mesh" />');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="numberofelements" type="',class(obj.numberofelements),'" default="',convert2str(obj.numberofelements),'">','     <section name="mesh" />','     <help> number of elements </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="numberofvertices" type="',class(obj.numberofvertices),'" default="',convert2str(obj.numberofvertices),'">','     <section name="mesh" />','     <help> number of vertices </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="elements" type="',class(obj.elements),'" default="',convert2str(obj.elements),'">','     <section name="mesh" />','     <help> vertex indices of the mesh elements </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x" type="',class(obj.x),'" default="',convert2str(obj.x),'">','     <section name="mesh" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y" type="',class(obj.y),'" default="',convert2str(obj.y),'">','     <section name="mesh" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="edges" type="',class(obj.edges),'" default="',convert2str(obj.edges),'">','     <section name="mesh" />','     <help> edges of the 2d mesh (vertex1 vertex2 element1 element2) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberofedges" type="',class(obj.numberofedges),'" default="',convert2str(obj.numberofedges),'">','     <section name="mesh" />','     <help> number of edges of the 2d mesh </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++
++			% properties
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="2" label="Properties">','<section name="mesh" />');             
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonboundary" type="',class(obj.vertexonboundary),'" default="',convert2str(obj.vertexonboundary),'">','     <section name="mesh" />','     <help> vertices on the boundary of the domain flag list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="segments" type="',class(obj.segments),'" default="',convert2str(obj.segments),'">','     <section name="mesh" />','     <help> edges on domain boundary (vertex1 vertex2 element) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="segmentmarkers" type="',class(obj.segmentmarkers),'" default="',convert2str(obj.segmentmarkers),'">','     <section name="mesh" />','     <help> number associated to each segment </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexconnectivity" type="',class(obj.vertexconnectivity),'" default="',convert2str(obj.vertexconnectivity),'">','     <section name="mesh" />','     <help> list of vertices connected to vertex_i </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementconnectivity" type="',class(obj.elementconnectivity),'" default="',convert2str(obj.elementconnectivity),'">','     <section name="mesh" />','     <help> list of vertices connected to element_i </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="average_vertex_connectivity" type="',class(obj.average_vertex_connectivity),'" default="',convert2str(obj.average_vertex_connectivity),'">','     <section name="mesh" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++
++			%extracted model
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="3" label="Extracted Model">','<section name="mesh" />'); 
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedvertices" type="',class(obj.extractedvertices),'" default="',convert2str(obj.extractedvertices),'">','     <section name="mesh" />','     <help> vertices extracted from the model </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedelements" type="',class(obj.extractedelements),'" default="',convert2str(obj.extractedelements),'">','     <section name="mesh" />','     <help> elements extracted from the model </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++
++			%projection
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="4" label="Projection">','<section name="mesh" />'); 
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lat" type="',class(obj.lat),'" default="',convert2str(obj.lat),'">','     <section name="mesh" />','     <help> vertices latitude [degrees] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="long" type="',class(obj.long),'" default="',convert2str(obj.long),'">','     <section name="mesh" />','     <help> verticies longitude [degrees] </help>','  </parameter>');
++			% choice (epsg) 'n' or 's'
++			fprintf(fid,'%s\n%s\n%s\n','  <parameter key ="epsg" type="alternative" optional="false">','     <section name="mesh" />','     <help> Indicate epsg ''n'' or ''s'' </help>');
++			fprintf(fid,'%s\n','       <option value="n" type="string" default="true"> </option>');
++			fprintf(fid,'%s\n','       <option value="s" type="string" default="false"> </option>');
++			fprintf(fid,'%s\n','  </parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++
++		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+ 			WriteData(fid,'enum',DomainTypeEnum(),'data',StringToEnum(['Domain' domaintype(obj)]),'format','Integer');
+ 			WriteData(fid,'enum',DomainDimensionEnum(),'data',dimension(obj),'format','Integer');
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 18557)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 18558)
+@@ -659,7 +659,7 @@
+ 
+ 			md.mesh.lat                         = mesh2d.lat;
+ 			md.mesh.long                        = mesh2d.long;
+-			md.mesh.hemisphere                  = mesh2d.hemisphere;
++			md.mesh.epsg                        = mesh2d.epsg;
+ 
+ 			md.mesh.vertexonboundary            = mesh2d.vertexonboundary;
+ 			md.mesh.vertexconnectivity          = mesh2d.vertexconnectivity;
+@@ -972,7 +972,6 @@
+ 			if isfield(structmd,'extractednodes'), md.mesh.extractedvertices=structmd.extractednodes; end
+ 			if isfield(structmd,'extractedelements'), md.mesh.extractedelements=structmd.extractedelements; end
+ 			if isfield(structmd,'nodeonboundary'), md.mesh.vertexonboundary=structmd.nodeonboundary; end
+-			if isfield(structmd,'hemisphere'), md.mesh.hemisphere=structmd.hemisphere; end
+ 			if isfield(structmd,'lat'), md.mesh.lat=structmd.lat; end
+ 			if isfield(structmd,'long'), md.mesh.long=structmd.long; end
+ 			if isfield(structmd,'segments'), md.mesh.segments=structmd.segments; end
+Index: ../trunk-jpl/src/m/classes/mesh2d.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/mesh2d.py	(revision 18557)
++++ ../trunk-jpl/src/m/classes/mesh2d.py	(revision 18558)
+@@ -23,7 +23,7 @@
+ 		
+ 		self.lat                         = float('NaN');
+ 		self.long                        = float('NaN');
+-		self.hemisphere                  = float('NaN');
++		self.epsg                        = 0;
+ 
+ 		self.vertexonboundary            = float('NaN');
+ 		self.edges                       = float('NaN');
+@@ -67,7 +67,7 @@
+ 		string="%s%s"%(string,"\n\n      Projection:")
+ 		string="%s\n%s"%(string,fielddisplay(self,"lat","vertices latitude [degrees]"))
+ 		string="%s\n%s"%(string,fielddisplay(self,"long","vertices longitude [degrees]"))
+-		string="%s\n%s"%(string,fielddisplay(self,"hemisphere","Indicate hemisphere 'n' or 's'"))
++		string="%s\n%s"%(string,fielddisplay(self,"epsg","EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)"))
+ 		return string
+ 		#}}}
+ 	def setdefaultparameters(self): # {{{
Index: /issm/oecreview/Archive/18296-19100/ISSM-18558-18559.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18558-18559.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18558-18559.diff	(revision 19102)
@@ -0,0 +1,88 @@
+Index: ../trunk-jpl/src/m/classes/mesh3dprisms.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mesh3dprisms.m	(revision 18558)
++++ ../trunk-jpl/src/m/classes/mesh3dprisms.m	(revision 18559)
+@@ -39,7 +39,7 @@
+ 		extractedelements           = NaN;
+ 	end
+ 	methods (Static)
+-		function self = loadself(self) % {{{
++		function self = loadobj(self) % {{{
+ 			% This function is directly called by matlab when a model selfect is
+ 			% loaded. Update old properties here
+ 
+@@ -47,7 +47,7 @@
+ 			if isstruct(self),
+ 				oldself=self;
+ 				%Assign property values from struct
+-				self=structtoself(mesh3dprisms(),oldself)
++				self=structtoobj(mesh3dprisms(),oldself)
+ 				if isfield(oldself,'hemisphere'),
+ 					disp('md.mesh.hemisphere has been automatically converted to EPSG code');
+ 					if strcmpi(oldself.hemisphere,'n'),
+Index: ../trunk-jpl/src/m/classes/mesh3dtetras.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mesh3dtetras.m	(revision 18558)
++++ ../trunk-jpl/src/m/classes/mesh3dtetras.m	(revision 18559)
+@@ -39,7 +39,7 @@
+ 		extractedelements           = NaN;
+ 	end
+ 	methods (Static)
+-		function self = loadself(self) % {{{
++		function self = loadobj(self) % {{{
+ 			% This function is directly called by matlab when a model selfect is
+ 			% loaded. Update old properties here
+ 
+@@ -47,7 +47,7 @@
+ 			if isstruct(self),
+ 				oldself=self;
+ 				%Assign property values from struct
+-				self=structtoself(mesh3dtetras(),oldself)
++				self=structtoobj(mesh3dtetras(),oldself)
+ 				if isfield(oldself,'hemisphere'),
+ 					disp('md.mesh.hemisphere has been automatically converted to EPSG code');
+ 					if strcmpi(oldself.hemisphere,'n'),
+Index: ../trunk-jpl/src/m/classes/mesh2dvertical.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mesh2dvertical.m	(revision 18558)
++++ ../trunk-jpl/src/m/classes/mesh2dvertical.m	(revision 18559)
+@@ -28,7 +28,7 @@
+ 		average_vertex_connectivity = 0;
+ 	end
+ 	methods (Static)
+-		function self = loadself(self) % {{{
++		function self = loadobj(self) % {{{
+ 			% This function is directly called by matlab when a model selfect is
+ 			% loaded. Update old properties here
+ 
+@@ -36,7 +36,7 @@
+ 			if isstruct(self),
+ 				oldself=self;
+ 				%Assign property values from struct
+-				self=structtoself(mesh2dvertical(),oldself)
++				self=structtoobj(mesh2dvertical(),oldself)
+ 				if isfield(oldself,'hemisphere'),
+ 					disp('md.mesh.hemisphere has been automatically converted to EPSG code');
+ 					if strcmpi(oldself.hemisphere,'n'),
+Index: ../trunk-jpl/src/m/classes/mesh2d.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mesh2d.m	(revision 18558)
++++ ../trunk-jpl/src/m/classes/mesh2d.m	(revision 18559)
+@@ -29,7 +29,7 @@
+ 		extractedelements           = NaN;
+ 	end
+ 	methods (Static)
+-		function self = loadself(self) % {{{
++		function self = loadobj(self) % {{{
+ 			% This function is directly called by matlab when a model selfect is
+ 			% loaded. Update old properties here
+ 
+@@ -37,7 +37,7 @@
+ 			if isstruct(self),
+ 				oldself=self;
+ 				%Assign property values from struct
+-				self=structtoself(mesh2d(),oldself)
++				self=structtoobj(mesh2d(),oldself)
+ 				if isfield(oldself,'hemisphere'),
+ 					disp('md.mesh.hemisphere has been automatically converted to EPSG code');
+ 					if strcmpi(oldself.hemisphere,'n'),
Index: /issm/oecreview/Archive/18296-19100/ISSM-18559-18560.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18559-18560.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18559-18560.diff	(revision 19102)
@@ -0,0 +1,484 @@
+Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h	(revision 18559)
++++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h	(revision 18560)
+@@ -68,16 +68,14 @@
+ 		ElementVector* CreateDVectorFS(Element* element);
+ 		ElementMatrix* CreateJacobianMatrixFS(Element* element);
+ 		ElementMatrix* CreateKMatrixFS(Element* element);
+-		ElementMatrix* CreateKMatrixFSViscousLATH(Element* element);
+-		ElementMatrix* CreateKMatrixFSViscousLACR(Element* element);
++		ElementMatrix* CreateKMatrixFSViscousLA(Element* element);
+ 		ElementMatrix* CreateKMatrixFSViscousXTH(Element* element);
+ 		ElementMatrix* CreateKMatrixFSViscous(Element* element);
+ 		ElementMatrix* CreateKMatrixFSFriction(Element* element);
+ 		ElementMatrix* CreateKMatrixFSShelf(Element* element);
+ 		ElementVector* CreatePVectorFS(Element* element);
+ 		ElementVector* CreatePVectorFSViscous(Element* element);
+-		ElementVector* CreatePVectorFSViscousLATH(Element* element);
+-		ElementVector* CreatePVectorFSViscousLACR(Element* element);
++		ElementVector* CreatePVectorFSViscousLA(Element* element);
+ 		ElementVector* CreatePVectorFSViscousXTH(Element* element);
+ 		ElementVector* CreatePVectorFSShelf(Element* element);
+ 		ElementVector* CreatePVectorFSFront(Element* element);
+Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18559)
++++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18560)
+@@ -2941,10 +2941,8 @@
+ 	ElementMatrix* Ke1=NULL;
+ 	if(fe_FS==XTaylorHoodEnum)
+ 	 Ke1=CreateKMatrixFSViscousXTH(element);
+-	else if(fe_FS==LATaylorHoodEnum)
+-	 Ke1=CreateKMatrixFSViscousLATH(element);
+-	else if(fe_FS==LACrouzeixRaviartEnum)
+-	 Ke1=CreateKMatrixFSViscousLACR(element);
++	else if(fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum)
++	 Ke1=CreateKMatrixFSViscousLA(element);
+ 	else
+ 	 Ke1=CreateKMatrixFSViscous(element);
+ 
+@@ -2958,7 +2956,7 @@
+ 	delete Ke3;
+ 	return Ke;
+ }/*}}}*/
+-ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSViscousLATH(Element* element){/*{{{*/
++ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSViscousLA(Element* element){/*{{{*/
+ 
+ 	/*Intermediaries*/
+ 	int         i,dim,epssize;
+@@ -3030,136 +3028,6 @@
+ 					BtBUzawa,1);
+ 	}
+ 
+-	if(element->IsOnBase()){ 
+-		element->FindParam(&rl,AugmentedLagrangianRlambdaEnum);
+-		element->GetVerticesCoordinatesBase(&xyz_list_base);
+-		element->NormalBase(&normal[0],xyz_list_base);
+-
+-		IssmDouble* Dlambda  = xNewZeroInit<IssmDouble>(dim*dim);
+-		IssmDouble* C        = xNewZeroInit<IssmDouble>(dim*lnumdof);
+-		IssmDouble* Cprime   = xNewZeroInit<IssmDouble>(dim*numdof);
+-		IssmDouble* CtCUzawa = xNewZeroInit<IssmDouble>(numdof*lnumdof);
+-
+-		delete gauss;
+-		gauss = element->NewGaussBase(5);
+-		for(int ig=gauss->begin();ig<gauss->end();ig++){
+-			gauss->GaussPoint(ig);
+-
+-			element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
+-			this->GetCFS(C,element,dim,xyz_list,gauss);
+-			this->GetCFSprime(Cprime,element,dim,xyz_list,gauss);
+-			for(i=0;i<dim;i++) Dlambda[i*dim+i] = gauss->weight*Jdet*sqrt(normal[i]*normal[i])*sqrt(rl);
+-			TripleMultiply(C,dim,lnumdof,1,
+-						Dlambda,dim,dim,0,
+-						Cprime,dim,numdof,0,
+-						CtCUzawa,1);
+-		}
+-
+-		/*The sigma naugmentation should not be transformed*/
+-		MatrixMultiply(CtCUzawa,lnumdof,numdof,1,
+-					CtCUzawa,lnumdof,numdof,0,
+-					&Ke->values[0],1);
+-
+-		/*Delete base part*/
+-		xDelete<IssmDouble>(Dlambda);
+-		xDelete<IssmDouble>(C);
+-		xDelete<IssmDouble>(Cprime);
+-		xDelete<IssmDouble>(CtCUzawa);
+-		xDelete<IssmDouble>(xyz_list_base);
+-	}
+-
+-	/*Transform Coordinate System*/
+-	element->TransformStiffnessMatrixCoord(Ke,cs_list);
+-
+-	/*The pressure augmentation should not be transformed*/
+-	MatrixMultiply(BtBUzawa,pnumdof,numdof,1,
+-				BtBUzawa,pnumdof,numdof,0,
+-				&Ke->values[0],1);
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(D);
+-	xDelete<IssmDouble>(Bprime);
+-	xDelete<IssmDouble>(B);
+-	xDelete<IssmDouble>(BprimeU);
+-	xDelete<IssmDouble>(BU);
+-	xDelete<IssmDouble>(BtBUzawa);
+-	xDelete<int>(cs_list);
+-	return Ke;
+-}/*}}}*/
+-ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSViscousLACR(Element* element){/*{{{*/
+-
+-	/*Intermediaries*/
+-	int         i,dim,epssize;
+-	IssmDouble  r,rl,Jdet,viscosity,DU,DUl;
+-	IssmDouble	normal[3];
+-	IssmDouble *xyz_list = NULL;
+-	IssmDouble *xyz_list_base = NULL;
+-
+-	/*Get problem dimension*/
+-	element->FindParam(&dim,DomainDimensionEnum);
+-	element->FindParam(&r,AugmentedLagrangianREnum);
+-	if(dim==2) epssize = 3;
+-	else       epssize = 6;
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int vnumnodes = element->NumberofNodesVelocity();
+-	int pnumnodes = element->GetNumberOfNodes(P1DGEnum);
+-	int lnumnodes = element->GetNumberOfNodes(P2Enum);
+-	int numdof    = vnumnodes*dim;
+-	int pnumdof   = pnumnodes;
+-	int lnumdof   = lnumnodes;
+-
+-	/*Prepare coordinate system list*/
+-	int* cs_list = xNew<int>(vnumnodes);
+-	if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum;
+-	else       for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum;
+-
+-	/*Initialize Element matrix and vectors*/
+-	ElementMatrix* Ke       = element->NewElementMatrix(FSvelocityEnum);
+-	IssmDouble*    B        = xNew<IssmDouble>(epssize*numdof);
+-	IssmDouble*    Bprime   = xNew<IssmDouble>(epssize*numdof);
+-	IssmDouble*    BtBUzawa = xNewZeroInit<IssmDouble>(numdof*pnumdof);
+-	IssmDouble*    BU       = xNew<IssmDouble>(pnumdof);
+-	IssmDouble*    BprimeU  = xNew<IssmDouble>(numdof);
+-	IssmDouble*    D        = xNewZeroInit<IssmDouble>(epssize*epssize);
+-
+-	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinates(&xyz_list);
+-	Input* vx_input = element->GetInput(VxEnum);     _assert_(vx_input);
+-	Input* vy_input = element->GetInput(VyEnum);     _assert_(vy_input);
+-	Input* vz_input = NULL;
+-	if(dim==3){vz_input = element->GetInput(VzEnum); _assert_(vz_input);}
+-
+-	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss = element->NewGauss(5);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		this->GetBFSvel(B,element,dim,xyz_list,gauss);
+-		this->GetBFSprimevel(Bprime,element,dim,xyz_list,gauss);
+-
+-		element->ViscosityFS(&viscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input);
+-		for(i=0;i<epssize;i++)   D[i*epssize+i] = 2*viscosity*gauss->weight*Jdet;
+-
+-		TripleMultiply(B,epssize,numdof,1,
+-					D,epssize,epssize,0,
+-					Bprime,epssize,numdof,0,
+-					&Ke->values[0],1);
+-
+-		this->GetBFSUzawa(BU,element,dim,xyz_list,gauss);
+-		this->GetBFSprimeUzawa(BprimeU,element,dim,xyz_list,gauss);
+-
+-		DU = gauss->weight*Jdet*sqrt(r);
+-
+-		TripleMultiply(BU,1,pnumdof,1,
+-					&DU,1,1,0,
+-					BprimeU,1,numdof,0,
+-					BtBUzawa,1);
+-	}
+-
+ 	if(element->IsOnBase() && 0){ 
+ 		element->FindParam(&rl,AugmentedLagrangianRlambdaEnum);
+ 		element->GetVerticesCoordinatesBase(&xyz_list_base);
+@@ -3807,12 +3675,12 @@
+ 		delete petemp;
+ 		delete pe4;
+ 	}
+-	else if(fe_FS==LATaylorHoodEnum){
++	else if(fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum){
+ 		ElementVector* pe1=CreatePVectorFSViscous(element);
+ 		ElementVector* pe2=CreatePVectorFSShelf(element);
+ 		ElementVector* pe3=CreatePVectorFSFront(element);
+ 		ElementVector* petemp =new ElementVector(pe1,pe2,pe3);
+-		ElementVector* pe4=CreatePVectorFSViscousLATH(element);
++		ElementVector* pe4=CreatePVectorFSViscousLA(element);
+ 		pe = new ElementVector(petemp,pe4);
+ 		delete pe1;
+ 		delete pe2;
+@@ -3820,19 +3688,6 @@
+ 		delete petemp;
+ 		delete pe4;
+ 	}
+-	else if(fe_FS==LACrouzeixRaviartEnum){
+-		ElementVector* pe1=CreatePVectorFSViscous(element);
+-		ElementVector* pe2=CreatePVectorFSShelf(element);
+-		ElementVector* pe3=CreatePVectorFSFront(element);
+-		ElementVector* petemp =new ElementVector(pe1,pe2,pe3);
+-		ElementVector* pe4=CreatePVectorFSViscousLACR(element);
+-		pe = new ElementVector(petemp,pe4);
+-		delete pe1;
+-		delete pe2;
+-		delete pe3;
+-		delete petemp;
+-		delete pe4;
+-	}
+ 	else{
+ 		ElementVector* pe1=CreatePVectorFSViscous(element);
+ 		ElementVector* pe2=CreatePVectorFSShelf(element);
+@@ -3916,6 +3771,89 @@
+ 	return pe;
+ }/*}}}*/
+ #endif
++ElementVector* StressbalanceAnalysis::CreatePVectorFSViscousLA(Element* element){/*{{{*/
++
++	int         i,dim;
++	IssmDouble  Jdet,r,pressure;
++	IssmDouble  bed_normal[3];
++	IssmDouble *xyz_list      = NULL;
++	IssmDouble *xyz_list_base = NULL;
++	Gauss*      gauss         = NULL;
++
++	/*Get problem dimension*/
++	element->FindParam(&dim,DomainDimensionEnum);
++
++	/*Fetch number of nodes and dof for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++
++	/*Prepare coordinate system list*/
++	int* cs_list = xNew<int>(numnodes);
++	if(dim==2) for(i=0;i<numnodes;i++) cs_list[i] = XYEnum;
++	else       for(i=0;i<numnodes;i++) cs_list[i] = XYZEnum;
++
++	/*Initialize vectors*/
++	ElementVector* pe      = element->NewElementVector(FSvelocityEnum);
++	IssmDouble*    dbasis  = xNew<IssmDouble>(3*numnodes);
++
++	/*Retrieve all inputs and parameters*/
++	element->FindParam(&r,AugmentedLagrangianREnum);
++	element->GetVerticesCoordinates(&xyz_list);
++
++	/*Get pressure and sigmann*/
++	Input* pressure_input=element->GetInput(PressureEnum); _assert_(pressure_input);
++	Input* sigmann_input =element->GetInput(SigmaNNEnum);  _assert_(sigmann_input);
++
++	gauss=element->NewGauss(5);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		
++		pressure_input->GetInputValue(&pressure, gauss);
++		element->NodalFunctionsDerivativesVelocity(dbasis,xyz_list,gauss);
++
++		for(i=0;i<numnodes;i++){
++			pe->values[i*dim+0] += pressure*gauss->weight*Jdet*dbasis[0*numnodes+i];
++			pe->values[i*dim+1] += pressure*gauss->weight*Jdet*dbasis[1*numnodes+i];
++			if(dim==3) pe->values[i*dim+2]+= pressure*gauss->weight*Jdet*dbasis[2*numnodes+i];
++		}
++	}
++
++	if(element->IsOnBase()){ 
++		IssmDouble   sigmann;
++		IssmDouble*  vbasis = xNew<IssmDouble>(numnodes);
++
++		element->GetVerticesCoordinatesBase(&xyz_list_base);
++		element->NormalBase(&bed_normal[0],xyz_list_base);
++
++		delete gauss;
++		gauss=element->NewGaussBase(5);
++		for(int ig=gauss->begin();ig<gauss->end();ig++){
++			gauss->GaussPoint(ig);
++
++			element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
++			element->NodalFunctionsVelocity(vbasis,gauss);
++			sigmann_input->GetInputValue(&sigmann, gauss);
++
++			for(i=0;i<numnodes;i++){
++				pe->values[i*dim+0] += + sigmann*bed_normal[0]*gauss->weight*Jdet*vbasis[i];
++				pe->values[i*dim+1] += + sigmann*bed_normal[1]*gauss->weight*Jdet*vbasis[i];
++				if(dim==3) pe->values[i*dim+2] += + sigmann*bed_normal[2]*gauss->weight*Jdet*vbasis[i];
++			}
++		}
++		xDelete<IssmDouble>(xyz_list_base);
++		xDelete<IssmDouble>(vbasis);
++	}
++
++	/*Transform coordinate system*/
++	//element->TransformLoadVectorCoord(pe,cs_list); Do not transform augmentation
++
++	/*Clean up and return*/
++	delete gauss;
++	xDelete<int>(cs_list);
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(dbasis);
++	return pe;
++}/*}}}*/
+ ElementVector* StressbalanceAnalysis::CreatePVectorFSViscousXTH(Element* element){/*{{{*/
+ 
+ 	int         i,tausize,dim;
+@@ -4088,172 +4026,6 @@
+ 	xDelete<IssmDouble>(tbasis);
+ 	return pe;
+ }/*}}}*/
+-ElementVector* StressbalanceAnalysis::CreatePVectorFSViscousLATH(Element* element){/*{{{*/
+-
+-	int         i,dim;
+-	IssmDouble  Jdet,r,pressure;
+-	IssmDouble  bed_normal[3];
+-	IssmDouble *xyz_list      = NULL;
+-	IssmDouble *xyz_list_base = NULL;
+-	Gauss*      gauss         = NULL;
+-
+-	/*Get problem dimension*/
+-	element->FindParam(&dim,DomainDimensionEnum);
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-
+-	/*Prepare coordinate system list*/
+-	int* cs_list = xNew<int>(numnodes);
+-	if(dim==2) for(i=0;i<numnodes;i++) cs_list[i] = XYEnum;
+-	else       for(i=0;i<numnodes;i++) cs_list[i] = XYZEnum;
+-
+-	/*Initialize vectors*/
+-	ElementVector* pe      = element->NewElementVector(FSvelocityEnum);
+-	IssmDouble*    dbasis  = xNew<IssmDouble>(3*numnodes);
+-
+-	/*Retrieve all inputs and parameters*/
+-	element->FindParam(&r,AugmentedLagrangianREnum);
+-	element->GetVerticesCoordinates(&xyz_list);
+-
+-	/*Get pressure and sigmann*/
+-	Input* pressure_input=element->GetInput(PressureEnum); _assert_(pressure_input);
+-	Input* sigmann_input =element->GetInput(SigmaNNEnum);  _assert_(sigmann_input);
+-
+-	gauss=element->NewGauss(5);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		
+-		pressure_input->GetInputValue(&pressure, gauss);
+-		element->NodalFunctionsDerivativesVelocity(dbasis,xyz_list,gauss);
+-
+-		for(i=0;i<numnodes;i++){
+-			pe->values[i*dim+0] += pressure*gauss->weight*Jdet*dbasis[0*numnodes+i];
+-			pe->values[i*dim+1] += pressure*gauss->weight*Jdet*dbasis[1*numnodes+i];
+-			if(dim==3) pe->values[i*dim+2]+= pressure*gauss->weight*Jdet*dbasis[2*numnodes+i];
+-		}
+-	}
+-
+-	if(element->IsOnBase()){ 
+-		IssmDouble   sigmann;
+-		IssmDouble*  vbasis = xNew<IssmDouble>(numnodes);
+-
+-		element->GetVerticesCoordinatesBase(&xyz_list_base);
+-		element->NormalBase(&bed_normal[0],xyz_list_base);
+-
+-		delete gauss;
+-		gauss=element->NewGaussBase(5);
+-		for(int ig=gauss->begin();ig<gauss->end();ig++){
+-			gauss->GaussPoint(ig);
+-
+-			element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
+-			element->NodalFunctionsVelocity(vbasis,gauss);
+-			sigmann_input->GetInputValue(&sigmann, gauss);
+-
+-			for(i=0;i<numnodes;i++){
+-				pe->values[i*dim+0] += + sigmann*bed_normal[0]*gauss->weight*Jdet*vbasis[i];
+-				pe->values[i*dim+1] += + sigmann*bed_normal[1]*gauss->weight*Jdet*vbasis[i];
+-				if(dim==3) pe->values[i*dim+2] += + sigmann*bed_normal[2]*gauss->weight*Jdet*vbasis[i];
+-			}
+-		}
+-		xDelete<IssmDouble>(xyz_list_base);
+-		xDelete<IssmDouble>(vbasis);
+-	}
+-
+-	/*Transform coordinate system*/
+-	//element->TransformLoadVectorCoord(pe,cs_list); Do not transform augmentation
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-	xDelete<int>(cs_list);
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(dbasis);
+-	return pe;
+-}/*}}}*/
+-ElementVector* StressbalanceAnalysis::CreatePVectorFSViscousLACR(Element* element){/*{{{*/
+-
+-	int         i,dim;
+-	IssmDouble  Jdet,r,pressure;
+-	IssmDouble  bed_normal[3];
+-	IssmDouble *xyz_list      = NULL;
+-	IssmDouble *xyz_list_base = NULL;
+-	Gauss*      gauss         = NULL;
+-
+-	/*Get problem dimension*/
+-	element->FindParam(&dim,DomainDimensionEnum);
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-
+-	/*Prepare coordinate system list*/
+-	int* cs_list = xNew<int>(numnodes);
+-	if(dim==2) for(i=0;i<numnodes;i++) cs_list[i] = XYEnum;
+-	else       for(i=0;i<numnodes;i++) cs_list[i] = XYZEnum;
+-
+-	/*Initialize vectors*/
+-	ElementVector* pe      = element->NewElementVector(FSvelocityEnum);
+-	IssmDouble*    dbasis  = xNew<IssmDouble>(3*numnodes);
+-
+-	/*Retrieve all inputs and parameters*/
+-	element->FindParam(&r,AugmentedLagrangianREnum);
+-	element->GetVerticesCoordinates(&xyz_list);
+-
+-	/*Get pressure and sigmann*/
+-	Input* pressure_input=element->GetInput(PressureEnum); _assert_(pressure_input);
+-	Input* sigmann_input =element->GetInput(SigmaNNEnum);  _assert_(sigmann_input);
+-
+-	gauss=element->NewGauss(5);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		
+-		pressure_input->GetInputValue(&pressure, gauss);
+-		element->NodalFunctionsDerivativesVelocity(dbasis,xyz_list,gauss);
+-
+-		for(i=0;i<numnodes;i++){
+-			pe->values[i*dim+0] += pressure*gauss->weight*Jdet*dbasis[0*numnodes+i];
+-			pe->values[i*dim+1] += pressure*gauss->weight*Jdet*dbasis[1*numnodes+i];
+-			if(dim==3) pe->values[i*dim+2]+= pressure*gauss->weight*Jdet*dbasis[2*numnodes+i];
+-		}
+-	}
+-
+-	if(element->IsOnBase()){ 
+-		IssmDouble   sigmann;
+-		IssmDouble*  vbasis = xNew<IssmDouble>(numnodes);
+-
+-		element->GetVerticesCoordinatesBase(&xyz_list_base);
+-		element->NormalBase(&bed_normal[0],xyz_list_base);
+-
+-		delete gauss;
+-		gauss=element->NewGaussBase(5);
+-		for(int ig=gauss->begin();ig<gauss->end();ig++){
+-			gauss->GaussPoint(ig);
+-
+-			element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
+-			element->NodalFunctionsVelocity(vbasis,gauss);
+-			sigmann_input->GetInputValue(&sigmann, gauss);
+-
+-			for(i=0;i<numnodes;i++){
+-				pe->values[i*dim+0] += + sigmann*bed_normal[0]*gauss->weight*Jdet*vbasis[i];
+-				pe->values[i*dim+1] += + sigmann*bed_normal[1]*gauss->weight*Jdet*vbasis[i];
+-				if(dim==3) pe->values[i*dim+2] += + sigmann*bed_normal[2]*gauss->weight*Jdet*vbasis[i];
+-			}
+-		}
+-		xDelete<IssmDouble>(xyz_list_base);
+-		xDelete<IssmDouble>(vbasis);
+-	}
+-
+-	/*Transform coordinate system*/
+-	//element->TransformLoadVectorCoord(pe,cs_list); Do not transform augmentation
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-	xDelete<int>(cs_list);
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(dbasis);
+-	return pe;
+-}/*}}}*/
+ ElementVector* StressbalanceAnalysis::CreatePVectorFSShelf(Element* element){/*{{{*/
+ 
+ 	int         i,dim;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18560-18561.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18560-18561.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18560-18561.diff	(revision 19102)
@@ -0,0 +1,37 @@
+Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18560)
++++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18561)
+@@ -3818,7 +3818,7 @@
+ 		}
+ 	}
+ 
+-	if(element->IsOnBase()){ 
++	if(element->IsOnBase() && 0){ 
+ 		IssmDouble   sigmann;
+ 		IssmDouble*  vbasis = xNew<IssmDouble>(numnodes);
+ 
+Index: ../trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp	(revision 18560)
++++ ../trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp	(revision 18561)
+@@ -215,7 +215,7 @@
+ 	element->AddInput(PressureEnum,values,element->GetElementType());
+ 
+ 	/*Now compute sigmann if on base*/
+-	if(element->IsOnBase()){ 
++	if(element->IsOnBase() && 0){ 
+ 		if(dim==3) _error_("not implemented yet");
+ 
+ 		int baselist[3];
+@@ -279,8 +279,9 @@
+ 		xDelete<IssmDouble>(vertexonbase);
+ 		xDelete<IssmDouble>(xyz_list_base);
+ 		xDelete<IssmDouble>(basis);
++
++		element->AddInput(SigmaNNEnum,valueslambda,P2Enum);
+ 	}
+-	element->AddInput(SigmaNNEnum,valueslambda,P2Enum);
+ 
+ 	/*Free ressources:*/
+ 	xDelete<IssmDouble>(values);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18561-18562.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18561-18562.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18561-18562.diff	(revision 19102)
@@ -0,0 +1,32 @@
+Index: ../trunk-jpl/test/NightlyRun/test436.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test436.m	(revision 18561)
++++ ../trunk-jpl/test/NightlyRun/test436.m	(revision 18562)
+@@ -13,7 +13,7 @@
+ 
+ %Fields and tolerances to track changes
+ field_names     ={'Vx','Vy','Vz','Vel','Pressure','Temperature','Water fraction','Enthalpy'};
+-field_tolerances={2e-09,1e-09,1e-09,1e-09,1e-13,1e-10,1e-10,1e-10};
++field_tolerances={2e-09,1e-09,1e-09,1e-09,1e-13,1e-10,1e-10,5e-10};
+ field_values={...
+ 	(md.results.SteadystateSolution.Vx),...
+ 	(md.results.SteadystateSolution.Vy),...
+Index: ../trunk-jpl/test/NightlyRun/test437.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test437.m	(revision 18561)
++++ ../trunk-jpl/test/NightlyRun/test437.m	(revision 18562)
+@@ -48,10 +48,10 @@
+ 						'Enthalpy2','Temperature2','Waterfraction2','BasalMeltingRate2','Watercolumn2',...
+ 						'Enthalpy3','Temperature3','Waterfraction3','BasalMeltingRate3','Watercolumn3',...
+ 						'Enthalpy4','Temperature4','Waterfraction4','BasalMeltingRate4','Watercolumn4'};
+-field_tolerances={1.e-10,1.e-10,1.e-10,1.e-10,1.e-10,...
+-						1.e-10,1.e-10,1.e-10,1.e-10,1.e-10,...
+-						1.e-10,1.e-10,1.e-10,1.e-10,1.e-10,...
+-						1.e-10,1.e-10,1.e-10,1.e-10,1.e-10};
++field_tolerances={1.e-10,1.e-10,1.e-10,1.e-9,1.e-10,...
++						1.e-10,1.e-10,1.e-10,1.e-9,1.e-10,...
++						1.e-10,1.e-10,1.e-10,1.e-9,1.e-10,...
++						1.e-10,1.e-10,1.e-10,1.e-9,1.e-10};
+ i1=1;	i2=ceil(t2/md.timestepping.time_step)+2;	i3=ceil(md.timestepping.final_time/(2.*md.timestepping.time_step));	i4=size(md.results.TransientSolution,2);
+ field_values={...
+ 	(md.results.TransientSolution(i1).Enthalpy),...
Index: /issm/oecreview/Archive/18296-19100/ISSM-18562-18563.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18562-18563.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18562-18563.diff	(revision 19102)
@@ -0,0 +1,52 @@
+Index: ../trunk-jpl/src/m/classes/mesh3dprisms.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mesh3dprisms.m	(revision 18562)
++++ ../trunk-jpl/src/m/classes/mesh3dprisms.m	(revision 18563)
+@@ -47,7 +47,7 @@
+ 			if isstruct(self),
+ 				oldself=self;
+ 				%Assign property values from struct
+-				self=structtoobj(mesh3dprisms(),oldself)
++				self=structtoobj(mesh3dprisms(),oldself);
+ 				if isfield(oldself,'hemisphere'),
+ 					disp('md.mesh.hemisphere has been automatically converted to EPSG code');
+ 					if strcmpi(oldself.hemisphere,'n'),
+Index: ../trunk-jpl/src/m/classes/mesh3dtetras.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mesh3dtetras.m	(revision 18562)
++++ ../trunk-jpl/src/m/classes/mesh3dtetras.m	(revision 18563)
+@@ -47,7 +47,7 @@
+ 			if isstruct(self),
+ 				oldself=self;
+ 				%Assign property values from struct
+-				self=structtoobj(mesh3dtetras(),oldself)
++				self=structtoobj(mesh3dtetras(),oldself);
+ 				if isfield(oldself,'hemisphere'),
+ 					disp('md.mesh.hemisphere has been automatically converted to EPSG code');
+ 					if strcmpi(oldself.hemisphere,'n'),
+Index: ../trunk-jpl/src/m/classes/mesh2dvertical.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mesh2dvertical.m	(revision 18562)
++++ ../trunk-jpl/src/m/classes/mesh2dvertical.m	(revision 18563)
+@@ -36,7 +36,7 @@
+ 			if isstruct(self),
+ 				oldself=self;
+ 				%Assign property values from struct
+-				self=structtoobj(mesh2dvertical(),oldself)
++				self=structtoobj(mesh2dvertical(),oldself);
+ 				if isfield(oldself,'hemisphere'),
+ 					disp('md.mesh.hemisphere has been automatically converted to EPSG code');
+ 					if strcmpi(oldself.hemisphere,'n'),
+Index: ../trunk-jpl/src/m/classes/mesh2d.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mesh2d.m	(revision 18562)
++++ ../trunk-jpl/src/m/classes/mesh2d.m	(revision 18563)
+@@ -37,7 +37,7 @@
+ 			if isstruct(self),
+ 				oldself=self;
+ 				%Assign property values from struct
+-				self=structtoobj(mesh2d(),oldself)
++				self=structtoobj(mesh2d(),oldself);
+ 				if isfield(oldself,'hemisphere'),
+ 					disp('md.mesh.hemisphere has been automatically converted to EPSG code');
+ 					if strcmpi(oldself.hemisphere,'n'),
Index: /issm/oecreview/Archive/18296-19100/ISSM-18563-18564.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18563-18564.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18563-18564.diff	(revision 19102)
@@ -0,0 +1,22 @@
+Index: ../trunk-jpl/src/m/qmu/dakota_out_parse.m
+===================================================================
+--- ../trunk-jpl/src/m/qmu/dakota_out_parse.m	(revision 18563)
++++ ../trunk-jpl/src/m/qmu/dakota_out_parse.m	(revision 18564)
+@@ -218,6 +218,8 @@
+ dmedian=median      (data,1);
+ dquart3=prctile_issm(data,75,1);
+ dmax   =max         (data,[],1);
++dmin95=prctile_issm(data,5,1);
++dmax95=prctile_issm(data,95,1);
+ 
+ %  same as Dakota scm, Excel correl
+ dcorrel=corrcoef(data);
+@@ -236,6 +238,8 @@
+     dresp(i).median    =dmedian(i);
+     dresp(i).quart3    =dquart3(i);
+     dresp(i).max       =dmax(i);
++	 dresp(i).dmin95    =dmin95(i);
++	 dresp(i).dmax95    =dmax95(i);
+ end
+ 
+ %  draw box plot
Index: /issm/oecreview/Archive/18296-19100/ISSM-18564-18565.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18564-18565.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18564-18565.diff	(revision 19102)
@@ -0,0 +1,842 @@
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18564)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18565)
+@@ -44,8 +44,66 @@
+ 	return Ke;
+ }/*}}}*/
+ ElementVector* AdjointBalancethickness2Analysis::CreatePVector(Element* element){/*{{{*/
+-	_error_("Not implemented yet");
+ 
++	/*Intermediaries */
++	int         num_responses,i;
++	IssmDouble  vx,vy,vel,Jdet;
++	IssmDouble  surface,surfaceobs,weight;
++	int        *responses = NULL;
++	IssmDouble *xyz_list  = NULL;
++
++	/*Fetch number of nodes and dof for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++
++	/*Initialize Element vector and vectors*/
++	ElementVector* pe     = element->NewElementVector(SSAApproximationEnum);
++	IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
++	IssmDouble*    dbasis = xNew<IssmDouble>(2*numnodes);
++
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinates(&xyz_list);
++	element->FindParam(&num_responses,InversionNumCostFunctionsEnum);
++	element->FindParam(&responses,NULL,InversionCostFunctionsEnum);
++	Input* surface_input      = element->GetInput(SurfaceEnum);                          _assert_(surface_input);
++	Input* surfaceobs_input   = element->GetInput(InversionSurfaceObsEnum);              _assert_(surfaceobs_input);
++	Input* weights_input      = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
++	Input* vx_input           = element->GetInput(VxEnum);                                 _assert_(vx_input);
++	Input* vy_input           = element->GetInput(VyEnum);                                 _assert_(vy_input);
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGauss(2);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		element->NodalFunctions(basis,gauss);
++		element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
++
++		surface_input->GetInputValue(&surface, gauss);
++		surfaceobs_input->GetInputValue(&surfaceobs, gauss);
++
++		/*Loop over all requested responses*/
++		for(int resp=0;resp<num_responses;resp++){
++			weights_input->GetInputValue(&weight,gauss,responses[resp]);
++
++			switch(responses[resp]){
++				case SurfaceAbsMisfitEnum:
++					for(i=0;i<numnodes;i++) pe->values[i]+=(surfaceobs-surface)*weight*Jdet*gauss->weight*basis[i];
++					break;
++				default:
++					_error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
++			}
++		}
++	}
++
++	/*Clean up and return*/
++	xDelete<int>(responses);
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(basis);
++	xDelete<IssmDouble>(dbasis);
++	delete gauss;
++	return pe;
++
+ }/*}}}*/
+ void AdjointBalancethickness2Analysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	_error_("not implemented yet");
+@@ -70,7 +128,7 @@
+ 
+ 	/*Deal with first part (partial derivative a J with respect to k)*/
+ 	for(resp=0;resp<num_responses;resp++) switch(responses[resp]){
+-		case Balancethickness2MisfitEnum:
++		case SurfaceAbsMisfitEnum:
+ 			/*Nothing, \partial J/\partial k = 0*/
+ 			break;
+ 		default: _error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
+@@ -78,6 +136,7 @@
+ 
+ 	/*Deal with second term*/
+ 	switch(control_type){
++		case BalancethicknessOmegaEnum:  GradientJOmega(element,gradient,control_index); break;
+ 		default: _error_("control type not supported yet: " << EnumToStringx(control_type));
+ 	}
+ 
+@@ -85,10 +144,10 @@
+ 	xDelete<int>(responses);
+ 
+ }/*}}}*/
+-void AdjointBalancethickness2Analysis::GradientJAdot(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++void AdjointBalancethickness2Analysis::GradientJOmega(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+ 	/*Intermediaries*/
+-	IssmDouble lambda,Jdet; 
++	IssmDouble dlambda[2],ds[2],D0,Jdet; 
+ 	IssmDouble *xyz_list= NULL;
+ 
+ 	/*Fetch number of vertices for this finite element*/
+@@ -102,7 +161,9 @@
+ 	/*Retrieve all inputs we will be needing: */
+ 	element->GetVerticesCoordinates(&xyz_list);
+ 	element->GradientIndexing(&vertexpidlist[0],control_index);
+-	Input* adjoint_input = element->GetInput(AdjointEnum); _assert_(adjoint_input);
++	Input* adjoint_input = element->GetInput(AdjointEnum);            _assert_(adjoint_input);
++	Input* s_input       = element->GetInput(SurfaceEnum);            _assert_(s_input);
++	Input* D0_input      = element->GetInput(BalancethicknessD0Enum); _assert_(D0_input);
+ 
+ 	Gauss* gauss=element->NewGauss(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+@@ -110,11 +171,14 @@
+ 
+ 		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+ 		element->NodalFunctionsP1(basis,gauss);
+-		adjoint_input->GetInputValue(&lambda,gauss);
+ 
++		D0_input->GetInputValue(&D0,gauss);
++		adjoint_input->GetInputDerivativeValue(&dlambda[0],xyz_list,gauss);
++		s_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);
++
+ 		/*Build gradient vector (actually -dJ/da): */
+ 		for(int i=0;i<numvertices;i++){
+-			ge[i]+= - Jdet*gauss->weight*basis[i]*lambda;
++			ge[i]+= Jdet*gauss->weight*basis[i]*(ds[0]*dlambda[0] + ds[1]*dlambda[1]);
+ 			_assert_(!xIsNan<IssmDouble>(ge[i]));
+ 		}
+ 	}
+Index: ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.h	(revision 18564)
++++ ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.h	(revision 18565)
+@@ -31,6 +31,6 @@
+ 		void UpdateConstraints(FemModel* femmodel);
+ 
+ 		/*Specifics*/
+-		void CreateDiffusionCoefficient(Element* element);
++		void CreateD0(Element* element);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h	(revision 18564)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h	(revision 18565)
+@@ -27,7 +27,7 @@
+ 		ElementVector* CreatePVector(Element* element);
+ 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+ 		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void GradientJAdot(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void GradientJOmega(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+ 		void UpdateConstraints(FemModel* femmodel);
+ };
+Index: ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18564)
++++ ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18565)
+@@ -15,25 +15,27 @@
+ 	/*Finite element type*/
+ 	int finiteelement = P1Enum;
+ 
++	/*Load variables in element*/
++	iomodel->FetchDataToInput(elements,ThicknessEnum);
++	iomodel->FetchDataToInput(elements,SurfaceEnum);
++	iomodel->FetchDataToInput(elements,BaseEnum);
++	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
++	iomodel->FetchDataToInput(elements,BasalforcingsGroundediceMeltingRateEnum);
++	iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum);
++	iomodel->FetchDataToInput(elements,BalancethicknessThickeningRateEnum);
++	iomodel->FetchDataToInput(elements,BalancethicknessOmegaEnum);
++
+ 	/*Update elements: */
+ 	int counter=0;
+ 	for(int i=0;i<iomodel->numberofelements;i++){
+ 		if(iomodel->my_elements[i]){
+ 			Element* element=(Element*)elements->GetObjectByOffset(counter);
+ 			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
++
+ 			counter++;
+ 		}
+ 	}
+ 
+-	iomodel->FetchDataToInput(elements,ThicknessEnum);
+-	iomodel->FetchDataToInput(elements,SurfaceEnum);
+-	iomodel->FetchDataToInput(elements,BaseEnum);
+-	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
+-	iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
+-	iomodel->FetchDataToInput(elements,BasalforcingsGroundediceMeltingRateEnum);
+-	iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum);
+-	iomodel->FetchDataToInput(elements,BalancethicknessThickeningRateEnum);
+-	iomodel->FetchDataToInput(elements,BalancethicknessCmuEnum);
+ }/*}}}*/
+ void Balancethickness2Analysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 
+@@ -65,7 +67,7 @@
+ ElementMatrix* Balancethickness2Analysis::CreateKMatrix(Element* element){/*{{{*/
+ 
+ 	/*Intermediaries */
+-	IssmDouble  Jdet,D;
++	IssmDouble  Jdet,D0,omega;
+ 	IssmDouble* xyz_list = NULL;
+ 
+ 	/*Fetch number of nodes and dof for this finite element*/
+@@ -75,12 +77,14 @@
+ 	ElementMatrix* Ke     = element->NewElementMatrix();
+ 	IssmDouble*    dbasis = xNew<IssmDouble>(2*numnodes);
+ 
+-	/*Create input D*/
+-	this->CreateDiffusionCoefficient(element);
+-
+ 	/*Retrieve all inputs and parameters*/
+ 	element->GetVerticesCoordinates(&xyz_list);
+-	Input* D_input = element->GetInput(BalancethicknessDiffusionCoefficientEnum); _assert_(D_input);
++	Input* omega_input = element->GetInput(BalancethicknessOmegaEnum); _assert_(omega_input);
++	Input* D0_input    = element->GetInput(BalancethicknessD0Enum);
++	if(!D0_input){
++		this->CreateD0(element);
++		D0_input = element->GetInput(BalancethicknessD0Enum); _assert_(D0_input);
++	}
+ 
+ 	/* Start  looping on the number of gaussian points: */
+ 	Gauss* gauss=element->NewGauss(2);
+@@ -88,11 +92,12 @@
+ 		gauss->GaussPoint(ig);
+ 		element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+ 		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		D_input->GetInputValue(&D,gauss);
++		D0_input->GetInputValue(&D0,gauss);
++		omega_input->GetInputValue(&omega,gauss);
+ 
+ 		for(int i=0;i<numnodes;i++){
+ 			for(int j=0;j<numnodes;j++){
+-				Ke->values[i*numnodes+j] += D*gauss->weight*Jdet*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j]);
++				Ke->values[i*numnodes+j] += D0*omega*gauss->weight*Jdet*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j]);
+ 			}
+ 		}
+ 	}
+@@ -106,7 +111,7 @@
+ ElementVector* Balancethickness2Analysis::CreatePVector(Element* element){/*{{{*/
+ 
+ 	/*Intermediaries */
+-	IssmDouble  dhdt,mb,ms,D,db[2],Jdet;
++	IssmDouble  dhdt,mb,ms,Jdet;
+ 	IssmDouble* xyz_list = NULL;
+ 
+ 	/*Fetch number of nodes and dof for this finite element*/
+@@ -115,15 +120,12 @@
+ 	/*Initialize Element vector and other vectors*/
+ 	ElementVector* pe    = element->NewElementVector();
+ 	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
+-	IssmDouble*   dbasis = xNew<IssmDouble>(2*numnodes);
+ 
+ 	/*Retrieve all inputs and parameters*/
+ 	element->GetVerticesCoordinates(&xyz_list);
+ 	Input* ms_input   = element->GetInput(SurfaceforcingsMassBalanceEnum);                _assert_(ms_input);
+ 	Input* mb_input   = element->GetInput(BasalforcingsGroundediceMeltingRateEnum);       _assert_(mb_input);
+ 	Input* dhdt_input = element->GetInput(BalancethicknessThickeningRateEnum);            _assert_(dhdt_input);
+-	Input* D_input   = element->GetInput(BalancethicknessDiffusionCoefficientEnum);       _assert_(D_input);
+-	Input* bed_input  = element->GetInput(BaseEnum);                                      _assert_(bed_input);
+ 
+ 	/* Start  looping on the number of gaussian points: */
+ 	Gauss* gauss=element->NewGauss(2);
+@@ -132,19 +134,13 @@
+ 
+ 		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+ 		element->NodalFunctions(basis,gauss);
+-		element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+ 
+ 		ms_input->GetInputValue(&ms,gauss);
+ 		mb_input->GetInputValue(&mb,gauss);
+ 		dhdt_input->GetInputValue(&dhdt,gauss);
+-		D_input->GetInputValue(&D,gauss);
+-		bed_input->GetInputDerivativeValue(&db[0],xyz_list,gauss);
+-		//db[0]=0.;
+-		//db[1]=0.;
+ 
+ 		for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(
+ 					(ms-mb-dhdt)*basis[i]
+-					//-D*db[0]*dbasis[0*numnodes+i] - D*db[1]*dbasis[1*numnodes+i]
+ 					);
+ 	}
+ 
+@@ -219,7 +215,7 @@
+ }/*}}}*/
+ 
+ /*Specifics*/
+-void Balancethickness2Analysis::CreateDiffusionCoefficient(Element* element){/*{{{*/
++void Balancethickness2Analysis::CreateD0(Element* element){/*{{{*/
+ 
+ 	/*Intermediaries */
+ 	IssmDouble       Gamma,h,mu0,ds[2],Cmu,B,k,s,b;
+@@ -230,16 +226,12 @@
+ 
+ 	/*Fetch number of vertices and allocate output*/
+ 	int  numnodes = element->GetNumberOfNodes();
+-	IssmDouble* D      = xNew<IssmDouble>(numnodes);
+-	IssmDouble* Dgradb = xNew<IssmDouble>(numnodes);
++	IssmDouble* D0     = xNew<IssmDouble>(numnodes);
+ 
+ 	/*retrieve what we need: */
+ 	element->GetVerticesCoordinates(&xyz_list);
+-	Input* bed_input        = element->GetInput(BaseEnum);               _assert_(bed_input);
+ 	Input* surface_input    = element->GetInput(SurfaceEnum);            _assert_(surface_input);
+ 	Input* B_input          = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);
+-	Input* k_input          = element->GetInput(FrictionCoefficientEnum);_assert_(k_input);
+-	Input* Cmu_input        = element->GetInput(BalancethicknessCmuEnum);_assert_(Cmu_input);
+ 	IssmDouble rhog = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum);
+ 
+ 	/*Calculate damage evolution source term: */
+@@ -248,25 +240,18 @@
+ 		gauss->GaussNode(element->GetElementType(),i);
+ 		
+ 		B_input->GetInputValue(&B,gauss);
+-		k_input->GetInputValue(&k,gauss);
+-		//thickness_input->GetInputValue(&h,gauss);
+ 		surface_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);
+-		surface_input->GetInputValue(&s,gauss);
+-		bed_input->GetInputValue(&b,gauss);
+-		h = s-b;
+ 
+ 		mu0   = pow(2.,(1-3*n)/(2.*n)) * B;
+ 		Gamma = pow(rhog,n) * pow(Hstar,2*(n+1)) * pow(Hstar/Lstar,2*(n+1)) * 1./pow(mu0,n);
+-		//Cmu   = pow(mu0,n)/Hstar/(k*k);
+-		Cmu_input->GetInputValue(&Cmu,gauss);
+ 
+-		D[i] = Gamma*pow(ds[0]*ds[0]+ds[1]*ds[1],(n-1)/2)*pow(h,n+1)*(1./(n+2.)*h + Cmu);
++		D0[i] = Gamma*pow(ds[0]*ds[0]+ds[1]*ds[1],(n-1)/2)/(n+2);
+ 	}
+ 
+ 	/*Add input*/
+-	element->AddInput(BalancethicknessDiffusionCoefficientEnum,D,element->GetElementType());
++	element->AddInput(BalancethicknessD0Enum,D0,element->GetElementType());
+ 	
+ 	/*Clean up and return*/
+-	xDelete<IssmDouble>(D);
++	xDelete<IssmDouble>(D0);
+ 	delete gauss;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18564)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18565)
+@@ -164,6 +164,7 @@
+ 	InversionNumCostFunctionsEnum,
+ 	InversionStepThresholdEnum,
+ 	InversionThicknessObsEnum,
++	InversionSurfaceObsEnum,
+ 	InversionVxObsEnum,
+ 	InversionVyObsEnum,
+ 	InversionVzObsEnum,
+@@ -306,6 +307,8 @@
+ 	Balancethickness2MisfitEnum,
+ 	BalancethicknessDiffusionCoefficientEnum,
+ 	BalancethicknessCmuEnum,
++	BalancethicknessOmegaEnum,
++	BalancethicknessD0Enum,
+ 	/*}}}*/
+ 	/*Surfaceforcings{{{*/
+ 	SurfaceforcingsEnum,
+@@ -526,6 +529,7 @@
+ 	TemperatureEnum,
+ 	TemperaturePicardEnum,
+ 	ThicknessAbsMisfitEnum,
++	SurfaceAbsMisfitEnum,
+ 	VelEnum,
+ 	VelocityEnum,
+ 	VxAverageEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18564)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18565)
+@@ -172,6 +172,7 @@
+ 		case InversionNumCostFunctionsEnum : return "InversionNumCostFunctions";
+ 		case InversionStepThresholdEnum : return "InversionStepThreshold";
+ 		case InversionThicknessObsEnum : return "InversionThicknessObs";
++		case InversionSurfaceObsEnum : return "InversionSurfaceObs";
+ 		case InversionVxObsEnum : return "InversionVxObs";
+ 		case InversionVyObsEnum : return "InversionVyObs";
+ 		case InversionVzObsEnum : return "InversionVzObs";
+@@ -314,6 +315,8 @@
+ 		case Balancethickness2MisfitEnum : return "Balancethickness2Misfit";
+ 		case BalancethicknessDiffusionCoefficientEnum : return "BalancethicknessDiffusionCoefficient";
+ 		case BalancethicknessCmuEnum : return "BalancethicknessCmu";
++		case BalancethicknessOmegaEnum : return "BalancethicknessOmega";
++		case BalancethicknessD0Enum : return "BalancethicknessD0";
+ 		case SurfaceforcingsEnum : return "Surfaceforcings";
+ 		case SMBEnum : return "SMB";
+ 		case SurfaceforcingsMassBalanceEnum : return "SurfaceforcingsMassBalance";
+@@ -517,6 +520,7 @@
+ 		case TemperatureEnum : return "Temperature";
+ 		case TemperaturePicardEnum : return "TemperaturePicard";
+ 		case ThicknessAbsMisfitEnum : return "ThicknessAbsMisfit";
++		case SurfaceAbsMisfitEnum : return "SurfaceAbsMisfit";
+ 		case VelEnum : return "Vel";
+ 		case VelocityEnum : return "Velocity";
+ 		case VxAverageEnum : return "VxAverage";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18564)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18565)
+@@ -175,6 +175,7 @@
+ 	      else if (strcmp(name,"InversionNumCostFunctions")==0) return InversionNumCostFunctionsEnum;
+ 	      else if (strcmp(name,"InversionStepThreshold")==0) return InversionStepThresholdEnum;
+ 	      else if (strcmp(name,"InversionThicknessObs")==0) return InversionThicknessObsEnum;
++	      else if (strcmp(name,"InversionSurfaceObs")==0) return InversionSurfaceObsEnum;
+ 	      else if (strcmp(name,"InversionVxObs")==0) return InversionVxObsEnum;
+ 	      else if (strcmp(name,"InversionVyObs")==0) return InversionVyObsEnum;
+ 	      else if (strcmp(name,"InversionVzObs")==0) return InversionVzObsEnum;
+@@ -258,11 +259,11 @@
+ 	      else if (strcmp(name,"MasstransportRequestedOutputs")==0) return MasstransportRequestedOutputsEnum;
+ 	      else if (strcmp(name,"QmuIsdakota")==0) return QmuIsdakotaEnum;
+ 	      else if (strcmp(name,"MassFluxSegments")==0) return MassFluxSegmentsEnum;
+-	      else if (strcmp(name,"MassFluxSegmentsPresent")==0) return MassFluxSegmentsPresentEnum;
+          else stage=3;
+    }
+    if(stage==3){
+-	      if (strcmp(name,"QmuMassFluxSegmentsPresent")==0) return QmuMassFluxSegmentsPresentEnum;
++	      if (strcmp(name,"MassFluxSegmentsPresent")==0) return MassFluxSegmentsPresentEnum;
++	      else if (strcmp(name,"QmuMassFluxSegmentsPresent")==0) return QmuMassFluxSegmentsPresentEnum;
+ 	      else if (strcmp(name,"QmuNumberofpartitions")==0) return QmuNumberofpartitionsEnum;
+ 	      else if (strcmp(name,"QmuNumberofresponses")==0) return QmuNumberofresponsesEnum;
+ 	      else if (strcmp(name,"QmuPartition")==0) return QmuPartitionEnum;
+@@ -320,6 +321,8 @@
+ 	      else if (strcmp(name,"Balancethickness2Misfit")==0) return Balancethickness2MisfitEnum;
+ 	      else if (strcmp(name,"BalancethicknessDiffusionCoefficient")==0) return BalancethicknessDiffusionCoefficientEnum;
+ 	      else if (strcmp(name,"BalancethicknessCmu")==0) return BalancethicknessCmuEnum;
++	      else if (strcmp(name,"BalancethicknessOmega")==0) return BalancethicknessOmegaEnum;
++	      else if (strcmp(name,"BalancethicknessD0")==0) return BalancethicknessD0Enum;
+ 	      else if (strcmp(name,"Surfaceforcings")==0) return SurfaceforcingsEnum;
+ 	      else if (strcmp(name,"SMB")==0) return SMBEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsMassBalance")==0) return SurfaceforcingsMassBalanceEnum;
+@@ -379,13 +382,13 @@
+ 	      else if (strcmp(name,"FlaimSolution")==0) return FlaimSolutionEnum;
+ 	      else if (strcmp(name,"HydrologyShreveAnalysis")==0) return HydrologyShreveAnalysisEnum;
+ 	      else if (strcmp(name,"HydrologyDCInefficientAnalysis")==0) return HydrologyDCInefficientAnalysisEnum;
+-	      else if (strcmp(name,"HydrologyDCEfficientAnalysis")==0) return HydrologyDCEfficientAnalysisEnum;
+-	      else if (strcmp(name,"HydrologySolution")==0) return HydrologySolutionEnum;
+-	      else if (strcmp(name,"MeltingAnalysis")==0) return MeltingAnalysisEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"MasstransportAnalysis")==0) return MasstransportAnalysisEnum;
++	      if (strcmp(name,"HydrologyDCEfficientAnalysis")==0) return HydrologyDCEfficientAnalysisEnum;
++	      else if (strcmp(name,"HydrologySolution")==0) return HydrologySolutionEnum;
++	      else if (strcmp(name,"MeltingAnalysis")==0) return MeltingAnalysisEnum;
++	      else if (strcmp(name,"MasstransportAnalysis")==0) return MasstransportAnalysisEnum;
+ 	      else if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum;
+ 	      else if (strcmp(name,"FreeSurfaceBaseAnalysis")==0) return FreeSurfaceBaseAnalysisEnum;
+ 	      else if (strcmp(name,"FreeSurfaceTopAnalysis")==0) return FreeSurfaceTopAnalysisEnum;
+@@ -502,13 +505,13 @@
+ 	      else if (strcmp(name,"BedSlopeX")==0) return BedSlopeXEnum;
+ 	      else if (strcmp(name,"BedSlopeY")==0) return BedSlopeYEnum;
+ 	      else if (strcmp(name,"Boundary")==0) return BoundaryEnum;
+-	      else if (strcmp(name,"Converged")==0) return ConvergedEnum;
+-	      else if (strcmp(name,"Fill")==0) return FillEnum;
+-	      else if (strcmp(name,"FractionIncrement")==0) return FractionIncrementEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"Friction")==0) return FrictionEnum;
++	      if (strcmp(name,"Converged")==0) return ConvergedEnum;
++	      else if (strcmp(name,"Fill")==0) return FillEnum;
++	      else if (strcmp(name,"FractionIncrement")==0) return FractionIncrementEnum;
++	      else if (strcmp(name,"Friction")==0) return FrictionEnum;
+ 	      else if (strcmp(name,"Internal")==0) return InternalEnum;
+ 	      else if (strcmp(name,"MassFlux")==0) return MassFluxEnum;
+ 	      else if (strcmp(name,"MeltingOffset")==0) return MeltingOffsetEnum;
+@@ -529,6 +532,7 @@
+ 	      else if (strcmp(name,"Temperature")==0) return TemperatureEnum;
+ 	      else if (strcmp(name,"TemperaturePicard")==0) return TemperaturePicardEnum;
+ 	      else if (strcmp(name,"ThicknessAbsMisfit")==0) return ThicknessAbsMisfitEnum;
++	      else if (strcmp(name,"SurfaceAbsMisfit")==0) return SurfaceAbsMisfitEnum;
+ 	      else if (strcmp(name,"Vel")==0) return VelEnum;
+ 	      else if (strcmp(name,"Velocity")==0) return VelocityEnum;
+ 	      else if (strcmp(name,"VxAverage")==0) return VxAverageEnum;
+@@ -624,14 +628,14 @@
+ 	      else if (strcmp(name,"OutputdefinitionList")==0) return OutputdefinitionListEnum;
+ 	      else if (strcmp(name,"Massfluxatgate")==0) return MassfluxatgateEnum;
+ 	      else if (strcmp(name,"MassfluxatgateName")==0) return MassfluxatgateNameEnum;
+-	      else if (strcmp(name,"MassfluxatgateSegments")==0) return MassfluxatgateSegmentsEnum;
++         else stage=6;
++   }
++   if(stage==6){
++	      if (strcmp(name,"MassfluxatgateSegments")==0) return MassfluxatgateSegmentsEnum;
+ 	      else if (strcmp(name,"MisfitName")==0) return MisfitNameEnum;
+ 	      else if (strcmp(name,"MisfitModelEnum")==0) return MisfitModelEnumEnum;
+ 	      else if (strcmp(name,"MisfitObservation")==0) return MisfitObservationEnum;
+-         else stage=6;
+-   }
+-   if(stage==6){
+-	      if (strcmp(name,"MisfitObservationEnum")==0) return MisfitObservationEnumEnum;
++	      else if (strcmp(name,"MisfitObservationEnum")==0) return MisfitObservationEnumEnum;
+ 	      else if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
+ 	      else if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
+ 	      else if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
+@@ -747,14 +751,14 @@
+ 	      else if (strcmp(name,"SurfaceforcingsAirLinDragCoef")==0) return SurfaceforcingsAirLinDragCoefEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsAirQuadDragCoef")==0) return SurfaceforcingsAirQuadDragCoefEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsWindVx")==0) return SurfaceforcingsWindVxEnum;
+-	      else if (strcmp(name,"SurfaceforcingsWindVy")==0) return SurfaceforcingsWindVyEnum;
++         else stage=7;
++   }
++   if(stage==7){
++	      if (strcmp(name,"SurfaceforcingsWindVy")==0) return SurfaceforcingsWindVyEnum;
+ 	      else if (strcmp(name,"Matseaice")==0) return MatseaiceEnum;
+ 	      else if (strcmp(name,"MaterialsPoisson")==0) return MaterialsPoissonEnum;
+ 	      else if (strcmp(name,"MaterialsYoungModulus")==0) return MaterialsYoungModulusEnum;
+-         else stage=7;
+-   }
+-   if(stage==7){
+-	      if (strcmp(name,"MaterialsTimeRelaxationStress")==0) return MaterialsTimeRelaxationStressEnum;
++	      else if (strcmp(name,"MaterialsTimeRelaxationStress")==0) return MaterialsTimeRelaxationStressEnum;
+ 	      else if (strcmp(name,"MaterialsTimeRelaxationDamage")==0) return MaterialsTimeRelaxationDamageEnum;
+ 	      else if (strcmp(name,"MaterialsRidgingExponent")==0) return MaterialsRidgingExponentEnum;
+ 	      else if (strcmp(name,"MaterialsCohesion")==0) return MaterialsCohesionEnum;
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 18564)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 18565)
+@@ -28,6 +28,7 @@
+ 	iomodel->FetchDataToInput(elements,InversionVxObsEnum,0.);
+ 	iomodel->FetchDataToInput(elements,InversionVyObsEnum,0.); 
+ 	iomodel->FetchDataToInput(elements,InversionThicknessObsEnum,0.);
++	iomodel->FetchDataToInput(elements,InversionSurfaceObsEnum,0.);
+ 
+ 	iomodel->FetchData(5,InversionControlParametersEnum,InversionCostFunctionsEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum);
+ 
+@@ -41,6 +42,7 @@
+ 			case ThicknessEnum:
+ 			case FrictionCoefficientEnum:
+ 			case BalancethicknessApparentMassbalanceEnum:
++			case BalancethicknessOmegaEnum:
+ 				iomodel->FetchData(1,control); 
+ 				break;
+ 
+Index: ../trunk-jpl/src/c/cores/balancethickness2_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/balancethickness2_core.cpp	(revision 18564)
++++ ../trunk-jpl/src/c/cores/balancethickness2_core.cpp	(revision 18565)
+@@ -21,14 +21,13 @@
+ 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+ 
+ 	if(VerboseSolution()) _printf0_("call computational core:\n");
+-	//solutionsequence_linear(femmodel);
+-	solutionsequence_nonlinear(femmodel,false);
++	solutionsequence_linear(femmodel);
++	//solutionsequence_nonlinear(femmodel,false);
+ 
+ 	if(save_results){
+ 		if(VerboseSolution()) _printf0_("   saving results\n");
+-		const int numoutputs = 5;
+-		//int outputs[numoutputs] = {ThicknessEnum};
+-		int outputs[numoutputs] = {SurfaceEnum,VxEnum,VyEnum,VelEnum,BalancethicknessDiffusionCoefficientEnum};
++		const int numoutputs = 4;
++		int outputs[numoutputs] = {SurfaceEnum,VxEnum,VyEnum,VelEnum};
+ 		femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],numoutputs);
+ 	}
+ 
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18564)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18565)
+@@ -640,7 +640,6 @@
+ 		case RheologyBbarAbsGradientEnum:  RheologyBbarAbsGradientx(responses, elements,nodes, vertices, loads, materials, parameters); break;
+ 		case DragCoefficientAbsGradientEnum:DragCoefficientAbsGradientx(responses, elements,nodes, vertices, loads, materials, parameters); break;
+ 		case BalancethicknessMisfitEnum:   BalancethicknessMisfitx(responses); break;
+-		case Balancethickness2MisfitEnum:  Balancethickness2Misfitx(responses); break;
+ 		case TotalSmbEnum:					  this->TotalSmbx(responses); break;
+ 		case MaterialsRheologyBbarEnum:    this->ElementResponsex(responses,MaterialsRheologyBbarEnum); break;
+ 		case VelEnum:                      this->ElementResponsex(responses,VelEnum); break;
+@@ -718,7 +717,7 @@
+ 				case RheologyBbarAbsGradientEnum:   RheologyBbarAbsGradientx(&double_result,elements,nodes,vertices,loads,materials,parameters);    break;
+ 				case DragCoefficientAbsGradientEnum:DragCoefficientAbsGradientx(&double_result,elements,nodes,vertices,loads,materials,parameters); break;
+ 				case BalancethicknessMisfitEnum:    BalancethicknessMisfitx(&double_result);                                                        break;
+-				case Balancethickness2MisfitEnum:   Balancethickness2Misfitx(&double_result); break;
++				case SurfaceAbsMisfitEnum:          SurfaceAbsMisfitx(&double_result); break;
+ 
+ 			   /*Vector */
+ 				default:
+@@ -1443,14 +1442,13 @@
+ 	*presponse=J;
+ 
+ }/*}}}*/
+-void FemModel::Balancethickness2Misfitx(IssmDouble* presponse){/*{{{*/
++void FemModel::SurfaceAbsMisfitx(IssmDouble* presponse){/*{{{*/
+ 
+ 	/*output: */
+ 	IssmDouble J=0.;
+ 	IssmDouble J_sum;
+ 
+-	IssmDouble  weight,thicknessobs,thickness,potential,dpotential[2];
+-	IssmDouble  vx,vy,vxbar,vybar,vxobs,vyobs,vxbarobs,vybarobs,nu;
++	IssmDouble  surface,surfaceobs,weight;
+ 	IssmDouble  Jdet;
+ 	IssmDouble* xyz_list = NULL;
+ 
+@@ -1460,8 +1458,33 @@
+ 
+ 		/*If on water, return 0: */
+ 		if(!element->IsIceInElement()) continue;
+-		 _error_("Not implemented");
+ 
++		/* Get node coordinates*/
++		element->GetVerticesCoordinates(&xyz_list);
++
++		 /*Retrieve all inputs we will be needing: */
++		 Input* weights_input   =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
++		 Input* surface_input   =element->GetInput(SurfaceEnum);                            _assert_(surface_input);
++		 Input* surfaceobs_input=element->GetInput(InversionSurfaceObsEnum);                _assert_(surfaceobs_input);
++
++		 /* Start  looping on the number of gaussian points: */
++		 Gauss* gauss=element->NewGauss(2);
++		 for(int ig=gauss->begin();ig<gauss->end();ig++){
++
++			 gauss->GaussPoint(ig);
++
++			 /* Get Jacobian determinant: */
++			 element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++
++			 /*Get all parameters at gaussian point*/
++			 weights_input->GetInputValue(&weight,gauss,SurfaceAbsMisfitEnum);
++			 surface_input->GetInputValue(&surface,gauss);
++			 surfaceobs_input->GetInputValue(&surfaceobs,gauss);
++
++			 /*Compute SurfaceAbsMisfitEnum*/
++			 J+=0.5*(surface-surfaceobs)*(surface-surfaceobs)*weight*Jdet*gauss->weight;
++		 }
++
+ 	}
+ 
+ 	/*Sum all J from all cpus of the cluster:*/
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18564)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18565)
+@@ -1033,6 +1033,7 @@
+ 
+ 				/*No yts conversion*/
+ 				case ThicknessEnum:
++				case BalancethicknessOmegaEnum:
+ 				case FrictionCoefficientEnum:
+ 					if(iomodel->Data(control)){
+ 						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data(control)[tria_vertex_ids[j]-1];
+Index: ../trunk-jpl/src/c/classes/FemModel.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.h	(revision 18564)
++++ ../trunk-jpl/src/c/classes/FemModel.h	(revision 18565)
+@@ -80,7 +80,6 @@
+ 		void IceVolumeAboveFloatationx(IssmDouble* pV);
+ 		void ElementResponsex(IssmDouble* presponse,int response_enum);
+ 		void BalancethicknessMisfitx(IssmDouble* pV);
+-		void Balancethickness2Misfitx(IssmDouble* pV);
+ 		#ifdef  _HAVE_DAKOTA_
+ 		void DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses);
+ 		#endif
+@@ -92,6 +91,7 @@
+ 		void OutputControlsx(Results **presults);
+ 		void CostFunctionx(IssmDouble* pJ,IssmDouble** pJlist,int* pn);
+ 		void ThicknessAbsGradientx( IssmDouble* pJ);
++		void SurfaceAbsMisfitx( IssmDouble* pJ);
+ 		#ifdef _HAVE_GIA_
+ 		void Deflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt, IssmDouble* x, IssmDouble* y);
+ 		#endif
+Index: ../trunk-jpl/src/m/classes/balancethickness.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/balancethickness.m	(revision 18564)
++++ ../trunk-jpl/src/m/classes/balancethickness.m	(revision 18565)
+@@ -9,7 +9,7 @@
+ 		thickening_rate   = NaN;
+ 		stabilization     = 0;
+ 
+-		Cmu               = NaN;
++		omega             = NaN;
+ 	end
+ 	methods
+ 		function obj = balancethickness(varargin) % {{{
+@@ -34,7 +34,7 @@
+ 			md = checkfield(md,'fieldname','balancethickness.thickening_rate','size',[md.mesh.numberofvertices 1],'NaN',1);
+ 			md = checkfield(md,'fieldname','balancethickness.stabilization','size',[1 1],'values',[0 1 2 3]);
+ 
+-			%md = checkfield(md,'fieldname','balancethickness.Cmu','size',[md.mesh.numberofvertices 1],'NaN',1,'>=',0);
++			%md = checkfield(md,'fieldname','balancethickness.omega','size',[md.mesh.numberofvertices 1],'NaN',1,'>=',0);
+ 		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   balance thickness solution parameters:'));
+@@ -52,7 +52,7 @@
+ 			WriteData(fid,'object',obj,'fieldname','thickening_rate','format','DoubleMat','mattype',1,'scale',1./yts);
+ 			WriteData(fid,'object',obj,'fieldname','stabilization','format','Integer');
+ 
+-			WriteData(fid,'object',obj,'fieldname','Cmu','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'fieldname','omega','format','DoubleMat','mattype',1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/m1qn3inversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 18564)
++++ ../trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 18565)
+@@ -21,6 +21,7 @@
+ 		vz_obs                      = NaN
+ 		vel_obs                     = NaN
+ 		thickness_obs               = NaN
++		surface_obs               = NaN
+ 
+ 	end
+ 	methods
+@@ -71,7 +72,7 @@
+ 			md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0 1]);
+ 			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',...
+ 				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'DamageDbar',...
+-				'Vx' 'Vy' 'Thickness' 'BalancethicknessNu' 'BalancethicknessApparentMassbalance'});
++				'Vx' 'Vy' 'Thickness' 'BalancethicknessOmega' 'BalancethicknessApparentMassbalance'});
+ 			md = checkfield(md,'fieldname','inversion.maxsteps','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.maxiter','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.dxmin','numel',1,'>',0);
+@@ -83,6 +84,7 @@
+ 
+ 			if solution==BalancethicknessSolutionEnum()
+ 				md = checkfield(md,'fieldname','inversion.thickness_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
++				md = checkfield(md,'fieldname','inversion.surface_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
+ 			elseif solution==BalancethicknessSoftSolutionEnum()
+ 				md = checkfield(md,'fieldname','inversion.thickness_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
+ 			else
+@@ -109,6 +111,7 @@
+ 			fielddisplay(obj,'vy_obs','observed velocity y component [m/yr]');
+ 			fielddisplay(obj,'vel_obs','observed velocity magnitude [m/yr]');
+ 			fielddisplay(obj,'thickness_obs','observed thickness [m]');
++			fielddisplay(obj,'surface_obs','observed surface elevation [m]');
+ 			disp('Available cost functions:');
+ 			disp('   101: SurfaceAbsVelMisfit');
+ 			disp('   102: SurfaceRelVelMisfit');
+@@ -144,6 +147,7 @@
+ 				mattype=1;
+ 			end
+ 			WriteData(fid,'object',obj,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',mattype);
++			WriteData(fid,'object',obj,'class','inversion','fieldname','surface_obs','format','DoubleMat','mattype',mattype);
+ 
+ 			%process control parameters
+ 			num_control_parameters=numel(obj.control_parameters);
+@@ -169,6 +173,7 @@
+ 			pos=find(obj.cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
+ 			pos=find(obj.cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
+ 			pos=find(obj.cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
++			pos=find(obj.cost_functions==601); data(pos)=SurfaceAbsMisfitEnum();
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/enum/InversionSurfaceObsEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/InversionSurfaceObsEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/InversionSurfaceObsEnum.m	(revision 18565)
+@@ -0,0 +1,11 @@
++function macro=InversionSurfaceObsEnum()
++%INVERSIONSURFACEOBSENUM - Enum of InversionSurfaceObs
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=InversionSurfaceObsEnum()
++
++macro=StringToEnum('InversionSurfaceObs');
+Index: ../trunk-jpl/src/m/enum/SurfaceAbsMisfitEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceAbsMisfitEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SurfaceAbsMisfitEnum.m	(revision 18565)
+@@ -0,0 +1,11 @@
++function macro=SurfaceAbsMisfitEnum()
++%SURFACEABSMISFITENUM - Enum of SurfaceAbsMisfit
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SurfaceAbsMisfitEnum()
++
++macro=StringToEnum('SurfaceAbsMisfit');
+Index: ../trunk-jpl/src/m/enum/BalancethicknessOmegaEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BalancethicknessOmegaEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/BalancethicknessOmegaEnum.m	(revision 18565)
+@@ -0,0 +1,11 @@
++function macro=BalancethicknessOmegaEnum()
++%BALANCETHICKNESSOMEGAENUM - Enum of BalancethicknessOmega
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=BalancethicknessOmegaEnum()
++
++macro=StringToEnum('BalancethicknessOmega');
+Index: ../trunk-jpl/src/m/enum/BalancethicknessD0Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BalancethicknessD0Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/BalancethicknessD0Enum.m	(revision 18565)
+@@ -0,0 +1,11 @@
++function macro=BalancethicknessD0Enum()
++%BALANCETHICKNESSD0ENUM - Enum of BalancethicknessD0
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=BalancethicknessD0Enum()
++
++macro=StringToEnum('BalancethicknessD0');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18564)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18565)
+@@ -164,6 +164,7 @@
+ def InversionNumCostFunctionsEnum(): return StringToEnum("InversionNumCostFunctions")[0]
+ def InversionStepThresholdEnum(): return StringToEnum("InversionStepThreshold")[0]
+ def InversionThicknessObsEnum(): return StringToEnum("InversionThicknessObs")[0]
++def InversionSurfaceObsEnum(): return StringToEnum("InversionSurfaceObs")[0]
+ def InversionVxObsEnum(): return StringToEnum("InversionVxObs")[0]
+ def InversionVyObsEnum(): return StringToEnum("InversionVyObs")[0]
+ def InversionVzObsEnum(): return StringToEnum("InversionVzObs")[0]
+@@ -306,6 +307,8 @@
+ def Balancethickness2MisfitEnum(): return StringToEnum("Balancethickness2Misfit")[0]
+ def BalancethicknessDiffusionCoefficientEnum(): return StringToEnum("BalancethicknessDiffusionCoefficient")[0]
+ def BalancethicknessCmuEnum(): return StringToEnum("BalancethicknessCmu")[0]
++def BalancethicknessOmegaEnum(): return StringToEnum("BalancethicknessOmega")[0]
++def BalancethicknessD0Enum(): return StringToEnum("BalancethicknessD0")[0]
+ def SurfaceforcingsEnum(): return StringToEnum("Surfaceforcings")[0]
+ def SMBEnum(): return StringToEnum("SMB")[0]
+ def SurfaceforcingsMassBalanceEnum(): return StringToEnum("SurfaceforcingsMassBalance")[0]
+@@ -509,6 +512,7 @@
+ def TemperatureEnum(): return StringToEnum("Temperature")[0]
+ def TemperaturePicardEnum(): return StringToEnum("TemperaturePicard")[0]
+ def ThicknessAbsMisfitEnum(): return StringToEnum("ThicknessAbsMisfit")[0]
++def SurfaceAbsMisfitEnum(): return StringToEnum("SurfaceAbsMisfit")[0]
+ def VelEnum(): return StringToEnum("Vel")[0]
+ def VelocityEnum(): return StringToEnum("Velocity")[0]
+ def VxAverageEnum(): return StringToEnum("VxAverage")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18565-18566.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18565-18566.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18565-18566.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18565)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18566)
+@@ -1052,6 +1052,7 @@
+ 				name==BaseEnum ||
+ 				name==BedEnum ||
+ 				name==BalancethicknessThickeningRateEnum ||
++				name==BalancethicknessOmegaEnum ||
+ 				name==SigmaNNEnum ||
+ 				name==SurfaceSlopeXEnum ||
+ 				name==SurfaceSlopeYEnum ||
Index: /issm/oecreview/Archive/18296-19100/ISSM-18566-18567.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18566-18567.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18566-18567.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18566)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18567)
+@@ -178,7 +178,7 @@
+ 
+ 		/*Build gradient vector (actually -dJ/da): */
+ 		for(int i=0;i<numvertices;i++){
+-			ge[i]+= Jdet*gauss->weight*basis[i]*(ds[0]*dlambda[0] + ds[1]*dlambda[1]);
++			ge[i]+= -Jdet*gauss->weight*basis[i]*D0*(ds[0]*dlambda[0] + ds[1]*dlambda[1]);
+ 			_assert_(!xIsNan<IssmDouble>(ge[i]));
+ 		}
+ 	}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18567-18568.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18567-18568.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18567-18568.diff	(revision 19102)
@@ -0,0 +1,20 @@
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 18567)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 18568)
+@@ -22,13 +22,13 @@
+ 	if(control_analysis) iomodel->Constant(&num_control_type,InversionNumControlParametersEnum);
+ 
+ 	/*Now, return if no control*/
+-	if (!control_analysis) return;
++	if(!control_analysis) return;
+ 
+ 	/*Fetch data needed: */
+ 	iomodel->FetchDataToInput(elements,InversionVxObsEnum,0.);
+ 	iomodel->FetchDataToInput(elements,InversionVyObsEnum,0.); 
+ 	iomodel->FetchDataToInput(elements,InversionThicknessObsEnum,0.);
+-	iomodel->FetchDataToInput(elements,InversionSurfaceObsEnum,0.);
++	//iomodel->FetchDataToInput(elements,InversionSurfaceObsEnum,0.);
+ 
+ 	iomodel->FetchData(5,InversionControlParametersEnum,InversionCostFunctionsEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum);
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18568-18569.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18568-18569.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18568-18569.diff	(revision 19102)
@@ -0,0 +1,57 @@
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18568)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18569)
+@@ -136,7 +136,8 @@
+ 
+ 	/*Deal with second term*/
+ 	switch(control_type){
+-		case BalancethicknessOmegaEnum:  GradientJOmega(element,gradient,control_index); break;
++		case BalancethicknessOmegaEnum:           GradientJOmega(element,gradient,control_index); break;
++		case BalancethicknessThickeningRateEnum:  GradientJdHdt( element,gradient,control_index); break;
+ 		default: _error_("control type not supported yet: " << EnumToStringx(control_type));
+ 	}
+ 
+@@ -191,6 +192,30 @@
+ 	xDelete<int>(vertexpidlist);
+ 	delete gauss;
+ }/*}}}*/
++void AdjointBalancethickness2Analysis::GradientJdHdt(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++
++	/*Fetch number of vertices for this finite element*/
++	int numvertices = element->GetNumberOfVertices();
++
++	/*Initialize some vectors*/
++	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
++	IssmDouble* lambda        = xNew<IssmDouble>(numvertices);
++	int*        vertexpidlist = xNew<int>(numvertices);
++
++	/*Retrieve all inputs we will be needing: */
++	element->GradientIndexing(&vertexpidlist[0],control_index);
++	element->GetInputListOnVertices(lambda,AdjointEnum);
++	for(int i=0;i<numvertices;i++){
++		ge[i]= - lambda[i];
++		_assert_(!xIsNan<IssmDouble>(ge[i]));
++	}
++	gradient->SetValues(numvertices,vertexpidlist,ge,INS_VAL);
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(ge);
++	xDelete<IssmDouble>(lambda);
++	xDelete<int>(vertexpidlist);
++}/*}}}*/
+ void AdjointBalancethickness2Analysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 	element->InputUpdateFromSolutionOneDof(solution,AdjointEnum);
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h	(revision 18568)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h	(revision 18569)
+@@ -28,6 +28,7 @@
+ 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+ 		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+ 		void GradientJOmega(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void GradientJdHdt(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+ 		void UpdateConstraints(FemModel* femmodel);
+ };
Index: /issm/oecreview/Archive/18296-19100/ISSM-18569-18570.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18569-18570.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18569-18570.diff	(revision 19102)
@@ -0,0 +1,85 @@
+Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18569)
++++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18570)
+@@ -247,7 +247,6 @@
+ 	/*LATH parameters*/
+ 	iomodel->Constant(&fe_FS,FlowequationFeFSEnum);
+ 	if(fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum){
+-		iomodel->FetchDataToInput(elements,PressureEnum,0.);
+ 		InputUpdateFromConstantx(elements,0.,SigmaNNEnum);
+ 	}
+ 
+@@ -3028,6 +3027,11 @@
+ 					BtBUzawa,1);
+ 	}
+ 
++	/*The pressure augmentation should not be transformed*/
++	MatrixMultiply(BtBUzawa,pnumdof,numdof,1,
++				BtBUzawa,pnumdof,numdof,0,
++				&Ke->values[0],1);
++
+ 	if(element->IsOnBase() && 0){ 
+ 		element->FindParam(&rl,AugmentedLagrangianRlambdaEnum);
+ 		element->GetVerticesCoordinatesBase(&xyz_list_base);
+@@ -3069,11 +3073,6 @@
+ 	/*Transform Coordinate System*/
+ 	element->TransformStiffnessMatrixCoord(Ke,cs_list);
+ 
+-	/*The pressure augmentation should not be transformed*/
+-	MatrixMultiply(BtBUzawa,pnumdof,numdof,1,
+-				BtBUzawa,pnumdof,numdof,0,
+-				&Ke->values[0],1);
+-
+ 	/*Clean up and return*/
+ 	delete gauss;
+ 	xDelete<IssmDouble>(xyz_list);
+@@ -3444,20 +3443,13 @@
+ 		delete pe2;
+ 		return pe3;
+ 	}
+-	else if(fe_FS==LATaylorHoodEnum){
+-		ElementVector* pe2=CreatePVectorFSViscousLATH(element);
++	else if(fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum){
++		ElementVector* pe2=CreatePVectorFSViscousLA(element);
+ 		ElementVector* pe3 = new ElementVector(pe,pe2);
+ 		delete pe;
+ 		delete pe2;
+ 		return pe3;
+ 	}
+-	else if(fe_FS==LACrouzeixRaviartEnum){
+-		ElementVector* pe2=CreatePVectorFSViscousLACR(element);
+-		ElementVector* pe3 = new ElementVector(pe,pe2);
+-		delete pe;
+-		delete pe2;
+-		return pe3;
+-	}
+ 	return pe;
+ }/*}}}*/
+ ElementVector* StressbalanceAnalysis::CreatePVectorFSFriction(Element* element){/*{{{*/
+@@ -3774,7 +3766,7 @@
+ ElementVector* StressbalanceAnalysis::CreatePVectorFSViscousLA(Element* element){/*{{{*/
+ 
+ 	int         i,dim;
+-	IssmDouble  Jdet,r,pressure;
++	IssmDouble  Jdet,pressure;
+ 	IssmDouble  bed_normal[3];
+ 	IssmDouble *xyz_list      = NULL;
+ 	IssmDouble *xyz_list_base = NULL;
+@@ -3796,7 +3788,6 @@
+ 	IssmDouble*    dbasis  = xNew<IssmDouble>(3*numnodes);
+ 
+ 	/*Retrieve all inputs and parameters*/
+-	element->FindParam(&r,AugmentedLagrangianREnum);
+ 	element->GetVerticesCoordinates(&xyz_list);
+ 
+ 	/*Get pressure and sigmann*/
+@@ -3845,7 +3836,7 @@
+ 	}
+ 
+ 	/*Transform coordinate system*/
+-	//element->TransformLoadVectorCoord(pe,cs_list); Do not transform augmentation
++	element->TransformLoadVectorCoord(pe,cs_list);
+ 
+ 	/*Clean up and return*/
+ 	delete gauss;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18570-18571.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18570-18571.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18570-18571.diff	(revision 19102)
@@ -0,0 +1,59 @@
+Index: ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18570)
++++ ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18571)
+@@ -80,8 +80,8 @@
+ 
+ 	if(VerboseControl())_printf0_("   Computing initial solution\n");
+ 	_printf0_("\n");
+-	_printf0_("Cost function f(x)   |  List of contributions\n");
+-	_printf0_("_____________________________________________\n");
++	_printf0_("Cost function f(x)   | Gradient norm |g(x)| |  List of contributions\n");
++	_printf0_("____________________________________________________________________\n");
+ 	indic = 0; //no adjoint required
+ 	simul(&indic,&n,X,&f,G,izs,rzs,(void*)femmodel);
+ 	double f1=f;
+@@ -161,13 +161,17 @@
+ 	femmodel->CostFunctionx(pf,&Jlist,NULL);
+ 	_printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<"  |  ");
+ 
+-	/*Retrieve objective functions independently*/
+-	for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(12)<<setprecision(7)<<Jlist[i]);
+-	_printf0_("\n");
+-	xDelete<IssmDouble>(Jlist);
+ 
++
+ 	if(indic==0){
+ 		/*dry run, no gradient required*/
++
++		/*Retrieve objective functions independently*/
++		_printf0_("            N/A |\n");
++		for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(12)<<setprecision(7)<<Jlist[i]);
++		_printf0_("\n");
++
++		xDelete<IssmDouble>(Jlist);
+ 		xDelete<IssmDouble>(XU);
+ 		xDelete<IssmDouble>(XL);
+ 		return;
+@@ -184,12 +188,21 @@
+ 	xDelete<IssmDouble>(G2);
+ 
+ 	/*Constrain Gradient*/
++	IssmDouble  Gnorm = 0.;
+ 	for(long i=0;i<*n;i++){
+ 		if(X[i]>=XU[i]) G[i]=0.;
+ 		if(X[i]<=XL[i]) G[i]=0.;
++		Gnorm += G[i]*G[i];
+ 	}
++	Gnorm = sqrt(Gnorm);
+ 
++	/*Print info*/
++	_printf0_("       "<<setw(12)<<setprecision(7)<<Gnorm<<" |");
++	for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(12)<<setprecision(7)<<Jlist[i]);
++	_printf0_("\n");
++
+ 	/*Clean-up and return*/
++		xDelete<IssmDouble>(Jlist);
+ 	xDelete<IssmDouble>(XU);
+ 	xDelete<IssmDouble>(XL);
+ }
Index: /issm/oecreview/Archive/18296-19100/ISSM-18571-18572.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18571-18572.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18571-18572.diff	(revision 19102)
@@ -0,0 +1,50 @@
+Index: ../trunk-jpl/test/NightlyRun/test702.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test702.m	(revision 18571)
++++ ../trunk-jpl/test/NightlyRun/test702.m	(revision 18572)
+@@ -35,19 +35,30 @@
+ 
+ %Misc
+ md=setflowequation(md,'FS','all');
+-md.flowequation.fe_FS='TaylorHood';
+ md.stressbalance.abstol=NaN;
++md.stressbalance.FSreconditioning=1;
++md.stressbalance.maxiter=20;
++md.flowequation.augmented_lagrangian_r=10000;
++md.flowequation.augmented_lagrangian_rhop=10000;
++md.initialization.pressure=md.constants.g*md.materials.rho_ice*(md.geometry.surface-md.mesh.y);
+ md.miscellaneous.name = 'flowline';
+-
+-%Go solve
+ md.cluster=generic('np',2);
+-md=solve(md,StressbalanceSolutionEnum());
+ 
+ %Fields and tolerances to track changes
+-field_names     ={'Vx','Vy','Vel','Pressure'};
+-field_tolerances={2e-08,2e-08,2e-08,2e-08};
+-field_values={...
+-	(md.results.StressbalanceSolution.Vx),...
+-	(md.results.StressbalanceSolution.Vy),...
+-	(md.results.StressbalanceSolution.Vel),...
+-	(md.results.StressbalanceSolution.Pressure)};
++field_names={};
++field_tolerances={};
++field_values={};
++for i={'MINI','MINIcondensed','TaylorHood','XTaylorHood','LATaylorHood','CrouzeixRaviart'}
++	disp(' ');
++	disp(['====== Testing ' i{1} ' Full-Stokes Finite element =====']);
++	md.flowequation.fe_FS=i{1};
++	md=solve(md,StressbalanceSolutionEnum());
++	field_names     ={field_names{:},['Vx' i{1}],['Vy' i{1}],['Vel' i{1}],['Pressure' i{1}]};
++	field_tolerances={field_tolerances{:},8e-5,8e-5,8e-5,1e-10};
++	field_values={field_values{:},...
++		(md.results.StressbalanceSolution.Vx),...
++		(md.results.StressbalanceSolution.Vy),...
++		(md.results.StressbalanceSolution.Vel),...
++		(md.results.StressbalanceSolution.Pressure),...
++		};
++end
+Index: ../trunk-jpl/test/Archives/Archive702.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
Index: /issm/oecreview/Archive/18296-19100/ISSM-18572-18573.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18572-18573.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18572-18573.diff	(revision 19102)
@@ -0,0 +1,36 @@
+Index: ../trunk-jpl/src/c/cores/controlvalidation_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/controlvalidation_core.cpp	(revision 18572)
++++ ../trunk-jpl/src/c/cores/controlvalidation_core.cpp	(revision 18573)
+@@ -35,8 +35,7 @@
+ 	X0 = Xpetsc->ToMPISerial();
+ 	delete Xpetsc;
+ 
+-	/*Allocate Gradient and current vector*/
+-	G = xNew<IssmDouble>(n);
++	/*Allocate current vector*/
+ 	X = xNew<IssmDouble>(n);
+ 
+ 	/*out of solution_type, figure out solution core and adjoint function pointer*/
+@@ -109,6 +108,7 @@
+ 	femmodel->OutputControlsx(&femmodel->results);
+ 
+ 	/*Clean up and return*/
++	xDelete<IssmDouble>(output);
+ 	xDelete<IssmDouble>(G);
+ 	xDelete<IssmDouble>(X);
+ 	xDelete<IssmDouble>(X0);
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18572)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18573)
+@@ -1484,7 +1484,8 @@
+ 			 /*Compute SurfaceAbsMisfitEnum*/
+ 			 J+=0.5*(surface-surfaceobs)*(surface-surfaceobs)*weight*Jdet*gauss->weight;
+ 		 }
+-
++		 delete gauss;
++		 xDelete<IssmDouble>(xyz_list);
+ 	}
+ 
+ 	/*Sum all J from all cpus of the cluster:*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18573-18574.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18573-18574.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18573-18574.diff	(revision 19102)
@@ -0,0 +1,19 @@
+Index: ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18573)
++++ ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18574)
+@@ -204,6 +204,7 @@
+ 	element->AddInput(VelEnum,vel_list,P1Enum);
+ 
+ 	/*Free ressources:*/
++	delete gauss;
+ 	xDelete<IssmDouble>(vy_list);
+ 	xDelete<IssmDouble>(vx_list);
+ 	xDelete<IssmDouble>(vel_list);
+@@ -253,5 +254,6 @@
+ 	
+ 	/*Clean up and return*/
+ 	xDelete<IssmDouble>(D0);
++	xDelete<IssmDouble>(xyz_list);
+ 	delete gauss;
+ }/*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18574-18575.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18574-18575.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18574-18575.diff	(revision 19102)
@@ -0,0 +1,4 @@
+Index: ../trunk-jpl/test/Archives/Archive702.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
Index: /issm/oecreview/Archive/18296-19100/ISSM-18575-18576.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18575-18576.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18575-18576.diff	(revision 19102)
@@ -0,0 +1,98 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18575)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18576)
+@@ -413,19 +413,6 @@
+ 		residual_input->GetInputValue(&residual,gauss);
+ 		element->FindParam(&leakage,HydrologydcLeakageFactorEnum);
+ 		transfer=(sediment_transmitivity)/(sediment_thickness*leakage); 
+-		/* if(epl_head>sed_head){ */
+-		/* 	if(residual>0.0){	 */
+-		/* 		transfer=0.0; */
+-		/* 	} */
+-		/* 	else{ */
+-		/* 		transfer=(sediment_transmitivity)/(sediment_thickness*leakage); */
+-		/* 		//transfer=(epl_specificstoring*epl_thickness*sediment_transmitivity)/(sediment_thickness*leakage); */
+-		/* 	} */
+-		/* } */
+-		/* else{ */
+-		/* 	transfer=(sediment_transmitivity)/(sediment_thickness*leakage); */
+-		/* 	//transfer=(sediment_storing*sediment_transmitivity)/(sediment_thickness*leakage); */
+-		/* } */
+ 		break;
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
+@@ -465,20 +452,8 @@
+ 		sed_trans_input->GetInputValue(&sediment_transmitivity,gauss);
+ 		residual_input->GetInputValue(&residual,gauss);
+ 		element->FindParam(&leakage,HydrologydcLeakageFactorEnum);
++
+ 		transfer=(sediment_transmitivity*sediment_head)/(sediment_thickness*leakage);
+-		/* if(epl_head>sediment_head){ */
+-		/* 	if(residual>0.0){	 */
+-		/* 		transfer=0.0; */
+-		/* 	} */
+-		/* 	else{ */
+-		/* 		transfer=(sediment_transmitivity*sediment_head)/(sediment_thickness*leakage); */
+-		/* 		//transfer=(epl_specificstoring*epl_thickness*sediment_transmitivity*sediment_head)/(sediment_thickness*leakage); */
+-		/* 	} */
+-		/* } */
+-		/* else{ */
+-		/* 	transfer=(sediment_transmitivity*sediment_head)/(sediment_thickness*leakage); */
+-		/* 	//transfer=(sediment_storing*sediment_transmitivity*sediment_head)/(sediment_thickness*leakage); */
+-		/* } */
+ 		break;
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18575)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18576)
+@@ -605,22 +605,6 @@
+ 		element->FindParam(&leakage,HydrologydcLeakageFactorEnum);
+ 		
+ 		transfer=(sediment_transmitivity)/(sediment_thickness*leakage);
+-		
+-		/* if(epl_head>sed_head){ */
+-		/* 	h_max=GetHydrologyDCInefficientHmax(element,gauss,thickness_input,base_input); */
+-		/* 	if(sed_head>=h_max){ */
+-		/* 		transfer=0.0; */
+-		/* 	} */
+-		/* 	else{ */
+-		/* 		transfer=(sediment_transmitivity)/(sediment_thickness*leakage); */
+-		/* 		//transfer=(epl_specificstoring*epl_thickness*sediment_transmitivity)/(sediment_thickness*leakage); */
+-		/* 	} */
+-		/* } */
+-		/* else{ */
+-		/* 	transfer=(sediment_transmitivity)/(sediment_thickness*leakage); */
+-		/* 	//transfer=(sediment_storing*sediment_transmitivity)/(sediment_thickness*leakage); */
+-		/* } */
+-		
+ 		break;
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
+@@ -661,23 +645,9 @@
+ 		sed_head_input->GetInputValue(&sediment_head,gauss);
+ 		epl_head_input->GetInputValue(&epl_head,gauss);
+ 		sed_trans_input->GetInputValue(&sediment_transmitivity,gauss);
++		element->FindParam(&leakage,HydrologydcLeakageFactorEnum);
+ 
+-		element->FindParam(&leakage,HydrologydcLeakageFactorEnum);
+  		transfer=(sediment_transmitivity*epl_head)/(sediment_thickness*leakage);
+-		/* if(epl_head>sediment_head){ */
+-		/* 	h_max=GetHydrologyDCInefficientHmax(element,gauss,thickness_input,base_input); */
+- 		/* 	if(sediment_head>=h_max){ */
+-		/* 		transfer=0.0; */
+-		/* 	} */
+-		/* 	else{ */
+-		/* 		transfer=(sediment_transmitivity*epl_head)/(sediment_thickness*leakage); */
+-		/* 		//transfer=(epl_specificstoring*epl_thickness*sediment_transmitivity*epl_head)/(sediment_thickness*leakage); */
+-		/* 	} */
+-		/* } */
+-		/* else{ */
+-		/* 	transfer=(sediment_transmitivity*epl_head)/(sediment_thickness*leakage); */
+-		/* 	//transfer=(sediment_storing*sediment_transmitivity*epl_head)/(sediment_thickness*leakage); */
+-		/* } */
+ 		break;
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
Index: /issm/oecreview/Archive/18296-19100/ISSM-18576-18577.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18576-18577.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18576-18577.diff	(revision 19102)
@@ -0,0 +1,15 @@
+Index: ../trunk-jpl/src/m/classes/clusters/pfe.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/pfe.m	(revision 18576)
++++ ../trunk-jpl/src/m/classes/clusters/pfe.m	(revision 18577)
+@@ -125,8 +125,8 @@
+ 			 fprintf(fid,'#PBS -q %s \n',cluster.queue);
+ 			 fprintf(fid,'#PBS -W group_list=%s\n',cluster.grouplist);
+ 			 fprintf(fid,'#PBS -m e\n');
+-			 fprintf(fid,'#PBS -o %s.outlog \n',modelname);
+-			 fprintf(fid,'#PBS -e %s.errlog \n\n',modelname);
++			 fprintf(fid,'#PBS -o %s.outlog \n',[cluster.executionpath '/' dirname '/' modelname]);
++			 fprintf(fid,'#PBS -e %s.errlog \n\n',[cluster.executionpath '/' dirname '/' modelname]);
+ 			 fprintf(fid,'. /usr/share/modules/init/bash\n\n');
+ 			 fprintf(fid,'module load comp-intel/11.1.046\n');
+ 			 fprintf(fid,'module load math/intel_mkl_64_10.0.011\n');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18577-18578.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18577-18578.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18577-18578.diff	(revision 19102)
@@ -0,0 +1,82 @@
+Index: ../trunk-jpl/src/m/classes/model.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.py	(revision 18577)
++++ ../trunk-jpl/src/m/classes/model.py	(revision 18578)
+@@ -29,6 +29,7 @@
+ from stressbalance import stressbalance
+ from groundingline import groundingline
+ from hydrologyshreve import hydrologyshreve
++from hydrologydc import hydrologydc
+ from masstransport import masstransport
+ from thermal import thermal
+ from steadystate import steadystate
+@@ -79,10 +80,10 @@
+ 		self.cluster          = generic()
+ 
+ 		self.balancethickness = balancethickness()
+-		self.stressbalance       = stressbalance()
++		self.stressbalance    = stressbalance()
+ 		self.groundingline    = groundingline()
+ 		self.hydrology        = hydrologyshreve()
+-		self.masstransport       = masstransport()
++		self.masstransport    = masstransport()
+ 		self.thermal          = thermal()
+ 		self.steadystate      = steadystate()
+ 		self.transient        = transient()
+@@ -127,7 +128,7 @@
+ 		        'thermal',\
+ 		        'steadystate',\
+ 		        'transient',\
+-				  'gia',\
++                        'gia',\
+ 		        'autodiff',\
+ 		        'flaim',\
+ 		        'inversion',\
+@@ -614,8 +615,13 @@
+ 			md.initialization.waterfraction=project3d(md,'vector',md.initialization.waterfraction,'type','node')
+ 		if not numpy.any(numpy.isnan(md.initialization.watercolumn)):
+ 			md.initialization.watercolumn=project3d(md,'vector',md.initialization.watercolumn,'type','node')
++                if not numpy.any(numpy.isnan(md.initialization.sediment_head)):
++                        md.initialization.sediment_head=project3d(md,'vector',md.initialization.sediment_head,'type','node','layer',1)
++                if not numpy.any(numpy.isnan(md.initialization.epl_head)):
++                        md.initialization.epl_head=project3d(md,'vector',md.initialization.epl_head,'type','node','layer',1)
++                if not numpy.any(numpy.isnan(md.initialization.epl_thickness)):
++                        md.initialization.epl_thickness=project3d(md,'vector',md.initialization.epl_thickness,'type','node','layer',1)
+ 
+-
+ 		#bedinfo and surface info
+ 		md.mesh.vertexonbase=project3d(md,'vector',numpy.ones(md.mesh.numberofvertices2d,bool),'type','node','layer',1)
+ 		md.mesh.vertexonsurface=project3d(md,'vector',numpy.ones(md.mesh.numberofvertices2d,bool),'type','node','layer',md.mesh.numberoflayers)
+@@ -653,6 +659,14 @@
+ 		md.stressbalance.loadingforce=project3d(md,'vector',md.stressbalance.loadingforce,'type','node')
+ 		md.masstransport.calvingrate=project3d(md,'vector',md.masstransport.calvingrate,'type','node')
+ 
++                # Hydrologydc variables
++                if hasattr(md.hydrology,'hydrologydc'):
++                        md.hydrology.spcsediment_head=project3d(md,'vector',md.hydrology.spcsediment_head,'type','node','layer',1)
++                        md.hydrology.spcepl_head=project3d(md,'vector',md.hydrology.spcepl_head,'type','node','layer',1)
++                        md.hydrology.mask_eplactive_node=project3d(md,'vector',md.hydrology.mask_eplactive_node,'type','node','layer',1)
++                        md.hydrology.sediment_transmitivity=project3d(md,'vector',md.hydrology.sediment_transmitivity,'type','node','layer',1)
++                        md.hydrology.basal_moulin_input=project3d(md,'vector',md.hydrology.basal_moulin_input,'type','node','layer',1)
++
+ 		#connectivity
+ 		md.mesh.elementconnectivity=numpy.tile(md.mesh.elementconnectivity,(numlayers-1,1))
+ 		md.mesh.elementconnectivity[numpy.nonzero(md.mesh.elementconnectivity==0)]=-sys.maxint-1
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 18577)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 18578)
+@@ -210,9 +210,11 @@
+ 			if ~isnan(md.initialization.vy),md.initialization.vy=DepthAverage(md,md.initialization.vy);end;
+ 			if ~isnan(md.initialization.vz),md.initialization.vz=DepthAverage(md,md.initialization.vz);end;
+ 			if ~isnan(md.initialization.vel),md.initialization.vel=DepthAverage(md,md.initialization.vel);end;
+-			if ~isnan(md.initialization.temperature),	md.initialization.temperature=DepthAverage(md,md.initialization.temperature);end;
++			if ~isnan(md.initialization.temperature),md.initialization.temperature=DepthAverage(md,md.initialization.temperature);end;
+ 			if ~isnan(md.initialization.pressure),md.initialization.pressure=project2d(md,md.initialization.pressure,1);end;
+-
++			if ~isnan(md.initialization.sediment_head),md.initialization.sediment_head=project2d(md,md.initialization.sediment_head,1);end;
++			if ~isnan(md.initialization.epl_head),md.initialization.epl_head=project2d(md,md.initialization.epl_head,1);end;
++			if ~isnan(md.initialization.epl_thickness),md.initialization.epl_thickness=project2d(md,md.initialization.epl_thickness,1);end;
+ 			%gia
+ 			if ~isnan(md.gia.mantle_viscosity), md.gia.mantle_viscosity=project2d(md,md.gia.mantle_viscosity,1); end
+ 			if ~isnan(md.gia.lithosphere_thickness), md.gia.lithosphere_thickness=project2d(md,md.gia.lithosphere_thickness,1); end
Index: /issm/oecreview/Archive/18296-19100/ISSM-18578-18579.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18578-18579.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18578-18579.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/classes/stressbalance.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/stressbalance.m	(revision 18578)
++++ ../trunk-jpl/src/m/classes/stressbalance.m	(revision 18579)
+@@ -140,7 +140,7 @@
+ 			md = checkfield(md,'fieldname','stressbalance.requested_outputs','stringrow',1);
+ 
+ 			%singular solution
+-			if ~(any(~isnan(md.stressbalance.spcvx)) | any(~isnan(md.stressbalance.spcvy))),
++			if ((~(any(~isnan(md.stressbalance.spcvx)) | any(~isnan(md.stressbalance.spcvy)))) & ~any(md.mask.groundedice_levelset>0)),
+ 				md = checkmessage(md,['model is not well posed (singular). You need at least one node with fixed velocity!']);
+ 			end
+ 			%CHECK THAT EACH LINES CONTAINS ONLY NAN VALUES OR NO NAN VALUES
Index: /issm/oecreview/Archive/18296-19100/ISSM-18579-18580.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18579-18580.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18579-18580.diff	(revision 19102)
@@ -0,0 +1,77 @@
+Index: ../trunk-jpl/src/m/classes/hydrologydc.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologydc.m	(revision 18579)
++++ ../trunk-jpl/src/m/classes/hydrologydc.m	(revision 18580)
+@@ -29,6 +29,7 @@
+ 		epl_compressibility      = 0;
+ 		epl_porosity             = 0;
+ 		epl_initial_thickness    = 0;
++		epl_colapse_thickness    = 0;
+ 		epl_max_thickness        = 0;
+ 		epl_conductivity         = 0;
+   end
+@@ -72,6 +73,7 @@
+ 			obj.epl_compressibility      = 1.0e-08;
+ 			obj.epl_porosity             = 0.4;
+ 			obj.epl_initial_thickness    = 1.0;
++			obj.epl_colapse_thickness    = 1.0e-3;
+ 			obj.epl_max_thickness        = 5.0;
+ 			obj.epl_conductivity         = 8.0e-02;
+ 
+@@ -111,8 +113,12 @@
+ 				md = checkfield(md,'fieldname','hydrology.epl_compressibility','>',0,'numel',1);
+ 				md = checkfield(md,'fieldname','hydrology.epl_porosity','>',0,'numel',1);
+ 				md = checkfield(md,'fieldname','hydrology.epl_initial_thickness','>',0,'numel',1);
++				md = checkfield(md,'fieldname','hydrology.epl_colapse_thickness','>',0,'numel',1);
+ 				md = checkfield(md,'fieldname','hydrology.epl_max_thickness','>',0,'numel',1);
+ 				md = checkfield(md,'fieldname','hydrology.epl_conductivity','>',0,'numel',1);
++				if (obj.epl_colapse_thickness>obj.epl_initial_thickness),
++					md = checkmessage(md,'Colapsing thickness for EPL larger than initial thickness');
++				end 
+ 	    end
+ 		end 
+ 		% }}}
+@@ -155,6 +161,7 @@
+ 				fielddisplay(obj,'epl_compressibility','epl compressibility [Pa^-1]');
+ 				fielddisplay(obj,'epl_porosity','epl [dimensionless]');
+ 				fielddisplay(obj,'epl_initial_thickness','epl initial thickness [m]');
++				fielddisplay(obj,'epl_colapse_thickness','epl colapsing thickness [m]');
+ 				fielddisplay(obj,'epl_max_thickness','epl maximal thickness [m]');
+ 				fielddisplay(obj,'epl_conductivity','epl conductivity [m^2/s]');
+ 	    end
+@@ -192,6 +199,7 @@
+ 				WriteData(fid,'object',obj,'fieldname','epl_compressibility','format','Double');			
+ 				WriteData(fid,'object',obj,'fieldname','epl_porosity','format','Double');			
+ 				WriteData(fid,'object',obj,'fieldname','epl_initial_thickness','format','Double');
++				WriteData(fid,'object',obj,'fieldname','epl_colapse_thickness','format','Double');
+ 				WriteData(fid,'object',obj,'fieldname','epl_max_thickness','format','Double');
+ 				WriteData(fid,'object',obj,'fieldname','epl_conductivity','format','Double');
+ 			end
+Index: ../trunk-jpl/src/m/enum/HydrologydcEplColapseThicknessEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/HydrologydcEplColapseThicknessEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/HydrologydcEplColapseThicknessEnum.m	(revision 18580)
+@@ -0,0 +1,11 @@
++function macro=HydrologydcEplColapseThicknessEnum()
++%HYDROLOGYDCEPLCOLAPSETHICKNESSENUM - Enum of HydrologydcEplColapseThickness
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=HydrologydcEplColapseThicknessEnum()
++
++macro=StringToEnum('HydrologydcEplColapseThickness');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18579)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18580)
+@@ -122,6 +122,7 @@
+ def HydrologydcEplCompressibilityEnum(): return StringToEnum("HydrologydcEplCompressibility")[0]
+ def HydrologydcEplPorosityEnum(): return StringToEnum("HydrologydcEplPorosity")[0]
+ def HydrologydcEplInitialThicknessEnum(): return StringToEnum("HydrologydcEplInitialThickness")[0]
++def HydrologydcEplColapseThicknessEnum(): return StringToEnum("HydrologydcEplColapseThickness")[0]
+ def HydrologydcEplMaxThicknessEnum(): return StringToEnum("HydrologydcEplMaxThickness")[0]
+ def HydrologydcEplThicknessEnum(): return StringToEnum("HydrologydcEplThickness")[0]
+ def HydrologydcEplThicknessOldEnum(): return StringToEnum("HydrologydcEplThicknessOld")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18580-18581.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18580-18581.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18580-18581.diff	(revision 19102)
@@ -0,0 +1,181 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18580)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18581)
+@@ -613,7 +613,8 @@
+ 	IssmDouble* eplhead       =xNew<IssmDouble>(numnodes);
+ 	IssmDouble* residual      =xNew<IssmDouble>(numnodes);
+ 
+-	IssmDouble init_thick =	basalelement->GetMaterialParameter(HydrologydcEplInitialThicknessEnum);
++	IssmDouble init_thick    =basalelement->GetMaterialParameter(HydrologydcEplInitialThicknessEnum);
++	IssmDouble colapse_thick =basalelement->GetMaterialParameter(HydrologydcEplColapseThicknessEnum);
+ 
+ 	Input* active_element_input=basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input);
+ 	active_element_input->GetInputValue(&active_element);
+@@ -638,7 +639,7 @@
+ 		else if(old_active[i]>0.){
+ 			vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+ 			/*If epl thickness gets under 10-3 initial thickness, close the layer*/
+-			if(epl_thickness[i]<0.001*init_thick){
++			if(epl_thickness[i]<colapse_thick){
+ 				vec_mask->SetValue(basalelement->nodes[i]->Sid(),0.,INS_VAL);
+ 				epl_thickness[i]=init_thick;
+ 			}
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18580)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18581)
+@@ -122,6 +122,7 @@
+ 	HydrologydcEplCompressibilityEnum,
+ 	HydrologydcEplPorosityEnum,
+ 	HydrologydcEplInitialThicknessEnum,
++	HydrologydcEplColapseThicknessEnum,
+ 	HydrologydcEplMaxThicknessEnum,
+ 	HydrologydcEplThicknessEnum,
+ 	HydrologydcEplThicknessOldEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18580)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18581)
+@@ -130,6 +130,7 @@
+ 		case HydrologydcEplCompressibilityEnum : return "HydrologydcEplCompressibility";
+ 		case HydrologydcEplPorosityEnum : return "HydrologydcEplPorosity";
+ 		case HydrologydcEplInitialThicknessEnum : return "HydrologydcEplInitialThickness";
++		case HydrologydcEplColapseThicknessEnum : return "HydrologydcEplColapseThickness";
+ 		case HydrologydcEplMaxThicknessEnum : return "HydrologydcEplMaxThickness";
+ 		case HydrologydcEplThicknessEnum : return "HydrologydcEplThickness";
+ 		case HydrologydcEplThicknessOldEnum : return "HydrologydcEplThicknessOld";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18580)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18581)
+@@ -130,16 +130,17 @@
+ 	      else if (strcmp(name,"HydrologydcEplCompressibility")==0) return HydrologydcEplCompressibilityEnum;
+ 	      else if (strcmp(name,"HydrologydcEplPorosity")==0) return HydrologydcEplPorosityEnum;
+ 	      else if (strcmp(name,"HydrologydcEplInitialThickness")==0) return HydrologydcEplInitialThicknessEnum;
++	      else if (strcmp(name,"HydrologydcEplColapseThickness")==0) return HydrologydcEplColapseThicknessEnum;
+ 	      else if (strcmp(name,"HydrologydcEplMaxThickness")==0) return HydrologydcEplMaxThicknessEnum;
+ 	      else if (strcmp(name,"HydrologydcEplThickness")==0) return HydrologydcEplThicknessEnum;
+ 	      else if (strcmp(name,"HydrologydcEplThicknessOld")==0) return HydrologydcEplThicknessOldEnum;
+ 	      else if (strcmp(name,"HydrologydcEplConductivity")==0) return HydrologydcEplConductivityEnum;
+ 	      else if (strcmp(name,"HydrologydcIsefficientlayer")==0) return HydrologydcIsefficientlayerEnum;
+-	      else if (strcmp(name,"HydrologydcSedimentlimitFlag")==0) return HydrologydcSedimentlimitFlagEnum;
+          else stage=2;
+    }
+    if(stage==2){
+-	      if (strcmp(name,"HydrologydcSedimentlimit")==0) return HydrologydcSedimentlimitEnum;
++	      if (strcmp(name,"HydrologydcSedimentlimitFlag")==0) return HydrologydcSedimentlimitFlagEnum;
++	      else if (strcmp(name,"HydrologydcSedimentlimit")==0) return HydrologydcSedimentlimitEnum;
+ 	      else if (strcmp(name,"HydrologydcTransferFlag")==0) return HydrologydcTransferFlagEnum;
+ 	      else if (strcmp(name,"HydrologydcLeakageFactor")==0) return HydrologydcLeakageFactorEnum;
+ 	      else if (strcmp(name,"HydrologydcPenaltyFactor")==0) return HydrologydcPenaltyFactorEnum;
+@@ -258,11 +259,11 @@
+ 	      else if (strcmp(name,"MasstransportNumRequestedOutputs")==0) return MasstransportNumRequestedOutputsEnum;
+ 	      else if (strcmp(name,"MasstransportRequestedOutputs")==0) return MasstransportRequestedOutputsEnum;
+ 	      else if (strcmp(name,"QmuIsdakota")==0) return QmuIsdakotaEnum;
+-	      else if (strcmp(name,"MassFluxSegments")==0) return MassFluxSegmentsEnum;
+          else stage=3;
+    }
+    if(stage==3){
+-	      if (strcmp(name,"MassFluxSegmentsPresent")==0) return MassFluxSegmentsPresentEnum;
++	      if (strcmp(name,"MassFluxSegments")==0) return MassFluxSegmentsEnum;
++	      else if (strcmp(name,"MassFluxSegmentsPresent")==0) return MassFluxSegmentsPresentEnum;
+ 	      else if (strcmp(name,"QmuMassFluxSegmentsPresent")==0) return QmuMassFluxSegmentsPresentEnum;
+ 	      else if (strcmp(name,"QmuNumberofpartitions")==0) return QmuNumberofpartitionsEnum;
+ 	      else if (strcmp(name,"QmuNumberofresponses")==0) return QmuNumberofresponsesEnum;
+@@ -381,11 +382,11 @@
+ 	      else if (strcmp(name,"FlaimAnalysis")==0) return FlaimAnalysisEnum;
+ 	      else if (strcmp(name,"FlaimSolution")==0) return FlaimSolutionEnum;
+ 	      else if (strcmp(name,"HydrologyShreveAnalysis")==0) return HydrologyShreveAnalysisEnum;
+-	      else if (strcmp(name,"HydrologyDCInefficientAnalysis")==0) return HydrologyDCInefficientAnalysisEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"HydrologyDCEfficientAnalysis")==0) return HydrologyDCEfficientAnalysisEnum;
++	      if (strcmp(name,"HydrologyDCInefficientAnalysis")==0) return HydrologyDCInefficientAnalysisEnum;
++	      else if (strcmp(name,"HydrologyDCEfficientAnalysis")==0) return HydrologyDCEfficientAnalysisEnum;
+ 	      else if (strcmp(name,"HydrologySolution")==0) return HydrologySolutionEnum;
+ 	      else if (strcmp(name,"MeltingAnalysis")==0) return MeltingAnalysisEnum;
+ 	      else if (strcmp(name,"MasstransportAnalysis")==0) return MasstransportAnalysisEnum;
+@@ -504,11 +505,11 @@
+ 	      else if (strcmp(name,"BalancethicknessMisfit")==0) return BalancethicknessMisfitEnum;
+ 	      else if (strcmp(name,"BedSlopeX")==0) return BedSlopeXEnum;
+ 	      else if (strcmp(name,"BedSlopeY")==0) return BedSlopeYEnum;
+-	      else if (strcmp(name,"Boundary")==0) return BoundaryEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"Converged")==0) return ConvergedEnum;
++	      if (strcmp(name,"Boundary")==0) return BoundaryEnum;
++	      else if (strcmp(name,"Converged")==0) return ConvergedEnum;
+ 	      else if (strcmp(name,"Fill")==0) return FillEnum;
+ 	      else if (strcmp(name,"FractionIncrement")==0) return FractionIncrementEnum;
+ 	      else if (strcmp(name,"Friction")==0) return FrictionEnum;
+@@ -627,11 +628,11 @@
+ 	      else if (strcmp(name,"Outputdefinition")==0) return OutputdefinitionEnum;
+ 	      else if (strcmp(name,"OutputdefinitionList")==0) return OutputdefinitionListEnum;
+ 	      else if (strcmp(name,"Massfluxatgate")==0) return MassfluxatgateEnum;
+-	      else if (strcmp(name,"MassfluxatgateName")==0) return MassfluxatgateNameEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"MassfluxatgateSegments")==0) return MassfluxatgateSegmentsEnum;
++	      if (strcmp(name,"MassfluxatgateName")==0) return MassfluxatgateNameEnum;
++	      else if (strcmp(name,"MassfluxatgateSegments")==0) return MassfluxatgateSegmentsEnum;
+ 	      else if (strcmp(name,"MisfitName")==0) return MisfitNameEnum;
+ 	      else if (strcmp(name,"MisfitModelEnum")==0) return MisfitModelEnumEnum;
+ 	      else if (strcmp(name,"MisfitObservation")==0) return MisfitObservationEnum;
+@@ -750,11 +751,11 @@
+ 	      else if (strcmp(name,"SurfaceforcingsAirCoef")==0) return SurfaceforcingsAirCoefEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsAirLinDragCoef")==0) return SurfaceforcingsAirLinDragCoefEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsAirQuadDragCoef")==0) return SurfaceforcingsAirQuadDragCoefEnum;
+-	      else if (strcmp(name,"SurfaceforcingsWindVx")==0) return SurfaceforcingsWindVxEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"SurfaceforcingsWindVy")==0) return SurfaceforcingsWindVyEnum;
++	      if (strcmp(name,"SurfaceforcingsWindVx")==0) return SurfaceforcingsWindVxEnum;
++	      else if (strcmp(name,"SurfaceforcingsWindVy")==0) return SurfaceforcingsWindVyEnum;
+ 	      else if (strcmp(name,"Matseaice")==0) return MatseaiceEnum;
+ 	      else if (strcmp(name,"MaterialsPoisson")==0) return MaterialsPoissonEnum;
+ 	      else if (strcmp(name,"MaterialsYoungModulus")==0) return MaterialsYoungModulusEnum;
+Index: ../trunk-jpl/src/c/classes/Materials/Matpar.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 18580)
++++ ../trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 18581)
+@@ -78,6 +78,7 @@
+ 					iomodel->Constant(&this->epl_compressibility,HydrologydcEplCompressibilityEnum);
+ 					iomodel->Constant(&this->epl_porosity,HydrologydcEplPorosityEnum);
+ 					iomodel->Constant(&this->epl_init_thickness,HydrologydcEplInitialThicknessEnum);
++					iomodel->Constant(&this->epl_colapse_thickness,HydrologydcEplColapseThicknessEnum);
+ 					iomodel->Constant(&this->epl_max_thickness,HydrologydcEplMaxThicknessEnum);
+ 					iomodel->Constant(&this->epl_conductivity,HydrologydcEplConductivityEnum);
+ 				}
+@@ -191,6 +192,7 @@
+ 	matpar->epl_compressibility=this->epl_compressibility;
+ 	matpar->epl_porosity=this->epl_porosity;
+ 	matpar->epl_init_thickness=this->epl_init_thickness;
++	matpar->epl_colapse_thickness=this->epl_colapse_thickness;
+ 	matpar->epl_max_thickness=this->epl_max_thickness;
+ 	matpar->epl_conductivity=this->epl_conductivity;
+ 
+@@ -312,6 +314,7 @@
+ 		case HydrologydcEplCompressibilityEnum:      return this->epl_compressibility;
+ 		case HydrologydcEplConductivityEnum:         return this->epl_conductivity;
+ 		case HydrologydcEplInitialThicknessEnum:     return this->epl_init_thickness;
++		case HydrologydcEplColapseThicknessEnum:     return this->epl_colapse_thickness;
+ 		case HydrologydcEplMaxThicknessEnum:         return this->epl_max_thickness;
+ 		case HydrologydcWaterCompressibilityEnum:    return this->water_compressibility;
+ 		case ConstantsGEnum:                         return this->g;
+Index: ../trunk-jpl/src/c/classes/Materials/Matpar.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Matpar.h	(revision 18580)
++++ ../trunk-jpl/src/c/classes/Materials/Matpar.h	(revision 18581)
+@@ -42,6 +42,7 @@
+ 		IssmDouble  epl_compressibility;
+ 		IssmDouble  epl_porosity;
+ 		IssmDouble  epl_init_thickness;
++		IssmDouble  epl_colapse_thickness;
+ 		IssmDouble  epl_max_thickness;
+ 		IssmDouble  epl_conductivity;	 
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18581-18582.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18581-18582.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18581-18582.diff	(revision 19102)
@@ -0,0 +1,69 @@
+Index: ../trunk-jpl/test/NightlyRun/test333.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test333.m	(revision 18581)
++++ ../trunk-jpl/test/NightlyRun/test333.m	(revision 18582)
+@@ -22,6 +22,7 @@
+ md.hydrology.mask_eplactive_node=0*ones(md.mesh.numberofvertices,1);
+ md.hydrology.epl_conductivity=30;
+ md.hydrology.epl_initial_thickness=1;
++md.hydrology.epl_colapse_thickness=1.0e-3;
+ md.hydrology.epl_max_thickness=1;
+ md.timestepping.time_step=0.2;
+ md.timestepping.final_time=2.0;
+Index: ../trunk-jpl/test/NightlyRun/test3300.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3300.m	(revision 18581)
++++ ../trunk-jpl/test/NightlyRun/test3300.m	(revision 18582)
+@@ -13,7 +13,7 @@
+ md.hydrology.sediment_thickness=20.0;
+ md.initialization.sediment_head=0.0*ones(md.mesh.numberofvertices,1);
+ md.hydrology.spcsediment_head=NaN*ones(md.mesh.numberofvertices,1);
+-md.basalforcings.melting_rate = 2.0*ones(md.mesh.numberofvertices,1);
++md.basalforcings.groundedice_melting_rate = 2.0*ones(md.mesh.numberofvertices,1);
+ md.hydrology.sediment_transmitivity=1.5e-4*ones(md.mesh.numberofvertices,1);
+ 
+ md.initialization.epl_head=0.0*ones(md.mesh.numberofvertices,1);
+@@ -23,25 +23,26 @@
+ 
+ md.hydrology.epl_conductivity=1.5e-2;
+ md.hydrology.epl_initial_thickness=1.0;
++md.hydrology.epl_colapse_thickness=1.0e-6;
+ md.hydrology.epl_max_thickness=5.0;
+ 
+ md.hydrology.transfer_flag=1;
+ md.hydrology.leakage_factor=500;
+ 
+ times=0:0.2:8.0;
+-md.basalforcings.melting_rate=ones(md.mesh.numberofvertices+1,length(times));
++md.basalforcings.groundedice_melting_rate=ones(md.mesh.numberofvertices+1,length(times));
+ 
+ for i=1:length(times)
+ 	if(times(i)<1.2)
+-		md.basalforcings.melting_rate(:,i)=1.0;
++		md.basalforcings.groundedice_melting_rate(:,i)=1.0;
+ 	elseif(times(i)<6.0)
+-		md.basalforcings.melting_rate(:,i)=-0.2;
++		md.basalforcings.groundedice_melting_rate(:,i)=-0.2;
+ 	else
+-		md.basalforcings.melting_rate(:,i)=0.0;
++		md.basalforcings.groundedice_melting_rate(:,i)=0.0;
+  end
+ end	
+ 
+-md.basalforcings.melting_rate(end,:)=times;
++md.basalforcings.groundedice_melting_rate(end,:)=times;
+ 
+ 
+ md.timestepping.time_step=0.2;
+Index: ../trunk-jpl/test/NightlyRun/test335.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test335.m	(revision 18581)
++++ ../trunk-jpl/test/NightlyRun/test335.m	(revision 18582)
+@@ -22,6 +22,7 @@
+ md.hydrology.mask_eplactive_node=0*ones(md.mesh.numberofvertices,1);
+ md.hydrology.epl_conductivity=30;
+ md.hydrology.epl_initial_thickness=1;
++md.hydrology.epl_colapse_thickness=1.0e-3;
+ md.hydrology.epl_max_thickness=1;
+ md.timestepping.time_step=0.2;
+ md.timestepping.final_time=2.0;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18582-18583.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18582-18583.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18582-18583.diff	(revision 19102)
@@ -0,0 +1,52 @@
+Index: ../trunk-jpl/test/NightlyRun/test1501.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1501.py	(revision 18582)
++++ ../trunk-jpl/test/NightlyRun/test1501.py	(revision 18583)
+@@ -25,7 +25,7 @@
+ #Solve for thinning rate -> -1 * surface mass balance
+ smb= 2.*numpy.ones((md.mesh.numberofvertices,1))
+ md.surfaceforcings.mass_balance= smb
+-md.basalforcings.melting_rate= smb
++md.basalforcings.groundedice_melting_rate= smb
+ 
+ md=solve(md,MasstransportSolutionEnum())
+ 
+Index: ../trunk-jpl/test/NightlyRun/test1502.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1502.py	(revision 18582)
++++ ../trunk-jpl/test/NightlyRun/test1502.py	(revision 18583)
+@@ -26,7 +26,7 @@
+ #Solve for thinning rate -> -1 * surface mass balance
+ smb= 2.*numpy.ones((md.mesh.numberofvertices,1))
+ md.surfaceforcings.mass_balance= smb
+-md.basalforcings.melting_rate= smb
++md.basalforcings.groundedice_melting_rate= smb
+ 
+ md=solve(md,MasstransportSolutionEnum())
+ 
+Index: ../trunk-jpl/test/NightlyRun/test1501.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1501.m	(revision 18582)
++++ ../trunk-jpl/test/NightlyRun/test1501.m	(revision 18583)
+@@ -14,7 +14,7 @@
+ %Solve for thinning rate -> -1 * surface mass balance
+ smb= 2.*ones(md.mesh.numberofvertices,1);
+ md.surfaceforcings.mass_balance= smb;
+-md.basalforcings.melting_rate= smb;
++md.basalforcings.groundedice_melting_rate= smb;
+ 
+ md=solve(md,MasstransportSolutionEnum());
+ 
+Index: ../trunk-jpl/test/NightlyRun/test1502.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1502.m	(revision 18582)
++++ ../trunk-jpl/test/NightlyRun/test1502.m	(revision 18583)
+@@ -15,7 +15,7 @@
+ %Solve for thinning rate -> -1 * surface mass balance
+ smb= 2.*ones(md.mesh.numberofvertices,1);
+ md.surfaceforcings.mass_balance= smb;
+-md.basalforcings.melting_rate= smb;
++md.basalforcings.groundedice_melting_rate= smb;
+ 
+ md=solve(md,MasstransportSolutionEnum());
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18583-18584.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18583-18584.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18583-18584.diff	(revision 19102)
@@ -0,0 +1,44 @@
+Index: ../trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 18583)
++++ ../trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 18584)
+@@ -30,19 +30,19 @@
+ 			PositiveDegreeDayx(femmodel);
+ 			break;
+ 		case SMBgradientsEnum:
+-			if(VerboseSolution())_printf_("	call smb gradients module\n");
++			if(VerboseSolution())_printf0_("	call smb gradients module\n");
+ 			SmbGradientsx(femmodel);
+ 			break;
+ 		case SMBhenningEnum:
+-			if(VerboseSolution())_printf_("  call smb Henning module\n");
++			if(VerboseSolution())_printf0_("  call smb Henning module\n");
+ 			SmbHenningx(femmodel);
+ 			break;
+ 		case SMBcomponentsEnum:
+-			if(VerboseSolution())_printf_("  call smb Components module\n");
++			if(VerboseSolution())_printf0_("  call smb Components module\n");
+ 			SmbComponentsx(femmodel);
+ 			break;
+ 		case SMBmeltcomponentsEnum:
+-			if(VerboseSolution())_printf_("  call smb Melt Components module\n");
++			if(VerboseSolution())_printf0_("  call smb Melt Components module\n");
+ 			SmbMeltComponentsx(femmodel);
+ 			break;
+ 		default:
+@@ -262,10 +262,11 @@
+ 			  smb = (a + b*z)*(f + g*(z-z_critical) + h*(z-z_critical)*(z-z_critical)) + c;
+ 			}
+             
+-            /* Compute smb including anomaly,
+-             correct for number of seconds in a year [s/yr]*/
+-            smb = smb + anomaly*yts;
+-            
++			/* Compute smb including anomaly,
++				correct for number of seconds in a year [s/yr]*/
++			smb = smb/yts + anomaly;
++
++
+ 			/*Update array accordingly*/
+ 			smblist[v] = smb;
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18584-18585.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18584-18585.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18584-18585.diff	(revision 19102)
@@ -0,0 +1,74 @@
+Index: ../trunk-jpl/src/m/classes/hydrologydc.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 18584)
++++ ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 18585)
+@@ -22,6 +22,7 @@
+ 		self.sedimentlimit            = 0
+ 		self.transfer_flag            = 0
+ 		self.leakage_factor           = 0
++                self.basal_moulin_input       = float('NaN')
+ 
+ 		self.spcsediment_head         = float('NaN')
+ 		self.sediment_transmitivity   = float('NaN')
+@@ -35,10 +36,12 @@
+ 		self.epl_compressibility      = 0
+ 		self.epl_porosity             = 0
+ 		self.epl_initial_thickness    = 0
++		self.epl_max_thickness        = 0
+ 		self.epl_conductivity         = 0
+                 
+ 		#set defaults
+ 		self.setdefaultparameters()
++
+                 #}}}
+                 
+ 	def __repr__(self): # {{{
+@@ -58,7 +61,8 @@
+ 
+             if self.sedimentlimit_flag==1:
+                 string="%s\n%s"%(string,fielddisplay(self,'sedimentlimit','user defined upper limit for the inefficient layer [m]'))
+-                string="%s\n%s"%(string,fielddisplay(self,'transfer_flag',['what kind of transfer method is applied between the layers']))
++                string="%s\n%s"%(string,fielddisplay(self,'basal_moulin_input','water flux at a given point [m3 s-1]'))
++                string="%s\n%s"%(string,fielddisplay(self,'transfer_flag','what kind of transfer method is applied between the layers'))
+                 string='%55s  0: no transfer',' '
+                 string='%55s  1: constant leakage factor: %s',' ','leakage_factor'
+                 
+@@ -102,11 +106,20 @@
+         self.epl_compressibility      = 1.0e-08
+         self.epl_porosity             = 0.4
+         self.epl_initial_thickness    = 1.0
++        self.epl_max_thickness        = 5.0
+         self.epl_conductivity         = 8.0e-02
+         
+         return self
+     # }}}
+     
++    def initialize(self): # {{{
++        if numpy.all(numpy.isnan(self.basal_moulin_input):
++            self.basal_moulin_input=numpy.zeros(md.mesh.numberofvertices,1)
++            print"      no hydrology.basal_moulin_input specified: values set as zero"
++
++        return self
++
++    # }}}
+     def checkconsistency(self,md,solution,analyses): #{{{ 
+         
+         #Early return
+@@ -126,7 +139,8 @@
+     
+         if self.transfer_flag==1:
+             md = checkfield(md,'fieldname','hydrology.leakage_factor','>',0,'numel',1)
+-            
++
++        md = checkfield(md,'fieldname','hydrology.basal_moulin_input','NaN',1,'forcing',1)
+         md = checkfield(md,'fieldname','hydrology.spcsediment_head','forcing',1)
+         md = checkfield(md,'fieldname','hydrology.sediment_compressibility','>',0,'numel',1)
+         md = checkfield(md,'fieldname','hydrology.sediment_porosity','>',0,'numel',1)
+@@ -158,6 +172,7 @@
+         if self.transfer_flag==1:
+             WriteData(fid,'object',self,'fieldname','leakage_factor','format','Double')
+ 
++	WriteData(fid,'object',self,'fieldname','basal_moulin_input','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
+         WriteData(fid,'object',self,'fieldname','spcsediment_head','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
+         WriteData(fid,'object',self,'fieldname','sediment_compressibility','format','Double')
+         WriteData(fid,'object',self,'fieldname','sediment_porosity','format','Double')			
Index: /issm/oecreview/Archive/18296-19100/ISSM-18585-18586.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18585-18586.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18585-18586.diff	(revision 19102)
@@ -0,0 +1,323 @@
+Index: ../trunk-jpl/src/m/classes/hydrologydc.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 18585)
++++ ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 18586)
+@@ -1,3 +1,4 @@
++import numpy
+ from fielddisplay import fielddisplay
+ from EnumDefinitions import *
+ from checkfield import checkfield
+@@ -4,14 +5,14 @@
+ from WriteData import WriteData
+ 
+ class hydrologydc(object):
+-    """
+-    Hydrologydc class definition
+-    
+-    Usage:
+-    hydrologydc=hydrologydc();
+-    """
++	"""
++	Hydrologydc class definition
+ 
+-    def __init__(self): # {{{
++	Usage:
++		hydrologydc=hydrologydc();
++	"""
++
++	def __init__(self): # {{{
+ 		self.water_compressibility    = 0
+ 		self.isefficientlayer         = 0
+ 		self.penalty_factor           = 0
+@@ -22,7 +23,7 @@
+ 		self.sedimentlimit            = 0
+ 		self.transfer_flag            = 0
+ 		self.leakage_factor           = 0
+-                self.basal_moulin_input       = float('NaN')
++		self.basal_moulin_input       = float('NaN')
+ 
+ 		self.spcsediment_head         = float('NaN')
+ 		self.sediment_transmitivity   = float('NaN')
+@@ -38,153 +39,147 @@
+ 		self.epl_initial_thickness    = 0
+ 		self.epl_max_thickness        = 0
+ 		self.epl_conductivity         = 0
+-                
++				 
+ 		#set defaults
+ 		self.setdefaultparameters()
++	#}}}
+ 
+-                #}}}
+-                
+ 	def __repr__(self): # {{{
+-            string='   hydrology Dual Porous Continuum Equivalent parameters:'
+-            string='   - general parameters'
+-            string="%s\n%s"%(string,fielddisplay(self,'water_compressibility','compressibility of water [Pa^-1]'))
+-            string="%s\n%s"%(string,fielddisplay(self,'isefficientlayer','do we use an efficient drainage system [1: true 0: false]'))
+-            string="%s\n%s"%(string,fielddisplay(self,'penalty_factor','exponent of the value used in the penalisation method [dimensionless]'))
+-            string="%s\n%s"%(string,fielddisplay(self,'penalty_lock','stabilize unstable constraints that keep zigzagging after n iteration (default is 0, no stabilization)'))
+-            string="%s\n%s"%(string,fielddisplay(self,'rel_tol','tolerance of the nonlinear iteration for the transfer between layers [dimensionless]'))
+-            string="%s\n%s"%(string,fielddisplay(self,'max_iter','maximum number of nonlinear iteration'))
+-            string="%s\n%s"%(string,fielddisplay(self,'sedimentlimit_flag','what kind of upper limit is applied for the inefficient layer'))
+-            string='%55s  0: no limit',' '
+-            string='%55s  1: user defined: %s',' ','sedimentlimit'
+-            string='%55s  2: hydrostatic pressure',' '
+-            string='%55s  3: normal stress',' '
++		string='   hydrology Dual Porous Continuum Equivalent parameters:'
++		string='   - general parameters'
++		string="%s\n%s"%(string,fielddisplay(self,'water_compressibility','compressibility of water [Pa^-1]'))
++		string="%s\n%s"%(string,fielddisplay(self,'isefficientlayer','do we use an efficient drainage system [1: true 0: false]'))
++		string="%s\n%s"%(string,fielddisplay(self,'penalty_factor','exponent of the value used in the penalisation method [dimensionless]'))
++		string="%s\n%s"%(string,fielddisplay(self,'penalty_lock','stabilize unstable constraints that keep zigzagging after n iteration (default is 0, no stabilization)'))
++		string="%s\n%s"%(string,fielddisplay(self,'rel_tol','tolerance of the nonlinear iteration for the transfer between layers [dimensionless]'))
++		string="%s\n%s"%(string,fielddisplay(self,'max_iter','maximum number of nonlinear iteration'))
++		string="%s\n%s"%(string,fielddisplay(self,'sedimentlimit_flag','what kind of upper limit is applied for the inefficient layer'))
++		string='%55s  0: no limit',' '
++		string='%55s  1: user defined: %s',' ','sedimentlimit'
++		string='%55s  2: hydrostatic pressure',' '
++		string='%55s  3: normal stress',' '
+ 
+-            if self.sedimentlimit_flag==1:
+-                string="%s\n%s"%(string,fielddisplay(self,'sedimentlimit','user defined upper limit for the inefficient layer [m]'))
+-                string="%s\n%s"%(string,fielddisplay(self,'basal_moulin_input','water flux at a given point [m3 s-1]'))
+-                string="%s\n%s"%(string,fielddisplay(self,'transfer_flag','what kind of transfer method is applied between the layers'))
+-                string='%55s  0: no transfer',' '
+-                string='%55s  1: constant leakage factor: %s',' ','leakage_factor'
+-                
+-            if self.transfer_flag is 1:
+-                string="%s\n%s"%(string,fielddisplay(self,'leakage_factor','user defined leakage factor [m]'))
+-                string='   - for the sediment layer'
+-                string="%s\n%s"%(string,fielddisplay(self,'spcsediment_head','sediment water head constraints (NaN means no constraint) [m above MSL]'))
+-                string="%s\n%s"%(string,fielddisplay(self,'sediment_compressibility','sediment compressibility [Pa^-1]'))
+-                string="%s\n%s"%(string,fielddisplay(self,'sediment_porosity','sediment [dimensionless]'))
+-                string="%s\n%s"%(string,fielddisplay(self,'sediment_thickness','sediment thickness [m]'))
+-                string="%s\n%s"%(string,fielddisplay(self,'sediment_transmitivity','sediment transmitivity [m^2/s]'))
+-            
+-            if self.isefficientlayer==1:
+-                string='   - for the epl layer'
+-                string="%s\n%s"%(string,fielddisplay(self,'spcepl_head','epl water head constraints (NaN means no constraint) [m above MSL]'))
+-                string="%s\n%s"%(string,fielddisplay(self,'mask_eplactive_node','active (1) or not (0) EPL'))
+-                string="%s\n%s"%(string,fielddisplay(self,'epl_compressibility','epl compressibility [Pa^-1]'))
+-                string="%s\n%s"%(string,fielddisplay(self,'epl_porosity','epl [dimensionless]'))
+-                string="%s\n%s"%(string,fielddisplay(self,'epl_initial_thickness','epl initial thickness [m]'))
+-                string="%s\n%s"%(string,fielddisplay(self,'epl_conductivity','epl conductivity [m^2/s]'))
+-            
+-            #}}}
+-    def setdefaultparameters(self): #{{{ 
+-        
+-        #Parameters from de Fleurian 2014
+-        self.water_compressibility    = 5.04e-10
+-        self.isefficientlayer         = 1
+-        self.penalty_factor           = 3
+-        self.rel_tol                  = 1.0e-06
+-        self.max_iter                 = 100
+-        self.sedimentlimit_flag       = 0
+-        self.sedimentlimit            = 0
+-        self.transfer_flag            = 0
+-        self.leakage_factor           = 10.0
+-        
+-        self.sediment_compressibility = 1.0e-08
+-        self.sediment_porosity        = 0.4
+-        self.sediment_thickness       = 20.0
+-        self.sediment_transmitivity   = 8.0e-04
+-        
+-        self.epl_compressibility      = 1.0e-08
+-        self.epl_porosity             = 0.4
+-        self.epl_initial_thickness    = 1.0
+-        self.epl_max_thickness        = 5.0
+-        self.epl_conductivity         = 8.0e-02
+-        
+-        return self
+-    # }}}
+-    
+-    def initialize(self): # {{{
+-        if numpy.all(numpy.isnan(self.basal_moulin_input):
+-            self.basal_moulin_input=numpy.zeros(md.mesh.numberofvertices,1)
+-            print"      no hydrology.basal_moulin_input specified: values set as zero"
++		if self.sedimentlimit_flag==1:
++			string="%s\n%s"%(string,fielddisplay(self,'sedimentlimit','user defined upper limit for the inefficient layer [m]'))
++			string="%s\n%s"%(string,fielddisplay(self,'basal_moulin_input','water flux at a given point [m3 s-1]'))
++			string="%s\n%s"%(string,fielddisplay(self,'transfer_flag','what kind of transfer method is applied between the layers'))
++			string='%55s  0: no transfer',' '
++			string='%55s  1: constant leakage factor: %s',' ','leakage_factor'
++			 
++		if self.transfer_flag is 1:
++			string="%s\n%s"%(string,fielddisplay(self,'leakage_factor','user defined leakage factor [m]'))
++			string='   - for the sediment layer'
++			string="%s\n%s"%(string,fielddisplay(self,'spcsediment_head','sediment water head constraints (NaN means no constraint) [m above MSL]'))
++			string="%s\n%s"%(string,fielddisplay(self,'sediment_compressibility','sediment compressibility [Pa^-1]'))
++			string="%s\n%s"%(string,fielddisplay(self,'sediment_porosity','sediment [dimensionless]'))
++			string="%s\n%s"%(string,fielddisplay(self,'sediment_thickness','sediment thickness [m]'))
++			string="%s\n%s"%(string,fielddisplay(self,'sediment_transmitivity','sediment transmitivity [m^2/s]'))
+ 
+-        return self
++		if self.isefficientlayer==1:
++			string='   - for the epl layer'
++			string="%s\n%s"%(string,fielddisplay(self,'spcepl_head','epl water head constraints (NaN means no constraint) [m above MSL]'))
++			string="%s\n%s"%(string,fielddisplay(self,'mask_eplactive_node','active (1) or not (0) EPL'))
++			string="%s\n%s"%(string,fielddisplay(self,'epl_compressibility','epl compressibility [Pa^-1]'))
++			string="%s\n%s"%(string,fielddisplay(self,'epl_porosity','epl [dimensionless]'))
++			string="%s\n%s"%(string,fielddisplay(self,'epl_initial_thickness','epl initial thickness [m]'))
++			string="%s\n%s"%(string,fielddisplay(self,'epl_conductivity','epl conductivity [m^2/s]'))
++	#}}}
++	def setdefaultparameters(self): #{{{ 
+ 
+-    # }}}
+-    def checkconsistency(self,md,solution,analyses): #{{{ 
+-        
+-        #Early return
+-        if HydrologyDCInefficientAnalysisEnum() not in analyses:
+-            return md
++		#Parameters from de Fleurian 2014
++		self.water_compressibility    = 5.04e-10
++		self.isefficientlayer         = 1
++		self.penalty_factor           = 3
++		self.rel_tol                  = 1.0e-06
++		self.max_iter                 = 100
++		self.sedimentlimit_flag       = 0
++		self.sedimentlimit            = 0
++		self.transfer_flag            = 0
++		self.leakage_factor           = 10.0
+ 
+-        md = checkfield(md,'fieldname','hydrology.water_compressibility','>',0,'numel',1)
+-        md = checkfield(md,'fieldname','hydrology.isefficientlayer','numel',[1],'values',[0 1])
+-        md = checkfield(md,'fieldname','hydrology.penalty_factor','>',0,'numel',1)
+-        md = checkfield(md,'fieldname','hydrology.rel_tol','>',0,'numel',1)
+-        md = checkfield(md,'fieldname','hydrology.max_iter','>',0,'numel',1)
+-        md = checkfield(md,'fieldname','hydrology.sedimentlimit_flag','numel',[1],'values',[0 1 2 3])
+-        md = checkfield(md,'fieldname','hydrology.transfer_flag','numel',[1],'values',[0 1])
+-        
+-        if self.sedimentlimit_flag==1:
+-            md = checkfield(md,'fieldname','hydrology.sedimentlimit','>',0,'numel',1)
+-    
+-        if self.transfer_flag==1:
+-            md = checkfield(md,'fieldname','hydrology.leakage_factor','>',0,'numel',1)
++		self.sediment_compressibility = 1.0e-08
++		self.sediment_porosity        = 0.4
++		self.sediment_thickness       = 20.0
++		self.sediment_transmitivity   = 8.0e-04
+ 
+-        md = checkfield(md,'fieldname','hydrology.basal_moulin_input','NaN',1,'forcing',1)
+-        md = checkfield(md,'fieldname','hydrology.spcsediment_head','forcing',1)
+-        md = checkfield(md,'fieldname','hydrology.sediment_compressibility','>',0,'numel',1)
+-        md = checkfield(md,'fieldname','hydrology.sediment_porosity','>',0,'numel',1)
+-        md = checkfield(md,'fieldname','hydrology.sediment_thickness','>',0,'numel',1)
+-        md = checkfield(md,'fieldname','hydrology.sediment_transmitivity','>=',0,'size',[md.mesh.numberofvertices 1])
+-        if self.isefficientlayer==1:
+-            md = checkfield(md,'fieldname','hydrology.spcepl_head','forcing',1)
+-            md = checkfield(md,'fieldname','hydrology.mask_eplactive_node','size',[md.mesh.numberofvertices 1],'values',[0 1])
+-            md = checkfield(md,'fieldname','hydrology.epl_compressibility','>',0,'numel',1)
+-            md = checkfield(md,'fieldname','hydrology.epl_porosity','>',0,'numel',1)
+-            md = checkfield(md,'fieldname','hydrology.epl_initial_thickness','>',0,'numel',1)
+-            md = checkfield(md,'fieldname','hydrology.epl_conductivity','>',0,'numel',1)
++		self.epl_compressibility      = 1.0e-08
++		self.epl_porosity             = 0.4
++		self.epl_initial_thickness    = 1.0
++		self.epl_max_thickness        = 5.0
++		self.epl_conductivity         = 8.0e-02
+ 
+-        # }}}
+-    def marshall(self,md,fid): #{{{ 
+-        WriteData(fid,'enum',HydrologyModelEnum(),'data',HydrologydcEnum(),'format','Integer')
+-        WriteData(fid,'object',self,'fieldname','water_compressibility','format','Double')
+-        WriteData(fid,'object',self,'fieldname','isefficientlayer','format','Boolean')
+-        WriteData(fid,'object',self,'fieldname','penalty_factor','format','Double')
+-        WriteData(fid,'object',self,'fieldname','penalty_lock','format','Integer')
+-        WriteData(fid,'object',self,'fieldname','rel_tol','format','Double')
+-        WriteData(fid,'object',self,'fieldname','max_iter','format','Integer')
+-        WriteData(fid,'object',self,'fieldname','sedimentlimit_flag','format','Integer')
+-        WriteData(fid,'object',self,'fieldname','transfer_flag','format','Integer')
++		return self
++	# }}}
+ 
+-        if self.sedimentlimit_flag==1:
+-            WriteData(fid,'object',self,'fieldname','sedimentlimit','format','Double')
++	def initialize(self): # {{{
++		if numpy.all(numpy.isnan(self.basal_moulin_input)):
++			self.basal_moulin_input=numpy.zeros(md.mesh.numberofvertices,1)
++			print"      no hydrology.basal_moulin_input specified: values set as zero"
+ 
+-        if self.transfer_flag==1:
+-            WriteData(fid,'object',self,'fieldname','leakage_factor','format','Double')
++		return self
++	# }}}
++	def checkconsistency(self,md,solution,analyses): #{{{ 
+ 
+-	WriteData(fid,'object',self,'fieldname','basal_moulin_input','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
+-        WriteData(fid,'object',self,'fieldname','spcsediment_head','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
+-        WriteData(fid,'object',self,'fieldname','sediment_compressibility','format','Double')
+-        WriteData(fid,'object',self,'fieldname','sediment_porosity','format','Double')			
+-        WriteData(fid,'object',self,'fieldname','sediment_thickness','format','Double')
+-        WriteData(fid,'object',self,'fieldname','sediment_transmitivity','format','DoubleMat','mattype',1)		
++		#Early return
++		if HydrologyDCInefficientAnalysisEnum() not in analyses:
++			return md
+ 
+-        if self.isefficientlayer==1:	
+-            WriteData(fid,'object',self,'fieldname','spcepl_head','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)	
+-            WriteData(fid,'object',self,'fieldname','mask_eplactive_node','format','DoubleMat','mattype',1)
+-            WriteData(fid,'object',self,'fieldname','epl_compressibility','format','Double')			
+-            WriteData(fid,'object',self,'fieldname','epl_porosity','format','Double')			
+-            WriteData(fid,'object',self,'fieldname','epl_initial_thickness','format','Double')
+-            WriteData(fid,'object',self,'fieldname','epl_conductivity','format','Double')
+-# }}}
++		md = checkfield(md,'fieldname','hydrology.water_compressibility','>',0,'numel',1)
++		md = checkfield(md,'fieldname','hydrology.isefficientlayer','numel',[1],'values',[0,1])
++		md = checkfield(md,'fieldname','hydrology.penalty_factor','>',0,'numel',1)
++		md = checkfield(md,'fieldname','hydrology.rel_tol','>',0,'numel',1)
++		md = checkfield(md,'fieldname','hydrology.max_iter','>',0,'numel',1)
++		md = checkfield(md,'fieldname','hydrology.sedimentlimit_flag','numel',[1],'values',[0,1,2,3])
++		md = checkfield(md,'fieldname','hydrology.transfer_flag','numel',[1],'values',[0,1])
+ 
++		if self.sedimentlimit_flag==1:
++			md = checkfield(md,'fieldname','hydrology.sedimentlimit','>',0,'numel',1)
++
++		if self.transfer_flag==1:
++			md = checkfield(md,'fieldname','hydrology.leakage_factor','>',0,'numel',1)
++
++		md = checkfield(md,'fieldname','hydrology.basal_moulin_input','NaN',1,'forcing',1)
++		md = checkfield(md,'fieldname','hydrology.spcsediment_head','forcing',1)
++		md = checkfield(md,'fieldname','hydrology.sediment_compressibility','>',0,'numel',1)
++		md = checkfield(md,'fieldname','hydrology.sediment_porosity','>',0,'numel',1)
++		md = checkfield(md,'fieldname','hydrology.sediment_thickness','>',0,'numel',1)
++		md = checkfield(md,'fieldname','hydrology.sediment_transmitivity','>=',0,'size',[md.mesh.numberofvertices,1])
++		if self.isefficientlayer==1:
++			md = checkfield(md,'fieldname','hydrology.spcepl_head','forcing',1)
++			md = checkfield(md,'fieldname','hydrology.mask_eplactive_node','size',[md.mesh.numberofvertices,1],'values',[0,1])
++			md = checkfield(md,'fieldname','hydrology.epl_compressibility','>',0,'numel',1)
++			md = checkfield(md,'fieldname','hydrology.epl_porosity','>',0,'numel',1)
++			md = checkfield(md,'fieldname','hydrology.epl_initial_thickness','>',0,'numel',1)
++			md = checkfield(md,'fieldname','hydrology.epl_conductivity','>',0,'numel',1)
++	# }}}
++	def marshall(self,md,fid): #{{{ 
++		WriteData(fid,'enum',HydrologyModelEnum(),'data',HydrologydcEnum(),'format','Integer')
++		WriteData(fid,'object',self,'fieldname','water_compressibility','format','Double')
++		WriteData(fid,'object',self,'fieldname','isefficientlayer','format','Boolean')
++		WriteData(fid,'object',self,'fieldname','penalty_factor','format','Double')
++		WriteData(fid,'object',self,'fieldname','penalty_lock','format','Integer')
++		WriteData(fid,'object',self,'fieldname','rel_tol','format','Double')
++		WriteData(fid,'object',self,'fieldname','max_iter','format','Integer')
++		WriteData(fid,'object',self,'fieldname','sedimentlimit_flag','format','Integer')
++		WriteData(fid,'object',self,'fieldname','transfer_flag','format','Integer')
++		if self.sedimentlimit_flag==1:
++			WriteData(fid,'object',self,'fieldname','sedimentlimit','format','Double')
++
++		if self.transfer_flag==1:
++			WriteData(fid,'object',self,'fieldname','leakage_factor','format','Double')
++
++		WriteData(fid,'object',self,'fieldname','basal_moulin_input','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'fieldname','spcsediment_head','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'fieldname','sediment_compressibility','format','Double')
++		WriteData(fid,'object',self,'fieldname','sediment_porosity','format','Double')			
++		WriteData(fid,'object',self,'fieldname','sediment_thickness','format','Double')
++		WriteData(fid,'object',self,'fieldname','sediment_transmitivity','format','DoubleMat','mattype',1)		
++
++		if self.isefficientlayer==1:	
++			WriteData(fid,'object',self,'fieldname','spcepl_head','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)	
++			WriteData(fid,'object',self,'fieldname','mask_eplactive_node','format','DoubleMat','mattype',1)
++			WriteData(fid,'object',self,'fieldname','epl_compressibility','format','Double')			
++			WriteData(fid,'object',self,'fieldname','epl_porosity','format','Double')			
++			WriteData(fid,'object',self,'fieldname','epl_initial_thickness','format','Double')
++			WriteData(fid,'object',self,'fieldname','epl_conductivity','format','Double')
++	# }}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18586-18587.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18586-18587.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18586-18587.diff	(revision 19102)
@@ -0,0 +1,123 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 18586)
++++ ../trunk-jpl/src/m/contrib/gravity/vfsa_mpi.cpp	(revision 18587)
+@@ -149,12 +149,12 @@
+ 		srand (time(NULL));            /*}}}*/
+ 	/* Define the variables {{{*/
+ 
+-	int    dx     = 500;   /* prism dimension in x-direction                           */
+-	int    dy     = 500;   /* prism dimension in y-direction                           */
+-	int    mx     = 39;    /* number of prisms in x-direction                          */
+-	int    my     = 60;    /* number of prisms in y-direction                          */
+-	int    nx     = 39;    /* number of data points in x-direction                     */
+-	int    ny     = 60;    /* number of data points in y-direction                     */
++	int    dx     = 1000;   /* prism dimension in x-direction                           */
++	int    dy     = 1000;   /* prism dimension in y-direction                           */
++	int    mx     = 99;    /* number of prisms in x-direction                          */
++	int    my     = 99;    /* number of prisms in y-direction                          */
++	int    nx     = 99;    /* number of data points in x-direction                     */
++	int    ny     = 99;    /* number of data points in y-direction                     */
+ 	int    dn     = 15000; /* distance for neighbouting prisms for gravity calculation */
+ 	double ptval  = 100.;  /* max. amount to perturb model                             */
+ 	double ptval2 = 100.;
+@@ -168,7 +168,7 @@
+ 	makep(Pp,mx,my,dx,dy);
+ 	// Pp->Echo();
+ 
+-	double  rhoi = 890;           /* ice density     */
++	double  rhoi = 917;           /* ice density     */
+ 	double  rhow = 1030;          /* water density   */
+ 	// double  rhos = 2013;		      /* sediment density */
+ 	double  rhoc = 2670;          /* bedrock density */
+@@ -184,10 +184,10 @@
+ 	rho2->SetValue(0,0,rhoi-rhoc);
+ 	rho2->SetValue(0,1,rhow-rhoc);
+ 
+-	double dlevel=860;         /* level of data acquisition */
++	double dlevel=2400;         /* level of data acquisition */
+ 
+ 	double ctr=1;            /* parameter for filtering */
+-	double sd=0.5;
++	double sd=0.1;
+ 
+ 	Matrix *xobs= new Matrix(ny,nx);
+ 	Matrix *yobs= new Matrix(ny,nx);
+@@ -197,9 +197,9 @@
+ 	//	yobs->Echo();
+ 
+ 
+-	double mmax  = 1000;               /* max value for layer interfaces */
+-	double mmax2 = 1000;
+-	double mmax3 = 1000;
++	double mmax  = 2000;               /* max value for layer interfaces */
++	double mmax2 = 2000;
++	double mmax3 = 2000;
+ 
+ 	/* control parameter for temperature schedule  */
+ 
+@@ -225,7 +225,7 @@
+ 
+ 	/*landmask */
+ 
+-	ifstream file("landmask.txt");
++	ifstream file("landmaskzach.txt");
+ 	Matrix * landmask= new Matrix(nx*ny,1);
+ 	double inputnumber;
+ 	for(int i=0;i<ny*nx; i++){ 
+@@ -236,7 +236,7 @@
+ 
+ 	/* Observed gravity anomaly */
+ 
+-	ifstream file1("store_fa500_36s.txt");
++	ifstream file1("gravityzach.txt");
+ 	Matrix * gobs= new Matrix(nx*ny,1);
+ 	for(int i=0;i<ny*nx; i++){ 
+ 		file1 >> inputnumber;
+@@ -247,7 +247,7 @@
+ 
+ 	/* load data about the ice thickness */
+ 
+-	ifstream file2("store_flag_icethick500.txt");
++	ifstream file2("icethickzach.txt");
+ 	Matrix * icethick= new Matrix(mx*my,1);
+ 	for(int s=0;s<mx*my; s++){ 
+ 		file2 >> inputnumber;
+@@ -258,7 +258,7 @@
+ 
+ 	/* load the batimethry data */
+ 
+-	ifstream file3("store_flag_bathy500.txt");
++	ifstream file3("bathymetryzach.txt");
+ 	Matrix * bathy= new Matrix(mx*my,1);
+ 	for(int s=0;s<mx*my; s++){ 
+ 		file3 >> inputnumber;
+@@ -270,7 +270,7 @@
+ 	/* id of grid to evaluate misfit */
+ 
+ 
+-	ifstream file4("store_flag_eval500.txt");
++	ifstream file4("evalidzach.txt");
+ 	Matrix * evalid= new Matrix(nx*ny,1);
+ 	for(int s=0;s<nx*ny; s++){ 
+ 		file4 >> inputnumber;
+@@ -281,7 +281,7 @@
+ 
+ 	/* initial guess of the model */
+ 
+-	ifstream file5("m0_140114b.txt");
++	ifstream file5("m0_092614zach.txt");
+ 	Matrix * mesh_ini= new Matrix(mx*my,3);
+ 	for(int s=0;s<mx*my; s++){ 
+ 		for(int j=0;j<3;j++){
+@@ -295,8 +295,8 @@
+ 	/* VFSA {{{ */
+ 
+ 	/* name of the files to save results */
+-	std::ofstream savefile1 ("r_140114b.txt");
+-	std::ofstream savefile2("m_140114b.txt");
++	std::ofstream savefile1 ("r_zach.txt");
++	std::ofstream savefile2("m_zach.txt");
+ 
+ 	/* counters initialization */
+ 	int    success   = 0;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18587-18588.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18587-18588.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18587-18588.diff	(revision 19102)
@@ -0,0 +1,50 @@
+Index: ../trunk-jpl/src/c/shared/FSanalyticals/fsanalyticals.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/FSanalyticals/fsanalyticals.cpp	(revision 18587)
++++ ../trunk-jpl/src/c/shared/FSanalyticals/fsanalyticals.cpp	(revision 18588)
+@@ -53,9 +53,12 @@
+ 		case 13:
+ 			z=y;
+ 			return 8.0*pow(PI, 2)*pow(x, 2)*(z - 2)*sin(4*PI*x*z) - 4.0*PI*x*cos(4*PI*x*z) + 16.0*pow(PI, 2)*pow(z, 2)*(z - 2)*sin(4*PI*x*z) - 0.25*PI*((16*pow(PI, 2)*x*z*(PI*x*z - PI*x)*cos(4*PI*x*z) + 4*pow(PI, 2)*x*z*(8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*sin(4*PI*x*z) + 4*pow(PI, 2)*x*z*sin(4*PI*x*z) - 4*PI*x*(-PI*z + PI)*sin(4*PI*x*z) - 16*PI*x*(pow(PI, 2)*x*pow(z, 2) - 2*pow(PI, 2)*x*z)*cos(4*PI*x*z) - 16*PI*z*(pow(PI, 2)*pow(x, 2)*z - pow(PI, 2)*pow(x, 2))*cos(4*PI*x*z) + 4*PI*(PI*x*z - PI*x)*sin(4*PI*x*z) - 8*(pow(PI, 2)*x*z - pow(PI, 2)*x)*sin(4*PI*x*z) - PI*(8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*cos(4*PI*x*z) - PI*cos(4*PI*x*z))/(pow(PI, 3)*pow(x, 3)) + 3*(-4*PI*x*(PI*x*z - PI*x)*sin(4*PI*x*z) + PI*x*(8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*cos(4*PI*x*z) + PI*x*cos(4*PI*x*z) + 4*(pow(PI, 2)*pow(x, 2)*z - pow(PI, 2)*pow(x, 2))*sin(4*PI*x*z))/(pow(PI, 3)*pow(x, 4))) + 4*PI*sin(4*PI*z)*cos(4*PI*x);
++		case 14:
++			z=y;
++			return 8.0*pow(2, 1.0L/3.0L)*pow(M_PI, 2)*pow(z, 2)*(z - 2.0)*sin(4*M_PI*x*z)/pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 2*pow(M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) + 0.03125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.25*sin(4*M_PI*x*z) + (1.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + 0.0625*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 1.0L/3.0L) - 0.0266666666666667*pow(2, 1.0L/3.0L)*M_PI*z*(z - 2.0)*(800.0*pow(M_PI, 3)*pow(z, 3)*pow(z - 2.0, 2)*sin(4*M_PI*x*z)*cos(4*M_PI*x*z) - 4*(-5.0*M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) - 0.15625*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) - 1.25*sin(4*M_PI*x*z) - M_PI*cos(4*M_PI*x))*(20.0*pow(M_PI, 2)*x*z*(z - 2.0)*sin(4*M_PI*x*z) - 5.0*M_PI*z*cos(4*M_PI*x*z) - 5.0*M_PI*(z - 2.0)*cos(4*M_PI*x*z) - 0.625*M_PI*(4*(4*pow(M_PI, 2)*pow(z, 2)*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*pow(z, 2)*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + 2*M_PI*z*(M_PI*z - 1.0*M_PI)*sin(4*M_PI*x*z) - 8*M_PI*z*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - (pow(M_PI, 2)*pow(z, 2) - 2.0*pow(M_PI, 2)*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 6*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4)) - 6.0/(pow(M_PI, 2)*pow(x, 4)) - 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 5))) + 4*pow(M_PI, 2)*sin(4*M_PI*x)) + 3.125*(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))*(16*pow(M_PI, 2)*x*z*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*sin(4*M_PI*x*z) + 4*M_PI*x*(M_PI*z - 1.0*M_PI)*sin(4*M_PI*x*z) - 16*M_PI*x*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - 16*M_PI*z*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z) + 4*M_PI*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) - 8*(pow(M_PI, 2)*x*z - 1.0*pow(M_PI, 2)*x)*sin(4*M_PI*x*z) - M_PI*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - M_PI*cos(4*M_PI*x*z))/(pow(M_PI, 4)*pow(x, 6)) + 9.375*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 7)))*cos(4*M_PI*x*z)/pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 2*pow(M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) + 0.03125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.25*sin(4*M_PI*x*z) + (1.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + 0.0625*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 4.0L/3.0L) + (1.0L/10.0L)*pow(2, 1.0L/3.0L)*(40.0*pow(M_PI, 2)*pow(x, 2)*(z - 2.0)*sin(4*M_PI*x*z) - 20.0*M_PI*x*cos(4*M_PI*x*z) - 1.25*M_PI*((16*pow(M_PI, 2)*x*z*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*sin(4*M_PI*x*z) + 4*M_PI*x*(M_PI*z - 1.0*M_PI)*sin(4*M_PI*x*z) - 16*M_PI*x*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - 16*M_PI*z*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z) + 4*M_PI*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) - 8*(pow(M_PI, 2)*x*z - 1.0*pow(M_PI, 2)*x)*sin(4*M_PI*x*z) - M_PI*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - M_PI*cos(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 3*(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))))/pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 2*pow(M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) + 0.03125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.25*sin(4*M_PI*x*z) + (1.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + 0.0625*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 1.0L/3.0L) + 4*M_PI*sin(4*M_PI*z)*cos(4*M_PI*x) + (1.0L/150.0L)*pow(2, 1.0L/3.0L)*(-10.0*M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) - 0.3125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) - 2.5*sin(4*M_PI*x*z) - 2*M_PI*cos(4*M_PI*x))*(160.0*pow(M_PI, 3)*x*pow(z, 2)*pow(z - 2.0, 2)*sin(4*M_PI*x*z)*cos(4*M_PI*x*z) - 40.0*pow(M_PI, 2)*pow(z, 2)*(z - 2.0)*pow(cos(4*M_PI*x*z), 2) - 40.0*pow(M_PI, 2)*z*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 4*(-4.0*pow(M_PI, 2)*pow(x, 2)*(z - 2.0)*sin(4*M_PI*x*z) + 2.0*M_PI*x*cos(4*M_PI*x*z) + 0.125*M_PI*((16*pow(M_PI, 2)*x*z*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*sin(4*M_PI*x*z) + 4*M_PI*x*(M_PI*z - 1.0*M_PI)*sin(4*M_PI*x*z) - 16*M_PI*x*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - 16*M_PI*z*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z) + 4*M_PI*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) - 8*(pow(M_PI, 2)*x*z - 1.0*pow(M_PI, 2)*x)*sin(4*M_PI*x*z) - M_PI*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - M_PI*cos(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 3*(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))))*(-5.0*M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) - 0.15625*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) - 1.25*sin(4*M_PI*x*z) - M_PI*cos(4*M_PI*x)) + 2.5*(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))*(4*pow(M_PI, 2)*pow(x, 2)*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*pow(x, 2)*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + pow(M_PI, 2)*pow(x, 2)*sin(4*M_PI*x*z) - 8*M_PI*x*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z))/(pow(M_PI, 4)*pow(x, 6)))/pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 2*pow(M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) + 0.03125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.25*sin(4*M_PI*x*z) + (1.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + 0.0625*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 4.0L/3.0L);
+ 		case 21:
+ 			z=y;
+-			return z - 4.0L/3.0L*pow(2, 1.0L/3.0L)*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(4*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(pow(x, 2)*z*(z - 1)*(2*z - 1) + 4*x*z*(x - 1)*(z - 1)*(2*z - 1) + z*pow(x - 1, 2)*(z - 1)*(2*z - 1)) + 4*(2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) + z*(6*pow(x, 2) - 6*x + 1))*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x)) + (2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1))*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1) - 3*pow(z, 4)*(2*x - 1) + 6*pow(z, 3)*(2*x - 1) - 3*pow(z, 2)*(2*x - 1)))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 4.0L/3.0L) - 1.0L/3.0L*pow(2, 1.0L/3.0L)*(4*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1)) + 4*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x))*(2*pow(x, 3) - 3*pow(x, 2) + x + 6*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 6*z*(2*pow(x, 3) - 3*pow(x, 2) + x)) + (2*pow(x, 2)*z*pow(x - 1, 2) + 2*pow(x, 2)*pow(x - 1, 2)*(z - 1) + pow(x, 2)*pow(x - 1, 2)*(2*z - 1) - 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) + 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) - z*(6*pow(x, 2) - 6*x + 1))*(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1)))*(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 4.0L/3.0L) + 2*pow(2, 1.0L/3.0L)*(pow(x, 2)*z*(z - 1)*(2*z - 1) + 4*x*z*(x - 1)*(z - 1)*(2*z - 1) + z*pow(x - 1, 2)*(z - 1)*(2*z - 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 1.0L/3.0L) - 1.0L/2.0L + pow(2, 1.0L/3.0L)*(2*pow(x, 2)*z*pow(x - 1, 2) + 2*pow(x, 2)*pow(x - 1, 2)*(z - 1) + pow(x, 2)*pow(x - 1, 2)*(2*z - 1) - 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) + 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) - z*(6*pow(x, 2) - 6*x + 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 1.0L/3.0L);
++			return z - 4.0L/3.0L*pow(2, 1.0L/3.0L)*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(4*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(pow(x, 2)*z*(z - 1)*(2*z - 1) + 4*x*z*(x - 1)*(z - 1)*(2*z - 1) + z*pow(x - 1, 2)*(z - 1)*(2*z - 1)) + 4*(2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) + z*(6*pow(x, 2) - 6*x + 1))*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x)) + (2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1))*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1) - 3*pow(z, 4)*(2*x - 1) + 6*pow(z, 3)*(2*x - 1) - 3*pow(z, 2)*(2*x - 1)))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 4.0L/3.0L) - 1.0L/3.0L*pow(2, 1.0L/3.0L)*(4*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1)) + 4*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x))*(2*pow(x, 3) - 3*pow(x, 2) + x + 6*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 6*z*(2*pow(x, 3) - 3*pow(x, 2) + x)) + (2*pow(x, 2)*z*pow(x - 1, 2) + 2*pow(x, 2)*pow(x - 1, 2)*(z - 1) + pow(x, 2)*pow(x - 1, 2)*(2*z - 1) - 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) + 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) - z*(6*pow(x, 2) - 6*x + 1))*(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1)))*(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 4.0L/3.0L) + 2*pow(2, 1.0L/3.0L)*(pow(x, 2)*z*(z - 1)*(2*z - 1) + 4*x*z*(x - 1)*(z - 1)*(2*z - 1) + z*pow(x - 1, 2)*(z - 1)*(2*z - 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 1.0L/3.0L) - 0.5 + pow(2, 1.0L/3.0L)*(2*pow(x, 2)*z*pow(x - 1, 2) + 2*pow(x, 2)*pow(x - 1, 2)*(z - 1) + pow(x, 2)*pow(x - 1, 2)*(2*z - 1) - 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) + 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) - z*(6*pow(x, 2) - 6*x + 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 1.0L/3.0L);
+ 		case 24:
+ 			return 2*pow(2, 1.0L/3.0L)*pow(PI, 2)*pow(p, 2)*sin(PI*p*y)*sin(PI*p*z)*cos(PI*p*x)/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 1.0L/3.0L) - 2.0L/3.0L*pow(2, 1.0L/3.0L)*PI*p*(12*pow(PI, 3)*pow(p, 3)*sin(PI*p*x)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2)*cos(PI*p*x) - (-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x))*(pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*sin(PI*p*x)*sin(PI*p*z) - 2*pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*z)*cos(PI*p*y)) + (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z))*(pow(PI, 3)*pow(p, 3)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*cos(PI*p*x)*cos(PI*p*y) + pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*cos(PI*p*x)*cos(PI*p*z)) - (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z))*(pow(PI, 3)*pow(p, 3)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*sin(PI*p*y) - 2*pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*y)*cos(PI*p*z)))*sin(PI*p*x)*sin(PI*p*y)*sin(PI*p*z)/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 4.0L/3.0L) + PI*q*sin(PI*q*y)*sin(PI*q*z)*cos(PI*q*x) - 1.0L/6.0L*pow(2, 1.0L/3.0L)*(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x))*(12*pow(PI, 3)*pow(p, 3)*pow(sin(PI*p*x), 2)*sin(PI*p*y)*pow(sin(PI*p*z), 2)*cos(PI*p*y) + (-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x))*(2*pow(PI, 2)*pow(p, 2)*(cos(PI*p*x) - 1)*sin(PI*p*y)*sin(PI*p*z) - pow(PI, 2)*pow(p, 2)*sin(PI*p*y)*sin(PI*p*z)*cos(PI*p*x)) - (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z))*(pow(PI, 3)*pow(p, 3)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*sin(PI*p*y) + pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*y)*cos(PI*p*z)) + (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z))*(pow(PI, 3)*pow(p, 3)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*cos(PI*p*x)*cos(PI*p*y) - 2*pow(PI, 2)*pow(p, 2)*(cos(PI*p*x) - 1)*cos(PI*p*y)*cos(PI*p*z)))/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 4.0L/3.0L) - 1.0L/6.0L*pow(2, 1.0L/3.0L)*(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z))*(12*pow(PI, 3)*pow(p, 3)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*sin(PI*p*z)*cos(PI*p*z) + (-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x))*(-2*pow(PI, 2)*pow(p, 2)*(cos(PI*p*x) - 1)*cos(PI*p*y)*cos(PI*p*z) + pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*cos(PI*p*x)*cos(PI*p*z)) - (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z))*(pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*sin(PI*p*x)*sin(PI*p*z) + pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*z)*cos(PI*p*y)) + (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z))*(2*pow(PI, 2)*pow(p, 2)*(cos(PI*p*x) - 1)*sin(PI*p*y)*sin(PI*p*z) - pow(PI, 2)*pow(p, 2)*sin(PI*p*y)*sin(PI*p*z)*cos(PI*p*x)))/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 4.0L/3.0L) + pow(2, 1.0L/3.0L)*(2*pow(PI, 2)*pow(p, 2)*(cos(PI*p*x) - 1)*sin(PI*p*y)*sin(PI*p*z) - pow(PI, 2)*pow(p, 2)*sin(PI*p*y)*sin(PI*p*z)*cos(PI*p*x))/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 1.0L/3.0L);
+ 
+@@ -104,9 +107,12 @@
+ 		case 13:
+ 			z=y;
+ 			return 8.0*pow(PI, 2)*x*z*(z - 2)*sin(4*PI*x*z) - 2.0*PI*z*cos(4*PI*x*z) - 2.0*PI*(z - 2)*cos(4*PI*x*z) + 0.25*PI*(32*cos(4*PI*x)/pow(x, 2) - 4*(8*pow(PI, 2)*pow(x, 2) + 1)*sin(4*PI*x)/(PI*pow(x, 3)) - 4*(4*pow(PI, 2)*pow(z, 2)*(PI*x*z - PI*x)*cos(4*PI*x*z) + pow(PI, 2)*pow(z, 2)*(8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*sin(4*PI*x*z) - 2*PI*z*(-PI*z + PI)*sin(4*PI*x*z) - 8*PI*z*(pow(PI, 2)*x*pow(z, 2) - 2*pow(PI, 2)*x*z)*cos(4*PI*x*z) - (pow(PI, 2)*pow(z, 2) - 2*pow(PI, 2)*z)*sin(4*PI*x*z))/(pow(PI, 3)*pow(x, 3)) - 20*sin(4*PI*x)/(PI*pow(x, 3)) - 6*(8*pow(PI, 2)*pow(x, 2) + 1)*cos(4*PI*x)/(pow(PI, 2)*pow(x, 4)) - 6*(-4*PI*z*(PI*x*z - PI*x)*sin(4*PI*x*z) + PI*z*(8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*cos(4*PI*x*z) - (-PI*z + PI)*cos(4*PI*x*z) + 4*(pow(PI, 2)*x*pow(z, 2) - 2*pow(PI, 2)*x*z)*sin(4*PI*x*z))/(pow(PI, 3)*pow(x, 4)) + 3*(8*pow(PI, 2)*pow(x, 2) + 1)*sin(4*PI*x)/(pow(PI, 3)*pow(x, 5)) + 3*(4*(PI*x*z - PI*x)*cos(4*PI*x*z) + (8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*sin(4*PI*x*z))/(pow(PI, 3)*pow(x, 5))) + 4*PI*sin(4*PI*x)*cos(4*PI*z) + (8.0L/5.0L)*pow(PI, 2)*sin(4*PI*x) + 2*(-4.0*pow(PI, 2)*pow(x, 2)*(PI*x*z - PI*x)*cos(4*PI*x*z) - 1.0*pow(PI, 2)*pow(x, 2)*(8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*sin(4*PI*x*z) - 1.0*pow(PI, 2)*pow(x, 2)*sin(4*PI*x*z) + 8.0*PI*x*(pow(PI, 2)*pow(x, 2)*z - pow(PI, 2)*pow(x, 2))*cos(4*PI*x*z))/(pow(PI, 2)*pow(x, 3));
++		case 14:
++			z=y;
++			return 4*M_PI*sin(4*M_PI*x)*cos(4*M_PI*z) + (1.0L/10.0L)*pow(2, 1.0L/3.0L)*(40.0*pow(M_PI, 2)*x*z*(z - 2.0)*sin(4*M_PI*x*z) - 10.0*M_PI*z*cos(4*M_PI*x*z) - 10.0*M_PI*(z - 2.0)*cos(4*M_PI*x*z) - 1.25*M_PI*(4*(4*pow(M_PI, 2)*pow(z, 2)*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*pow(z, 2)*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + 2*M_PI*z*(M_PI*z - 1.0*M_PI)*sin(4*M_PI*x*z) - 8*M_PI*z*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - (pow(M_PI, 2)*pow(z, 2) - 2.0*pow(M_PI, 2)*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 6*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4)) - 6.0/(pow(M_PI, 2)*pow(x, 4)) - 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 5))) + 8*pow(M_PI, 2)*sin(4*M_PI*x))/pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 2*pow(M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) + 0.03125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.25*sin(4*M_PI*x*z) + (1.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + 0.0625*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 1.0L/3.0L) + (1.0L/750.0L)*pow(2, 1.0L/3.0L)*(-10.0*M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) - 0.3125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) - 2.5*sin(4*M_PI*x*z) - 2*M_PI*cos(4*M_PI*x))*(800.0*pow(M_PI, 3)*pow(z, 3)*pow(z - 2.0, 2)*sin(4*M_PI*x*z)*cos(4*M_PI*x*z) - 4*(-5.0*M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) - 0.15625*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) - 1.25*sin(4*M_PI*x*z) - M_PI*cos(4*M_PI*x))*(20.0*pow(M_PI, 2)*x*z*(z - 2.0)*sin(4*M_PI*x*z) - 5.0*M_PI*z*cos(4*M_PI*x*z) - 5.0*M_PI*(z - 2.0)*cos(4*M_PI*x*z) - 0.625*M_PI*(4*(4*pow(M_PI, 2)*pow(z, 2)*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*pow(z, 2)*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + 2*M_PI*z*(M_PI*z - 1.0*M_PI)*sin(4*M_PI*x*z) - 8*M_PI*z*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - (pow(M_PI, 2)*pow(z, 2) - 2.0*pow(M_PI, 2)*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 6*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4)) - 6.0/(pow(M_PI, 2)*pow(x, 4)) - 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 5))) + 4*pow(M_PI, 2)*sin(4*M_PI*x)) + 3.125*(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))*(16*pow(M_PI, 2)*x*z*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*sin(4*M_PI*x*z) + 4*M_PI*x*(M_PI*z - 1.0*M_PI)*sin(4*M_PI*x*z) - 16*M_PI*x*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - 16*M_PI*z*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z) + 4*M_PI*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) - 8*(pow(M_PI, 2)*x*z - 1.0*pow(M_PI, 2)*x)*sin(4*M_PI*x*z) - M_PI*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - M_PI*cos(4*M_PI*x*z))/(pow(M_PI, 4)*pow(x, 6)) + 9.375*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 7)))/pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 2*pow(M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) + 0.03125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.25*sin(4*M_PI*x*z) + (1.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + 0.0625*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 4.0L/3.0L) - 1.0*pow(2, 1.0L/3.0L)*(4*pow(M_PI, 2)*pow(x, 2)*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*pow(x, 2)*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + pow(M_PI, 2)*pow(x, 2)*sin(4*M_PI*x*z) - 8*M_PI*x*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z))/(pow(M_PI, 2)*pow(x, 3)*pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 2*pow(M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) + 0.03125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.25*sin(4*M_PI*x*z) + (1.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + 0.0625*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 1.0L/3.0L)) + 0.0166666666666667*pow(2, 1.0L/3.0L)*(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))*(160.0*pow(M_PI, 3)*x*pow(z, 2)*pow(z - 2.0, 2)*sin(4*M_PI*x*z)*cos(4*M_PI*x*z) - 40.0*pow(M_PI, 2)*pow(z, 2)*(z - 2.0)*pow(cos(4*M_PI*x*z), 2) - 40.0*pow(M_PI, 2)*z*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 4*(-4.0*pow(M_PI, 2)*pow(x, 2)*(z - 2.0)*sin(4*M_PI*x*z) + 2.0*M_PI*x*cos(4*M_PI*x*z) + 0.125*M_PI*((16*pow(M_PI, 2)*x*z*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*sin(4*M_PI*x*z) + 4*M_PI*x*(M_PI*z - 1.0*M_PI)*sin(4*M_PI*x*z) - 16*M_PI*x*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - 16*M_PI*z*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z) + 4*M_PI*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) - 8*(pow(M_PI, 2)*x*z - 1.0*pow(M_PI, 2)*x)*sin(4*M_PI*x*z) - M_PI*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - M_PI*cos(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 3*(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))))*(-5.0*M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) - 0.15625*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) - 1.25*sin(4*M_PI*x*z) - M_PI*cos(4*M_PI*x)) + 2.5*(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))*(4*pow(M_PI, 2)*pow(x, 2)*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*pow(x, 2)*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + pow(M_PI, 2)*pow(x, 2)*sin(4*M_PI*x*z) - 8*M_PI*x*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z))/(pow(M_PI, 4)*pow(x, 6)))/(pow(M_PI, 2)*pow(x, 3)*pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 2*pow(M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) + 0.03125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.25*sin(4*M_PI*x*z) + (1.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + 0.0625*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 4.0L/3.0L));
+ 		case 21:
+ 			z=y;
+-			return x + (4.0L/3.0L)*pow(2, 1.0L/3.0L)*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x))*(4*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1)) + 4*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x))*(2*pow(x, 3) - 3*pow(x, 2) + x + 6*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 6*z*(2*pow(x, 3) - 3*pow(x, 2) + x)) + (2*pow(x, 2)*z*pow(x - 1, 2) + 2*pow(x, 2)*pow(x - 1, 2)*(z - 1) + pow(x, 2)*pow(x - 1, 2)*(2*z - 1) - 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) + 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) - z*(6*pow(x, 2) - 6*x + 1))*(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1)))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 4.0L/3.0L) - 1.0L/3.0L*pow(2, 1.0L/3.0L)*(4*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(pow(x, 2)*z*(z - 1)*(2*z - 1) + 4*x*z*(x - 1)*(z - 1)*(2*z - 1) + z*pow(x - 1, 2)*(z - 1)*(2*z - 1)) + 4*(2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) + z*(6*pow(x, 2) - 6*x + 1))*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x)) + (2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1))*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1) - 3*pow(z, 4)*(2*x - 1) + 6*pow(z, 3)*(2*x - 1) - 3*pow(z, 2)*(2*x - 1)))*(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 4.0L/3.0L) - 1.0L/2.0L - 2*pow(2, 1.0L/3.0L)*(2*pow(x, 3) - 3*pow(x, 2) + x + 6*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 6*z*(2*pow(x, 3) - 3*pow(x, 2) + x))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 1.0L/3.0L) + pow(2, 1.0L/3.0L)*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1) - 3*pow(z, 4)*(2*x - 1) + 6*pow(z, 3)*(2*x - 1) - 3*pow(z, 2)*(2*x - 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 1.0L/3.0L);
++			return x + (4.0L/3.0L)*pow(2, 1.0L/3.0L)*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x))*(4*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1)) + 4*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x))*(2*pow(x, 3) - 3*pow(x, 2) + x + 6*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 6*z*(2*pow(x, 3) - 3*pow(x, 2) + x)) + (2*pow(x, 2)*z*pow(x - 1, 2) + 2*pow(x, 2)*pow(x - 1, 2)*(z - 1) + pow(x, 2)*pow(x - 1, 2)*(2*z - 1) - 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) + 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) - z*(6*pow(x, 2) - 6*x + 1))*(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1)))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 4.0L/3.0L) - 1.0L/3.0L*pow(2, 1.0L/3.0L)*(4*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(pow(x, 2)*z*(z - 1)*(2*z - 1) + 4*x*z*(x - 1)*(z - 1)*(2*z - 1) + z*pow(x - 1, 2)*(z - 1)*(2*z - 1)) + 4*(2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) + z*(6*pow(x, 2) - 6*x + 1))*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x)) + (2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1))*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1) - 3*pow(z, 4)*(2*x - 1) + 6*pow(z, 3)*(2*x - 1) - 3*pow(z, 2)*(2*x - 1)))*(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 4.0L/3.0L) - 0.5 - 2*pow(2, 1.0L/3.0L)*(2*pow(x, 3) - 3*pow(x, 2) + x + 6*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 6*z*(2*pow(x, 3) - 3*pow(x, 2) + x))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 1.0L/3.0L) + pow(2, 1.0L/3.0L)*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1) - 3*pow(z, 4)*(2*x - 1) + 6*pow(z, 3)*(2*x - 1) - 3*pow(z, 2)*(2*x - 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 1.0L/3.0L);
+ 		case 24:
+ 			return -pow(2, 1.0L/3.0L)*pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*z)*cos(PI*p*y)/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 1.0L/3.0L) + (1.0L/3.0L)*pow(2, 1.0L/3.0L)*PI*p*(12*pow(PI, 3)*pow(p, 3)*pow(sin(PI*p*x), 2)*sin(PI*p*y)*pow(sin(PI*p*z), 2)*cos(PI*p*y) + (-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x))*(2*pow(PI, 2)*pow(p, 2)*(cos(PI*p*x) - 1)*sin(PI*p*y)*sin(PI*p*z) - pow(PI, 2)*pow(p, 2)*sin(PI*p*y)*sin(PI*p*z)*cos(PI*p*x)) - (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z))*(pow(PI, 3)*pow(p, 3)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*sin(PI*p*y) + pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*y)*cos(PI*p*z)) + (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z))*(pow(PI, 3)*pow(p, 3)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*cos(PI*p*x)*cos(PI*p*y) - 2*pow(PI, 2)*pow(p, 2)*(cos(PI*p*x) - 1)*cos(PI*p*y)*cos(PI*p*z)))*sin(PI*p*x)*sin(PI*p*y)*sin(PI*p*z)/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 4.0L/3.0L) + PI*q*sin(PI*q*x)*sin(PI*q*z)*cos(PI*q*y) - 1.0L/6.0L*pow(2, 1.0L/3.0L)*(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x))*(12*pow(PI, 3)*pow(p, 3)*sin(PI*p*x)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2)*cos(PI*p*x) - (-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x))*(pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*sin(PI*p*x)*sin(PI*p*z) - 2*pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*z)*cos(PI*p*y)) + (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z))*(pow(PI, 3)*pow(p, 3)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*cos(PI*p*x)*cos(PI*p*y) + pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*cos(PI*p*x)*cos(PI*p*z)) - (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z))*(pow(PI, 3)*pow(p, 3)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*sin(PI*p*y) - 2*pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*y)*cos(PI*p*z)))/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 4.0L/3.0L) - 1.0L/6.0L*pow(2, 1.0L/3.0L)*(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z))*(12*pow(PI, 3)*pow(p, 3)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*sin(PI*p*z)*cos(PI*p*z) + (-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x))*(-2*pow(PI, 2)*pow(p, 2)*(cos(PI*p*x) - 1)*cos(PI*p*y)*cos(PI*p*z) + pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*cos(PI*p*x)*cos(PI*p*z)) - (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z))*(pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*sin(PI*p*x)*sin(PI*p*z) + pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*z)*cos(PI*p*y)) + (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z))*(2*pow(PI, 2)*pow(p, 2)*(cos(PI*p*x) - 1)*sin(PI*p*y)*sin(PI*p*z) - pow(PI, 2)*pow(p, 2)*sin(PI*p*y)*sin(PI*p*z)*cos(PI*p*x)))/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 4.0L/3.0L) - 1.0L/2.0L*pow(2, 1.0L/3.0L)*(pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*sin(PI*p*x)*sin(PI*p*z) - 2*pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*z)*cos(PI*p*y))/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 1.0L/3.0L) - 1.0L/2.0L*pow(2, 1.0L/3.0L)*(pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*sin(PI*p*x)*sin(PI*p*z) + pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*z)*cos(PI*p*y))/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 1.0L/3.0L); 
+ 
+@@ -123,7 +129,7 @@
+ 	IssmDouble a = 1.0;
+ 
+ 	switch(testid){
+-		case 1: case 2: case 7: case 8: case 11:  case 12: case 13: case 18: case 21:
++		case 1: case 2: case 7: case 8: case 11:  case 12: case 13: case 14: case 18: case 21:
+ 			return 0.;
+ 		case 3: 
+ 			return 2*pow(x, 2)*y*z*(x - 1)*(y - 1)*(2*y - 1) + 2*pow(x, 2)*y*(x - 1)*(y - 1)*(2*y - 1)*(z - 1) - 2*x*pow(y, 2)*z*(x - 1)*(2*x - 1)*(y - 1) - 2*x*pow(y, 2)*(x - 1)*(2*x - 1)*(y - 1)*(z - 1) + 2*x*y*z*pow(x - 1, 2)*(y - 1)*(2*y - 1) - 2*x*y*z*(x - 1)*(2*x - 1)*pow(y - 1, 2) + 2*x*y*pow(x - 1, 2)*(y - 1)*(2*y - 1)*(z - 1) - 2*x*y*(x - 1)*(2*x - 1)*pow(y - 1, 2)*(z - 1);
+@@ -149,7 +155,7 @@
+ 	IssmDouble q = 2.0;   
+ 
+ 	switch(testid){
+-		case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 21:
++		case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 21:
+ 			return 0.;
+ 		case 18:
+ 			return (120.0L/109.0L)*sqrt(109.)/(10*x - 3*z);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18588-18589.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18588-18589.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18588-18589.diff	(revision 19102)
@@ -0,0 +1,194 @@
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18588)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18589)
+@@ -14,6 +14,8 @@
+ 	char**  requestedoutputs = NULL;
+ 
+ 	parameters->AddObject(iomodel->CopyConstantObject(ThermalStabilizationEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(ThermalMaxiterEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(ThermalReltolEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(ThermalIsenthalpyEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(ThermalIsdynamicbasalspcEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(FrictionLawEnum));
+Index: ../trunk-jpl/src/c/solutionsequences/convergence.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/convergence.cpp	(revision 18588)
++++ ../trunk-jpl/src/c/solutionsequences/convergence.cpp	(revision 18589)
+@@ -22,6 +22,7 @@
+ 	IssmDouble nKUoldF;
+ 	IssmDouble nF;
+ 	IssmDouble solver_residue,res;
++	int analysis_type;
+ 
+ 	/*convergence options*/
+ 	IssmDouble eps_res;
+@@ -40,7 +41,12 @@
+ 
+ 	/*get convergence options*/
+ 	parameters->FindParam(&eps_res,StressbalanceRestolEnum);
+-	parameters->FindParam(&eps_rel,StressbalanceReltolEnum);
++	// get analysis type
++	parameters->FindParam(&analysis_type,AnalysisTypeEnum);
++	if(analysis_type==StressbalanceAnalysisEnum)
++		parameters->FindParam(&eps_rel,StressbalanceReltolEnum);
++	else if(analysis_type==EnthalpyAnalysisEnum)
++		parameters->FindParam(&eps_rel,ThermalReltolEnum);
+ 	parameters->FindParam(&eps_abs,StressbalanceAbstolEnum);
+ 	parameters->FindParam(&yts,ConstantsYtsEnum);
+ 
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp	(revision 18588)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp	(revision 18589)
+@@ -2,6 +2,7 @@
+  * \brief: core of the thermal solution 
+  */ 
+ 
++#include "./solutionsequences.h"
+ #include "../toolkits/toolkits.h"
+ #include "../classes/classes.h"
+ #include "../shared/shared.h"
+@@ -23,58 +24,107 @@
+ 	Vector<IssmDouble>* df=NULL;
+ 
+ 	bool converged;
++	bool isenthalpy, isdynamicbasalspc;
+ 	int constraints_converged;
+ 	int num_unstable_constraints;
+ 	int count;
+ 	int thermal_penalty_threshold;
+ 	int thermal_maxiter;
++	IssmDouble thermal_reltol;
+ 
+ 	/*parameters:*/
+ 	int  configuration_type;
+ 
+ 	/*Recover parameters: */
+-	femmodel->parameters->FindParam(&thermal_penalty_threshold,ThermalPenaltyThresholdEnum);
++	femmodel->parameters->FindParam(&isenthalpy,ThermalIsenthalpyEnum);
+ 	femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
+ 	femmodel->parameters->FindParam(&thermal_maxiter,ThermalMaxiterEnum);
+ 
+-	count=1;
+ 	converged=false;
++	InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
+ 
+-	InputUpdateFromConstantx(femmodel,true,ResetPenaltiesEnum);
+-	InputUpdateFromConstantx(femmodel,false,ConvergedEnum);
+-	femmodel->UpdateConstraintsx();
++	if(isenthalpy){
++		femmodel->parameters->FindParam(&isdynamicbasalspc,ThermalIsdynamicbasalspcEnum);
++		femmodel->parameters->FindParam(&thermal_reltol,ThermalReltolEnum);
++		femmodel->UpdateConstraintsx();
+ 
++		//Update the solution to make sure that vx and vxold are similar (for next step in transient or steadystate)
++		GetSolutionFromInputsx(&tg,femmodel);
++		Reducevectorgtofx(&tf, tg, femmodel->nodes,femmodel->parameters);
++		InputUpdateFromSolutionx(femmodel,tg);
++	}
++	else{
++		femmodel->parameters->FindParam(&thermal_penalty_threshold,ThermalPenaltyThresholdEnum);
++		InputUpdateFromConstantx(femmodel,true,ResetPenaltiesEnum);
++		femmodel->UpdateConstraintsx();
++	}
++
++	count=1;
++	
+ 	for(;;){
++		delete tf_old;tf_old=tf;
++		delete tg;
+ 
+-		delete tf_old; tf_old=tf;
+-		SystemMatricesx(&Kff, &Kfs, &pf,&df, &melting_offset,femmodel);
++		if(isenthalpy) SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel);
++		else SystemMatricesx(&Kff, &Kfs, &pf,&df, &melting_offset,femmodel);
+ 		CreateNodalConstraintsx(&ys,femmodel->nodes,configuration_type);
+ 		Reduceloadx(pf, Kfs, ys); delete Kfs;
+-		Solverx(&tf, Kff, pf,tf_old, df, femmodel->parameters);
+-		delete Kff;delete pf;delete tg; delete df;
++		Solverx(&tf, Kff, pf, tf_old, df, femmodel->parameters);
+ 		Mergesolutionfromftogx(&tg, tf,ys,femmodel->nodes,femmodel->parameters); delete ys;
++		if(isenthalpy){ 
++			convergence(&converged,Kff,pf,tf,tf_old,femmodel->parameters); delete Kff; delete pf; delete df;
++			InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
++		}
+ 		InputUpdateFromSolutionx(femmodel,tg);
+-
+ 		ConstraintsStatex(&constraints_converged,&num_unstable_constraints,femmodel);
++		if(VerboseConvergence()) _printf0_("   number of unstable constraints: " << num_unstable_constraints << "\n");
+ 
+-		if (!converged){
+-			if(VerboseConvergence()) _printf0_("   #unstable constraints = " << num_unstable_constraints << "\n");
+-			if (num_unstable_constraints <= thermal_penalty_threshold)converged=true;
+-			if (count>=thermal_maxiter){
++		if(isenthalpy){
++			/*Increase count: */
++			count++;
++			if(converged==true){
++				bool max_iteration_state=false;
++				int step; IssmDouble time;
++				femmodel->parameters->FindParam(&time,TimeEnum);
++				femmodel->parameters->FindParam(&step,StepEnum);
++				femmodel->results->AddObject(new GenericExternalResult<bool>(femmodel->results->Size()+1, MaxIterationConvergenceFlagEnum, max_iteration_state, step, time));
++				break;
++			}
++			if(count>=thermal_maxiter){
++				_printf0_("   maximum number of nonlinear iterations (" << thermal_maxiter << ") exceeded\n"); 
+ 				converged=true;
+-				_printf0_("   maximum number of iterations (" << thermal_maxiter << ") exceeded\n"); 
++				InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
++				InputUpdateFromSolutionx(femmodel,tg);		
++				bool max_iteration_state=true;
++				int step; IssmDouble time;
++				femmodel->parameters->FindParam(&time,TimeEnum);
++				femmodel->parameters->FindParam(&step,StepEnum);
++				femmodel->results->AddObject(new GenericExternalResult<bool>(femmodel->results->Size()+1, MaxIterationConvergenceFlagEnum, max_iteration_state, step, time));
++				break;
+ 			}
+ 		}
+-		count++;
++		else{
++			if(!converged){
++				if(num_unstable_constraints<=thermal_penalty_threshold) converged=true;
++				if(count>=thermal_maxiter){
++					converged=true;
++					_printf0_("   maximum number of iterations (" << thermal_maxiter << ") exceeded\n"); 
++				}
++			}
++			count++;
++			InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
++			if(converged)break;
++		}
++	}
+ 
+-		InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
+-
+-		if(converged)break;
++	if(isenthalpy){
++		if(VerboseConvergence()) _printf0_("\n   total number of iterations: " << count-1 << "\n");
+ 	}
++	else{
++		InputUpdateFromSolutionx(femmodel,tg);
++		femmodel->parameters->SetParam(melting_offset,MeltingOffsetEnum);
++	}
+ 
+-	InputUpdateFromSolutionx(femmodel,tg);
+-	femmodel->parameters->SetParam(melting_offset,MeltingOffsetEnum);
+-
+ 	/*Free ressources: */
+ 	delete tg;
+ 	delete tf;
+Index: ../trunk-jpl/src/c/cores/thermal_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/thermal_core.cpp	(revision 18588)
++++ ../trunk-jpl/src/c/cores/thermal_core.cpp	(revision 18589)
+@@ -30,7 +30,7 @@
+ 
+ 		if(VerboseSolution()) _printf0_("   computing enthalpy\n");
+ 		femmodel->SetCurrentConfiguration(EnthalpyAnalysisEnum);
+-		solutionsequence_nonlinear(femmodel,true);
++		solutionsequence_thermal_nonlinear(femmodel);
+ 
+ 		/*transfer enthalpy to enthalpy picard for the next step: */
+ 		InputDuplicatex(femmodel,EnthalpyEnum,EnthalpyPicardEnum);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18589-18590.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18589-18590.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18589-18590.diff	(revision 19102)
@@ -0,0 +1,16 @@
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp	(revision 18589)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp	(revision 18590)
+@@ -72,9 +72,10 @@
+ 		Solverx(&tf, Kff, pf, tf_old, df, femmodel->parameters);
+ 		Mergesolutionfromftogx(&tg, tf,ys,femmodel->nodes,femmodel->parameters); delete ys;
+ 		if(isenthalpy){ 
+-			convergence(&converged,Kff,pf,tf,tf_old,femmodel->parameters); delete Kff; delete pf; delete df;
++			convergence(&converged,Kff,pf,tf,tf_old,femmodel->parameters); 
+ 			InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
+ 		}
++		delete Kff; delete pf; delete df;
+ 		InputUpdateFromSolutionx(femmodel,tg);
+ 		ConstraintsStatex(&constraints_converged,&num_unstable_constraints,femmodel);
+ 		if(VerboseConvergence()) _printf0_("   number of unstable constraints: " << num_unstable_constraints << "\n");
Index: /issm/oecreview/Archive/18296-19100/ISSM-18590-18591.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18590-18591.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18590-18591.diff	(revision 19102)
@@ -0,0 +1,61 @@
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18590)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18591)
+@@ -3,6 +3,7 @@
+ #include "../classes/classes.h"
+ #include "../shared/shared.h"
+ #include "../modules/modules.h"
++#include "../solutionsequences/solutionsequences.h"
+ 
+ /*Model processing*/
+ int  EnthalpyAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+@@ -198,7 +199,19 @@
+ 
+ /*Finite Element Analysis*/
+ void EnthalpyAnalysis::Core(FemModel* femmodel){/*{{{*/
+-	_error_("not implemented");
++	if(VerboseSolution()) _printf0_("   computing enthalpy\n");
++	femmodel->SetCurrentConfiguration(EnthalpyAnalysisEnum);
++	solutionsequence_thermal_nonlinear(femmodel);
++
++	/*transfer enthalpy to enthalpy picard for the next step: */
++	InputDuplicatex(femmodel,EnthalpyEnum,EnthalpyPicardEnum);
++
++	int solution_type;
++	femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
++	if(solution_type!=SteadystateSolutionEnum){
++		PostProcessing(femmodel);
++	}
++
+ }/*}}}*/
+ ElementVector* EnthalpyAnalysis::CreateDVector(Element* element){/*{{{*/
+ 	/*Default, return NULL*/
+Index: ../trunk-jpl/src/c/cores/thermal_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/thermal_core.cpp	(revision 18590)
++++ ../trunk-jpl/src/c/cores/thermal_core.cpp	(revision 18591)
+@@ -27,20 +27,9 @@
+ 	if(numoutputs) femmodel->parameters->FindParam(&requested_outputs,&numoutputs,ThermalRequestedOutputsEnum);
+ 
+ 	if(isenthalpy){
+-
+-		if(VerboseSolution()) _printf0_("   computing enthalpy\n");
+-		femmodel->SetCurrentConfiguration(EnthalpyAnalysisEnum);
+-		solutionsequence_thermal_nonlinear(femmodel);
+-
+-		/*transfer enthalpy to enthalpy picard for the next step: */
+-		InputDuplicatex(femmodel,EnthalpyEnum,EnthalpyPicardEnum);
+-
+-		if(solution_type!=SteadystateSolutionEnum){
+-			/*Post process*/
+-			enthalpy_analysis = new EnthalpyAnalysis();
+-			enthalpy_analysis->PostProcessing(femmodel);
+-			delete enthalpy_analysis;
+-		}
++		enthalpy_analysis = new EnthalpyAnalysis();
++		enthalpy_analysis->Core(femmodel);
++		delete enthalpy_analysis;
+ 	}
+ 	else{
+ 		if(VerboseSolution()) _printf0_("   computing temperatures\n");
Index: /issm/oecreview/Archive/18296-19100/ISSM-18591-18592.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18591-18592.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18591-18592.diff	(revision 19102)
@@ -0,0 +1,173 @@
+Index: ../trunk-jpl/src/m/exp/expdisp.m
+===================================================================
+--- ../trunk-jpl/src/m/exp/expdisp.m	(revision 18591)
++++ ../trunk-jpl/src/m/exp/expdisp.m	(revision 18592)
+@@ -46,12 +46,15 @@
+ for i=1:length(domain),		
+ 	if domain(i).nods==1
+ 		plot(domain(i).x*unitmultiplier,domain(i).y*unitmultiplier,'o','MarkerEdgeColor','k','MarkerFaceColor','r','MarkerSize',10);
++		text(domain(i).x*unitmultiplier,domain(i).y*unitmultiplier, ...
++				 domain(i).name,'BackgroundColor',[1. .0 .0]);
+ 	else
+ 		if (isnumeric(linestyle))
+ 			plot(domain(i).x*unitmultiplier,domain(i).y*unitmultiplier,'Color',linestyle,'linewidth',linewidth);
+ 		else
+ 			plot(domain(i).x*unitmultiplier,domain(i).y*unitmultiplier,linestyle,'linewidth',linewidth);
+ 	  end
++		text(domain(i).x(1)*unitmultiplier,domain(i).y(1)*unitmultiplier,domain(i).name,'BackgroundColor',[.7 .9 .7]);
+   end
+ end
+ 
+Index: ../trunk-jpl/src/m/classes/initialization.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/initialization.m	(revision 18591)
++++ ../trunk-jpl/src/m/classes/initialization.m	(revision 18592)
+@@ -90,8 +90,7 @@
+ 			if ismember(HydrologyDCEfficientAnalysisEnum(),analyses),
+ 				if isa(md.hydrology,'hydrologydc'),
+ 					if md.hydrology.isefficientlayer==1,
+-						md = checkfield(md,'fieldname', ...
+-														'initialization.epl_head','NaN',1,'size',[md.mesh.numberofvertices 1]);
++						md = checkfield(md,'fieldname','initialization.epl_head','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 						md = checkfield(md,'fieldname','initialization.epl_thickness','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 					end
+ 				end
+Index: ../trunk-jpl/src/m/classes/hydrologydc.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 18591)
++++ ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 18592)
+@@ -124,7 +124,7 @@
+ 		if HydrologyDCInefficientAnalysisEnum() not in analyses:
+ 			return md
+ 
+-		md = checkfield(md,'fieldname','hydrology.water_compressibility','>',0,'numel',1)
++                md = checkfield(md,'fieldname','hydrology.water_compressibility','>',0,'numel',1)
+ 		md = checkfield(md,'fieldname','hydrology.isefficientlayer','numel',[1],'values',[0,1])
+ 		md = checkfield(md,'fieldname','hydrology.penalty_factor','>',0,'numel',1)
+ 		md = checkfield(md,'fieldname','hydrology.rel_tol','>',0,'numel',1)
+Index: ../trunk-jpl/src/m/classes/initialization.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/initialization.py	(revision 18591)
++++ ../trunk-jpl/src/m/classes/initialization.py	(revision 18592)
+@@ -8,13 +8,13 @@
+ class initialization(object):
+ 	"""
+ 	INITIALIZATION class definition
+-
+-	   Usage:
+-	      initialization=initialization();
++	
++	Usage:
++	initialization=initialization();
+ 	"""
+ 
+ 	def __init__(self): # {{{
+-		
++					
+ 		self.vx            = float('NaN')
+ 		self.vy            = float('NaN')
+ 		self.vz            = float('NaN')
+@@ -23,7 +23,9 @@
+ 		self.temperature   = float('NaN')
+ 		self.waterfraction = float('NaN')
+ 		self.watercolumn   = float('NaN')
+-		self.sediment_head  = float('NaN')
++		self.sediment_head = float('NaN')
++		self.epl_head      = float('NaN')
++		self.epl_thickness = float('NaN')
+ 
+ 		#set defaults
+ 		self.setdefaultparameters()
+@@ -31,7 +33,6 @@
+ 		#}}}
+ 	def __repr__(self): # {{{
+ 		string='   initial field values:'
+-
+ 		string="%s\n%s"%(string,fielddisplay(self,'vx','x component of velocity [m/yr]'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'vy','y component of velocity [m/yr]'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'vz','z component of velocity [m/yr]'))
+@@ -41,6 +42,8 @@
+ 		string="%s\n%s"%(string,fielddisplay(self,'waterfraction','fraction of water in the ice'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'watercolumn','thickness of subglacial water [m]'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'sediment_head','sediment water head of subglacial system [m]'))
++		string="%s\n%s"%(string,fielddisplay(self,'epl_head','epl water head of subglacial system [m]'))
++		string="%s\n%s"%(string,fielddisplay(self,'epl_thickness','thickness of the epl [m]'))
+ 
+ 		return string
+ 		#}}}
+@@ -68,11 +71,22 @@
+ 			if md.mesh.dimension()==3:
+ 				md = checkfield(md,'fieldname','initialization.vz','NaN',1,'size',[md.mesh.numberofvertices])
+ 			md = checkfield(md,'fieldname','initialization.pressure','NaN',1,'size',[md.mesh.numberofvertices])
+-		if (EnthalpyAnalysisEnum() in analyses and md.thermal.isenthalpy):
++			if (EnthalpyAnalysisEnum() in analyses and md.thermal.isenthalpy):
+ 			md = checkfield(md,'fieldname','initialization.waterfraction','>=',0,'size',[md.mesh.numberofvertices])
+ 			md = checkfield(md,'fieldname','initialization.watercolumn'  ,'>=',0,'size',[md.mesh.numberofvertices])
+ 		if HydrologyShreveAnalysisEnum() in analyses:
+ 			md = checkfield(md,'fieldname','initialization.watercolumn','NaN',1,'size',[md.mesh.numberofvertices])
++		if HydrologyDCInefficientAnalysisEnum() in analyses:
++			if hasattr(md.hydrology,'hydrologydc'):
++				md = checkfield(md,'fieldname','initialization.sediment_head','NaN',1,'size',[md.mesh.numberofvertices 1]);
++		if HydrologyDCEfficientAnalysisEnum() in analyses:
++			if hasattr(md.hydrology,'hydrologydc'):
++				if md.hydrology.isefficientlayer==1,
++					md = checkfield(md,'fieldname','initialization.epl_head','NaN',1,'size',[md.mesh.numberofvertices 1]);
++					md = checkfield(md,'fieldname','initialization.epl_thickness','NaN',1,'size',[md.mesh.numberofvertices 1]);
++				
++
++
+ 		return md
+ 	# }}}
+ 	def marshall(self,md,fid):    # {{{
+@@ -87,7 +101,10 @@
+ 		WriteData(fid,'data',self.waterfraction,'format','DoubleMat','mattype',1,'enum',WaterfractionEnum())
+ 		WriteData(fid,'data',self.watercolumn,'format','DoubleMat','mattype',1,'enum',WatercolumnEnum())
+ 		WriteData(fid,'data',self.sediment_head,'format','DoubleMat','mattype',1,'enum',SedimentHeadEnum())
++		WriteData(fid,'data',self.epl_head,'format','DoubleMat','mattype',1,'enum',EplHeadEnum);
++		WriteData(fid,'data',self.epl_thickness,'format','DoubleMat','mattype',1,'enum',HydrologydcEplThicknessEnum);
+ 
++		
+ 		if md.thermal.isenthalpy:
+ 			tpmp = md.materials.meltingpoint - md.materials.beta*md.initialization.pressure;
+ 			pos  = numpy.nonzero(md.initialization.temperature > tpmp)[0]
+Index: ../trunk-jpl/src/m/classes/model.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.py	(revision 18591)
++++ ../trunk-jpl/src/m/classes/model.py	(revision 18592)
+@@ -666,6 +666,8 @@
+                         md.hydrology.mask_eplactive_node=project3d(md,'vector',md.hydrology.mask_eplactive_node,'type','node','layer',1)
+                         md.hydrology.sediment_transmitivity=project3d(md,'vector',md.hydrology.sediment_transmitivity,'type','node','layer',1)
+                         md.hydrology.basal_moulin_input=project3d(md,'vector',md.hydrology.basal_moulin_input,'type','node','layer',1)
++                if md.hydrology.isefficientlayer==1 :
++                        md.hydrology.spcepl_head=project3d(md,'vector',md.hydrology.spcepl_head,'type','node','layer',1)
+ 
+ 		#connectivity
+ 		md.mesh.elementconnectivity=numpy.tile(md.mesh.elementconnectivity,(numlayers-1,1))
+@@ -759,6 +761,10 @@
+ 		if not numpy.isnan(md.initialization.vz).all(): md.initialization.vz=DepthAverage(md,md.initialization.vz)
+ 		if not numpy.isnan(md.initialization.vel).all(): md.initialization.vel=DepthAverage(md,md.initialization.vel)
+ 		if not numpy.isnan(md.initialization.temperature).all(): md.initialization.temperature=DepthAverage(md,md.initialization.temperature)
++                if not numpy.isnan(md.initialization.pressure).all(): md.initialization.pressure=project2d(md,md.initialization.pressure,1)
++                if not numpy.isnan(md.initialization.sediment_head).all(): md.initialization.sediment_head=project2d(md,md.initialization.sediment_head,1)
++                if not numpy.isnan(md.initialization.epl_head).all(): md.initialization.epl_head=project2d(md,md.initialization.epl_head,1)
++                if not numpy.isnan(md.initialization.epl_thickness).all(): md.initialization.epl_thickness=project2d(md,md.initialization.epl_thickness,1)
+ 
+ 		#gia
+ 		if not numpy.isnan(md.gia.mantle_viscosity).all(): md.gia.mantle_viscosity=project2d(md,md.gia.mantle_viscosity,1) 
+@@ -772,6 +778,16 @@
+ 			md.flowequation.borderHO=project2d(md,md.flowequation.borderHO,1)
+ 			md.flowequation.borderFS=project2d(md,md.flowequation.borderFS,1)
+ 
++
++                # Hydrologydc variables
++                if hasattr(md.hydrology,'hydrologydc'):
++                        md.hydrology.spcsediment_head=project2d(md,md.hydrology.spcsediment_head,1)
++                        md.hydrology.mask_eplactive_node=project2d(md,md.hydrology.mask_eplactive_node,1)
++                        md.hydrology.sediment_transmitivity=project2d(md,md.hydrology.sediment_transmitivity,1)
++                        md.hydrology.basal_moulin_input=project2d(md,md.hydrology.basal_moulin_input,1)
++                if md.hydrology.isefficientlayer == 1:
++                        md.hydrology.spcepl_head=project2d(md,md.hydrology.spcepl_head,1)
++
+ 		#boundary conditions
+ 		md.stressbalance.spcvx=project2d(md,md.stressbalance.spcvx,md.mesh.numberoflayers)
+ 		md.stressbalance.spcvy=project2d(md,md.stressbalance.spcvy,md.mesh.numberoflayers)
Index: /issm/oecreview/Archive/18296-19100/ISSM-18592-18593.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18592-18593.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18592-18593.diff	(revision 19102)
@@ -0,0 +1,1191 @@
+Index: ../trunk-jpl/test/NightlyRun/test530.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test530.py	(revision 18592)
++++ ../trunk-jpl/test/NightlyRun/test530.py	(revision 18593)
+@@ -15,10 +15,10 @@
+ md=solve(md,BalancevelocitySolutionEnum())
+ 
+ # Fields and tolerances to track changes
+-field_names     =['SurfaceSlopeX','SurfaceSlopeY','Vel']
++field_names     =['DrivingStressX','DrivingStressY','Vel']
+ field_tolerances=[1e-13,1e-13,1e-13]
+ field_values=[\
+-		md.results.BalancevelocitySolution.SurfaceSlopeX,\
+-		md.results.BalancevelocitySolution.SurfaceSlopeY,\
++		md.results.BalancevelocitySolution.DrivingStressX,\
++		md.results.BalancevelocitySolution.DrivingStressY,\
+ 		md.results.BalancevelocitySolution.Vel,\
+ 		]
+Index: ../trunk-jpl/test/NightlyRun/test531.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test531.py	(revision 18592)
++++ ../trunk-jpl/test/NightlyRun/test531.py	(revision 18593)
+@@ -17,10 +17,10 @@
+ md=solve(md,BalancevelocitySolutionEnum())
+ 
+ # Fields and tolerances to track changes
+-field_names     =['SurfaceSlopeX','SurfaceSlopeY','Vel']
++field_names     =['DrivingStressX','DrivingStressY','Vel']
+ field_tolerances=[1e-13,1e-13,1e-13]
+ field_values=[\
+-		md.results.BalancevelocitySolution.SurfaceSlopeX,\
+-		md.results.BalancevelocitySolution.SurfaceSlopeY,\
++		md.results.BalancevelocitySolution.DrivingStressX,\
++		md.results.BalancevelocitySolution.DrivingStressY,\
+ 		md.results.BalancevelocitySolution.Vel,\
+ 		]
+Index: ../trunk-jpl/test/NightlyRun/test530.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test530.m	(revision 18592)
++++ ../trunk-jpl/test/NightlyRun/test530.m	(revision 18593)
+@@ -6,10 +6,10 @@
+ md=solve(md,BalancevelocitySolutionEnum());
+ 
+ %Fields and tolerances to track changes
+-field_names     ={'SurfaceSlopeX','SurfaceSlopeX','Vel'};
++field_names     ={'DrivingStressX','DrivingStressX','Vel'};
+ field_tolerances={1e-13,1e-13,1e-13};
+ field_values={...
+-	(md.results.BalancevelocitySolution.SurfaceSlopeX),...
+-	(md.results.BalancevelocitySolution.SurfaceSlopeY),...
++	(md.results.BalancevelocitySolution.DrivingStressX),...
++	(md.results.BalancevelocitySolution.DrivingStressY),...
+ 	(md.results.BalancevelocitySolution.Vel),...
+ 	};
+Index: ../trunk-jpl/test/NightlyRun/test531.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test531.m	(revision 18592)
++++ ../trunk-jpl/test/NightlyRun/test531.m	(revision 18593)
+@@ -8,10 +8,10 @@
+ md=solve(md,BalancevelocitySolutionEnum());
+ 
+ %Fields and tolerances to track changes
+-field_names     ={'SurfaceSlopeX','SurfaceSlopeX','Vel'};
++field_names     ={'DrivingStressX','DrivingStressX','Vel'};
+ field_tolerances={1e-13,1e-13,1e-13};
+ field_values={...
+-	(md.results.BalancevelocitySolution.SurfaceSlopeX),...
+-	(md.results.BalancevelocitySolution.SurfaceSlopeY),...
++	(md.results.BalancevelocitySolution.DrivingStressX),...
++	(md.results.BalancevelocitySolution.DrivingStressY),...
+ 	(md.results.BalancevelocitySolution.Vel),...
+ 	};
+Index: ../trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeYAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeYAnalysis.h	(revision 18592)
++++ ../trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeYAnalysis.h	(revision 18593)
+@@ -1,33 +0,0 @@
+-/*! \file SmoothedSurfaceSlopeYAnalysis.h 
+- *  \brief: header file for generic external result object
+- */
+-
+-#ifndef _SmoothedSurfaceSlopeYAnalysis_
+-#define _SmoothedSurfaceSlopeYAnalysis_
+-
+-/*Headers*/
+-#include "./Analysis.h"
+-
+-class SmoothedSurfaceSlopeYAnalysis: public Analysis{
+-
+-	public:
+-		/*Model processing*/
+-		int  DofsPerNode(int** doflist,int domaintype,int approximation);
+-		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+-
+-		/*Finite element Analysis*/
+-		void           Core(FemModel* femmodel);
+-		ElementVector* CreateDVector(Element* element);
+-		ElementMatrix* CreateJacobianMatrix(Element* element);
+-		ElementMatrix* CreateKMatrix(Element* element);
+-		ElementVector* CreatePVector(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
+-};
+-#endif
+Index: ../trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeXAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeXAnalysis.cpp	(revision 18592)
++++ ../trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeXAnalysis.cpp	(revision 18593)
+@@ -1,183 +0,0 @@
+-#include "./SmoothedSurfaceSlopeXAnalysis.h"
+-#include "../toolkits/toolkits.h"
+-#include "../classes/classes.h"
+-#include "../shared/shared.h"
+-#include "../modules/modules.h"
+-
+-/*Model processing*/
+-int  SmoothedSurfaceSlopeXAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+-	return 1;
+-}/*}}}*/
+-void SmoothedSurfaceSlopeXAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-}/*}}}*/
+-void SmoothedSurfaceSlopeXAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+-
+-	/*Update elements: */
+-	int counter=0;
+-	for(int i=0;i<iomodel->numberofelements;i++){
+-		if(iomodel->my_elements[i]){
+-			Element* element=(Element*)elements->GetObjectByOffset(counter);
+-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+-			counter++;
+-		}
+-	}
+-
+-	iomodel->FetchDataToInput(elements,SurfaceEnum);
+-	iomodel->FetchDataToInput(elements,BaseEnum);
+-	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
+-	if(iomodel->domaintype!=Domain2DhorizontalEnum){
+-		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
+-		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
+-	}
+-}/*}}}*/
+-void SmoothedSurfaceSlopeXAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-	if(iomodel->domaintype==Domain3DEnum) iomodel->FetchData(1,MeshVertexonbaseEnum);
+-	::CreateNodes(nodes,iomodel,SmoothedSurfaceSlopeXAnalysisEnum,P1Enum);
+-	if(iomodel->domaintype==Domain3DEnum) iomodel->DeleteData(1,MeshVertexonbaseEnum);
+-}/*}}}*/
+-void SmoothedSurfaceSlopeXAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+-}/*}}}*/
+-void SmoothedSurfaceSlopeXAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+-}/*}}}*/
+-
+-/*Finite Element Analysis*/
+-void           SmoothedSurfaceSlopeXAnalysis::Core(FemModel* femmodel){/*{{{*/
+-	_error_("not implemented");
+-}/*}}}*/
+-ElementVector* SmoothedSurfaceSlopeXAnalysis::CreateDVector(Element* element){/*{{{*/
+-	/*Default, return NULL*/
+-	return NULL;
+-}/*}}}*/
+-ElementMatrix* SmoothedSurfaceSlopeXAnalysis::CreateJacobianMatrix(Element* element){/*{{{*/
+-_error_("Not implemented");
+-}/*}}}*/
+-ElementMatrix* SmoothedSurfaceSlopeXAnalysis::CreateKMatrix(Element* element){/*{{{*/
+-
+-	/* Intermediaries */
+-	IssmDouble  Jdet,thickness,l=8.;
+-	IssmDouble *xyz_list = NULL;
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-
+-	/*Initialize Element matrix and vectors*/
+-	ElementMatrix* Ke     = element->NewElementMatrix();
+-	IssmDouble*    dbasis = xNew<IssmDouble>(2*numnodes);
+-	IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
+-
+-	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinates(&xyz_list);
+-	Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input);
+-
+-	/* Start looping on the number of gaussian points: */
+-	Gauss* gauss=element->NewGauss(2);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		thickness_input->GetInputValue(&thickness,gauss);
+-		if(thickness<50.) thickness=50.;
+-
+-		element->NodalFunctions(basis,gauss);
+-		element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+-
+-		for(int i=0;i<numnodes;i++){
+-			for(int j=0;j<numnodes;j++){
+-				Ke->values[i*numnodes+j] += gauss->weight*Jdet*(
+-							basis[i]*basis[j]
+-							+(l*thickness)*(l*thickness)*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j])
+-							);
+-			}
+-		}
+-	}
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-	xDelete<IssmDouble>(dbasis);
+-	xDelete<IssmDouble>(basis);
+-	xDelete<IssmDouble>(xyz_list);
+-	return Ke;
+-}/*}}}*/
+-ElementVector* SmoothedSurfaceSlopeXAnalysis::CreatePVector(Element* element){/*{{{*/
+-
+-	/*Intermediaries*/
+-	int      domaintype;
+-	Element* basalelement;
+-
+-	/*Get basal element*/
+-	element->FindParam(&domaintype,DomainTypeEnum);
+-	switch(domaintype){
+-		case Domain2DhorizontalEnum:
+-			basalelement = element;
+-			break;
+-		case Domain3DEnum:
+-			if(!element->IsOnBase()) return NULL;
+-			basalelement = element->SpawnBasalElement();
+-			break;
+-		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+-	}
+-
+-	/*Intermediaries */
+-	int         input_enum;
+-	IssmDouble  Jdet,thickness,slope[2];
+-	IssmDouble  taud_x,norms,normv,vx,vy;
+-	IssmDouble *xyz_list  = NULL;
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = basalelement->GetNumberOfNodes();
+-
+-	/*Initialize Element vector*/
+-	ElementVector* pe    = basalelement->NewElementVector();
+-	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
+-
+-	/*Retrieve all inputs and parameters*/
+-	basalelement->GetVerticesCoordinates(&xyz_list);
+-	IssmDouble rho_ice   = element->GetMaterialParameter(MaterialsRhoIceEnum);
+-	IssmDouble gravity   = element->GetMaterialParameter(ConstantsGEnum);
+-	Input* H_input       = basalelement->GetInput(ThicknessEnum); _assert_(H_input);
+-	Input* surface_input = basalelement->GetInput(SurfaceEnum);   _assert_(surface_input);
+-	Input* vx_input      = basalelement->GetInput(VxEnum);
+-	Input* vy_input      = basalelement->GetInput(VyEnum);
+-
+-	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=basalelement->NewGauss(2);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		basalelement->NodalFunctions(basis,gauss);
+-
+-		H_input->GetInputValue(&thickness,gauss);
+-		surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss);
+-		if(vx_input && vy_input){
+-			vx_input->GetInputValue(&vx,gauss);
+-			vy_input->GetInputValue(&vy,gauss);
+-			norms = sqrt(slope[0]*slope[0]+slope[1]*slope[1]+1.e-10);
+-			normv = sqrt(vx*vx + vy*vy);
+-			if(normv>15./(365.*24.*3600.)) slope[0] = -vx/normv*norms;
+-		}
+-		taud_x = rho_ice*gravity*thickness*slope[0];
+-
+-		for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*taud_x*basis[i];
+-	}
+-
+-	/*Clean up and return*/
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(basis);
+-	delete gauss;
+-	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+-	return pe;
+-}/*}}}*/
+-void SmoothedSurfaceSlopeXAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+-	   _error_("not implemented yet");
+-}/*}}}*/
+-void SmoothedSurfaceSlopeXAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+-	_error_("Not implemented yet");
+-}/*}}}*/
+-void SmoothedSurfaceSlopeXAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+-	element->InputUpdateFromSolutionOneDof(solution,SurfaceSlopeXEnum);
+-}/*}}}*/
+-void SmoothedSurfaceSlopeXAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+-	/*Default, do nothing*/
+-	return;
+-}/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeYAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeYAnalysis.cpp	(revision 18592)
++++ ../trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeYAnalysis.cpp	(revision 18593)
+@@ -1,182 +0,0 @@
+-#include "./SmoothedSurfaceSlopeYAnalysis.h"
+-#include "../toolkits/toolkits.h"
+-#include "../classes/classes.h"
+-#include "../shared/shared.h"
+-#include "../modules/modules.h"
+-
+-/*Model processing*/
+-int  SmoothedSurfaceSlopeYAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+-	return 1;
+-}/*}}}*/
+-void SmoothedSurfaceSlopeYAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-}/*}}}*/
+-void SmoothedSurfaceSlopeYAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+-
+-	/*Update elements: */
+-	int counter=0;
+-	for(int i=0;i<iomodel->numberofelements;i++){
+-		if(iomodel->my_elements[i]){
+-			Element* element=(Element*)elements->GetObjectByOffset(counter);
+-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+-			counter++;
+-		}
+-	}
+-
+-	iomodel->FetchDataToInput(elements,SurfaceEnum);
+-	iomodel->FetchDataToInput(elements,BaseEnum);
+-	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
+-	if(iomodel->domaintype!=Domain2DhorizontalEnum){
+-		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
+-		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
+-	}
+-}/*}}}*/
+-void SmoothedSurfaceSlopeYAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-	if(iomodel->domaintype==Domain3DEnum) iomodel->FetchData(1,MeshVertexonbaseEnum);
+-	::CreateNodes(nodes,iomodel,SmoothedSurfaceSlopeYAnalysisEnum,P1Enum);
+-	if(iomodel->domaintype==Domain3DEnum) iomodel->DeleteData(1,MeshVertexonbaseEnum);
+-}/*}}}*/
+-void SmoothedSurfaceSlopeYAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+-}/*}}}*/
+-void SmoothedSurfaceSlopeYAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+-}/*}}}*/
+-
+-/*Finite Element Analysis*/
+-void           SmoothedSurfaceSlopeYAnalysis::Core(FemModel* femmodel){/*{{{*/
+-	_error_("not implemented");
+-}/*}}}*/
+-ElementVector* SmoothedSurfaceSlopeYAnalysis::CreateDVector(Element* element){/*{{{*/
+-	/*Default, return NULL*/
+-	return NULL;
+-}/*}}}*/
+-ElementMatrix* SmoothedSurfaceSlopeYAnalysis::CreateJacobianMatrix(Element* element){/*{{{*/
+-_error_("Not implemented");
+-}/*}}}*/
+-ElementMatrix* SmoothedSurfaceSlopeYAnalysis::CreateKMatrix(Element* element){/*{{{*/
+-
+-	/* Intermediaries */
+-	IssmDouble  Jdet,thickness,l=8.;
+-	IssmDouble *xyz_list = NULL;
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-
+-	/*Initialize Element matrix and vectors*/
+-	ElementMatrix* Ke     = element->NewElementMatrix();
+-	IssmDouble*    dbasis = xNew<IssmDouble>(2*numnodes);
+-	IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
+-
+-	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinates(&xyz_list);
+-	Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input);
+-
+-	/* Start looping on the number of gaussian points: */
+-	Gauss* gauss=element->NewGauss(2);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		thickness_input->GetInputValue(&thickness,gauss);
+-		if(thickness<50.) thickness=50.;
+-
+-		element->NodalFunctions(basis,gauss);
+-		element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+-
+-		for(int i=0;i<numnodes;i++){
+-			for(int j=0;j<numnodes;j++){
+-				Ke->values[i*numnodes+j] += gauss->weight*Jdet*(
+-							basis[i]*basis[j]
+-							+(l*thickness)*(l*thickness)*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j])
+-							);
+-			}
+-		}
+-	}
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-	xDelete<IssmDouble>(dbasis);
+-	xDelete<IssmDouble>(basis);
+-	xDelete<IssmDouble>(xyz_list);
+-	return Ke;
+-}/*}}}*/
+-ElementVector* SmoothedSurfaceSlopeYAnalysis::CreatePVector(Element* element){/*{{{*/
+-
+-	/*Intermediaries*/
+-	int      domaintype;
+-	Element* basalelement;
+-
+-	/*Get basal element*/
+-	element->FindParam(&domaintype,DomainTypeEnum);
+-	switch(domaintype){
+-		case Domain2DhorizontalEnum:
+-			basalelement = element;
+-			break;
+-		case Domain3DEnum:
+-			if(!element->IsOnBase()) return NULL;
+-			basalelement = element->SpawnBasalElement();
+-			break;
+-		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+-	}
+-
+-	/*Intermediaries */
+-	IssmDouble  Jdet,thickness,slope[2];
+-	IssmDouble  taud_y,norms,normv,vx,vy;
+-	IssmDouble *xyz_list  = NULL;
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = basalelement->GetNumberOfNodes();
+-
+-	/*Initialize Element vector*/
+-	ElementVector* pe    = basalelement->NewElementVector();
+-	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
+-
+-	/*Retrieve all inputs and parameters*/
+-	basalelement->GetVerticesCoordinates(&xyz_list);
+-	IssmDouble rho_ice   = element->GetMaterialParameter(MaterialsRhoIceEnum);
+-	IssmDouble gravity   = element->GetMaterialParameter(ConstantsGEnum);
+-	Input* H_input       = basalelement->GetInput(ThicknessEnum); _assert_(H_input);
+-	Input* surface_input = basalelement->GetInput(SurfaceEnum);   _assert_(surface_input);
+-	Input* vx_input      = basalelement->GetInput(VxEnum);
+-	Input* vy_input      = basalelement->GetInput(VyEnum);
+-
+-	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=basalelement->NewGauss(2);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		basalelement->NodalFunctions(basis,gauss);
+-
+-		H_input->GetInputValue(&thickness,gauss);
+-		surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss);
+-		if(vx_input && vy_input){
+-			vx_input->GetInputValue(&vx,gauss);
+-			vy_input->GetInputValue(&vy,gauss);
+-			norms = sqrt(slope[0]*slope[0]+slope[1]*slope[1]+1.e-10);
+-			normv = sqrt(vx*vx + vy*vy);
+-			if(normv>15./(365.*24.*3600.)) slope[1] = -vy/normv*norms;
+-		}
+-		taud_y = rho_ice*gravity*thickness*slope[1];
+-
+-		for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*taud_y*basis[i];
+-	}
+-
+-	/*Clean up and return*/
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(basis);
+-	delete gauss;
+-	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+-	return pe;
+-}/*}}}*/
+-void SmoothedSurfaceSlopeYAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+-	   _error_("not implemented yet");
+-}/*}}}*/
+-void SmoothedSurfaceSlopeYAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+-	_error_("Not implemented yet");
+-}/*}}}*/
+-void SmoothedSurfaceSlopeYAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+-	element->InputUpdateFromSolutionOneDof(solution,SurfaceSlopeYEnum);
+-}/*}}}*/
+-void SmoothedSurfaceSlopeYAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+-	/*Default, do nothing*/
+-	return;
+-}/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeXAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeXAnalysis.h	(revision 18592)
++++ ../trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeXAnalysis.h	(revision 18593)
+@@ -1,33 +0,0 @@
+-/*! \file SmoothedSurfaceSlopeXAnalysis.h 
+- *  \brief: header file for generic external result object
+- */
+-
+-#ifndef _SmoothedSurfaceSlopeXAnalysis_
+-#define _SmoothedSurfaceSlopeXAnalysis_
+-
+-/*Headers*/
+-#include "./Analysis.h"
+-
+-class SmoothedSurfaceSlopeXAnalysis: public Analysis{
+-
+-	public:
+-		/*Model processing*/
+-		int  DofsPerNode(int** doflist,int domaintype,int approximation);
+-		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+-
+-		/*Finite element Analysis*/
+-		void           Core(FemModel* femmodel);
+-		ElementVector* CreateDVector(Element* element);
+-		ElementMatrix* CreateJacobianMatrix(Element* element);
+-		ElementMatrix* CreateKMatrix(Element* element);
+-		ElementVector* CreatePVector(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
+-};
+-#endif
+Index: ../trunk-jpl/src/c/analyses/EnumToAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnumToAnalysis.cpp	(revision 18592)
++++ ../trunk-jpl/src/c/analyses/EnumToAnalysis.cpp	(revision 18593)
+@@ -85,12 +85,9 @@
+ 		#ifdef _HAVE_DEPTHAVERAGE_
+ 		case DepthAverageAnalysisEnum : return new DepthAverageAnalysis();
+ 		#endif
+-		#ifdef _HAVE_SMOOTHEDSURFACESLOPEX_
+-		case SmoothedSurfaceSlopeXAnalysisEnum : return new SmoothedSurfaceSlopeXAnalysis();
++		#ifdef _HAVE_SMOOTH_
++		case SmoothAnalysisEnum : return new SmoothAnalysis();
+ 		#endif
+-		#ifdef _HAVE_SMOOTHEDSURFACESLOPEY_
+-		case SmoothedSurfaceSlopeYAnalysisEnum : return new SmoothedSurfaceSlopeYAnalysis();
+-		#endif
+ 		#ifdef _HAVE_THERMAL_
+ 		case ThermalAnalysisEnum : return new ThermalAnalysis();
+ 		#endif
+Index: ../trunk-jpl/src/c/analyses/SmoothAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SmoothAnalysis.h	(revision 0)
++++ ../trunk-jpl/src/c/analyses/SmoothAnalysis.h	(revision 18593)
+@@ -0,0 +1,33 @@
++/*! \file SmoothAnalysis.h 
++ *  \brief: header file for generic external result object
++ */
++
++#ifndef _SmoothAnalysis_
++#define _SmoothAnalysis_
++
++/*Headers*/
++#include "./Analysis.h"
++
++class SmoothAnalysis: public Analysis{
++
++	public:
++		/*Model processing*/
++		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++
++		/*Finite element Analysis*/
++		void           Core(FemModel* femmodel);
++		ElementVector* CreateDVector(Element* element);
++		ElementMatrix* CreateJacobianMatrix(Element* element);
++		ElementMatrix* CreateKMatrix(Element* element);
++		ElementVector* CreatePVector(Element* element);
++		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void UpdateConstraints(FemModel* femmodel);
++};
++#endif
+Index: ../trunk-jpl/src/c/analyses/SmoothAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SmoothAnalysis.cpp	(revision 0)
++++ ../trunk-jpl/src/c/analyses/SmoothAnalysis.cpp	(revision 18593)
+@@ -0,0 +1,227 @@
++#include "./SmoothAnalysis.h"
++#include "../toolkits/toolkits.h"
++#include "../classes/classes.h"
++#include "../shared/shared.h"
++#include "../modules/modules.h"
++
++/*Model processing*/
++int  SmoothAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
++	return 1;
++}/*}}}*/
++void SmoothAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++}/*}}}*/
++void SmoothAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
++
++	/*Update elements: */
++	int counter=0;
++	for(int i=0;i<iomodel->numberofelements;i++){
++		if(iomodel->my_elements[i]){
++			Element* element=(Element*)elements->GetObjectByOffset(counter);
++			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
++			counter++;
++		}
++	}
++}/*}}}*/
++void SmoothAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++
++	::CreateNodes(nodes,iomodel,SmoothAnalysisEnum,P1Enum);
++
++}/*}}}*/
++void SmoothAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++}/*}}}*/
++void SmoothAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++}/*}}}*/
++
++/*Finite Element Analysis*/
++void           SmoothAnalysis::Core(FemModel* femmodel){/*{{{*/
++	_error_("not implemented");
++}/*}}}*/
++ElementVector* SmoothAnalysis::CreateDVector(Element* element){/*{{{*/
++	/*Default, return NULL*/
++	return NULL;
++}/*}}}*/
++ElementMatrix* SmoothAnalysis::CreateJacobianMatrix(Element* element){/*{{{*/
++_error_("Not implemented");
++}/*}}}*/
++ElementMatrix* SmoothAnalysis::CreateKMatrix(Element* element){/*{{{*/
++
++	/* Intermediaries */
++	int         domaintype;
++	IssmDouble  Jdet,thickness,l=8.;
++	IssmDouble *xyz_list = NULL;
++
++	/*Check dimension*/
++	element->FindParam(&domaintype,DomainTypeEnum);
++	switch(domaintype){
++		case Domain2DhorizontalEnum:
++			break;
++		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
++	}
++
++	/*Fetch number of nodes and dof for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++
++	/*Initialize Element matrix and vectors*/
++	ElementMatrix* Ke     = element->NewElementMatrix();
++	IssmDouble*    dbasis = xNew<IssmDouble>(2*numnodes);
++	IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
++
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinates(&xyz_list);
++	Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input);
++
++	/* Start looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGauss(2);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		thickness_input->GetInputValue(&thickness,gauss);
++		if(thickness<50.) thickness=50.;
++
++		element->NodalFunctions(basis,gauss);
++		element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
++
++		for(int i=0;i<numnodes;i++){
++			for(int j=0;j<numnodes;j++){
++				Ke->values[i*numnodes+j] += gauss->weight*Jdet*(
++							basis[i]*basis[j]
++							+(l*thickness)*(l*thickness)*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j])
++							);
++			}
++		}
++	}
++
++	/*Clean up and return*/
++	delete gauss;
++	xDelete<IssmDouble>(dbasis);
++	xDelete<IssmDouble>(basis);
++	xDelete<IssmDouble>(xyz_list);
++	return Ke;
++}/*}}}*/
++ElementVector* SmoothAnalysis::CreatePVector(Element* element){/*{{{*/
++
++	/*Get basal element*/
++	int domaintype;
++	element->FindParam(&domaintype,DomainTypeEnum);
++	switch(domaintype){
++		case Domain2DhorizontalEnum:
++			break;
++		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
++	}
++
++	/*Intermediaries */
++	int         input_enum;
++	IssmDouble  Jdet,value;
++	IssmDouble *xyz_list  = NULL;
++	Input      *input = NULL;
++
++	/*SPECIFICS: Driving stress for balance velocities*/
++	Input*      H_input = NULL, *surface_input = NULL, *vx_input = NULL, *vy_input = NULL;
++	IssmDouble  taud_x,norms,normv,vx,vy;
++	IssmDouble  rho_ice,gravity,slope[2],thickness;
++
++	/*Fetch number of nodes and dof for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++
++	/*Initialize Element vector*/
++	ElementVector* pe    = element->NewElementVector();
++	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
++
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinates(&xyz_list);
++	element->FindParam(&input_enum,InputToSmoothEnum);
++
++	switch(input_enum){
++		case DrivingStressXEnum:
++		case DrivingStressYEnum:{
++			rho_ice       = element->GetMaterialParameter(MaterialsRhoIceEnum);
++			gravity       = element->GetMaterialParameter(ConstantsGEnum);
++			H_input       = element->GetInput(ThicknessEnum); _assert_(H_input);
++			surface_input = element->GetInput(SurfaceEnum);   _assert_(surface_input);
++			vx_input      = element->GetInput(VxEnum);
++			vy_input      = element->GetInput(VyEnum);
++			}
++			break;
++		case SurfaceSlopeXEnum:
++		case SurfaceSlopeYEnum:{
++			surface_input = element->GetInput(SurfaceEnum);   _assert_(surface_input);
++			}
++			break;
++		default: input = element->GetInput(input_enum);
++	}
++
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGauss(2);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		element->NodalFunctions(basis,gauss);
++
++
++		switch(input_enum){
++			case DrivingStressXEnum: 
++			case DrivingStressYEnum:{
++				H_input->GetInputValue(&thickness,gauss);
++				surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss);
++				if(vx_input && vy_input){
++					vx_input->GetInputValue(&vx,gauss);
++					vy_input->GetInputValue(&vy,gauss);
++					norms = sqrt(slope[0]*slope[0]+slope[1]*slope[1]+1.e-10);
++					normv = sqrt(vx*vx + vy*vy);
++					if(normv>15./(365.*24.*3600.)){
++						slope[0] = -vx/normv*norms;
++						slope[1] = -vy/normv*norms;
++					}
++				}
++				if(input_enum==DrivingStressXEnum)
++				 value = rho_ice*gravity*thickness*slope[0];
++				else
++				 value = rho_ice*gravity*thickness*slope[1];
++			}
++			break;
++			case SurfaceSlopeXEnum: 
++				surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss);
++				value = slope[0];
++				break;
++			case SurfaceSlopeYEnum:
++				surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss);
++				value = slope[1];
++				break;
++			default:
++				input->GetInputValue(&value,gauss);
++		}
++
++		for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*value*basis[i];
++	}
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(basis);
++	delete gauss;
++	return pe;
++}/*}}}*/
++void SmoothAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++	   _error_("not implemented yet");
++}/*}}}*/
++void SmoothAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++	_error_("Not implemented yet");
++}/*}}}*/
++void SmoothAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++	int inputenum,domaintype,elementtype;
++
++	element->FindParam(&inputenum,InputToSmoothEnum);
++	element->FindParam(&domaintype,DomainTypeEnum);
++	switch(domaintype){
++		case Domain2DhorizontalEnum:
++			element->InputUpdateFromSolutionOneDof(solution,inputenum);
++			break;
++		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
++	}
++}/*}}}*/
++void SmoothAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++	/*Default, do nothing*/
++	return;
++}/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/BalancevelocityAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/BalancevelocityAnalysis.cpp	(revision 18592)
++++ ../trunk-jpl/src/c/analyses/BalancevelocityAnalysis.cpp	(revision 18593)
+@@ -94,8 +94,8 @@
+ 	h = element->CharacteristicLength();
+ 
+ 	/*Get vector N for all nodes and build HNx and HNy*/
+-	element->GetInputListOnNodes(Nx,SurfaceSlopeXEnum);
+-	element->GetInputListOnNodes(Ny,SurfaceSlopeYEnum);
++	element->GetInputListOnNodes(Nx,DrivingStressXEnum);
++	element->GetInputListOnNodes(Ny,DrivingStressYEnum);
+ 	element->GetInputListOnNodes(H,ThicknessEnum);
+ 	for(int i=0;i<numnodes;i++){
+ 		IssmDouble norm=sqrt(Nx[i]*Nx[i]+Ny[i]*Ny[i]+1.e-10);
+@@ -189,8 +189,8 @@
+ 	IssmDouble h = basalelement->CharacteristicLength();
+ 
+ 	/*Get vector N for all nodes*/
+-	basalelement->GetInputListOnNodes(Nx,SurfaceSlopeXEnum);
+-	basalelement->GetInputListOnNodes(Ny,SurfaceSlopeYEnum);
++	basalelement->GetInputListOnNodes(Nx,DrivingStressXEnum);
++	basalelement->GetInputListOnNodes(Ny,DrivingStressYEnum);
+ 	basalelement->GetInputListOnNodes(H,ThicknessEnum);
+ 	for(int i=0;i<numnodes;i++){
+ 		IssmDouble norm=sqrt(Nx[i]*Nx[i]+Ny[i]*Ny[i]+1.e-10);
+Index: ../trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp	(revision 18592)
++++ ../trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp	(revision 18593)
+@@ -92,7 +92,7 @@
+ 	int numnodes = basalelement->GetNumberOfNodes();
+ 
+ 	/*Initialize Element vector*/
+-	ElementMatrix* Ke    = basalelement->NewElementMatrix(NoneApproximationEnum);
++	ElementMatrix* Ke    = basalelement->NewElementMatrix();
+ 	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
+ 
+ 	/*Retrieve all inputs and parameters*/
+Index: ../trunk-jpl/src/c/analyses/analyses.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/analyses.h	(revision 18592)
++++ ../trunk-jpl/src/c/analyses/analyses.h	(revision 18593)
+@@ -31,8 +31,7 @@
+ #include "./MasstransportAnalysis.h"
+ #include "./MeltingAnalysis.h"
+ #include "./MeshdeformationAnalysis.h"
+-#include "./SmoothedSurfaceSlopeXAnalysis.h"
+-#include "./SmoothedSurfaceSlopeYAnalysis.h"
++#include "./SmoothAnalysis.h"
+ #include "./SeaiceAnalysis.h"
+ #include "./StressbalanceAnalysis.h"
+ #include "./StressbalanceSIAAnalysis.h"
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18592)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18593)
+@@ -387,8 +387,7 @@
+ 	DepthAverageAnalysisEnum,
+ 	SteadystateSolutionEnum,
+ 	SurfaceSlopeSolutionEnum,
+-	SmoothedSurfaceSlopeXAnalysisEnum,
+-	SmoothedSurfaceSlopeYAnalysisEnum,
++	SmoothAnalysisEnum,
+ 	ThermalAnalysisEnum,
+ 	ThermalSolutionEnum,
+ 	TransientSolutionEnum,
+@@ -449,6 +448,7 @@
+ 	InputToExtrudeEnum,
+ 	InputToL2ProjectEnum,
+ 	InputToDepthaverageEnum,
++	InputToSmoothEnum,
+ 	IntParamEnum,
+ 	IntVecParamEnum,
+ 	TransientParamEnum,
+@@ -562,6 +562,8 @@
+ 	ViscousHeatingEnum,
+ 	HydrologyWaterVxEnum,
+ 	HydrologyWaterVyEnum,
++	DrivingStressXEnum,
++	DrivingStressYEnum,
+ 	SigmaNNEnum,
+ 	StressTensorEnum,
+ 	StressTensorxxEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18592)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18593)
+@@ -390,8 +390,7 @@
+ 		case DepthAverageAnalysisEnum : return "DepthAverageAnalysis";
+ 		case SteadystateSolutionEnum : return "SteadystateSolution";
+ 		case SurfaceSlopeSolutionEnum : return "SurfaceSlopeSolution";
+-		case SmoothedSurfaceSlopeXAnalysisEnum : return "SmoothedSurfaceSlopeXAnalysis";
+-		case SmoothedSurfaceSlopeYAnalysisEnum : return "SmoothedSurfaceSlopeYAnalysis";
++		case SmoothAnalysisEnum : return "SmoothAnalysis";
+ 		case ThermalAnalysisEnum : return "ThermalAnalysis";
+ 		case ThermalSolutionEnum : return "ThermalSolution";
+ 		case TransientSolutionEnum : return "TransientSolution";
+@@ -446,6 +445,7 @@
+ 		case InputToExtrudeEnum : return "InputToExtrude";
+ 		case InputToL2ProjectEnum : return "InputToL2Project";
+ 		case InputToDepthaverageEnum : return "InputToDepthaverage";
++		case InputToSmoothEnum : return "InputToSmooth";
+ 		case IntParamEnum : return "IntParam";
+ 		case IntVecParamEnum : return "IntVecParam";
+ 		case TransientParamEnum : return "TransientParam";
+@@ -553,6 +553,8 @@
+ 		case ViscousHeatingEnum : return "ViscousHeating";
+ 		case HydrologyWaterVxEnum : return "HydrologyWaterVx";
+ 		case HydrologyWaterVyEnum : return "HydrologyWaterVy";
++		case DrivingStressXEnum : return "DrivingStressX";
++		case DrivingStressYEnum : return "DrivingStressY";
+ 		case SigmaNNEnum : return "SigmaNN";
+ 		case StressTensorEnum : return "StressTensor";
+ 		case StressTensorxxEnum : return "StressTensorxx";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18592)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18593)
+@@ -399,8 +399,7 @@
+ 	      else if (strcmp(name,"DepthAverageAnalysis")==0) return DepthAverageAnalysisEnum;
+ 	      else if (strcmp(name,"SteadystateSolution")==0) return SteadystateSolutionEnum;
+ 	      else if (strcmp(name,"SurfaceSlopeSolution")==0) return SurfaceSlopeSolutionEnum;
+-	      else if (strcmp(name,"SmoothedSurfaceSlopeXAnalysis")==0) return SmoothedSurfaceSlopeXAnalysisEnum;
+-	      else if (strcmp(name,"SmoothedSurfaceSlopeYAnalysis")==0) return SmoothedSurfaceSlopeYAnalysisEnum;
++	      else if (strcmp(name,"SmoothAnalysis")==0) return SmoothAnalysisEnum;
+ 	      else if (strcmp(name,"ThermalAnalysis")==0) return ThermalAnalysisEnum;
+ 	      else if (strcmp(name,"ThermalSolution")==0) return ThermalSolutionEnum;
+ 	      else if (strcmp(name,"TransientSolution")==0) return TransientSolutionEnum;
+@@ -455,6 +454,7 @@
+ 	      else if (strcmp(name,"InputToExtrude")==0) return InputToExtrudeEnum;
+ 	      else if (strcmp(name,"InputToL2Project")==0) return InputToL2ProjectEnum;
+ 	      else if (strcmp(name,"InputToDepthaverage")==0) return InputToDepthaverageEnum;
++	      else if (strcmp(name,"InputToSmooth")==0) return InputToSmoothEnum;
+ 	      else if (strcmp(name,"IntParam")==0) return IntParamEnum;
+ 	      else if (strcmp(name,"IntVecParam")==0) return IntVecParamEnum;
+ 	      else if (strcmp(name,"TransientParam")==0) return TransientParamEnum;
+@@ -565,6 +565,8 @@
+ 	      else if (strcmp(name,"ViscousHeating")==0) return ViscousHeatingEnum;
+ 	      else if (strcmp(name,"HydrologyWaterVx")==0) return HydrologyWaterVxEnum;
+ 	      else if (strcmp(name,"HydrologyWaterVy")==0) return HydrologyWaterVyEnum;
++	      else if (strcmp(name,"DrivingStressX")==0) return DrivingStressXEnum;
++	      else if (strcmp(name,"DrivingStressY")==0) return DrivingStressYEnum;
+ 	      else if (strcmp(name,"SigmaNN")==0) return SigmaNNEnum;
+ 	      else if (strcmp(name,"StressTensor")==0) return StressTensorEnum;
+ 	      else if (strcmp(name,"StressTensorxx")==0) return StressTensorxxEnum;
+@@ -626,12 +628,12 @@
+ 	      else if (strcmp(name,"Time")==0) return TimeEnum;
+ 	      else if (strcmp(name,"WaterColumnOld")==0) return WaterColumnOldEnum;
+ 	      else if (strcmp(name,"Outputdefinition")==0) return OutputdefinitionEnum;
+-	      else if (strcmp(name,"OutputdefinitionList")==0) return OutputdefinitionListEnum;
+-	      else if (strcmp(name,"Massfluxatgate")==0) return MassfluxatgateEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"MassfluxatgateName")==0) return MassfluxatgateNameEnum;
++	      if (strcmp(name,"OutputdefinitionList")==0) return OutputdefinitionListEnum;
++	      else if (strcmp(name,"Massfluxatgate")==0) return MassfluxatgateEnum;
++	      else if (strcmp(name,"MassfluxatgateName")==0) return MassfluxatgateNameEnum;
+ 	      else if (strcmp(name,"MassfluxatgateSegments")==0) return MassfluxatgateSegmentsEnum;
+ 	      else if (strcmp(name,"MisfitName")==0) return MisfitNameEnum;
+ 	      else if (strcmp(name,"MisfitModelEnum")==0) return MisfitModelEnumEnum;
+@@ -749,12 +751,12 @@
+ 	      else if (strcmp(name,"BasalforcingsOceanVy")==0) return BasalforcingsOceanVyEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsRhoAir")==0) return SurfaceforcingsRhoAirEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsAirCoef")==0) return SurfaceforcingsAirCoefEnum;
+-	      else if (strcmp(name,"SurfaceforcingsAirLinDragCoef")==0) return SurfaceforcingsAirLinDragCoefEnum;
+-	      else if (strcmp(name,"SurfaceforcingsAirQuadDragCoef")==0) return SurfaceforcingsAirQuadDragCoefEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"SurfaceforcingsWindVx")==0) return SurfaceforcingsWindVxEnum;
++	      if (strcmp(name,"SurfaceforcingsAirLinDragCoef")==0) return SurfaceforcingsAirLinDragCoefEnum;
++	      else if (strcmp(name,"SurfaceforcingsAirQuadDragCoef")==0) return SurfaceforcingsAirQuadDragCoefEnum;
++	      else if (strcmp(name,"SurfaceforcingsWindVx")==0) return SurfaceforcingsWindVxEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsWindVy")==0) return SurfaceforcingsWindVyEnum;
+ 	      else if (strcmp(name,"Matseaice")==0) return MatseaiceEnum;
+ 	      else if (strcmp(name,"MaterialsPoisson")==0) return MaterialsPoissonEnum;
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 18592)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 18593)
+@@ -656,12 +656,9 @@
+ if THERMAL
+ issm_sources += ./analyses/ThermalAnalysis.cpp
+ endif
+-if SMOOTHEDSURFACESLOPEX
+-issm_sources += ./analyses/SmoothedSurfaceSlopeXAnalysis.cpp
++if SMOOTH
++issm_sources += ./analyses/SmoothAnalysis.cpp
+ endif
+-if SMOOTHEDSURFACESLOPEY
+-issm_sources += ./analyses/SmoothedSurfaceSlopeYAnalysis.cpp
+-endif
+ if MESHDEFORMATION
+ issm_sources += ./analyses/MeshdeformationAnalysis.cpp
+ endif
+Index: ../trunk-jpl/src/c/cores/balancevelocity_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/balancevelocity_core.cpp	(revision 18592)
++++ ../trunk-jpl/src/c/cores/balancevelocity_core.cpp	(revision 18593)
+@@ -18,11 +18,11 @@
+ 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+ 
+ 	if(VerboseSolution()) _printf0_("computing smoothed slopes:\n");
+-	femmodel->SetCurrentConfiguration(SmoothedSurfaceSlopeXAnalysisEnum);
++	femmodel->SetCurrentConfiguration(SmoothAnalysisEnum);
++	femmodel->parameters->SetParam(DrivingStressXEnum,InputToSmoothEnum);
+ 	solutionsequence_linear(femmodel);
+-	femmodel->SetCurrentConfiguration(SmoothedSurfaceSlopeYAnalysisEnum);
++	femmodel->parameters->SetParam(DrivingStressYEnum,InputToSmoothEnum);
+ 	solutionsequence_linear(femmodel);
+-	//surfaceslope_core(femmodel);
+ 
+ 	if(VerboseSolution()) _printf0_("call computational core:\n");
+ 	femmodel->SetCurrentConfiguration(BalancevelocityAnalysisEnum);
+@@ -30,7 +30,7 @@
+ 
+ 	if(save_results){
+ 		if(VerboseSolution()) _printf0_("   saving results\n");
+-		int outputs[3] = {SurfaceSlopeXEnum,SurfaceSlopeYEnum,VelEnum};
++		int outputs[3] = {DrivingStressXEnum,DrivingStressYEnum,VelEnum};
+ 		femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],3);
+ 	}
+ 
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18592)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18593)
+@@ -474,8 +474,7 @@
+ 
+ 		case BalancevelocitySolutionEnum:
+ 			analyses_temp[numanalyses++]=BalancevelocityAnalysisEnum;
+-			analyses_temp[numanalyses++]=SmoothedSurfaceSlopeXAnalysisEnum;
+-			analyses_temp[numanalyses++]=SmoothedSurfaceSlopeYAnalysisEnum;
++			analyses_temp[numanalyses++]=SmoothAnalysisEnum;
+ 			break;
+ 
+ 		case SurfaceSlopeSolutionEnum:
+Index: ../trunk-jpl/src/m/classes/inversionvalidation.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 18592)
++++ ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 18593)
+@@ -17,6 +17,7 @@
+ 		vz_obs                      = NaN
+ 		vel_obs                     = NaN
+ 		thickness_obs               = NaN
++		surface_obs               = NaN
+ 	end
+ 	methods
+ 		function obj = inversionvalidation(varargin) % {{{
+@@ -53,7 +54,7 @@
+ 			md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0 1]);
+ 			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',...
+ 				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'DamageDbar' 'Vx' 'Vy' 'Thickness',...
+-				'BalancethicknessNu' 'BalancethicknessApparentMassbalance'});
++				'BalancethicknessOmega' 'BalancethicknessApparentMassbalance'});
+ 			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:506 601:604]);
+ 			md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);
+@@ -83,6 +84,7 @@
+ 			fielddisplay(obj,'vy_obs','observed velocity y component [m/yr]');
+ 			fielddisplay(obj,'vel_obs','observed velocity magnitude [m/yr]');
+ 			fielddisplay(obj,'thickness_obs','observed thickness [m]');
++			fielddisplay(obj,'surface_obs','observed surface elevation [m]');
+ 			disp('Available cost functions:');
+ 			disp('   101: SurfaceAbsVelMisfit');
+ 			disp('   102: SurfaceRelVelMisfit');
+@@ -114,6 +116,7 @@
+ 				mattype=1;
+ 			end
+ 			WriteData(fid,'object',obj,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',mattype);
++			WriteData(fid,'object',obj,'class','inversion','fieldname','surface_obs','format','DoubleMat','mattype',mattype);
+ 
+ 			%process control parameters
+ 			num_control_parameters=numel(obj.control_parameters);
+@@ -139,6 +142,7 @@
+ 			pos=find(obj.cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
+ 			pos=find(obj.cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
+ 			pos=find(obj.cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
++			pos=find(obj.cost_functions==601); data(pos)=SurfaceAbsMisfitEnum();
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/enum/DrivingStressXEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/DrivingStressXEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/DrivingStressXEnum.m	(revision 18593)
+@@ -0,0 +1,11 @@
++function macro=DrivingStressXEnum()
++%DRIVINGSTRESSXENUM - Enum of DrivingStressX
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=DrivingStressXEnum()
++
++macro=StringToEnum('DrivingStressX');
+Index: ../trunk-jpl/src/m/enum/SmoothAnalysisEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SmoothAnalysisEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SmoothAnalysisEnum.m	(revision 18593)
+@@ -0,0 +1,11 @@
++function macro=SmoothAnalysisEnum()
++%SMOOTHANALYSISENUM - Enum of SmoothAnalysis
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SmoothAnalysisEnum()
++
++macro=StringToEnum('SmoothAnalysis');
+Index: ../trunk-jpl/src/m/enum/DrivingStressYEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/DrivingStressYEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/DrivingStressYEnum.m	(revision 18593)
+@@ -0,0 +1,11 @@
++function macro=DrivingStressYEnum()
++%DRIVINGSTRESSYENUM - Enum of DrivingStressY
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=DrivingStressYEnum()
++
++macro=StringToEnum('DrivingStressY');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18592)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18593)
+@@ -382,8 +382,7 @@
+ def DepthAverageAnalysisEnum(): return StringToEnum("DepthAverageAnalysis")[0]
+ def SteadystateSolutionEnum(): return StringToEnum("SteadystateSolution")[0]
+ def SurfaceSlopeSolutionEnum(): return StringToEnum("SurfaceSlopeSolution")[0]
+-def SmoothedSurfaceSlopeXAnalysisEnum(): return StringToEnum("SmoothedSurfaceSlopeXAnalysis")[0]
+-def SmoothedSurfaceSlopeYAnalysisEnum(): return StringToEnum("SmoothedSurfaceSlopeYAnalysis")[0]
++def SmoothAnalysisEnum(): return StringToEnum("SmoothAnalysis")[0]
+ def ThermalAnalysisEnum(): return StringToEnum("ThermalAnalysis")[0]
+ def ThermalSolutionEnum(): return StringToEnum("ThermalSolution")[0]
+ def TransientSolutionEnum(): return StringToEnum("TransientSolution")[0]
+@@ -438,6 +437,7 @@
+ def InputToExtrudeEnum(): return StringToEnum("InputToExtrude")[0]
+ def InputToL2ProjectEnum(): return StringToEnum("InputToL2Project")[0]
+ def InputToDepthaverageEnum(): return StringToEnum("InputToDepthaverage")[0]
++def InputToSmoothEnum(): return StringToEnum("InputToSmooth")[0]
+ def IntParamEnum(): return StringToEnum("IntParam")[0]
+ def IntVecParamEnum(): return StringToEnum("IntVecParam")[0]
+ def TransientParamEnum(): return StringToEnum("TransientParam")[0]
+@@ -545,6 +545,8 @@
+ def ViscousHeatingEnum(): return StringToEnum("ViscousHeating")[0]
+ def HydrologyWaterVxEnum(): return StringToEnum("HydrologyWaterVx")[0]
+ def HydrologyWaterVyEnum(): return StringToEnum("HydrologyWaterVy")[0]
++def DrivingStressXEnum(): return StringToEnum("DrivingStressX")[0]
++def DrivingStressYEnum(): return StringToEnum("DrivingStressY")[0]
+ def SigmaNNEnum(): return StringToEnum("SigmaNN")[0]
+ def StressTensorEnum(): return StringToEnum("StressTensor")[0]
+ def StressTensorxxEnum(): return StringToEnum("StressTensorxx")[0]
+Index: ../trunk-jpl/src/m/enum/InputToSmoothEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/InputToSmoothEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/InputToSmoothEnum.m	(revision 18593)
+@@ -0,0 +1,11 @@
++function macro=InputToSmoothEnum()
++%INPUTTOSMOOTHENUM - Enum of InputToSmooth
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=InputToSmoothEnum()
++
++macro=StringToEnum('InputToSmooth');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18593-18594.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18593-18594.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18593-18594.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/m4/issm_options.m4
+===================================================================
+--- ../trunk-jpl/m4/issm_options.m4	(revision 18593)
++++ ../trunk-jpl/m4/issm_options.m4	(revision 18594)
+@@ -1841,7 +1841,7 @@
+ 		MULTITHREADINGLIB="-lpthread -lrt"
+ 		;;
+ 		*darwin*)
+-		MULTITHREADINGLIB="-lpthread"
++		MULTITHREADINGLIB="-L/usr/lib/ -lpthread"
+ 		;;
+ 		esac
+ 		AC_DEFINE([_MULTITHREADING_],[1],[with numthreads enabled])
Index: /issm/oecreview/Archive/18296-19100/ISSM-18594-18595.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18594-18595.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18594-18595.diff	(revision 19102)
@@ -0,0 +1,74 @@
+Index: ../trunk-jpl/m4/analyses.m4
+===================================================================
+--- ../trunk-jpl/m4/analyses.m4	(revision 18594)
++++ ../trunk-jpl/m4/analyses.m4	(revision 18595)
+@@ -633,58 +633,32 @@
+ AC_MSG_RESULT($HAVE_DEPTHAVERAGE)
+ 
+ dnl }}}
+-dnl with-SmoothedSurfaceSlopeX{{{
++dnl with-Smooth{{{
+ 
+-AC_ARG_WITH([SmoothedSurfaceSlopeX],
++AC_ARG_WITH([Smooth],
+ 
+-	AS_HELP_STRING([--with-SmoothedSurfaceSlopeX = YES], [compile with SmoothedSurfaceSlopeX capabilities (default is yes)]),
++	AS_HELP_STRING([--with-Smooth = YES], [compile with Smooth capabilities (default is yes)]),
+ 
+-	[SMOOTHEDSURFACESLOPEX=$withval],[SMOOTHEDSURFACESLOPEX=yes])
++	[SMOOTH=$withval],[SMOOTH=yes])
+ 
+-AC_MSG_CHECKING(for SmoothedSurfaceSlopeX capability compilation)
++AC_MSG_CHECKING(for Smooth capability compilation)
+ 
+ 
+-HAVE_SMOOTHEDSURFACESLOPEX=no 
++HAVE_SMOOTH=no 
+ 
+-if test "x$SMOOTHEDSURFACESLOPEX" = "xyes"; then
++if test "x$SMOOTH" = "xyes"; then
+ 
+-	HAVE_SMOOTHEDSURFACESLOPEX=yes
++	HAVE_SMOOTH=yes
+ 
+-	AC_DEFINE([_HAVE_SMOOTHEDSURFACESLOPEX_],[1],[with SmoothedSurfaceSlopeXcapability])
++	AC_DEFINE([_HAVE_SMOOTH_],[1],[with Smoothcapability])
+ 
+ fi
+ 
+-AM_CONDITIONAL([SMOOTHEDSURFACESLOPEX], [test x$HAVE_SMOOTHEDSURFACESLOPEX = xyes])
++AM_CONDITIONAL([SMOOTH], [test x$HAVE_SMOOTH = xyes])
+ 
+-AC_MSG_RESULT($HAVE_SMOOTHEDSURFACESLOPEX)
++AC_MSG_RESULT($HAVE_SMOOTH)
+ 
+ dnl }}}
+-dnl with-SmoothedSurfaceSlopeY{{{
+-
+-AC_ARG_WITH([SmoothedSurfaceSlopeY],
+-
+-	AS_HELP_STRING([--with-SmoothedSurfaceSlopeY = YES], [compile with SmoothedSurfaceSlopeY capabilities (default is yes)]),
+-
+-	[SMOOTHEDSURFACESLOPEY=$withval],[SMOOTHEDSURFACESLOPEY=yes])
+-
+-AC_MSG_CHECKING(for SmoothedSurfaceSlopeY capability compilation)
+-
+-
+-HAVE_SMOOTHEDSURFACESLOPEY=no 
+-
+-if test "x$SMOOTHEDSURFACESLOPEY" = "xyes"; then
+-
+-	HAVE_SMOOTHEDSURFACESLOPEY=yes
+-
+-	AC_DEFINE([_HAVE_SMOOTHEDSURFACESLOPEY_],[1],[with SmoothedSurfaceSlopeYcapability])
+-
+-fi
+-
+-AM_CONDITIONAL([SMOOTHEDSURFACESLOPEY], [test x$HAVE_SMOOTHEDSURFACESLOPEY = xyes])
+-
+-AC_MSG_RESULT($HAVE_SMOOTHEDSURFACESLOPEY)
+-
+-dnl }}}
+ dnl with-Thermal{{{
+ 
+ AC_ARG_WITH([Thermal],
Index: /issm/oecreview/Archive/18296-19100/ISSM-18595-18596.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18595-18596.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18595-18596.diff	(revision 19102)
@@ -0,0 +1,21 @@
+Index: ../trunk-jpl/src/m/classes/initialization.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/initialization.py	(revision 18595)
++++ ../trunk-jpl/src/m/classes/initialization.py	(revision 18596)
+@@ -78,12 +78,12 @@
+ 			md = checkfield(md,'fieldname','initialization.watercolumn','NaN',1,'size',[md.mesh.numberofvertices])
+ 		if HydrologyDCInefficientAnalysisEnum() in analyses:
+ 			if hasattr(md.hydrology,'hydrologydc'):
+-				md = checkfield(md,'fieldname','initialization.sediment_head','NaN',1,'size',[md.mesh.numberofvertices 1]);
++				md = checkfield(md,'fieldname','initialization.sediment_head','NaN',1,'size',[md.mesh.numberofvertices 1])
+ 		if HydrologyDCEfficientAnalysisEnum() in analyses:
+ 			if hasattr(md.hydrology,'hydrologydc'):
+-				if md.hydrology.isefficientlayer==1,
+-					md = checkfield(md,'fieldname','initialization.epl_head','NaN',1,'size',[md.mesh.numberofvertices 1]);
+-					md = checkfield(md,'fieldname','initialization.epl_thickness','NaN',1,'size',[md.mesh.numberofvertices 1]);
++				if md.hydrology.isefficientlayer==1:
++					md = checkfield(md,'fieldname','initialization.epl_head','NaN',1,'size',[md.mesh.numberofvertices 1])
++					md = checkfield(md,'fieldname','initialization.epl_thickness','NaN',1,'size',[md.mesh.numberofvertices 1])
+ 				
+ 
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18596-18597.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18596-18597.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18596-18597.diff	(revision 19102)
@@ -0,0 +1,204 @@
+Index: ../trunk-jpl/jenkins/linux64_murdo
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_murdo	(revision 18596)
++++ ../trunk-jpl/jenkins/linux64_murdo	(revision 18597)
+@@ -1,13 +1,8 @@
+-#
+-########### Configuration file for Eric Larour's Jenkins run on Murdo ############
+ 
+ #-------------------------------#
+ # 1: ISSM general configuration #
+ #-------------------------------#
+ 
+-#Nightly run name
+-NAME="ISSM matlab tests on Linux64 (murdo)"
+-
+ #ISSM CONFIGURATION 
+ ISSM_CONFIG='--prefix=$ISSM_DIR\
+ 	--with-matlab-dir=$MATLAB_DIR \
+Index: ../trunk-jpl/jenkins/linux64_murdo_gia
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_murdo_gia	(revision 0)
++++ ../trunk-jpl/jenkins/linux64_murdo_gia	(revision 18597)
+@@ -0,0 +1,84 @@
++
++#-------------------------------#
++# 1: ISSM general configuration #
++#-------------------------------#
++
++#ISSM CONFIGURATION 
++ISSM_CONFIG='--prefix=$ISSM_DIR\
++	--with-matlab-dir=$MATLAB_DIR \
++	--with-triangle-dir=$ISSM_DIR/externalpackages/triangle/install \
++	--with-mpi-include=$ISSM_DIR/externalpackages/mpich/install/include  \
++	--with-mpi-libflags="-L$ISSM_DIR/externalpackages/mpich/install/lib -lmpich" \
++	--with-petsc-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-metis-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-math77-dir=$ISSM_DIR/externalpackages/math77/install \
++	--with-fortran-lib="-L/usr/lib/gcc/x86_64-linux-gnu/4.6/ -lgfortran" \
++	--with-gia=yes \
++	--with-numthreads=18 \
++	--enable-development \
++	--enable-debugging '
++
++#MATLAB path
++MATLAB_PATH="/usr/local/matlab80/"
++
++#PYTHON and MATLAB testing
++MATLAB_TEST=1
++PYTHON_TEST=0
++
++#execution path used for parallel runs
++EXECUTION_PATH=$ISSM_DIR/execution
++
++#repo:
++REPOSITORY="https://issm.ess.uci.edu/svn/issm/issm/trunk-jpl"
++
++#-----------------------------------#
++# 3: External packages installation #
++#-----------------------------------#
++
++#ISSM_EXTERNALPACKAGES can have 3 values:
++# - "install" install all external packages listed below
++# - "copy"    copy existing directories (EXTERNALPACKAGESDIR)
++# - "none"    leave external packages as is
++#             ->skip to section 4
++ISSM_EXTERNALPACKAGES="install"
++EXTERNALPACKAGESDIR=$ISSM_DIR/externalpackages
++
++#List of external pakages to be installed and their installation scripts
++EXTERNALPACKAGES="autotools     install.sh                
++						matlab        install.sh                
++						mpich         install-3.0-linux64.sh    
++						cmake         install.sh                
++						petsc         install-3.5-linux64.sh    
++						triangle      install-linux64.sh        
++						math77        install.sh
++						shell2junit   install.sh"
++
++
++#---------------------#
++# 4: ISSM Compilation #
++#---------------------#
++
++#ISSM_COMPILATION can have 2 values:
++# - "yes" compile ISSM
++# - "no"  do not compile ISSM
++ISSM_COMPILATION="yes"
++
++#------------------------#
++# 5: Nightly run options #
++#------------------------#
++
++#number of cpus used in ISSM installation and compilation (one is usually
++#safer as some packages are very sensitive to parallel compilation)
++NUMCPUS_INSTALL=8
++
++#number of cpus used in the nightly runs.
++NUMCPUS_RUN=1
++
++#Nightly run options. The matlab routine runme.m will be called
++#as follows: runme($MATLAB_NROPTIONS). The options must be understandable
++#by Matlab and runme.m
++#ex: "'id',[101 102 103]"
++MATLAB_NROPTIONS="'benchmark','all','id',[2001:2100]"
++PYTHON_NROPTIONS=""
+
+Property changes on: ../trunk-jpl/jenkins/linux64_murdo_gia
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/jenkins/linux64_murdo_ad
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_murdo_ad	(revision 18596)
++++ ../trunk-jpl/jenkins/linux64_murdo_ad	(revision 18597)
+@@ -1,12 +1,8 @@
+-########### Configuration file for Eric Larour's Jenkins runs on Linux. Automatic differentiation ############
+-
++#
+ #-------------------------------#
+ # 1: ISSM general configuration #
+ #-------------------------------#
+ 
+-#Nightly run name
+-NAME="ISSM tests on Linux64 (murdo). Automatic differentiation validation tests"
+-
+ #ISSM CONFIGURATION 
+ ISSM_CONFIG='--prefix=$ISSM_DIR\
+ 				--prefix=$ISSM_DIR \
+Index: ../trunk-jpl/jenkins/linux64_murdo_ampi
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_murdo_ampi	(revision 18596)
++++ ../trunk-jpl/jenkins/linux64_murdo_ampi	(revision 18597)
+@@ -1,13 +1,8 @@
+-#
+-########### Configuration file for Eric Larour's Jenkins run on Murdo ############
+ 
+ #-------------------------------#
+ # 1: ISSM general configuration #
+ #-------------------------------#
+ 
+-#Nightly run name
+-NAME="ISSM tests on Linux64 (murdo). Automatic differentiation validation tests with ampi"
+-
+ #ISSM CONFIGURATION 
+ ISSM_CONFIG='--prefix=$ISSM_DIR\
+ 				  --without-kriging \
+Index: ../trunk-jpl/jenkins/linux64_murdo_iceocean
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_murdo_iceocean	(revision 18596)
++++ ../trunk-jpl/jenkins/linux64_murdo_iceocean	(revision 18597)
+@@ -1,13 +1,8 @@
+-#
+-########### Configuration file for Eric Larour's Jenkins run on Murdo ############
+ 
+ #-------------------------------#
+ # 1: ISSM general configuration #
+ #-------------------------------#
+ 
+-#Nightly run name
+-NAME="ISSM ice-ocean tests on Linux64 (murdo)"
+-
+ #ISSM CONFIGURATION 
+ ISSM_CONFIG='--prefix=$ISSM_DIR\
+ 	--with-matlab-dir=$MATLAB_DIR \
+Index: ../trunk-jpl/jenkins/imac-012301-gil
+===================================================================
+--- ../trunk-jpl/jenkins/imac-012301-gil	(revision 18596)
++++ ../trunk-jpl/jenkins/imac-012301-gil	(revision 18597)
+@@ -1,13 +1,8 @@
+-#
+-########### Configuration file for Eric Larour's Jenkins run on MaxOSX ############
+ 
+ #-------------------------------#
+ # 1: ISSM general configuration #
+ #-------------------------------#
+ 
+-#Nightly run name
+-NAME="ISSM matlab tests on MacOSX"
+-
+ #ISSM CONFIGURATION 
+ ISSM_CONFIG='--prefix=$ISSM_DIR \
+ 	--with-matlab-dir=$MATLAB_DIR \
+Index: ../trunk-jpl/jenkins/windows
+===================================================================
+--- ../trunk-jpl/jenkins/windows	(revision 18596)
++++ ../trunk-jpl/jenkins/windows	(revision 18597)
+@@ -1,13 +1,8 @@
+-#
+-########### Configuration file for Eric Larour's Jenkins run on Windows ############
+ 
+ #-------------------------------#
+ # 1: ISSM general configuration #
+ #-------------------------------#
+ 
+-#Nightly run name
+-NAME="ISSM matlab tests on Windows"
+-
+ #ISSM CONFIGURATION 
+ ISSM_CONFIG='--prefix=$ISSM_DIR \
+    --disable-static \
Index: /issm/oecreview/Archive/18296-19100/ISSM-18597-18598.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18597-18598.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18597-18598.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/test/NightlyRun/test702.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test702.m	(revision 18597)
++++ ../trunk-jpl/test/NightlyRun/test702.m	(revision 18598)
+@@ -54,7 +54,7 @@
+ 	md.flowequation.fe_FS=i{1};
+ 	md=solve(md,StressbalanceSolutionEnum());
+ 	field_names     ={field_names{:},['Vx' i{1}],['Vy' i{1}],['Vel' i{1}],['Pressure' i{1}]};
+-	field_tolerances={field_tolerances{:},8e-5,8e-5,8e-5,1e-10};
++	field_tolerances={field_tolerances{:},8e-5,8e-5,8e-5,1e-08};
+ 	field_values={field_values{:},...
+ 		(md.results.StressbalanceSolution.Vx),...
+ 		(md.results.StressbalanceSolution.Vy),...
Index: /issm/oecreview/Archive/18296-19100/ISSM-18598-18599.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18598-18599.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18598-18599.diff	(revision 19102)
@@ -0,0 +1,15 @@
+Index: ../trunk-jpl/src/m/classes/initialization.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/initialization.py	(revision 18598)
++++ ../trunk-jpl/src/m/classes/initialization.py	(revision 18599)
+@@ -72,8 +72,8 @@
+ 				md = checkfield(md,'fieldname','initialization.vz','NaN',1,'size',[md.mesh.numberofvertices])
+ 			md = checkfield(md,'fieldname','initialization.pressure','NaN',1,'size',[md.mesh.numberofvertices])
+ 			if (EnthalpyAnalysisEnum() in analyses and md.thermal.isenthalpy):
+-			md = checkfield(md,'fieldname','initialization.waterfraction','>=',0,'size',[md.mesh.numberofvertices])
+-			md = checkfield(md,'fieldname','initialization.watercolumn'  ,'>=',0,'size',[md.mesh.numberofvertices])
++				md = checkfield(md,'fieldname','initialization.waterfraction','>=',0,'size',[md.mesh.numberofvertices])
++				md = checkfield(md,'fieldname','initialization.watercolumn'  ,'>=',0,'size',[md.mesh.numberofvertices])
+ 		if HydrologyShreveAnalysisEnum() in analyses:
+ 			md = checkfield(md,'fieldname','initialization.watercolumn','NaN',1,'size',[md.mesh.numberofvertices])
+ 		if HydrologyDCInefficientAnalysisEnum() in analyses:
Index: /issm/oecreview/Archive/18296-19100/ISSM-18599-18600.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18599-18600.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18599-18600.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/plot/googlemaps.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/googlemaps.m	(revision 18599)
++++ ../trunk-jpl/src/m/plot/googlemaps.m	(revision 18600)
+@@ -53,7 +53,7 @@
+ 
+ %Get region specific projection parameters
+ EPSGgoogle = 'EPSG:3785';   % Mercator       http://www.spatialreference.org/ref/epsg/3785/
+-EPSGlocal  = ['EPSG:' md.mesh.epsg]
++EPSGlocal  = ['EPSG:' num2str(md.mesh.epsg)];
+ 
+ %Find optimal zoom
+ if exist(options,'zoom'),
Index: /issm/oecreview/Archive/18296-19100/ISSM-18600-18601.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18600-18601.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18600-18601.diff	(revision 19102)
@@ -0,0 +1,14 @@
+Index: ../trunk-jpl/src/c/solutionsequences/convergence.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/convergence.cpp	(revision 18600)
++++ ../trunk-jpl/src/c/solutionsequences/convergence.cpp	(revision 18601)
+@@ -47,6 +47,9 @@
+ 		parameters->FindParam(&eps_rel,StressbalanceReltolEnum);
+ 	else if(analysis_type==EnthalpyAnalysisEnum)
+ 		parameters->FindParam(&eps_rel,ThermalReltolEnum);
++	else
++		eps_rel = NAN;
++
+ 	parameters->FindParam(&eps_abs,StressbalanceAbstolEnum);
+ 	parameters->FindParam(&yts,ConstantsYtsEnum);
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18601-18602.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18601-18602.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18601-18602.diff	(revision 19102)
@@ -0,0 +1,29 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Element.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18601)
++++ ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18602)
+@@ -108,6 +108,7 @@
+ 		int        Sid();
+ 		void       InputChangeName(int enum_type,int enum_type_old);
+ 		void       InputCreate(IssmDouble* vector,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code);
++		void       DeleteInput(int input_enum);
+ 		void       InputDuplicate(int original_enum,int new_enum);
+ 		void       InputUpdateFromConstant(IssmDouble constant, int name);
+ 		void       InputUpdateFromConstant(int constant, int name);
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18601)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18602)
+@@ -996,6 +996,12 @@
+ 
+ }
+ /*}}}*/
++void       Element::DeleteInput(int input_enum){/*{{{*/
++
++	inputs->DeleteInput(input_enum);
++
++}
++/*}}}*/
+ void       Element::InputUpdateFromConstant(int constant, int name){/*{{{*/
+ 
+ 	/*Check that name is an element input*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18602-18603.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18602-18603.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18602-18603.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18602)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18603)
+@@ -465,6 +465,7 @@
+ 			break;
+ 
+ 		case Balancethickness2SolutionEnum:
++			analyses_temp[numanalyses++]=SmoothAnalysisEnum;
+ 			analyses_temp[numanalyses++]=Balancethickness2AnalysisEnum;
+ 			break;
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18603-18604.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18603-18604.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18603-18604.diff	(revision 19102)
@@ -0,0 +1,400 @@
+Index: ../trunk-jpl/src/c/analyses/SmoothAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SmoothAnalysis.cpp	(revision 18603)
++++ ../trunk-jpl/src/c/analyses/SmoothAnalysis.cpp	(revision 18604)
+@@ -47,7 +47,7 @@
+ 
+ 	/* Intermediaries */
+ 	int         domaintype;
+-	IssmDouble  Jdet,thickness,l=8.;
++	IssmDouble  Jdet,thickness,l;
+ 	IssmDouble *xyz_list = NULL;
+ 
+ 	/*Check dimension*/
+@@ -67,6 +67,7 @@
+ 	IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
+ 
+ 	/*Retrieve all inputs and parameters*/
++	element->FindParam(&l,SmoothThicknessMultiplierEnum); _assert_(l>0.);
+ 	element->GetVerticesCoordinates(&xyz_list);
+ 	Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input);
+ 
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18603)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18604)
+@@ -194,27 +194,46 @@
+ }/*}}}*/
+ void AdjointBalancethickness2Analysis::GradientJdHdt(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
++	/*Intermediaries*/
++	IssmDouble lambda,Jdet; 
++	IssmDouble *xyz_list= NULL;
++
+ 	/*Fetch number of vertices for this finite element*/
+ 	int numvertices = element->GetNumberOfVertices();
+ 
+ 	/*Initialize some vectors*/
++	IssmDouble* basis         = xNew<IssmDouble>(numvertices);
+ 	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
+-	IssmDouble* lambda        = xNew<IssmDouble>(numvertices);
+ 	int*        vertexpidlist = xNew<int>(numvertices);
+ 
+ 	/*Retrieve all inputs we will be needing: */
++	element->GetVerticesCoordinates(&xyz_list);
+ 	element->GradientIndexing(&vertexpidlist[0],control_index);
+-	element->GetInputListOnVertices(lambda,AdjointEnum);
+-	for(int i=0;i<numvertices;i++){
+-		ge[i]= - lambda[i];
+-		_assert_(!xIsNan<IssmDouble>(ge[i]));
++	Input* adjoint_input = element->GetInput(AdjointEnum);            _assert_(adjoint_input);
++
++	Gauss* gauss=element->NewGauss(2);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		element->NodalFunctionsP1(basis,gauss);
++
++		adjoint_input->GetInputValue(&lambda,gauss);
++
++		/*Build gradient vector (actually -dJ/da): */
++		for(int i=0;i<numvertices;i++){
++			ge[i]+= -Jdet*gauss->weight*basis[i]*lambda;
++			_assert_(!xIsNan<IssmDouble>(ge[i]));
++		}
+ 	}
+-	gradient->SetValues(numvertices,vertexpidlist,ge,INS_VAL);
++	gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
+ 
+ 	/*Clean up and return*/
+ 	xDelete<IssmDouble>(ge);
+-	xDelete<IssmDouble>(lambda);
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(basis);
+ 	xDelete<int>(vertexpidlist);
++	delete gauss;
+ }/*}}}*/
+ void AdjointBalancethickness2Analysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 	element->InputUpdateFromSolutionOneDof(solution,AdjointEnum);
+Index: ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18603)
++++ ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18604)
+@@ -81,10 +81,10 @@
+ 	element->GetVerticesCoordinates(&xyz_list);
+ 	Input* omega_input = element->GetInput(BalancethicknessOmegaEnum); _assert_(omega_input);
+ 	Input* D0_input    = element->GetInput(BalancethicknessD0Enum);
+-	if(!D0_input){
++	//if(!D0_input){
+ 		this->CreateD0(element);
+ 		D0_input = element->GetInput(BalancethicknessD0Enum); _assert_(D0_input);
+-	}
++	//}
+ 
+ 	/* Start  looping on the number of gaussian points: */
+ 	Gauss* gauss=element->NewGauss(2);
+@@ -219,7 +219,7 @@
+ void Balancethickness2Analysis::CreateD0(Element* element){/*{{{*/
+ 
+ 	/*Intermediaries */
+-	IssmDouble       Gamma,h,mu0,ds[2],Cmu,B,k,s,b;
++	IssmDouble       Gamma,h,mu0,ds[2],Cmu,B,k,s,b,normds;
+ 	const int        n = 3;
+ 	const IssmDouble Hstar = 500.;
+ 	const IssmDouble Lstar = 500.e+3;
+@@ -231,9 +231,11 @@
+ 
+ 	/*retrieve what we need: */
+ 	element->GetVerticesCoordinates(&xyz_list);
+-	Input* surface_input    = element->GetInput(SurfaceEnum);            _assert_(surface_input);
+-	Input* B_input          = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);
+-	IssmDouble rhog = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum);
++	Input* surfaceslopex_input = element->GetInput(SurfaceSlopeXEnum);
++	Input* surfaceslopey_input = element->GetInput(SurfaceSlopeYEnum);
++	Input* surface_input       = element->GetInput(SurfaceEnum);            _assert_(surface_input);
++	Input* B_input             = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);
++	IssmDouble rhog            = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum);
+ 
+ 	/*Calculate damage evolution source term: */
+ 	Gauss* gauss=element->NewGauss();
+@@ -241,8 +243,25 @@
+ 		gauss->GaussNode(element->GetElementType(),i);
+ 		
+ 		B_input->GetInputValue(&B,gauss);
+-		surface_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);
++		if(surfaceslopex_input && surfaceslopey_input){
++			surfaceslopex_input->GetInputValue(&ds[0],gauss);
++			surfaceslopey_input->GetInputValue(&ds[1],gauss);
++		}
++		else{
++			surface_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);
++		}
+ 
++		/*check slopes*/
++		normds = sqrt(ds[0]*ds[0]+ds[1]*ds[1]);
++		if (normds==0.){
++			_error_("surface slope is zero");
++		}
++		if(normds<1.e-5){
++			ds[0] = ds[0]/normds*1.e+5;
++			ds[1] = ds[1]/normds*1.e+5;
++			normds = 1.e-5;
++		}
++
+ 		mu0   = pow(2.,(1-3*n)/(2.*n)) * B;
+ 		Gamma = pow(rhog,n) * pow(Hstar,2*(n+1)) * pow(Hstar/Lstar,2*(n+1)) * 1./pow(mu0,n);
+ 
+@@ -251,6 +270,10 @@
+ 
+ 	/*Add input*/
+ 	element->AddInput(BalancethicknessD0Enum,D0,element->GetElementType());
++	//if(surfaceslopex_input && surfaceslopey_input){
++	//	element->DeleteInput(SurfaceSlopeXEnum);
++	//	element->DeleteInput(SurfaceSlopeYEnum);
++	//}
+ 	
+ 	/*Clean up and return*/
+ 	xDelete<IssmDouble>(D0);
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18603)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18604)
+@@ -449,6 +449,7 @@
+ 	InputToL2ProjectEnum,
+ 	InputToDepthaverageEnum,
+ 	InputToSmoothEnum,
++	SmoothThicknessMultiplierEnum,
+ 	IntParamEnum,
+ 	IntVecParamEnum,
+ 	TransientParamEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18603)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18604)
+@@ -446,6 +446,7 @@
+ 		case InputToL2ProjectEnum : return "InputToL2Project";
+ 		case InputToDepthaverageEnum : return "InputToDepthaverage";
+ 		case InputToSmoothEnum : return "InputToSmooth";
++		case SmoothThicknessMultiplierEnum : return "SmoothThicknessMultiplier";
+ 		case IntParamEnum : return "IntParam";
+ 		case IntVecParamEnum : return "IntVecParam";
+ 		case TransientParamEnum : return "TransientParam";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18603)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18604)
+@@ -455,6 +455,7 @@
+ 	      else if (strcmp(name,"InputToL2Project")==0) return InputToL2ProjectEnum;
+ 	      else if (strcmp(name,"InputToDepthaverage")==0) return InputToDepthaverageEnum;
+ 	      else if (strcmp(name,"InputToSmooth")==0) return InputToSmoothEnum;
++	      else if (strcmp(name,"SmoothThicknessMultiplier")==0) return SmoothThicknessMultiplierEnum;
+ 	      else if (strcmp(name,"IntParam")==0) return IntParamEnum;
+ 	      else if (strcmp(name,"IntVecParam")==0) return IntVecParamEnum;
+ 	      else if (strcmp(name,"TransientParam")==0) return TransientParamEnum;
+@@ -504,11 +505,11 @@
+ 	      else if (strcmp(name,"Adjointz")==0) return AdjointzEnum;
+ 	      else if (strcmp(name,"BalancethicknessMisfit")==0) return BalancethicknessMisfitEnum;
+ 	      else if (strcmp(name,"BedSlopeX")==0) return BedSlopeXEnum;
+-	      else if (strcmp(name,"BedSlopeY")==0) return BedSlopeYEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"Boundary")==0) return BoundaryEnum;
++	      if (strcmp(name,"BedSlopeY")==0) return BedSlopeYEnum;
++	      else if (strcmp(name,"Boundary")==0) return BoundaryEnum;
+ 	      else if (strcmp(name,"Converged")==0) return ConvergedEnum;
+ 	      else if (strcmp(name,"Fill")==0) return FillEnum;
+ 	      else if (strcmp(name,"FractionIncrement")==0) return FractionIncrementEnum;
+@@ -627,11 +628,11 @@
+ 	      else if (strcmp(name,"Step")==0) return StepEnum;
+ 	      else if (strcmp(name,"Time")==0) return TimeEnum;
+ 	      else if (strcmp(name,"WaterColumnOld")==0) return WaterColumnOldEnum;
+-	      else if (strcmp(name,"Outputdefinition")==0) return OutputdefinitionEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"OutputdefinitionList")==0) return OutputdefinitionListEnum;
++	      if (strcmp(name,"Outputdefinition")==0) return OutputdefinitionEnum;
++	      else if (strcmp(name,"OutputdefinitionList")==0) return OutputdefinitionListEnum;
+ 	      else if (strcmp(name,"Massfluxatgate")==0) return MassfluxatgateEnum;
+ 	      else if (strcmp(name,"MassfluxatgateName")==0) return MassfluxatgateNameEnum;
+ 	      else if (strcmp(name,"MassfluxatgateSegments")==0) return MassfluxatgateSegmentsEnum;
+@@ -750,11 +751,11 @@
+ 	      else if (strcmp(name,"BasalforcingsOceanVx")==0) return BasalforcingsOceanVxEnum;
+ 	      else if (strcmp(name,"BasalforcingsOceanVy")==0) return BasalforcingsOceanVyEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsRhoAir")==0) return SurfaceforcingsRhoAirEnum;
+-	      else if (strcmp(name,"SurfaceforcingsAirCoef")==0) return SurfaceforcingsAirCoefEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"SurfaceforcingsAirLinDragCoef")==0) return SurfaceforcingsAirLinDragCoefEnum;
++	      if (strcmp(name,"SurfaceforcingsAirCoef")==0) return SurfaceforcingsAirCoefEnum;
++	      else if (strcmp(name,"SurfaceforcingsAirLinDragCoef")==0) return SurfaceforcingsAirLinDragCoefEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsAirQuadDragCoef")==0) return SurfaceforcingsAirQuadDragCoefEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsWindVx")==0) return SurfaceforcingsWindVxEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsWindVy")==0) return SurfaceforcingsWindVyEnum;
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 18603)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 18604)
+@@ -28,7 +28,7 @@
+ 	iomodel->FetchDataToInput(elements,InversionVxObsEnum,0.);
+ 	iomodel->FetchDataToInput(elements,InversionVyObsEnum,0.); 
+ 	iomodel->FetchDataToInput(elements,InversionThicknessObsEnum,0.);
+-	//iomodel->FetchDataToInput(elements,InversionSurfaceObsEnum,0.);
++	iomodel->FetchDataToInput(elements,InversionSurfaceObsEnum,0.);
+ 
+ 	iomodel->FetchData(5,InversionControlParametersEnum,InversionCostFunctionsEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum);
+ 
+Index: ../trunk-jpl/src/c/cores/controlvalidation_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/controlvalidation_core.cpp	(revision 18603)
++++ ../trunk-jpl/src/c/cores/controlvalidation_core.cpp	(revision 18604)
+@@ -12,7 +12,7 @@
+ 
+ 	int         solution_type,n;
+ 	int         num_responses;
+-	IssmDouble  j0,j;
++	IssmDouble  j0,j,yts;
+ 	IssmDouble  Ialpha,exponent,alpha;
+ 	IssmDouble* jlist = NULL;
+ 	IssmDouble *G = NULL;
+@@ -27,6 +27,7 @@
+ 	femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
+ 	femmodel->parameters->SetParam(false,SaveResultsEnum);
+ 	femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum);
++	femmodel->parameters->FindParam(&yts,ConstantsYtsEnum);
+ 
+ 	/*Get initial guess*/
+ 	Vector<IssmDouble> *Xpetsc = NULL;
+@@ -63,7 +64,7 @@
+ 	/*Range of tests*/
+ 	IssmDouble exp0 = 0.;
+ 	IssmDouble incr = -0.2;
+-	IssmDouble exp1 = -10.;
++	IssmDouble exp1 = -18.;
+ 	int        num  = reCast<int,IssmDouble>((exp1-exp0)/incr);
+ 
+ 	/*Allocate output*/
+@@ -87,7 +88,7 @@
+ 		femmodel->CostFunctionx(&j,NULL,NULL);
+ 
+ 		IssmDouble Den = 0.;
+-		for(int i=0;i<n;i++) Den += alpha * G[i] * 1.;
++		for(int i=0;i<n;i++) Den += alpha* G[i] * 1.;
+ 		Ialpha = fabs((j - j0)/Den - 1.);
+ 
+ 		_printf0_(" " << setw(11) << setprecision (5)<<alpha<<" " << setw(11) << setprecision (5)<<Ialpha<<"\n");
+Index: ../trunk-jpl/src/c/cores/balancevelocity_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/balancevelocity_core.cpp	(revision 18603)
++++ ../trunk-jpl/src/c/cores/balancevelocity_core.cpp	(revision 18604)
+@@ -17,7 +17,8 @@
+ 	/*recover parameters: */
+ 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+ 
+-	if(VerboseSolution()) _printf0_("computing smoothed slopes:\n");
++	if(VerboseSolution()) _printf0_("computing smooth driving stress:\n");
++	femmodel->parameters->SetParam(8.,SmoothThicknessMultiplierEnum);
+ 	femmodel->SetCurrentConfiguration(SmoothAnalysisEnum);
+ 	femmodel->parameters->SetParam(DrivingStressXEnum,InputToSmoothEnum);
+ 	solutionsequence_linear(femmodel);
+Index: ../trunk-jpl/src/c/cores/balancethickness2_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/balancethickness2_core.cpp	(revision 18603)
++++ ../trunk-jpl/src/c/cores/balancethickness2_core.cpp	(revision 18604)
+@@ -14,20 +14,28 @@
+ 	/*parameters: */
+ 	bool save_results;
+ 
+-	/*activate formulation: */
+-	femmodel->SetCurrentConfiguration(Balancethickness2AnalysisEnum);
+-
+ 	/*recover parameters: */
+ 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+ 
++	if(VerboseSolution()) _printf0_("computing smooth surface slopes:\n");
++	femmodel->parameters->SetParam(8.,SmoothThicknessMultiplierEnum);
++	femmodel->SetCurrentConfiguration(SmoothAnalysisEnum);
++	femmodel->parameters->SetParam(SurfaceSlopeXEnum,InputToSmoothEnum);
++	solutionsequence_linear(femmodel);
++	femmodel->parameters->SetParam(SurfaceSlopeYEnum,InputToSmoothEnum);
++	solutionsequence_linear(femmodel);
++
+ 	if(VerboseSolution()) _printf0_("call computational core:\n");
++	femmodel->SetCurrentConfiguration(Balancethickness2AnalysisEnum);
+ 	solutionsequence_linear(femmodel);
+ 	//solutionsequence_nonlinear(femmodel,false);
+ 
+ 	if(save_results){
+ 		if(VerboseSolution()) _printf0_("   saving results\n");
+-		const int numoutputs = 4;
+-		int outputs[numoutputs] = {SurfaceEnum,VxEnum,VyEnum,VelEnum};
++		const int numoutputs = 6;
++		int outputs[numoutputs] = {SurfaceEnum,SurfaceSlopeXEnum,SurfaceSlopeYEnum,VxEnum,VyEnum,VelEnum};
++		//const int numoutputs = 4;
++		//int outputs[numoutputs] = {SurfaceEnum,VxEnum,VyEnum,VelEnum};
+ 		femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],numoutputs);
+ 	}
+ 
+Index: ../trunk-jpl/src/m/enum/SmoothedSurfaceSlopeXAnalysisEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SmoothedSurfaceSlopeXAnalysisEnum.m	(revision 18603)
++++ ../trunk-jpl/src/m/enum/SmoothedSurfaceSlopeXAnalysisEnum.m	(revision 18604)
+@@ -1,11 +0,0 @@
+-function macro=SmoothedSurfaceSlopeXAnalysisEnum()
+-%SMOOTHEDSURFACESLOPEXANALYSISENUM - Enum of SmoothedSurfaceSlopeXAnalysis
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SmoothedSurfaceSlopeXAnalysisEnum()
+-
+-macro=StringToEnum('SmoothedSurfaceSlopeXAnalysis');
+Index: ../trunk-jpl/src/m/enum/SmoothedSurfaceSlopeYAnalysisEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SmoothedSurfaceSlopeYAnalysisEnum.m	(revision 18603)
++++ ../trunk-jpl/src/m/enum/SmoothedSurfaceSlopeYAnalysisEnum.m	(revision 18604)
+@@ -1,11 +0,0 @@
+-function macro=SmoothedSurfaceSlopeYAnalysisEnum()
+-%SMOOTHEDSURFACESLOPEYANALYSISENUM - Enum of SmoothedSurfaceSlopeYAnalysis
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SmoothedSurfaceSlopeYAnalysisEnum()
+-
+-macro=StringToEnum('SmoothedSurfaceSlopeYAnalysis');
+Index: ../trunk-jpl/src/m/enum/SmoothThicknessMultiplierEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SmoothThicknessMultiplierEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SmoothThicknessMultiplierEnum.m	(revision 18604)
+@@ -0,0 +1,11 @@
++function macro=SmoothThicknessMultiplierEnum()
++%SMOOTHTHICKNESSMULTIPLIERENUM - Enum of SmoothThicknessMultiplier
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SmoothThicknessMultiplierEnum()
++
++macro=StringToEnum('SmoothThicknessMultiplier');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18603)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18604)
+@@ -438,6 +438,7 @@
+ def InputToL2ProjectEnum(): return StringToEnum("InputToL2Project")[0]
+ def InputToDepthaverageEnum(): return StringToEnum("InputToDepthaverage")[0]
+ def InputToSmoothEnum(): return StringToEnum("InputToSmooth")[0]
++def SmoothThicknessMultiplierEnum(): return StringToEnum("SmoothThicknessMultiplier")[0]
+ def IntParamEnum(): return StringToEnum("IntParam")[0]
+ def IntVecParamEnum(): return StringToEnum("IntVecParam")[0]
+ def TransientParamEnum(): return StringToEnum("TransientParam")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18604-18605.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18604-18605.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18604-18605.diff	(revision 19102)
@@ -0,0 +1,121 @@
+Index: ../trunk-jpl/src/m/classes/inversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversion.m	(revision 18604)
++++ ../trunk-jpl/src/m/classes/inversion.m	(revision 18605)
+@@ -22,6 +22,7 @@
+ 		vz_obs                      = NaN
+ 		vel_obs                     = NaN
+ 		thickness_obs               = NaN
++		surface_obs                 = NaN
+ 	end
+ 	methods
+ 		function createxml(obj,fid) % {{{
+@@ -132,7 +133,7 @@
+ 			md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0 1]);
+ 			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',...
+ 				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'DamageDbar' 'Vx' 'Vy' 'Thickness',...
+-				'BalancethicknessNu' 'BalancethicknessApparentMassbalance'});
++				'BalancethicknessOmega' 'BalancethicknessApparentMassbalance'});
+ 			md = checkfield(md,'fieldname','inversion.nsteps','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.maxiter_per_step','size',[md.inversion.nsteps 1],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.step_threshold','size',[md.inversion.nsteps 1]);
+@@ -176,6 +177,7 @@
+ 			fielddisplay(obj,'vy_obs','observed velocity y component [m/yr]');
+ 			fielddisplay(obj,'vel_obs','observed velocity magnitude [m/yr]');
+ 			fielddisplay(obj,'thickness_obs','observed thickness [m]');
++			fielddisplay(obj,'surface_obs','observed surface elevation [m]');
+ 			disp('Available cost functions:');
+ 			disp('   101: SurfaceAbsVelMisfit');
+ 			disp('   102: SurfaceRelVelMisfit');
+@@ -212,6 +214,7 @@
+ 				mattype=1;
+ 			end
+ 			WriteData(fid,'object',obj,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',mattype);
++			WriteData(fid,'object',obj,'class','inversion','fieldname','surface_obs','format','DoubleMat','mattype',mattype);
+ 
+ 
+ 			%process control parameters
+@@ -238,6 +241,7 @@
+ 			pos=find(obj.cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
+ 			pos=find(obj.cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
+ 			pos=find(obj.cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
++			pos=find(obj.cost_functions==601); data(pos)=SurfaceAbsMisfitEnum();
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/initialization.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/initialization.py	(revision 18604)
++++ ../trunk-jpl/src/m/classes/initialization.py	(revision 18605)
+@@ -78,15 +78,13 @@
+ 			md = checkfield(md,'fieldname','initialization.watercolumn','NaN',1,'size',[md.mesh.numberofvertices])
+ 		if HydrologyDCInefficientAnalysisEnum() in analyses:
+ 			if hasattr(md.hydrology,'hydrologydc'):
+-				md = checkfield(md,'fieldname','initialization.sediment_head','NaN',1,'size',[md.mesh.numberofvertices 1])
++				md = checkfield(md,'fieldname','initialization.sediment_head','NaN',1,'size',[md.mesh.numberofvertices,1])
+ 		if HydrologyDCEfficientAnalysisEnum() in analyses:
+ 			if hasattr(md.hydrology,'hydrologydc'):
+ 				if md.hydrology.isefficientlayer==1:
+-					md = checkfield(md,'fieldname','initialization.epl_head','NaN',1,'size',[md.mesh.numberofvertices 1])
+-					md = checkfield(md,'fieldname','initialization.epl_thickness','NaN',1,'size',[md.mesh.numberofvertices 1])
+-				
++					md = checkfield(md,'fieldname','initialization.epl_head','NaN',1,'size',[md.mesh.numberofvertices,1])
++					md = checkfield(md,'fieldname','initialization.epl_thickness','NaN',1,'size',[md.mesh.numberofvertices,1])
+ 
+-
+ 		return md
+ 	# }}}
+ 	def marshall(self,md,fid):    # {{{
+@@ -101,8 +99,8 @@
+ 		WriteData(fid,'data',self.waterfraction,'format','DoubleMat','mattype',1,'enum',WaterfractionEnum())
+ 		WriteData(fid,'data',self.watercolumn,'format','DoubleMat','mattype',1,'enum',WatercolumnEnum())
+ 		WriteData(fid,'data',self.sediment_head,'format','DoubleMat','mattype',1,'enum',SedimentHeadEnum())
+-		WriteData(fid,'data',self.epl_head,'format','DoubleMat','mattype',1,'enum',EplHeadEnum);
+-		WriteData(fid,'data',self.epl_thickness,'format','DoubleMat','mattype',1,'enum',HydrologydcEplThicknessEnum);
++		WriteData(fid,'data',self.epl_head,'format','DoubleMat','mattype',1,'enum',EplHeadEnum())
++		WriteData(fid,'data',self.epl_thickness,'format','DoubleMat','mattype',1,'enum',HydrologydcEplThicknessEnum())
+ 
+ 		
+ 		if md.thermal.isenthalpy:
+Index: ../trunk-jpl/src/m/classes/model.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.py	(revision 18604)
++++ ../trunk-jpl/src/m/classes/model.py	(revision 18605)
+@@ -659,15 +659,15 @@
+ 		md.stressbalance.loadingforce=project3d(md,'vector',md.stressbalance.loadingforce,'type','node')
+ 		md.masstransport.calvingrate=project3d(md,'vector',md.masstransport.calvingrate,'type','node')
+ 
+-                # Hydrologydc variables
+-                if hasattr(md.hydrology,'hydrologydc'):
+-                        md.hydrology.spcsediment_head=project3d(md,'vector',md.hydrology.spcsediment_head,'type','node','layer',1)
+-                        md.hydrology.spcepl_head=project3d(md,'vector',md.hydrology.spcepl_head,'type','node','layer',1)
+-                        md.hydrology.mask_eplactive_node=project3d(md,'vector',md.hydrology.mask_eplactive_node,'type','node','layer',1)
+-                        md.hydrology.sediment_transmitivity=project3d(md,'vector',md.hydrology.sediment_transmitivity,'type','node','layer',1)
+-                        md.hydrology.basal_moulin_input=project3d(md,'vector',md.hydrology.basal_moulin_input,'type','node','layer',1)
+-                if md.hydrology.isefficientlayer==1 :
+-                        md.hydrology.spcepl_head=project3d(md,'vector',md.hydrology.spcepl_head,'type','node','layer',1)
++		# Hydrologydc variables
++		if hasattr(md.hydrology,'hydrologydc'):
++			md.hydrology.spcsediment_head=project3d(md,'vector',md.hydrology.spcsediment_head,'type','node','layer',1)
++			md.hydrology.spcepl_head=project3d(md,'vector',md.hydrology.spcepl_head,'type','node','layer',1)
++			md.hydrology.mask_eplactive_node=project3d(md,'vector',md.hydrology.mask_eplactive_node,'type','node','layer',1)
++			md.hydrology.sediment_transmitivity=project3d(md,'vector',md.hydrology.sediment_transmitivity,'type','node','layer',1)
++			md.hydrology.basal_moulin_input=project3d(md,'vector',md.hydrology.basal_moulin_input,'type','node','layer',1)
++			if md.hydrology.isefficientlayer==1 :
++				md.hydrology.spcepl_head=project3d(md,'vector',md.hydrology.spcepl_head,'type','node','layer',1)
+ 
+ 		#connectivity
+ 		md.mesh.elementconnectivity=numpy.tile(md.mesh.elementconnectivity,(numlayers-1,1))
+Index: ../trunk-jpl/src/m/classes/inversionvalidation.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 18604)
++++ ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 18605)
+@@ -17,7 +17,7 @@
+ 		vz_obs                      = NaN
+ 		vel_obs                     = NaN
+ 		thickness_obs               = NaN
+-		surface_obs               = NaN
++		surface_obs                 = NaN
+ 	end
+ 	methods
+ 		function obj = inversionvalidation(varargin) % {{{
Index: /issm/oecreview/Archive/18296-19100/ISSM-18605-18606.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18605-18606.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18605-18606.diff	(revision 19102)
@@ -0,0 +1,26 @@
+Index: ../trunk-jpl/src/c/cores/balancevelocity_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/balancevelocity_core.cpp	(revision 18605)
++++ ../trunk-jpl/src/c/cores/balancevelocity_core.cpp	(revision 18606)
+@@ -18,7 +18,7 @@
+ 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+ 
+ 	if(VerboseSolution()) _printf0_("computing smooth driving stress:\n");
+-	femmodel->parameters->SetParam(8.,SmoothThicknessMultiplierEnum);
++	femmodel->parameters->SetParam(IssmPDouble(8.),SmoothThicknessMultiplierEnum);
+ 	femmodel->SetCurrentConfiguration(SmoothAnalysisEnum);
+ 	femmodel->parameters->SetParam(DrivingStressXEnum,InputToSmoothEnum);
+ 	solutionsequence_linear(femmodel);
+Index: ../trunk-jpl/src/c/cores/balancethickness2_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/balancethickness2_core.cpp	(revision 18605)
++++ ../trunk-jpl/src/c/cores/balancethickness2_core.cpp	(revision 18606)
+@@ -18,7 +18,7 @@
+ 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+ 
+ 	if(VerboseSolution()) _printf0_("computing smooth surface slopes:\n");
+-	femmodel->parameters->SetParam(8.,SmoothThicknessMultiplierEnum);
++	femmodel->parameters->SetParam(IssmPDouble(8.),SmoothThicknessMultiplierEnum);
+ 	femmodel->SetCurrentConfiguration(SmoothAnalysisEnum);
+ 	femmodel->parameters->SetParam(SurfaceSlopeXEnum,InputToSmoothEnum);
+ 	solutionsequence_linear(femmodel);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18606-18607.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18606-18607.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18606-18607.diff	(revision 19102)
@@ -0,0 +1,42 @@
+Index: ../trunk-jpl/src/c/cores/balancevelocity_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/balancevelocity_core.cpp	(revision 18606)
++++ ../trunk-jpl/src/c/cores/balancevelocity_core.cpp	(revision 18607)
+@@ -12,13 +12,14 @@
+ void balancevelocity_core(FemModel* femmodel){
+ 
+ 	/*parameters: */
+-	bool save_results;
++	bool        save_results;
++	IssmPDouble l = 8.;
+ 
+ 	/*recover parameters: */
+ 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+ 
+ 	if(VerboseSolution()) _printf0_("computing smooth driving stress:\n");
+-	femmodel->parameters->SetParam(IssmPDouble(8.),SmoothThicknessMultiplierEnum);
++	femmodel->parameters->SetParam(l,SmoothThicknessMultiplierEnum);
+ 	femmodel->SetCurrentConfiguration(SmoothAnalysisEnum);
+ 	femmodel->parameters->SetParam(DrivingStressXEnum,InputToSmoothEnum);
+ 	solutionsequence_linear(femmodel);
+Index: ../trunk-jpl/src/c/cores/balancethickness2_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/balancethickness2_core.cpp	(revision 18606)
++++ ../trunk-jpl/src/c/cores/balancethickness2_core.cpp	(revision 18607)
+@@ -12,13 +12,14 @@
+ void balancethickness2_core(FemModel* femmodel){
+ 
+ 	/*parameters: */
+-	bool save_results;
++	bool        save_results;
++	IssmPDouble l = 8.;
+ 
+ 	/*recover parameters: */
+ 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+ 
+ 	if(VerboseSolution()) _printf0_("computing smooth surface slopes:\n");
+-	femmodel->parameters->SetParam(IssmPDouble(8.),SmoothThicknessMultiplierEnum);
++	femmodel->parameters->SetParam(l,SmoothThicknessMultiplierEnum);
+ 	femmodel->SetCurrentConfiguration(SmoothAnalysisEnum);
+ 	femmodel->parameters->SetParam(SurfaceSlopeXEnum,InputToSmoothEnum);
+ 	solutionsequence_linear(femmodel);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18607-18608.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18607-18608.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18607-18608.diff	(revision 19102)
@@ -0,0 +1,26 @@
+Index: ../trunk-jpl/src/c/cores/balancevelocity_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/balancevelocity_core.cpp	(revision 18607)
++++ ../trunk-jpl/src/c/cores/balancevelocity_core.cpp	(revision 18608)
+@@ -13,7 +13,7 @@
+ 
+ 	/*parameters: */
+ 	bool        save_results;
+-	IssmPDouble l = 8.;
++	IssmDouble  l = 8.;
+ 
+ 	/*recover parameters: */
+ 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+Index: ../trunk-jpl/src/c/cores/balancethickness2_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/balancethickness2_core.cpp	(revision 18607)
++++ ../trunk-jpl/src/c/cores/balancethickness2_core.cpp	(revision 18608)
+@@ -13,7 +13,7 @@
+ 
+ 	/*parameters: */
+ 	bool        save_results;
+-	IssmPDouble l = 8.;
++	IssmDouble  l = 8.;
+ 
+ 	/*recover parameters: */
+ 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18608-18609.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18608-18609.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18608-18609.diff	(revision 19102)
@@ -0,0 +1,28 @@
+Index: ../trunk-jpl/src/m/classes/inversion.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversion.py	(revision 18608)
++++ ../trunk-jpl/src/m/classes/inversion.py	(revision 18609)
+@@ -32,6 +32,7 @@
+ 		self.vz_obs                      = float('NaN')
+ 		self.vel_obs                     = float('NaN')
+ 		self.thickness_obs               = float('NaN')
++		self.surface_obs                 = float('NaN')
+ 
+ 		#set defaults
+ 		self.setdefaultparameters()
+@@ -55,6 +56,7 @@
+ 		string="%s\n%s"%(string,fielddisplay(self,'vy_obs','observed velocity y component [m/yr]'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'vel_obs','observed velocity magnitude [m/yr]'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'thickness_obs','observed thickness [m]'))
++		string="%s\n%s"%(string,fielddisplay(self,'surface_obs','observed surface elevation [m]'))
+ 		string="%s\n%s"%(string,'Available cost functions:')
+ 		string="%s\n%s"%(string,'   101: SurfaceAbsVelMisfit')
+ 		string="%s\n%s"%(string,'   102: SurfaceRelVelMisfit')
+@@ -160,6 +162,7 @@
+ 		WriteData(fid,'object',self,'fieldname','vy_obs','format','DoubleMat','mattype',1,'scale',1./yts)
+ 		WriteData(fid,'object',self,'fieldname','vz_obs','format','DoubleMat','mattype',1,'scale',1./yts)
+ 		WriteData(fid,'object',self,'fieldname','thickness_obs','format','DoubleMat','mattype',1)
++		WriteData(fid,'object',self,'fieldname','surface_obs','format','DoubleMat','mattype',1)
+ 
+ 		#process control parameters
+ 		num_control_parameters=len(self.control_parameters)
Index: /issm/oecreview/Archive/18296-19100/ISSM-18609-18610.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18609-18610.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18609-18610.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/classes/groundingline.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/groundingline.m	(revision 18609)
++++ ../trunk-jpl/src/m/classes/groundingline.m	(revision 18610)
+@@ -57,7 +57,7 @@
+ 		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   grounding line migration parameters:'));
+-			fielddisplay(obj,'migration','type of grounding line migration: ''SoftMigration'',''AggressiveMigration'' or ''None''');
++			fielddisplay(obj,'migration','type of grounding line migration: ''SoftMigration'',''AggressiveMigration'',''SubelementMigration'',''SubelementMigration2'' or ''None''');
+ 
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
Index: /issm/oecreview/Archive/18296-19100/ISSM-18610-18611.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18610-18611.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18610-18611.diff	(revision 19102)
@@ -0,0 +1,128 @@
+Index: ../trunk-jpl/src/m/plot/colormaps/bluewhitered.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/colormaps/bluewhitered.m	(revision 0)
++++ ../trunk-jpl/src/m/plot/colormaps/bluewhitered.m	(revision 18611)
+@@ -0,0 +1,122 @@
++function newmap = bluewhitered(m)
++%BLUEWHITERED   Blue, white, and red color map.
++%   BLUEWHITERED(M) returns an M-by-3 matrix containing a blue to white
++%   to red colormap, with white corresponding to the CAXIS value closest
++%   to zero.  This colormap is most useful for images and surface plots
++%   with positive and negative values.  BLUEWHITERED, by itself, is the
++%   same length as the current colormap.
++%
++%   Examples:
++%   ------------------------------
++%   figure
++%   imagesc(peaks(250));
++%   colormap(bluewhitered(256)), colorbar
++%
++%   figure
++%   imagesc(peaks(250), [0 8])
++%   colormap(bluewhitered), colorbar
++%
++%   figure
++%   imagesc(peaks(250), [-6 0])
++%   colormap(bluewhitered), colorbar
++%
++%   figure
++%   surf(peaks)
++%   colormap(bluewhitered)
++%   axis tight
++%
++%   See also HSV, HOT, COOL, BONE, COPPER, PINK, FLAG, 
++%   COLORMAP, RGBPLOT.
++
++
++if nargin < 1
++   m = size(get(gcf,'colormap'),1);
++end
++
++
++bottom = [0 0 0.5];
++botmiddle = [0 0.5 1];
++middle = [1 1 1];
++topmiddle = [1 0 0];
++top = [0.5 0 0];
++
++% Find middle
++lims = get(gca, 'CLim');
++
++% Find ratio of negative to positive
++if (lims(1) < 0) & (lims(2) > 0)
++    % It has both negative and positive
++    % Find ratio of negative to positive
++    ratio = abs(lims(1)) / (abs(lims(1)) + lims(2));
++    neglen = round(m*ratio);
++    poslen = m - neglen;
++    
++    % Just negative
++    new = [bottom; botmiddle; middle];
++    len = length(new);
++    oldsteps = linspace(0, 1, len);
++    newsteps = linspace(0, 1, neglen);
++    newmap1 = zeros(neglen, 3);
++    
++    for i=1:3
++        % Interpolate over RGB spaces of colormap
++        newmap1(:,i) = min(max(interp1(oldsteps, new(:,i), newsteps)', 0), 1);
++    end
++    
++    % Just positive
++    new = [middle; topmiddle; top];
++    len = length(new);
++    oldsteps = linspace(0, 1, len);
++    newsteps = linspace(0, 1, poslen);
++    newmap = zeros(poslen, 3);
++    
++    for i=1:3
++        % Interpolate over RGB spaces of colormap
++        newmap(:,i) = min(max(interp1(oldsteps, new(:,i), newsteps)', 0), 1);
++    end
++    
++    % And put 'em together
++    newmap = [newmap1; newmap];
++    
++elseif lims(1) >= 0
++    % Just positive
++    new = [middle; topmiddle; top];
++    len = length(new);
++    oldsteps = linspace(0, 1, len);
++    newsteps = linspace(0, 1, m);
++    newmap = zeros(m, 3);
++    
++    for i=1:3
++        % Interpolate over RGB spaces of colormap
++        newmap(:,i) = min(max(interp1(oldsteps, new(:,i), newsteps)', 0), 1);
++    end
++    
++else
++    % Just negative
++    new = [bottom; botmiddle; middle];
++    len = length(new);
++    oldsteps = linspace(0, 1, len);
++    newsteps = linspace(0, 1, m);
++    newmap = zeros(m, 3);
++    
++    for i=1:3
++        % Interpolate over RGB spaces of colormap
++        newmap(:,i) = min(max(interp1(oldsteps, new(:,i), newsteps)', 0), 1);
++    end
++    
++end
++% 
++% m = 64;
++% new = [bottom; botmiddle; middle; topmiddle; top];
++% % x = 1:m;
++% 
++% oldsteps = linspace(0, 1, 5);
++% newsteps = linspace(0, 1, m);
++% newmap = zeros(m, 3);
++% 
++% for i=1:3
++%     % Interpolate over RGB spaces of colormap
++%     newmap(:,i) = min(max(interp1(oldsteps, new(:,i), newsteps)', 0), 1);
++% end
++% 
++% % set(gcf, 'colormap', newmap), colorbar
+\ No newline at end of file
Index: /issm/oecreview/Archive/18296-19100/ISSM-18611-18612.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18611-18612.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18611-18612.diff	(revision 19102)
@@ -0,0 +1,792 @@
+Index: ../trunk-jpl/test/Archives/Archive327.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive437.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive432.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive325.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive805.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive326.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive803.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive436.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive431.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.h	(revision 18611)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.h	(revision 18612)
+@@ -7,6 +7,7 @@
+ 
+ /*Headers*/
+ #include "./Analysis.h"
++#include "../classes/classes.h"
+ 
+ class EnthalpyAnalysis: public Analysis{
+ 
+@@ -40,11 +41,21 @@
+ 
+ 		/*Modules*/
+ 		static void PostProcessing(FemModel* femmodel);
++		static void ComputeBasalMeltingrate(FemModel* femmodel);
+ 		static void ComputeBasalMeltingrate(Element* element);
++		static void DrainWaterfraction(FemModel* femmodel);
+ 		static void DrainWaterfractionIcecolumn(Element* element);
+ 		static void DrainWaterfraction(Element* element, IssmDouble* pdrainrate_element);
++		static void UpdateBasalConstraints(FemModel* femmodel);
+ 		static void UpdateBasalConstraints(Element* element);
++		static void UpdateBasalConstraintsTransient(Element* element);
++		static void UpdateBasalConstraintsSteadystate(Element* element);
++// 		static int GetThermalBasalCondition(Element* element, Gauss* gauss, Gauss* gaussup, int enthalpy_enum);
++// 		static int GetThermalBasalCondition(Element* element, GaussPenta* gauss, GaussPenta* gaussup, int enthalpy_enum);
++		static int GetThermalBasalCondition(Element* element, IssmDouble enthalpy, IssmDouble enthalpy_up, IssmDouble pressure, IssmDouble pressure_up, IssmDouble watercolumn, IssmDouble meltingrate);
++		static IssmDouble GetWetIceConductivity(Element* element, IssmDouble enthalpy, IssmDouble pressure);
+ 
++
+ 		/*Intermediaries*/
+ 		static IssmDouble EnthalpyDiffusionParameter(Element* element,IssmDouble enthalpy,IssmDouble pressure);
+ 		static IssmDouble EnthalpyDiffusionParameterVolume(Element* element,int enthalpy_enum);
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18611)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18612)
+@@ -206,11 +206,10 @@
+ 	/*transfer enthalpy to enthalpy picard for the next step: */
+ 	InputDuplicatex(femmodel,EnthalpyEnum,EnthalpyPicardEnum);
+ 
+-	int solution_type;
+-	femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
+-	if(solution_type!=SteadystateSolutionEnum){
+-		PostProcessing(femmodel);
+-	}
++	IssmDouble dt;
++	femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
++	if(dt==0.) ComputeBasalMeltingrate(femmodel);
++	else PostProcessing(femmodel);
+ 
+ }/*}}}*/
+ ElementVector* EnthalpyAnalysis::CreateDVector(Element* element){/*{{{*/
+@@ -562,8 +561,11 @@
+ 	/* implementation of the basal condition decision chart of Aschwanden 2012, Fig.5 */
+ 	if(!element->IsOnBase() || element->IsFloating()) return NULL;
+ 
+-	IssmDouble  dt,Jdet,enthalpy,pressure,watercolumn,geothermalflux,vx,vy,vz;
+-	IssmDouble  enthalpyup,pressureup,alpha2,scalar,basalfriction,heatflux;
++	int i, state;
++	IssmDouble  dt,Jdet,scalar;
++	IssmDouble	enthalpy, enthalpyup, pressure, pressureup, watercolumn, meltingrate;
++	IssmDouble	vx,vy,vz;
++	IssmDouble  alpha2,basalfriction,geothermalflux,heatflux;
+ 	IssmDouble *xyz_list_base = NULL;
+ 
+ 	/*Fetch number of nodes for this finite element*/
+@@ -579,19 +581,19 @@
+ 	Input* vx_input             = element->GetInput(VxEnum);                          _assert_(vx_input);
+ 	Input* vy_input             = element->GetInput(VyEnum);                          _assert_(vy_input);
+ 	Input* vz_input             = element->GetInput(VzEnum);                          _assert_(vz_input);
+-	Input* enthalpy_input       = element->GetInput(EnthalpyPicardEnum);              _assert_(enthalpy_input);
+-	Input* pressure_input       = element->GetInput(PressureEnum);                    _assert_(pressure_input);
++	Input* enthalpy_input		 = element->GetInput(EnthalpyPicardEnum);					 _assert_(enthalpy_input);
++	Input* pressure_input		 = element->GetInput(PressureEnum);							 _assert_(pressure_input);
++	Input* watercolumn_input	 = element->GetInput(WatercolumnEnum);							 _assert_(watercolumn_input);
++	Input* meltingrate_input	 = element->GetInput(BasalforcingsGroundediceMeltingRateEnum);							 _assert_(meltingrate_input);
+ 	Input* geothermalflux_input = element->GetInput(BasalforcingsGeothermalfluxEnum); _assert_(geothermalflux_input);
+-	Input* watercolumn_input    = element->GetInput(WatercolumnEnum);                 _assert_(watercolumn_input);
+-	IssmDouble  rho_ice             = element->GetMaterialParameter(MaterialsRhoIceEnum);
+-	IssmDouble  heatcapacity        = element->GetMaterialParameter(MaterialsHeatcapacityEnum);
++	IssmDouble  rho_ice			 = element->GetMaterialParameter(MaterialsRhoIceEnum);
+ 
+ 	/*Build friction element, needed later: */
+ 	Friction* friction=new Friction(element,3);
+ 
+ 	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss   = element->NewGaussBase(2);
+-	Gauss* gaussup = element->NewGaussTop(2);
++	GaussPenta* gauss=new GaussPenta(2,2);
++	GaussPenta* gaussup=new GaussPenta(2,2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 		gauss->GaussPoint(ig);
+ 
+@@ -599,40 +601,42 @@
+ 		element->NodalFunctions(basis,gauss);
+ 
+ 		enthalpy_input->GetInputValue(&enthalpy,gauss);
++		enthalpy_input->GetInputValue(&enthalpyup,gaussup);
+ 		pressure_input->GetInputValue(&pressure,gauss);
++		pressure_input->GetInputValue(&pressureup,gaussup);
+ 		watercolumn_input->GetInputValue(&watercolumn,gauss);
++		meltingrate_input->GetInputValue(&meltingrate,gauss);
+ 
+-		if((dt==0.) || ((watercolumn<=0.) && (enthalpy<PureIceEnthalpy(element,pressure)))){
+-			/* the above check is equivalent to 
+-			 NOT [(watercolumn>0.) AND (enthalpy<PIE)] AND (enthalpy<PIE)*/
+-			geothermalflux_input->GetInputValue(&geothermalflux,gauss);
+-
+-			friction->GetAlpha2(&alpha2,gauss);
+-			vx_input->GetInputValue(&vx,gauss);
+-			vy_input->GetInputValue(&vy,gauss);
+-			vz_input->GetInputValue(&vz,gauss);
+-			basalfriction = alpha2*(vx*vx + vy*vy + vz*vz);
+-			heatflux      = (basalfriction+geothermalflux)/(rho_ice);
+-
+-			scalar = gauss->weight*Jdet*heatflux;
+-			if(dt!=0.) scalar=dt*scalar;
+-
+-			for(int i=0;i<numnodes;i++) pe->values[i]+=scalar*basis[i];
++		state=GetThermalBasalCondition(element, enthalpy, enthalpyup, pressure, pressureup, watercolumn, meltingrate);
++		switch (state) {
++			case 0:
++				// cold, dry base: apply basal surface forcing
++				geothermalflux_input->GetInputValue(&geothermalflux,gauss);
++				friction->GetAlpha2(&alpha2,gauss);
++				vx_input->GetInputValue(&vx,gauss);
++				vy_input->GetInputValue(&vy,gauss);
++				vz_input->GetInputValue(&vz,gauss);
++				basalfriction=alpha2*(vx*vx+vy*vy+vz*vz);
++				heatflux=(basalfriction+geothermalflux)/(rho_ice);
++				scalar=gauss->weight*Jdet*heatflux;
++				if(dt!=0.) scalar=dt*scalar;
++				for(i=0;i<numnodes;i++) 
++					pe->values[i]+=scalar*basis[i];
++				break;
++			case 1:
++				// cold, wet base: keep at pressure melting point 
++			case 2:
++				// temperate, thin refreezing base: release spc
++			case 3:
++				// temperate, thin melting base: set spc
++			case 4:
++				// temperate, thick melting base: set grad H*n=0
++				for(i=0;i<numnodes;i++) 
++					pe->values[i]+=0.;
++				break;
++			default:
++				_printf0_("	unknown thermal basal state found!");
+ 		}
+-		else if(enthalpy >= PureIceEnthalpy(element,pressure)){
+-			/* check positive thickness of temperate basal ice layer */
+-			enthalpy_input->GetInputValue(&enthalpyup,gaussup);
+-			pressure_input->GetInputValue(&pressureup,gaussup);
+-			if(enthalpyup >= PureIceEnthalpy(element,pressureup)){
+-				// do nothing, set grad enthalpy*n=0.
+-			}
+-			else{
+-				// only base temperate, set Dirichlet BCs in Penta::UpdateBasalConstraintsEnthalpy()
+-			}
+-		}
+-		else{
+-			// base cold, but watercolumn positive. Set base to pressure melting point enthalpy
+-		}
+ 	}
+ 
+ 	/*Clean up and return*/
+@@ -652,7 +656,7 @@
+ 	/*Get basal element*/
+ 	if(!element->IsOnBase() || !element->IsFloating()) return NULL;
+ 
+-	IssmDouble  h_pmp,dt,Jdet,scalar_ocean,pressure;
++	IssmDouble  Hpmp,dt,Jdet,scalar_ocean,pressure;
+ 	IssmDouble *xyz_list_base = NULL;
+ 
+ 	/*Fetch number of nodes for this finite element*/
+@@ -682,9 +686,9 @@
+ 		element->NodalFunctions(basis,gauss);
+ 
+ 		pressure_input->GetInputValue(&pressure,gauss);
+-		h_pmp=element->PureIceEnthalpy(pressure);
++		Hpmp=element->PureIceEnthalpy(pressure);
+ 
+-		scalar_ocean=gauss->weight*Jdet*rho_water*mixed_layer_capacity*thermal_exchange_vel*h_pmp/(heatcapacity*rho_ice);
++		scalar_ocean=gauss->weight*Jdet*rho_water*mixed_layer_capacity*thermal_exchange_vel*Hpmp/(heatcapacity*rho_ice);
+ 		if(reCast<bool,IssmDouble>(dt)) scalar_ocean=dt*scalar_ocean;
+ 
+ 		for(int i=0;i<numnodes;i++) pe->values[i]+=scalar_ocean*basis[i];
+@@ -886,36 +890,25 @@
+ void EnthalpyAnalysis::PostProcessing(FemModel* femmodel){/*{{{*/
+ 
+ 	/*Intermediaries*/
+-	int solution_type, i;
+ 	bool computebasalmeltingrates=true;
+-	bool isdrainage=true;
+-	bool updatebasalconstraints=true;
++	bool drainicecolumn=true;
++	bool isdynamicbasalspc;
++	IssmDouble dt;
+ 
+-	if(isdrainage){
+-		/*Drain excess water fraction in ice column: */
+-		for(i=0;i<femmodel->elements->Size();i++){
+-			Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-			DrainWaterfractionIcecolumn(element);
+-		}
+-	}
++	femmodel->parameters->FindParam(&isdynamicbasalspc,ThermalIsdynamicbasalspcEnum);
++	femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
+ 
+-	if(computebasalmeltingrates){
+-		/*Compute basal melting rates: */
+-		for(i=0;i<femmodel->elements->Size();i++){
+-			Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-			ComputeBasalMeltingrate(element);
+-		}
+-	}
++	//TODO: use dt to decide what to do
++	if(drainicecolumn)	DrainWaterfraction(femmodel);
++	if(computebasalmeltingrates)	ComputeBasalMeltingrate(femmodel);
++	if(isdynamicbasalspc)	UpdateBasalConstraints(femmodel);
+ 
+-	if(updatebasalconstraints){
+-		/*Update basal dirichlet BCs for enthalpy in transient runs: */
+-		femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
+-		if(solution_type==TransientSolutionEnum){
+-			for(i=0;i<femmodel->elements->Size();i++){
+-				Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-				UpdateBasalConstraints(element);
+-			}
+-		}
++}/*}}}*/
++void EnthalpyAnalysis::ComputeBasalMeltingrate(FemModel* femmodel){/*{{{*/
++	/*Compute basal melting rates: */
++	for(int i=0;i<femmodel->elements->Size();i++){
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		ComputeBasalMeltingrate(element);
+ 	}
+ }/*}}}*/
+ void EnthalpyAnalysis::ComputeBasalMeltingrate(Element* element){/*{{{*/
+@@ -930,145 +923,158 @@
+ 
+ 	/* Intermediaries */
+ 	const int   dim=3;
+-	int         i,is,vertexdown,vertexup,numvertices,numsegments;
+-	IssmDouble  heatflux;
+-	IssmDouble  vec_heatflux[dim],normal_base[dim],d1enthalpy[dim];
+-	IssmDouble  basalfriction,alpha2;
++	int         i,is,state;
++	int			vertexdown,vertexup,numvertices,numsegments;
++	const int	enthalpy_enum=EnthalpyEnum;
++	IssmDouble  vec_heatflux[dim],normal_base[dim],d1enthalpy[dim],d1pressure[dim];
++	IssmDouble  basalfriction,alpha2,geothermalflux,heatflux;
+ 	IssmDouble  dt,yts;
+ 	IssmDouble  melting_overshoot,lambda;
+-	IssmDouble  geothermalflux;
+ 	IssmDouble  vx,vy,vz;
+ 	IssmDouble *xyz_list      = NULL;
+ 	IssmDouble *xyz_list_base = NULL;
+ 	int        *pairindices   = NULL;
+ 
+-	/*Fetch parameters and inputs */
++	/*Fetch parameters*/
+ 	element->GetVerticesCoordinates(&xyz_list);
+ 	element->GetVerticesCoordinatesBase(&xyz_list_base);
+ 	IssmDouble latentheat = element->GetMaterialParameter(MaterialsLatentheatEnum);
+ 	IssmDouble rho_ice    = element->GetMaterialParameter(MaterialsRhoIceEnum);
+ 	IssmDouble rho_water  = element->GetMaterialParameter(MaterialsRhoFreshwaterEnum);
+-	Input* enthalpy_input         = element->GetInput(EnthalpyEnum);                    _assert_(enthalpy_input);
++	IssmDouble beta		 = element->GetMaterialParameter(MaterialsBetaEnum);
++	IssmDouble kappa		 = EnthalpyDiffusionParameterVolume(element,EnthalpyEnum);     _assert_(kappa>=0.);
++	IssmDouble kappa_mix;
++
++	/*retrieve inputs*/
++	Input* enthalpy_input         = element->GetInput(enthalpy_enum);                    _assert_(enthalpy_input);
++	Input* pressure_input			= element->GetInput(PressureEnum);							 _assert_(pressure_input);
+ 	Input* geothermalflux_input   = element->GetInput(BasalforcingsGeothermalfluxEnum); _assert_(geothermalflux_input);
+ 	Input* vx_input               = element->GetInput(VxEnum);                          _assert_(vx_input);
+ 	Input* vy_input               = element->GetInput(VyEnum);                          _assert_(vy_input);
+ 	Input* vz_input               = element->GetInput(VzEnum);                          _assert_(vz_input);
+-	IssmDouble kappa=EnthalpyDiffusionParameterVolume(element,EnthalpyEnum);     _assert_(kappa>=0.);
++
++	/*Build friction element, needed later: */
++	Friction* friction=new Friction(element,dim);
++
++	/******** MELTING RATES  ************************************//*{{{*/
+ 	element->NormalBase(&normal_base[0],xyz_list_base);
+ 	element->VerticalSegmentIndices(&pairindices,&numsegments);
+ 	IssmDouble* meltingrate_enthalpy = xNew<IssmDouble>(numsegments);
+ 	IssmDouble* heating = xNew<IssmDouble>(numsegments);	
+ 
+-	/*Build friction element, needed later: */
+-	Friction* friction=new Friction(element,dim);
+-
+-	/******** MELTING RATES  ************************************/
+ 	numvertices=element->GetNumberOfVertices();
+-	IssmDouble* enthalpy = xNew<IssmDouble>(numvertices);
+-	IssmDouble* pressure = xNew<IssmDouble>(numvertices);
+-	IssmDouble* watercolumn = xNew<IssmDouble>(numvertices);
+-	IssmDouble* basalmeltingrate = xNew<IssmDouble>(numvertices);
+-	element->GetInputListOnVertices(enthalpy,EnthalpyEnum);
+-	element->GetInputListOnVertices(pressure,PressureEnum);
+-	element->GetInputListOnVertices(watercolumn,WatercolumnEnum);
+-	element->GetInputListOnVertices(basalmeltingrate,BasalforcingsGroundediceMeltingRateEnum);
++	IssmDouble* enthalpies = xNew<IssmDouble>(numvertices);
++	IssmDouble* pressures = xNew<IssmDouble>(numvertices);
++	IssmDouble* watercolumns = xNew<IssmDouble>(numvertices);
++	IssmDouble* basalmeltingrates = xNew<IssmDouble>(numvertices);
++	element->GetInputListOnVertices(enthalpies,enthalpy_enum);
++	element->GetInputListOnVertices(pressures,PressureEnum);
++	element->GetInputListOnVertices(watercolumns,WatercolumnEnum);
++	element->GetInputListOnVertices(basalmeltingrates,BasalforcingsGroundediceMeltingRateEnum);
+ 
+ 	Gauss* gauss=element->NewGauss();
+-	
+-	for(int is=0;is<numsegments;is++){
++	for(is=0;is<numsegments;is++){
+ 		vertexdown = pairindices[is*2+0];
+ 		vertexup   = pairindices[is*2+1];
+ 		gauss->GaussVertex(vertexdown);
+-		
+-		bool checkpositivethickness=true;
+-		_assert_(watercolumn[vertexdown]>=0.);
+ 
+-		/*Calculate basal meltingrate after Fig.5 of A.Aschwanden 2012*/
+-		meltingrate_enthalpy[is]=0.;
+-		heating[is]=0.;
+-		if((watercolumn[vertexdown]>0.) && (enthalpy[vertexdown]<PureIceEnthalpy(element,pressure[vertexdown]))){
+-			/*ensure that no ice is at T<Tm(p), if water layer present*/
+-			enthalpy[vertexdown]=element->PureIceEnthalpy(pressure[vertexdown]); 
+-		}
+-		else if(enthalpy[vertexdown]<element->PureIceEnthalpy(pressure[vertexdown])){
+-			/*cold base: set q*n=q_geo*n+frictionheating as Neumann BC in Penta::CreatePVectorEnthalpySheet*/
+-			checkpositivethickness=false; // cold base, skip next test
+-		}
+-		else{/*we have a temperate base, go to next test*/}
++		state=GetThermalBasalCondition(element, enthalpies[vertexdown], enthalpies[vertexup], pressures[vertexdown], pressures[vertexup], watercolumns[vertexdown], basalmeltingrates[vertexdown]);
++		switch (state) {
++			case 0:
++				// cold, dry base: apply basal surface forcing
++				for(i=0;i<3;i++) vec_heatflux[i]=0.;
++				break;
++			case 1:
++				// cold, wet base: keep at pressure melting point 
++			case 2:
++				// temperate, thin refreezing base: release spc
+ 
+-		if(checkpositivethickness){
+-			/*From here on all basal ice is temperate. Check for positive thickness of layer of temperate ice. */
+-			bool istemperatelayer=false;
+-			if(enthalpy[vertexup]>=element->PureIceEnthalpy(pressure[vertexup])) istemperatelayer=true;
+-			if(istemperatelayer) for(i=0;i<dim;i++) vec_heatflux[i]=0.; // TODO: add -k*nabla T_pmp
+-			else{
++			case 3:
++				// temperate, thin melting base: set spc
++				// enthalpies[vertexdown]=element->PureIceEnthalpy(pressures[vertexdown]); 
+ 				enthalpy_input->GetInputDerivativeValue(&d1enthalpy[0],xyz_list,gauss);
+ 				for(i=0;i<3;i++) vec_heatflux[i]=-kappa*d1enthalpy[i];
+-			}
+-
++				break;
++			case 4:
++				// temperate, thick melting base: set grad H*n=0
++				kappa_mix=GetWetIceConductivity(element, enthalpies[vertexdown], pressures[vertexdown]);
++				pressure_input->GetInputDerivativeValue(&d1pressure[0],xyz_list,gauss);
++				for(i=0;i<3;i++) vec_heatflux[i]=kappa_mix*beta*d1pressure[i];
++				break;
++			default:
++				_printf0_("	unknown thermal basal state found!");
++		}
++		if(state==0) meltingrate_enthalpy[is]=0.;
++		else{
+ 			/*heat flux along normal*/
+ 			heatflux=0.;
+ 			for(i=0;i<3;i++) heatflux+=(vec_heatflux[i])*normal_base[i];
+ 
+ 			/*basal friction*/
+ 			friction->GetAlpha2(&alpha2,gauss);
+-			vx_input->GetInputValue(&vx,gauss);
+-			vy_input->GetInputValue(&vy,gauss);
+-			vz_input->GetInputValue(&vz,gauss);
++			vx_input->GetInputValue(&vx,gauss);		vy_input->GetInputValue(&vy,gauss);		vz_input->GetInputValue(&vz,gauss);
+ 			basalfriction=alpha2*(vx*vx + vy*vy + vz*vz);
+-
+ 			geothermalflux_input->GetInputValue(&geothermalflux,gauss);
+ 			/* -Mb= Fb-(q-q_geo)/((1-w)*L*rho), and (1-w)*rho=rho_ice, cf Aschwanden 2012, eqs.1, 2, 66*/
+ 			heating[is]=(heatflux+basalfriction+geothermalflux);
+ 			meltingrate_enthalpy[is]=heating[is]/(latentheat*rho_ice); // m/s water equivalent
+ 		}
+-	}
+-	/******** UPDATE MELTINGRATES AND WATERCOLUMN **************/
++	}/*}}}*/
++
++	/******** UPDATE MELTINGRATES AND WATERCOLUMN **************//*{{{*/
+ 	element->FindParam(&dt,TimesteppingTimeStepEnum);
++	element->FindParam(&yts, ConstantsYtsEnum);
+ 	for(is=0;is<numsegments;is++){
+ 		vertexdown = pairindices[is*2+0];
+ 		vertexup   = pairindices[is*2+1];
+ 		if(dt!=0.){
+-			if(watercolumn[vertexdown]+meltingrate_enthalpy[is]*dt<0.){	// prevent too much freeze on			
+-				lambda = -watercolumn[vertexdown]/(dt*meltingrate_enthalpy[is]); _assert_(lambda>=0.); _assert_(lambda<1.);
+-				watercolumn[vertexdown]=0.;
+-				basalmeltingrate[vertexdown]=lambda*meltingrate_enthalpy[is]; // restrict freeze on only to size of watercolumn
+-				enthalpy[vertexdown]+=(1.-lambda)*meltingrate_enthalpy[is]*dt*latentheat; // use rest of energy to cool down base
++			if(watercolumns[vertexdown]+meltingrate_enthalpy[is]*dt<0.){	// prevent too much freeze on			
++				lambda = -watercolumns[vertexdown]/(dt*meltingrate_enthalpy[is]); _assert_(lambda>=0.); _assert_(lambda<1.);
++				watercolumns[vertexdown]=0.;
++				basalmeltingrates[vertexdown]=lambda*meltingrate_enthalpy[is]; // restrict freeze on only to size of watercolumn
++				enthalpies[vertexdown]+=(1.-lambda)*dt/yts*meltingrate_enthalpy[is]*latentheat*rho_ice; // use rest of energy to cool down base: dE=L*m, m=(1-lambda)*meltingrate*rho_ice
+ 			}
+ 			else{
+-				basalmeltingrate[vertexdown]=meltingrate_enthalpy[is];
+-				watercolumn[vertexdown]+=dt*meltingrate_enthalpy[is]; 
++				basalmeltingrates[vertexdown]=meltingrate_enthalpy[is];
++				watercolumns[vertexdown]+=dt*meltingrate_enthalpy[is]; 
+ 			}
+ 		}
+ 		else{
+-			basalmeltingrate[vertexdown]=meltingrate_enthalpy[is];
+-			if(watercolumn[vertexdown]+meltingrate_enthalpy[is]<0.)
+-				watercolumn[vertexdown]=0.;
++			basalmeltingrates[vertexdown]=meltingrate_enthalpy[is];
++			if(watercolumns[vertexdown]+meltingrate_enthalpy[is]<0.)
++				watercolumns[vertexdown]=0.;
+ 			else
+-				watercolumn[vertexdown]+=meltingrate_enthalpy[is];
++				watercolumns[vertexdown]+=meltingrate_enthalpy[is];
+ 		}	
+-		basalmeltingrate[vertexdown]*=rho_water/rho_ice; // convert meltingrate from water to ice equivalent
+-		_assert_(watercolumn[vertexdown]>=0.);
+-	}
++		basalmeltingrates[vertexdown]*=rho_water/rho_ice; // convert meltingrate from water to ice equivalent
++		_assert_(watercolumns[vertexdown]>=0.);
++	}/*}}}*/
+ 
+ 	/*feed updated variables back into model*/
+-	element->AddInput(EnthalpyEnum,enthalpy,P1Enum);
+-	element->AddInput(WatercolumnEnum,watercolumn,P1Enum);
+-	element->AddInput(BasalforcingsGroundediceMeltingRateEnum,basalmeltingrate,P1Enum);
++	element->AddInput(EnthalpyEnum,enthalpies,P1Enum); //TODO: distinguis for steadystate and transient run
++	element->AddInput(WatercolumnEnum,watercolumns,P1Enum);
++	element->AddInput(BasalforcingsGroundediceMeltingRateEnum,basalmeltingrates,P1Enum);
+ 
+ 	/*Clean up and return*/
+ 	delete gauss;
+ 	delete friction;
+ 	xDelete<int>(pairindices);
+-	xDelete<IssmDouble>(enthalpy);
+-	xDelete<IssmDouble>(pressure);
+-	xDelete<IssmDouble>(watercolumn);
+-	xDelete<IssmDouble>(basalmeltingrate);
++	xDelete<IssmDouble>(enthalpies);
++	xDelete<IssmDouble>(pressures);
++	xDelete<IssmDouble>(watercolumns);
++	xDelete<IssmDouble>(basalmeltingrates);
+ 	xDelete<IssmDouble>(meltingrate_enthalpy);
+ 	xDelete<IssmDouble>(heating);
+ 	xDelete<IssmDouble>(xyz_list);
+ 	xDelete<IssmDouble>(xyz_list_base);
+ }/*}}}*/
++void EnthalpyAnalysis::DrainWaterfraction(FemModel* femmodel){/*{{{*/
++	/*Drain excess water fraction in ice column: */
++	for(int i=0;i<femmodel->elements->Size();i++){
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		DrainWaterfractionIcecolumn(element);
++	}
++}/*}}}*/
+ void EnthalpyAnalysis::DrainWaterfractionIcecolumn(Element* element){/*{{{*/
+ 
+ 	/* Check if ice in element */
+@@ -1172,6 +1178,13 @@
+ 	xDelete<IssmDouble>(waterfractions);
+ 	xDelete<IssmDouble>(deltawaterfractions);
+ }/*}}}*/
++void EnthalpyAnalysis::UpdateBasalConstraints(FemModel* femmodel){/*{{{*/
++	/*Update basal dirichlet BCs for enthalpy: */
++	for(int i=0;i<femmodel->elements->Size();i++){
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		UpdateBasalConstraints(element);
++	}
++}/*}}}*/
+ void EnthalpyAnalysis::UpdateBasalConstraints(Element* element){/*{{{*/
+ 
+ 	/* Check if ice in element */
+@@ -1181,58 +1194,182 @@
+ 	if(!(element->IsOnBase()) || element->IsFloating()) return;
+ 
+ 	/*Intermediary*/
++	bool        isdynamicbasalspc;
++	IssmDouble	dt;
++
++	/*Check wether dynamic basal boundary conditions are activated */
++	element->FindParam(&isdynamicbasalspc,ThermalIsdynamicbasalspcEnum);
++	if(!isdynamicbasalspc) return;
++
++	element->FindParam(&dt,TimesteppingTimeStepEnum);
++	if(dt==0.){
++		UpdateBasalConstraintsSteadystate(element);
++	}
++	else{
++		UpdateBasalConstraintsTransient(element);
++	}
++}/*}}}*/
++void EnthalpyAnalysis::UpdateBasalConstraintsTransient(Element* element){/*{{{*/
++
++	/* Check if ice in element */
++	if(!element->IsIceInElement()) return;
++
++	/* Only update Constraints at the base of grounded ice*/
++	if(!(element->IsOnBase()) || element->IsFloating()) return;
++
++	/*Intermediary*/
+ 	bool        isdynamicbasalspc,setspc;
+-	int         numindices, numindicesup;
+-	IssmDouble  pressure, pressureup;
+-	IssmDouble  h_pmp, enthalpy, enthalpyup;
+-	IssmDouble  watercolumn;
++	int         numindices, numindicesup, state;
+ 	int        *indices = NULL, *indicesup = NULL;
+ 	Node*       node = NULL;
++	IssmDouble	enthalpy, enthalpyup, pressure, pressureup, watercolumn, meltingrate;
+ 
+ 	/*Check wether dynamic basal boundary conditions are activated */
+ 	element->FindParam(&isdynamicbasalspc,ThermalIsdynamicbasalspcEnum);
+ 	if(!isdynamicbasalspc) return;
+ 
++	/*Get parameters and inputs: */
++	Input* enthalpy_input       = element->GetInput(EnthalpyEnum);                    _assert_(enthalpy_input); //TODO: check EnthalpyPicard?
++	Input* pressure_input		 = element->GetInput(PressureEnum);							 _assert_(pressure_input);
++	Input* watercolumn_input	 = element->GetInput(WatercolumnEnum);							 _assert_(watercolumn_input);
++	Input* meltingrate_input	 = element->GetInput(BasalforcingsGroundediceMeltingRateEnum);							 _assert_(meltingrate_input);
++
+ 	/*Fetch indices of basal & surface nodes for this finite element*/
+ 	Penta *penta =  (Penta *) element; // TODO: add Basal-/SurfaceNodeIndices to element.h, and change this to Element*
+ 	penta->BasalNodeIndices(&numindices,&indices,element->GetElementType());
+-	penta->SurfaceNodeIndices(&numindicesup,&indicesup,element->GetElementType());
+-	_assert_(numindices==numindicesup);
++	penta->SurfaceNodeIndices(&numindicesup,&indicesup,element->GetElementType());	_assert_(numindices==numindicesup);
+ 
++	GaussPenta* gauss=new GaussPenta();
++	GaussPenta* gaussup=new GaussPenta();
++
++	for(int i=0;i<numindices;i++){
++		gauss->GaussNode(element->GetElementType(),indices[i]);
++		gaussup->GaussNode(element->GetElementType(),indicesup[i]);
++		
++		enthalpy_input->GetInputValue(&enthalpy,gauss);
++		enthalpy_input->GetInputValue(&enthalpyup,gaussup);
++		pressure_input->GetInputValue(&pressure,gauss);
++		pressure_input->GetInputValue(&pressureup,gaussup);
++		watercolumn_input->GetInputValue(&watercolumn,gauss);
++		meltingrate_input->GetInputValue(&meltingrate,gauss);
++
++		state=GetThermalBasalCondition(element, enthalpy, enthalpyup, pressure, pressureup, watercolumn, meltingrate);
++
++		setspc=false;
++		switch (state) {
++			case 0:
++				// cold, dry base: apply basal surface forcing
++				break;
++			case 1:
++				// cold, wet base: keep at pressure melting point 
++				setspc=true;
++				break;
++			case 2:
++				// temperate, thin refreezing base: release spc
++				break;
++			case 3:
++				// temperate, thin melting base: set spc
++				setspc=true;
++				break;
++			case 4:
++				// temperate, thick melting base: set grad H*n=0
++				break;
++			default:
++				_printf0_("	unknown thermal basal state found!");
++		}
++
++		/*apply or release spc*/
++		node=element->GetNode(indices[i]);
++		if(setspc){
++			pressure_input->GetInputValue(&pressure, gauss);
++			node->ApplyConstraint(0,PureIceEnthalpy(element,pressure));
++		}
++		else			
++			node->DofInFSet(0);
++	}
++
++	/*Free ressources:*/
++	xDelete<int>(indices);
++	xDelete<int>(indicesup);
++	delete gauss;
++	delete gaussup;
++}/*}}}*/
++void EnthalpyAnalysis::UpdateBasalConstraintsSteadystate(Element* element){/*{{{*/
++
++	/* Check if ice in element */
++	if(!element->IsIceInElement()) return;
++
++	/* Only update Constraints at the base of grounded ice*/
++	if(!(element->IsOnBase()) || element->IsFloating()) return;
++
++	/*Intermediary*/
++	bool        isdynamicbasalspc,setspc;
++	int         numindices, numindicesup, state;
++	int        *indices = NULL, *indicesup = NULL;
++	Node*       node = NULL;
++	IssmDouble	enthalpy, enthalpyup, pressure, pressureup, watercolumn, meltingrate;
++
++	/*Check wether dynamic basal boundary conditions are activated */
++	element->FindParam(&isdynamicbasalspc,ThermalIsdynamicbasalspcEnum);
++	if(!isdynamicbasalspc) return;
++
+ 	/*Get parameters and inputs: */
+-	Input* pressure_input=element->GetInput(PressureEnum); _assert_(pressure_input);
+-	Input* enthalpy_input=element->GetInput(EnthalpyEnum); _assert_(enthalpy_input);
+-	Input* watercolumn_input=element->GetInput(WatercolumnEnum); _assert_(watercolumn_input);
++	Input* enthalpy_input		 = element->GetInput(EnthalpyPicardEnum);					 _assert_(enthalpy_input);
++	Input* pressure_input		 = element->GetInput(PressureEnum);							 _assert_(pressure_input);
++	Input* watercolumn_input	 = element->GetInput(WatercolumnEnum);							 _assert_(watercolumn_input);
++	Input* meltingrate_input	 = element->GetInput(BasalforcingsGroundediceMeltingRateEnum);							 _assert_(meltingrate_input);
+ 
+-	/*if there is a temperate layer of zero thickness, set spc enthalpy=h_pmp at that node*/
++	/*Fetch indices of basal & surface nodes for this finite element*/
++	Penta *penta =  (Penta *) element; // TODO: add Basal-/SurfaceNodeIndices to element.h, and change this to Element*
++	penta->BasalNodeIndices(&numindices,&indices,element->GetElementType());
++	penta->SurfaceNodeIndices(&numindicesup,&indicesup,element->GetElementType());	_assert_(numindices==numindicesup);
++
+ 	GaussPenta* gauss=new GaussPenta();
+ 	GaussPenta* gaussup=new GaussPenta();
+ 	for(int i=0;i<numindices;i++){
+ 		gauss->GaussNode(element->GetElementType(),indices[i]);
+ 		gaussup->GaussNode(element->GetElementType(),indicesup[i]);
+ 
+-		/*Check wether there is a temperate layer at the base or not */
+-		/*check if node is temperate, else continue*/
+-		enthalpy_input->GetInputValue(&enthalpy, gauss);
+-		pressure_input->GetInputValue(&pressure, gauss);
++		enthalpy_input->GetInputValue(&enthalpy,gauss);
++		enthalpy_input->GetInputValue(&enthalpyup,gaussup);
++		pressure_input->GetInputValue(&pressure,gauss);
++		pressure_input->GetInputValue(&pressureup,gaussup);
+ 		watercolumn_input->GetInputValue(&watercolumn,gauss);
+-		h_pmp=PureIceEnthalpy(element,pressure);
+-		if (enthalpy>=h_pmp){
+-			/*check if upper node is temperate, too.
+-				if yes, then we have a temperate layer of positive thickness and reset the spc.
+-				if not, apply dirichlet BC.*/
+-			enthalpy_input->GetInputValue(&enthalpyup, gaussup);
+-			pressure_input->GetInputValue(&pressureup, gaussup);
+-			setspc=((enthalpyup<PureIceEnthalpy(element,pressureup)) && (watercolumn>=0.))?true:false;
++		meltingrate_input->GetInputValue(&meltingrate,gauss);
++
++		state=GetThermalBasalCondition(element, enthalpy, enthalpyup, pressure, pressureup, watercolumn, meltingrate);
++		setspc=false;
++		switch (state) {
++			case 0:
++				// cold, dry base: apply basal surface forcing
++				break;
++			case 1:
++				// cold, wet base: keep at pressure melting point 
++				setspc=true;
++				break;
++			case 2:
++				// temperate, thin refreezing base: release spc
++				break;
++			case 3:
++				// temperate, thin melting base: set spc
++				setspc=true;
++				break;
++			case 4:
++				// temperate, thick melting base: s
++				setspc=true;
++				break;
++			default:
++				_printf0_("	unknown thermal basal state found!");
+ 		}
+-		else
+-			setspc = false;
+ 
++		/*apply or release spc*/
+ 		node=element->GetNode(indices[i]);
+-		if(setspc) 
+-			node->ApplyConstraint(0,h_pmp); /*apply spc*/ 
++		if(setspc){
++			pressure_input->GetInputValue(&pressure, gauss);
++			node->ApplyConstraint(0,PureIceEnthalpy(element,pressure));
++		}
+ 		else			
+-			node->DofInFSet(0); /*remove spc*/ 
++			node->DofInFSet(0);
+ 	}
+ 
+ 	/*Free ressources:*/
+@@ -1241,7 +1378,59 @@
+ 	delete gauss;
+ 	delete gaussup;
+ }/*}}}*/
++int EnthalpyAnalysis::GetThermalBasalCondition(Element* element, IssmDouble enthalpy, IssmDouble enthalpyup, IssmDouble pressure, IssmDouble pressureup, IssmDouble watercolumn, IssmDouble meltingrate){/*{{{*/
+ 
++	/* Check if ice in element */
++	if(!element->IsIceInElement()) return -1;
++
++	/* Only update Constraints at the base of grounded ice*/
++	if(!(element->IsOnBase())) return -1;
++
++	/*Intermediary*/
++	int state=-1;
++	IssmDouble	dt;
++
++	/*Get parameters and inputs: */
++	element->FindParam(&dt,TimesteppingTimeStepEnum);
++
++	if(dt==0.){ // steadystate case
++		state=0; //TODO: add consistent steadystate basal condition scheme
++// 		if(enthalpy<PureIceEnthalpy(element,pressure)){ /*is base cold?*/
++// 			if(watercolumn<=0.) state=0; // cold, dry base
++// 			else state=1; // cold, wet base (refreezing)
++// 		}
++// 		else{ /*base is temperate, check if upper node is temperate, too.*/
++// 			if(enthalpyup<PureIceEnthalpy(element,pressureup))
++// 				if(meltingrate<0.)	state=2; // refreezing temperate base (non-physical, only for steadystate solver)
++// 				else						state=3; // melting temperate base with no temperate layer
++// 			else
++// 				state=4; // melting temperate base with temperate layer of positive thickness
++// 		}
++	}
++	else{ // transient case
++		if(enthalpy<PureIceEnthalpy(element,pressure)){
++			if(watercolumn<=0.) state=0; // cold, dry base
++			else state=1; // cold, wet base (refreezing)
++		}
++		else{
++			if(enthalpyup<PureIceEnthalpy(element,pressureup))	state=3; // temperate base, but no temperate layer
++			else state=4; // temperate layer with positive thickness
++		}
++	}
++
++	_assert_(state>=0);
++	return state;
++}/*}}}*/
++IssmDouble EnthalpyAnalysis::GetWetIceConductivity(Element* element, IssmDouble enthalpy, IssmDouble pressure){/*{{{*/
++
++	IssmDouble temperature, waterfraction;
++	IssmDouble kappa_w = 0.6; // thermal conductivity of water (in W/m/K)
++	IssmDouble kappa_i = element->GetMaterialParameter(MaterialsThermalconductivityEnum);
++	element->EnthalpyToThermal(&temperature, &waterfraction, enthalpy, pressure);
++
++	return (1.-waterfraction)*kappa_i + waterfraction*kappa_w;
++}/*}}}*/
++
+ /*Intermediaries*/
+ IssmDouble EnthalpyAnalysis::EnthalpyDiffusionParameter(Element* element,IssmDouble enthalpy,IssmDouble pressure){/*{{{*/
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18612-18613.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18612-18613.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18612-18613.diff	(revision 19102)
@@ -0,0 +1,480 @@
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18612)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18613)
+@@ -64,13 +64,20 @@
+ 
+ 	/*parameters: */
+ 	bool save_results;
++	int  stabilization=1;
+ 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
++	//femmodel->parameters->FindParam(&stabilization,LevelsetStabilizationEnum);
+ 
+ 	/*activate formulation: */
+ 	femmodel->SetCurrentConfiguration(LevelsetAnalysisEnum);
+ 
+ 	if(VerboseSolution()) _printf0_("call computational core:\n");
+-	solutionsequence_linear(femmodel);
++	if(stabilization==4){
++		solutionsequence_fct(femmodel);
++	}
++	else{
++		solutionsequence_linear(femmodel);
++	}
+ 
+ 	if(save_results){
+ 		if(VerboseSolution()) _printf0_("   saving results\n");
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18612)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18613)
+@@ -203,6 +203,7 @@
+ 	DamageEvolutionRequestedOutputsEnum,
+ 	DamageEnum,
+ 	NewDamageEnum,
++	StressIntensityFactorEnum,
+ 	MaterialsRhoIceEnum,
+ 	MaterialsRhoSeawaterEnum,
+ 	MaterialsRhoFreshwaterEnum,
+@@ -399,6 +400,7 @@
+ 	MeshdeformationSolutionEnum,
+ 	MeshdeformationAnalysisEnum,
+ 	LevelsetAnalysisEnum,
++	LevelsetStabilizationEnum,
+ 	ExtrapolationAnalysisEnum,
+ 	LsfReinitializationAnalysisEnum,
+ 	/*}}}*/
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18612)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18613)
+@@ -211,6 +211,7 @@
+ 		case DamageEvolutionRequestedOutputsEnum : return "DamageEvolutionRequestedOutputs";
+ 		case DamageEnum : return "Damage";
+ 		case NewDamageEnum : return "NewDamage";
++		case StressIntensityFactorEnum : return "StressIntensityFactor";
+ 		case MaterialsRhoIceEnum : return "MaterialsRhoIce";
+ 		case MaterialsRhoSeawaterEnum : return "MaterialsRhoSeawater";
+ 		case MaterialsRhoFreshwaterEnum : return "MaterialsRhoFreshwater";
+@@ -402,6 +403,7 @@
+ 		case MeshdeformationSolutionEnum : return "MeshdeformationSolution";
+ 		case MeshdeformationAnalysisEnum : return "MeshdeformationAnalysis";
+ 		case LevelsetAnalysisEnum : return "LevelsetAnalysis";
++		case LevelsetStabilizationEnum : return "LevelsetStabilization";
+ 		case ExtrapolationAnalysisEnum : return "ExtrapolationAnalysis";
+ 		case LsfReinitializationAnalysisEnum : return "LsfReinitializationAnalysis";
+ 		case ApproximationEnum : return "Approximation";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18612)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18613)
+@@ -214,6 +214,7 @@
+ 	      else if (strcmp(name,"DamageEvolutionRequestedOutputs")==0) return DamageEvolutionRequestedOutputsEnum;
+ 	      else if (strcmp(name,"Damage")==0) return DamageEnum;
+ 	      else if (strcmp(name,"NewDamage")==0) return NewDamageEnum;
++	      else if (strcmp(name,"StressIntensityFactor")==0) return StressIntensityFactorEnum;
+ 	      else if (strcmp(name,"MaterialsRhoIce")==0) return MaterialsRhoIceEnum;
+ 	      else if (strcmp(name,"MaterialsRhoSeawater")==0) return MaterialsRhoSeawaterEnum;
+ 	      else if (strcmp(name,"MaterialsRhoFreshwater")==0) return MaterialsRhoFreshwaterEnum;
+@@ -258,11 +259,11 @@
+ 	      else if (strcmp(name,"MasstransportVertexPairing")==0) return MasstransportVertexPairingEnum;
+ 	      else if (strcmp(name,"MasstransportNumRequestedOutputs")==0) return MasstransportNumRequestedOutputsEnum;
+ 	      else if (strcmp(name,"MasstransportRequestedOutputs")==0) return MasstransportRequestedOutputsEnum;
+-	      else if (strcmp(name,"QmuIsdakota")==0) return QmuIsdakotaEnum;
+          else stage=3;
+    }
+    if(stage==3){
+-	      if (strcmp(name,"MassFluxSegments")==0) return MassFluxSegmentsEnum;
++	      if (strcmp(name,"QmuIsdakota")==0) return QmuIsdakotaEnum;
++	      else if (strcmp(name,"MassFluxSegments")==0) return MassFluxSegmentsEnum;
+ 	      else if (strcmp(name,"MassFluxSegmentsPresent")==0) return MassFluxSegmentsPresentEnum;
+ 	      else if (strcmp(name,"QmuMassFluxSegmentsPresent")==0) return QmuMassFluxSegmentsPresentEnum;
+ 	      else if (strcmp(name,"QmuNumberofpartitions")==0) return QmuNumberofpartitionsEnum;
+@@ -381,11 +382,11 @@
+ 	      else if (strcmp(name,"EnthalpyAnalysis")==0) return EnthalpyAnalysisEnum;
+ 	      else if (strcmp(name,"FlaimAnalysis")==0) return FlaimAnalysisEnum;
+ 	      else if (strcmp(name,"FlaimSolution")==0) return FlaimSolutionEnum;
+-	      else if (strcmp(name,"HydrologyShreveAnalysis")==0) return HydrologyShreveAnalysisEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"HydrologyDCInefficientAnalysis")==0) return HydrologyDCInefficientAnalysisEnum;
++	      if (strcmp(name,"HydrologyShreveAnalysis")==0) return HydrologyShreveAnalysisEnum;
++	      else if (strcmp(name,"HydrologyDCInefficientAnalysis")==0) return HydrologyDCInefficientAnalysisEnum;
+ 	      else if (strcmp(name,"HydrologyDCEfficientAnalysis")==0) return HydrologyDCEfficientAnalysisEnum;
+ 	      else if (strcmp(name,"HydrologySolution")==0) return HydrologySolutionEnum;
+ 	      else if (strcmp(name,"MeltingAnalysis")==0) return MeltingAnalysisEnum;
+@@ -411,6 +412,7 @@
+ 	      else if (strcmp(name,"MeshdeformationSolution")==0) return MeshdeformationSolutionEnum;
+ 	      else if (strcmp(name,"MeshdeformationAnalysis")==0) return MeshdeformationAnalysisEnum;
+ 	      else if (strcmp(name,"LevelsetAnalysis")==0) return LevelsetAnalysisEnum;
++	      else if (strcmp(name,"LevelsetStabilization")==0) return LevelsetStabilizationEnum;
+ 	      else if (strcmp(name,"ExtrapolationAnalysis")==0) return ExtrapolationAnalysisEnum;
+ 	      else if (strcmp(name,"LsfReinitializationAnalysis")==0) return LsfReinitializationAnalysisEnum;
+ 	      else if (strcmp(name,"Approximation")==0) return ApproximationEnum;
+@@ -503,12 +505,12 @@
+ 	      else if (strcmp(name,"Adjointx")==0) return AdjointxEnum;
+ 	      else if (strcmp(name,"Adjointy")==0) return AdjointyEnum;
+ 	      else if (strcmp(name,"Adjointz")==0) return AdjointzEnum;
+-	      else if (strcmp(name,"BalancethicknessMisfit")==0) return BalancethicknessMisfitEnum;
+-	      else if (strcmp(name,"BedSlopeX")==0) return BedSlopeXEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"BedSlopeY")==0) return BedSlopeYEnum;
++	      if (strcmp(name,"BalancethicknessMisfit")==0) return BalancethicknessMisfitEnum;
++	      else if (strcmp(name,"BedSlopeX")==0) return BedSlopeXEnum;
++	      else if (strcmp(name,"BedSlopeY")==0) return BedSlopeYEnum;
+ 	      else if (strcmp(name,"Boundary")==0) return BoundaryEnum;
+ 	      else if (strcmp(name,"Converged")==0) return ConvergedEnum;
+ 	      else if (strcmp(name,"Fill")==0) return FillEnum;
+@@ -626,12 +628,12 @@
+ 	      else if (strcmp(name,"J")==0) return JEnum;
+ 	      else if (strcmp(name,"StringExternalResult")==0) return StringExternalResultEnum;
+ 	      else if (strcmp(name,"Step")==0) return StepEnum;
+-	      else if (strcmp(name,"Time")==0) return TimeEnum;
+-	      else if (strcmp(name,"WaterColumnOld")==0) return WaterColumnOldEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"Outputdefinition")==0) return OutputdefinitionEnum;
++	      if (strcmp(name,"Time")==0) return TimeEnum;
++	      else if (strcmp(name,"WaterColumnOld")==0) return WaterColumnOldEnum;
++	      else if (strcmp(name,"Outputdefinition")==0) return OutputdefinitionEnum;
+ 	      else if (strcmp(name,"OutputdefinitionList")==0) return OutputdefinitionListEnum;
+ 	      else if (strcmp(name,"Massfluxatgate")==0) return MassfluxatgateEnum;
+ 	      else if (strcmp(name,"MassfluxatgateName")==0) return MassfluxatgateNameEnum;
+@@ -749,12 +751,12 @@
+ 	      else if (strcmp(name,"BasalforcingsOceanTurningAngle")==0) return BasalforcingsOceanTurningAngleEnum;
+ 	      else if (strcmp(name,"BasalforcingsOceanSsh")==0) return BasalforcingsOceanSshEnum;
+ 	      else if (strcmp(name,"BasalforcingsOceanVx")==0) return BasalforcingsOceanVxEnum;
+-	      else if (strcmp(name,"BasalforcingsOceanVy")==0) return BasalforcingsOceanVyEnum;
+-	      else if (strcmp(name,"SurfaceforcingsRhoAir")==0) return SurfaceforcingsRhoAirEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"SurfaceforcingsAirCoef")==0) return SurfaceforcingsAirCoefEnum;
++	      if (strcmp(name,"BasalforcingsOceanVy")==0) return BasalforcingsOceanVyEnum;
++	      else if (strcmp(name,"SurfaceforcingsRhoAir")==0) return SurfaceforcingsRhoAirEnum;
++	      else if (strcmp(name,"SurfaceforcingsAirCoef")==0) return SurfaceforcingsAirCoefEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsAirLinDragCoef")==0) return SurfaceforcingsAirLinDragCoefEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsAirQuadDragCoef")==0) return SurfaceforcingsAirQuadDragCoefEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsWindVx")==0) return SurfaceforcingsWindVxEnum;
+Index: ../trunk-jpl/src/c/shared/Elements/elements.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Elements/elements.h	(revision 18612)
++++ ../trunk-jpl/src/c/shared/Elements/elements.h	(revision 18613)
+@@ -21,6 +21,7 @@
+ 				     IssmDouble* TemperaturesLgm, IssmDouble* TemperaturesPresentday, 
+ 					  IssmDouble* monthlytemperaturesout, IssmDouble* monthlyprecout);
+ IssmDouble DrainageFunctionWaterfraction(IssmDouble waterfraction, IssmDouble dt=0.);
++IssmDouble StressIntensityIntegralWeight(IssmDouble depth, IssmDouble water_depth, IssmDouble thickness);
+ 
+ /*Print arrays*/
+ void printarray(IssmPDouble* array,int lines,int cols=1);
+Index: ../trunk-jpl/src/c/shared/Elements/StressIntensityIntegralWeight.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Elements/StressIntensityIntegralWeight.cpp	(revision 0)
++++ ../trunk-jpl/src/c/shared/Elements/StressIntensityIntegralWeight.cpp	(revision 18613)
+@@ -0,0 +1,31 @@
++/* \file StressIntensityIntegralWeight.cpp
++ * \Weight to integrate the stress along the ice flow direction to compute the stress intensity factor : Linear Fracture Mechanics (see "Combining damage and fracture mechanics to model calving",Krug 2014 in the appendix) 
++ */
++
++#include <math.h>
++
++#include "../Numerics/types.h"
++
++IssmDouble StressIntensityIntegralWeight(IssmDouble depth, IssmDouble water_depth, IssmDouble thickness){
++
++	/*output: */
++	IssmDouble beta;
++
++	/*intermediaries: */
++	IssmDouble M1,M2,M3,x,y,d;
++	const double pi = 3.141592653589793;
++	x    = water_depth/thickness;
++	y    = depth;
++	d    = water_depth;
++
++	M1   = 0.0719768-1.513476*x-61.1001*pow(x,2)+1554.95*pow(x,3)-14583.8*pow(x,4)+71590.7*pow(x,5)-205384*pow(x,6)+356469*pow(x,7)-368270*pow(x,8)+208233*pow(x,9)-49544*pow(x,10);
++	//printf("M1 : %g",M1);
++	M2   = 0.246984+6.47583*x+176.456*pow(x,2)-4058.76*pow(x,3)+37303.8*pow(x,4)-181755*pow(x,5)+520551*pow(x,6)-904370*pow(x,7)+936863*pow(x,8)-531940*pow(x,9)+127291*pow(x,10);
++	//printf("M2 : %g",M2);
++	M3   = 0.529659-22.3235*x+532.074*pow(x,2)-5479.53*pow(x,3)+28592.2*pow(x,4)-81388.6*pow(x,5)+128746*pow(x,6)-106246*pow(x,7)+35780.7*pow(x,8);
++	//printf("M3 : %g",M3);
++
++	beta = 2/sqrt(2*pi*(d-y))*(1+M1*sqrt(1-y/d)+M2*(1-y/d)+M3*pow((1-y/d),1.5));
++
++	return beta;
++}
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 18612)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 18613)
+@@ -212,6 +212,7 @@
+ 					./shared/Sorting/sorting.h\
+ 					./shared/Elements/elements.h\
+ 					./shared/Elements/Cuffey.cpp\
++					./shared/Elements/StressIntensityIntegralWeight.cpp\
+ 					./shared/Elements/Paterson.cpp\
+ 					./shared/Elements/Arrhenius.cpp\
+ 					./shared/Elements/LliboutryDuval.cpp \
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18612)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18613)
+@@ -1635,6 +1635,18 @@
+ 	xDelete<int>(control_type);
+ }
+ /*}}}*/
++void FemModel::StressIntensityFactorx(){/*{{{*/
++
++	/*Initialize input as 0*/
++	InputUpdateFromConstantx(this,0.,StressIntensityFactorEnum);
++
++	/*Update input for basal element only*/
++	for(int i=0;i<elements->Size();i++){
++		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		element->StressIntensityFactor();
++	}
++}
++	/*}}}*/
+ #ifdef  _HAVE_DAKOTA_
+ void FemModel::DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses){/*{{{*/
+ 
+Index: ../trunk-jpl/src/c/classes/Elements/Element.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18612)
++++ ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18613)
+@@ -218,6 +218,7 @@
+ 		virtual void   ComputeBasalStress(Vector<IssmDouble>* sigma_b)=0;
+ 		virtual void   ComputeStressTensor(void)=0;
+ 		virtual void   ComputeDeviatoricStressTensor(void)=0;
++		virtual void	StressIntensityFactor(void)=0;
+ 
+ 		virtual void   Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finite_element)=0;
+ 		virtual void   InputExtrude(int input_enum,int start)=0;
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18612)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18613)
+@@ -55,6 +55,7 @@
+ 		void        ComputeStressTensor();
+ 		void        ComputeDeviatoricStressTensor();
+ 		void        ComputeSurfaceNormalVelocity();
++		void        StressIntensityFactor(void){_error_("not implemented yet");};
+ 		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters);
+ 		void        SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters);
+ 		void        ResetHooks();
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18612)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18613)
+@@ -346,6 +346,83 @@
+ 	delete gauss;
+ }
+ /*}}}*/
++void       Penta::StressIntensityFactor(){/*{{{*/
++
++	/* Check if we are on the base */
++	if(!IsOnBase()) return;
++
++	IssmDouble  ki[6]={0.};
++	IssmDouble  const_grav=9.81;
++	IssmDouble  rho_ice=900;
++	IssmDouble  rho_water=1000;
++	IssmDouble  Jdet[3];
++	IssmDouble  pressure,vx,vy,vel,deviaxx,deviaxy,deviayy,water_depth,prof,stress_xx,thickness;
++
++	Penta* penta=this;
++	for(;;){
++	
++		IssmDouble  xyz_list[NUMVERTICES][3];
++		/* Get node coordinates and dof list: */
++		::GetVerticesCoordinates(&xyz_list[0][0],penta->vertices,NUMVERTICES);
++
++		///*Compute the Jacobian for the vertical integration*/
++		Jdet[0]=(xyz_list[3][2]-xyz_list[0][2])*0.5;
++		Jdet[1]=(xyz_list[4][2]-xyz_list[1][2])*0.5;
++		Jdet[2]=(xyz_list[5][2]-xyz_list[2][2])*0.5;
++	
++		/*Retrieve all inputs we will need*/
++		Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
++		Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
++		Input* vel_input=inputs->GetInput(VelEnum);                                _assert_(vel_input);
++		Input* pressure_input=inputs->GetInput(PressureEnum);                      _assert_(pressure_input);
++		Input* deviaxx_input=inputs->GetInput(DeviatoricStressxxEnum);             _assert_(deviaxx_input);
++		Input* deviaxy_input=inputs->GetInput(DeviatoricStressxyEnum);             _assert_(deviaxy_input);
++		Input* deviayy_input=inputs->GetInput(DeviatoricStressyyEnum);             _assert_(deviayy_input);
++		Input* surface_input=inputs->GetInput(SurfaceEnum);								_assert_(surface_input);
++		Input* thickness_input=inputs->GetInput(ThicknessEnum);							_assert_(thickness_input);
++		
++		/* Start looping on the number of 2D vertices: */
++		for(int ig=0;ig<3;ig++){
++			GaussPenta* gauss=new GaussPenta(ig,3+ig,11);
++			for (int iv=gauss->begin();iv<gauss->end();iv++){
++				gauss->GaussPoint(iv);
++
++				/* Get the value we need*/
++				pressure_input->GetInputValue(&pressure,gauss);
++				vx_input->GetInputValue(&vx,gauss);
++				vy_input->GetInputValue(&vy,gauss);
++				vel_input->GetInputValue(&vel,gauss);
++				deviaxx_input->GetInputValue(&deviaxx,gauss);
++				deviaxy_input->GetInputValue(&deviaxy,gauss);
++				deviayy_input->GetInputValue(&deviayy,gauss);
++				surface_input->GetInputValue(&water_depth,gauss);
++				thickness_input->GetInputValue(&thickness,gauss);
++				prof=water_depth-penta->GetZcoord(&xyz_list[0][0],gauss);
++
++				/*stress_xx= Deviatoric stress along the ice flow direction plus cryostatic pressure */
++				stress_xx=(vx*vx*(deviaxx)+vy*vy*(deviayy)+2*vy*vx*deviaxy)/(vel*vel+1.e-6);
++
++				if(prof<water_depth&prof<thickness){
++					/* Compute the local stress intensity factor*/ 
++					ki[ig]+=Jdet[ig]*gauss->weight*stress_xx*StressIntensityIntegralWeight(prof,min(water_depth,thickness),thickness);
++				}
++			}
++			delete gauss;
++		}
++			
++		/*Stop if we have reached the surface/base*/
++		if(penta->IsOnSurface()) break;
++		
++		/*get upper Penta*/
++		penta=penta->GetUpperPenta();
++		_assert_(penta->Id()!=this->id);
++	}
++
++	/*Add input*/
++	this->inputs->AddInput(new PentaInput(StressIntensityFactorEnum,&ki[0],P1Enum));
++	this->InputExtrude(StressIntensityFactorEnum,-1);
++}
++/*}}}*/
+ void       Penta::Configure(Elements* elementsin, Loads* loadsin, Nodes* nodesin,Vertices* verticesin, Materials* materialsin, Parameters* parametersin){/*{{{*/
+ 
+ 	int analysis_counter;
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18612)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18613)
+@@ -56,6 +56,7 @@
+ 		void   ComputeSigmaNN(){_error_("not implemented yet");};
+ 		void   ComputeStressTensor();
+ 		void   ComputeDeviatoricStressTensor();
++		void   StressIntensityFactor();
+ 		void   Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
+ 		void   ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz);
+ 		int    FiniteElement(void);
+Index: ../trunk-jpl/src/c/classes/Elements/Seg.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18612)
++++ ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18613)
+@@ -56,6 +56,7 @@
+ 		void        ComputeSigmaNN(){_error_("not implemented yet");};
+ 		void        ComputeStressTensor(){_error_("not implemented yet");};
+ 		void        ComputeDeviatoricStressTensor(){_error_("not implemented yet");};
++		void        StressIntensityFactor(void){_error_("not implemented yet");};
+ 		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters){_error_("not implemented yet");};
+ 		void        SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters){_error_("not implemented yet");};
+ 		void        ResetHooks(){_error_("not implemented yet");};
+Index: ../trunk-jpl/src/c/classes/Elements/Tetra.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18612)
++++ ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18613)
+@@ -56,6 +56,7 @@
+ 		void        ComputeSigmaNN(){_error_("not implemented yet");};
+ 		void        ComputeStressTensor(){_error_("not implemented yet");};
+ 		void        ComputeDeviatoricStressTensor(){_error_("not implemented yet");};
++		void        StressIntensityFactor(void){_error_("not implemented yet");};
+ 		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters);
+ 		void        SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters);
+ 		void        ResetHooks();
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18612)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18613)
+@@ -1104,6 +1104,7 @@
+ 				name==EplHeadEnum ||
+ 				name==SedimentHeadOldEnum ||
+ 				name==EplHeadOldEnum ||
++				name==StressIntensityFactorEnum ||
+ 				name==HydrologydcEplThicknessOldEnum ||
+ 				name==HydrologydcEplInitialThicknessEnum ||
+ 				name==HydrologydcEplThicknessEnum ||
+@@ -1202,6 +1203,10 @@
+ 				this->ComputeNewDamage();
+ 				input=this->inputs->GetInput(output_enum);
+ 				break;
++			case StressIntensityFactorEnum:
++				this->StressIntensityFactor();
++				input=this->inputs->GetInput(output_enum);
++				break;
+ 			default:
+ 				_error_("input "<<EnumToStringx(output_enum)<<" not found in element");
+ 		}
+Index: ../trunk-jpl/src/c/classes/FemModel.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.h	(revision 18612)
++++ ../trunk-jpl/src/c/classes/FemModel.h	(revision 18613)
+@@ -80,6 +80,7 @@
+ 		void IceVolumeAboveFloatationx(IssmDouble* pV);
+ 		void ElementResponsex(IssmDouble* presponse,int response_enum);
+ 		void BalancethicknessMisfitx(IssmDouble* pV);
++		void StressIntensityFactorx();
+ 		#ifdef  _HAVE_DAKOTA_
+ 		void DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses);
+ 		#endif
+Index: ../trunk-jpl/src/m/enum/StressIntensityFactorEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressIntensityFactorEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/StressIntensityFactorEnum.m	(revision 18613)
+@@ -0,0 +1,11 @@
++function macro=StressIntensityFactorEnum()
++%STRESSINTENSITYFACTORENUM - Enum of StressIntensityFactor
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=StressIntensityFactorEnum()
++
++macro=StringToEnum('StressIntensityFactor');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18612)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18613)
+@@ -203,6 +203,7 @@
+ def DamageEvolutionRequestedOutputsEnum(): return StringToEnum("DamageEvolutionRequestedOutputs")[0]
+ def DamageEnum(): return StringToEnum("Damage")[0]
+ def NewDamageEnum(): return StringToEnum("NewDamage")[0]
++def StressIntensityFactorEnum(): return StringToEnum("StressIntensityFactor")[0]
+ def MaterialsRhoIceEnum(): return StringToEnum("MaterialsRhoIce")[0]
+ def MaterialsRhoSeawaterEnum(): return StringToEnum("MaterialsRhoSeawater")[0]
+ def MaterialsRhoFreshwaterEnum(): return StringToEnum("MaterialsRhoFreshwater")[0]
+@@ -394,6 +395,7 @@
+ def MeshdeformationSolutionEnum(): return StringToEnum("MeshdeformationSolution")[0]
+ def MeshdeformationAnalysisEnum(): return StringToEnum("MeshdeformationAnalysis")[0]
+ def LevelsetAnalysisEnum(): return StringToEnum("LevelsetAnalysis")[0]
++def LevelsetStabilizationEnum(): return StringToEnum("LevelsetStabilization")[0]
+ def ExtrapolationAnalysisEnum(): return StringToEnum("ExtrapolationAnalysis")[0]
+ def LsfReinitializationAnalysisEnum(): return StringToEnum("LsfReinitializationAnalysis")[0]
+ def ApproximationEnum(): return StringToEnum("Approximation")[0]
+Index: ../trunk-jpl/src/m/enum/LevelsetStabilizationEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/LevelsetStabilizationEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/LevelsetStabilizationEnum.m	(revision 18613)
+@@ -0,0 +1,11 @@
++function macro=LevelsetStabilizationEnum()
++%LEVELSETSTABILIZATIONENUM - Enum of LevelsetStabilization
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=LevelsetStabilizationEnum()
++
++macro=StringToEnum('LevelsetStabilization');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18613-18614.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18613-18614.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18613-18614.diff	(revision 19102)
@@ -0,0 +1,14 @@
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18613)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18614)
+@@ -1637,9 +1637,6 @@
+ /*}}}*/
+ void FemModel::StressIntensityFactorx(){/*{{{*/
+ 
+-	/*Initialize input as 0*/
+-	InputUpdateFromConstantx(this,0.,StressIntensityFactorEnum);
+-
+ 	/*Update input for basal element only*/
+ 	for(int i=0;i<elements->Size();i++){
+ 		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
Index: /issm/oecreview/Archive/18296-19100/ISSM-18614-18615.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18614-18615.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18614-18615.diff	(revision 19102)
@@ -0,0 +1,195 @@
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18614)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18615)
+@@ -141,6 +141,7 @@
+ 	HydrologySedimentKmaxEnum,
+ 	IndependentObjectEnum,
+ 	InversionControlParametersEnum,
++	InversionControlScalingFactorsEnum,
+ 	InversionCostFunctionThresholdEnum,
+ 	InversionCostFunctionsCoefficientsEnum,
+ 	InversionCostFunctionsEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18614)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18615)
+@@ -149,6 +149,7 @@
+ 		case HydrologySedimentKmaxEnum : return "HydrologySedimentKmax";
+ 		case IndependentObjectEnum : return "IndependentObject";
+ 		case InversionControlParametersEnum : return "InversionControlParameters";
++		case InversionControlScalingFactorsEnum : return "InversionControlScalingFactors";
+ 		case InversionCostFunctionThresholdEnum : return "InversionCostFunctionThreshold";
+ 		case InversionCostFunctionsCoefficientsEnum : return "InversionCostFunctionsCoefficients";
+ 		case InversionCostFunctionsEnum : return "InversionCostFunctions";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18614)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18615)
+@@ -152,6 +152,7 @@
+ 	      else if (strcmp(name,"HydrologySedimentKmax")==0) return HydrologySedimentKmaxEnum;
+ 	      else if (strcmp(name,"IndependentObject")==0) return IndependentObjectEnum;
+ 	      else if (strcmp(name,"InversionControlParameters")==0) return InversionControlParametersEnum;
++	      else if (strcmp(name,"InversionControlScalingFactors")==0) return InversionControlScalingFactorsEnum;
+ 	      else if (strcmp(name,"InversionCostFunctionThreshold")==0) return InversionCostFunctionThresholdEnum;
+ 	      else if (strcmp(name,"InversionCostFunctionsCoefficients")==0) return InversionCostFunctionsCoefficientsEnum;
+ 	      else if (strcmp(name,"InversionCostFunctions")==0) return InversionCostFunctionsEnum;
+@@ -258,11 +259,11 @@
+ 	      else if (strcmp(name,"MasstransportStabilization")==0) return MasstransportStabilizationEnum;
+ 	      else if (strcmp(name,"MasstransportVertexPairing")==0) return MasstransportVertexPairingEnum;
+ 	      else if (strcmp(name,"MasstransportNumRequestedOutputs")==0) return MasstransportNumRequestedOutputsEnum;
+-	      else if (strcmp(name,"MasstransportRequestedOutputs")==0) return MasstransportRequestedOutputsEnum;
+          else stage=3;
+    }
+    if(stage==3){
+-	      if (strcmp(name,"QmuIsdakota")==0) return QmuIsdakotaEnum;
++	      if (strcmp(name,"MasstransportRequestedOutputs")==0) return MasstransportRequestedOutputsEnum;
++	      else if (strcmp(name,"QmuIsdakota")==0) return QmuIsdakotaEnum;
+ 	      else if (strcmp(name,"MassFluxSegments")==0) return MassFluxSegmentsEnum;
+ 	      else if (strcmp(name,"MassFluxSegmentsPresent")==0) return MassFluxSegmentsPresentEnum;
+ 	      else if (strcmp(name,"QmuMassFluxSegmentsPresent")==0) return QmuMassFluxSegmentsPresentEnum;
+@@ -381,11 +382,11 @@
+ 	      else if (strcmp(name,"StressbalanceVerticalAnalysis")==0) return StressbalanceVerticalAnalysisEnum;
+ 	      else if (strcmp(name,"EnthalpyAnalysis")==0) return EnthalpyAnalysisEnum;
+ 	      else if (strcmp(name,"FlaimAnalysis")==0) return FlaimAnalysisEnum;
+-	      else if (strcmp(name,"FlaimSolution")==0) return FlaimSolutionEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"HydrologyShreveAnalysis")==0) return HydrologyShreveAnalysisEnum;
++	      if (strcmp(name,"FlaimSolution")==0) return FlaimSolutionEnum;
++	      else if (strcmp(name,"HydrologyShreveAnalysis")==0) return HydrologyShreveAnalysisEnum;
+ 	      else if (strcmp(name,"HydrologyDCInefficientAnalysis")==0) return HydrologyDCInefficientAnalysisEnum;
+ 	      else if (strcmp(name,"HydrologyDCEfficientAnalysis")==0) return HydrologyDCEfficientAnalysisEnum;
+ 	      else if (strcmp(name,"HydrologySolution")==0) return HydrologySolutionEnum;
+@@ -504,11 +505,11 @@
+ 	      else if (strcmp(name,"Adjointp")==0) return AdjointpEnum;
+ 	      else if (strcmp(name,"Adjointx")==0) return AdjointxEnum;
+ 	      else if (strcmp(name,"Adjointy")==0) return AdjointyEnum;
+-	      else if (strcmp(name,"Adjointz")==0) return AdjointzEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"BalancethicknessMisfit")==0) return BalancethicknessMisfitEnum;
++	      if (strcmp(name,"Adjointz")==0) return AdjointzEnum;
++	      else if (strcmp(name,"BalancethicknessMisfit")==0) return BalancethicknessMisfitEnum;
+ 	      else if (strcmp(name,"BedSlopeX")==0) return BedSlopeXEnum;
+ 	      else if (strcmp(name,"BedSlopeY")==0) return BedSlopeYEnum;
+ 	      else if (strcmp(name,"Boundary")==0) return BoundaryEnum;
+@@ -627,11 +628,11 @@
+ 	      else if (strcmp(name,"IntExternalResult")==0) return IntExternalResultEnum;
+ 	      else if (strcmp(name,"J")==0) return JEnum;
+ 	      else if (strcmp(name,"StringExternalResult")==0) return StringExternalResultEnum;
+-	      else if (strcmp(name,"Step")==0) return StepEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"Time")==0) return TimeEnum;
++	      if (strcmp(name,"Step")==0) return StepEnum;
++	      else if (strcmp(name,"Time")==0) return TimeEnum;
+ 	      else if (strcmp(name,"WaterColumnOld")==0) return WaterColumnOldEnum;
+ 	      else if (strcmp(name,"Outputdefinition")==0) return OutputdefinitionEnum;
+ 	      else if (strcmp(name,"OutputdefinitionList")==0) return OutputdefinitionListEnum;
+@@ -750,11 +751,11 @@
+ 	      else if (strcmp(name,"BasalforcingsOceanQuadDragCoef")==0) return BasalforcingsOceanQuadDragCoefEnum;
+ 	      else if (strcmp(name,"BasalforcingsOceanTurningAngle")==0) return BasalforcingsOceanTurningAngleEnum;
+ 	      else if (strcmp(name,"BasalforcingsOceanSsh")==0) return BasalforcingsOceanSshEnum;
+-	      else if (strcmp(name,"BasalforcingsOceanVx")==0) return BasalforcingsOceanVxEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"BasalforcingsOceanVy")==0) return BasalforcingsOceanVyEnum;
++	      if (strcmp(name,"BasalforcingsOceanVx")==0) return BasalforcingsOceanVxEnum;
++	      else if (strcmp(name,"BasalforcingsOceanVy")==0) return BasalforcingsOceanVyEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsRhoAir")==0) return SurfaceforcingsRhoAirEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsAirCoef")==0) return SurfaceforcingsAirCoefEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsAirLinDragCoef")==0) return SurfaceforcingsAirLinDragCoefEnum;
+Index: ../trunk-jpl/src/m/classes/m1qn3inversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 18614)
++++ ../trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 18615)
+@@ -8,10 +8,11 @@
+ 		iscontrol                   = 0
+ 		incomplete_adjoint          = 0
+ 		control_parameters          = NaN
++		control_scaling_factors     = NaN
+ 		maxsteps                    = 0
+ 		maxiter                     = 0
+-		dxmin                       = 0;
+-		gttol                       = 0;
++		dxmin                       = 0
++		gttol                       = 0
+ 		cost_functions              = NaN
+ 		cost_functions_coefficients = NaN
+ 		min_parameters              = NaN
+@@ -21,7 +22,7 @@
+ 		vz_obs                      = NaN
+ 		vel_obs                     = NaN
+ 		thickness_obs               = NaN
+-		surface_obs               = NaN
++		surface_obs                 = NaN
+ 
+ 	end
+ 	methods
+@@ -44,6 +45,9 @@
+ 			%drag and B are supported yet)
+ 			self.control_parameters={'FrictionCoefficient'};
+ 
++			%Scaling factor for each control
++			self.control_scaling_factors=1;
++
+ 			%number of iterations
+ 			self.maxsteps=20;
+ 			self.maxiter=40;
+@@ -73,6 +77,7 @@
+ 			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',...
+ 				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'DamageDbar',...
+ 				'Vx' 'Vy' 'Thickness' 'BalancethicknessOmega' 'BalancethicknessApparentMassbalance'});
++			md = checkfield(md,'fieldname','inversion.control_scaling_factors','size',[1 num_controls],'>',0,'NaN',1);
+ 			md = checkfield(md,'fieldname','inversion.maxsteps','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.maxiter','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.dxmin','numel',1,'>',0);
+@@ -99,6 +104,7 @@
+ 			fielddisplay(obj,'iscontrol','is inversion activated?');
+ 			fielddisplay(obj,'incomplete_adjoint','1: linear viscosity, 0: non-linear viscosity');
+ 			fielddisplay(obj,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}');
++			fielddisplay(obj,'control_scaling_factors','order of magnitude of each control (useful for multi-parameter optimization)');
+ 			fielddisplay(obj,'maxsteps','maximum number of iterations (gradient computation)');
+ 			fielddisplay(obj,'maxiter','maximum number of Function evaluation (forward run)');
+ 			fielddisplay(obj,'dxmin','convergence criterion: two points less than dxmin from eachother (sup-norm) are considered identical');
+@@ -131,6 +137,7 @@
+ 			WriteData(fid,'enum',InversionTypeEnum(),'data',2,'format','Integer');
+ 			if ~obj.iscontrol, return; end
+ 			WriteData(fid,'object',obj,'class','inversion','fieldname','incomplete_adjoint','format','Boolean');
++			WriteData(fid,'object',obj,'class','inversion','fieldname','control_scaling_factors','format','DoubleMat','mattype',3);
+ 			WriteData(fid,'object',obj,'class','inversion','fieldname','maxsteps','format','Integer');
+ 			WriteData(fid,'object',obj,'class','inversion','fieldname','maxiter','format','Integer');
+ 			WriteData(fid,'object',obj,'class','inversion','fieldname','dxmin','format','Double');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18614)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18615)
+@@ -141,6 +141,7 @@
+ def HydrologySedimentKmaxEnum(): return StringToEnum("HydrologySedimentKmax")[0]
+ def IndependentObjectEnum(): return StringToEnum("IndependentObject")[0]
+ def InversionControlParametersEnum(): return StringToEnum("InversionControlParameters")[0]
++def InversionControlScalingFactorsEnum(): return StringToEnum("InversionControlScalingFactors")[0]
+ def InversionCostFunctionThresholdEnum(): return StringToEnum("InversionCostFunctionThreshold")[0]
+ def InversionCostFunctionsCoefficientsEnum(): return StringToEnum("InversionCostFunctionsCoefficients")[0]
+ def InversionCostFunctionsEnum(): return StringToEnum("InversionCostFunctions")[0]
+Index: ../trunk-jpl/src/m/enum/InversionControlScalingFactorsEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/InversionControlScalingFactorsEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/InversionControlScalingFactorsEnum.m	(revision 18615)
+@@ -0,0 +1,11 @@
++function macro=InversionControlScalingFactorsEnum()
++%INVERSIONCONTROLSCALINGFACTORSENUM - Enum of InversionControlScalingFactors
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=InversionControlScalingFactorsEnum()
++
++macro=StringToEnum('InversionControlScalingFactors');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18615-18616.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18615-18616.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18615-18616.diff	(revision 19102)
@@ -0,0 +1,141 @@
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 18615)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 18616)
+@@ -12,13 +12,14 @@
+ 	bool        control_analysis;
+ 	int         inversiontype;
+ 	int         nsteps;
+-	int         num_control_type;
+-	int         num_cm_responses;
++	int         num_controls;
++	int         num_costfunc;
+ 	int        *control_type     = NULL;
+ 	int        *maxiter          = NULL;
+ 	int        *cm_responses     = NULL;
+ 	IssmDouble *cm_jump          = NULL;
+ 	IssmDouble *optscal          = NULL;
++	IssmDouble *control_scaling_factors = NULL;
+ 
+ 	/*retrieve some parameters: */
+ 	iomodel->Constant(&control_analysis,InversionIscontrolEnum);
+@@ -40,10 +41,10 @@
+ 		}
+ 
+ 		/*Now, recover fit, optscal and maxiter as vectors: */
+-		iomodel->FetchData(&control_type,NULL,&num_control_type,InversionControlParametersEnum);
+-		iomodel->FetchData(&cm_responses,NULL,&num_cm_responses,InversionCostFunctionsEnum);
+-		parameters->AddObject(new IntVecParam(InversionControlParametersEnum,control_type,num_control_type));
+-		parameters->AddObject(new IntVecParam(InversionCostFunctionsEnum,cm_responses,num_cm_responses));
++		iomodel->FetchData(&control_type,NULL,&num_controls,InversionControlParametersEnum);
++		iomodel->FetchData(&cm_responses,NULL,&num_costfunc,InversionCostFunctionsEnum);
++		parameters->AddObject(new IntVecParam(InversionControlParametersEnum,control_type,num_controls));
++		parameters->AddObject(new IntVecParam(InversionCostFunctionsEnum,cm_responses,num_costfunc));
+ 
+ 		/*Inversion type specifics*/
+ 		switch(inversiontype){
+@@ -53,7 +54,7 @@
+ 				iomodel->FetchData(&cm_jump,&nsteps,NULL,InversionStepThresholdEnum);
+ 				iomodel->FetchData(&optscal,NULL,NULL,InversionGradientScalingEnum);
+ 				iomodel->FetchData(&maxiter,NULL,NULL,InversionMaxiterPerStepEnum);
+-				parameters->AddObject(new DoubleMatParam(InversionGradientScalingEnum,optscal,nsteps,num_control_type));
++				parameters->AddObject(new DoubleMatParam(InversionGradientScalingEnum,optscal,nsteps,num_controls));
+ 				parameters->AddObject(new DoubleVecParam(InversionStepThresholdEnum,cm_jump,nsteps));
+ 				parameters->AddObject(new IntVecParam(InversionMaxiterPerStepEnum,maxiter,nsteps));
+ 				break;
+@@ -72,6 +73,8 @@
+ 				parameters->AddObject(iomodel->CopyConstantObject(InversionGttolEnum));
+ 				parameters->AddObject(iomodel->CopyConstantObject(InversionMaxstepsEnum));
+ 				parameters->AddObject(iomodel->CopyConstantObject(InversionMaxiterEnum));
++				iomodel->FetchData(&control_scaling_factors,NULL,NULL,InversionControlScalingFactorsEnum);
++				parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_controls));
+ 				break;
+ 			case 3:/*Validation*/
+ 				break;
+Index: ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18615)
++++ ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18616)
+@@ -32,6 +32,7 @@
+ 	double       f,dxmin,gttol; 
+ 	int          maxsteps,maxiter;
+ 	int          intn,num_controls,solution_type;
++	IssmDouble  *scaling_factors = NULL;
+ 	IssmDouble  *X  = NULL;
+ 	IssmDouble  *G  = NULL;
+ 
+@@ -42,6 +43,7 @@
+ 	femmodel->parameters->FindParam(&maxiter,InversionMaxiterEnum);
+ 	femmodel->parameters->FindParam(&dxmin,InversionDxminEnum);
+ 	femmodel->parameters->FindParam(&gttol,InversionGttolEnum);
++	femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
+ 	femmodel->parameters->SetParam(false,SaveResultsEnum);
+ 
+ 	/*Initialize M1QN3 parameters*/
+@@ -73,6 +75,12 @@
+ 	long n = long(intn);
+ 	G = xNew<double>(n);
+ 
++	/*Scale control for M1QN3*/
++	if(num_controls!=1) _error_("not supported yet...");
++	for(long i=0;i<n;i++){
++		X[i] = X[i]/scaling_factors[0];
++	}
++
+ 	/*Allocate m1qn3 working arrays (see doc)*/
+ 	long      m   = 100;
+ 	long      ndz = 4*n+m*(2*n+1);
+@@ -131,15 +139,21 @@
+ 	FemModel   *femmodel  = (FemModel*)dzs;
+ 
+ 	/*Recover number of cost functions responses*/
+-	int num_responses;
++	int         num_responses;
++	int         num_controls;
++	IssmDouble* scaling_factors = NULL;
+ 	femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum);
++	femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
++	femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
+ 
+ 	/*Constrain input vector*/
+ 	IssmDouble  *XL = NULL;
+ 	IssmDouble  *XU = NULL;
+ 	GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");
+ 	GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
++	if(num_controls!=1) _error_("not supported yet");
+ 	for(long i=0;i<*n;i++){
++		X[i] = X[i]*scaling_factors[0];
+ 		if(X[i]>XU[i]) X[i]=XU[i];
+ 		if(X[i]<XL[i]) X[i]=XL[i];
+ 	}
+@@ -161,8 +175,6 @@
+ 	femmodel->CostFunctionx(pf,&Jlist,NULL);
+ 	_printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<"  |  ");
+ 
+-
+-
+ 	if(indic==0){
+ 		/*dry run, no gradient required*/
+ 
+@@ -189,9 +201,12 @@
+ 
+ 	/*Constrain Gradient*/
+ 	IssmDouble  Gnorm = 0.;
++	if(num_controls!=1) _error_("not supported yet");
+ 	for(long i=0;i<*n;i++){
+ 		if(X[i]>=XU[i]) G[i]=0.;
+ 		if(X[i]<=XL[i]) G[i]=0.;
++		G[i] = G[i]*scaling_factors[0];
++		X[i] = X[i]/scaling_factors[0];
+ 		Gnorm += G[i]*G[i];
+ 	}
+ 	Gnorm = sqrt(Gnorm);
+@@ -202,7 +217,7 @@
+ 	_printf0_("\n");
+ 
+ 	/*Clean-up and return*/
+-		xDelete<IssmDouble>(Jlist);
++	xDelete<IssmDouble>(Jlist);
+ 	xDelete<IssmDouble>(XU);
+ 	xDelete<IssmDouble>(XL);
+ }
Index: /issm/oecreview/Archive/18296-19100/ISSM-18616-18617.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18616-18617.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18616-18617.diff	(revision 19102)
@@ -0,0 +1,128 @@
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 18616)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 18617)
+@@ -77,6 +77,8 @@
+ 				parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_controls));
+ 				break;
+ 			case 3:/*Validation*/
++				iomodel->FetchData(&control_scaling_factors,NULL,NULL,InversionControlScalingFactorsEnum);
++				parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_controls));
+ 				break;
+ 			default:
+ 				_error_("not supported");
+Index: ../trunk-jpl/src/c/cores/controlvalidation_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/controlvalidation_core.cpp	(revision 18616)
++++ ../trunk-jpl/src/c/cores/controlvalidation_core.cpp	(revision 18617)
+@@ -14,6 +14,7 @@
+ 	int         num_responses;
+ 	IssmDouble  j0,j,yts;
+ 	IssmDouble  Ialpha,exponent,alpha;
++	IssmDouble* scaling_factors = NULL;
+ 	IssmDouble* jlist = NULL;
+ 	IssmDouble *G = NULL;
+ 	IssmDouble *X = NULL;
+@@ -28,6 +29,7 @@
+ 	femmodel->parameters->SetParam(false,SaveResultsEnum);
+ 	femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum);
+ 	femmodel->parameters->FindParam(&yts,ConstantsYtsEnum);
++	femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
+ 
+ 	/*Get initial guess*/
+ 	Vector<IssmDouble> *Xpetsc = NULL;
+@@ -50,24 +52,15 @@
+ 
+ 	if(VerboseControl()) _printf0_("   Compute Initial cost function\n");
+ 	femmodel->CostFunctionx(&j0,&jlist,NULL);
+-	_printf0_("Initial J(x+dk)      |  List of contributions\n");
+-	_printf0_("_____________________________________________\n");
+-	_printf0_("J(x) = "<<setw(12)<<setprecision(7)<<j0<<"  |  ");
+-	for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(12)<<setprecision(7)<<jlist[i]);
+-	_printf0_("\n");
++	_printf0_("Initial cost function J(x) = "<<setw(12)<<setprecision(7)<<j0<<"\n");
+ 	xDelete<IssmDouble>(jlist);
+ 
+ 	if(VerboseControl()) _printf0_("   Compute Gradient\n");
+ 	Gradjx(&G,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
+ 	for(int i=0;i<n;i++) G[i] = -G[i];
+ 
+-	/*Range of tests*/
+-	IssmDouble exp0 = 0.;
+-	IssmDouble incr = -0.2;
+-	IssmDouble exp1 = -18.;
+-	int        num  = reCast<int,IssmDouble>((exp1-exp0)/incr);
+-
+ 	/*Allocate output*/
++	int num = 26;
+ 	IssmDouble* output = xNew<IssmDouble>(2*num);
+ 
+ 	/*Start loop*/
+@@ -75,11 +68,8 @@
+ 	_printf0_("_________________________\n");
+ 	for(int m=0;m<num;m++){
+ 
+-		/*Calculate alpha = 10^-exponent*/
+-		exponent = exp0+m*incr;
+-		alpha    = pow(10.,exponent);
+-
+ 		/*Create new vector*/
++		alpha    = pow(2.,-m);
+ 		for(int i=0;i<n;i++) X[i] = X0[i] + alpha;
+ 
+ 		/*Calculate j(k+alpha delta k) */
+@@ -88,7 +78,7 @@
+ 		femmodel->CostFunctionx(&j,NULL,NULL);
+ 
+ 		IssmDouble Den = 0.;
+-		for(int i=0;i<n;i++) Den += alpha* G[i] * 1.;
++		for(int i=0;i<n;i++) Den += alpha* G[i] * scaling_factors[0];
+ 		Ialpha = fabs((j - j0)/Den - 1.);
+ 
+ 		_printf0_(" " << setw(11) << setprecision (5)<<alpha<<" " << setw(11) << setprecision (5)<<Ialpha<<"\n");
+Index: ../trunk-jpl/src/m/classes/inversionvalidation.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 18616)
++++ ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 18617)
+@@ -8,6 +8,7 @@
+ 		iscontrol                   = 0
+ 		incomplete_adjoint          = 0
+ 		control_parameters          = NaN
++		control_scaling_factors     = NaN
+ 		cost_functions              = NaN
+ 		cost_functions_coefficients = NaN
+ 		min_parameters              = NaN
+@@ -39,6 +40,9 @@
+ 			%drag and B are supported yet)
+ 			self.control_parameters={'FrictionCoefficient'};
+ 
++			%Scaling factor for each control
++			self.control_scaling_factors=1;
++
+ 			%several responses can be used:
+ 			self.cost_functions=101;
+ 		end % }}}
+@@ -55,6 +59,7 @@
+ 			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',...
+ 				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'DamageDbar' 'Vx' 'Vy' 'Thickness',...
+ 				'BalancethicknessOmega' 'BalancethicknessApparentMassbalance'});
++			md = checkfield(md,'fieldname','inversion.control_scaling_factors','size',[1 num_controls],'>',0,'NaN',1);
+ 			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:506 601:604]);
+ 			md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);
+@@ -76,6 +81,7 @@
+ 			fielddisplay(obj,'iscontrol','is inversion activated?');
+ 			fielddisplay(obj,'incomplete_adjoint','1: linear viscosity, 0: non-linear viscosity');
+ 			fielddisplay(obj,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}');
++			fielddisplay(obj,'control_scaling_factors','order of magnitude of each control (useful for multi-parameter optimization)');
+ 			fielddisplay(obj,'cost_functions','indicate the type of response for each optimization step');
+ 			fielddisplay(obj,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter');
+ 			fielddisplay(obj,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex');
+@@ -104,6 +110,7 @@
+ 			WriteData(fid,'enum',InversionTypeEnum(),'data',3,'format','Integer');
+ 			if ~obj.iscontrol, return; end
+ 			WriteData(fid,'object',obj,'class','inversion','fieldname','incomplete_adjoint','format','Boolean');
++			WriteData(fid,'object',obj,'class','inversion','fieldname','control_scaling_factors','format','DoubleMat','mattype',3);
+ 			WriteData(fid,'object',obj,'class','inversion','fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1);
+ 			WriteData(fid,'object',obj,'class','inversion','fieldname','min_parameters','format','DoubleMat','mattype',3);
+ 			WriteData(fid,'object',obj,'class','inversion','fieldname','max_parameters','format','DoubleMat','mattype',3);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18617-18618.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18617-18618.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18617-18618.diff	(revision 19102)
@@ -0,0 +1,29 @@
+Index: ../trunk-jpl/src/wrappers/matlab/io/WriteMatlabData.cpp
+===================================================================
+--- ../trunk-jpl/src/wrappers/matlab/io/WriteMatlabData.cpp	(revision 18617)
++++ ../trunk-jpl/src/wrappers/matlab/io/WriteMatlabData.cpp	(revision 18618)
+@@ -191,7 +191,7 @@
+ 	/*Intermediary*/
+ 	int         i;
+ 	mxArray    *dataref           = NULL;
+-	const int   numfields         = 16;
++	const int   numfields         = 17;
+ 	const char *fnames[numfields];
+ 	mwSize      ndim              = 2;
+ 	mwSize      dimensions[2]     = {1,1};
+@@ -214,6 +214,7 @@
+ 	fnames[i++] = "NodalElementConnectivity";
+ 	fnames[i++] = "CrackedVertices";
+ 	fnames[i++] = "CrackedEdges";
++	fnames[i++] = "PreviousNumbering";
+ 	_assert_(i==numfields);
+ 
+ 	/*Initialize Matlab structure*/
+@@ -237,6 +238,7 @@
+ 	i++; SetStructureField(dataref,"NodalElementConnectivity", bamgmesh->NodalElementConnectivitySize[0], bamgmesh->NodalElementConnectivitySize[1],bamgmesh->NodalElementConnectivity);
+ 	i++; SetStructureField(dataref,"CrackedVertices", bamgmesh->CrackedVerticesSize[0],bamgmesh->CrackedVerticesSize[1], bamgmesh->CrackedVertices);
+ 	i++; SetStructureField(dataref,"CrackedEdges",bamgmesh->CrackedEdgesSize[0], bamgmesh->CrackedEdgesSize[1],bamgmesh->CrackedEdges);
++	i++; SetStructureField(dataref,"PreviousNumbering",bamgmesh->VerticesSize[0],1,bamgmesh->PreviousNumbering);
+ 	_assert_(i==numfields);
+ 
+ 	/*Assign output*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18618-18619.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18618-18619.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18618-18619.diff	(revision 19102)
@@ -0,0 +1,232 @@
+Index: ../trunk-jpl/src/c/solutionsequences/convergence.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/convergence.cpp	(revision 18618)
++++ ../trunk-jpl/src/c/solutionsequences/convergence.cpp	(revision 18619)
+@@ -6,7 +6,7 @@
+ #include "../modules/modules.h"
+ #include "../shared/shared.h"
+ 
+-void convergence(bool* pconverged, Matrix<IssmDouble>* Kff,Vector<IssmDouble>* pf,Vector<IssmDouble>* uf,Vector<IssmDouble>* old_uf,Parameters* parameters){
++void convergence(bool* pconverged, Matrix<IssmDouble>* Kff,Vector<IssmDouble>* pf,Vector<IssmDouble>* uf,Vector<IssmDouble>* old_uf,IssmDouble eps_res,IssmDouble eps_rel,IssmDouble eps_abs){
+ 
+ 	/*output*/
+ 	bool converged=false;
+@@ -24,12 +24,6 @@
+ 	IssmDouble solver_residue,res;
+ 	int analysis_type;
+ 
+-	/*convergence options*/
+-	IssmDouble eps_res;
+-	IssmDouble eps_rel;
+-	IssmDouble eps_abs;
+-	IssmDouble yts;
+-
+ 	if(VerboseModule()) _printf0_("   checking convergence\n");
+ 
+ 	/*If uf is NULL in input, f-set is nil, model is fully constrained, therefore converged from 
+@@ -39,20 +33,6 @@
+ 		return;
+ 	}
+ 
+-	/*get convergence options*/
+-	parameters->FindParam(&eps_res,StressbalanceRestolEnum);
+-	// get analysis type
+-	parameters->FindParam(&analysis_type,AnalysisTypeEnum);
+-	if(analysis_type==StressbalanceAnalysisEnum)
+-		parameters->FindParam(&eps_rel,StressbalanceReltolEnum);
+-	else if(analysis_type==EnthalpyAnalysisEnum)
+-		parameters->FindParam(&eps_rel,ThermalReltolEnum);
+-	else
+-		eps_rel = NAN;
+-
+-	parameters->FindParam(&eps_abs,StressbalanceAbstolEnum);
+-	parameters->FindParam(&yts,ConstantsYtsEnum);
+-
+ 	/*Display solver caracteristics*/
+ 	if (VerboseConvergence()){
+ 
+@@ -138,15 +118,15 @@
+ 
+ 		//print
+ 		if (!xIsNan<IssmDouble>(eps_abs)){
+-			if ((nduinf*yts)<eps_abs){
+-				if(VerboseConvergence()) _printf0_(setw(50) << left << "   Convergence criterion: max(du)" << nduinf*yts << " < " << eps_abs << " m/yr\n");
++			if ((nduinf)<eps_abs){
++				if(VerboseConvergence()) _printf0_(setw(50) << left << "   Convergence criterion: max(du)" << nduinf << " < " << eps_abs << "\n");
+ 			}
+ 			else{
+-				if(VerboseConvergence()) _printf0_(setw(50) << left << "   Convergence criterion: max(du)" << nduinf*yts << " > " << eps_abs << " m/yr\n");
++				if(VerboseConvergence()) _printf0_(setw(50) << left << "   Convergence criterion: max(du)" << nduinf << " > " << eps_abs << "\n");
+ 				converged=false;
+ 			}
+ 		}
+-		else  _printf0_(setw(50) << left << "   Convergence criterion: max(du)" << nduinf*yts << " m/yr\n");
++		else  _printf0_(setw(50) << left << "   Convergence criterion: max(du)" << nduinf << "\n");
+ 
+ 	}
+ 
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_newton.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_newton.cpp	(revision 18618)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_newton.cpp	(revision 18619)
+@@ -29,12 +29,16 @@
+ 
+ 	/*parameters:*/
+ 	int max_nonlinear_iterations;
+-	int  configuration_type;
++	int configuration_type;
++	IssmDouble eps_res,eps_rel,eps_abs;
+ 
+ 	/*Recover parameters: */
+ 	femmodel->parameters->FindParam(&max_nonlinear_iterations,StressbalanceMaxiterEnum);
+ 	femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
+ 	femmodel->parameters->FindParam(&newton,StressbalanceIsnewtonEnum);
++	femmodel->parameters->FindParam(&eps_res,StressbalanceRestolEnum);
++	femmodel->parameters->FindParam(&eps_rel,StressbalanceReltolEnum);
++	femmodel->parameters->FindParam(&eps_abs,StressbalanceAbstolEnum);
+ 	femmodel->UpdateConstraintsx();
+ 
+ 	count=1;
+@@ -82,7 +86,7 @@
+ 		InputUpdateFromSolutionx(femmodel,ug);
+ 
+ 		/*Check convergence*/
+-		convergence(&converged,Kff,pf,uf,old_uf,femmodel->parameters); 
++		convergence(&converged,Kff,pf,uf,old_uf,eps_res,eps_rel,eps_abs); 
+ 		delete Kff; delete pf;
+ 		if(converged==true){	
+ 			int step; IssmDouble time;
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_stokescoupling_nonlinear.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_stokescoupling_nonlinear.cpp	(revision 18618)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_stokescoupling_nonlinear.cpp	(revision 18619)
+@@ -32,10 +32,14 @@
+ 	int  min_mechanical_constraints;
+ 	int  max_nonlinear_iterations;
+ 	int  configuration_type;
++	IssmDouble eps_res,eps_rel,eps_abs;
+ 
+ 	/*Recover parameters: */
+ 	femmodel->parameters->FindParam(&min_mechanical_constraints,StressbalanceRiftPenaltyThresholdEnum);
+ 	femmodel->parameters->FindParam(&max_nonlinear_iterations,StressbalanceMaxiterEnum);
++	femmodel->parameters->FindParam(&eps_res,StressbalanceRestolEnum);
++	femmodel->parameters->FindParam(&eps_rel,StressbalanceReltolEnum);
++	femmodel->parameters->FindParam(&eps_abs,StressbalanceAbstolEnum);
+ 	femmodel->UpdateConstraintsx();
+ 
+ 	count=1;
+@@ -67,7 +71,7 @@
+ 		Mergesolutionfromftogx(&ug_horiz, uf_horiz,ys,femmodel->nodes,femmodel->parameters); delete ys;
+ 		InputUpdateFromSolutionx(femmodel,ug_horiz);
+ 
+-		convergence(&converged,Kff_horiz,pf_horiz,uf_horiz,old_uf_horiz,femmodel->parameters); delete Kff_horiz; delete pf_horiz; delete df_horiz;
++		convergence(&converged,Kff_horiz,pf_horiz,uf_horiz,old_uf_horiz,eps_res,eps_rel,eps_abs); delete Kff_horiz; delete pf_horiz; delete df_horiz;
+ 
+ 		/*Second compute vertical velocity: */
+ 		femmodel->SetCurrentConfiguration(StressbalanceVerticalAnalysisEnum);
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp	(revision 18618)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp	(revision 18619)
+@@ -30,22 +30,23 @@
+ 	int count;
+ 	int thermal_penalty_threshold;
+ 	int thermal_maxiter;
+-	IssmDouble thermal_reltol;
+ 
+ 	/*parameters:*/
+ 	int  configuration_type;
++	IssmDouble eps_rel;
+ 
+ 	/*Recover parameters: */
+ 	femmodel->parameters->FindParam(&isenthalpy,ThermalIsenthalpyEnum);
+ 	femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
+ 	femmodel->parameters->FindParam(&thermal_maxiter,ThermalMaxiterEnum);
++	femmodel->parameters->FindParam(&eps_rel,ThermalReltolEnum);
+ 
+ 	converged=false;
+ 	InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
+ 
+ 	if(isenthalpy){
+ 		femmodel->parameters->FindParam(&isdynamicbasalspc,ThermalIsdynamicbasalspcEnum);
+-		femmodel->parameters->FindParam(&thermal_reltol,ThermalReltolEnum);
++		femmodel->parameters->FindParam(&eps_rel,ThermalReltolEnum);
+ 		femmodel->UpdateConstraintsx();
+ 
+ 		//Update the solution to make sure that vx and vxold are similar (for next step in transient or steadystate)
+@@ -72,7 +73,7 @@
+ 		Solverx(&tf, Kff, pf, tf_old, df, femmodel->parameters);
+ 		Mergesolutionfromftogx(&tg, tf,ys,femmodel->nodes,femmodel->parameters); delete ys;
+ 		if(isenthalpy){ 
+-			convergence(&converged,Kff,pf,tf,tf_old,femmodel->parameters); 
++			convergence(&converged,Kff,pf,tf,tf_old,0.05,eps_rel,NAN); 
+ 			InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
+ 		}
+ 		delete Kff; delete pf; delete df;
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_nonlinear.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_nonlinear.cpp	(revision 18618)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_nonlinear.cpp	(revision 18619)
+@@ -30,10 +30,15 @@
+ 	int min_mechanical_constraints;
+ 	int max_nonlinear_iterations;
+ 	int configuration_type;
++	IssmDouble eps_res,eps_rel,eps_abs;
+ 
++
+ 	/*Recover parameters: */
+ 	femmodel->parameters->FindParam(&min_mechanical_constraints,StressbalanceRiftPenaltyThresholdEnum);
+ 	femmodel->parameters->FindParam(&max_nonlinear_iterations,StressbalanceMaxiterEnum);
++	femmodel->parameters->FindParam(&eps_res,StressbalanceRestolEnum);
++	femmodel->parameters->FindParam(&eps_rel,StressbalanceReltolEnum);
++	femmodel->parameters->FindParam(&eps_abs,StressbalanceAbstolEnum);
+ 	femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
+ 	femmodel->UpdateConstraintsx();
+ 
+@@ -65,7 +70,7 @@
+ 		Solverx(&uf, Kff, pf, old_uf, df, femmodel->parameters);
+ 		Mergesolutionfromftogx(&ug, uf,ys,femmodel->nodes,femmodel->parameters);delete ys;
+ 
+-		convergence(&converged,Kff,pf,uf,old_uf,femmodel->parameters); delete Kff; delete pf; delete df;
++		convergence(&converged,Kff,pf,uf,old_uf,eps_res,eps_rel,eps_abs); delete Kff; delete pf; delete df;
+ 		InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
+ 		InputUpdateFromSolutionx(femmodel,ug);
+ 
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequences.h
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequences.h	(revision 18618)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequences.h	(revision 18619)
+@@ -23,6 +23,6 @@
+ void solutionsequence_adjoint_linear(FemModel* femmodel);
+ 
+ /*convergence*/
+-void convergence(bool* pconverged, Matrix<IssmDouble>* K_ff,Vector<IssmDouble>* p_f,Vector<IssmDouble>* u_f,Vector<IssmDouble>* u_f_old,Parameters* parameters);
++void convergence(bool* pconverged, Matrix<IssmDouble>* K_ff,Vector<IssmDouble>* p_f,Vector<IssmDouble>* u_f,Vector<IssmDouble>* u_f_old,IssmDouble eps_res,IssmDouble eps_rel,IssmDouble eps_abs);
+ 
+ #endif
+Index: ../trunk-jpl/src/m/classes/stressbalance.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/stressbalance.py	(revision 18618)
++++ ../trunk-jpl/src/m/classes/stressbalance.py	(revision 18619)
+@@ -172,7 +172,7 @@
+ 		WriteData(fid,'object',self,'class','stressbalance','fieldname','spcvz','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+ 		WriteData(fid,'object',self,'class','stressbalance','fieldname','restol','format','Double')
+ 		WriteData(fid,'object',self,'class','stressbalance','fieldname','reltol','format','Double')
+-		WriteData(fid,'object',self,'class','stressbalance','fieldname','abstol','format','Double')
++		WriteData(fid,'object',self,'class','stressbalance','fieldname','abstol','format','Double','scale',1./yts)
+ 		WriteData(fid,'object',self,'class','stressbalance','fieldname','isnewton','format','Integer')
+ 		WriteData(fid,'object',self,'class','stressbalance','fieldname','FSreconditioning','format','Double')
+ 		WriteData(fid,'object',self,'class','stressbalance','fieldname','viscosity_overshoot','format','Double')
+Index: ../trunk-jpl/src/m/classes/stressbalance.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/stressbalance.m	(revision 18618)
++++ ../trunk-jpl/src/m/classes/stressbalance.m	(revision 18619)
+@@ -222,7 +222,7 @@
+ 			WriteData(fid,'object',obj,'class','stressbalance','fieldname','spcvz','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+ 			WriteData(fid,'object',obj,'class','stressbalance','fieldname','restol','format','Double');
+ 			WriteData(fid,'object',obj,'class','stressbalance','fieldname','reltol','format','Double');
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','abstol','format','Double');
++			WriteData(fid,'object',obj,'class','stressbalance','fieldname','abstol','format','Double','scale',1./yts);
+ 			WriteData(fid,'object',obj,'class','stressbalance','fieldname','isnewton','format','Integer');
+ 			WriteData(fid,'object',obj,'class','stressbalance','fieldname','FSreconditioning','format','Double');
+ 			WriteData(fid,'object',obj,'class','stressbalance','fieldname','viscosity_overshoot','format','Double');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18619-18620.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18619-18620.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18619-18620.diff	(revision 19102)
@@ -0,0 +1,178 @@
+Index: ../trunk-jpl/test/Archives/Archive432.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive431.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.h	(revision 18619)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.h	(revision 18620)
+@@ -50,8 +50,6 @@
+ 		static void UpdateBasalConstraints(Element* element);
+ 		static void UpdateBasalConstraintsTransient(Element* element);
+ 		static void UpdateBasalConstraintsSteadystate(Element* element);
+-// 		static int GetThermalBasalCondition(Element* element, Gauss* gauss, Gauss* gaussup, int enthalpy_enum);
+-// 		static int GetThermalBasalCondition(Element* element, GaussPenta* gauss, GaussPenta* gaussup, int enthalpy_enum);
+ 		static int GetThermalBasalCondition(Element* element, IssmDouble enthalpy, IssmDouble enthalpy_up, IssmDouble pressure, IssmDouble pressure_up, IssmDouble watercolumn, IssmDouble meltingrate);
+ 		static IssmDouble GetWetIceConductivity(Element* element, IssmDouble enthalpy, IssmDouble pressure);
+ 
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18619)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18620)
+@@ -1184,6 +1184,7 @@
+ 		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		UpdateBasalConstraints(element);
+ 	}
++	femmodel->UpdateConstraintsx();
+ }/*}}}*/
+ void EnthalpyAnalysis::UpdateBasalConstraints(Element* element){/*{{{*/
+ 
+@@ -1393,29 +1394,16 @@
+ 	/*Get parameters and inputs: */
+ 	element->FindParam(&dt,TimesteppingTimeStepEnum);
+ 
+-	if(dt==0.){ // steadystate case
+-		state=0; //TODO: add consistent steadystate basal condition scheme
+-// 		if(enthalpy<PureIceEnthalpy(element,pressure)){ /*is base cold?*/
+-// 			if(watercolumn<=0.) state=0; // cold, dry base
+-// 			else state=1; // cold, wet base (refreezing)
+-// 		}
+-// 		else{ /*base is temperate, check if upper node is temperate, too.*/
+-// 			if(enthalpyup<PureIceEnthalpy(element,pressureup))
+-// 				if(meltingrate<0.)	state=2; // refreezing temperate base (non-physical, only for steadystate solver)
+-// 				else						state=3; // melting temperate base with no temperate layer
+-// 			else
+-// 				state=4; // melting temperate base with temperate layer of positive thickness
+-// 		}
++	if(enthalpy<PureIceEnthalpy(element,pressure)){
++		if(watercolumn<=0.) state=0; // cold, dry base
++		else state=1; // cold, wet base (refreezing)
+ 	}
+-	else{ // transient case
+-		if(enthalpy<PureIceEnthalpy(element,pressure)){
+-			if(watercolumn<=0.) state=0; // cold, dry base
+-			else state=1; // cold, wet base (refreezing)
++	else{
++		if(enthalpyup<PureIceEnthalpy(element,pressureup)){
++			if((dt==0.) && (meltingrate<0.)) state=2;	// refreezing temperate base (non-physical, only for steadystate solver)
++			else	state=3; // temperate base, but no temperate layer
+ 		}
+-		else{
+-			if(enthalpyup<PureIceEnthalpy(element,pressureup))	state=3; // temperate base, but no temperate layer
+-			else state=4; // temperate layer with positive thickness
+-		}
++		else state=4; // temperate layer with positive thickness
+ 	}
+ 
+ 	_assert_(state>=0);
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp	(revision 18619)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp	(revision 18620)
+@@ -49,7 +49,7 @@
+ 		femmodel->parameters->FindParam(&eps_rel,ThermalReltolEnum);
+ 		femmodel->UpdateConstraintsx();
+ 
+-		//Update the solution to make sure that vx and vxold are similar (for next step in transient or steadystate)
++		//Update the solution to make sure that tf and tf_old are similar (for next step in transient or steadystate)
+ 		GetSolutionFromInputsx(&tg,femmodel);
+ 		Reducevectorgtofx(&tf, tg, femmodel->nodes,femmodel->parameters);
+ 		InputUpdateFromSolutionx(femmodel,tg);
+@@ -64,10 +64,14 @@
+ 	
+ 	for(;;){
+ 		delete tf_old;tf_old=tf;
+-		delete tg;
+ 
+-		if(isenthalpy) SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel);
++		if(isenthalpy){ 
++			SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel);
++			/*Update old solution, such that sizes of tf_old and tf are comparable*/
++			if(isdynamicbasalspc)	Reducevectorgtofx(&tf_old, tg, femmodel->nodes,femmodel->parameters);
++		}
+ 		else SystemMatricesx(&Kff, &Kfs, &pf,&df, &melting_offset,femmodel);
++		delete tg;
+ 		CreateNodalConstraintsx(&ys,femmodel->nodes,configuration_type);
+ 		Reduceloadx(pf, Kfs, ys); delete Kfs;
+ 		Solverx(&tf, Kff, pf, tf_old, df, femmodel->parameters);
+@@ -81,31 +85,32 @@
+ 		ConstraintsStatex(&constraints_converged,&num_unstable_constraints,femmodel);
+ 		if(VerboseConvergence()) _printf0_("   number of unstable constraints: " << num_unstable_constraints << "\n");
+ 
+-		if(isenthalpy){
+-			/*Increase count: */
++		if(isenthalpy){ // enthalpy method
++			IssmDouble dt;
++			femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
++
+ 			count++;
+-			if(converged==true){
+-				bool max_iteration_state=false;
+-				int step; IssmDouble time;
+-				femmodel->parameters->FindParam(&time,TimeEnum);
+-				femmodel->parameters->FindParam(&step,StepEnum);
+-				femmodel->results->AddObject(new GenericExternalResult<bool>(femmodel->results->Size()+1, MaxIterationConvergenceFlagEnum, max_iteration_state, step, time));
+-				break;
+-			}
++			bool max_iteration_state=false;
+ 			if(count>=thermal_maxiter){
+ 				_printf0_("   maximum number of nonlinear iterations (" << thermal_maxiter << ") exceeded\n"); 
+ 				converged=true;
+ 				InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
+ 				InputUpdateFromSolutionx(femmodel,tg);		
+-				bool max_iteration_state=true;
++				max_iteration_state=true;
++			}
++			if(converged==true){
+ 				int step; IssmDouble time;
+ 				femmodel->parameters->FindParam(&time,TimeEnum);
+ 				femmodel->parameters->FindParam(&step,StepEnum);
+ 				femmodel->results->AddObject(new GenericExternalResult<bool>(femmodel->results->Size()+1, MaxIterationConvergenceFlagEnum, max_iteration_state, step, time));
+ 				break;
+ 			}
++			else if(dt==0.){
++				EnthalpyAnalysis::ComputeBasalMeltingrate(femmodel);
++				EnthalpyAnalysis::UpdateBasalConstraints(femmodel);
++			}
+ 		}
+-		else{
++		else{ // dry ice method
+ 			if(!converged){
+ 				if(num_unstable_constraints<=thermal_penalty_threshold) converged=true;
+ 				if(count>=thermal_maxiter){
+Index: ../trunk-jpl/src/m/classes/thermal.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/thermal.py	(revision 18619)
++++ ../trunk-jpl/src/m/classes/thermal.py	(revision 18620)
+@@ -94,9 +94,8 @@
+ 			md = checkfield(md,'fieldname','thermal.isdynamicbasalspc','numel',[1],'values',[0,1]);
+ 			if(md.thermal.isenthalpy):
+ 				if numpy.isnan(md.stressbalance.reltol):
+-					md.checkmessage("for a steadystate computation, stressbalance.reltol (relative convergence criterion) must be defined!")
++					md.checkmessage("for a steadystate computation, thermal.reltol (relative convergence criterion) must be defined!")
+ 				md = checkfield(md,'fieldname','thermal.reltol','>',0.,'message',"reltol must be larger than zero");
+-				md = checkfield(md,'fieldname','thermal.isdynamicbasalspc','numel', [1],'values',[1], 'message',"for enthalpy run thermal.isdynamicbasalspc should be true")
+ 		md = checkfield(md,'fieldname','thermal.requested_outputs','stringrow',1)
+ 
+ 		return md
+Index: ../trunk-jpl/src/m/classes/thermal.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/thermal.m	(revision 18619)
++++ ../trunk-jpl/src/m/classes/thermal.m	(revision 18620)
+@@ -99,10 +99,9 @@
+ 				md = checkfield(md,'fieldname','thermal.isdynamicbasalspc','numel', [1],'values',[0 1]);
+ 				if(md.thermal.isenthalpy)
+ 					if isnan(md.stressbalance.reltol),
+-						md = checkmessage(md,['for a steadystate computation, stressbalance.reltol (relative convergence criterion) must be defined!']);
+-					end
++						md = checkmessage(md,['for a steadystate computation, thermal.reltol (relative convergence criterion) must be defined!']);
++					end 
+ 					md = checkfield(md,'fieldname','thermal.reltol','>',0.,'message','reltol must be larger than zero');
+-					md = checkfield(md,'fieldname','thermal.isdynamicbasalspc','numel', [1],'values',[1], 'message',['for enthalpy run thermal.isdynamicbasalspc should be 1']);
+ 				end
+ 	    end
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18620-18621.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18620-18621.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18620-18621.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp	(revision 18620)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp	(revision 18621)
+@@ -39,7 +39,6 @@
+ 	femmodel->parameters->FindParam(&isenthalpy,ThermalIsenthalpyEnum);
+ 	femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
+ 	femmodel->parameters->FindParam(&thermal_maxiter,ThermalMaxiterEnum);
+-	femmodel->parameters->FindParam(&eps_rel,ThermalReltolEnum);
+ 
+ 	converged=false;
+ 	InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18621-18622.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18621-18622.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18621-18622.diff	(revision 19102)
@@ -0,0 +1,58 @@
+Index: ../trunk-jpl/test/Archives/Archive437.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive432.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive436.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18621)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18622)
+@@ -561,6 +561,7 @@
+ 	/* implementation of the basal condition decision chart of Aschwanden 2012, Fig.5 */
+ 	if(!element->IsOnBase() || element->IsFloating()) return NULL;
+ 
++	bool isdynamicbasalspc;
+ 	int i, state;
+ 	IssmDouble  dt,Jdet,scalar;
+ 	IssmDouble	enthalpy, enthalpyup, pressure, pressureup, watercolumn, meltingrate;
+@@ -578,6 +579,7 @@
+ 	/*Retrieve all inputs and parameters*/
+ 	element->GetVerticesCoordinatesBase(&xyz_list_base);
+ 	element->FindParam(&dt,TimesteppingTimeStepEnum);
++	element->FindParam(&isdynamicbasalspc,ThermalIsdynamicbasalspcEnum);
+ 	Input* vx_input             = element->GetInput(VxEnum);                          _assert_(vx_input);
+ 	Input* vy_input             = element->GetInput(VyEnum);                          _assert_(vy_input);
+ 	Input* vz_input             = element->GetInput(VzEnum);                          _assert_(vz_input);
+@@ -600,14 +602,18 @@
+ 		element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
+ 		element->NodalFunctions(basis,gauss);
+ 
+-		enthalpy_input->GetInputValue(&enthalpy,gauss);
+-		enthalpy_input->GetInputValue(&enthalpyup,gaussup);
+-		pressure_input->GetInputValue(&pressure,gauss);
+-		pressure_input->GetInputValue(&pressureup,gaussup);
+-		watercolumn_input->GetInputValue(&watercolumn,gauss);
+-		meltingrate_input->GetInputValue(&meltingrate,gauss);
++		if(isdynamicbasalspc){
++			enthalpy_input->GetInputValue(&enthalpy,gauss);
++			enthalpy_input->GetInputValue(&enthalpyup,gaussup);
++			pressure_input->GetInputValue(&pressure,gauss);
++			pressure_input->GetInputValue(&pressureup,gaussup);
++			watercolumn_input->GetInputValue(&watercolumn,gauss);
++			meltingrate_input->GetInputValue(&meltingrate,gauss);
++			state=GetThermalBasalCondition(element, enthalpy, enthalpyup, pressure, pressureup, watercolumn, meltingrate);
++		}
++		else
++			state=0;
+ 
+-		state=GetThermalBasalCondition(element, enthalpy, enthalpyup, pressure, pressureup, watercolumn, meltingrate);
+ 		switch (state) {
+ 			case 0:
+ 				// cold, dry base: apply basal surface forcing
Index: /issm/oecreview/Archive/18296-19100/ISSM-18622-18623.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18622-18623.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18622-18623.diff	(revision 19102)
@@ -0,0 +1,16 @@
+Index: ../trunk-jpl/src/m/classes/initialization.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/initialization.m	(revision 18622)
++++ ../trunk-jpl/src/m/classes/initialization.m	(revision 18623)
+@@ -129,9 +129,9 @@
+ 
+ 			if md.thermal.isenthalpy,
+ 				tpmp = md.materials.meltingpoint - md.materials.beta*md.initialization.pressure;
+-				pos  = find(md.initialization.temperature>tpmp);
++				pos  = find(md.initialization.temperature>=tpmp);
+ 				enthalpy      = md.materials.heatcapacity*(md.initialization.temperature-md.constants.referencetemperature);
+-				enthalpy(pos) = md.materials.heatcapacity*tpmp(pos) - md.constants.referencetemperature + md.materials.latentheat*md.initialization.waterfraction(pos);
++				enthalpy(pos) = md.materials.heatcapacity*(tpmp(pos) - md.constants.referencetemperature) + md.materials.latentheat*md.initialization.waterfraction(pos);
+ 				WriteData(fid,'data',enthalpy,'format','DoubleMat','mattype',1,'enum',EnthalpyEnum());
+ 			end
+ 		end % }}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18623-18624.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18623-18624.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18623-18624.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18623)
++++ ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18624)
+@@ -100,6 +100,7 @@
+ 	/*Retrieve all inputs and parameters*/
+ 	element->GetVerticesCoordinates(&xyz_list);
+ 	element->FindParam(&dt,TimesteppingTimeStepEnum);
++	element->FindParam(&rho_ocean,BasalforcingsRhoOceanEnum);
+ 	element->FindParam(&ocean_coef,BasalforcingsOceanCoefEnum);
+ 	element->FindParam(&ocean_lin_drag_coef,BasalforcingsOceanLinDragCoefEnum);
+ 	element->FindParam(&ocean_quad_drag_coef,BasalforcingsOceanQuadDragCoefEnum);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18624-18625.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18624-18625.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18624-18625.diff	(revision 19102)
@@ -0,0 +1,9 @@
+Index: ../trunk-jpl/externalpackages/triangle/install-win7.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/triangle/install-win7.sh	(revision 18624)
++++ ../trunk-jpl/externalpackages/triangle/install-win7.sh	(revision 18625)
+@@ -22,3 +22,4 @@
+ 
+ #Patch triangle.h
+ patch triangle.h ../triangle.h.patch
++cat triangle.h
Index: /issm/oecreview/Archive/18296-19100/ISSM-18625-18626.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18625-18626.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18625-18626.diff	(revision 19102)
@@ -0,0 +1,9 @@
+Index: ../trunk-jpl/externalpackages/metis/install-4.0-win7.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/metis/install-4.0-win7.sh	(revision 18625)
++++ ../trunk-jpl/externalpackages/metis/install-4.0-win7.sh	(revision 18626)
+@@ -23,3 +23,4 @@
+ 
+ #Compile
+ make
++ls lib/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18626-18627.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18626-18627.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18626-18627.diff	(revision 19102)
@@ -0,0 +1,9 @@
+Index: ../trunk-jpl/externalpackages/metis/install-4.0-win7.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/metis/install-4.0-win7.sh	(revision 18626)
++++ ../trunk-jpl/externalpackages/metis/install-4.0-win7.sh	(revision 18627)
+@@ -23,4 +23,3 @@
+ 
+ #Compile
+ make
+-ls lib/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18627-18628.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18627-18628.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18627-18628.diff	(revision 19102)
@@ -0,0 +1,84 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-win7.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-win7.sh	(revision 0)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-win7.sh	(revision 18628)
+@@ -0,0 +1,41 @@
++#!/bin/bash
++set -eu
++
++#Some cleanup
++rm -rf install petsc-3.5.1 src
++mkdir install src
++
++#Download from ISSM server
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-3.5.1.tar.gz' 'petsc-3.5.1.tar.gz'
++
++#Untar and move petsc to install directory
++tar -zxvf  petsc-3.5.1.tar.gz
++mv petsc-3.5.1/* src/
++rm -rf petsc-3.5.1
++
++export PETSC_DIR=`cygpath -u "$ISSM_DIR/externalpackages/petsc/src"`
++export PREFIX_DIR=`cygpath -u "$ISSM_DIR/externalpackages/petsc/install"`
++
++#configure
++cd src
++./config/configure.py  \
++	--with-parallel-no \
++	--prefix=$PREFIX_DIR \
++	--PETSC_ARCH=cygwin-intel \
++	--PETSC_DIR=$PETSC_DIR \
++	--with-mpi=0 \
++	--with-debugging=0 \
++	--with-valgrind=0 \
++	--with-x=0 \
++	--with-ssl=0 \
++	--download-c-blas-lapack=yes \
++	--with-cc='win32fe cl' \
++	--with-fc=0 \
++	--with-cxx='win32fe cl' \
++	--with-clanguage=cxx 
++
++#Compile petsc and install it
++make
++make install
++
++#patch ../install/include/petscfix.h ../configs/3.1/win7/petscfix.h.patch
+
+Property changes on: ../trunk-jpl/externalpackages/petsc/install-3.5-win7.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/jenkins/windows
+===================================================================
+--- ../trunk-jpl/jenkins/windows	(revision 18627)
++++ ../trunk-jpl/jenkins/windows	(revision 18628)
+@@ -10,7 +10,7 @@
+ 	--with-vendor=intel-win7-64  \
+ 	--with-matlab-dir=""$ISSM_DIR/externalpackages/matlab/install"" \
+ 	--with-triangle-dir="$ISSM_DIR/externalpackages/triangle/install" \
+-	--with-metis-dir="$ISSM_DIR/externalpackages/metis/install" \
++	--with-metis-dir="$ISSM_DIR/externalpackages/petsc/install" \
+ 	--with-petsc-dir="$ISSM_DIR/externalpackages/petsc/install" \
+ 	--with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install/lib/  \
+ 	--with-mpi-libdir="$ISSM_DIR/externalpackages/petsc/install/lib" \
+@@ -44,8 +44,9 @@
+ EXTERNALPACKAGESDIR=$ISSM_DIR/externalpackages
+ 
+ #List of external pakages to be installed and their installation scripts
+-EXTERNALPACKAGES=" cccl install-win7.sh
+-						petsc     install-3.1-win7.sh
++EXTERNALPACKAGES="cccl      install-win7.sh
++						cmake     install.sh                
++						petsc     install-3.5-win7.sh
+ 						triangle  install-win7.sh        
+ 						matlab install.sh
+ 						metis install-4.0-win7.sh
+@@ -79,5 +80,3 @@
+ #In Windows, we don't yet have MUMPS, can't do full stokes, so exclude all FS runs. Also exclude all runs with Dakota. And exclude higher order runs that have penalties. And 800+ tests because we don't want to have --with-development since we do the binaries with this version
+ MATLAB_NROPTIONS="'exclude',[104, 124, 204, 211, 215, 220, 221, 285, 290, 308, 322, 404, 421, 422, 503, 507, 510, 511, 701, 702, 703, 218, 234, 235, 412, 413, 414, 417, 418, 420, 205, 274, 331, 405, 409, 455, 612, 514, 435, 280,801,802,803,804,805,291]"
+ PYTHON_NROPTIONS=""
+-
+-
Index: /issm/oecreview/Archive/18296-19100/ISSM-18628-18629.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18628-18629.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18628-18629.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-win7.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-win7.sh	(revision 18628)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-win7.sh	(revision 18629)
+@@ -6,7 +6,7 @@
+ mkdir install src
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-3.5.1.tar.gz' 'petsc-3.5.1.tar.gz'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.1.tar.gz' 'petsc-3.5.1.tar.gz'
+ 
+ #Untar and move petsc to install directory
+ tar -zxvf  petsc-3.5.1.tar.gz
Index: /issm/oecreview/Archive/18296-19100/ISSM-18629-18630.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18629-18630.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18629-18630.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-win7.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-win7.sh	(revision 18629)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-win7.sh	(revision 18630)
+@@ -28,7 +28,7 @@
+ 	--with-valgrind=0 \
+ 	--with-x=0 \
+ 	--with-ssl=0 \
+-	--download-c-blas-lapack=yes \
++	--download-f2cblaslapack=yes \
+ 	--with-cc='win32fe cl' \
+ 	--with-fc=0 \
+ 	--with-cxx='win32fe cl' \
Index: /issm/oecreview/Archive/18296-19100/ISSM-18630-18631.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18630-18631.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18630-18631.diff	(revision 19102)
@@ -0,0 +1,208 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh	(revision 18630)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh	(revision 18631)
+@@ -6,16 +6,16 @@
+ #default:openmpi_intel-1.5.4_psm
+ 
+ #Some cleanup
+-rm -rf install petsc-3.5.1 src
++rm -rf install petsc-3.5.2 src
+ mkdir install src
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.1.tar.gz' 'petsc-3.5.1.tar.gz'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
+ 
+ #Untar and move petsc to install directory
+-tar -zxvf  petsc-3.5.1.tar.gz
+-mv petsc-3.5.1/* src/
+-rm -rf petsc-3.5.1
++tar -zxvf  petsc-3.5.2.tar.gz
++mv petsc-3.5.2/* src/
++rm -rf petsc-3.5.2
+ 
+ #configure
+ cd src
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh	(revision 18630)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh	(revision 18631)
+@@ -2,16 +2,16 @@
+ set -eu
+ 
+ #Some cleanup
+-rm -rf install petsc-3.5.1 src
++rm -rf install petsc-3.5.2 src
+ mkdir install src
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.1.tar.gz' 'petsc-3.5.1.tar.gz'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
+ 
+ #Untar and move petsc to install directory
+-tar -zxvf  petsc-3.5.1.tar.gz
+-mv petsc-3.5.1/* src/
+-rm -rf petsc-3.5.1
++tar -zxvf  petsc-3.5.2.tar.gz
++mv petsc-3.5.2/* src/
++rm -rf petsc-3.5.2
+ 
+ #configure
+ cd src
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-linux64.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-linux64.sh	(revision 18630)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-linux64.sh	(revision 18631)
+@@ -2,16 +2,16 @@
+ set -eu
+ 
+ #Some cleanup
+-rm -rf install petsc-3.5.1 src
++rm -rf install petsc-3.5.2 src
+ mkdir install src
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.1.tar.gz' 'petsc-3.5.1.tar.gz'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
+ 
+ #Untar and move petsc to install directory
+-tar -zxvf  petsc-3.5.1.tar.gz
+-mv petsc-3.5.1/* src/
+-rm -rf petsc-3.5.1
++tar -zxvf  petsc-3.5.2.tar.gz
++mv petsc-3.5.2/* src/
++rm -rf petsc-3.5.2
+ 
+ #configure
+ cd src
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-win7.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-win7.sh	(revision 18630)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-win7.sh	(revision 18631)
+@@ -2,16 +2,16 @@
+ set -eu
+ 
+ #Some cleanup
+-rm -rf install petsc-3.5.1 src
++rm -rf install petsc-3.5.2 src
+ mkdir install src
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.1.tar.gz' 'petsc-3.5.1.tar.gz'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
+ 
+ #Untar and move petsc to install directory
+-tar -zxvf  petsc-3.5.1.tar.gz
+-mv petsc-3.5.1/* src/
+-rm -rf petsc-3.5.1
++tar -zxvf  petsc-3.5.2.tar.gz
++mv petsc-3.5.2/* src/
++rm -rf petsc-3.5.2
+ 
+ export PETSC_DIR=`cygpath -u "$ISSM_DIR/externalpackages/petsc/src"`
+ export PREFIX_DIR=`cygpath -u "$ISSM_DIR/externalpackages/petsc/install"`
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh	(revision 18630)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh	(revision 18631)
+@@ -2,16 +2,16 @@
+ set -eu
+ 
+ #Some cleanup
+-rm -rf install petsc-3.5.1 src
++rm -rf install petsc-3.5.2 src
+ mkdir install src
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.1.tar.gz' 'petsc-3.5.1.tar.gz'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
+ 
+ #Untar and move petsc to install directory
+-tar -zxvf  petsc-3.5.1.tar.gz
+-mv petsc-3.5.1/* src/
+-rm -rf petsc-3.5.1
++tar -zxvf  petsc-3.5.2.tar.gz
++mv petsc-3.5.2/* src/
++rm -rf petsc-3.5.2
+ 
+ #configure
+ cd src
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-linux64-static.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-linux64-static.sh	(revision 18630)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-linux64-static.sh	(revision 18631)
+@@ -2,16 +2,16 @@
+ set -eu
+ 
+ #Some cleanup
+-rm -rf install petsc-3.5.1 src
++rm -rf install petsc-3.5.2 src
+ mkdir install src
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.1.tar.gz' 'petsc-3.5.1.tar.gz'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
+ 
+ #Untar and move petsc to install directory
+-tar -zxvf  petsc-3.5.1.tar.gz
+-mv petsc-3.5.1/* src/
+-rm -rf petsc-3.5.1
++tar -zxvf  petsc-3.5.2.tar.gz
++mv petsc-3.5.2/* src/
++rm -rf petsc-3.5.2
+ 
+ #configure
+ cd src
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh	(revision 18630)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh	(revision 18631)
+@@ -2,16 +2,16 @@
+ set -eu
+ 
+ #Some cleanup
+-rm -rf install petsc-3.5.1 src
++rm -rf install petsc-3.5.2 src
+ mkdir install src
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.1.tar.gz' 'petsc-3.5.1.tar.gz'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
+ 
+ #Untar and move petsc to install directory
+-tar -zxvf  petsc-3.5.1.tar.gz
+-mv petsc-3.5.1/* src/
+-rm -rf petsc-3.5.1
++tar -zxvf  petsc-3.5.2.tar.gz
++mv petsc-3.5.2/* src/
++rm -rf petsc-3.5.2
+ 
+ #configure
+ cd src
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh	(revision 18630)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh	(revision 18631)
+@@ -2,16 +2,16 @@
+ set -eu
+ 
+ #Some cleanup
+-rm -rf install petsc-3.5.1 src
++rm -rf install petsc-3.5.2 src
+ mkdir install src
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.1.tar.gz' 'petsc-3.5.1.tar.gz'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
+ 
+ #Untar and move petsc to install directory
+-tar -zxvf  petsc-3.5.1.tar.gz
+-mv petsc-3.5.1/* src/
+-rm -rf petsc-3.5.1
++tar -zxvf  petsc-3.5.2.tar.gz
++mv petsc-3.5.2/* src/
++rm -rf petsc-3.5.2
+ 
+ #configure
+ cd src
Index: /issm/oecreview/Archive/18296-19100/ISSM-18631-18632.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18631-18632.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18631-18632.diff	(revision 19102)
@@ -0,0 +1,10 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-win7.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-win7.sh	(revision 18631)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-win7.sh	(revision 18632)
+@@ -38,4 +38,4 @@
+ make
+ make install
+ 
+-#patch ../install/include/petscfix.h ../configs/3.1/win7/petscfix.h.patch
++patch ../install/include/petscfix.h ../configs/3.1/win7/petscfix.h.patch
Index: /issm/oecreview/Archive/18296-19100/ISSM-18632-18633.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18632-18633.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18632-18633.diff	(revision 19102)
@@ -0,0 +1,481 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18632)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18633)
+@@ -157,10 +157,10 @@
+ 	/*Retrieve all inputs and parameters*/
+ 	basalelement->GetVerticesCoordinates(&xyz_list);
+ 	basalelement->FindParam(&dt,TimesteppingTimeStepEnum);
+-	Input* thickness_input = basalelement->GetInput(HydrologydcEplThicknessEnum);          _assert_(thickness_input);
++
++	Input* epl_thick_input = basalelement->GetInput(HydrologydcEplThicknessEnum); _assert_(epl_thick_input);
+ 	Input* sed_head_input  = basalelement->GetInput(SedimentHeadEnum);
+ 	Input* epl_head_input  = basalelement->GetInput(EplHeadEnum);
+-	Input* sed_trans_input = basalelement->GetInput(HydrologydcSedimentTransmitivityEnum);
+ 	Input* residual_input  = basalelement->GetInput(SedimentHeadResidualEnum);
+ 
+ 	IssmDouble epl_specificstoring   = EplSpecificStoring(basalelement);
+@@ -171,7 +171,7 @@
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 		gauss           ->GaussPoint(ig);
+ 		basalelement    ->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		thickness_input ->GetInputValue(&epl_thickness,gauss);
++		epl_thick_input ->GetInputValue(&epl_thickness,gauss);
+ 
+ 		/*Diffusivity*/
+ 		D_scalar=epl_conductivity*epl_thickness*gauss->weight*Jdet;
+@@ -194,7 +194,7 @@
+ 						&Ke->values[0],1);
+ 			
+ 			/*Transfer EPL part*/
+-			transfer=GetHydrologyKMatrixTransfer(basalelement,gauss,thickness_input,sed_head_input,epl_head_input,sed_trans_input,residual_input);
++			transfer=GetHydrologyKMatrixTransfer(basalelement,gauss,sed_head_input,epl_head_input,residual_input);
+ 			D_scalar=transfer*gauss->weight*Jdet*dt;
+ 			TripleMultiply(basis,numnodes,1,0,
+ 										 &D_scalar,1,1,0,
+@@ -265,11 +265,10 @@
+ 	basalelement->GetVerticesCoordinates(&xyz_list);
+ 	basalelement->FindParam(&dt,TimesteppingTimeStepEnum);	
+ 
+-	Input* thickness_input = basalelement->GetInput(HydrologydcEplThicknessEnum); _assert_(thickness_input);
+-	Input* sed_head_input  = basalelement->GetInput(SedimentHeadEnum);
+-	Input* epl_head_input  = basalelement->GetInput(EplHeadEnum);
+-	Input* sed_trans_input = basalelement->GetInput(HydrologydcSedimentTransmitivityEnum);
+-	Input* residual_input  = basalelement->GetInput(SedimentHeadResidualEnum);    _assert_(residual_input);
++	Input* epl_thick_input   = basalelement->GetInput(HydrologydcEplThicknessEnum); _assert_(epl_thick_input);
++	Input* sed_head_input    = basalelement->GetInput(SedimentHeadEnum);
++	Input* epl_head_input    = basalelement->GetInput(EplHeadEnum);
++	Input* residual_input    = basalelement->GetInput(SedimentHeadResidualEnum);    _assert_(residual_input);
+ 	if(dt!= 0.){old_wh_input = basalelement->GetInput(EplHeadOldEnum);            _assert_(old_wh_input);}
+ 
+ 	IssmDouble epl_specificstoring = EplSpecificStoring(basalelement);
+@@ -285,10 +284,10 @@
+ 		/*Transient and transfer terms*/
+ 		if(dt!=0.){
+ 			old_wh_input    ->GetInputValue(&water_head,gauss);
+-			thickness_input ->GetInputValue(&epl_thickness,gauss);
++			epl_thick_input ->GetInputValue(&epl_thickness,gauss);
+ 			
+ 			/*Dealing with the epl part of the transfer term*/
+-			transfer=GetHydrologyPVectorTransfer(basalelement,gauss,thickness_input,sed_head_input,epl_head_input,sed_trans_input,residual_input);
++			transfer=GetHydrologyPVectorTransfer(basalelement,gauss,sed_head_input,epl_head_input,residual_input);
+ 			scalar = Jdet*gauss->weight*((water_head*epl_specificstoring*epl_thickness)+(transfer*dt));
+ 			for(int i=0;i<numnodes;i++)pe->values[i]+=scalar*basis[i];
+ 		}
+@@ -321,6 +320,7 @@
+ }/*}}}*/
+ void HydrologyDCEfficientAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
++	bool active_element;
+ 	int domaintype,i;
+ 	Element*   basalelement=NULL;
+ 
+@@ -340,20 +340,36 @@
+ 	/*Fetch number of nodes for this finite element*/
+ 	int numnodes = basalelement->GetNumberOfNodes();
+ 
++
+ 	/*Fetch dof list and allocate solution vector*/
+-	basalelement->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
++	IssmDouble* sedhead     = xNew<IssmDouble>(numnodes);
+ 	IssmDouble* eplHeads    = xNew<IssmDouble>(numnodes);
+ 
+-	/*Use the dof list to index into the solution vector: */
++	basalelement->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
++	basalelement->GetInputListOnVertices(&sedhead[0],SedimentHeadEnum);
++
++	Input* active_element_input=basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input);
++	active_element_input->GetInputValue(&active_element);
++
++	/* if(!active_element){ */
++	/* 	/\*Keeping thickness to initial value if EPL is not active*\/ */
++	/* 	for(i=0;i<numnodes;i++){ */
++	/* 		eplHeads[i]=sedhead[i]; */
++	/* 	} */
++	/* } */
++	/* else{ */
++		/*Use the dof list to index into the solution vector: */
+ 	for(i=0;i<numnodes;i++){
+ 		eplHeads[i]=solution[doflist[i]];
+ 		if(xIsNan<IssmDouble>(eplHeads[i])) _error_("NaN found in solution vector");
+ 	}
++		//	}
+ 	/*Add input to the element: */
+ 	element->AddBasalInput(EplHeadEnum,eplHeads,P1Enum);
+ 
+ 	/*Free ressources:*/
+ 	xDelete<IssmDouble>(eplHeads);
++	xDelete<IssmDouble>(sedhead);
+ 	xDelete<int>(doflist);
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ } /*}}}*/
+@@ -380,19 +396,17 @@
+ 	IssmDouble water_compressibility    = element->GetMaterialParameter(HydrologydcWaterCompressibilityEnum);
+ 	return rho_freshwater*g*sediment_porosity*sediment_thickness*(water_compressibility+(sediment_compressibility/sediment_porosity));		 
+ }/*}}}*/
+-IssmDouble HydrologyDCEfficientAnalysis::GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* epl_thick_input, Input* sed_head_input, Input* epl_head_input, Input* sed_trans_input, Input* residual_input){/*{{{*/
++
++IssmDouble HydrologyDCEfficientAnalysis::GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input){/*{{{*/
+ 	
++
+ 	int transfermethod;
+-	IssmDouble epl_thickness;
+-	IssmDouble epl_head,sed_head;
+-	IssmDouble sediment_transmitivity;
+-	IssmDouble leakage,residual,transfer;
++	IssmDouble epl_thickness,sed_residual;
++	IssmDouble epl_head,sediment_head;
++	IssmDouble leakage,transfer;
+ 
+-	IssmDouble sediment_thickness  = element->GetMaterialParameter(HydrologydcSedimentThicknessEnum);
+-	IssmDouble sediment_storing    = SedimentStoring(element);
+- 	IssmDouble epl_specificstoring = EplSpecificStoring(element);		
++	element->FindParam(&transfermethod,HydrologydcTransferFlagEnum);
+ 
+-	element->FindParam(&transfermethod,HydrologydcTransferFlagEnum);
+ 	/*Switch between the different transfer methods cases*/
+ 	switch(transfermethod){
+ 	case 0:
+@@ -400,39 +414,45 @@
+ 		transfer=0.0;
+ 		break;
+ 	case 1:
+-		_assert_(epl_thick_input); 
+-		_assert_(sed_head_input); 
+-		_assert_(epl_head_input); 
+-		_assert_(sed_trans_input); 
+-		_assert_(residual_input); 
+-		/* get input */
+-		epl_thick_input->GetInputValue(&epl_thickness,gauss);
+-		sed_head_input->GetInputValue(&sed_head,gauss);
++		_assert_(sed_head_input);
++		_assert_(epl_head_input);
++		_assert_(residual_input);
++		
++		sed_head_input->GetInputValue(&sediment_head,gauss);
+ 		epl_head_input->GetInputValue(&epl_head,gauss);
+-		sed_trans_input->GetInputValue(&sediment_transmitivity,gauss);
+-		residual_input->GetInputValue(&residual,gauss);
++		residual_input->GetInputValue(&sed_residual,gauss);
+ 		element->FindParam(&leakage,HydrologydcLeakageFactorEnum);
+-		transfer=(sediment_transmitivity)/(sediment_thickness*leakage); 
++		
++		if(epl_head>sediment_head){  
++			if(sed_residual>0.0){
++				transfer=0.0;
++			}
++			else{
++				transfer=(leakage);
++			}
++		}
++		else{ 
++			transfer=(leakage);
++		}
+ 		break;
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
+ 	}
+-	
++	if(element->Id()==42){
++		printf("Transferefficient Kmat %e, %e, %e, %i \n",transfer,sediment_head,epl_head,element->Id());
++	}
+ 	return transfer;
+ }/*}}}*/
+-IssmDouble HydrologyDCEfficientAnalysis::GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* epl_thick_input, Input* sed_head_input, Input* epl_head_input, Input* sed_trans_input, Input* residual_input){/*{{{*/
+ 
++IssmDouble HydrologyDCEfficientAnalysis::GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input){/*{{{*/
++
+ 	int transfermethod;
+-	IssmDouble epl_thickness;
++	IssmDouble sed_residual;
+ 	IssmDouble epl_head,sediment_head;
+-	IssmDouble sediment_transmitivity;
+-	IssmDouble leakage,residual,transfer;
++	IssmDouble leakage,transfer;
+ 
+-	IssmDouble sediment_thickness = element->GetMaterialParameter(HydrologydcSedimentThicknessEnum);
+-	IssmDouble sediment_storing   = SedimentStoring(element);
+- 	IssmDouble epl_specificstoring = EplSpecificStoring(element);		
++	element->FindParam(&transfermethod,HydrologydcTransferFlagEnum);
+ 
+-	element->FindParam(&transfermethod,HydrologydcTransferFlagEnum);
+ 	/*Switch between the different transfer methods cases*/
+ 	switch(transfermethod){
+ 	case 0:
+@@ -440,24 +460,33 @@
+ 		transfer=0.0;
+ 		break;
+ 	case 1:
+-		_assert_(epl_thick_input); 
+-		_assert_(sed_head_input); 
+-		_assert_(epl_head_input); 
+-		_assert_(sed_trans_input); 
+-		_assert_(residual_input); 
+-		/* get input */
+-		epl_thick_input->GetInputValue(&epl_thickness,gauss);
++		_assert_(sed_head_input);
++		_assert_(epl_head_input);
++		_assert_(residual_input);
++		
+ 		sed_head_input->GetInputValue(&sediment_head,gauss);
+ 		epl_head_input->GetInputValue(&epl_head,gauss);
+-		sed_trans_input->GetInputValue(&sediment_transmitivity,gauss);
+-		residual_input->GetInputValue(&residual,gauss);
++		residual_input->GetInputValue(&sed_residual,gauss);
+ 		element->FindParam(&leakage,HydrologydcLeakageFactorEnum);
+ 
+-		transfer=(sediment_transmitivity*sediment_head)/(sediment_thickness*leakage);
++ 		if(epl_head>sediment_head){  
++			if(sed_residual>0.0){
++				transfer=0.0;
++			}
++			else{
++				transfer=(sediment_head*leakage);
++			}
++		}
++		else{ 
++			transfer=(sediment_head*leakage);
++		}
+ 		break;
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
+ 	}
++	if(element->Id()==42){
++		printf("Transferefficient Pvec %e, %e, %e\n",transfer,sediment_head,epl_head);
++	}
+ 	return transfer;
+ }/*}}}*/
+ 
+@@ -518,7 +547,7 @@
+ 		element->GetInputListOnVertices(&old_thickness[0],HydrologydcEplThicknessOldEnum);
+ 		element->GetInputListOnVertices(&ice_thickness[0],ThicknessEnum);
+ 		element->GetInputListOnVertices(&bed[0],BaseEnum);
+-			
++		
+ 		if(!active_element){
+ 			
+ 			/*Keeping thickness to initial value if EPL is not active*/
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h	(revision 18632)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h	(revision 18633)
+@@ -35,8 +35,8 @@
+ 		void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+ 		IssmDouble EplSpecificStoring(Element* element);
+ 		IssmDouble SedimentStoring(Element* element);
+-		IssmDouble GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* epl_thick_input, Input* sed_head_input, Input* epl_head_input, Input* sed_trans_input, Input* residual_input);
+-		IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* epl_thick_input, Input* sed_head_input, Input* epl_head_input, Input* sed_trans_input, Input* residual_input);
++		IssmDouble GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input);
++		IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input);
+ 		void HydrologyEPLGetMask(Vector<IssmDouble>* vec_mask,Element* element);
+ 		void HydrologyEPLGetActive(Vector<IssmDouble>* active_vec, Element* element);
+ 		void GetHydrologyDCInefficientHmax(IssmDouble* ph_max,Element* element, Node* innode);
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h	(revision 18632)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h	(revision 18633)
+@@ -37,8 +37,8 @@
+ 		IssmDouble EplSpecificStoring(Element* element);
+ 		IssmDouble GetHydrologyDCInefficientHmax(Element* element, Gauss* gauss, Input* thickness_input, Input* base_input);
+ 		void GetHydrologyDCInefficientHmax(IssmDouble* ph_max,Element* element, Node* innode);
+-		IssmDouble GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* epl_thick_input, Input* sed_head_input, Input* epl_head_input, Input* sed_trans_input, Input* thickness_input, Input* base_input);
+-		IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* epl_thick_input, Input* sed_head_input, Input* epl_head_input, Input* sed_trans_input, Input* thickness_input, Input* base_input);
++		IssmDouble GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input);
++		IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input);
+ 		void ElementizeEplMask(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18632)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18633)
+@@ -196,13 +196,11 @@
+ 	basalelement ->GetVerticesCoordinates(&xyz_list);
+ 	basalelement ->FindParam(&dt,TimesteppingTimeStepEnum);
+ 	basalelement ->FindParam(&isefficientlayer,HydrologydcIsefficientlayerEnum);
+-
+-	Input* epl_thick_input   = basalelement->GetInput(HydrologydcEplThicknessEnum);
++	Input* SedTrans_input    = basalelement->GetInput(HydrologydcSedimentTransmitivityEnum); _assert_(SedTrans_input);
+ 	Input* sed_head_input    = basalelement->GetInput(SedimentHeadEnum);
+ 	Input* epl_head_input    = basalelement->GetInput(EplHeadEnum);
+-	Input* thickness_input   = basalelement->GetInput(ThicknessEnum);
+-	Input* base_input         = basalelement->GetInput(BaseEnum);
+-	Input* SedTrans_input    = basalelement->GetInput(HydrologydcSedimentTransmitivityEnum); _assert_(SedTrans_input);
++	Input* residual_input  = basalelement->GetInput(SedimentHeadResidualEnum);
++
+ 	IssmDouble sediment_storing = SedimentStoring(basalelement);
+ 	/*Transfer related Inputs*/
+ 	if(isefficientlayer){
+@@ -239,7 +237,7 @@
+ 			if(isefficientlayer){
+ 				active_element_input->GetInputValue(&active_element);
+ 				if(active_element){
+-					transfer=GetHydrologyKMatrixTransfer(basalelement,gauss,epl_thick_input,sed_head_input,epl_head_input,SedTrans_input,thickness_input,base_input);
++					transfer=GetHydrologyKMatrixTransfer(basalelement,gauss,sed_head_input,epl_head_input,residual_input);
+ 					basalelement->NodalFunctions(&basis[0],gauss);
+ 					D_scalar=transfer*gauss->weight*Jdet*dt;
+ 					TripleMultiply(basis,numnodes,1,0,
+@@ -295,18 +293,16 @@
+ 	ElementVector* pe    = basalelement->NewElementVector();
+ 	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
+ 
++
+ 	/*Retrieve all inputs and parameters*/
+ 	basalelement->GetVerticesCoordinates(&xyz_list);
+ 	basalelement->FindParam(&dt,TimesteppingTimeStepEnum);
+ 	basalelement->FindParam(&isefficientlayer,HydrologydcIsefficientlayerEnum);
+ 
+-	Input* epl_thick_input   = basalelement->GetInput(HydrologydcEplThicknessEnum);
+ 	Input* sed_head_input    = basalelement->GetInput(SedimentHeadEnum);
+ 	Input* epl_head_input    = basalelement->GetInput(EplHeadEnum);
+-	Input* sed_trans_input   = basalelement->GetInput(HydrologydcSedimentTransmitivityEnum);
+-	Input* thickness_input   = basalelement->GetInput(ThicknessEnum);
+-	Input* base_input        = basalelement->GetInput(BaseEnum);
+ 	Input* water_input       = basalelement->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(water_input);
++	Input* residual_input    = basalelement->GetInput(SedimentHeadResidualEnum);
+ 	if(dt!= 0.){old_wh_input = basalelement->GetInput(SedimentHeadOldEnum);                     _assert_(old_wh_input);}
+ 
+ 	IssmDouble sediment_storing    = SedimentStoring(basalelement);
+@@ -341,7 +337,7 @@
+ 				/*Dealing with the sediment part of the transfer term*/
+ 				active_element_input->GetInputValue(&active_element);
+ 				if(active_element){
+-					transfer=GetHydrologyPVectorTransfer(basalelement,gauss,epl_thick_input,sed_head_input,epl_head_input,sed_trans_input,thickness_input,base_input);
++					transfer=GetHydrologyPVectorTransfer(basalelement,gauss,sed_head_input,epl_head_input,residual_input);
+ 				}
+ 				else{
+ 					transfer=0.0;
+@@ -570,19 +566,16 @@
+ 	*ph_max=h_max;
+ }
+ /*}}}*/
+-IssmDouble HydrologyDCInefficientAnalysis::GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* epl_thick_input, Input* sed_head_input, Input* epl_head_input, Input* sed_trans_input, Input* thickness_input, Input* base_input){/*{{{*/
+ 
++IssmDouble HydrologyDCInefficientAnalysis::GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input){/*{{{*/
++
+ 	int transfermethod;
+-	IssmDouble epl_thickness;
+-	IssmDouble epl_head,sed_head;
+-	IssmDouble sediment_transmitivity;
+-	IssmDouble leakage,h_max,transfer;
++	IssmDouble sed_residual;
++	IssmDouble epl_head,sediment_head;
++	IssmDouble leakage,transfer;
+ 
+-	IssmDouble sediment_thickness  = element->GetMaterialParameter(HydrologydcSedimentThicknessEnum);
+-	IssmDouble sediment_storing    = SedimentStoring(element);
+- 	IssmDouble epl_specificstoring = EplSpecificStoring(element);		
++	element->FindParam(&transfermethod,HydrologydcTransferFlagEnum);
+ 
+-	element->FindParam(&transfermethod,HydrologydcTransferFlagEnum);
+ 	/*Switch between the different transfer methods cases*/
+ 	switch(transfermethod){
+ 	case 0:
+@@ -590,42 +583,45 @@
+ 		transfer=0.0;
+ 		break;
+ 	case 1:
+-		
+-		_assert_(epl_thick_input);
+ 		_assert_(sed_head_input);
+ 		_assert_(epl_head_input);
+-		_assert_(sed_trans_input);
+-		_assert_(thickness_input);
+-		_assert_(base_input);
+-
+-		epl_thick_input->GetInputValue(&epl_thickness,gauss);
+-		sed_head_input->GetInputValue(&sed_head,gauss);
++		_assert_(residual_input);
++		
++		sed_head_input->GetInputValue(&sediment_head,gauss);
+ 		epl_head_input->GetInputValue(&epl_head,gauss);
+-		sed_trans_input->GetInputValue(&sediment_transmitivity,gauss);
++		residual_input->GetInputValue(&sed_residual,gauss);
+ 		element->FindParam(&leakage,HydrologydcLeakageFactorEnum);
+ 		
+-		transfer=(sediment_transmitivity)/(sediment_thickness*leakage);
++		if(epl_head>sediment_head){  
++			if(sediment_head>=400.0){
++				transfer=0.0;
++			}
++			else{
++				transfer=(leakage);
++			}
++		}
++		else{ 
++			transfer=(leakage);
++		}		
+ 		break;
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
+ 	}
+-	
++	if(element->Id()==42){
++		printf("TransferInfficient Kmat %e, %e, %e, %i\n",transfer,sediment_head,epl_head,element->Id());
++	}
+ 	return transfer;
+ }/*}}}*/
+ 
+-IssmDouble HydrologyDCInefficientAnalysis::GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* epl_thick_input, Input* sed_head_input, Input* epl_head_input, Input* sed_trans_input, Input* thickness_input, Input* base_input){/*{{{*/
++IssmDouble HydrologyDCInefficientAnalysis::GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input){/*{{{*/
+ 
+ 	int transfermethod;
+-	IssmDouble epl_thickness;
++	IssmDouble sed_residual;
+ 	IssmDouble epl_head,sediment_head;
+-	IssmDouble sediment_transmitivity;
+-	IssmDouble leakage,h_max,transfer;
++	IssmDouble leakage,transfer;
+ 
+-	IssmDouble sediment_thickness = element->GetMaterialParameter(HydrologydcSedimentThicknessEnum);
+-	IssmDouble sediment_storing   = SedimentStoring(element);
+- 	IssmDouble epl_specificstoring = EplSpecificStoring(element);		
++	element->FindParam(&transfermethod,HydrologydcTransferFlagEnum);
+ 
+-	element->FindParam(&transfermethod,HydrologydcTransferFlagEnum);
+ 	/*Switch between the different transfer methods cases*/
+ 	switch(transfermethod){
+ 	case 0:
+@@ -633,25 +629,33 @@
+ 		transfer=0.0;
+ 		break;
+ 	case 1:
+-		
+-		_assert_(epl_thick_input);
+ 		_assert_(sed_head_input);
+ 		_assert_(epl_head_input);
+-		_assert_(sed_trans_input);
+-		_assert_(thickness_input);
+-		_assert_(base_input);
+-
+-		epl_thick_input->GetInputValue(&epl_thickness,gauss);
++		_assert_(residual_input);
++		
+ 		sed_head_input->GetInputValue(&sediment_head,gauss);
+ 		epl_head_input->GetInputValue(&epl_head,gauss);
+-		sed_trans_input->GetInputValue(&sediment_transmitivity,gauss);
++		residual_input->GetInputValue(&sed_residual,gauss);
+ 		element->FindParam(&leakage,HydrologydcLeakageFactorEnum);
+ 
+- 		transfer=(sediment_transmitivity*epl_head)/(sediment_thickness*leakage);
++ 		if(epl_head>sediment_head){  
++			if(sediment_head>=400.0){
++				transfer=0.0;
++			}
++			else{
++				transfer=(epl_head*leakage);
++			}
++		}
++		else{ 
++			transfer=(epl_head*leakage);
++		}
+ 		break;
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
+ 	}
++	if(element->Id()==42){
++		printf("TransferInfficient Pvec %e, %e, %e, %i\n",transfer,sediment_head,epl_head,element->Id());
++	}
+ 	return transfer;
+ }/*}}}*/
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18633-18634.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18633-18634.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18633-18634.diff	(revision 19102)
@@ -0,0 +1,24 @@
+Index: ../trunk-jpl/jenkins/windows
+===================================================================
+--- ../trunk-jpl/jenkins/windows	(revision 18633)
++++ ../trunk-jpl/jenkins/windows	(revision 18634)
+@@ -10,7 +10,6 @@
+ 	--with-vendor=intel-win7-64  \
+ 	--with-matlab-dir=""$ISSM_DIR/externalpackages/matlab/install"" \
+ 	--with-triangle-dir="$ISSM_DIR/externalpackages/triangle/install" \
+-	--with-metis-dir="$ISSM_DIR/externalpackages/petsc/install" \
+ 	--with-petsc-dir="$ISSM_DIR/externalpackages/petsc/install" \
+ 	--with-blas-lapack-dir=$ISSM_DIR/externalpackages/petsc/install/lib/  \
+ 	--with-mpi-libdir="$ISSM_DIR/externalpackages/petsc/install/lib" \
+@@ -46,10 +45,9 @@
+ #List of external pakages to be installed and their installation scripts
+ EXTERNALPACKAGES="cccl      install-win7.sh
+ 						cmake     install.sh                
+-						petsc     install-3.5-win7.sh
++						petsc     install-3.1-win7.sh
+ 						triangle  install-win7.sh        
+ 						matlab install.sh
+-						metis install-4.0-win7.sh
+ 						shell2junit install.sh"
+ 
+ #---------------------#
Index: /issm/oecreview/Archive/18296-19100/ISSM-18634-18635.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18634-18635.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18634-18635.diff	(revision 19102)
@@ -0,0 +1,43 @@
+Index: ../trunk-jpl/jenkins/jenkins.sh
+===================================================================
+--- ../trunk-jpl/jenkins/jenkins.sh	(revision 18634)
++++ ../trunk-jpl/jenkins/jenkins.sh	(revision 18635)
+@@ -196,6 +196,8 @@
+ 
+ #wait until matlab closes
+ if [ "$OS" = "win7" ]; then
++	echo "HERE"
++	ps aux -W | grep MATLAB
+ 	pid=$(ps aux -W | grep MATLAB | awk '{printf("%s\n",MATLAB);}')
+ 
+ 	while [ -n "$pid" ]
+Index: ../trunk-jpl/jenkins/windows
+===================================================================
+--- ../trunk-jpl/jenkins/windows	(revision 18634)
++++ ../trunk-jpl/jenkins/windows	(revision 18635)
+@@ -43,11 +43,11 @@
+ EXTERNALPACKAGESDIR=$ISSM_DIR/externalpackages
+ 
+ #List of external pakages to be installed and their installation scripts
+-EXTERNALPACKAGES="cccl      install-win7.sh
+-						cmake     install.sh                
+-						petsc     install-3.1-win7.sh
+-						triangle  install-win7.sh        
+-						matlab install.sh
++EXTERNALPACKAGES="cccl        install-win7.sh
++						cmake       install.sh                
++						petsc       install-3.1-win7.sh
++						triangle    install-win7.sh        
++						matlab      install.sh
+ 						shell2junit install.sh"
+ 
+ #---------------------#
+@@ -57,7 +57,7 @@
+ #ISSM_COMPILATION can have 2 values:
+ # - "yes" compile ISSM
+ # - "no"  do not compile ISSM
+-ISSM_COMPILATION="yes"
++ISSM_COMPILATION="no"
+ 
+ #------------------------#
+ # 5: Nightly run options #
Index: /issm/oecreview/Archive/18296-19100/ISSM-18635-18636.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18635-18636.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18635-18636.diff	(revision 19102)
@@ -0,0 +1,31 @@
+Index: ../trunk-jpl/jenkins/jenkins.sh
+===================================================================
+--- ../trunk-jpl/jenkins/jenkins.sh	(revision 18635)
++++ ../trunk-jpl/jenkins/jenkins.sh	(revision 18636)
+@@ -191,20 +191,15 @@
+ 	exit
+ EOF
+ 	cd $ISSM_DIR/test/NightlyRun
+-	$MATLAB_PATH/bin/matlab -nojvm -nosplash -r "addpath $ISSM_DIR/src/m/dev; devpath; addpath $ISSM_DIR/nightlylog/; matlab_run$i" -logfile $ISSM_DIR/nightlylog/matlab_log$i.log &
++	if [ "$OS" = "win7" ]; then
++		$MATLAB_PATH/bin/matlab -nojvm -nosplash -r "addpath $ISSM_DIR/src/m/dev; devpath; addpath $ISSM_DIR/nightlylog/; matlab_run$i" -logfile $ISSM_DIR/nightlylog/matlab_log$i.log
++	else
++		$MATLAB_PATH/bin/matlab -nojvm -nosplash -r "addpath $ISSM_DIR/src/m/dev; devpath; addpath $ISSM_DIR/nightlylog/; matlab_run$i" -logfile $ISSM_DIR/nightlylog/matlab_log$i.log &
++	fi
+ done
+ 
+ #wait until matlab closes
+-if [ "$OS" = "win7" ]; then
+-	echo "HERE"
+-	ps aux -W | grep MATLAB
+-	pid=$(ps aux -W | grep MATLAB | awk '{printf("%s\n",MATLAB);}')
+-
+-	while [ -n "$pid" ]
+-	do
+-		pid=$(ps aux -W | grep MATLAB | awk '{printf("%s\n",MATLAB);}')
+-	done
+-else
++if [ "$OS" != "win7" ]; then
+ 	wait
+ fi
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18636-18637.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18636-18637.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18636-18637.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/jenkins/jenkins.sh
+===================================================================
+--- ../trunk-jpl/jenkins/jenkins.sh	(revision 18636)
++++ ../trunk-jpl/jenkins/jenkins.sh	(revision 18637)
+@@ -192,6 +192,8 @@
+ EOF
+ 	cd $ISSM_DIR/test/NightlyRun
+ 	if [ "$OS" = "win7" ]; then
++		echo "HERE I AM"
++		$MATLAB_PATH/bin/matlab -nojvm -nosplash -r "exit;"
+ 		$MATLAB_PATH/bin/matlab -nojvm -nosplash -r "addpath $ISSM_DIR/src/m/dev; devpath; addpath $ISSM_DIR/nightlylog/; matlab_run$i" -logfile $ISSM_DIR/nightlylog/matlab_log$i.log
+ 	else
+ 		$MATLAB_PATH/bin/matlab -nojvm -nosplash -r "addpath $ISSM_DIR/src/m/dev; devpath; addpath $ISSM_DIR/nightlylog/; matlab_run$i" -logfile $ISSM_DIR/nightlylog/matlab_log$i.log &
Index: /issm/oecreview/Archive/18296-19100/ISSM-18637-18638.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18637-18638.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18637-18638.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/jenkins/jenkins.sh
+===================================================================
+--- ../trunk-jpl/jenkins/jenkins.sh	(revision 18637)
++++ ../trunk-jpl/jenkins/jenkins.sh	(revision 18638)
+@@ -193,7 +193,7 @@
+ 	cd $ISSM_DIR/test/NightlyRun
+ 	if [ "$OS" = "win7" ]; then
+ 		echo "HERE I AM"
+-		$MATLAB_PATH/bin/matlab -nojvm -nosplash -r "exit;"
++		matlab -nojvm -nosplash -r "exit;"
+ 		$MATLAB_PATH/bin/matlab -nojvm -nosplash -r "addpath $ISSM_DIR/src/m/dev; devpath; addpath $ISSM_DIR/nightlylog/; matlab_run$i" -logfile $ISSM_DIR/nightlylog/matlab_log$i.log
+ 	else
+ 		$MATLAB_PATH/bin/matlab -nojvm -nosplash -r "addpath $ISSM_DIR/src/m/dev; devpath; addpath $ISSM_DIR/nightlylog/; matlab_run$i" -logfile $ISSM_DIR/nightlylog/matlab_log$i.log &
Index: /issm/oecreview/Archive/18296-19100/ISSM-18638-18639.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18638-18639.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18638-18639.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/jenkins/windows
+===================================================================
+--- ../trunk-jpl/jenkins/windows	(revision 18638)
++++ ../trunk-jpl/jenkins/windows	(revision 18639)
+@@ -57,7 +57,7 @@
+ #ISSM_COMPILATION can have 2 values:
+ # - "yes" compile ISSM
+ # - "no"  do not compile ISSM
+-ISSM_COMPILATION="no"
++ISSM_COMPILATION="yes"
+ 
+ #------------------------#
+ # 5: Nightly run options #
Index: /issm/oecreview/Archive/18296-19100/ISSM-18639-18640.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18639-18640.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18639-18640.diff	(revision 19102)
@@ -0,0 +1,33 @@
+Index: ../trunk-jpl/jenkins/jenkins.sh
+===================================================================
+--- ../trunk-jpl/jenkins/jenkins.sh	(revision 18639)
++++ ../trunk-jpl/jenkins/jenkins.sh	(revision 18640)
+@@ -191,17 +191,20 @@
+ 	exit
+ EOF
+ 	cd $ISSM_DIR/test/NightlyRun
+-	if [ "$OS" = "win7" ]; then
+-		echo "HERE I AM"
+-		matlab -nojvm -nosplash -r "exit;"
+-		$MATLAB_PATH/bin/matlab -nojvm -nosplash -r "addpath $ISSM_DIR/src/m/dev; devpath; addpath $ISSM_DIR/nightlylog/; matlab_run$i" -logfile $ISSM_DIR/nightlylog/matlab_log$i.log
+-	else
+-		$MATLAB_PATH/bin/matlab -nojvm -nosplash -r "addpath $ISSM_DIR/src/m/dev; devpath; addpath $ISSM_DIR/nightlylog/; matlab_run$i" -logfile $ISSM_DIR/nightlylog/matlab_log$i.log &
+-	fi
++	$MATLAB_PATH/bin/matlab -nojvm -nosplash -r "addpath $ISSM_DIR/src/m/dev; devpath; addpath $ISSM_DIR/nightlylog/; matlab_run$i" -logfile $ISSM_DIR/nightlylog/matlab_log$i.log &
+ done
+ 
+ #wait until matlab closes
+-if [ "$OS" != "win7" ]; then
++if [ "$OS" = "win7" ]; then
++	echo "Waiting for matlab on windows"
++	pid=$(ps aux -W | grep MATLAB | awk '{printf("%s\n","MATLAB");}')
++	while [ -n "$pid" ]
++	do
++		pid=$(ps aux -W | grep MATLAB | awk '{printf("%s\n","MATLAB");}')
++		sleep 1;
++	done
++	echo "DONE!"
++else
+ 	wait
+ fi
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18640-18641.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18640-18641.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18640-18641.diff	(revision 19102)
@@ -0,0 +1,212 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18640)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18641)
+@@ -351,19 +351,11 @@
+ 	Input* active_element_input=basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input);
+ 	active_element_input->GetInputValue(&active_element);
+ 
+-	/* if(!active_element){ */
+-	/* 	/\*Keeping thickness to initial value if EPL is not active*\/ */
+-	/* 	for(i=0;i<numnodes;i++){ */
+-	/* 		eplHeads[i]=sedhead[i]; */
+-	/* 	} */
+-	/* } */
+-	/* else{ */
+-		/*Use the dof list to index into the solution vector: */
++	/*Use the dof list to index into the solution vector: */
+ 	for(i=0;i<numnodes;i++){
+ 		eplHeads[i]=solution[doflist[i]];
+ 		if(xIsNan<IssmDouble>(eplHeads[i])) _error_("NaN found in solution vector");
+ 	}
+-		//	}
+ 	/*Add input to the element: */
+ 	element->AddBasalInput(EplHeadEnum,eplHeads,P1Enum);
+ 
+@@ -438,9 +430,9 @@
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
+ 	}
+-	if(element->Id()==42){
+-		printf("Transferefficient Kmat %e, %e, %e, %i \n",transfer,sediment_head,epl_head,element->Id());
+-	}
++	/* if(element->Id()==42){ */
++	/* 	printf("Transferefficient Kmat %e, %e, %e, %e \n",transfer,sediment_head,epl_head,sed_residual); */
++	/* } */
+ 	return transfer;
+ }/*}}}*/
+ 
+@@ -484,9 +476,9 @@
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
+ 	}
+-	if(element->Id()==42){
+-		printf("Transferefficient Pvec %e, %e, %e\n",transfer,sediment_head,epl_head);
+-	}
++	/* if(element->Id()==42){ */
++	/* 	printf("Transferefficient Pvec %e, %e, %e, %e\n",transfer,sediment_head,epl_head,sed_residual); */
++	/* } */
+ 	return transfer;
+ }/*}}}*/
+ 
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h	(revision 18640)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h	(revision 18641)
+@@ -37,8 +37,8 @@
+ 		IssmDouble EplSpecificStoring(Element* element);
+ 		IssmDouble GetHydrologyDCInefficientHmax(Element* element, Gauss* gauss, Input* thickness_input, Input* base_input);
+ 		void GetHydrologyDCInefficientHmax(IssmDouble* ph_max,Element* element, Node* innode);
+-		IssmDouble GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input);
+-		IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input);
++		IssmDouble GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* thick_input, Input* base_input);
++		IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* thick_input, Input* base_input);
+ 		void ElementizeEplMask(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18640)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18641)
+@@ -196,10 +196,11 @@
+ 	basalelement ->GetVerticesCoordinates(&xyz_list);
+ 	basalelement ->FindParam(&dt,TimesteppingTimeStepEnum);
+ 	basalelement ->FindParam(&isefficientlayer,HydrologydcIsefficientlayerEnum);
+-	Input* SedTrans_input    = basalelement->GetInput(HydrologydcSedimentTransmitivityEnum); _assert_(SedTrans_input);
+-	Input* sed_head_input    = basalelement->GetInput(SedimentHeadEnum);
+-	Input* epl_head_input    = basalelement->GetInput(EplHeadEnum);
+-	Input* residual_input  = basalelement->GetInput(SedimentHeadResidualEnum);
++	Input* SedTrans_input = basalelement->GetInput(HydrologydcSedimentTransmitivityEnum); _assert_(SedTrans_input);
++	Input* sed_head_input = basalelement->GetInput(SedimentHeadEnum);
++	Input* epl_head_input = basalelement->GetInput(EplHeadEnum);
++	Input* base_input     = basalelement->GetInput(BaseEnum);
++	Input* thick_input    = basalelement->GetInput(ThicknessEnum);
+ 
+ 	IssmDouble sediment_storing = SedimentStoring(basalelement);
+ 	/*Transfer related Inputs*/
+@@ -237,7 +238,7 @@
+ 			if(isefficientlayer){
+ 				active_element_input->GetInputValue(&active_element);
+ 				if(active_element){
+-					transfer=GetHydrologyKMatrixTransfer(basalelement,gauss,sed_head_input,epl_head_input,residual_input);
++					transfer=GetHydrologyKMatrixTransfer(basalelement,gauss,sed_head_input,epl_head_input,thick_input,base_input);
+ 					basalelement->NodalFunctions(&basis[0],gauss);
+ 					D_scalar=transfer*gauss->weight*Jdet*dt;
+ 					TripleMultiply(basis,numnodes,1,0,
+@@ -299,10 +300,11 @@
+ 	basalelement->FindParam(&dt,TimesteppingTimeStepEnum);
+ 	basalelement->FindParam(&isefficientlayer,HydrologydcIsefficientlayerEnum);
+ 
+-	Input* sed_head_input    = basalelement->GetInput(SedimentHeadEnum);
+-	Input* epl_head_input    = basalelement->GetInput(EplHeadEnum);
+-	Input* water_input       = basalelement->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(water_input);
+-	Input* residual_input    = basalelement->GetInput(SedimentHeadResidualEnum);
++	Input* sed_head_input = basalelement->GetInput(SedimentHeadEnum);
++	Input* epl_head_input = basalelement->GetInput(EplHeadEnum);
++	Input* water_input    = basalelement->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(water_input);
++	Input* base_input     = basalelement->GetInput(BaseEnum);
++	Input* thick_input    = basalelement->GetInput(ThicknessEnum);
+ 	if(dt!= 0.){old_wh_input = basalelement->GetInput(SedimentHeadOldEnum);                     _assert_(old_wh_input);}
+ 
+ 	IssmDouble sediment_storing    = SedimentStoring(basalelement);
+@@ -337,7 +339,7 @@
+ 				/*Dealing with the sediment part of the transfer term*/
+ 				active_element_input->GetInputValue(&active_element);
+ 				if(active_element){
+-					transfer=GetHydrologyPVectorTransfer(basalelement,gauss,sed_head_input,epl_head_input,residual_input);
++					transfer=GetHydrologyPVectorTransfer(basalelement,gauss,sed_head_input,epl_head_input,thick_input,base_input);
+ 				}
+ 				else{
+ 					transfer=0.0;
+@@ -567,10 +569,10 @@
+ }
+ /*}}}*/
+ 
+-IssmDouble HydrologyDCInefficientAnalysis::GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input){/*{{{*/
++IssmDouble HydrologyDCInefficientAnalysis::GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* thick_input, Input* base_input){/*{{{*/
+ 
+ 	int transfermethod;
+-	IssmDouble sed_residual;
++	IssmDouble hmax;
+ 	IssmDouble epl_head,sediment_head;
+ 	IssmDouble leakage,transfer;
+ 
+@@ -585,17 +587,20 @@
+ 	case 1:
+ 		_assert_(sed_head_input);
+ 		_assert_(epl_head_input);
+-		_assert_(residual_input);
+ 		
+ 		sed_head_input->GetInputValue(&sediment_head,gauss);
+ 		epl_head_input->GetInputValue(&epl_head,gauss);
+-		residual_input->GetInputValue(&sed_residual,gauss);
+ 		element->FindParam(&leakage,HydrologydcLeakageFactorEnum);
++
++		hmax=GetHydrologyDCInefficientHmax(element, gauss, thick_input, base_input);
+ 		
+ 		if(epl_head>sediment_head){  
+-			if(sediment_head>=400.0){
++			if(sediment_head>=hmax){
+ 				transfer=0.0;
+ 			}
++			else if{
++				transfer=(leakage);
++			}
+ 			else{
+ 				transfer=(leakage);
+ 			}
+@@ -607,16 +612,16 @@
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
+ 	}
+-	if(element->Id()==42){
+-		printf("TransferInfficient Kmat %e, %e, %e, %i\n",transfer,sediment_head,epl_head,element->Id());
+-	}
++	/* if(element->Id()==42){ */
++	/* 	printf("TransferInfficient Kmat %e, %e, %e\n",transfer,sediment_head,epl_head); */
++	/* } */
+ 	return transfer;
+ }/*}}}*/
+ 
+-IssmDouble HydrologyDCInefficientAnalysis::GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input){/*{{{*/
++IssmDouble HydrologyDCInefficientAnalysis::GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* thick_input, Input* base_input){/*{{{*/
+ 
+ 	int transfermethod;
+-	IssmDouble sed_residual;
++	IssmDouble hmax;
+ 	IssmDouble epl_head,sediment_head;
+ 	IssmDouble leakage,transfer;
+ 
+@@ -631,15 +636,15 @@
+ 	case 1:
+ 		_assert_(sed_head_input);
+ 		_assert_(epl_head_input);
+-		_assert_(residual_input);
+ 		
+ 		sed_head_input->GetInputValue(&sediment_head,gauss);
+ 		epl_head_input->GetInputValue(&epl_head,gauss);
+-		residual_input->GetInputValue(&sed_residual,gauss);
+ 		element->FindParam(&leakage,HydrologydcLeakageFactorEnum);
+ 
+- 		if(epl_head>sediment_head){  
+-			if(sediment_head>=400.0){
++		hmax=GetHydrologyDCInefficientHmax(element, gauss, thick_input, base_input);
++		
++		if(epl_head>sediment_head){  
++			if(sediment_head>=hmax){
+ 				transfer=0.0;
+ 			}
+ 			else{
+@@ -653,9 +658,9 @@
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
+ 	}
+-	if(element->Id()==42){
+-		printf("TransferInfficient Pvec %e, %e, %e, %i\n",transfer,sediment_head,epl_head,element->Id());
+-	}
++	/* if(element->Id()==42){ */
++	/* 	printf("TransferInfficient Pvec %e, %e, %e\n",transfer,sediment_head,epl_head); */
++	/* } */
+ 	return transfer;
+ }/*}}}*/
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18641-18642.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18641-18642.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18641-18642.diff	(revision 19102)
@@ -0,0 +1,21 @@
+Index: ../trunk-jpl/m4/issm_options.m4
+===================================================================
+--- ../trunk-jpl/m4/issm_options.m4	(revision 18641)
++++ ../trunk-jpl/m4/issm_options.m4	(revision 18642)
+@@ -263,12 +263,14 @@
+   				if  test $VENDOR = intel-win7-32; then
+   					MEXLIB="-Wl,./../../c/libISSMCore.a -Wl,libISSMApi.a -Wl,libISSMMatlab.a -Wl,./../../c/libISSMModules.a -Wl,libmx.lib -Wl,libmex.lib -Wl,libmat.lib ${OSLIBS} -Wl,libf2cblas.lib -Wl,libf2clapack.lib" 
+                MEXLINK="-Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win32/microsoft` -no-undefined -Wl,/export:mexFunction" 
++					MEXEXT=`$MATLAB_ROOT/bin/mexext.bat`
++					MEXEXT=".$MEXEXT"
+   				elif  test l-win7-64; then
+   					MEXLIB="-Wl,./../../c/libISSMCore.a -Wl,libISSMApi.a -Wl,libISSMMatlab.a -Wl,./../../c/libISSMModules.a -Wl,libmx.lib -Wl,libmex.lib -Wl,libmat.lib ${OSLIBS} -Wl,libf2cblas.lib -Wl,libf2clapack.lib" 
+                MEXLINK="-Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win64/microsoft` -no-undefined -Wl,/export:mexFunction" 
++					MEXEXT=".mexw64"
+   				fi
+-  				MEXEXT=`$MATLAB_ROOT/bin/mexext.bat`
+-  				MEXEXT=".$MEXEXT"
++
+   			;;
+ 		   *)
+            MEXLINK=$($MATLAB_ROOT/bin/mex -v 2>&1 < /dev/null | grep LDFLAGS     | sed -e "s/         LDFLAGS            = //g")
Index: /issm/oecreview/Archive/18296-19100/ISSM-18642-18643.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18642-18643.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18642-18643.diff	(revision 19102)
@@ -0,0 +1,25 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18642)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18643)
+@@ -598,8 +598,8 @@
+ 			if(sediment_head>=hmax){
+ 				transfer=0.0;
+ 			}
+-			else if{
+-				transfer=(leakage);
++			else if(sediment_head>=hmax-50.0){
++				transfer=leakage*1.0e-2;
+ 			}
+ 			else{
+ 				transfer=(leakage);
+@@ -647,6 +647,9 @@
+ 			if(sediment_head>=hmax){
+ 				transfer=0.0;
+ 			}
++			else if(sediment_head>=hmax-50.0){
++				transfer=leakage*1.0e-2;
++			}
+ 			else{
+ 				transfer=(epl_head*leakage);
+ 			}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18643-18644.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18643-18644.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18643-18644.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/jenkins/windows
+===================================================================
+--- ../trunk-jpl/jenkins/windows	(revision 18643)
++++ ../trunk-jpl/jenkins/windows	(revision 18644)
+@@ -6,6 +6,7 @@
+ #ISSM CONFIGURATION 
+ ISSM_CONFIG='--prefix=$ISSM_DIR \
+    --disable-static \
++	--enable-standalone-libraries \
+ 	--without-Gia \
+ 	--with-vendor=intel-win7-64  \
+ 	--with-matlab-dir=""$ISSM_DIR/externalpackages/matlab/install"" \
Index: /issm/oecreview/Archive/18296-19100/ISSM-18644-18645.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18644-18645.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18644-18645.diff	(revision 19102)
@@ -0,0 +1,213 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18644)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18645)
+@@ -161,7 +161,8 @@
+ 	Input* epl_thick_input = basalelement->GetInput(HydrologydcEplThicknessEnum); _assert_(epl_thick_input);
+ 	Input* sed_head_input  = basalelement->GetInput(SedimentHeadEnum);
+ 	Input* epl_head_input  = basalelement->GetInput(EplHeadEnum);
+-	Input* residual_input  = basalelement->GetInput(SedimentHeadResidualEnum);
++	Input* thick_input     = basalelement->GetInput(ThicknessEnum);
++	Input* base_input      = basalelement->GetInput(BaseEnum);
+ 
+ 	IssmDouble epl_specificstoring   = EplSpecificStoring(basalelement);
+ 	IssmDouble epl_conductivity      = basalelement->GetMaterialParameter(HydrologydcEplConductivityEnum);
+@@ -194,7 +195,7 @@
+ 						&Ke->values[0],1);
+ 			
+ 			/*Transfer EPL part*/
+-			transfer=GetHydrologyKMatrixTransfer(basalelement,gauss,sed_head_input,epl_head_input,residual_input);
++			transfer=GetHydrologyKMatrixTransfer(basalelement,gauss,sed_head_input,epl_head_input,thick_input,base_input);
+ 			D_scalar=transfer*gauss->weight*Jdet*dt;
+ 			TripleMultiply(basis,numnodes,1,0,
+ 										 &D_scalar,1,1,0,
+@@ -268,6 +269,8 @@
+ 	Input* epl_thick_input   = basalelement->GetInput(HydrologydcEplThicknessEnum); _assert_(epl_thick_input);
+ 	Input* sed_head_input    = basalelement->GetInput(SedimentHeadEnum);
+ 	Input* epl_head_input    = basalelement->GetInput(EplHeadEnum);
++	Input* thick_input       = basalelement->GetInput(ThicknessEnum);
++	Input* base_input        = basalelement->GetInput(BaseEnum);
+ 	Input* residual_input    = basalelement->GetInput(SedimentHeadResidualEnum);    _assert_(residual_input);
+ 	if(dt!= 0.){old_wh_input = basalelement->GetInput(EplHeadOldEnum);            _assert_(old_wh_input);}
+ 
+@@ -287,7 +290,7 @@
+ 			epl_thick_input ->GetInputValue(&epl_thickness,gauss);
+ 			
+ 			/*Dealing with the epl part of the transfer term*/
+-			transfer=GetHydrologyPVectorTransfer(basalelement,gauss,sed_head_input,epl_head_input,residual_input);
++			transfer=GetHydrologyPVectorTransfer(basalelement,gauss,sed_head_input,epl_head_input,thick_input,base_input);
+ 			scalar = Jdet*gauss->weight*((water_head*epl_specificstoring*epl_thickness)+(transfer*dt));
+ 			for(int i=0;i<numnodes;i++)pe->values[i]+=scalar*basis[i];
+ 		}
+@@ -389,13 +392,13 @@
+ 	return rho_freshwater*g*sediment_porosity*sediment_thickness*(water_compressibility+(sediment_compressibility/sediment_porosity));		 
+ }/*}}}*/
+ 
+-IssmDouble HydrologyDCEfficientAnalysis::GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input){/*{{{*/
+-	
++IssmDouble HydrologyDCEfficientAnalysis::GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* thick_input, Input* base_input){/*{{{*/
+ 
+ 	int transfermethod;
+-	IssmDouble epl_thickness,sed_residual;
++	IssmDouble hmax;
+ 	IssmDouble epl_head,sediment_head;
+ 	IssmDouble leakage,transfer;
++	HydrologyDCInefficientAnalysis* inefanalysis = NULL;
+ 
+ 	element->FindParam(&transfermethod,HydrologydcTransferFlagEnum);
+ 
+@@ -408,15 +411,17 @@
+ 	case 1:
+ 		_assert_(sed_head_input);
+ 		_assert_(epl_head_input);
+-		_assert_(residual_input);
+ 		
++		inefanalysis = new HydrologyDCInefficientAnalysis();
++		hmax = inefanalysis->GetHydrologyDCInefficientHmax(element,gauss,thick_input,base_input);
++		delete inefanalysis;
++
+ 		sed_head_input->GetInputValue(&sediment_head,gauss);
+ 		epl_head_input->GetInputValue(&epl_head,gauss);
+-		residual_input->GetInputValue(&sed_residual,gauss);
+ 		element->FindParam(&leakage,HydrologydcLeakageFactorEnum);
+ 		
+ 		if(epl_head>sediment_head){  
+-			if(sed_residual>0.0){
++			if(sediment_head>=hmax){
+ 				transfer=0.0;
+ 			}
+ 			else{
+@@ -430,19 +435,18 @@
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
+ 	}
+-	/* if(element->Id()==42){ */
+-	/* 	printf("Transferefficient Kmat %e, %e, %e, %e \n",transfer,sediment_head,epl_head,sed_residual); */
+-	/* } */
+ 	return transfer;
+ }/*}}}*/
+ 
+-IssmDouble HydrologyDCEfficientAnalysis::GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input){/*{{{*/
++IssmDouble HydrologyDCEfficientAnalysis::GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* thick_input, Input* base_input){/*{{{*/
+ 
+ 	int transfermethod;
+-	IssmDouble sed_residual;
++	IssmDouble hmax;
+ 	IssmDouble epl_head,sediment_head;
+ 	IssmDouble leakage,transfer;
+ 
++	HydrologyDCInefficientAnalysis* inefanalysis = NULL;
++
+ 	element->FindParam(&transfermethod,HydrologydcTransferFlagEnum);
+ 
+ 	/*Switch between the different transfer methods cases*/
+@@ -454,15 +458,17 @@
+ 	case 1:
+ 		_assert_(sed_head_input);
+ 		_assert_(epl_head_input);
+-		_assert_(residual_input);
++
++		inefanalysis = new HydrologyDCInefficientAnalysis();
++		hmax = inefanalysis->GetHydrologyDCInefficientHmax(element,gauss,thick_input,base_input);
++		delete inefanalysis;
+ 		
+ 		sed_head_input->GetInputValue(&sediment_head,gauss);
+ 		epl_head_input->GetInputValue(&epl_head,gauss);
+-		residual_input->GetInputValue(&sed_residual,gauss);
+ 		element->FindParam(&leakage,HydrologydcLeakageFactorEnum);
+ 
+  		if(epl_head>sediment_head){  
+-			if(sed_residual>0.0){
++			if(sediment_head>=hmax){
+ 				transfer=0.0;
+ 			}
+ 			else{
+@@ -476,9 +482,6 @@
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
+ 	}
+-	/* if(element->Id()==42){ */
+-	/* 	printf("Transferefficient Pvec %e, %e, %e, %e\n",transfer,sediment_head,epl_head,sed_residual); */
+-	/* } */
+ 	return transfer;
+ }/*}}}*/
+ 
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h	(revision 18644)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h	(revision 18645)
+@@ -35,8 +35,8 @@
+ 		void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+ 		IssmDouble EplSpecificStoring(Element* element);
+ 		IssmDouble SedimentStoring(Element* element);
+-		IssmDouble GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input);
+-		IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input);
++		IssmDouble GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* thick_input, Input* base_input);
++		IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* thick_input, Input* base_input);
+ 		void HydrologyEPLGetMask(Vector<IssmDouble>* vec_mask,Element* element);
+ 		void HydrologyEPLGetActive(Vector<IssmDouble>* active_vec, Element* element);
+ 		void GetHydrologyDCInefficientHmax(IssmDouble* ph_max,Element* element, Node* innode);
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18644)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18645)
+@@ -199,8 +199,8 @@
+ 	Input* SedTrans_input = basalelement->GetInput(HydrologydcSedimentTransmitivityEnum); _assert_(SedTrans_input);
+ 	Input* sed_head_input = basalelement->GetInput(SedimentHeadEnum);
+ 	Input* epl_head_input = basalelement->GetInput(EplHeadEnum);
++	Input* thick_input    = basalelement->GetInput(ThicknessEnum);
+ 	Input* base_input     = basalelement->GetInput(BaseEnum);
+-	Input* thick_input    = basalelement->GetInput(ThicknessEnum);
+ 
+ 	IssmDouble sediment_storing = SedimentStoring(basalelement);
+ 	/*Transfer related Inputs*/
+@@ -303,8 +303,8 @@
+ 	Input* sed_head_input = basalelement->GetInput(SedimentHeadEnum);
+ 	Input* epl_head_input = basalelement->GetInput(EplHeadEnum);
+ 	Input* water_input    = basalelement->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(water_input);
++	Input* thick_input    = basalelement->GetInput(ThicknessEnum);
+ 	Input* base_input     = basalelement->GetInput(BaseEnum);
+-	Input* thick_input    = basalelement->GetInput(ThicknessEnum);
+ 	if(dt!= 0.){old_wh_input = basalelement->GetInput(SedimentHeadOldEnum);                     _assert_(old_wh_input);}
+ 
+ 	IssmDouble sediment_storing    = SedimentStoring(basalelement);
+@@ -598,9 +598,6 @@
+ 			if(sediment_head>=hmax){
+ 				transfer=0.0;
+ 			}
+-			else if(sediment_head>=hmax-50.0){
+-				transfer=leakage*1.0e-2;
+-			}
+ 			else{
+ 				transfer=(leakage);
+ 			}
+@@ -612,9 +609,6 @@
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
+ 	}
+-	/* if(element->Id()==42){ */
+-	/* 	printf("TransferInfficient Kmat %e, %e, %e\n",transfer,sediment_head,epl_head); */
+-	/* } */
+ 	return transfer;
+ }/*}}}*/
+ 
+@@ -647,9 +641,6 @@
+ 			if(sediment_head>=hmax){
+ 				transfer=0.0;
+ 			}
+-			else if(sediment_head>=hmax-50.0){
+-				transfer=leakage*1.0e-2;
+-			}
+ 			else{
+ 				transfer=(epl_head*leakage);
+ 			}
+@@ -661,9 +652,6 @@
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
+ 	}
+-	/* if(element->Id()==42){ */
+-	/* 	printf("TransferInfficient Pvec %e, %e, %e\n",transfer,sediment_head,epl_head); */
+-	/* } */
+ 	return transfer;
+ }/*}}}*/
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18645-18646.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18645-18646.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18645-18646.diff	(revision 19102)
@@ -0,0 +1,25 @@
+Index: ../trunk-jpl/test/NightlyRun/test3300.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3300.m	(revision 18645)
++++ ../trunk-jpl/test/NightlyRun/test3300.m	(revision 18646)
+@@ -26,16 +26,16 @@
+ md.hydrology.epl_colapse_thickness=1.0e-6;
+ md.hydrology.epl_max_thickness=5.0;
+ 
+-md.hydrology.transfer_flag=1;
+-md.hydrology.leakage_factor=500;
++md.hydrology.transfer_flag=1.0;
++md.hydrology.leakage_factor=3.9e-12;
+ 
+ times=0:0.2:8.0;
+ md.basalforcings.groundedice_melting_rate=ones(md.mesh.numberofvertices+1,length(times));
+ 
+ for i=1:length(times)
+-	if(times(i)<1.2)
++	if(times(i)<=1.0)
+ 		md.basalforcings.groundedice_melting_rate(:,i)=1.0;
+-	elseif(times(i)<6.0)
++	elseif(times(i)<=6.0)
+ 		md.basalforcings.groundedice_melting_rate(:,i)=-0.2;
+ 	else
+ 		md.basalforcings.groundedice_melting_rate(:,i)=0.0;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18646-18647.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18646-18647.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18646-18647.diff	(revision 19102)
@@ -0,0 +1,41 @@
+Index: ../trunk-jpl/src/m/plot/checkplotoptions.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/checkplotoptions.py	(revision 18646)
++++ ../trunk-jpl/src/m/plot/checkplotoptions.py	(revision 18647)
+@@ -114,16 +114,20 @@
+ 		options.changefieldvalue('textrotation',rotationlist)
+ 
+ 	#expdisp
+-	expdispvaluesarray=[0,0]
+-	expstylevaluesarray=[0,0]
+-	expstylevalues=[0,0]
++	expdispvaluesarray=[]
++	expstylevaluesarray=[]
++	expstylevalues=[]
+ 	if options.exist('expstyle'):
+-		expstylevalues=options.getfieldvalue('expstyle')
++	        expstylevalues=options.getfieldvalue('expstyle')
++                if type(expstylevalues)==str:
++                    expstylevalues=[expstylevalues]
+ 	if options.exist('expdisp'):
+ 		expdispvalues=options.getfieldvalue('expdisp')
++                if type(expdispvalues)==str:
++                    expdispvalues=[expdispvalues]
+ 		for i in npy.arange(len(expdispvalues)):
+ 			expdispvaluesarray.append(expdispvalues[i])
+-			if len(expstylevalues)>i+1:
++			if len(expstylevalues)>i:
+ 				expstylevaluesarray.append(expstylevalues[i])
+ 			else:
+ 				expstylevaluesarray.append('-k')
+@@ -153,8 +157,8 @@
+ 
+ 	#log scale
+ 	if options.exist('log'):
+-		if options.exist('caxis'):
+-			options.changefieldvalue('caxis',log(options.getfieldvalue('caxis'))/log(options.getfieldvalue('log')))
++		if options.exist('clim'):
++			options.changefieldvalue('clim',log(options.getfieldvalue('clim'))/log(options.getfieldvalue('log')))
+ 		options.changefieldvalue('cutoff',log(options.getfieldvalue('cutoff',1.5))/log(options.getfieldvalue('log')))
+ 
+ 	return options
Index: /issm/oecreview/Archive/18296-19100/ISSM-18647-18648.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18647-18648.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18647-18648.diff	(revision 19102)
@@ -0,0 +1,52 @@
+Index: ../trunk-jpl/src/c/shared/FSanalyticals/fsanalyticals.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/FSanalyticals/fsanalyticals.cpp	(revision 18647)
++++ ../trunk-jpl/src/c/shared/FSanalyticals/fsanalyticals.cpp	(revision 18648)
+@@ -55,10 +55,13 @@
+ 			return 8.0*pow(PI, 2)*pow(x, 2)*(z - 2)*sin(4*PI*x*z) - 4.0*PI*x*cos(4*PI*x*z) + 16.0*pow(PI, 2)*pow(z, 2)*(z - 2)*sin(4*PI*x*z) - 0.25*PI*((16*pow(PI, 2)*x*z*(PI*x*z - PI*x)*cos(4*PI*x*z) + 4*pow(PI, 2)*x*z*(8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*sin(4*PI*x*z) + 4*pow(PI, 2)*x*z*sin(4*PI*x*z) - 4*PI*x*(-PI*z + PI)*sin(4*PI*x*z) - 16*PI*x*(pow(PI, 2)*x*pow(z, 2) - 2*pow(PI, 2)*x*z)*cos(4*PI*x*z) - 16*PI*z*(pow(PI, 2)*pow(x, 2)*z - pow(PI, 2)*pow(x, 2))*cos(4*PI*x*z) + 4*PI*(PI*x*z - PI*x)*sin(4*PI*x*z) - 8*(pow(PI, 2)*x*z - pow(PI, 2)*x)*sin(4*PI*x*z) - PI*(8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*cos(4*PI*x*z) - PI*cos(4*PI*x*z))/(pow(PI, 3)*pow(x, 3)) + 3*(-4*PI*x*(PI*x*z - PI*x)*sin(4*PI*x*z) + PI*x*(8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*cos(4*PI*x*z) + PI*x*cos(4*PI*x*z) + 4*(pow(PI, 2)*pow(x, 2)*z - pow(PI, 2)*pow(x, 2))*sin(4*PI*x*z))/(pow(PI, 3)*pow(x, 4))) + 4*PI*sin(4*PI*z)*cos(4*PI*x);
+ 		case 14:
+ 			z=y;
+-			return 8.0*pow(2, 1.0L/3.0L)*pow(M_PI, 2)*pow(z, 2)*(z - 2.0)*sin(4*M_PI*x*z)/pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 2*pow(M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) + 0.03125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.25*sin(4*M_PI*x*z) + (1.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + 0.0625*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 1.0L/3.0L) - 0.0266666666666667*pow(2, 1.0L/3.0L)*M_PI*z*(z - 2.0)*(800.0*pow(M_PI, 3)*pow(z, 3)*pow(z - 2.0, 2)*sin(4*M_PI*x*z)*cos(4*M_PI*x*z) - 4*(-5.0*M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) - 0.15625*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) - 1.25*sin(4*M_PI*x*z) - M_PI*cos(4*M_PI*x))*(20.0*pow(M_PI, 2)*x*z*(z - 2.0)*sin(4*M_PI*x*z) - 5.0*M_PI*z*cos(4*M_PI*x*z) - 5.0*M_PI*(z - 2.0)*cos(4*M_PI*x*z) - 0.625*M_PI*(4*(4*pow(M_PI, 2)*pow(z, 2)*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*pow(z, 2)*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + 2*M_PI*z*(M_PI*z - 1.0*M_PI)*sin(4*M_PI*x*z) - 8*M_PI*z*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - (pow(M_PI, 2)*pow(z, 2) - 2.0*pow(M_PI, 2)*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 6*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4)) - 6.0/(pow(M_PI, 2)*pow(x, 4)) - 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 5))) + 4*pow(M_PI, 2)*sin(4*M_PI*x)) + 3.125*(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))*(16*pow(M_PI, 2)*x*z*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*sin(4*M_PI*x*z) + 4*M_PI*x*(M_PI*z - 1.0*M_PI)*sin(4*M_PI*x*z) - 16*M_PI*x*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - 16*M_PI*z*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z) + 4*M_PI*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) - 8*(pow(M_PI, 2)*x*z - 1.0*pow(M_PI, 2)*x)*sin(4*M_PI*x*z) - M_PI*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - M_PI*cos(4*M_PI*x*z))/(pow(M_PI, 4)*pow(x, 6)) + 9.375*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 7)))*cos(4*M_PI*x*z)/pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 2*pow(M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) + 0.03125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.25*sin(4*M_PI*x*z) + (1.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + 0.0625*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 4.0L/3.0L) + (1.0L/10.0L)*pow(2, 1.0L/3.0L)*(40.0*pow(M_PI, 2)*pow(x, 2)*(z - 2.0)*sin(4*M_PI*x*z) - 20.0*M_PI*x*cos(4*M_PI*x*z) - 1.25*M_PI*((16*pow(M_PI, 2)*x*z*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*sin(4*M_PI*x*z) + 4*M_PI*x*(M_PI*z - 1.0*M_PI)*sin(4*M_PI*x*z) - 16*M_PI*x*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - 16*M_PI*z*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z) + 4*M_PI*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) - 8*(pow(M_PI, 2)*x*z - 1.0*pow(M_PI, 2)*x)*sin(4*M_PI*x*z) - M_PI*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - M_PI*cos(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 3*(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))))/pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 2*pow(M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) + 0.03125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.25*sin(4*M_PI*x*z) + (1.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + 0.0625*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 1.0L/3.0L) + 4*M_PI*sin(4*M_PI*z)*cos(4*M_PI*x) + (1.0L/150.0L)*pow(2, 1.0L/3.0L)*(-10.0*M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) - 0.3125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) - 2.5*sin(4*M_PI*x*z) - 2*M_PI*cos(4*M_PI*x))*(160.0*pow(M_PI, 3)*x*pow(z, 2)*pow(z - 2.0, 2)*sin(4*M_PI*x*z)*cos(4*M_PI*x*z) - 40.0*pow(M_PI, 2)*pow(z, 2)*(z - 2.0)*pow(cos(4*M_PI*x*z), 2) - 40.0*pow(M_PI, 2)*z*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 4*(-4.0*pow(M_PI, 2)*pow(x, 2)*(z - 2.0)*sin(4*M_PI*x*z) + 2.0*M_PI*x*cos(4*M_PI*x*z) + 0.125*M_PI*((16*pow(M_PI, 2)*x*z*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*sin(4*M_PI*x*z) + 4*M_PI*x*(M_PI*z - 1.0*M_PI)*sin(4*M_PI*x*z) - 16*M_PI*x*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - 16*M_PI*z*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z) + 4*M_PI*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) - 8*(pow(M_PI, 2)*x*z - 1.0*pow(M_PI, 2)*x)*sin(4*M_PI*x*z) - M_PI*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - M_PI*cos(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 3*(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))))*(-5.0*M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) - 0.15625*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) - 1.25*sin(4*M_PI*x*z) - M_PI*cos(4*M_PI*x)) + 2.5*(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))*(4*pow(M_PI, 2)*pow(x, 2)*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*pow(x, 2)*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + pow(M_PI, 2)*pow(x, 2)*sin(4*M_PI*x*z) - 8*M_PI*x*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z))/(pow(M_PI, 4)*pow(x, 6)))/pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 2*pow(M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) + 0.03125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.25*sin(4*M_PI*x*z) + (1.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + 0.0625*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 4.0L/3.0L);
++			return 8.0*pow(2, 1.0L/3.0L)*pow(M_PI, 2)*pow(z, 2)*(z - 2)*sin(4*M_PI*x*z)/pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2, 2)*pow(cos(4*M_PI*x*z), 2) + (1.0L/2.0L)*pow(2.0*M_PI*x*(z - 2)*cos(4*M_PI*x*z) - 0.0625*M_PI*(16*sin(4*M_PI*x)/(M_PI*pow(x, 2)) + 4*(8*pow(M_PI, 2)*pow(x, 2) + 1)*cos(4*M_PI*x)/(pow(M_PI, 2)*pow(x, 3)) + 4*(-4*M_PI*z*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - (-M_PI*z + M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) - 3*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(pow(M_PI, 3)*pow(x, 4)) - 3*(4*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.5*sin(4*M_PI*x*z) + (2.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + pow(M_PI*x*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 0.25*M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - 0.25*M_PI*x*cos(4*M_PI*x*z) - (pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 1.0L/3.0L) - 0.0266666666666667*pow(2, 1.0L/3.0L)*M_PI*z*(z - 2)*(800.0*pow(M_PI, 3)*pow(z, 3)*pow(z - 2, 2)*sin(4*M_PI*x*z)*cos(4*M_PI*x*z) - (-10.0*M_PI*x*(z - 2)*cos(4*M_PI*x*z) + 0.3125*M_PI*(16*sin(4*M_PI*x)/(M_PI*pow(x, 2)) + 4*(8*pow(M_PI, 2)*pow(x, 2) + 1)*cos(4*M_PI*x)/(pow(M_PI, 2)*pow(x, 3)) + 4*(-4*M_PI*z*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - (-M_PI*z + M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) - 3*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(pow(M_PI, 3)*pow(x, 4)) - 3*(4*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) - 2.5*sin(4*M_PI*x*z) - 2*M_PI*cos(4*M_PI*x))*(40.0*pow(M_PI, 2)*x*z*(z - 2)*sin(4*M_PI*x*z) - 10.0*M_PI*z*cos(4*M_PI*x*z) - 10.0*M_PI*(z - 2)*cos(4*M_PI*x*z) + 1.25*M_PI*(32*cos(4*M_PI*x)/pow(x, 2) - 4*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(M_PI*pow(x, 3)) - 4*(4*pow(M_PI, 2)*pow(z, 2)*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*pow(z, 2)*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) - 2*M_PI*z*(-M_PI*z + M_PI)*sin(4*M_PI*x*z) - 8*M_PI*z*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - (pow(M_PI, 2)*pow(z, 2) - 2*pow(M_PI, 2)*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) - 20*sin(4*M_PI*x)/(M_PI*pow(x, 3)) - 6*(8*pow(M_PI, 2)*pow(x, 2) + 1)*cos(4*M_PI*x)/(pow(M_PI, 2)*pow(x, 4)) - 6*(-4*M_PI*z*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - (-M_PI*z + M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4)) + 3*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(pow(M_PI, 3)*pow(x, 5)) + 3*(4*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 5))) + 8*pow(M_PI, 2)*sin(4*M_PI*x)) - (50*M_PI*x*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 12.5*M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - 12.5*M_PI*x*cos(4*M_PI*x*z) - 50*(pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))*(4*pow(M_PI, 2)*x*z*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*x*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + pow(M_PI, 2)*x*z*sin(4*M_PI*x*z) - M_PI*x*(-M_PI*z + M_PI)*sin(4*M_PI*x*z) - 4.0*M_PI*x*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - 4*M_PI*z*(pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z) + M_PI*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 2*(pow(M_PI, 2)*x*z - pow(M_PI, 2)*x)*sin(4*M_PI*x*z) - 0.25*M_PI*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - 0.25*M_PI*cos(4*M_PI*x*z))/(pow(M_PI, 4)*pow(x, 6)) + 150*pow(M_PI*x*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 0.25*M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - 0.25*M_PI*x*cos(4*M_PI*x*z) - (pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 7)))*cos(4*M_PI*x*z)/pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2, 2)*pow(cos(4*M_PI*x*z), 2) + (1.0L/2.0L)*pow(2.0*M_PI*x*(z - 2)*cos(4*M_PI*x*z) - 0.0625*M_PI*(16*sin(4*M_PI*x)/(M_PI*pow(x, 2)) + 4*(8*pow(M_PI, 2)*pow(x, 2) + 1)*cos(4*M_PI*x)/(pow(M_PI, 2)*pow(x, 3)) + 4*(-4*M_PI*z*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - (-M_PI*z + M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) - 3*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(pow(M_PI, 3)*pow(x, 4)) - 3*(4*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.5*sin(4*M_PI*x*z) + (2.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + pow(M_PI*x*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 0.25*M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - 0.25*M_PI*x*cos(4*M_PI*x*z) - (pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 4.0L/3.0L) + (1.0L/10.0L)*pow(2, 1.0L/3.0L)*(40.0*pow(M_PI, 2)*pow(x, 2)*(z - 2)*sin(4*M_PI*x*z) - 20.0*M_PI*x*cos(4*M_PI*x*z) - 1.25*M_PI*((16*pow(M_PI, 2)*x*z*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*sin(4*M_PI*x*z) - 4*M_PI*x*(-M_PI*z + M_PI)*sin(4*M_PI*x*z) - 16*M_PI*x*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - 16*M_PI*z*(pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z) + 4*M_PI*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 8*(pow(M_PI, 2)*x*z - pow(M_PI, 2)*x)*sin(4*M_PI*x*z) - M_PI*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - M_PI*cos(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 3*(-4*M_PI*x*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))))/pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2, 2)*pow(cos(4*M_PI*x*z), 2) + (1.0L/2.0L)*pow(2.0*M_PI*x*(z - 2)*cos(4*M_PI*x*z) - 0.0625*M_PI*(16*sin(4*M_PI*x)/(M_PI*pow(x, 2)) + 4*(8*pow(M_PI, 2)*pow(x, 2) + 1)*cos(4*M_PI*x)/(pow(M_PI, 2)*pow(x, 3)) + 4*(-4*M_PI*z*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - (-M_PI*z + M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) - 3*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(pow(M_PI, 3)*pow(x, 4)) - 3*(4*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.5*sin(4*M_PI*x*z) + (2.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + pow(M_PI*x*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 0.25*M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - 0.25*M_PI*x*cos(4*M_PI*x*z) - (pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 1.0L/3.0L) + 4*M_PI*sin(4*M_PI*z)*cos(4*M_PI*x) + (1.0L/150.0L)*pow(2, 1.0L/3.0L)*(-10.0*M_PI*x*(z - 2)*cos(4*M_PI*x*z) + 0.3125*M_PI*(16*sin(4*M_PI*x)/(M_PI*pow(x, 2)) + 4*(8*pow(M_PI, 2)*pow(x, 2) + 1)*cos(4*M_PI*x)/(pow(M_PI, 2)*pow(x, 3)) + 4*(-4*M_PI*z*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - (-M_PI*z + M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) - 3*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(pow(M_PI, 3)*pow(x, 4)) - 3*(4*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) - 2.5*sin(4*M_PI*x*z) - 2*M_PI*cos(4*M_PI*x))*(160.0*pow(M_PI, 3)*x*pow(z, 2)*pow(z - 2, 2)*sin(4*M_PI*x*z)*cos(4*M_PI*x*z) - 40.0*pow(M_PI, 2)*pow(z, 2)*(z - 2)*pow(cos(4*M_PI*x*z), 2) - 40.0*pow(M_PI, 2)*z*pow(z - 2, 2)*pow(cos(4*M_PI*x*z), 2) + (-8.0*pow(M_PI, 2)*pow(x, 2)*(z - 2)*sin(4*M_PI*x*z) + 4.0*M_PI*x*cos(4*M_PI*x*z) + 0.25*M_PI*((16*pow(M_PI, 2)*x*z*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*sin(4*M_PI*x*z) - 4*M_PI*x*(-M_PI*z + M_PI)*sin(4*M_PI*x*z) - 16*M_PI*x*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - 16*M_PI*z*(pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z) + 4*M_PI*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 8*(pow(M_PI, 2)*x*z - pow(M_PI, 2)*x)*sin(4*M_PI*x*z) - M_PI*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - M_PI*cos(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 3*(-4*M_PI*x*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))))*(-10.0*M_PI*x*(z - 2)*cos(4*M_PI*x*z) + 0.3125*M_PI*(16*sin(4*M_PI*x)/(M_PI*pow(x, 2)) + 4*(8*pow(M_PI, 2)*pow(x, 2) + 1)*cos(4*M_PI*x)/(pow(M_PI, 2)*pow(x, 3)) + 4*(-4*M_PI*z*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - (-M_PI*z + M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) - 3*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(pow(M_PI, 3)*pow(x, 4)) - 3*(4*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) - 2.5*sin(4*M_PI*x*z) - 2*M_PI*cos(4*M_PI*x)) - (10*M_PI*x*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 2.5*M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - 2.5*M_PI*x*cos(4*M_PI*x*z) - 10*(pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))*(4*pow(M_PI, 2)*pow(x, 2)*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*pow(x, 2)*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + pow(M_PI, 2)*pow(x, 2)*sin(4*M_PI*x*z) - 8.0*M_PI*x*(pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z))/(pow(M_PI, 4)*pow(x, 6)))/pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2, 2)*pow(cos(4*M_PI*x*z), 2) + (1.0L/2.0L)*pow(2.0*M_PI*x*(z - 2)*cos(4*M_PI*x*z) - 0.0625*M_PI*(16*sin(4*M_PI*x)/(M_PI*pow(x, 2)) + 4*(8*pow(M_PI, 2)*pow(x, 2) + 1)*cos(4*M_PI*x)/(pow(M_PI, 2)*pow(x, 3)) + 4*(-4*M_PI*z*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - (-M_PI*z + M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) - 3*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(pow(M_PI, 3)*pow(x, 4)) - 3*(4*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.5*sin(4*M_PI*x*z) + (2.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + pow(M_PI*x*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 0.25*M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - 0.25*M_PI*x*cos(4*M_PI*x*z) - (pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 4.0L/3.0L);
+ 		case 21:
+ 			z=y;
+ 			return z - 4.0L/3.0L*pow(2, 1.0L/3.0L)*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(4*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(pow(x, 2)*z*(z - 1)*(2*z - 1) + 4*x*z*(x - 1)*(z - 1)*(2*z - 1) + z*pow(x - 1, 2)*(z - 1)*(2*z - 1)) + 4*(2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) + z*(6*pow(x, 2) - 6*x + 1))*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x)) + (2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1))*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1) - 3*pow(z, 4)*(2*x - 1) + 6*pow(z, 3)*(2*x - 1) - 3*pow(z, 2)*(2*x - 1)))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 4.0L/3.0L) - 1.0L/3.0L*pow(2, 1.0L/3.0L)*(4*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1)) + 4*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x))*(2*pow(x, 3) - 3*pow(x, 2) + x + 6*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 6*z*(2*pow(x, 3) - 3*pow(x, 2) + x)) + (2*pow(x, 2)*z*pow(x - 1, 2) + 2*pow(x, 2)*pow(x - 1, 2)*(z - 1) + pow(x, 2)*pow(x - 1, 2)*(2*z - 1) - 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) + 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) - z*(6*pow(x, 2) - 6*x + 1))*(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1)))*(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 4.0L/3.0L) + 2*pow(2, 1.0L/3.0L)*(pow(x, 2)*z*(z - 1)*(2*z - 1) + 4*x*z*(x - 1)*(z - 1)*(2*z - 1) + z*pow(x - 1, 2)*(z - 1)*(2*z - 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 1.0L/3.0L) - 0.5 + pow(2, 1.0L/3.0L)*(2*pow(x, 2)*z*pow(x - 1, 2) + 2*pow(x, 2)*pow(x - 1, 2)*(z - 1) + pow(x, 2)*pow(x - 1, 2)*(2*z - 1) - 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) + 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) - z*(6*pow(x, 2) - 6*x + 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 1.0L/3.0L);
++		case 22:
++			z=y;
++			return -2*pow(2, 1.0L/3.0L)*(pow(x, 2)*z*pow(z - 2, 2) + 4*x*z*(x - 2)*pow(z - 2, 2) + z*pow(x - 2, 2)*pow(z - 2, 2))/pow(8*pow(x, 8) - 64*pow(x, 7) + 192*pow(x, 6) - 256*pow(x, 5) + 128*pow(x, 4) + (1.0L/2.0L)*pow(z, 8)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) - 16.0L/3.0L*pow(z, 7)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) + (1.0L/9.0L)*pow(z, 6)*(207*pow(x, 6) - 1242*pow(x, 5) + 4518*pow(x, 4) - 9792*pow(x, 3) + 10536*pow(x, 2) - 4800*x + 800) - 8.0L/3.0L*pow(z, 5)*(69*pow(x, 6) - 414*pow(x, 5) + 1050*pow(x, 4) - 1440*pow(x, 3) + 1080*pow(x, 2) - 384*x + 64) + (1.0L/6.0L)*pow(z, 4)*(27*pow(x, 8) - 216*pow(x, 7) + 3984*pow(x, 6) - 20880*pow(x, 5) + 45952*pow(x, 4) - 48640*pow(x, 3) + 24256*pow(x, 2) - 4608*x + 768) - 8.0L/3.0L*pow(z, 3)*(9*pow(x, 8) - 72*pow(x, 7) + 504*pow(x, 6) - 2016*pow(x, 5) + 3920*pow(x, 4) - 3590*pow(x, 3) + 1298*pow(x, 2) - 12*x) + 4*pow(z, 2)*(11*pow(x, 8) - 88*pow(x, 7) + 368*pow(x, 6) - 976*pow(x, 5) + 1536*pow(x, 4) - 1296*pow(x, 3) + 496*pow(x, 2) - 32*x) - 32*z*(pow(x, 8) - 8*pow(x, 7) + 24*pow(x, 6) - 32*pow(x, 5) + 16*pow(x, 4) - 2*pow(x, 3) + 6*pow(x, 2) - 4*x) + 2, 1.0L/3.0L) + (2.0L/9.0L)*pow(2, 1.0L/3.0L)*(2*pow(x, 2)*z*(x - 2)*pow(z - 2, 2) + 2*x*z*pow(x - 2, 2)*pow(z - 2, 2) + 1)*(96*pow(x, 7) - 672*pow(x, 6) + 1728*pow(x, 5) - 1920*pow(x, 4) + 768*pow(x, 3) + 9*pow(z, 8)*(3*pow(x, 3) - 9*pow(x, 2) + 8*x - 2) - 96*pow(z, 7)*(3*pow(x, 3) - 9*pow(x, 2) + 8*x - 2) + pow(z, 6)*(207*pow(x, 5) - 1035*pow(x, 4) + 3012*pow(x, 3) - 4896*pow(x, 2) + 3512*x - 800) - 24*pow(z, 5)*(69*pow(x, 5) - 345*pow(x, 4) + 700*pow(x, 3) - 720*pow(x, 2) + 360*x - 64) + 2*pow(z, 4)*(27*pow(x, 7) - 189*pow(x, 6) + 2988*pow(x, 5) - 13050*pow(x, 4) + 22976*pow(x, 3) - 18240*pow(x, 2) + 6064*x - 576) - 8*pow(z, 3)*(36*pow(x, 7) - 252*pow(x, 6) + 1512*pow(x, 5) - 5040*pow(x, 4) + 7840*pow(x, 3) - 5385*pow(x, 2) + 1298*x - 6) + 48*pow(z, 2)*(11*pow(x, 7) - 77*pow(x, 6) + 276*pow(x, 5) - 610*pow(x, 4) + 768*pow(x, 3) - 486*pow(x, 2) + 124*x - 4) - 96*z*(4*pow(x, 7) - 28*pow(x, 6) + 72*pow(x, 5) - 80*pow(x, 4) + 32*pow(x, 3) - 3*pow(x, 2) + 6*x - 2))/pow(8*pow(x, 8) - 64*pow(x, 7) + 192*pow(x, 6) - 256*pow(x, 5) + 128*pow(x, 4) + (1.0L/2.0L)*pow(z, 8)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) - 16.0L/3.0L*pow(z, 7)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) + (1.0L/9.0L)*pow(z, 6)*(207*pow(x, 6) - 1242*pow(x, 5) + 4518*pow(x, 4) - 9792*pow(x, 3) + 10536*pow(x, 2) - 4800*x + 800) - 8.0L/3.0L*pow(z, 5)*(69*pow(x, 6) - 414*pow(x, 5) + 1050*pow(x, 4) - 1440*pow(x, 3) + 1080*pow(x, 2) - 384*x + 64) + (1.0L/6.0L)*pow(z, 4)*(27*pow(x, 8) - 216*pow(x, 7) + 3984*pow(x, 6) - 20880*pow(x, 5) + 45952*pow(x, 4) - 48640*pow(x, 3) + 24256*pow(x, 2) - 4608*x + 768) - 8.0L/3.0L*pow(z, 3)*(9*pow(x, 8) - 72*pow(x, 7) + 504*pow(x, 6) - 2016*pow(x, 5) + 3920*pow(x, 4) - 3590*pow(x, 3) + 1298*pow(x, 2) - 12*x) + 4*pow(z, 2)*(11*pow(x, 8) - 88*pow(x, 7) + 368*pow(x, 6) - 976*pow(x, 5) + 1536*pow(x, 4) - 1296*pow(x, 3) + 496*pow(x, 2) - 32*x) - 32*z*(pow(x, 8) - 8*pow(x, 7) + 24*pow(x, 6) - 32*pow(x, 5) + 16*pow(x, 4) - 2*pow(x, 3) + 6*pow(x, 2) - 4*x) + 2, 4.0L/3.0L) - pow(2, 1.0L/3.0L)*(pow(x, 2)*z*pow(x - 2, 2) + 2*pow(x, 2)*pow(x - 2, 2)*(z - 2) - 2*pow(z, 3)*(3*pow(x, 2) - 6*x + 2) + 8*pow(z, 2)*(3*pow(x, 2) - 6*x + 2) - 8*z*(3*pow(x, 2) - 6*x + 2))/pow(8*pow(x, 8) - 64*pow(x, 7) + 192*pow(x, 6) - 256*pow(x, 5) + 128*pow(x, 4) + (1.0L/2.0L)*pow(z, 8)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) - 16.0L/3.0L*pow(z, 7)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) + (1.0L/9.0L)*pow(z, 6)*(207*pow(x, 6) - 1242*pow(x, 5) + 4518*pow(x, 4) - 9792*pow(x, 3) + 10536*pow(x, 2) - 4800*x + 800) - 8.0L/3.0L*pow(z, 5)*(69*pow(x, 6) - 414*pow(x, 5) + 1050*pow(x, 4) - 1440*pow(x, 3) + 1080*pow(x, 2) - 384*x + 64) + (1.0L/6.0L)*pow(z, 4)*(27*pow(x, 8) - 216*pow(x, 7) + 3984*pow(x, 6) - 20880*pow(x, 5) + 45952*pow(x, 4) - 48640*pow(x, 3) + 24256*pow(x, 2) - 4608*x + 768) - 8.0L/3.0L*pow(z, 3)*(9*pow(x, 8) - 72*pow(x, 7) + 504*pow(x, 6) - 2016*pow(x, 5) + 3920*pow(x, 4) - 3590*pow(x, 3) + 1298*pow(x, 2) - 12*x) + 4*pow(z, 2)*(11*pow(x, 8) - 88*pow(x, 7) + 368*pow(x, 6) - 976*pow(x, 5) + 1536*pow(x, 4) - 1296*pow(x, 3) + 496*pow(x, 2) - 32*x) - 32*z*(pow(x, 8) - 8*pow(x, 7) + 24*pow(x, 6) - 32*pow(x, 5) + 16*pow(x, 4) - 2*pow(x, 3) + 6*pow(x, 2) - 4*x) + 2, 1.0L/3.0L) - 1.0L/27.0L*pow(2, 1.0L/3.0L)*(6*pow(x, 2)*z*pow(x - 2, 2)*(z - 2) + 3*pow(x, 2)*pow(x - 2, 2)*pow(z - 2, 2) - 3*pow(z, 4)*(3*pow(x, 2) - 6*x + 2) + 16*pow(z, 3)*(3*pow(x, 2) - 6*x + 2) - 24*pow(z, 2)*(3*pow(x, 2) - 6*x + 2))*(48*pow(x, 8) - 384*pow(x, 7) + 1152*pow(x, 6) - 1536*pow(x, 5) + 768*pow(x, 4) - 96*pow(x, 3) + 288*pow(x, 2) - 192*x - 6*pow(z, 7)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) + 56*pow(z, 6)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) - pow(z, 5)*(207*pow(x, 6) - 1242*pow(x, 5) + 4518*pow(x, 4) - 9792*pow(x, 3) + 10536*pow(x, 2) - 4800*x + 800) + 20*pow(z, 4)*(69*pow(x, 6) - 414*pow(x, 5) + 1050*pow(x, 4) - 1440*pow(x, 3) + 1080*pow(x, 2) - 384*x + 64) - pow(z, 3)*(27*pow(x, 8) - 216*pow(x, 7) + 3984*pow(x, 6) - 20880*pow(x, 5) + 45952*pow(x, 4) - 48640*pow(x, 3) + 24256*pow(x, 2) - 4608*x + 768) + 12*pow(z, 2)*(9*pow(x, 8) - 72*pow(x, 7) + 504*pow(x, 6) - 2016*pow(x, 5) + 3920*pow(x, 4) - 3590*pow(x, 3) + 1298*pow(x, 2) - 12*x) - 12*z*(11*pow(x, 8) - 88*pow(x, 7) + 368*pow(x, 6) - 976*pow(x, 5) + 1536*pow(x, 4) - 1296*pow(x, 3) + 496*pow(x, 2) - 32*x))/pow(8*pow(x, 8) - 64*pow(x, 7) + 192*pow(x, 6) - 256*pow(x, 5) + 128*pow(x, 4) + (1.0L/2.0L)*pow(z, 8)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) - 16.0L/3.0L*pow(z, 7)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) + (1.0L/9.0L)*pow(z, 6)*(207*pow(x, 6) - 1242*pow(x, 5) + 4518*pow(x, 4) - 9792*pow(x, 3) + 10536*pow(x, 2) - 4800*x + 800) - 8.0L/3.0L*pow(z, 5)*(69*pow(x, 6) - 414*pow(x, 5) + 1050*pow(x, 4) - 1440*pow(x, 3) + 1080*pow(x, 2) - 384*x + 64) + (1.0L/6.0L)*pow(z, 4)*(27*pow(x, 8) - 216*pow(x, 7) + 3984*pow(x, 6) - 20880*pow(x, 5) + 45952*pow(x, 4) - 48640*pow(x, 3) + 24256*pow(x, 2) - 4608*x + 768) - 8.0L/3.0L*pow(z, 3)*(9*pow(x, 8) - 72*pow(x, 7) + 504*pow(x, 6) - 2016*pow(x, 5) + 3920*pow(x, 4) - 3590*pow(x, 3) + 1298*pow(x, 2) - 12*x) + 4*pow(z, 2)*(11*pow(x, 8) - 88*pow(x, 7) + 368*pow(x, 6) - 976*pow(x, 5) + 1536*pow(x, 4) - 1296*pow(x, 3) + 496*pow(x, 2) - 32*x) - 32*z*(pow(x, 8) - 8*pow(x, 7) + 24*pow(x, 6) - 32*pow(x, 5) + 16*pow(x, 4) - 2*pow(x, 3) + 6*pow(x, 2) - 4*x) + 2, 4.0L/3.0L) + 4*M_PI*cos(4*M_PI*x + (1.0L/3.0L)*M_PI);
+ 		case 24:
+ 			return 2*pow(2, 1.0L/3.0L)*pow(PI, 2)*pow(p, 2)*sin(PI*p*y)*sin(PI*p*z)*cos(PI*p*x)/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 1.0L/3.0L) - 2.0L/3.0L*pow(2, 1.0L/3.0L)*PI*p*(12*pow(PI, 3)*pow(p, 3)*sin(PI*p*x)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2)*cos(PI*p*x) - (-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x))*(pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*sin(PI*p*x)*sin(PI*p*z) - 2*pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*z)*cos(PI*p*y)) + (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z))*(pow(PI, 3)*pow(p, 3)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*cos(PI*p*x)*cos(PI*p*y) + pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*cos(PI*p*x)*cos(PI*p*z)) - (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z))*(pow(PI, 3)*pow(p, 3)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*sin(PI*p*y) - 2*pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*y)*cos(PI*p*z)))*sin(PI*p*x)*sin(PI*p*y)*sin(PI*p*z)/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 4.0L/3.0L) + PI*q*sin(PI*q*y)*sin(PI*q*z)*cos(PI*q*x) - 1.0L/6.0L*pow(2, 1.0L/3.0L)*(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x))*(12*pow(PI, 3)*pow(p, 3)*pow(sin(PI*p*x), 2)*sin(PI*p*y)*pow(sin(PI*p*z), 2)*cos(PI*p*y) + (-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x))*(2*pow(PI, 2)*pow(p, 2)*(cos(PI*p*x) - 1)*sin(PI*p*y)*sin(PI*p*z) - pow(PI, 2)*pow(p, 2)*sin(PI*p*y)*sin(PI*p*z)*cos(PI*p*x)) - (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z))*(pow(PI, 3)*pow(p, 3)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*sin(PI*p*y) + pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*y)*cos(PI*p*z)) + (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z))*(pow(PI, 3)*pow(p, 3)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*cos(PI*p*x)*cos(PI*p*y) - 2*pow(PI, 2)*pow(p, 2)*(cos(PI*p*x) - 1)*cos(PI*p*y)*cos(PI*p*z)))/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 4.0L/3.0L) - 1.0L/6.0L*pow(2, 1.0L/3.0L)*(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z))*(12*pow(PI, 3)*pow(p, 3)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*sin(PI*p*z)*cos(PI*p*z) + (-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x))*(-2*pow(PI, 2)*pow(p, 2)*(cos(PI*p*x) - 1)*cos(PI*p*y)*cos(PI*p*z) + pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*cos(PI*p*x)*cos(PI*p*z)) - (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z))*(pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*sin(PI*p*x)*sin(PI*p*z) + pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*z)*cos(PI*p*y)) + (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z))*(2*pow(PI, 2)*pow(p, 2)*(cos(PI*p*x) - 1)*sin(PI*p*y)*sin(PI*p*z) - pow(PI, 2)*pow(p, 2)*sin(PI*p*y)*sin(PI*p*z)*cos(PI*p*x)))/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 4.0L/3.0L) + pow(2, 1.0L/3.0L)*(2*pow(PI, 2)*pow(p, 2)*(cos(PI*p*x) - 1)*sin(PI*p*y)*sin(PI*p*z) - pow(PI, 2)*pow(p, 2)*sin(PI*p*y)*sin(PI*p*z)*cos(PI*p*x))/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 1.0L/3.0L);
+ 
+@@ -109,10 +112,13 @@
+ 			return 8.0*pow(PI, 2)*x*z*(z - 2)*sin(4*PI*x*z) - 2.0*PI*z*cos(4*PI*x*z) - 2.0*PI*(z - 2)*cos(4*PI*x*z) + 0.25*PI*(32*cos(4*PI*x)/pow(x, 2) - 4*(8*pow(PI, 2)*pow(x, 2) + 1)*sin(4*PI*x)/(PI*pow(x, 3)) - 4*(4*pow(PI, 2)*pow(z, 2)*(PI*x*z - PI*x)*cos(4*PI*x*z) + pow(PI, 2)*pow(z, 2)*(8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*sin(4*PI*x*z) - 2*PI*z*(-PI*z + PI)*sin(4*PI*x*z) - 8*PI*z*(pow(PI, 2)*x*pow(z, 2) - 2*pow(PI, 2)*x*z)*cos(4*PI*x*z) - (pow(PI, 2)*pow(z, 2) - 2*pow(PI, 2)*z)*sin(4*PI*x*z))/(pow(PI, 3)*pow(x, 3)) - 20*sin(4*PI*x)/(PI*pow(x, 3)) - 6*(8*pow(PI, 2)*pow(x, 2) + 1)*cos(4*PI*x)/(pow(PI, 2)*pow(x, 4)) - 6*(-4*PI*z*(PI*x*z - PI*x)*sin(4*PI*x*z) + PI*z*(8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*cos(4*PI*x*z) - (-PI*z + PI)*cos(4*PI*x*z) + 4*(pow(PI, 2)*x*pow(z, 2) - 2*pow(PI, 2)*x*z)*sin(4*PI*x*z))/(pow(PI, 3)*pow(x, 4)) + 3*(8*pow(PI, 2)*pow(x, 2) + 1)*sin(4*PI*x)/(pow(PI, 3)*pow(x, 5)) + 3*(4*(PI*x*z - PI*x)*cos(4*PI*x*z) + (8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*sin(4*PI*x*z))/(pow(PI, 3)*pow(x, 5))) + 4*PI*sin(4*PI*x)*cos(4*PI*z) + (8.0L/5.0L)*pow(PI, 2)*sin(4*PI*x) + 2*(-4.0*pow(PI, 2)*pow(x, 2)*(PI*x*z - PI*x)*cos(4*PI*x*z) - 1.0*pow(PI, 2)*pow(x, 2)*(8*pow(PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(PI, 2)*pow(x, 2)*z - 1)*sin(4*PI*x*z) - 1.0*pow(PI, 2)*pow(x, 2)*sin(4*PI*x*z) + 8.0*PI*x*(pow(PI, 2)*pow(x, 2)*z - pow(PI, 2)*pow(x, 2))*cos(4*PI*x*z))/(pow(PI, 2)*pow(x, 3));
+ 		case 14:
+ 			z=y;
+-			return 4*M_PI*sin(4*M_PI*x)*cos(4*M_PI*z) + (1.0L/10.0L)*pow(2, 1.0L/3.0L)*(40.0*pow(M_PI, 2)*x*z*(z - 2.0)*sin(4*M_PI*x*z) - 10.0*M_PI*z*cos(4*M_PI*x*z) - 10.0*M_PI*(z - 2.0)*cos(4*M_PI*x*z) - 1.25*M_PI*(4*(4*pow(M_PI, 2)*pow(z, 2)*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*pow(z, 2)*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + 2*M_PI*z*(M_PI*z - 1.0*M_PI)*sin(4*M_PI*x*z) - 8*M_PI*z*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - (pow(M_PI, 2)*pow(z, 2) - 2.0*pow(M_PI, 2)*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 6*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4)) - 6.0/(pow(M_PI, 2)*pow(x, 4)) - 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 5))) + 8*pow(M_PI, 2)*sin(4*M_PI*x))/pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 2*pow(M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) + 0.03125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.25*sin(4*M_PI*x*z) + (1.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + 0.0625*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 1.0L/3.0L) + (1.0L/750.0L)*pow(2, 1.0L/3.0L)*(-10.0*M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) - 0.3125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) - 2.5*sin(4*M_PI*x*z) - 2*M_PI*cos(4*M_PI*x))*(800.0*pow(M_PI, 3)*pow(z, 3)*pow(z - 2.0, 2)*sin(4*M_PI*x*z)*cos(4*M_PI*x*z) - 4*(-5.0*M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) - 0.15625*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) - 1.25*sin(4*M_PI*x*z) - M_PI*cos(4*M_PI*x))*(20.0*pow(M_PI, 2)*x*z*(z - 2.0)*sin(4*M_PI*x*z) - 5.0*M_PI*z*cos(4*M_PI*x*z) - 5.0*M_PI*(z - 2.0)*cos(4*M_PI*x*z) - 0.625*M_PI*(4*(4*pow(M_PI, 2)*pow(z, 2)*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*pow(z, 2)*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + 2*M_PI*z*(M_PI*z - 1.0*M_PI)*sin(4*M_PI*x*z) - 8*M_PI*z*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - (pow(M_PI, 2)*pow(z, 2) - 2.0*pow(M_PI, 2)*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 6*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4)) - 6.0/(pow(M_PI, 2)*pow(x, 4)) - 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 5))) + 4*pow(M_PI, 2)*sin(4*M_PI*x)) + 3.125*(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))*(16*pow(M_PI, 2)*x*z*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*sin(4*M_PI*x*z) + 4*M_PI*x*(M_PI*z - 1.0*M_PI)*sin(4*M_PI*x*z) - 16*M_PI*x*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - 16*M_PI*z*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z) + 4*M_PI*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) - 8*(pow(M_PI, 2)*x*z - 1.0*pow(M_PI, 2)*x)*sin(4*M_PI*x*z) - M_PI*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - M_PI*cos(4*M_PI*x*z))/(pow(M_PI, 4)*pow(x, 6)) + 9.375*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 7)))/pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 2*pow(M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) + 0.03125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.25*sin(4*M_PI*x*z) + (1.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + 0.0625*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 4.0L/3.0L) - 1.0*pow(2, 1.0L/3.0L)*(4*pow(M_PI, 2)*pow(x, 2)*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*pow(x, 2)*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + pow(M_PI, 2)*pow(x, 2)*sin(4*M_PI*x*z) - 8*M_PI*x*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z))/(pow(M_PI, 2)*pow(x, 3)*pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 2*pow(M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) + 0.03125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.25*sin(4*M_PI*x*z) + (1.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + 0.0625*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 1.0L/3.0L)) + 0.0166666666666667*pow(2, 1.0L/3.0L)*(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))*(160.0*pow(M_PI, 3)*x*pow(z, 2)*pow(z - 2.0, 2)*sin(4*M_PI*x*z)*cos(4*M_PI*x*z) - 40.0*pow(M_PI, 2)*pow(z, 2)*(z - 2.0)*pow(cos(4*M_PI*x*z), 2) - 40.0*pow(M_PI, 2)*z*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 4*(-4.0*pow(M_PI, 2)*pow(x, 2)*(z - 2.0)*sin(4*M_PI*x*z) + 2.0*M_PI*x*cos(4*M_PI*x*z) + 0.125*M_PI*((16*pow(M_PI, 2)*x*z*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*sin(4*M_PI*x*z) + 4*M_PI*x*(M_PI*z - 1.0*M_PI)*sin(4*M_PI*x*z) - 16*M_PI*x*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - 16*M_PI*z*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z) + 4*M_PI*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) - 8*(pow(M_PI, 2)*x*z - 1.0*pow(M_PI, 2)*x)*sin(4*M_PI*x*z) - M_PI*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - M_PI*cos(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 3*(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))))*(-5.0*M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) - 0.15625*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) - 1.25*sin(4*M_PI*x*z) - M_PI*cos(4*M_PI*x)) + 2.5*(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))*(4*pow(M_PI, 2)*pow(x, 2)*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*pow(x, 2)*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + pow(M_PI, 2)*pow(x, 2)*sin(4*M_PI*x*z) - 8*M_PI*x*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z))/(pow(M_PI, 4)*pow(x, 6)))/(pow(M_PI, 2)*pow(x, 3)*pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2.0, 2)*pow(cos(4*M_PI*x*z), 2) + 2*pow(M_PI*x*(z - 2.0)*cos(4*M_PI*x*z) + 0.03125*M_PI*(-4*(-4*M_PI*z*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + (M_PI*z - 1.0*M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2.0*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 8.0/(pow(M_PI, 2)*pow(x, 3)) + 3*(4*(M_PI*x*z - 1.0*M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.25*sin(4*M_PI*x*z) + (1.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + 0.0625*pow(-4*M_PI*x*(M_PI*x*z - 1.0*M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16.0*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - 1.0*pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 4.0L/3.0L));
++			return 4*M_PI*sin(4*M_PI*x)*cos(4*M_PI*z) + (1.0L/10.0L)*pow(2, 1.0L/3.0L)*(40.0*pow(M_PI, 2)*x*z*(z - 2)*sin(4*M_PI*x*z) - 10.0*M_PI*z*cos(4*M_PI*x*z) - 10.0*M_PI*(z - 2)*cos(4*M_PI*x*z) + 1.25*M_PI*(32*cos(4*M_PI*x)/pow(x, 2) - 4*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(M_PI*pow(x, 3)) - 4*(4*pow(M_PI, 2)*pow(z, 2)*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*pow(z, 2)*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) - 2*M_PI*z*(-M_PI*z + M_PI)*sin(4*M_PI*x*z) - 8*M_PI*z*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - (pow(M_PI, 2)*pow(z, 2) - 2*pow(M_PI, 2)*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) - 20*sin(4*M_PI*x)/(M_PI*pow(x, 3)) - 6*(8*pow(M_PI, 2)*pow(x, 2) + 1)*cos(4*M_PI*x)/(pow(M_PI, 2)*pow(x, 4)) - 6*(-4*M_PI*z*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - (-M_PI*z + M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4)) + 3*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(pow(M_PI, 3)*pow(x, 5)) + 3*(4*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 5))) + 8*pow(M_PI, 2)*sin(4*M_PI*x))/pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2, 2)*pow(cos(4*M_PI*x*z), 2) + (1.0L/2.0L)*pow(2.0*M_PI*x*(z - 2)*cos(4*M_PI*x*z) - 0.0625*M_PI*(16*sin(4*M_PI*x)/(M_PI*pow(x, 2)) + 4*(8*pow(M_PI, 2)*pow(x, 2) + 1)*cos(4*M_PI*x)/(pow(M_PI, 2)*pow(x, 3)) + 4*(-4*M_PI*z*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - (-M_PI*z + M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) - 3*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(pow(M_PI, 3)*pow(x, 4)) - 3*(4*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.5*sin(4*M_PI*x*z) + (2.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + pow(M_PI*x*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 0.25*M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - 0.25*M_PI*x*cos(4*M_PI*x*z) - (pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 1.0L/3.0L) + (1.0L/750.0L)*pow(2, 1.0L/3.0L)*(-10.0*M_PI*x*(z - 2)*cos(4*M_PI*x*z) + 0.3125*M_PI*(16*sin(4*M_PI*x)/(M_PI*pow(x, 2)) + 4*(8*pow(M_PI, 2)*pow(x, 2) + 1)*cos(4*M_PI*x)/(pow(M_PI, 2)*pow(x, 3)) + 4*(-4*M_PI*z*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - (-M_PI*z + M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) - 3*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(pow(M_PI, 3)*pow(x, 4)) - 3*(4*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) - 2.5*sin(4*M_PI*x*z) - 2*M_PI*cos(4*M_PI*x))*(800.0*pow(M_PI, 3)*pow(z, 3)*pow(z - 2, 2)*sin(4*M_PI*x*z)*cos(4*M_PI*x*z) - (-10.0*M_PI*x*(z - 2)*cos(4*M_PI*x*z) + 0.3125*M_PI*(16*sin(4*M_PI*x)/(M_PI*pow(x, 2)) + 4*(8*pow(M_PI, 2)*pow(x, 2) + 1)*cos(4*M_PI*x)/(pow(M_PI, 2)*pow(x, 3)) + 4*(-4*M_PI*z*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - (-M_PI*z + M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) - 3*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(pow(M_PI, 3)*pow(x, 4)) - 3*(4*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) - 2.5*sin(4*M_PI*x*z) - 2*M_PI*cos(4*M_PI*x))*(40.0*pow(M_PI, 2)*x*z*(z - 2)*sin(4*M_PI*x*z) - 10.0*M_PI*z*cos(4*M_PI*x*z) - 10.0*M_PI*(z - 2)*cos(4*M_PI*x*z) + 1.25*M_PI*(32*cos(4*M_PI*x)/pow(x, 2) - 4*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(M_PI*pow(x, 3)) - 4*(4*pow(M_PI, 2)*pow(z, 2)*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*pow(z, 2)*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) - 2*M_PI*z*(-M_PI*z + M_PI)*sin(4*M_PI*x*z) - 8*M_PI*z*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - (pow(M_PI, 2)*pow(z, 2) - 2*pow(M_PI, 2)*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) - 20*sin(4*M_PI*x)/(M_PI*pow(x, 3)) - 6*(8*pow(M_PI, 2)*pow(x, 2) + 1)*cos(4*M_PI*x)/(pow(M_PI, 2)*pow(x, 4)) - 6*(-4*M_PI*z*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - (-M_PI*z + M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4)) + 3*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(pow(M_PI, 3)*pow(x, 5)) + 3*(4*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 5))) + 8*pow(M_PI, 2)*sin(4*M_PI*x)) - (50*M_PI*x*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 12.5*M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - 12.5*M_PI*x*cos(4*M_PI*x*z) - 50*(pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))*(4*pow(M_PI, 2)*x*z*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*x*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + pow(M_PI, 2)*x*z*sin(4*M_PI*x*z) - M_PI*x*(-M_PI*z + M_PI)*sin(4*M_PI*x*z) - 4.0*M_PI*x*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - 4*M_PI*z*(pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z) + M_PI*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 2*(pow(M_PI, 2)*x*z - pow(M_PI, 2)*x)*sin(4*M_PI*x*z) - 0.25*M_PI*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - 0.25*M_PI*cos(4*M_PI*x*z))/(pow(M_PI, 4)*pow(x, 6)) + 150*pow(M_PI*x*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 0.25*M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - 0.25*M_PI*x*cos(4*M_PI*x*z) - (pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 7)))/pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2, 2)*pow(cos(4*M_PI*x*z), 2) + (1.0L/2.0L)*pow(2.0*M_PI*x*(z - 2)*cos(4*M_PI*x*z) - 0.0625*M_PI*(16*sin(4*M_PI*x)/(M_PI*pow(x, 2)) + 4*(8*pow(M_PI, 2)*pow(x, 2) + 1)*cos(4*M_PI*x)/(pow(M_PI, 2)*pow(x, 3)) + 4*(-4*M_PI*z*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - (-M_PI*z + M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) - 3*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(pow(M_PI, 3)*pow(x, 4)) - 3*(4*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.5*sin(4*M_PI*x*z) + (2.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + pow(M_PI*x*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 0.25*M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - 0.25*M_PI*x*cos(4*M_PI*x*z) - (pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 4.0L/3.0L) - pow(2, 1.0L/3.0L)*(4.0*pow(M_PI, 2)*pow(x, 2)*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*pow(x, 2)*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + pow(M_PI, 2)*pow(x, 2)*sin(4*M_PI*x*z) - 8.0*M_PI*x*(pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z))/(pow(M_PI, 2)*pow(x, 3)*pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2, 2)*pow(cos(4*M_PI*x*z), 2) + (1.0L/2.0L)*pow(2.0*M_PI*x*(z - 2)*cos(4*M_PI*x*z) - 0.0625*M_PI*(16*sin(4*M_PI*x)/(M_PI*pow(x, 2)) + 4*(8*pow(M_PI, 2)*pow(x, 2) + 1)*cos(4*M_PI*x)/(pow(M_PI, 2)*pow(x, 3)) + 4*(-4*M_PI*z*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - (-M_PI*z + M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) - 3*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(pow(M_PI, 3)*pow(x, 4)) - 3*(4*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.5*sin(4*M_PI*x*z) + (2.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + pow(M_PI*x*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 0.25*M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - 0.25*M_PI*x*cos(4*M_PI*x*z) - (pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 1.0L/3.0L)) - 1.0L/15.0L*pow(2, 1.0L/3.0L)*(M_PI*x*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 0.25*M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - 0.25*M_PI*x*cos(4*M_PI*x*z) + (-1.0*pow(M_PI, 2)*pow(x, 2)*z + pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))*(160.0*pow(M_PI, 3)*x*pow(z, 2)*pow(z - 2, 2)*sin(4*M_PI*x*z)*cos(4*M_PI*x*z) - 40.0*pow(M_PI, 2)*pow(z, 2)*(z - 2)*pow(cos(4*M_PI*x*z), 2) - 40.0*pow(M_PI, 2)*z*pow(z - 2, 2)*pow(cos(4*M_PI*x*z), 2) + (-8.0*pow(M_PI, 2)*pow(x, 2)*(z - 2)*sin(4*M_PI*x*z) + 4.0*M_PI*x*cos(4*M_PI*x*z) + 0.25*M_PI*((16*pow(M_PI, 2)*x*z*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + 4*pow(M_PI, 2)*x*z*sin(4*M_PI*x*z) - 4*M_PI*x*(-M_PI*z + M_PI)*sin(4*M_PI*x*z) - 16*M_PI*x*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*cos(4*M_PI*x*z) - 16*M_PI*z*(pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z) + 4*M_PI*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 8*(pow(M_PI, 2)*x*z - pow(M_PI, 2)*x)*sin(4*M_PI*x*z) - M_PI*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - M_PI*cos(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) + 3*(-4*M_PI*x*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) + M_PI*x*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))))*(-10.0*M_PI*x*(z - 2)*cos(4*M_PI*x*z) + 0.3125*M_PI*(16*sin(4*M_PI*x)/(M_PI*pow(x, 2)) + 4*(8*pow(M_PI, 2)*pow(x, 2) + 1)*cos(4*M_PI*x)/(pow(M_PI, 2)*pow(x, 3)) + 4*(-4*M_PI*z*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - (-M_PI*z + M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) - 3*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(pow(M_PI, 3)*pow(x, 4)) - 3*(4*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) - 2.5*sin(4*M_PI*x*z) - 2*M_PI*cos(4*M_PI*x)) - (10*M_PI*x*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 2.5*M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - 2.5*M_PI*x*cos(4*M_PI*x*z) - 10*(pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z))*(4*pow(M_PI, 2)*pow(x, 2)*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + pow(M_PI, 2)*pow(x, 2)*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z) + pow(M_PI, 2)*pow(x, 2)*sin(4*M_PI*x*z) - 8.0*M_PI*x*(pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*cos(4*M_PI*x*z))/(pow(M_PI, 4)*pow(x, 6)))/(pow(M_PI, 2)*pow(x, 3)*pow(4.0*pow(M_PI, 2)*pow(z, 2)*pow(z - 2, 2)*pow(cos(4*M_PI*x*z), 2) + (1.0L/2.0L)*pow(2.0*M_PI*x*(z - 2)*cos(4*M_PI*x*z) - 0.0625*M_PI*(16*sin(4*M_PI*x)/(M_PI*pow(x, 2)) + 4*(8*pow(M_PI, 2)*pow(x, 2) + 1)*cos(4*M_PI*x)/(pow(M_PI, 2)*pow(x, 3)) + 4*(-4*M_PI*z*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) + M_PI*z*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - (-M_PI*z + M_PI)*cos(4*M_PI*x*z) + 4*(pow(M_PI, 2)*x*pow(z, 2) - 2*pow(M_PI, 2)*x*z)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 3)) - 3*(8*pow(M_PI, 2)*pow(x, 2) + 1)*sin(4*M_PI*x)/(pow(M_PI, 3)*pow(x, 4)) - 3*(4*(M_PI*x*z - M_PI*x)*cos(4*M_PI*x*z) + (8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*sin(4*M_PI*x*z))/(pow(M_PI, 3)*pow(x, 4))) + 0.5*sin(4*M_PI*x*z) + (2.0L/5.0L)*M_PI*cos(4*M_PI*x), 2) + pow(M_PI*x*(M_PI*x*z - M_PI*x)*sin(4*M_PI*x*z) - 0.25*M_PI*x*(8*pow(M_PI, 2)*pow(x, 2)*pow(z, 2) - 16*pow(M_PI, 2)*pow(x, 2)*z - 1)*cos(4*M_PI*x*z) - 0.25*M_PI*x*cos(4*M_PI*x*z) - (pow(M_PI, 2)*pow(x, 2)*z - pow(M_PI, 2)*pow(x, 2))*sin(4*M_PI*x*z), 2)/(pow(M_PI, 4)*pow(x, 6)), 4.0L/3.0L));
+ 		case 21:
+ 			z=y;
+ 			return x + (4.0L/3.0L)*pow(2, 1.0L/3.0L)*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x))*(4*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1)) + 4*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x))*(2*pow(x, 3) - 3*pow(x, 2) + x + 6*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 6*z*(2*pow(x, 3) - 3*pow(x, 2) + x)) + (2*pow(x, 2)*z*pow(x - 1, 2) + 2*pow(x, 2)*pow(x - 1, 2)*(z - 1) + pow(x, 2)*pow(x - 1, 2)*(2*z - 1) - 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) + 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) - z*(6*pow(x, 2) - 6*x + 1))*(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1)))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 4.0L/3.0L) - 1.0L/3.0L*pow(2, 1.0L/3.0L)*(4*(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1))*(pow(x, 2)*z*(z - 1)*(2*z - 1) + 4*x*z*(x - 1)*(z - 1)*(2*z - 1) + z*pow(x - 1, 2)*(z - 1)*(2*z - 1)) + 4*(2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - 3*pow(z, 2)*(6*pow(x, 2) - 6*x + 1) + z*(6*pow(x, 2) - 6*x + 1))*(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x)) + (2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1))*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1) - 3*pow(z, 4)*(2*x - 1) + 6*pow(z, 3)*(2*x - 1) - 3*pow(z, 2)*(2*x - 1)))*(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 4.0L/3.0L) - 0.5 - 2*pow(2, 1.0L/3.0L)*(2*pow(x, 3) - 3*pow(x, 2) + x + 6*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 6*z*(2*pow(x, 3) - 3*pow(x, 2) + x))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 1.0L/3.0L) + pow(2, 1.0L/3.0L)*(2*pow(x, 2)*z*(x - 1)*(z - 1) + pow(x, 2)*z*(x - 1)*(2*z - 1) + pow(x, 2)*(x - 1)*(z - 1)*(2*z - 1) + 2*x*z*pow(x - 1, 2)*(z - 1) + x*z*pow(x - 1, 2)*(2*z - 1) + x*pow(x - 1, 2)*(z - 1)*(2*z - 1) - 3*pow(z, 4)*(2*x - 1) + 6*pow(z, 3)*(2*x - 1) - 3*pow(z, 2)*(2*x - 1))/pow(4*pow(pow(x, 2)*z*(x - 1)*(z - 1)*(2*z - 1) + x*z*pow(x - 1, 2)*(z - 1)*(2*z - 1), 2) + 4*pow(2*pow(z, 3)*(2*pow(x, 3) - 3*pow(x, 2) + x) - 3*pow(z, 2)*(2*pow(x, 3) - 3*pow(x, 2) + x) + z*(2*pow(x, 3) - 3*pow(x, 2) + x), 2) + (1.0L/2.0L)*pow(2*pow(x, 2)*z*pow(x - 1, 2)*(z - 1) + pow(x, 2)*z*pow(x - 1, 2)*(2*z - 1) + pow(x, 2)*pow(x - 1, 2)*(z - 1)*(2*z - 1) - pow(z, 4)*(6*pow(x, 2) - 6*x + 1) + 2*pow(z, 3)*(6*pow(x, 2) - 6*x + 1) - pow(z, 2)*(6*pow(x, 2) - 6*x + 1), 2), 1.0L/3.0L);
++		case 22:
++			z=y;
++			return (2.0L/9.0L)*pow(2, 1.0L/3.0L)*(4*pow(z, 3)*(pow(x, 3) - 3*pow(x, 2) + 2*x) - 16*pow(z, 2)*(pow(x, 3) - 3*pow(x, 2) + 2*x) + 16*z*(pow(x, 3) - 3*pow(x, 2) + 2*x) + 1)*(48*pow(x, 8) - 384*pow(x, 7) + 1152*pow(x, 6) - 1536*pow(x, 5) + 768*pow(x, 4) - 96*pow(x, 3) + 288*pow(x, 2) - 192*x - 6*pow(z, 7)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) + 56*pow(z, 6)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) - pow(z, 5)*(207*pow(x, 6) - 1242*pow(x, 5) + 4518*pow(x, 4) - 9792*pow(x, 3) + 10536*pow(x, 2) - 4800*x + 800) + 20*pow(z, 4)*(69*pow(x, 6) - 414*pow(x, 5) + 1050*pow(x, 4) - 1440*pow(x, 3) + 1080*pow(x, 2) - 384*x + 64) - pow(z, 3)*(27*pow(x, 8) - 216*pow(x, 7) + 3984*pow(x, 6) - 20880*pow(x, 5) + 45952*pow(x, 4) - 48640*pow(x, 3) + 24256*pow(x, 2) - 4608*x + 768) + 12*pow(z, 2)*(9*pow(x, 8) - 72*pow(x, 7) + 504*pow(x, 6) - 2016*pow(x, 5) + 3920*pow(x, 4) - 3590*pow(x, 3) + 1298*pow(x, 2) - 12*x) - 12*z*(11*pow(x, 8) - 88*pow(x, 7) + 368*pow(x, 6) - 976*pow(x, 5) + 1536*pow(x, 4) - 1296*pow(x, 3) + 496*pow(x, 2) - 32*x))/pow(8*pow(x, 8) - 64*pow(x, 7) + 192*pow(x, 6) - 256*pow(x, 5) + 128*pow(x, 4) + (1.0L/2.0L)*pow(z, 8)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) - 16.0L/3.0L*pow(z, 7)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) + (1.0L/9.0L)*pow(z, 6)*(207*pow(x, 6) - 1242*pow(x, 5) + 4518*pow(x, 4) - 9792*pow(x, 3) + 10536*pow(x, 2) - 4800*x + 800) - 8.0L/3.0L*pow(z, 5)*(69*pow(x, 6) - 414*pow(x, 5) + 1050*pow(x, 4) - 1440*pow(x, 3) + 1080*pow(x, 2) - 384*x + 64) + (1.0L/6.0L)*pow(z, 4)*(27*pow(x, 8) - 216*pow(x, 7) + 3984*pow(x, 6) - 20880*pow(x, 5) + 45952*pow(x, 4) - 48640*pow(x, 3) + 24256*pow(x, 2) - 4608*x + 768) - 8.0L/3.0L*pow(z, 3)*(9*pow(x, 8) - 72*pow(x, 7) + 504*pow(x, 6) - 2016*pow(x, 5) + 3920*pow(x, 4) - 3590*pow(x, 3) + 1298*pow(x, 2) - 12*x) + 4*pow(z, 2)*(11*pow(x, 8) - 88*pow(x, 7) + 368*pow(x, 6) - 976*pow(x, 5) + 1536*pow(x, 4) - 1296*pow(x, 3) + 496*pow(x, 2) - 32*x) - 32*z*(pow(x, 8) - 8*pow(x, 7) + 24*pow(x, 6) - 32*pow(x, 5) + 16*pow(x, 4) - 2*pow(x, 3) + 6*pow(x, 2) - 4*x) + 2, 4.0L/3.0L) + 4*pow(2, 1.0L/3.0L)*(4*pow(x, 3) - 12*pow(x, 2) + 8*x + 3*pow(z, 2)*(pow(x, 3) - 3*pow(x, 2) + 2*x) - 8*z*(pow(x, 3) - 3*pow(x, 2) + 2*x))/pow(8*pow(x, 8) - 64*pow(x, 7) + 192*pow(x, 6) - 256*pow(x, 5) + 128*pow(x, 4) + (1.0L/2.0L)*pow(z, 8)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) - 16.0L/3.0L*pow(z, 7)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) + (1.0L/9.0L)*pow(z, 6)*(207*pow(x, 6) - 1242*pow(x, 5) + 4518*pow(x, 4) - 9792*pow(x, 3) + 10536*pow(x, 2) - 4800*x + 800) - 8.0L/3.0L*pow(z, 5)*(69*pow(x, 6) - 414*pow(x, 5) + 1050*pow(x, 4) - 1440*pow(x, 3) + 1080*pow(x, 2) - 384*x + 64) + (1.0L/6.0L)*pow(z, 4)*(27*pow(x, 8) - 216*pow(x, 7) + 3984*pow(x, 6) - 20880*pow(x, 5) + 45952*pow(x, 4) - 48640*pow(x, 3) + 24256*pow(x, 2) - 4608*x + 768) - 8.0L/3.0L*pow(z, 3)*(9*pow(x, 8) - 72*pow(x, 7) + 504*pow(x, 6) - 2016*pow(x, 5) + 3920*pow(x, 4) - 3590*pow(x, 3) + 1298*pow(x, 2) - 12*x) + 4*pow(z, 2)*(11*pow(x, 8) - 88*pow(x, 7) + 368*pow(x, 6) - 976*pow(x, 5) + 1536*pow(x, 4) - 1296*pow(x, 3) + 496*pow(x, 2) - 32*x) - 32*z*(pow(x, 8) - 8*pow(x, 7) + 24*pow(x, 6) - 32*pow(x, 5) + 16*pow(x, 4) - 2*pow(x, 3) + 6*pow(x, 2) - 4*x) + 2, 1.0L/3.0L) + (1.0L/27.0L)*pow(2, 1.0L/3.0L)*(6*pow(x, 2)*z*pow(x - 2, 2)*(z - 2) + 3*pow(x, 2)*pow(x - 2, 2)*pow(z - 2, 2) - 3*pow(z, 4)*(3*pow(x, 2) - 6*x + 2) + 16*pow(z, 3)*(3*pow(x, 2) - 6*x + 2) - 24*pow(z, 2)*(3*pow(x, 2) - 6*x + 2))*(96*pow(x, 7) - 672*pow(x, 6) + 1728*pow(x, 5) - 1920*pow(x, 4) + 768*pow(x, 3) + 9*pow(z, 8)*(3*pow(x, 3) - 9*pow(x, 2) + 8*x - 2) - 96*pow(z, 7)*(3*pow(x, 3) - 9*pow(x, 2) + 8*x - 2) + pow(z, 6)*(207*pow(x, 5) - 1035*pow(x, 4) + 3012*pow(x, 3) - 4896*pow(x, 2) + 3512*x - 800) - 24*pow(z, 5)*(69*pow(x, 5) - 345*pow(x, 4) + 700*pow(x, 3) - 720*pow(x, 2) + 360*x - 64) + 2*pow(z, 4)*(27*pow(x, 7) - 189*pow(x, 6) + 2988*pow(x, 5) - 13050*pow(x, 4) + 22976*pow(x, 3) - 18240*pow(x, 2) + 6064*x - 576) - 8*pow(z, 3)*(36*pow(x, 7) - 252*pow(x, 6) + 1512*pow(x, 5) - 5040*pow(x, 4) + 7840*pow(x, 3) - 5385*pow(x, 2) + 1298*x - 6) + 48*pow(z, 2)*(11*pow(x, 7) - 77*pow(x, 6) + 276*pow(x, 5) - 610*pow(x, 4) + 768*pow(x, 3) - 486*pow(x, 2) + 124*x - 4) - 96*z*(4*pow(x, 7) - 28*pow(x, 6) + 72*pow(x, 5) - 80*pow(x, 4) + 32*pow(x, 3) - 3*pow(x, 2) + 6*x - 2))/pow(8*pow(x, 8) - 64*pow(x, 7) + 192*pow(x, 6) - 256*pow(x, 5) + 128*pow(x, 4) + (1.0L/2.0L)*pow(z, 8)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) - 16.0L/3.0L*pow(z, 7)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) + (1.0L/9.0L)*pow(z, 6)*(207*pow(x, 6) - 1242*pow(x, 5) + 4518*pow(x, 4) - 9792*pow(x, 3) + 10536*pow(x, 2) - 4800*x + 800) - 8.0L/3.0L*pow(z, 5)*(69*pow(x, 6) - 414*pow(x, 5) + 1050*pow(x, 4) - 1440*pow(x, 3) + 1080*pow(x, 2) - 384*x + 64) + (1.0L/6.0L)*pow(z, 4)*(27*pow(x, 8) - 216*pow(x, 7) + 3984*pow(x, 6) - 20880*pow(x, 5) + 45952*pow(x, 4) - 48640*pow(x, 3) + 24256*pow(x, 2) - 4608*x + 768) - 8.0L/3.0L*pow(z, 3)*(9*pow(x, 8) - 72*pow(x, 7) + 504*pow(x, 6) - 2016*pow(x, 5) + 3920*pow(x, 4) - 3590*pow(x, 3) + 1298*pow(x, 2) - 12*x) + 4*pow(z, 2)*(11*pow(x, 8) - 88*pow(x, 7) + 368*pow(x, 6) - 976*pow(x, 5) + 1536*pow(x, 4) - 1296*pow(x, 3) + 496*pow(x, 2) - 32*x) - 32*z*(pow(x, 8) - 8*pow(x, 7) + 24*pow(x, 6) - 32*pow(x, 5) + 16*pow(x, 4) - 2*pow(x, 3) + 6*pow(x, 2) - 4*x) + 2, 4.0L/3.0L) - pow(2, 1.0L/3.0L)*(2*pow(x, 2)*z*(x - 2)*(z - 2) + pow(x, 2)*(x - 2)*pow(z - 2, 2) + 2*x*z*pow(x - 2, 2)*(z - 2) + x*pow(x - 2, 2)*pow(z - 2, 2) - 3*pow(z, 4)*(x - 1) + 16*pow(z, 3)*(x - 1) - 24*pow(z, 2)*(x - 1))/pow(8*pow(x, 8) - 64*pow(x, 7) + 192*pow(x, 6) - 256*pow(x, 5) + 128*pow(x, 4) + (1.0L/2.0L)*pow(z, 8)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) - 16.0L/3.0L*pow(z, 7)*(9*pow(x, 4) - 36*pow(x, 3) + 48*pow(x, 2) - 24*x + 4) + (1.0L/9.0L)*pow(z, 6)*(207*pow(x, 6) - 1242*pow(x, 5) + 4518*pow(x, 4) - 9792*pow(x, 3) + 10536*pow(x, 2) - 4800*x + 800) - 8.0L/3.0L*pow(z, 5)*(69*pow(x, 6) - 414*pow(x, 5) + 1050*pow(x, 4) - 1440*pow(x, 3) + 1080*pow(x, 2) - 384*x + 64) + (1.0L/6.0L)*pow(z, 4)*(27*pow(x, 8) - 216*pow(x, 7) + 3984*pow(x, 6) - 20880*pow(x, 5) + 45952*pow(x, 4) - 48640*pow(x, 3) + 24256*pow(x, 2) - 4608*x + 768) - 8.0L/3.0L*pow(z, 3)*(9*pow(x, 8) - 72*pow(x, 7) + 504*pow(x, 6) - 2016*pow(x, 5) + 3920*pow(x, 4) - 3590*pow(x, 3) + 1298*pow(x, 2) - 12*x) + 4*pow(z, 2)*(11*pow(x, 8) - 88*pow(x, 7) + 368*pow(x, 6) - 976*pow(x, 5) + 1536*pow(x, 4) - 1296*pow(x, 3) + 496*pow(x, 2) - 32*x) - 32*z*(pow(x, 8) - 8*pow(x, 7) + 24*pow(x, 6) - 32*pow(x, 5) + 16*pow(x, 4) - 2*pow(x, 3) + 6*pow(x, 2) - 4*x) + 2, 1.0L/3.0L) - 10;
+ 		case 24:
+ 			return -pow(2, 1.0L/3.0L)*pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*z)*cos(PI*p*y)/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 1.0L/3.0L) + (1.0L/3.0L)*pow(2, 1.0L/3.0L)*PI*p*(12*pow(PI, 3)*pow(p, 3)*pow(sin(PI*p*x), 2)*sin(PI*p*y)*pow(sin(PI*p*z), 2)*cos(PI*p*y) + (-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x))*(2*pow(PI, 2)*pow(p, 2)*(cos(PI*p*x) - 1)*sin(PI*p*y)*sin(PI*p*z) - pow(PI, 2)*pow(p, 2)*sin(PI*p*y)*sin(PI*p*z)*cos(PI*p*x)) - (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z))*(pow(PI, 3)*pow(p, 3)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*sin(PI*p*y) + pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*y)*cos(PI*p*z)) + (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z))*(pow(PI, 3)*pow(p, 3)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*cos(PI*p*x)*cos(PI*p*y) - 2*pow(PI, 2)*pow(p, 2)*(cos(PI*p*x) - 1)*cos(PI*p*y)*cos(PI*p*z)))*sin(PI*p*x)*sin(PI*p*y)*sin(PI*p*z)/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 4.0L/3.0L) + PI*q*sin(PI*q*x)*sin(PI*q*z)*cos(PI*q*y) - 1.0L/6.0L*pow(2, 1.0L/3.0L)*(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x))*(12*pow(PI, 3)*pow(p, 3)*sin(PI*p*x)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2)*cos(PI*p*x) - (-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x))*(pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*sin(PI*p*x)*sin(PI*p*z) - 2*pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*z)*cos(PI*p*y)) + (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z))*(pow(PI, 3)*pow(p, 3)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*cos(PI*p*x)*cos(PI*p*y) + pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*cos(PI*p*x)*cos(PI*p*z)) - (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z))*(pow(PI, 3)*pow(p, 3)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*sin(PI*p*y) - 2*pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*y)*cos(PI*p*z)))/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 4.0L/3.0L) - 1.0L/6.0L*pow(2, 1.0L/3.0L)*(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z))*(12*pow(PI, 3)*pow(p, 3)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*sin(PI*p*z)*cos(PI*p*z) + (-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x))*(-2*pow(PI, 2)*pow(p, 2)*(cos(PI*p*x) - 1)*cos(PI*p*y)*cos(PI*p*z) + pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*cos(PI*p*x)*cos(PI*p*z)) - (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z))*(pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*sin(PI*p*x)*sin(PI*p*z) + pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*z)*cos(PI*p*y)) + (pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z))*(2*pow(PI, 2)*pow(p, 2)*(cos(PI*p*x) - 1)*sin(PI*p*y)*sin(PI*p*z) - pow(PI, 2)*pow(p, 2)*sin(PI*p*y)*sin(PI*p*z)*cos(PI*p*x)))/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 4.0L/3.0L) - 1.0L/2.0L*pow(2, 1.0L/3.0L)*(pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*sin(PI*p*x)*sin(PI*p*z) - 2*pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*z)*cos(PI*p*y))/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 1.0L/3.0L) - 1.0L/2.0L*pow(2, 1.0L/3.0L)*(pow(PI, 2)*pow(p, 2)*(cos(PI*p*y) - 1)*sin(PI*p*x)*sin(PI*p*z) + pow(PI, 2)*pow(p, 2)*sin(PI*p*x)*sin(PI*p*z)*cos(PI*p*y))/pow(6*pow(PI, 2)*pow(p, 2)*pow(sin(PI*p*x), 2)*pow(sin(PI*p*y), 2)*pow(sin(PI*p*z), 2) + (1.0L/2.0L)*pow(-2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*z)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*z)*cos(PI*p*x), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*x)*cos(PI*p*y) + PI*p*(cos(PI*p*y) - 1)*sin(PI*p*x)*cos(PI*p*z), 2) + (1.0L/2.0L)*pow(pow(PI, 2)*pow(p, 2)*(cos(PI*p*z)/(PI*p) - 1/(PI*p))*sin(PI*p*y)*cos(PI*p*x) - 2*PI*p*(cos(PI*p*x) - 1)*sin(PI*p*y)*cos(PI*p*z), 2), 1.0L/3.0L); 
+ 
+@@ -129,7 +135,7 @@
+ 	IssmDouble a = 1.0;
+ 
+ 	switch(testid){
+-		case 1: case 2: case 7: case 8: case 11:  case 12: case 13: case 14: case 18: case 21:
++		case 1: case 2: case 7: case 8: case 11:  case 12: case 13: case 14: case 18: case 21: case 22:
+ 			return 0.;
+ 		case 3: 
+ 			return 2*pow(x, 2)*y*z*(x - 1)*(y - 1)*(2*y - 1) + 2*pow(x, 2)*y*(x - 1)*(y - 1)*(2*y - 1)*(z - 1) - 2*x*pow(y, 2)*z*(x - 1)*(2*x - 1)*(y - 1) - 2*x*pow(y, 2)*(x - 1)*(2*x - 1)*(y - 1)*(z - 1) + 2*x*y*z*pow(x - 1, 2)*(y - 1)*(2*y - 1) - 2*x*y*z*(x - 1)*(2*x - 1)*pow(y - 1, 2) + 2*x*y*pow(x - 1, 2)*(y - 1)*(2*y - 1)*(z - 1) - 2*x*y*(x - 1)*(2*x - 1)*pow(y - 1, 2)*(z - 1);
+@@ -155,7 +161,7 @@
+ 	IssmDouble q = 2.0;   
+ 
+ 	switch(testid){
+-		case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 21:
++		case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 21: case 22:
+ 			return 0.;
+ 		case 18:
+ 			return (120.0L/109.0L)*sqrt(109.)/(10*x - 3*z);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18648-18649.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18648-18649.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18648-18649.diff	(revision 19102)
@@ -0,0 +1,30 @@
+Index: ../trunk-jpl/src/m/classes/mask.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mask.m	(revision 18648)
++++ ../trunk-jpl/src/m/classes/mask.m	(revision 18649)
+@@ -52,6 +52,10 @@
+ 			if max(md.mask.ice_levelset)<0,
+ 				warning('no ice front provided');
+ 			end
++			icefront=sum(md.mask.ice_levelset(md.mesh.elements)==0,2);
++			if (max(icefront)==3 & strcmp(elementtype(md.mesh),'Tria')) | (max(icefront==6) & strcmp(elementtype(md.mesh),'Penta')),
++				error('At least one element has all nodes on ice front, change md.mask.ice_levelset to fix it')
++			end
+ 		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   masks:'));
+Index: ../trunk-jpl/src/m/classes/mask.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/mask.py	(revision 18648)
++++ ../trunk-jpl/src/m/classes/mask.py	(revision 18649)
+@@ -37,6 +37,10 @@
+ 		if numpy.sum(isice)==0:
+ 			raise TypeError("no ice present in the domain")
+ 
++		icefront=numpy.sum(md.mask.ice_levelset[md.mesh.elements]==0,2)
++		if (max(icefront)==3 and m.strcmp(md.mesh.elementtype(),'Tria')) or (max(icefront==6) and m.strcmp(md.mesh.elementtype(),'Penta')):
++			raise TypeError("At least one element has all nodes on ice front, change md.mask.ice_levelset to fix it")
++
+ 		return md
+ 	# }}}
+ 	def marshall(self,md,fid):    # {{{
Index: /issm/oecreview/Archive/18296-19100/ISSM-18649-18650.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18649-18650.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18649-18650.diff	(revision 19102)
@@ -0,0 +1,49 @@
+Index: ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18649)
++++ ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18650)
+@@ -81,10 +81,10 @@
+ 	element->GetVerticesCoordinates(&xyz_list);
+ 	Input* omega_input = element->GetInput(BalancethicknessOmegaEnum); _assert_(omega_input);
+ 	Input* D0_input    = element->GetInput(BalancethicknessD0Enum);
+-	//if(!D0_input){
++	if(!D0_input){
+ 		this->CreateD0(element);
+ 		D0_input = element->GetInput(BalancethicknessD0Enum); _assert_(D0_input);
+-	//}
++	}
+ 
+ 	/* Start  looping on the number of gaussian points: */
+ 	Gauss* gauss=element->NewGauss(2);
+Index: ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18649)
++++ ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18650)
+@@ -112,7 +112,17 @@
+ 		default: _printf0_("   Unknown end condition\n");
+ 	}
+ 
+-	/*Get solution*/
++	/*Constrain solution vector*/
++	IssmDouble  *XL = NULL;
++	IssmDouble  *XU = NULL;
++	GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");
++	GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
++	if(num_controls!=1) _error_("not supported yet");
++	for(long i=0;i<n;i++){
++		X[i] = X[i]*scaling_factors[0];
++		if(X[i]>XU[i]) X[i]=XU[i];
++		if(X[i]<XL[i]) X[i]=XL[i];
++	}
+ 	SetControlInputsFromVectorx(femmodel,X);
+ 	ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,G);
+ 	femmodel->OutputControlsx(&femmodel->results);
+@@ -129,6 +139,8 @@
+ 	xDelete<double>(G);
+ 	xDelete<double>(X);
+ 	xDelete<double>(dz);
++	xDelete<double>(XU);
++	xDelete<double>(XL);
+ }
+ 
+ /*Cost function definition*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18650-18651.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18650-18651.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18650-18651.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/cores/controlvalidation_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/controlvalidation_core.cpp	(revision 18650)
++++ ../trunk-jpl/src/c/cores/controlvalidation_core.cpp	(revision 18651)
+@@ -70,7 +70,7 @@
+ 
+ 		/*Create new vector*/
+ 		alpha    = pow(2.,-m);
+-		for(int i=0;i<n;i++) X[i] = X0[i] + alpha;
++		for(int i=0;i<n;i++) X[i] = X0[i] + alpha*scaling_factors[0];
+ 
+ 		/*Calculate j(k+alpha delta k) */
+ 		SetControlInputsFromVectorx(femmodel,X);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18651-18652.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18651-18652.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18651-18652.diff	(revision 19102)
@@ -0,0 +1,112 @@
+Index: ../trunk-jpl/src/m/classes/mask.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/mask.py	(revision 18651)
++++ ../trunk-jpl/src/m/classes/mask.py	(revision 18652)
+@@ -37,7 +37,7 @@
+ 		if numpy.sum(isice)==0:
+ 			raise TypeError("no ice present in the domain")
+ 
+-		icefront=numpy.sum(md.mask.ice_levelset[md.mesh.elements]==0,2)
++		icefront=numpy.sum(md.mask.ice_levelset[md.mesh.elements-1]==0,axis=1)
+ 		if (max(icefront)==3 and m.strcmp(md.mesh.elementtype(),'Tria')) or (max(icefront==6) and m.strcmp(md.mesh.elementtype(),'Penta')):
+ 			raise TypeError("At least one element has all nodes on ice front, change md.mask.ice_levelset to fix it")
+ 
+Index: ../trunk-jpl/src/m/classes/stressbalance.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/stressbalance.m	(revision 18651)
++++ ../trunk-jpl/src/m/classes/stressbalance.m	(revision 18652)
+@@ -25,50 +25,50 @@
+ 		requested_outputs      = {};
+ 	end
+ 	methods
+-        function createxml(obj,fid) % {{{
+-            fprintf(fid, '\n\n');
+-            fprintf(fid, '%s\n', '<!-- StressBalance solution parameters: -->');
+-            
+-            % Convergence criteria            
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Convergence criteria">','<section name="stressbalance" />'); 
+-			 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="restol" type="',      class(obj.restol),'" default="',        convert2str(obj.restol),'">',	'     <section name="stressbalance" />','     <help> mechanical equilibrium residual convergence criterion </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="reltol" type="',          class(obj.reltol),'" default="',            convert2str(obj.reltol),'">',     '     <section name="stressbalance" />','     <help> velocity relative convergence criterion, NaN: not applied </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',	'<parameter key ="abstol" type="',        class(obj.abstol),'" default="',          convert2str(obj.abstol),'">',	'     <section name="stressbalance" />','     <help> velocity absolute convergence criterion, NaN: not applied </help>','</parameter>');
+-             
+-             %is newton drop-down (0,1,or 2)
+-             fprintf(fid,'%s\n%s\n%s\n%s\n',    '<parameter key ="isnewton" type="alternative" optional="false">',	'     <section name="stressbalance" />','     <help> 0: Picards fixed point, 1: Newtons method, 2: hybrid </help>');
+-             fprintf(fid,'%s\n','       <option value="0" type="string" default="true"> </option>');
+-             fprintf(fid,'%s\n','       <option value="1" type="string" default="false"> </option>');
+-             fprintf(fid,'%s\n%s\n','       <option value="2" type="string" default="false"> </option>','</parameter>');
+-    
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="maxiter" type="',  	class(obj.maxiter),'" default="',       convert2str(obj.maxiter),'">',     '     <section name="stressbalance" />','     <help> maximum number of nonlinear iterations </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="viscosity_overshoot" type="',         class(obj.viscosity_overshoot),'" default="',           convert2str(obj.viscosity_overshoot),'">',	'     <section name="stressbalance" />','     <help> over-shooting constant new=new+C*(new-old) </help>','</parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-            
+-            % boundary conditions    
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="2" label="Boundary conditions">','<section name="stressbalance" />'); 			 
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcvx" type="',     	class(obj.spcvx),'" default="',    	convert2str(obj.spcvx),'">',     '     <section name="stressbalance" />','     <help> x-axis velocity constraint (NaN means no constraint) [m/yr] </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcvy" type="',     	class(obj.spcvy),'" default="',    	convert2str(obj.spcvy),'">',	'     <section name="stressbalance" />','     <help> y-axis velocity constraint (NaN means no constraint) [m/yr] </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcvz" type="',    	class(obj.spcvz),'" default="',    	convert2str(obj.spcvz),'">',     '     <section name="stressbalance" />','     <help> z-axis velocity constraint (NaN means no constraint) [m/yr] </help>','</parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-            
+-            % Rift options   
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="3" label="Rift options">','<section name="stressbalance" />'); 	
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="rift_penalty_threshold" type="',    	class(obj.rift_penalty_threshold),'" default="',       convert2str(obj.rift_penalty_threshold),'">',     '     <section name="stressbalance" />','     <help> threshold for instability of mechanical constraints </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    	'<parameter key ="rift_penalty_lock" type="',         class(obj.rift_penalty_lock),'" default="',           convert2str(obj.rift_penalty_lock),'">',	'     <section name="stressbalance" />','     <help> number of iterations before rift penalties are locked </help>','</parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>'); 
+-            
+-            %others
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="4" label="Other">','<section name="stressbalance" />'); 	
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="shelf_dampening" type="',  	class(obj.shelf_dampening),'" default="',       convert2str(obj.shelf_dampening),'">',     '     <section name="stressbalance" />','     <help> use dampening for floating ice ? Only for FS model </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',  	'<parameter key ="FSreconditioning" type="', 	class(obj.FSreconditioning),'" default="',           convert2str(obj.FSreconditioning),'">',	'     <section name="stressbalance" />','     <help> multiplier for incompressibility equation. Only for FS model </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="referential" type="',  	class(obj.referential),'" default="',       convert2str(obj.referential),'">',     '     <section name="stressbalance" />','     <help> local referential </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',  	'<parameter key ="loadingforce" type="', 	class(obj.loadingforce),'" default="',           convert2str(obj.loadingforce),'">',	'     <section name="stressbalance" />','     <help> loading force applied on each point [N/m^3] </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="requested_outputs" type="',  	class(obj.requested_outputs),'" default="',       convert2str(obj.requested_outputs),'">',     '     <section name="stressbalance" />','     <help> additional outputs requested </help>','</parameter>');
+-             
+-            
+-            fprintf(fid,'%s\n%s\n','</frame>'); 
+-        end % }}}
++		function createxml(obj,fid) % {{{
++			fprintf(fid, '\n\n');
++			fprintf(fid, '%s\n', '<!-- StressBalance solution parameters: -->');
++
++			% Convergence criteria            
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Convergence criteria">','<section name="stressbalance" />'); 
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="restol" type="',      class(obj.restol),'" default="',        convert2str(obj.restol),'">',	'     <section name="stressbalance" />','     <help> mechanical equilibrium residual convergence criterion </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="reltol" type="',          class(obj.reltol),'" default="',            convert2str(obj.reltol),'">',     '     <section name="stressbalance" />','     <help> velocity relative convergence criterion, NaN: not applied </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',	'<parameter key ="abstol" type="',        class(obj.abstol),'" default="',          convert2str(obj.abstol),'">',	'     <section name="stressbalance" />','     <help> velocity absolute convergence criterion, NaN: not applied </help>','</parameter>');
++
++			%is newton drop-down (0,1,or 2)
++			fprintf(fid,'%s\n%s\n%s\n%s\n',    '<parameter key ="isnewton" type="alternative" optional="false">',	'     <section name="stressbalance" />','     <help> 0: Picards fixed point, 1: Newtons method, 2: hybrid </help>');
++			fprintf(fid,'%s\n','       <option value="0" type="string" default="true"> </option>');
++			fprintf(fid,'%s\n','       <option value="1" type="string" default="false"> </option>');
++			fprintf(fid,'%s\n%s\n','       <option value="2" type="string" default="false"> </option>','</parameter>');
++
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="maxiter" type="',  	class(obj.maxiter),'" default="',       convert2str(obj.maxiter),'">',     '     <section name="stressbalance" />','     <help> maximum number of nonlinear iterations </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="viscosity_overshoot" type="',         class(obj.viscosity_overshoot),'" default="',           convert2str(obj.viscosity_overshoot),'">',	'     <section name="stressbalance" />','     <help> over-shooting constant new=new+C*(new-old) </help>','</parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++
++			% boundary conditions    
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="2" label="Boundary conditions">','<section name="stressbalance" />'); 			 
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcvx" type="',     	class(obj.spcvx),'" default="',    	convert2str(obj.spcvx),'">',     '     <section name="stressbalance" />','     <help> x-axis velocity constraint (NaN means no constraint) [m/yr] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcvy" type="',     	class(obj.spcvy),'" default="',    	convert2str(obj.spcvy),'">',	'     <section name="stressbalance" />','     <help> y-axis velocity constraint (NaN means no constraint) [m/yr] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcvz" type="',    	class(obj.spcvz),'" default="',    	convert2str(obj.spcvz),'">',     '     <section name="stressbalance" />','     <help> z-axis velocity constraint (NaN means no constraint) [m/yr] </help>','</parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++
++			% Rift options   
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="3" label="Rift options">','<section name="stressbalance" />'); 	
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="rift_penalty_threshold" type="',    	class(obj.rift_penalty_threshold),'" default="',       convert2str(obj.rift_penalty_threshold),'">',     '     <section name="stressbalance" />','     <help> threshold for instability of mechanical constraints </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    	'<parameter key ="rift_penalty_lock" type="',         class(obj.rift_penalty_lock),'" default="',           convert2str(obj.rift_penalty_lock),'">',	'     <section name="stressbalance" />','     <help> number of iterations before rift penalties are locked </help>','</parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>'); 
++
++			%others
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="4" label="Other">','<section name="stressbalance" />'); 	
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="shelf_dampening" type="',  	class(obj.shelf_dampening),'" default="',       convert2str(obj.shelf_dampening),'">',     '     <section name="stressbalance" />','     <help> use dampening for floating ice ? Only for FS model </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',  	'<parameter key ="FSreconditioning" type="', 	class(obj.FSreconditioning),'" default="',           convert2str(obj.FSreconditioning),'">',	'     <section name="stressbalance" />','     <help> multiplier for incompressibility equation. Only for FS model </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="referential" type="',  	class(obj.referential),'" default="',       convert2str(obj.referential),'">',     '     <section name="stressbalance" />','     <help> local referential </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',  	'<parameter key ="loadingforce" type="', 	class(obj.loadingforce),'" default="',           convert2str(obj.loadingforce),'">',	'     <section name="stressbalance" />','     <help> loading force applied on each point [N/m^3] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="requested_outputs" type="',  	class(obj.requested_outputs),'" default="',       convert2str(obj.requested_outputs),'">',     '     <section name="stressbalance" />','     <help> additional outputs requested </help>','</parameter>');
++
++
++			fprintf(fid,'%s\n%s\n','</frame>'); 
++		end % }}}
+ 		function obj = stressbalance(varargin) % {{{
+ 			switch nargin
+ 				case 0
Index: /issm/oecreview/Archive/18296-19100/ISSM-18652-18653.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18652-18653.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18652-18653.diff	(revision 19102)
@@ -0,0 +1,26 @@
+Index: ../trunk-jpl/src/c/modules/SystemMatricesx/SystemMatricesx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/SystemMatricesx/SystemMatricesx.cpp	(revision 18652)
++++ ../trunk-jpl/src/c/modules/SystemMatricesx/SystemMatricesx.cpp	(revision 18653)
+@@ -30,8 +30,11 @@
+ 	femmodel->parameters->FindParam(&analysisenum,AnalysisTypeEnum);
+ 	Analysis* analysis = EnumToAnalysis(analysisenum);
+ 
++	/*Check if there are penalties*/
++	bool ispenalty = femmodel->loads->IsPenalty(configuration_type);
++
+ 	/*First, we might need to do a dry run to get kmax if penalties are employed*/
+-	if(femmodel->loads->IsPenalty(configuration_type)){
++	if(ispenalty){
+ 
+ 		/*Allocate Kff_temp*/
+ 		Matrix<IssmDouble> *Kff_temp = NULL;
+@@ -92,7 +95,7 @@
+ 	}
+ 
+ 	/*Now deal with penalties (only in loads)*/
+-	if(femmodel->loads->IsPenalty(configuration_type)){
++	if(ispenalty){
+ 		for (i=0;i<femmodel->loads->Size();i++){
+ 			load=xDynamicCast<Load*>(femmodel->loads->GetObjectByOffset(i));
+ 			if(load->InAnalysis(configuration_type)){
Index: /issm/oecreview/Archive/18296-19100/ISSM-18653-18654.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18653-18654.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18653-18654.diff	(revision 19102)
@@ -0,0 +1,160 @@
+Index: ../trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp	(revision 18653)
++++ ../trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp	(revision 18654)
+@@ -80,24 +80,31 @@
+ 	ElementMatrix* Ke   = element->NewElementMatrix();
+ 	IssmDouble*    M    = xNew<IssmDouble>(numnodes);
+ 
++	IssmDouble connectivity;
+ 	/*Retrieve all inputs and parameters*/
+ 	element->GetVerticesCoordinates(&xyz_list);
++	int numvertices = element->GetNumberOfVertices();
+ 
+-	Gauss* gauss = element->NewGauss(5);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
++	//Gauss* gauss = element->NewGauss(5);
++	//for(int ig=gauss->begin();ig<gauss->end();ig++){
++	//	gauss->GaussPoint(ig);
+ 
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		this->GetM(M,element,gauss);
+-		D_scalar=gauss->weight*Jdet;
+-		TripleMultiply(M,1,numnodes,1,
+-					&D_scalar,1,1,0,
+-					M,1,numnodes,0,
+-					&Ke->values[0],1);
++	//	element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++	//	this->GetM(M,element,gauss);
++	//	D_scalar=gauss->weight*Jdet;
++	//	//TripleMultiply(M,1,numnodes,1,
++	//	//			&D_scalar,1,1,0,
++	//	//			M,1,numnodes,0,
++	//	//			&Ke->values[0],1);
++
++	//}
++	for(int iv=0;iv<numvertices;iv++){
++		connectivity=(IssmDouble)element->VertexConnectivity(iv);
++		Ke->values[iv*numvertices+iv]=1./connectivity;
+ 	}
+ 
+ 	/*Clean up and return*/
+-	delete gauss;
++	//delete gauss;
+ 	xDelete<IssmDouble>(xyz_list);
+ 	xDelete<IssmDouble>(M);
+ 	return Ke;
+@@ -201,7 +208,6 @@
+ 	IssmDouble* values        = xNew<IssmDouble>(numnodes);
+ 	IssmDouble* valueslambda  = xNewZeroInit<IssmDouble>(numnodessigma);
+ 	IssmDouble* pressure      = xNew<IssmDouble>(numnodes);
+-	Input* sigmann_input      = element->GetInput(SigmaNNEnum); _assert_(sigmann_input);
+ 	Input* vx_input           = element->GetInput(VxEnum);      _assert_(vx_input);
+ 	Input* vy_input           = element->GetInput(VyEnum);      _assert_(vy_input);
+ 	Input* vz_input           = NULL;
+@@ -216,6 +222,7 @@
+ 
+ 	/*Now compute sigmann if on base*/
+ 	if(element->IsOnBase() && 0){ 
++		Input* sigmann_input      = element->GetInput(SigmaNNEnum); _assert_(sigmann_input);
+ 		if(dim==3) _error_("not implemented yet");
+ 
+ 		int baselist[3];
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_la.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_la.cpp	(revision 18653)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_la.cpp	(revision 18654)
+@@ -38,9 +38,11 @@
+ 	femmodel->UpdateConstraintsx();
+ 
+ 	/*Convergence criterion*/
+-	int  count = 0;
+-	Vector<IssmDouble>* vel     = NULL;
+-	Vector<IssmDouble>* vel_old = NULL;
++	int  count       = 0;
++	int  count_local = 0;
++	Vector<IssmDouble>* vel           = NULL;
++	Vector<IssmDouble>* vel_old       = NULL;
++	Vector<IssmDouble>* vel_old_local = NULL;
+ 	GetVectorFromInputsx(&vel,femmodel,VxEnum,VertexEnum);
+ 	GetVectorFromInputsx(&pug,femmodel,PressureEnum,VertexEnum);
+ 
+@@ -48,23 +50,44 @@
+ 		count++;
+ 
+ 		/*save pointer to old velocity*/
+-		delete vel_old;vel_old=vel;
++		delete vel_old;vel_old=vel->Duplicate(); vel->Copy(vel_old);
+ 		delete pug_old;pug_old=pug; 
+ 		pressure_converged=false; vel_converged=false;
+ 
+-		/*Solve KU=F*/
+-		femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum);
+-		femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
+-		SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel);
+-		CreateNodalConstraintsx(&ys,femmodel->nodes,configuration_type);
+-		Reduceloadx(pf, Kfs, ys); delete Kfs;
+-		Solverx(&uf, Kff, pf, NULL, df, femmodel->parameters); 
+-		delete Kff; delete pf; delete df;
+-		Mergesolutionfromftogx(&ug, uf,ys,femmodel->nodes,femmodel->parameters);delete uf; delete ys;
++		while(true){
++			count_local++;
++			delete vel_old_local;vel_old_local=vel;
++			/*Solve KU=F*/
++			femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum);
++			femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
++			SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel);
++			CreateNodalConstraintsx(&ys,femmodel->nodes,configuration_type);
++			Reduceloadx(pf, Kfs, ys); delete Kfs;
++			Solverx(&uf, Kff, pf, NULL, df, femmodel->parameters); 
++			delete Kff; delete pf; delete df;
++			Mergesolutionfromftogx(&ug, uf,ys,femmodel->nodes,femmodel->parameters);delete uf; delete ys;
+ 
+-		/*Update solution*/
+-		InputUpdateFromSolutionx(femmodel,ug); delete ug;
+-		GetVectorFromInputsx(&vel,femmodel,VxEnum,VertexEnum);
++			/*Update solution*/
++			InputUpdateFromSolutionx(femmodel,ug); delete ug;
++			GetVectorFromInputsx(&vel,femmodel,VxEnum,VertexEnum);
++			/*Check for convergence*/
++			Vector<IssmDouble>* dvel_local=vel_old_local->Duplicate(); vel_old_local->Copy(dvel_local); dvel_local->AYPX(vel,-1.0);
++			IssmDouble ndu=dvel_local->Norm(NORM_TWO);   delete dvel_local;
++			IssmDouble nu =vel_old_local->Norm(NORM_TWO);
++			if (xIsNan<IssmDouble>(ndu) || xIsNan<IssmDouble>(nu)) _error_("convergence criterion is NaN!");
++			if((ndu/nu)<eps_rel){
++				if(VerboseConvergence()) _printf0_(setw(50) << left << "   Convergence criterion: norm(du)/norm(u)" << ndu/nu*100 << " < " << eps_rel*100 << " %\n");
++				break;
++			}
++			else{ 
++				if(VerboseConvergence()) _printf0_(setw(50) << left << "   Convergence criterion: norm(du)/norm(u)" << ndu/nu*100 << " > " << eps_rel*100 << " %\n");
++			}
++			if(count_local>=max_nonlinear_iterations){
++				_printf0_("   maximum number of nonlinear iterations (" << max_nonlinear_iterations << ") exceeded\n"); 
++				break;
++			}
++		}
++		count_local=0;
+ 
+ 		femmodel->SetCurrentConfiguration(UzawaPressureAnalysisEnum);
+ 		femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
+@@ -80,9 +103,9 @@
+ 		GetVectorFromInputsx(&pug,femmodel,PressureEnum,VertexEnum);
+ 
+ 		/*Check for convergence*/
+-		Vector<IssmDouble>* dvel=vel_old->Duplicate(); vel_old->Copy(dvel); dvel->AYPX(vel,-1.0);
++		Vector<IssmDouble>* dvel=vel_old_local->Duplicate(); vel_old_local->Copy(dvel); dvel->AYPX(vel,-1.0);
+ 		IssmDouble ndu=dvel->Norm(NORM_TWO);   delete dvel;
+-		IssmDouble nu =vel_old->Norm(NORM_TWO);
++		IssmDouble nu =vel_old_local->Norm(NORM_TWO);
+ 		if (xIsNan<IssmDouble>(ndu) || xIsNan<IssmDouble>(nu)) _error_("convergence criterion is NaN!");
+ 		if((ndu/nu)<eps_rel){
+ 			if(VerboseConvergence()) _printf0_(setw(50) << left << "   Convergence criterion: norm(du)/norm(u)" << ndu/nu*100 << " < " << eps_rel*100 << " %\n");
+@@ -118,6 +141,7 @@
+ 	delete pug_old;  
+ 	delete vel;  
+ 	delete vel_old;  
++	delete vel_old_local;  
+ 	delete stressanalysis;
+ 	delete pressureanalysis;
+ }
Index: /issm/oecreview/Archive/18296-19100/ISSM-18654-18655.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18654-18655.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18654-18655.diff	(revision 19102)
@@ -0,0 +1,8 @@
+Index: ../trunk-jpl/test/Archives/Archive701.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive702.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
Index: /issm/oecreview/Archive/18296-19100/ISSM-18655-18656.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18655-18656.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18655-18656.diff	(revision 19102)
@@ -0,0 +1,18 @@
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18655)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18656)
+@@ -631,10 +631,13 @@
+ 				break;
+ 			case 1:
+ 				// cold, wet base: keep at pressure melting point 
++				break;
+ 			case 2:
+ 				// temperate, thin refreezing base: release spc
++				break;
+ 			case 3:
+ 				// temperate, thin melting base: set spc
++				break;
+ 			case 4:
+ 				// temperate, thick melting base: set grad H*n=0
+ 				for(i=0;i<numnodes;i++) 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18656-18657.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18656-18657.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18656-18657.diff	(revision 19102)
@@ -0,0 +1,25 @@
+Index: ../trunk-jpl/src/m/exp/expdisp.m
+===================================================================
+--- ../trunk-jpl/src/m/exp/expdisp.m	(revision 18656)
++++ ../trunk-jpl/src/m/exp/expdisp.m	(revision 18657)
+@@ -12,6 +12,9 @@
+ %
+ %   See also EXPMASTER, EXPDOC
+ 
++%Get options
++options = pairoptions();
++
+ %check nargin
+ if ~nargin | nargin>5
+ 	help expdisp
+@@ -54,7 +57,9 @@
+ 		else
+ 			plot(domain(i).x*unitmultiplier,domain(i).y*unitmultiplier,linestyle,'linewidth',linewidth);
+ 	  end
+-		text(domain(i).x(1)*unitmultiplier,domain(i).y(1)*unitmultiplier,domain(i).name,'BackgroundColor',[.7 .9 .7]);
++	  if exist(options,'title')
++		  text(domain(i).x(1)*unitmultiplier,domain(i).y(1)*unitmultiplier,domain(i).name,'BackgroundColor',[.7 .9 .7]);
++	  end
+   end
+ end
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18657-18658.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18657-18658.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18657-18658.diff	(revision 19102)
@@ -0,0 +1,16 @@
+Index: ../trunk-jpl/src/m/exp/expdisp.m
+===================================================================
+--- ../trunk-jpl/src/m/exp/expdisp.m	(revision 18657)
++++ ../trunk-jpl/src/m/exp/expdisp.m	(revision 18658)
+@@ -49,8 +49,9 @@
+ for i=1:length(domain),		
+ 	if domain(i).nods==1
+ 		plot(domain(i).x*unitmultiplier,domain(i).y*unitmultiplier,'o','MarkerEdgeColor','k','MarkerFaceColor','r','MarkerSize',10);
+-		text(domain(i).x*unitmultiplier,domain(i).y*unitmultiplier, ...
+-				 domain(i).name,'BackgroundColor',[1. .0 .0]);
++	  if exist(options,'title')
++			text(domain(i).x*unitmultiplier,domain(i).y*unitmultiplier,domain(i).name,'BackgroundColor',[1. .0 .0]);
++	  end
+ 	else
+ 		if (isnumeric(linestyle))
+ 			plot(domain(i).x*unitmultiplier,domain(i).y*unitmultiplier,'Color',linestyle,'linewidth',linewidth);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18658-18659.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18658-18659.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18658-18659.diff	(revision 19102)
@@ -0,0 +1,260 @@
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.h	(revision 18658)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.h	(revision 18659)
+@@ -47,9 +47,10 @@
+ 		static void DrainWaterfractionIcecolumn(Element* element);
+ 		static void DrainWaterfraction(Element* element, IssmDouble* pdrainrate_element);
+ 		static void UpdateBasalConstraints(FemModel* femmodel);
+-		static void UpdateBasalConstraints(Element* element);
+-		static void UpdateBasalConstraintsTransient(Element* element);
+-		static void UpdateBasalConstraintsSteadystate(Element* element);
++		static void ApplyBasalConstraints(IssmDouble* serial_spc,Element* element);
++		static void GetBasalConstraints(Vector<IssmDouble>* vec_spc,Element* element);
++		static void GetBasalConstraintsTransient(Vector<IssmDouble>* vec_spc,Element* element);
++		static void GetBasalConstraintsSteadystate(Vector<IssmDouble>* vec_spc,Element* element);
+ 		static int GetThermalBasalCondition(Element* element, IssmDouble enthalpy, IssmDouble enthalpy_up, IssmDouble pressure, IssmDouble pressure_up, IssmDouble watercolumn, IssmDouble meltingrate);
+ 		static IssmDouble GetWetIceConductivity(Element* element, IssmDouble enthalpy, IssmDouble pressure);
+ 
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18658)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18659)
+@@ -1188,14 +1188,35 @@
+ 	xDelete<IssmDouble>(deltawaterfractions);
+ }/*}}}*/
+ void EnthalpyAnalysis::UpdateBasalConstraints(FemModel* femmodel){/*{{{*/
++
+ 	/*Update basal dirichlet BCs for enthalpy: */
++	Vector<IssmDouble>* spc           = NULL;
++	IssmDouble*         serial_spc    = NULL;
++
++	spc=new Vector<IssmDouble>(femmodel->nodes->NumberOfNodes(EnthalpyAnalysisEnum));
++	/*First create a vector to figure out what elements should be constrained*/
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+ 		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-		UpdateBasalConstraints(element);
++		GetBasalConstraints(spc,element);
+ 	}
++
++	/*Assemble and serialize*/
++	spc->Assemble();
++	serial_spc=spc->ToMPISerial();
++	delete spc;
++
++	/*Then update basal constraints nodes accordingly*/
++	for(int i=0;i<femmodel->elements->Size();i++){
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		ApplyBasalConstraints(serial_spc,element);
++	}
++
+ 	femmodel->UpdateConstraintsx();
++
++	/*Delete*/
++	xDelete<IssmDouble>(serial_spc);
+ }/*}}}*/
+-void EnthalpyAnalysis::UpdateBasalConstraints(Element* element){/*{{{*/
++void EnthalpyAnalysis::ApplyBasalConstraints(IssmDouble* serial_spc,Element* element){/*{{{*/
+ 
+ 	/* Check if ice in element */
+ 	if(!element->IsIceInElement()) return;
+@@ -1205,6 +1226,52 @@
+ 
+ 	/*Intermediary*/
+ 	bool        isdynamicbasalspc;
++	int         numindices;
++	int        *indices = NULL;
++	Node*       node = NULL;
++	IssmDouble	pressure;
++
++	/*Check wether dynamic basal boundary conditions are activated */
++	element->FindParam(&isdynamicbasalspc,ThermalIsdynamicbasalspcEnum);
++	if(!isdynamicbasalspc) return;
++
++	/*Get parameters and inputs: */
++	Input* pressure_input		 = element->GetInput(PressureEnum);							 _assert_(pressure_input);
++
++	/*Fetch indices of basal & surface nodes for this finite element*/
++	Penta *penta =  (Penta *) element; // TODO: add Basal-/SurfaceNodeIndices to element.h, and change this to Element*
++	penta->BasalNodeIndices(&numindices,&indices,element->GetElementType());
++
++	GaussPenta* gauss=new GaussPenta();
++	for(int i=0;i<numindices;i++){
++		gauss->GaussNode(element->GetElementType(),indices[i]);
++
++		pressure_input->GetInputValue(&pressure,gauss);
++
++		/*apply or release spc*/
++		node=element->GetNode(indices[i]);
++		if(serial_spc[node->Sid()]==1.){
++			pressure_input->GetInputValue(&pressure, gauss);
++			node->ApplyConstraint(0,PureIceEnthalpy(element,pressure));
++		}
++		else			
++			node->DofInFSet(0);
++	}
++
++	/*Free ressources:*/
++	xDelete<int>(indices);
++	delete gauss;
++}/*}}}*/
++void EnthalpyAnalysis::GetBasalConstraints(Vector<IssmDouble>* vec_spc,Element* element){/*{{{*/
++
++	/* Check if ice in element */
++	if(!element->IsIceInElement()) return;
++
++	/* Only update Constraints at the base of grounded ice*/
++	if(!(element->IsOnBase()) || element->IsFloating()) return;
++
++	/*Intermediary*/
++	bool        isdynamicbasalspc;
+ 	IssmDouble	dt;
+ 
+ 	/*Check wether dynamic basal boundary conditions are activated */
+@@ -1213,13 +1280,13 @@
+ 
+ 	element->FindParam(&dt,TimesteppingTimeStepEnum);
+ 	if(dt==0.){
+-		UpdateBasalConstraintsSteadystate(element);
++		GetBasalConstraintsSteadystate(vec_spc,element);
+ 	}
+ 	else{
+-		UpdateBasalConstraintsTransient(element);
++		GetBasalConstraintsTransient(vec_spc,element);
+ 	}
+ }/*}}}*/
+-void EnthalpyAnalysis::UpdateBasalConstraintsTransient(Element* element){/*{{{*/
++void EnthalpyAnalysis::GetBasalConstraintsTransient(Vector<IssmDouble>* vec_spc,Element* element){/*{{{*/
+ 
+ 	/* Check if ice in element */
+ 	if(!element->IsIceInElement()) return;
+@@ -1228,16 +1295,10 @@
+ 	if(!(element->IsOnBase()) || element->IsFloating()) return;
+ 
+ 	/*Intermediary*/
+-	bool        isdynamicbasalspc,setspc;
+ 	int         numindices, numindicesup, state;
+ 	int        *indices = NULL, *indicesup = NULL;
+-	Node*       node = NULL;
+ 	IssmDouble	enthalpy, enthalpyup, pressure, pressureup, watercolumn, meltingrate;
+ 
+-	/*Check wether dynamic basal boundary conditions are activated */
+-	element->FindParam(&isdynamicbasalspc,ThermalIsdynamicbasalspcEnum);
+-	if(!isdynamicbasalspc) return;
+-
+ 	/*Get parameters and inputs: */
+ 	Input* enthalpy_input       = element->GetInput(EnthalpyEnum);                    _assert_(enthalpy_input); //TODO: check EnthalpyPicard?
+ 	Input* pressure_input		 = element->GetInput(PressureEnum);							 _assert_(pressure_input);
+@@ -1265,37 +1326,31 @@
+ 
+ 		state=GetThermalBasalCondition(element, enthalpy, enthalpyup, pressure, pressureup, watercolumn, meltingrate);
+ 
+-		setspc=false;
+ 		switch (state) {
+ 			case 0:
+ 				// cold, dry base: apply basal surface forcing
++				vec_spc->SetValue(element->nodes[i]->Sid(),0.,INS_VAL);
+ 				break;
+ 			case 1:
+ 				// cold, wet base: keep at pressure melting point 
+-				setspc=true;
++				vec_spc->SetValue(element->nodes[i]->Sid(),1.,INS_VAL);
+ 				break;
+ 			case 2:
+ 				// temperate, thin refreezing base: release spc
++				vec_spc->SetValue(element->nodes[i]->Sid(),0.,INS_VAL);
+ 				break;
+ 			case 3:
+ 				// temperate, thin melting base: set spc
+-				setspc=true;
++				vec_spc->SetValue(element->nodes[i]->Sid(),1.,INS_VAL);
+ 				break;
+ 			case 4:
+ 				// temperate, thick melting base: set grad H*n=0
++				vec_spc->SetValue(element->nodes[i]->Sid(),0.,INS_VAL);
+ 				break;
+ 			default:
+ 				_printf0_("	unknown thermal basal state found!");
+ 		}
+ 
+-		/*apply or release spc*/
+-		node=element->GetNode(indices[i]);
+-		if(setspc){
+-			pressure_input->GetInputValue(&pressure, gauss);
+-			node->ApplyConstraint(0,PureIceEnthalpy(element,pressure));
+-		}
+-		else			
+-			node->DofInFSet(0);
+ 	}
+ 
+ 	/*Free ressources:*/
+@@ -1304,7 +1359,7 @@
+ 	delete gauss;
+ 	delete gaussup;
+ }/*}}}*/
+-void EnthalpyAnalysis::UpdateBasalConstraintsSteadystate(Element* element){/*{{{*/
++void EnthalpyAnalysis::GetBasalConstraintsSteadystate(Vector<IssmDouble>* vec_spc,Element* element){/*{{{*/
+ 
+ 	/* Check if ice in element */
+ 	if(!element->IsIceInElement()) return;
+@@ -1313,16 +1368,10 @@
+ 	if(!(element->IsOnBase()) || element->IsFloating()) return;
+ 
+ 	/*Intermediary*/
+-	bool        isdynamicbasalspc,setspc;
+ 	int         numindices, numindicesup, state;
+ 	int        *indices = NULL, *indicesup = NULL;
+-	Node*       node = NULL;
+ 	IssmDouble	enthalpy, enthalpyup, pressure, pressureup, watercolumn, meltingrate;
+ 
+-	/*Check wether dynamic basal boundary conditions are activated */
+-	element->FindParam(&isdynamicbasalspc,ThermalIsdynamicbasalspcEnum);
+-	if(!isdynamicbasalspc) return;
+-
+ 	/*Get parameters and inputs: */
+ 	Input* enthalpy_input		 = element->GetInput(EnthalpyPicardEnum);					 _assert_(enthalpy_input);
+ 	Input* pressure_input		 = element->GetInput(PressureEnum);							 _assert_(pressure_input);
+@@ -1348,38 +1397,30 @@
+ 		meltingrate_input->GetInputValue(&meltingrate,gauss);
+ 
+ 		state=GetThermalBasalCondition(element, enthalpy, enthalpyup, pressure, pressureup, watercolumn, meltingrate);
+-		setspc=false;
+ 		switch (state) {
+ 			case 0:
+ 				// cold, dry base: apply basal surface forcing
++				vec_spc->SetValue(element->nodes[i]->Sid(),0.,INS_VAL);
+ 				break;
+ 			case 1:
+ 				// cold, wet base: keep at pressure melting point 
+-				setspc=true;
++				vec_spc->SetValue(element->nodes[i]->Sid(),1.,INS_VAL);
+ 				break;
+ 			case 2:
+ 				// temperate, thin refreezing base: release spc
++				vec_spc->SetValue(element->nodes[i]->Sid(),0.,INS_VAL);
+ 				break;
+ 			case 3:
+ 				// temperate, thin melting base: set spc
+-				setspc=true;
++				vec_spc->SetValue(element->nodes[i]->Sid(),1.,INS_VAL);
+ 				break;
+ 			case 4:
+ 				// temperate, thick melting base: s
+-				setspc=true;
++				vec_spc->SetValue(element->nodes[i]->Sid(),1.,INS_VAL);
+ 				break;
+ 			default:
+ 				_printf0_("	unknown thermal basal state found!");
+ 		}
+-
+-		/*apply or release spc*/
+-		node=element->GetNode(indices[i]);
+-		if(setspc){
+-			pressure_input->GetInputValue(&pressure, gauss);
+-			node->ApplyConstraint(0,PureIceEnthalpy(element,pressure));
+-		}
+-		else			
+-			node->DofInFSet(0);
+ 	}
+ 
+ 	/*Free ressources:*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18659-18660.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18659-18660.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18659-18660.diff	(revision 19102)
@@ -0,0 +1,86 @@
+Index: ../trunk-jpl/src/m/exp/expdisp.m
+===================================================================
+--- ../trunk-jpl/src/m/exp/expdisp.m	(revision 18659)
++++ ../trunk-jpl/src/m/exp/expdisp.m	(revision 18660)
+@@ -4,48 +4,35 @@
+ %   This routine reads in a domain outline file (Argus format) and plots all the contours 
+ %
+ %   Usage:
+-%      expdisp(domainoutline,varargin)
+-%      expdisp(domainoutline,figurenumber,linestyle,linewidth,unitmultiplier)
++%      expdisp(domainoutline,options)
+ %
++%   Available options:
++%      - 'figure'     : figure number or handle
++%      - 'linestyle'  : line style ('r--','-y',...)
++%      - 'linewidth'  : line width (1,2,...)
++%      - 'multiplier' : coordinate multiplier (10^3 if the plot is in km)
++%      - 'title'      : do we add contour names to each contour
++%
+ %   Example:
+-%      expdisp('Domain.exp',1,'--r',2,10^3);
++%      expdisp('Domain.exp','figure',1,'linestyle','--r','linewidth',2,'multiplier',10^3);
+ %
+ %   See also EXPMASTER, EXPDOC
+ 
+-%Get options
+-options = pairoptions();
++%Get and process options
++options = pairoptions(varargin{:});
++unitmultiplier = getfieldvalue(options,'multiplier',1);
++linewidth      = getfieldvalue(options,'linewidth',1);
++linestyle      = getfieldvalue(options,'linestyle','-r');
+ 
+-%check nargin
+-if ~nargin | nargin>5
+-	help expdisp
+-	error('expdisp error message: bad usage');
+-end
++%read file
++domain=expread(domainoutline);
+ 
+-%parse input
+-if nargin<=1,
+-	figurenumber=1;
+-else
+-	figurenumber=varargin{1};
++%Create figure if needed and hold
++if exist(options,'figure'),
++	figure(getfieldvalue(options,'figure'));
+ end
+-if nargin<=2
+-	linestyle='r-';
+-else
+-	linestyle=varargin{2};
+-end
+-if nargin<=3
+-	linewidth=1;
+-else
+-	linewidth=varargin{3};
+-end
+-if nargin<=4
+-	unitmultiplier=1;
+-else
+-	unitmultiplier=varargin{4}; if isnan(unitmultiplier), unitmultiplier=1; end
+-end
++hold on
+ 
+-domain=expread(domainoutline);
+-
+-figure(figurenumber),hold on
+ for i=1:length(domain),		
+ 	if domain(i).nods==1
+ 		plot(domain(i).x*unitmultiplier,domain(i).y*unitmultiplier,'o','MarkerEdgeColor','k','MarkerFaceColor','r','MarkerSize',10);
+Index: ../trunk-jpl/src/m/plot/applyoptions.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/applyoptions.m	(revision 18659)
++++ ../trunk-jpl/src/m/plot/applyoptions.m	(revision 18660)
+@@ -253,7 +253,7 @@
+ 		else
+ 			linewidthi=linewidth{i};
+ 		end
+-		expdisp(filenamei,gcf,stylei,linewidthi,getfieldvalue(options,'unit',1));
++		expdisp(filenamei,'linestyle',stylei,'linewidthi',linewidthi,'multiplier',getfieldvalue(options,'unit',1));
+ 	end
+ end
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18660-18661.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18660-18661.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18660-18661.diff	(revision 19102)
@@ -0,0 +1,56 @@
+Index: ../trunk-jpl/test/NightlyRun/test431.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test431.py	(revision 18660)
++++ ../trunk-jpl/test/NightlyRun/test431.py	(revision 18661)
+@@ -23,7 +23,7 @@
+ 
+ #Fields and tolerances to track changes
+ field_names     =['Vx','Vy','Vz','Vel','Pressure','Temperature','Water fraction','Enthalpy']
+-field_tolerances=[1e-10,1e-10,1e-09,1e-10,1e-13,1e-10,1e-10,1e-10]
++field_tolerances=[1e-10,1e-10,1e-09,1e-10,1e-13,1e-10,1e-10,2e-10]
+ field_values=[\
+ 	md.results.SteadystateSolution.Vx,\
+ 	md.results.SteadystateSolution.Vy,\
+Index: ../trunk-jpl/test/NightlyRun/test432.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test432.py	(revision 18660)
++++ ../trunk-jpl/test/NightlyRun/test432.py	(revision 18661)
+@@ -22,7 +22,7 @@
+ 
+ #Fields and tolerances to track changes
+ field_names     =['Vx','Vy','Vz','Vel','Pressure','Temperature','Water fraction','Enthalpy']
+-field_tolerances=[1e-09,1e-09,1e-09,1e-09,1e-13,1e-10,1e-10,1e-10]
++field_tolerances=[1e-09,1e-09,1e-09,1e-09,1e-13,1e-10,1e-10,2e-10]
+ field_values=[\
+ 	md.results.SteadystateSolution.Vx,\
+ 	md.results.SteadystateSolution.Vy,\
+Index: ../trunk-jpl/test/NightlyRun/test431.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test431.m	(revision 18660)
++++ ../trunk-jpl/test/NightlyRun/test431.m	(revision 18661)
+@@ -13,7 +13,7 @@
+ 
+ %Fields and tolerances to track changes
+ field_names     ={'Vx','Vy','Vz','Vel','Pressure','Temperature','Water fraction','Enthalpy'};
+-field_tolerances={1e-10,1e-10,1e-09,1e-10,1e-13,1e-10,1e-10,1e-10};
++field_tolerances={1e-10,1e-10,1e-09,1e-10,1e-13,1e-10,1e-10,2e-10};
+ field_values={...
+ 	(md.results.SteadystateSolution.Vx),...
+ 	(md.results.SteadystateSolution.Vy),...
+Index: ../trunk-jpl/test/NightlyRun/test432.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test432.m	(revision 18660)
++++ ../trunk-jpl/test/NightlyRun/test432.m	(revision 18661)
+@@ -12,7 +12,7 @@
+ 
+ %Fields and tolerances to track changes
+ field_names     ={'Vx','Vy','Vz','Vel','Pressure','Temperature','Water fraction','Enthalpy'};
+-field_tolerances={2e-09,1e-09,1e-09,1e-09,1e-13,1e-10,1e-10,1e-10};
++field_tolerances={2e-09,1e-09,1e-09,1e-09,1e-13,1e-10,1e-10,2e-10};
+ field_values={...
+ 	(md.results.SteadystateSolution.Vx),...
+ 	(md.results.SteadystateSolution.Vy),...
+Index: ../trunk-jpl/test/Archives/Archive431.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
Index: /issm/oecreview/Archive/18296-19100/ISSM-18661-18662.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18661-18662.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18661-18662.diff	(revision 19102)
@@ -0,0 +1,119 @@
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18661)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18662)
+@@ -205,6 +205,8 @@
+ 	DamageEnum,
+ 	NewDamageEnum,
+ 	StressIntensityFactorEnum,
++	StrainRateparallelEnum,
++	StrainRateperpendicularEnum,
+ 	MaterialsRhoIceEnum,
+ 	MaterialsRhoSeawaterEnum,
+ 	MaterialsRhoFreshwaterEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18661)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18662)
+@@ -213,6 +213,8 @@
+ 		case DamageEnum : return "Damage";
+ 		case NewDamageEnum : return "NewDamage";
+ 		case StressIntensityFactorEnum : return "StressIntensityFactor";
++		case StrainRateparallelEnum : return "StrainRateparallel";
++		case StrainRateperpendicularEnum : return "StrainRateperpendicular";
+ 		case MaterialsRhoIceEnum : return "MaterialsRhoIce";
+ 		case MaterialsRhoSeawaterEnum : return "MaterialsRhoSeawater";
+ 		case MaterialsRhoFreshwaterEnum : return "MaterialsRhoFreshwater";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18661)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18662)
+@@ -216,6 +216,8 @@
+ 	      else if (strcmp(name,"Damage")==0) return DamageEnum;
+ 	      else if (strcmp(name,"NewDamage")==0) return NewDamageEnum;
+ 	      else if (strcmp(name,"StressIntensityFactor")==0) return StressIntensityFactorEnum;
++	      else if (strcmp(name,"StrainRateparallel")==0) return StrainRateparallelEnum;
++	      else if (strcmp(name,"StrainRateperpendicular")==0) return StrainRateperpendicularEnum;
+ 	      else if (strcmp(name,"MaterialsRhoIce")==0) return MaterialsRhoIceEnum;
+ 	      else if (strcmp(name,"MaterialsRhoSeawater")==0) return MaterialsRhoSeawaterEnum;
+ 	      else if (strcmp(name,"MaterialsRhoFreshwater")==0) return MaterialsRhoFreshwaterEnum;
+@@ -257,12 +259,12 @@
+ 	      else if (strcmp(name,"MasstransportSpcthickness")==0) return MasstransportSpcthicknessEnum;
+ 	      else if (strcmp(name,"MasstransportCalvingrate")==0) return MasstransportCalvingrateEnum;
+ 	      else if (strcmp(name,"MasstransportStabilization")==0) return MasstransportStabilizationEnum;
+-	      else if (strcmp(name,"MasstransportVertexPairing")==0) return MasstransportVertexPairingEnum;
+-	      else if (strcmp(name,"MasstransportNumRequestedOutputs")==0) return MasstransportNumRequestedOutputsEnum;
+          else stage=3;
+    }
+    if(stage==3){
+-	      if (strcmp(name,"MasstransportRequestedOutputs")==0) return MasstransportRequestedOutputsEnum;
++	      if (strcmp(name,"MasstransportVertexPairing")==0) return MasstransportVertexPairingEnum;
++	      else if (strcmp(name,"MasstransportNumRequestedOutputs")==0) return MasstransportNumRequestedOutputsEnum;
++	      else if (strcmp(name,"MasstransportRequestedOutputs")==0) return MasstransportRequestedOutputsEnum;
+ 	      else if (strcmp(name,"QmuIsdakota")==0) return QmuIsdakotaEnum;
+ 	      else if (strcmp(name,"MassFluxSegments")==0) return MassFluxSegmentsEnum;
+ 	      else if (strcmp(name,"MassFluxSegmentsPresent")==0) return MassFluxSegmentsPresentEnum;
+@@ -380,12 +382,12 @@
+ 	      else if (strcmp(name,"StressbalanceSIAAnalysis")==0) return StressbalanceSIAAnalysisEnum;
+ 	      else if (strcmp(name,"StressbalanceSolution")==0) return StressbalanceSolutionEnum;
+ 	      else if (strcmp(name,"StressbalanceVerticalAnalysis")==0) return StressbalanceVerticalAnalysisEnum;
+-	      else if (strcmp(name,"EnthalpyAnalysis")==0) return EnthalpyAnalysisEnum;
+-	      else if (strcmp(name,"FlaimAnalysis")==0) return FlaimAnalysisEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"FlaimSolution")==0) return FlaimSolutionEnum;
++	      if (strcmp(name,"EnthalpyAnalysis")==0) return EnthalpyAnalysisEnum;
++	      else if (strcmp(name,"FlaimAnalysis")==0) return FlaimAnalysisEnum;
++	      else if (strcmp(name,"FlaimSolution")==0) return FlaimSolutionEnum;
+ 	      else if (strcmp(name,"HydrologyShreveAnalysis")==0) return HydrologyShreveAnalysisEnum;
+ 	      else if (strcmp(name,"HydrologyDCInefficientAnalysis")==0) return HydrologyDCInefficientAnalysisEnum;
+ 	      else if (strcmp(name,"HydrologyDCEfficientAnalysis")==0) return HydrologyDCEfficientAnalysisEnum;
+@@ -503,12 +505,12 @@
+ 	      else if (strcmp(name,"Free")==0) return FreeEnum;
+ 	      else if (strcmp(name,"Open")==0) return OpenEnum;
+ 	      else if (strcmp(name,"Adjointp")==0) return AdjointpEnum;
+-	      else if (strcmp(name,"Adjointx")==0) return AdjointxEnum;
+-	      else if (strcmp(name,"Adjointy")==0) return AdjointyEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"Adjointz")==0) return AdjointzEnum;
++	      if (strcmp(name,"Adjointx")==0) return AdjointxEnum;
++	      else if (strcmp(name,"Adjointy")==0) return AdjointyEnum;
++	      else if (strcmp(name,"Adjointz")==0) return AdjointzEnum;
+ 	      else if (strcmp(name,"BalancethicknessMisfit")==0) return BalancethicknessMisfitEnum;
+ 	      else if (strcmp(name,"BedSlopeX")==0) return BedSlopeXEnum;
+ 	      else if (strcmp(name,"BedSlopeY")==0) return BedSlopeYEnum;
+@@ -626,12 +628,12 @@
+ 	      else if (strcmp(name,"DoubleExternalResult")==0) return DoubleExternalResultEnum;
+ 	      else if (strcmp(name,"DoubleMatExternalResult")==0) return DoubleMatExternalResultEnum;
+ 	      else if (strcmp(name,"IntExternalResult")==0) return IntExternalResultEnum;
+-	      else if (strcmp(name,"J")==0) return JEnum;
+-	      else if (strcmp(name,"StringExternalResult")==0) return StringExternalResultEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"Step")==0) return StepEnum;
++	      if (strcmp(name,"J")==0) return JEnum;
++	      else if (strcmp(name,"StringExternalResult")==0) return StringExternalResultEnum;
++	      else if (strcmp(name,"Step")==0) return StepEnum;
+ 	      else if (strcmp(name,"Time")==0) return TimeEnum;
+ 	      else if (strcmp(name,"WaterColumnOld")==0) return WaterColumnOldEnum;
+ 	      else if (strcmp(name,"Outputdefinition")==0) return OutputdefinitionEnum;
+@@ -749,12 +751,12 @@
+ 	      else if (strcmp(name,"BasalforcingsOceanCoef")==0) return BasalforcingsOceanCoefEnum;
+ 	      else if (strcmp(name,"BasalforcingsOceanLinDragCoef")==0) return BasalforcingsOceanLinDragCoefEnum;
+ 	      else if (strcmp(name,"BasalforcingsOceanQuadDragCoef")==0) return BasalforcingsOceanQuadDragCoefEnum;
+-	      else if (strcmp(name,"BasalforcingsOceanTurningAngle")==0) return BasalforcingsOceanTurningAngleEnum;
+-	      else if (strcmp(name,"BasalforcingsOceanSsh")==0) return BasalforcingsOceanSshEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"BasalforcingsOceanVx")==0) return BasalforcingsOceanVxEnum;
++	      if (strcmp(name,"BasalforcingsOceanTurningAngle")==0) return BasalforcingsOceanTurningAngleEnum;
++	      else if (strcmp(name,"BasalforcingsOceanSsh")==0) return BasalforcingsOceanSshEnum;
++	      else if (strcmp(name,"BasalforcingsOceanVx")==0) return BasalforcingsOceanVxEnum;
+ 	      else if (strcmp(name,"BasalforcingsOceanVy")==0) return BasalforcingsOceanVyEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsRhoAir")==0) return SurfaceforcingsRhoAirEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsAirCoef")==0) return SurfaceforcingsAirCoefEnum;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18662-18663.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18662-18663.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18662-18663.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18662)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18663)
+@@ -205,6 +205,8 @@
+ def DamageEnum(): return StringToEnum("Damage")[0]
+ def NewDamageEnum(): return StringToEnum("NewDamage")[0]
+ def StressIntensityFactorEnum(): return StringToEnum("StressIntensityFactor")[0]
++def StrainRateparallelEnum(): return StringToEnum("StrainRateparallel")[0]
++def StrainRateperpendicularEnum(): return StringToEnum("StrainRateperpendicular")[0]
+ def MaterialsRhoIceEnum(): return StringToEnum("MaterialsRhoIce")[0]
+ def MaterialsRhoSeawaterEnum(): return StringToEnum("MaterialsRhoSeawater")[0]
+ def MaterialsRhoFreshwaterEnum(): return StringToEnum("MaterialsRhoFreshwater")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18663-18664.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18663-18664.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18663-18664.diff	(revision 19102)
@@ -0,0 +1,32 @@
+Index: ../trunk-jpl/src/m/enum/StrainRateparallelEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StrainRateparallelEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/StrainRateparallelEnum.m	(revision 18664)
+@@ -0,0 +1,11 @@
++function macro=StrainRateparallelEnum()
++%STRAINRATEPARALLELENUM - Enum of StrainRateparallel
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=StrainRateparallelEnum()
++
++macro=StringToEnum('StrainRateparallel');
+Index: ../trunk-jpl/src/m/enum/StrainRateperpendicularEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StrainRateperpendicularEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/StrainRateperpendicularEnum.m	(revision 18664)
+@@ -0,0 +1,11 @@
++function macro=StrainRateperpendicularEnum()
++%STRAINRATEPERPENDICULARENUM - Enum of StrainRateperpendicular
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=StrainRateperpendicularEnum()
++
++macro=StringToEnum('StrainRateperpendicular');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18664-18665.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18664-18665.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18664-18665.diff	(revision 19102)
@@ -0,0 +1,18 @@
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18664)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18665)
+@@ -594,10 +594,11 @@
+ 	Friction* friction=new Friction(element,3);
+ 
+ 	/* Start  looping on the number of gaussian points: */
+-	GaussPenta* gauss=new GaussPenta(2,2);
+-	GaussPenta* gaussup=new GaussPenta(2,2);
++	Gauss* gauss=element->NewGaussBase(2);
++	Gauss* gaussup=element->NewGaussTop(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 		gauss->GaussPoint(ig);
++		gaussup->GaussPoint(ig);
+ 
+ 		element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
+ 		element->NodalFunctions(basis,gauss);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18665-18666.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18665-18666.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18665-18666.diff	(revision 19102)
@@ -0,0 +1,48 @@
+Index: ../trunk-jpl/test/NightlyRun/test437.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test437.m	(revision 18665)
++++ ../trunk-jpl/test/NightlyRun/test437.m	(revision 18666)
+@@ -40,6 +40,7 @@
+ md.thermal.stabilization = 0;
+ 
+ %Go solve
++md.verbose=verbose(0);
+ md.cluster=generic('name',oshostname(),'np',3);
+ md=solve(md, TransientSolutionEnum());
+ 
+Index: ../trunk-jpl/test/Archives/Archive327.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive437.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive432.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive325.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive805.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive326.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive803.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive436.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive431.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
Index: /issm/oecreview/Archive/18296-19100/ISSM-18666-18667.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18666-18667.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18666-18667.diff	(revision 19102)
@@ -0,0 +1,68 @@
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18666)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18667)
+@@ -932,10 +932,11 @@
+ 	if(!element->IsOnBase() || element->IsFloating()) return;
+ 
+ 	/* Intermediaries */
++	bool			converged;
+ 	const int   dim=3;
+ 	int         i,is,state;
+ 	int			vertexdown,vertexup,numvertices,numsegments;
+-	const int	enthalpy_enum=EnthalpyEnum;
++	int			enthalpy_enum;
+ 	IssmDouble  vec_heatflux[dim],normal_base[dim],d1enthalpy[dim],d1pressure[dim];
+ 	IssmDouble  basalfriction,alpha2,geothermalflux,heatflux;
+ 	IssmDouble  dt,yts;
+@@ -948,11 +949,18 @@
+ 	/*Fetch parameters*/
+ 	element->GetVerticesCoordinates(&xyz_list);
+ 	element->GetVerticesCoordinatesBase(&xyz_list_base);
++	element->GetInputValue(&converged,ConvergedEnum);
++	element->FindParam(&dt,TimesteppingTimeStepEnum);
++	element->FindParam(&yts, ConstantsYtsEnum);
++
++	if(dt==0. && !converged) enthalpy_enum=EnthalpyPicardEnum;
++	else enthalpy_enum=EnthalpyEnum;
++
+ 	IssmDouble latentheat = element->GetMaterialParameter(MaterialsLatentheatEnum);
+ 	IssmDouble rho_ice    = element->GetMaterialParameter(MaterialsRhoIceEnum);
+ 	IssmDouble rho_water  = element->GetMaterialParameter(MaterialsRhoFreshwaterEnum);
+ 	IssmDouble beta		 = element->GetMaterialParameter(MaterialsBetaEnum);
+-	IssmDouble kappa		 = EnthalpyDiffusionParameterVolume(element,EnthalpyEnum);     _assert_(kappa>=0.);
++	IssmDouble kappa		 = EnthalpyDiffusionParameterVolume(element,enthalpy_enum);     _assert_(kappa>=0.);
+ 	IssmDouble kappa_mix;
+ 
+ 	/*retrieve inputs*/
+@@ -1001,7 +1009,7 @@
+ 
+ 			case 3:
+ 				// temperate, thin melting base: set spc
+-				// enthalpies[vertexdown]=element->PureIceEnthalpy(pressures[vertexdown]); 
++				enthalpies[vertexdown]=element->PureIceEnthalpy(pressures[vertexdown]); 
+ 				enthalpy_input->GetInputDerivativeValue(&d1enthalpy[0],xyz_list,gauss);
+ 				for(i=0;i<3;i++) vec_heatflux[i]=-kappa*d1enthalpy[i];
+ 				break;
+@@ -1032,8 +1040,6 @@
+ 	}/*}}}*/
+ 
+ 	/******** UPDATE MELTINGRATES AND WATERCOLUMN **************//*{{{*/
+-	element->FindParam(&dt,TimesteppingTimeStepEnum);
+-	element->FindParam(&yts, ConstantsYtsEnum);
+ 	for(is=0;is<numsegments;is++){
+ 		vertexdown = pairindices[is*2+0];
+ 		vertexup   = pairindices[is*2+1];
+@@ -1061,8 +1067,10 @@
+ 	}/*}}}*/
+ 
+ 	/*feed updated variables back into model*/
+-	element->AddInput(EnthalpyEnum,enthalpies,P1Enum); //TODO: distinguis for steadystate and transient run
+-	element->AddInput(WatercolumnEnum,watercolumns,P1Enum);
++	if(dt!=0.){
++		element->AddInput(enthalpy_enum,enthalpies,P1Enum); //TODO: distinguis for steadystate and transient run
++		element->AddInput(WatercolumnEnum,watercolumns,P1Enum);
++	}
+ 	element->AddInput(BasalforcingsGroundediceMeltingRateEnum,basalmeltingrates,P1Enum);
+ 
+ 	/*Clean up and return*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18667-18668.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18667-18668.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18667-18668.diff	(revision 19102)
@@ -0,0 +1,28 @@
+Index: ../trunk-jpl/src/m/classes/taoinversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/taoinversion.m	(revision 18667)
++++ ../trunk-jpl/src/m/classes/taoinversion.m	(revision 18668)
+@@ -25,6 +25,7 @@
+ 		vz_obs                      = NaN
+ 		vel_obs                     = NaN
+ 		thickness_obs               = NaN
++		surface_obs               = NaN
+ 	end
+ 	methods
+ 		function obj = taoinversion(varargin) % {{{
+@@ -123,6 +124,7 @@
+ 			fielddisplay(obj,'vy_obs','observed velocity y component [m/yr]');
+ 			fielddisplay(obj,'vel_obs','observed velocity magnitude [m/yr]');
+ 			fielddisplay(obj,'thickness_obs','observed thickness [m]');
++			fielddisplay(obj,'surface_obs','observed surface elevation [m]');
+ 			disp('Available cost functions:');
+ 			disp('   101: SurfaceAbsVelMisfit');
+ 			disp('   102: SurfaceRelVelMisfit');
+@@ -157,6 +159,7 @@
+ 			WriteData(fid,'object',obj,'class','inversion','fieldname','vy_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+ 			WriteData(fid,'object',obj,'class','inversion','fieldname','vz_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+ 			WriteData(fid,'object',obj,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'class','inversion','fieldname','surface_obs','format','DoubleMat','mattype',1);
+ 
+ 			%process control parameters
+ 			num_control_parameters=numel(obj.control_parameters);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18668-18669.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18668-18669.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18668-18669.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/classes/taoinversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/taoinversion.m	(revision 18668)
++++ ../trunk-jpl/src/m/classes/taoinversion.m	(revision 18669)
+@@ -59,7 +59,7 @@
+ 			obj.gttol = 1e-4;
+ 
+ 			%minimization algorithm
+-			obj.algorithm = 'tao_blmvm';
++			obj.algorithm = 'blmvm';
+ 
+ 			%several responses can be used:
+ 			obj.cost_functions=101;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18669-18670.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18669-18670.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18669-18670.diff	(revision 19102)
@@ -0,0 +1,18 @@
+Index: ../trunk-jpl/src/wrappers/IssmConfig/IssmConfig.cpp
+===================================================================
+--- ../trunk-jpl/src/wrappers/IssmConfig/IssmConfig.cpp	(revision 18669)
++++ ../trunk-jpl/src/wrappers/IssmConfig/IssmConfig.cpp	(revision 18670)
+@@ -75,6 +75,13 @@
+ 		_error_("_PETSC_MAJOR_ not found in config.h");
+ 		#endif
+ 	}
++	else if(strcmp(name,"_PETSC_MINOR_")==0){
++		#ifdef _PETSC_MINOR_
++		value = IssmDouble(_PETSC_MINOR_);
++		#else
++		_error_("_PETSC_MINOR_ not found in config.h");
++		#endif
++	}
+ 	else if(strcmp(name,"_DAKOTA_VERSION_")==0){
+ 		#ifdef _DAKOTA_VERSION_
+ 		isstring = true;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18670-18671.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18670-18671.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18670-18671.diff	(revision 19102)
@@ -0,0 +1,21 @@
+Index: ../trunk-jpl/src/m/classes/taoinversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/taoinversion.m	(revision 18670)
++++ ../trunk-jpl/src/m/classes/taoinversion.m	(revision 18671)
+@@ -88,7 +88,15 @@
+ 			md = checkfield(md,'fieldname','inversion.gatol','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.grtol','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.gttol','numel',1,'>=',0);
+-			md = checkfield(md,'fieldname','inversion.algorithm','values',{'tao_blmvm','tao_cg','tao_lmvm','blmvm','cg','lmvm'});
++
++			PETSCMAJOR = IssmConfig('_PETSC_MAJOR_');
++			PETSCMINOR = IssmConfig('_PETSC_MINOR_');
++			if(PETSCMAJOR>3 | PETSCMAJOR==3 & PETSCMINOR>=5)
++				md = checkfield(md,'fieldname','inversion.algorithm','values',{'blmvm','cg','lmvm'});
++			else
++				md = checkfield(md,'fieldname','inversion.algorithm','values',{'tao_blmvm','tao_cg','tao_lmvm'});
++			end
++
+ 			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:506]);
+ 			md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18671-18672.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18671-18672.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18671-18672.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/classes/taoinversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/taoinversion.m	(revision 18671)
++++ ../trunk-jpl/src/m/classes/taoinversion.m	(revision 18672)
+@@ -91,7 +91,7 @@
+ 
+ 			PETSCMAJOR = IssmConfig('_PETSC_MAJOR_');
+ 			PETSCMINOR = IssmConfig('_PETSC_MINOR_');
+-			if(PETSCMAJOR>3 | PETSCMAJOR==3 & PETSCMINOR>=5)
++			if(PETSCMAJOR>3 | (PETSCMAJOR==3 & PETSCMINOR>=5))
+ 				md = checkfield(md,'fieldname','inversion.algorithm','values',{'blmvm','cg','lmvm'});
+ 			else
+ 				md = checkfield(md,'fieldname','inversion.algorithm','values',{'tao_blmvm','tao_cg','tao_lmvm'});
Index: /issm/oecreview/Archive/18296-19100/ISSM-18672-18673.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18672-18673.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18672-18673.diff	(revision 19102)
@@ -0,0 +1,49 @@
+Index: ../trunk-jpl/externalpackages/mpich/install-3.0-macosx64-nothreads.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/mpich/install-3.0-macosx64-nothreads.sh	(revision 0)
++++ ../trunk-jpl/externalpackages/mpich/install-3.0-macosx64-nothreads.sh	(revision 18673)
+@@ -0,0 +1,37 @@
++#!/bin/bash
++
++# includes following bug fix:
++# https://issm.ess.uci.edu/forum/viewtopic.php?f=10&t=49
++
++set -eu
++
++#Some cleanup
++rm -rf src install mpich-3.0.4
++mkdir src install
++
++#Download from ISSM server
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/mpich-3.0.4.tar.gz' 'mpich-3.0.4.tar.gz'
++
++#Untar 
++tar -zxvf  mpich-3.0.4.tar.gz
++
++#Move mpich into src directory
++mv mpich-3.0.4/* src
++rm -rf mpich-3.0.4
++
++#Configure mpich
++cd src
++export "ac_cv_tls=none"
++./configure \
++	--prefix="$ISSM_DIR/externalpackages/mpich/install" \
++	--enable-shared
++
++	#CC=llvm-gcc \
++
++#Compile mpich (this new version supports parallel make)
++if [ $# -eq 0 ]; then
++	make
++else
++	make -j $1
++fi
++make install 
+
+Property changes on: ../trunk-jpl/externalpackages/mpich/install-3.0-macosx64-nothreads.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18673-18674.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18673-18674.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18673-18674.diff	(revision 19102)
@@ -0,0 +1,118 @@
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp	(revision 18673)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp	(revision 18674)
+@@ -56,30 +56,12 @@
+ 		parameters->AddObject(new IntParam(AnalysisCounterEnum,i));
+ 
+ 		/*Hack for trasient runs (FIXME: to be improved)*/
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==ThermalAnalysisEnum  && iomodel->domaintype==Domain2DhorizontalEnum) continue;
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==MeltingAnalysisEnum  && iomodel->domaintype==Domain2DhorizontalEnum) continue;
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==EnthalpyAnalysisEnum && iomodel->domaintype==Domain2DhorizontalEnum) continue;
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==ThermalAnalysisEnum && isthermal==false) continue;
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==MeltingAnalysisEnum && isthermal==false) continue;
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==EnthalpyAnalysisEnum && isthermal==false) continue;
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==ThermalAnalysisEnum && isenthalpy==true) continue;
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==MeltingAnalysisEnum && isenthalpy==true) continue;
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==EnthalpyAnalysisEnum && isenthalpy==false) continue;
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==MasstransportAnalysisEnum && ismasstransport==false && isgroundingline==false) continue;
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==StressbalanceAnalysisEnum && isstressbalance==false) continue;
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==StressbalanceVerticalAnalysisEnum && isstressbalance==false) continue;
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==StressbalanceSIAAnalysisEnum && isstressbalance==false) continue;
++
+ 		if(solution_enum==SteadystateSolutionEnum && analysis_enum==ThermalAnalysisEnum && isenthalpy==true) continue;
+ 		if(solution_enum==SteadystateSolutionEnum && analysis_enum==MeltingAnalysisEnum && isenthalpy==true) continue;
+ 		if(solution_enum==SteadystateSolutionEnum && analysis_enum==EnthalpyAnalysisEnum && isenthalpy==false) continue;
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==LevelsetAnalysisEnum && islevelset==false) continue;
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==ExtrapolationAnalysisEnum && islevelset==false) continue;
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==LsfReinitializationAnalysisEnum && islevelset==false) continue;
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==HydrologyShreveAnalysisEnum && ishydrology==false) continue;
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==HydrologyDCEfficientAnalysisEnum && ishydrology==false) continue;
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==HydrologyDCInefficientAnalysisEnum && ishydrology==false) continue;
+-		if(solution_enum==TransientSolutionEnum && analysis_enum==DamageEvolutionAnalysisEnum && isdamage==false) continue;
+ 
++
+ 		if(VerboseMProcessor()) _printf0_("   creating datasets for analysis " << EnumToStringx(analysis_enum) << "\n");
+ 		Analysis* analysis = EnumToAnalysis(analysis_enum);
+ 		analysis->UpdateParameters(parameters,iomodel,solution_enum,analysis_enum);
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18673)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18674)
+@@ -495,26 +495,57 @@
+ 			break;
+ 
+ 		case TransientSolutionEnum:
+-			analyses_temp[numanalyses++]=StressbalanceAnalysisEnum;
+-			analyses_temp[numanalyses++]=StressbalanceVerticalAnalysisEnum;
+-			analyses_temp[numanalyses++]=StressbalanceSIAAnalysisEnum;
++			bool isSIA,isthermal,isenthalpy,ismasstransport,isgroundingline,isstressbalance,islevelset,ishydrology,isdamage;
++			iomodel->Constant(&isSIA,FlowequationIsSIAEnum);
++			iomodel->Constant(&isthermal,TransientIsthermalEnum);
++			iomodel->Constant(&isenthalpy,ThermalIsenthalpyEnum);
++			iomodel->Constant(&islevelset,TransientIslevelsetEnum);
++			iomodel->Constant(&ismasstransport,TransientIsmasstransportEnum);
++			iomodel->Constant(&isstressbalance,TransientIsstressbalanceEnum);
++			iomodel->Constant(&isgroundingline,TransientIsgroundinglineEnum);
++			iomodel->Constant(&isdamage,TransientIsdamageevolutionEnum);
++			iomodel->Constant(&ishydrology,TransientIshydrologyEnum);
++			if(isstressbalance){
++				analyses_temp[numanalyses++]=StressbalanceAnalysisEnum;
++				analyses_temp[numanalyses++]=StressbalanceVerticalAnalysisEnum;
++				if(isSIA){
++					analyses_temp[numanalyses++]=StressbalanceSIAAnalysisEnum;
++				}
++			}
++			if(isthermal && iomodel->domaintype==Domain3DEnum){
++				if(isenthalpy){
++					analyses_temp[numanalyses++]=EnthalpyAnalysisEnum;
++				}
++				else{
++					analyses_temp[numanalyses++]=ThermalAnalysisEnum;
++					analyses_temp[numanalyses++]=MeltingAnalysisEnum;
++				}
++			}
++			if(ismasstransport || isgroundingline){
++				analyses_temp[numanalyses++]=MasstransportAnalysisEnum;
++			}
++			if(islevelset){
++				analyses_temp[numanalyses++]=LevelsetAnalysisEnum;
++				analyses_temp[numanalyses++]=ExtrapolationAnalysisEnum;
++				analyses_temp[numanalyses++]=LsfReinitializationAnalysisEnum;
++			}
++			if(ishydrology){
++				analyses_temp[numanalyses++]=HydrologyShreveAnalysisEnum;
++				analyses_temp[numanalyses++]=HydrologyDCInefficientAnalysisEnum;
++				analyses_temp[numanalyses++]=HydrologyDCEfficientAnalysisEnum;
++				analyses_temp[numanalyses++]=L2ProjectionEPLAnalysisEnum;
++			}
++			if(isdamage){
++				analyses_temp[numanalyses++]=DamageEvolutionAnalysisEnum;
++			}
++
++			if(iomodel->domaintype==Domain2DverticalEnum || iomodel->domaintype==Domain3DEnum){
++				analyses_temp[numanalyses++]=ExtrudeFromBaseAnalysisEnum;
++				analyses_temp[numanalyses++]=ExtrudeFromTopAnalysisEnum;
++				analyses_temp[numanalyses++]=FreeSurfaceBaseAnalysisEnum;
++				analyses_temp[numanalyses++]=FreeSurfaceTopAnalysisEnum;
++			}
+ 			analyses_temp[numanalyses++]=L2ProjectionBaseAnalysisEnum;
+-			analyses_temp[numanalyses++]=ThermalAnalysisEnum;
+-			analyses_temp[numanalyses++]=MeltingAnalysisEnum;
+-			analyses_temp[numanalyses++]=EnthalpyAnalysisEnum;
+-			analyses_temp[numanalyses++]=MasstransportAnalysisEnum;
+-			analyses_temp[numanalyses++]=FreeSurfaceBaseAnalysisEnum;
+-			analyses_temp[numanalyses++]=FreeSurfaceTopAnalysisEnum;
+-			analyses_temp[numanalyses++]=ExtrudeFromBaseAnalysisEnum;
+-			analyses_temp[numanalyses++]=ExtrudeFromTopAnalysisEnum;
+-			analyses_temp[numanalyses++]=LevelsetAnalysisEnum;
+-			analyses_temp[numanalyses++]=ExtrapolationAnalysisEnum;
+-			analyses_temp[numanalyses++]=LsfReinitializationAnalysisEnum;
+-			analyses_temp[numanalyses++]=DamageEvolutionAnalysisEnum;
+-			analyses_temp[numanalyses++]=HydrologyShreveAnalysisEnum;
+-			analyses_temp[numanalyses++]=HydrologyDCInefficientAnalysisEnum;
+-			analyses_temp[numanalyses++]=HydrologyDCEfficientAnalysisEnum;
+-			analyses_temp[numanalyses++]=L2ProjectionEPLAnalysisEnum;
+ 			break;
+ 
+ 		case SeaiceSolutionEnum:
Index: /issm/oecreview/Archive/18296-19100/ISSM-18674-18675.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18674-18675.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18674-18675.diff	(revision 19102)
@@ -0,0 +1,110 @@
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp	(revision 18674)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp	(revision 18675)
+@@ -15,7 +15,6 @@
+ void ModelProcessorx(Elements** pelements, Nodes** pnodes, Vertices** pvertices, Materials** pmaterials, Constraints** pconstraints, Loads** ploads, Parameters** pparameters,IoModel* iomodel,FILE* toolkitfile, char* rootpath,const int solution_enum,const int nummodels,const int* analysis_enum_list){
+ 
+ 	int   i,analysis_enum,verbose;
+-	bool  isthermal,ismasstransport,isstressbalance,isgroundingline,isenthalpy,islevelset,isdamage,ishydrology;
+ 
+ 	/*Initialize datasets*/
+ 	Elements    *elements    = new Elements();
+@@ -28,15 +27,6 @@
+ 
+ 	/*Fetch parameters: */
+ 	iomodel->Constant(&verbose,VerboseEnum);
+-	iomodel->Constant(&isthermal,TransientIsthermalEnum);
+-	iomodel->Constant(&isenthalpy,ThermalIsenthalpyEnum);
+-	iomodel->Constant(&islevelset,TransientIslevelsetEnum);
+-	iomodel->Constant(&ismasstransport,TransientIsmasstransportEnum);
+-	iomodel->Constant(&isstressbalance,TransientIsstressbalanceEnum);
+-	iomodel->Constant(&isgroundingline,TransientIsgroundinglineEnum);
+-	iomodel->Constant(&isdamage,TransientIsdamageevolutionEnum);
+-	iomodel->Constant(&ishydrology,TransientIshydrologyEnum);
+-
+ 	SetVerbosityLevel(verbose);
+ 
+ 	if(VerboseMProcessor()) _printf0_("   starting model processor \n");
+@@ -55,13 +45,6 @@
+ 		analysis_enum=analysis_enum_list[i];
+ 		parameters->AddObject(new IntParam(AnalysisCounterEnum,i));
+ 
+-		/*Hack for trasient runs (FIXME: to be improved)*/
+-
+-		if(solution_enum==SteadystateSolutionEnum && analysis_enum==ThermalAnalysisEnum && isenthalpy==true) continue;
+-		if(solution_enum==SteadystateSolutionEnum && analysis_enum==MeltingAnalysisEnum && isenthalpy==true) continue;
+-		if(solution_enum==SteadystateSolutionEnum && analysis_enum==EnthalpyAnalysisEnum && isenthalpy==false) continue;
+-
+-
+ 		if(VerboseMProcessor()) _printf0_("   creating datasets for analysis " << EnumToStringx(analysis_enum) << "\n");
+ 		Analysis* analysis = EnumToAnalysis(analysis_enum);
+ 		analysis->UpdateParameters(parameters,iomodel,solution_enum,analysis_enum);
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18674)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18675)
+@@ -432,20 +432,37 @@
+ 			}
+ 			break;
+ 
+-		case SteadystateSolutionEnum:
++		case SteadystateSolutionEnum:{
++			bool isSIA,isenthalpy;
++			iomodel->Constant(&isSIA,FlowequationIsSIAEnum);
++			iomodel->Constant(&isenthalpy,ThermalIsenthalpyEnum);
+ 			analyses_temp[numanalyses++]=StressbalanceAnalysisEnum;
+ 			analyses_temp[numanalyses++]=StressbalanceVerticalAnalysisEnum;
+-			analyses_temp[numanalyses++]=StressbalanceSIAAnalysisEnum;
++			if(isSIA){
++				analyses_temp[numanalyses++]=StressbalanceSIAAnalysisEnum;
++			}
++			if(isenthalpy){
++				analyses_temp[numanalyses++]=EnthalpyAnalysisEnum;
++			}
++			else{
++				analyses_temp[numanalyses++]=ThermalAnalysisEnum;
++				analyses_temp[numanalyses++]=MeltingAnalysisEnum;
++			}
+ 			analyses_temp[numanalyses++]=L2ProjectionBaseAnalysisEnum;
+-			analyses_temp[numanalyses++]=EnthalpyAnalysisEnum;
+-			analyses_temp[numanalyses++]=ThermalAnalysisEnum;
+-			analyses_temp[numanalyses++]=MeltingAnalysisEnum;
++			}
+ 			break;
+ 
+-		case ThermalSolutionEnum:
+-			analyses_temp[numanalyses++]=ThermalAnalysisEnum;
+-			analyses_temp[numanalyses++]=MeltingAnalysisEnum;
+-			analyses_temp[numanalyses++]=EnthalpyAnalysisEnum;
++		case ThermalSolutionEnum:{
++			bool isenthalpy;
++			iomodel->Constant(&isenthalpy,ThermalIsenthalpyEnum);
++			if(isenthalpy){
++				analyses_temp[numanalyses++]=EnthalpyAnalysisEnum;
++			}
++			else{
++				analyses_temp[numanalyses++]=ThermalAnalysisEnum;
++				analyses_temp[numanalyses++]=MeltingAnalysisEnum;
++			}
++			}
+ 			break;
+ 
+ 		case HydrologySolutionEnum:
+@@ -494,7 +511,7 @@
+ 			analyses_temp[numanalyses++]=DamageEvolutionAnalysisEnum;
+ 			break;
+ 
+-		case TransientSolutionEnum:
++		case TransientSolutionEnum:{
+ 			bool isSIA,isthermal,isenthalpy,ismasstransport,isgroundingline,isstressbalance,islevelset,ishydrology,isdamage;
+ 			iomodel->Constant(&isSIA,FlowequationIsSIAEnum);
+ 			iomodel->Constant(&isthermal,TransientIsthermalEnum);
+@@ -546,6 +563,7 @@
+ 				analyses_temp[numanalyses++]=FreeSurfaceTopAnalysisEnum;
+ 			}
+ 			analyses_temp[numanalyses++]=L2ProjectionBaseAnalysisEnum;
++			}
+ 			break;
+ 
+ 		case SeaiceSolutionEnum:
Index: /issm/oecreview/Archive/18296-19100/ISSM-18675-18676.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18675-18676.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18675-18676.diff	(revision 19102)
@@ -0,0 +1,44 @@
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 18675)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 18676)
+@@ -11,10 +11,10 @@
+ void	UpdateElementsAndMaterialsControl(Elements* elements,Materials* materials, IoModel* iomodel){
+ 
+ 	/*Intermediary*/
+-	int       control;
++	int       control,cost_function;
+ 	Element  *element = NULL;
+ 	Material *material = NULL;
+-	int       num_control_type;
++	int       num_control_type,num_cost_functions;
+ 	bool      control_analysis;
+ 
+ 	/*Fetch parameters: */
+@@ -24,14 +24,20 @@
+ 	/*Now, return if no control*/
+ 	if(!control_analysis) return;
+ 
++	iomodel->FetchData(5,InversionControlParametersEnum,InversionCostFunctionsEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum);
++
+ 	/*Fetch data needed: */
+-	iomodel->FetchDataToInput(elements,InversionVxObsEnum,0.);
+-	iomodel->FetchDataToInput(elements,InversionVyObsEnum,0.); 
+-	iomodel->FetchDataToInput(elements,InversionThicknessObsEnum,0.);
+-	iomodel->FetchDataToInput(elements,InversionSurfaceObsEnum,0.);
++	iomodel->Constant(&num_cost_functions,InversionNumCostFunctionsEnum);
++	for(int i=0;i<num_cost_functions;i++){
++		cost_function= reCast<int,IssmDouble>(iomodel->Data(InversionCostFunctionsEnum)[i]);
++		if(cost_function==ThicknessAbsMisfitEnum) iomodel->FetchDataToInput(elements,InversionThicknessObsEnum,0.);
++		else if(cost_function==SurfaceAbsVelMisfitEnum || cost_function==SurfaceRelVelMisfitEnum || cost_function==SurfaceLogVelMisfitEnum || cost_function==SurfaceLogVxVyMisfitEnum || cost_function==SurfaceAverageVelMisfitEnum){
++			iomodel->FetchDataToInput(elements,InversionVxObsEnum,0.);
++			iomodel->FetchDataToInput(elements,InversionVyObsEnum,0.); 
++		}
++	}
++	//iomodel->FetchDataToInput(elements,InversionSurfaceObsEnum,0.);
+ 
+-	iomodel->FetchData(5,InversionControlParametersEnum,InversionCostFunctionsEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum);
+-
+ 	for(int i=0;i<num_control_type;i++){
+ 		control = reCast<int,IssmDouble>(iomodel->Data(InversionControlParametersEnum)[i]);
+ 		switch(control){
Index: /issm/oecreview/Archive/18296-19100/ISSM-18676-18677.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18676-18677.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18676-18677.diff	(revision 19102)
@@ -0,0 +1,119 @@
+Index: ../trunk-jpl/test/NightlyRun/test340.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test340.m	(revision 0)
++++ ../trunk-jpl/test/NightlyRun/test340.m	(revision 18677)
+@@ -0,0 +1,34 @@
++md=triangle(model(),'../Exp/Square.exp',200000.);
++md=setmask(md,'','');
++md=parameterize(md,'../Par/SquareSheetConstrained.par');
++md=extrude(md,3,1.);
++md=setflowequation(md,'HO','all');
++
++%control parameters
++md.inversion=taoinversion(md.inversion);
++md.inversion.iscontrol=1;
++md.inversion.control_parameters={'FrictionCoefficient'};
++md.inversion.min_parameters=1.*ones(md.mesh.numberofvertices,1);
++md.inversion.max_parameters=200.*ones(md.mesh.numberofvertices,1);
++md.inversion.maxsteps=2;
++md.inversion.maxiter=6;
++md.inversion.cost_functions=[102  501];
++md.inversion.cost_functions_coefficients=ones(md.mesh.numberofvertices,2); md.inversion.cost_functions_coefficients(:,2)=2.*10^-7;
++md.inversion.algorithm='tao_blmvm';
++md.inversion.vx_obs=md.initialization.vx; md.inversion.vy_obs=md.initialization.vy;
++
++md.cluster=generic('name',oshostname(),'np',3);
++md=solve(md,StressbalanceSolutionEnum());
++
++%Fields and tolerances to track changes
++field_names     ={'Gradient','Misfits','FrictionCoefficient','Pressure','Vel','Vx','Vy'};
++field_tolerances={1e-08,1e-07,1e-10,1e-10,1e-09,1e-09,1e-09};
++field_values={...
++	(md.results.StressbalanceSolution.Gradient1),...
++	(md.results.StressbalanceSolution.J),...
++	(md.results.StressbalanceSolution.FrictionCoefficient),...
++	(md.results.StressbalanceSolution.Pressure),...
++	(md.results.StressbalanceSolution.Vel),...
++	(md.results.StressbalanceSolution.Vx),...
++	(md.results.StressbalanceSolution.Vy)
++};
+Index: ../trunk-jpl/test/NightlyRun/test341.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test341.m	(revision 0)
++++ ../trunk-jpl/test/NightlyRun/test341.m	(revision 18677)
+@@ -0,0 +1,32 @@
++md=triangle(model(),'../Exp/Square.exp',200000.);
++md=setmask(md,'','');
++md=parameterize(md,'../Par/SquareSheetConstrained.par');
++md=extrude(md,3,1.);
++md=setflowequation(md,'HO','all');
++
++%control parameters
++md.inversion=m1qn3inversion(md.inversion);
++md.inversion.iscontrol=1;
++md.inversion.control_parameters={'FrictionCoefficient'};
++md.inversion.min_parameters=1.*ones(md.mesh.numberofvertices,1);
++md.inversion.max_parameters=200.*ones(md.mesh.numberofvertices,1);
++md.inversion.maxsteps=2;
++md.inversion.maxiter=6;
++md.inversion.cost_functions=[102  501];
++md.inversion.cost_functions_coefficients=ones(md.mesh.numberofvertices,2); md.inversion.cost_functions_coefficients(:,2)=2.*10^-7;
++md.inversion.vx_obs=md.initialization.vx; md.inversion.vy_obs=md.initialization.vy;
++
++md.cluster=generic('name',oshostname(),'np',3);
++md=solve(md,StressbalanceSolutionEnum());
++
++%Fields and tolerances to track changes
++field_names     ={'Gradient','FrictionCoefficient','Pressure','Vel','Vx','Vy'};
++field_tolerances={1e-08,1e-10,1e-10,1e-09,1e-09,1e-09};
++field_values={...
++	(md.results.StressbalanceSolution.Gradient1),...
++	(md.results.StressbalanceSolution.FrictionCoefficient),...
++	(md.results.StressbalanceSolution.Pressure),...
++	(md.results.StressbalanceSolution.Vel),...
++	(md.results.StressbalanceSolution.Vx),...
++	(md.results.StressbalanceSolution.Vy)
++};
+Index: ../trunk-jpl/test/NightlyRun/IdToName.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/IdToName.m	(revision 18676)
++++ ../trunk-jpl/test/NightlyRun/IdToName.m	(revision 18677)
+@@ -116,6 +116,8 @@
+ 	case 337, name='SquareSheetConstrainedSmbComponents3d';
+ 	case 338, name='SquareSheetConstrainedSmbMeltComponents2d';
+ 	case 339, name='SquareSheetConstrainedSmbMeltComponents3d';
++	case 340, name='SquareSheetConstrainedCMtaoDragHO';
++	case 341, name='SquareSheetConstrainedCMm1qn3DragHO';
+ 	case 401, name='SquareSheetShelfStressSSA2d';
+ 	case 402, name='SquareSheetShelfStressSSA3d';
+ 	case 403, name='SquareSheetShelfStressHO';
+Index: ../trunk-jpl/test/Archives/Archive340.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive340.nc
+===================================================================
+--- ../trunk-jpl/test/Archives/Archive340.nc	(revision 18676)
++++ ../trunk-jpl/test/Archives/Archive340.nc	(revision 18677)
+
+Property changes on: ../trunk-jpl/test/Archives/Archive340.nc
+___________________________________________________________________
+Added: svn:mime-type
+## -0,0 +1 ##
++application/octet-stream
+\ No newline at end of property
+Index: ../trunk-jpl/test/Archives/Archive341.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive341.nc
+===================================================================
+--- ../trunk-jpl/test/Archives/Archive341.nc	(revision 18676)
++++ ../trunk-jpl/test/Archives/Archive341.nc	(revision 18677)
+
+Property changes on: ../trunk-jpl/test/Archives/Archive341.nc
+___________________________________________________________________
+Added: svn:mime-type
+## -0,0 +1 ##
++application/octet-stream
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18677-18678.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18677-18678.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18677-18678.diff	(revision 19102)
@@ -0,0 +1,32 @@
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 18677)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 18678)
+@@ -26,17 +26,21 @@
+ 
+ 	iomodel->FetchData(5,InversionControlParametersEnum,InversionCostFunctionsEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum);
+ 
+-	/*Fetch data needed: */
++	/*Fetch Observations */
+ 	iomodel->Constant(&num_cost_functions,InversionNumCostFunctionsEnum);
+ 	for(int i=0;i<num_cost_functions;i++){
+ 		cost_function= reCast<int,IssmDouble>(iomodel->Data(InversionCostFunctionsEnum)[i]);
+-		if(cost_function==ThicknessAbsMisfitEnum) iomodel->FetchDataToInput(elements,InversionThicknessObsEnum,0.);
+-		else if(cost_function==SurfaceAbsVelMisfitEnum || cost_function==SurfaceRelVelMisfitEnum || cost_function==SurfaceLogVelMisfitEnum || cost_function==SurfaceLogVxVyMisfitEnum || cost_function==SurfaceAverageVelMisfitEnum){
+-			iomodel->FetchDataToInput(elements,InversionVxObsEnum,0.);
+-			iomodel->FetchDataToInput(elements,InversionVyObsEnum,0.); 
++		if(     cost_function==ThicknessAbsMisfitEnum) iomodel->FetchDataToInput(elements,InversionThicknessObsEnum);
++		else if(cost_function==SurfaceAbsMisfitEnum)   iomodel->FetchDataToInput(elements,InversionSurfaceObsEnum);
++		else if(cost_function==SurfaceAbsVelMisfitEnum
++			  || cost_function==SurfaceRelVelMisfitEnum
++			  || cost_function==SurfaceLogVelMisfitEnum
++			  || cost_function==SurfaceLogVxVyMisfitEnum
++			  || cost_function==SurfaceAverageVelMisfitEnum){
++			iomodel->FetchDataToInput(elements,InversionVxObsEnum);
++			iomodel->FetchDataToInput(elements,InversionVyObsEnum); 
+ 		}
+ 	}
+-	//iomodel->FetchDataToInput(elements,InversionSurfaceObsEnum,0.);
+ 
+ 	for(int i=0;i<num_control_type;i++){
+ 		control = reCast<int,IssmDouble>(iomodel->Data(InversionControlParametersEnum)[i]);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18678-18679.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18678-18679.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18678-18679.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/m4/issm_options.m4
+===================================================================
+--- ../trunk-jpl/m4/issm_options.m4	(revision 18678)
++++ ../trunk-jpl/m4/issm_options.m4	(revision 18679)
+@@ -262,7 +262,7 @@
+   			*cygwin*) 
+   				if  test $VENDOR = intel-win7-32; then
+   					MEXLIB="-Wl,./../../c/libISSMCore.a -Wl,libISSMApi.a -Wl,libISSMMatlab.a -Wl,./../../c/libISSMModules.a -Wl,libmx.lib -Wl,libmex.lib -Wl,libmat.lib ${OSLIBS} -Wl,libf2cblas.lib -Wl,libf2clapack.lib" 
+-               MEXLINK="-Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win32/microsoft` -no-undefined -Wl,/export:mexFunction" 
++               MEXLINK="-Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win32/microsoft` -no-undefined -Wl,/export:mexFunction /LD"
+ 					MEXEXT=`$MATLAB_ROOT/bin/mexext.bat`
+ 					MEXEXT=".$MEXEXT"
+   				elif  test l-win7-64; then
Index: /issm/oecreview/Archive/18296-19100/ISSM-18679-18680.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18679-18680.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18679-18680.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/m4/issm_options.m4
+===================================================================
+--- ../trunk-jpl/m4/issm_options.m4	(revision 18679)
++++ ../trunk-jpl/m4/issm_options.m4	(revision 18680)
+@@ -267,7 +267,7 @@
+ 					MEXEXT=".$MEXEXT"
+   				elif  test l-win7-64; then
+   					MEXLIB="-Wl,./../../c/libISSMCore.a -Wl,libISSMApi.a -Wl,libISSMMatlab.a -Wl,./../../c/libISSMModules.a -Wl,libmx.lib -Wl,libmex.lib -Wl,libmat.lib ${OSLIBS} -Wl,libf2cblas.lib -Wl,libf2clapack.lib" 
+-               MEXLINK="-Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win64/microsoft` -no-undefined -Wl,/export:mexFunction" 
++               MEXLINK="-Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win64/microsoft` -no-undefined -Wl,/export:mexFunction /LD" 
+ 					MEXEXT=".mexw64"
+   				fi
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18680-18681.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18680-18681.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18680-18681.diff	(revision 19102)
@@ -0,0 +1,19 @@
+Index: ../trunk-jpl/m4/issm_options.m4
+===================================================================
+--- ../trunk-jpl/m4/issm_options.m4	(revision 18680)
++++ ../trunk-jpl/m4/issm_options.m4	(revision 18681)
+@@ -262,12 +262,12 @@
+   			*cygwin*) 
+   				if  test $VENDOR = intel-win7-32; then
+   					MEXLIB="-Wl,./../../c/libISSMCore.a -Wl,libISSMApi.a -Wl,libISSMMatlab.a -Wl,./../../c/libISSMModules.a -Wl,libmx.lib -Wl,libmex.lib -Wl,libmat.lib ${OSLIBS} -Wl,libf2cblas.lib -Wl,libf2clapack.lib" 
+-               MEXLINK="-Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win32/microsoft` -no-undefined -Wl,/export:mexFunction /LD"
++               MEXLINK="-Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win32/microsoft` -no-undefined -Wl,/export:mexFunction -LD"
+ 					MEXEXT=`$MATLAB_ROOT/bin/mexext.bat`
+ 					MEXEXT=".$MEXEXT"
+   				elif  test l-win7-64; then
+   					MEXLIB="-Wl,./../../c/libISSMCore.a -Wl,libISSMApi.a -Wl,libISSMMatlab.a -Wl,./../../c/libISSMModules.a -Wl,libmx.lib -Wl,libmex.lib -Wl,libmat.lib ${OSLIBS} -Wl,libf2cblas.lib -Wl,libf2clapack.lib" 
+-               MEXLINK="-Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win64/microsoft` -no-undefined -Wl,/export:mexFunction /LD" 
++               MEXLINK="-Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win64/microsoft` -no-undefined -Wl,/export:mexFunction -LD" 
+ 					MEXEXT=".mexw64"
+   				fi
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18681-18682.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18681-18682.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18681-18682.diff	(revision 19102)
@@ -0,0 +1,36 @@
+Index: ../trunk-jpl/test/NightlyRun/test340.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test340.m	(revision 18681)
++++ ../trunk-jpl/test/NightlyRun/test340.m	(revision 18682)
+@@ -14,7 +14,6 @@
+ md.inversion.maxiter=6;
+ md.inversion.cost_functions=[102  501];
+ md.inversion.cost_functions_coefficients=ones(md.mesh.numberofvertices,2); md.inversion.cost_functions_coefficients(:,2)=2.*10^-7;
+-md.inversion.algorithm='tao_blmvm';
+ md.inversion.vx_obs=md.initialization.vx; md.inversion.vy_obs=md.initialization.vy;
+ 
+ md.cluster=generic('name',oshostname(),'np',3);
+Index: ../trunk-jpl/jenkins/linux64_murdo
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_murdo	(revision 18681)
++++ ../trunk-jpl/jenkins/linux64_murdo	(revision 18682)
+@@ -19,6 +19,7 @@
+ 	--with-dakota-dir=$ISSM_DIR/externalpackages/dakota/install \
+ 	--with-boost-dir=$ISSM_DIR/externalpackages/boost/install/ \
+ 	--with-fortran-lib="-L/usr/lib/gcc/x86_64-linux-gnu/4.6/ -lgfortran" \
++	--with-m1qn3-dir=$ISSM_DIR/externalpackages/m1qn3/install \
+ 	--with-numthreads=18 \
+ 	--enable-development \
+ 	--enable-debugging '
+Index: ../trunk-jpl/jenkins/imac-012301-gil
+===================================================================
+--- ../trunk-jpl/jenkins/imac-012301-gil	(revision 18681)
++++ ../trunk-jpl/jenkins/imac-012301-gil	(revision 18682)
+@@ -13,6 +13,7 @@
+ 	--with-scalapack-dir=$ISSM_DIR/externalpackages/petsc/install/ \
+ 	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-metis-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-m1qn3-dir=$ISSM_DIR/externalpackages/m1qn3/install \
+ 	--with-numthreads=8 \
+ 	--enable-debugging \
+ 	--enable-development'
Index: /issm/oecreview/Archive/18296-19100/ISSM-18682-18683.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18682-18683.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18682-18683.diff	(revision 19102)
@@ -0,0 +1,24 @@
+Index: ../trunk-jpl/jenkins/linux64_murdo
+===================================================================
+--- ../trunk-jpl/jenkins/linux64_murdo	(revision 18682)
++++ ../trunk-jpl/jenkins/linux64_murdo	(revision 18683)
+@@ -64,6 +64,7 @@
+ 						blas          install-linux64.sh          
+ 						lapack        install-linux64.sh          
+ 						git           install.sh                  
++						m1qn3         install.sh          
+ 						numpy         install-linux64.sh          
+ 						scipy         install-linux64.sh          
+ 						hdf5          install.sh                  
+Index: ../trunk-jpl/jenkins/imac-012301-gil
+===================================================================
+--- ../trunk-jpl/jenkins/imac-012301-gil	(revision 18682)
++++ ../trunk-jpl/jenkins/imac-012301-gil	(revision 18683)
+@@ -48,6 +48,7 @@
+ 						matlab    install.sh                
+ 						mpich     install-3.0-macosx64.sh    
+ 						cmake     install.sh                
++						m1qn3     install.sh    
+ 						petsc     install-3.4-macosx64.sh    
+ 						triangle  install-macosx64.sh 
+ 						shell2junit  install.sh "
Index: /issm/oecreview/Archive/18296-19100/ISSM-18683-18684.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18683-18684.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18683-18684.diff	(revision 19102)
@@ -0,0 +1,38 @@
+Index: ../trunk-jpl/test/NightlyRun/test340.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test340.m	(revision 18683)
++++ ../trunk-jpl/test/NightlyRun/test340.m	(revision 18684)
+@@ -14,6 +14,13 @@
+ md.inversion.maxiter=6;
+ md.inversion.cost_functions=[102  501];
+ md.inversion.cost_functions_coefficients=ones(md.mesh.numberofvertices,2); md.inversion.cost_functions_coefficients(:,2)=2.*10^-7;
++PETSCMAJOR = IssmConfig('_PETSC_MAJOR_');
++PETSCMINOR = IssmConfig('_PETSC_MINOR_');
++if(PETSCMAJOR>3 | (PETSCMAJOR==3 & PETSCMINOR>=5)),
++	md.inversion.algorithm='blmvm';
++else
++	md.inversion.algorithm='tao_blmvm';
++end
+ md.inversion.vx_obs=md.initialization.vx; md.inversion.vy_obs=md.initialization.vy;
+ 
+ md.cluster=generic('name',oshostname(),'np',3);
+Index: ../trunk-jpl/jenkins/imac-012301-gil
+===================================================================
+--- ../trunk-jpl/jenkins/imac-012301-gil	(revision 18683)
++++ ../trunk-jpl/jenkins/imac-012301-gil	(revision 18684)
+@@ -13,6 +13,7 @@
+ 	--with-scalapack-dir=$ISSM_DIR/externalpackages/petsc/install/ \
+ 	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-metis-dir=$ISSM_DIR/externalpackages/petsc/install \
++	--with-tao-dir=$ISSM_DIR/externalpackages/tao/install \
+ 	--with-m1qn3-dir=$ISSM_DIR/externalpackages/m1qn3/install \
+ 	--with-numthreads=8 \
+ 	--enable-debugging \
+@@ -50,6 +51,7 @@
+ 						cmake     install.sh                
+ 						m1qn3     install.sh    
+ 						petsc     install-3.4-macosx64.sh    
++						ta0       install-2.2.sh
+ 						triangle  install-macosx64.sh 
+ 						shell2junit  install.sh "
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18684-18685.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18684-18685.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18684-18685.diff	(revision 19102)
@@ -0,0 +1,19 @@
+Index: ../trunk-jpl/m4/issm_options.m4
+===================================================================
+--- ../trunk-jpl/m4/issm_options.m4	(revision 18684)
++++ ../trunk-jpl/m4/issm_options.m4	(revision 18685)
+@@ -262,12 +262,12 @@
+   			*cygwin*) 
+   				if  test $VENDOR = intel-win7-32; then
+   					MEXLIB="-Wl,./../../c/libISSMCore.a -Wl,libISSMApi.a -Wl,libISSMMatlab.a -Wl,./../../c/libISSMModules.a -Wl,libmx.lib -Wl,libmex.lib -Wl,libmat.lib ${OSLIBS} -Wl,libf2cblas.lib -Wl,libf2clapack.lib" 
+-               MEXLINK="-Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win32/microsoft` -no-undefined -Wl,/export:mexFunction -LD"
++               MEXLINK="/LD -Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win32/microsoft` -no-undefined -Wl,/export:mexFunction"
+ 					MEXEXT=`$MATLAB_ROOT/bin/mexext.bat`
+ 					MEXEXT=".$MEXEXT"
+   				elif  test l-win7-64; then
+   					MEXLIB="-Wl,./../../c/libISSMCore.a -Wl,libISSMApi.a -Wl,libISSMMatlab.a -Wl,./../../c/libISSMModules.a -Wl,libmx.lib -Wl,libmex.lib -Wl,libmat.lib ${OSLIBS} -Wl,libf2cblas.lib -Wl,libf2clapack.lib" 
+-               MEXLINK="-Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win64/microsoft` -no-undefined -Wl,/export:mexFunction -LD" 
++               MEXLINK="/LD -Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win64/microsoft` -no-undefined -Wl,/export:mexFunction" 
+ 					MEXEXT=".mexw64"
+   				fi
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18685-18686.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18685-18686.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18685-18686.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/jenkins/imac-012301-gil
+===================================================================
+--- ../trunk-jpl/jenkins/imac-012301-gil	(revision 18685)
++++ ../trunk-jpl/jenkins/imac-012301-gil	(revision 18686)
+@@ -51,7 +51,7 @@
+ 						cmake     install.sh                
+ 						m1qn3     install.sh    
+ 						petsc     install-3.4-macosx64.sh    
+-						ta0       install-2.2.sh
++						tao       install-2.2.sh
+ 						triangle  install-macosx64.sh 
+ 						shell2junit  install.sh "
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18686-18687.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18686-18687.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18686-18687.diff	(revision 19102)
@@ -0,0 +1,37 @@
+Index: ../trunk-jpl/test/NightlyRun/test340.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test340.m	(revision 18686)
++++ ../trunk-jpl/test/NightlyRun/test340.m	(revision 18687)
+@@ -14,13 +14,6 @@
+ md.inversion.maxiter=6;
+ md.inversion.cost_functions=[102  501];
+ md.inversion.cost_functions_coefficients=ones(md.mesh.numberofvertices,2); md.inversion.cost_functions_coefficients(:,2)=2.*10^-7;
+-PETSCMAJOR = IssmConfig('_PETSC_MAJOR_');
+-PETSCMINOR = IssmConfig('_PETSC_MINOR_');
+-if(PETSCMAJOR>3 | (PETSCMAJOR==3 & PETSCMINOR>=5)),
+-	md.inversion.algorithm='blmvm';
+-else
+-	md.inversion.algorithm='tao_blmvm';
+-end
+ md.inversion.vx_obs=md.initialization.vx; md.inversion.vy_obs=md.initialization.vy;
+ 
+ md.cluster=generic('name',oshostname(),'np',3);
+Index: ../trunk-jpl/src/m/classes/taoinversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/taoinversion.m	(revision 18686)
++++ ../trunk-jpl/src/m/classes/taoinversion.m	(revision 18687)
+@@ -59,7 +59,13 @@
+ 			obj.gttol = 1e-4;
+ 
+ 			%minimization algorithm
+-			obj.algorithm = 'blmvm';
++			PETSCMAJOR = IssmConfig('_PETSC_MAJOR_');
++			PETSCMINOR = IssmConfig('_PETSC_MINOR_');
++			if(PETSCMAJOR>3 | (PETSCMAJOR==3 & PETSCMINOR>=5))
++				obj.algorithm = 'blmvm';
++			else
++				obj.algorithm = 'tao_blmvm';
++			end
+ 
+ 			%several responses can be used:
+ 			obj.cost_functions=101;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18687-18688.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18687-18688.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18687-18688.diff	(revision 19102)
@@ -0,0 +1,17 @@
+Index: ../trunk-jpl/src/m/classes/clusters/discover.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/discover.m	(revision 18687)
++++ ../trunk-jpl/src/m/classes/clusters/discover.m	(revision 18688)
+@@ -57,9 +57,9 @@
+ 		 %}}}
+ 		 function md = checkconsistency(cluster,md,solution,analyses) % {{{
+ 
+-			 available_queues={'general_long','general','general_small','debug'};
+-			 queue_requirements_time=[24*60 12*60 12*60 60];
+-			 queue_requirements_np=[516 1024 16 32];
++			 available_queues={'general_long','general','debug'};
++			 queue_requirements_time=[24*60 12*60 60];
++			 queue_requirements_np=[516 1024 32];
+ 
+ 			 QueueRequirements(available_queues,queue_requirements_time,queue_requirements_np,cluster.queue,cluster.np,cluster.time)
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18688-18689.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18688-18689.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18688-18689.diff	(revision 19102)
@@ -0,0 +1,163 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18688)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18689)
+@@ -139,6 +139,7 @@
+ 		}
+ 		return NULL;
+ 	}
++
+ 	/* Intermediaries */
+ 	IssmDouble  D_scalar,Jdet,dt;
+ 	IssmDouble  epl_thickness;
+@@ -196,7 +197,7 @@
+ 			
+ 			/*Transfer EPL part*/
+ 			transfer=GetHydrologyKMatrixTransfer(basalelement,gauss,sed_head_input,epl_head_input,thick_input,base_input);
+-			D_scalar=transfer*gauss->weight*Jdet*dt;
++			D_scalar=transfer*gauss->weight*Jdet;
+ 			TripleMultiply(basis,numnodes,1,0,
+ 										 &D_scalar,1,1,0,
+ 										 basis,1,numnodes,0,
+@@ -291,7 +292,7 @@
+ 			
+ 			/*Dealing with the epl part of the transfer term*/
+ 			transfer=GetHydrologyPVectorTransfer(basalelement,gauss,sed_head_input,epl_head_input,thick_input,base_input);
+-			scalar = Jdet*gauss->weight*((water_head*epl_specificstoring*epl_thickness)+(transfer*dt));
++			scalar = Jdet*gauss->weight*((water_head*epl_specificstoring*epl_thickness)+(transfer));
+ 			for(int i=0;i<numnodes;i++)pe->values[i]+=scalar*basis[i];
+ 		}
+ 	}
+@@ -421,15 +422,17 @@
+ 		element->FindParam(&leakage,HydrologydcLeakageFactorEnum);
+ 		
+ 		if(epl_head>sediment_head){  
+-			if(sediment_head>=hmax){
+-				transfer=0.0;
+-			}
+-			else{
+-				transfer=(leakage);
+-			}
++			/* if(sediment_head>=hmax){ */
++			/* 	transfer=0.0; */
++			/* } */
++			/* else{ */
++			/* 	transfer=(leakage); */
++			/* } */
++			transfer=leakage*(1/(1+exp(-20.0*(hmax-sediment_head))));
+ 		}
+-		else{ 
++		else{
+ 			transfer=(leakage);
++			
+ 		}
+ 		break;
+ 	default:
+@@ -468,20 +471,22 @@
+ 		element->FindParam(&leakage,HydrologydcLeakageFactorEnum);
+ 
+  		if(epl_head>sediment_head){  
+-			if(sediment_head>=hmax){
+-				transfer=0.0;
+-			}
+-			else{
+-				transfer=(sediment_head*leakage);
+-			}
++			/* if(sediment_head>=hmax){ */
++			/* 	transfer=0.0; */
++			/* } */
++			/* else{ */
++			/* 	transfer=(sediment_head*leakage); */
++			/* } */
++			transfer=sediment_head*leakage*(1/(1+exp(-20.0*(hmax-sediment_head))));
+ 		}
+-		else{ 
++		else{
+ 			transfer=(sediment_head*leakage);
+ 		}
+ 		break;
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
+ 	}
++
+ 	return transfer;
+ }/*}}}*/
+ 
+@@ -670,7 +675,9 @@
+ 		}
+ 		/*Increase of the efficient system is needed if the epl head reach the maximum value (sediment max value for now)*/
+ 		GetHydrologyDCInefficientHmax(&h_max,basalelement,basalelement->nodes[i]);
++
+ 		if(eplhead[i]>=h_max && active_element){
++
+ 			for(j=0;j<numnodes;j++){
+ 				if(old_active[j]>0.){
+ 					vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18688)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18689)
+@@ -240,7 +240,7 @@
+ 				if(active_element){
+ 					transfer=GetHydrologyKMatrixTransfer(basalelement,gauss,sed_head_input,epl_head_input,thick_input,base_input);
+ 					basalelement->NodalFunctions(&basis[0],gauss);
+-					D_scalar=transfer*gauss->weight*Jdet*dt;
++					D_scalar=transfer*gauss->weight*Jdet;
+ 					TripleMultiply(basis,numnodes,1,0,
+ 												 &D_scalar,1,1,0,
+ 												 basis,1,numnodes,0,
+@@ -344,7 +344,7 @@
+ 				else{
+ 					transfer=0.0;
+ 				}
+-				scalar = Jdet*gauss->weight*((water_head*sediment_storing)+(dt*transfer));
++				scalar = Jdet*gauss->weight*((water_head*sediment_storing)+(transfer));
+ 				for(int i=0;i<numnodes;i++)pe->values[i]+=scalar*basis[i];
+ 			}
+ 			else{
+@@ -595,14 +595,15 @@
+ 		hmax=GetHydrologyDCInefficientHmax(element, gauss, thick_input, base_input);
+ 		
+ 		if(epl_head>sediment_head){  
+-			if(sediment_head>=hmax){
+-				transfer=0.0;
+-			}
+-			else{
+-				transfer=(leakage);
+-			}
++			/* if(sediment_head>=hmax){ */
++			/* 	transfer=0.0; */
++			/* } */
++			/* else{ */
++			/* 	transfer=(leakage); */
++			/* } */
++			transfer=leakage*(1/(1+exp(-20.0*(hmax-sediment_head))));
+ 		}
+-		else{ 
++		else{
+ 			transfer=(leakage);
+ 		}		
+ 		break;
+@@ -638,14 +639,15 @@
+ 		hmax=GetHydrologyDCInefficientHmax(element, gauss, thick_input, base_input);
+ 		
+ 		if(epl_head>sediment_head){  
+-			if(sediment_head>=hmax){
+-				transfer=0.0;
+-			}
+-			else{
+-				transfer=(epl_head*leakage);
+-			}
++			/* if(sediment_head>=hmax){ */
++			/* 	transfer=0.0; */
++			/* } */
++			/* else{ */
++			/* 	transfer=(epl_head*leakage); */
++			/* } */
++			transfer=epl_head*leakage*(1/(1+exp(-20.0*(hmax-sediment_head))));
+ 		}
+-		else{ 
++		else{
+ 			transfer=(epl_head*leakage);
+ 		}
+ 		break;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18689-18690.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18689-18690.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18689-18690.diff	(revision 19102)
@@ -0,0 +1,64 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh	(revision 0)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh	(revision 18690)
+@@ -0,0 +1,52 @@
++#!/bin/bash
++set -eu
++
++#WARNING: make sure you have the right mpi:
++#mpi-selector --query
++#default:openmpi_intel-1.5.4_psm
++
++#Some cleanup
++rm -rf install petsc-3.5.2 src
++mkdir install src
++
++#Download from ISSM server
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
++
++#Untar and move petsc to install directory
++tar -zxvf  petsc-3.5.2.tar.gz
++mv petsc-3.5.2/* src/
++rm -rf petsc-3.5.2
++
++#configure
++cd src
++./config/configure.py \
++ --prefix="$ISSM_DIR/externalpackages/petsc/install" \
++ --PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
++ --with-mpi-dir="/opt/mpich2/gnu/" \
++ --known-mpi-shared-libraries=1 \
++ --with-debugging=0 \
++ --with-valgrind=0 \
++ --with-x=0 \
++ --with-ssl=0 \
++ --with-batch=1  \
++ --with-shared-libraries=1 \
++ --download-metis=1 \
++ --download-parmetis=1 \
++ --download-scalapack=1 \
++ --download-fblaslapack=1 \
++ --download-mumps=1 
++
++#prepare script to reconfigure petsc
++cat > script.queue << EOF
++#!/bin/bash
++#$ -N PETSC
++#$ -q free*,pub64
++
++cd $(echo $ISSM_DIR)/externalpackages/petsc/src/
++mpiexec -np 1 ./conftest-arch-linux2-c-opt
++EOF
++
++#print instructions
++echo "== Now: cd src/ "
++echo "== qsub script.queue "
++echo "== Then run reconfigure script generated by PETSc and follow instructions"
+
+Property changes on: ../trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18690-18691.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18690-18691.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18690-18691.diff	(revision 19102)
@@ -0,0 +1,22 @@
+Index: ../trunk-jpl/jenkins/imac-012301-gil
+===================================================================
+--- ../trunk-jpl/jenkins/imac-012301-gil	(revision 18690)
++++ ../trunk-jpl/jenkins/imac-012301-gil	(revision 18691)
+@@ -13,7 +13,6 @@
+ 	--with-scalapack-dir=$ISSM_DIR/externalpackages/petsc/install/ \
+ 	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-metis-dir=$ISSM_DIR/externalpackages/petsc/install \
+-	--with-tao-dir=$ISSM_DIR/externalpackages/tao/install \
+ 	--with-m1qn3-dir=$ISSM_DIR/externalpackages/m1qn3/install \
+ 	--with-numthreads=8 \
+ 	--enable-debugging \
+@@ -50,8 +49,7 @@
+ 						mpich     install-3.0-macosx64.sh    
+ 						cmake     install.sh                
+ 						m1qn3     install.sh    
+-						petsc     install-3.4-macosx64.sh    
+-						tao       install-2.2.sh
++						petsc     install-3.5-macosx64.sh    
+ 						triangle  install-macosx64.sh 
+ 						shell2junit  install.sh "
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18691-18692.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18691-18692.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18691-18692.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh	(revision 18691)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh	(revision 18692)
+@@ -22,7 +22,7 @@
+ ./config/configure.py \
+  --prefix="$ISSM_DIR/externalpackages/petsc/install" \
+  --PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
+- --with-mpi-dir="/opt/mpich2/gnu/" \
++ --with-mpi-dir="/data/apps/mpi/mpich-3.0.4/gcc-4.8.3/"
+  --known-mpi-shared-libraries=1 \
+  --with-debugging=0 \
+  --with-valgrind=0 \
Index: /issm/oecreview/Archive/18296-19100/ISSM-18692-18693.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18692-18693.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18692-18693.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh	(revision 18692)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh	(revision 18693)
+@@ -22,7 +22,7 @@
+ ./config/configure.py \
+  --prefix="$ISSM_DIR/externalpackages/petsc/install" \
+  --PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
+- --with-mpi-dir="/data/apps/mpi/mpich-3.0.4/gcc-4.8.3/"
++ --with-mpi-dir="/data/apps/mpi/mpich-3.0.4/gcc-4.8.3/" \
+  --known-mpi-shared-libraries=1 \
+  --with-debugging=0 \
+  --with-valgrind=0 \
Index: /issm/oecreview/Archive/18296-19100/ISSM-18693-18694.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18693-18694.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18693-18694.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh	(revision 18693)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh	(revision 18694)
+@@ -22,7 +22,7 @@
+ ./config/configure.py \
+  --prefix="$ISSM_DIR/externalpackages/petsc/install" \
+  --PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
+- --with-mpi-dir="/data/apps/mpi/mpich-3.0.4/gcc-4.8.3/" \
++ --with-mpi-dir="/data/apps/mpi/openmpi-1.6.0/gcc/4.7.3/" \
+  --known-mpi-shared-libraries=1 \
+  --with-debugging=0 \
+  --with-valgrind=0 \
Index: /issm/oecreview/Archive/18296-19100/ISSM-18694-18695.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18694-18695.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18694-18695.diff	(revision 19102)
@@ -0,0 +1,167 @@
+Index: ../trunk-jpl/src/m/classes/clusters/hpc.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/hpc.m	(revision 0)
++++ ../trunk-jpl/src/m/classes/clusters/hpc.m	(revision 18695)
+@@ -0,0 +1,162 @@
++%PFE class definition
++%
++%   Usage:
++%      cluster=hpc();
++%      cluster=hpc('np',3);
++%      cluster=hpc('np',3,'login','username');
++
++classdef hpc
++    properties (SetAccess=public)  
++		 % {{{
++		 name='hpc.oit.uci.edu'
++		 login='';
++		 numnodes=1;
++		 cpuspernode=4; 
++		 port=0;
++		 queue='pub64';
++		 codepath='';
++		 executionpath='';
++		 interactive=0;
++	 end
++	 properties (SetAccess=private) 
++		 np=20*8;
++		 % }}}
++	 end
++	 methods
++		 function cluster=hpc(varargin) % {{{
++
++			 %initialize cluster using default settings if provided
++			 if (exist('hpc_settings')==2), hpc_settings; end
++
++			 %use provided options to change fields
++			 cluster=AssignObjectFields(pairoptions(varargin{:}),cluster);
++		 end
++		 %}}}
++		 function disp(cluster) % {{{
++			 %  display the object
++			 disp(sprintf('class ''%s'' object ''%s'' = ',class(cluster),inputname(1)));
++			 disp(sprintf('    name: %s',cluster.name));
++			 disp(sprintf('    login: %s',cluster.login));
++			 disp(sprintf('    port: %i',cluster.port));
++			 disp(sprintf('    numnodes: %i',cluster.numnodes));
++			 disp(sprintf('    cpuspernode: %i',cluster.cpuspernode));
++			 disp(sprintf('    np: %i',cluster.cpuspernode*cluster.numnodes));
++			 disp(sprintf('    queue: %s',cluster.queue));
++			 disp(sprintf('    codepath: %s',cluster.codepath));
++			 disp(sprintf('    executionpath: %s',cluster.executionpath));
++			 disp(sprintf('    interactive: %i',cluster.interactive));
++		 end
++		 %}}}
++		 function md = checkconsistency(cluster,md,solution,analyses) % {{{
++
++			 available_queues={'pub64','free64','free48'};
++			 queue_requirements_time=[Inf Inf Inf Inf];
++			 queue_requirements_np=[64 64 48];
++
++			 QueueRequirements(available_queues,queue_requirements_time,queue_requirements_np,cluster.queue,cluster.np,1)
++
++			 %Miscelaneous
++			 if isempty(cluster.login), md = checkmessage(md,'login empty'); end
++			 if isempty(cluster.codepath), md = checkmessage(md,'codepath empty'); end
++			 if isempty(cluster.executionpath), md = checkmessage(md,'executionpath empty'); end
++
++		 end
++		 %}}}
++		 function BuildKrigingQueueScript(cluster,modelname,solution,io_gather,isvalgrind,isgprof) % {{{
++
++			 if(isvalgrind), disp('valgrind not supported by cluster, ignoring...'); end
++			 if(isgprof),    disp('gprof not supported by cluster, ignoring...'); end
++
++			 %compute number of processors
++			 cluster.np=cluster.numnodes*cluster.cpuspernode;
++
++			 %write queuing script 
++			 fid=fopen([modelname '.queue'],'w');
++			 fprintf(fid,'#!/bin/bash\n');
++			 fprintf(fid,'#$ -N %s\n',modelname);
++			 fprintf(fid,'#$ -q %s \n',cluster.queue);
++			 fprintf(fid,'#$ -pe one-node-mpi 2-64\n');
++			 fprintf(fid,'#$ -R y\n');
++			 fprintf(fid,'#$ -m beas\n');
++			 fprintf(fid,'#$ -o %s.outlog \n',modelname);
++			 fprintf(fid,'#$ -e %s.errlog \n\n',modelname);
++			 fprintf(fid,'export ISSM_DIR="%s/../"\n',cluster.codepath); %FIXME
++			 fprintf(fid,'source $ISSM_DIR/etc/environment.sh\n');       %FIXME
++			 fprintf(fid,'cd %s/%s\n\n',cluster.executionpath,modelname);
++			 fprintf(fid,'mpiexec -np %i %s/kriging.exe %s %s\n',cluster.np,cluster.codepath,[cluster.executionpath '/' modelname],modelname);
++			 if ~io_gather, %concatenate the output files:
++				 fprintf(fid,'cat %s.outbin.* > %s.outbin',modelname,modelname);
++			 end
++			 fclose(fid);
++		 end
++		 %}}}
++		 function BuildQueueScript(cluster,dirname,modelname,solution,io_gather,isvalgrind,isgprof) % {{{
++
++			 if(isvalgrind), disp('valgrind not supported by cluster, ignoring...'); end
++			 if(isgprof),    disp('gprof not supported by cluster, ignoring...'); end
++
++			 %compute number of processors
++			 cluster.np=cluster.numnodes*cluster.cpuspernode;
++
++			 %write queuing script 
++			 fid=fopen([modelname '.queue'],'w');
++			 fprintf(fid,'#!/bin/bash\n');
++			 fprintf(fid,'#$ -N %s\n',modelname);
++			 fprintf(fid,'#$ -q %s \n',cluster.queue);
++			 fprintf(fid,'#$ -pe one-node-mpi 2-64\n');
++			 fprintf(fid,'#$ -R y\n');
++			 fprintf(fid,'#$ -m beas\n');
++			 fprintf(fid,'#$ -o %s.outlog \n',modelname);
++			 fprintf(fid,'#$ -e %s.errlog \n\n',modelname);
++			 fprintf(fid,'export ISSM_DIR="%s/../"\n',cluster.codepath); %FIXME
++			 fprintf(fid,'source $ISSM_DIR/etc/environment.sh\n');       %FIXME
++			 fprintf(fid,'cd %s/%s\n\n',cluster.executionpath,dirname);
++			 fprintf(fid,'mpiexec -np %i %s/issm.exe %s %s %s\n',cluster.np,cluster.codepath,EnumToString(solution),[cluster.executionpath '/' dirname],modelname);
++			 if ~io_gather, %concatenate the output files:
++				 fprintf(fid,'cat %s.outbin.* > %s.outbin',modelname,modelname);
++			 end
++			 fclose(fid);
++
++			 %in interactive mode, create a run file, and errlog and outlog file
++			 if cluster.interactive,
++				 fid=fopen([modelname '.run'],'w');
++				 fprintf(fid,'mpiexec -np %i %s/issm.exe %s %s %s\n',cluster.np,cluster.codepath,EnumToString(solution),[cluster.executionpath '/' dirname],modelname);
++				 if ~io_gather, %concatenate the output files:
++					 fprintf(fid,'cat %s.outbin.* > %s.outbin',modelname,modelname);
++				 end
++				 fclose(fid);
++				 fid=fopen([modelname '.errlog'],'w');
++				 fclose(fid);
++				 fid=fopen([modelname '.outlog'],'w');
++				 fclose(fid);
++			 end
++		 end %}}}
++		 function LaunchQueueJob(cluster,modelname,dirname,filelist)% {{{
++
++			 %compress the files into one zip.
++			 compressstring=['tar -zcf ' dirname '.tar.gz '];
++			 for i=1:numel(filelist),
++				 compressstring = [compressstring ' ' filelist{i}];
++			 end
++			 if cluster.interactive,
++				 compressstring = [compressstring ' ' modelname '.errlog ' modelname '.outlog '];
++			 end
++			 system(compressstring);
++
++			 disp('uploading input file and queueing script');
++			 issmscpout(cluster.name,cluster.executionpath,cluster.login,cluster.port,{[dirname '.tar.gz']});
++
++			 disp('launching solution sequence on remote cluster');
++			  launchcommand=['cd ' cluster.executionpath ' && rm -rf ./' dirname ' && mkdir ' dirname ...
++											 ' && cd ' dirname ' && mv ../' dirname '.tar.gz ./ && tar -zxf ' dirname '.tar.gz  && hostname && qsub ' modelname '.queue '];
++			 issmssh(cluster.name,cluster.login,cluster.port,launchcommand);
++		 end %}}}
++		 function Download(cluster,dirname,filelist)% {{{
++
++			 %copy files from cluster to current directory
++			 directory=[cluster.executionpath '/' dirname '/'];
++			 issmscpin(cluster.name,cluster.login,cluster.port,directory,filelist);
++
++		 end %}}}
++	end
++end
Index: /issm/oecreview/Archive/18296-19100/ISSM-18695-18696.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18695-18696.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18695-18696.diff	(revision 19102)
@@ -0,0 +1,23 @@
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18695)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18696)
+@@ -1002,14 +1002,10 @@
+ 				// cold, dry base: apply basal surface forcing
+ 				for(i=0;i<3;i++) vec_heatflux[i]=0.;
+ 				break;
+-			case 1:
+-				// cold, wet base: keep at pressure melting point 
+-			case 2:
+-				// temperate, thin refreezing base: release spc
+-
+-			case 3:
+-				// temperate, thin melting base: set spc
+-				enthalpies[vertexdown]=element->PureIceEnthalpy(pressures[vertexdown]); 
++			case 1: case 2: case 3: 
++				// case 1 : cold, wet base: keep at pressure melting point 
++				// case 2: temperate, thin refreezing base: release spc
++				// case 3: temperate, thin melting base: set spc
+ 				enthalpy_input->GetInputDerivativeValue(&d1enthalpy[0],xyz_list,gauss);
+ 				for(i=0;i<3;i++) vec_heatflux[i]=-kappa*d1enthalpy[i];
+ 				break;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18696-18697.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18696-18697.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18696-18697.diff	(revision 19102)
@@ -0,0 +1,22 @@
+Index: ../trunk-jpl/jenkins/imac-012301-gil
+===================================================================
+--- ../trunk-jpl/jenkins/imac-012301-gil	(revision 18696)
++++ ../trunk-jpl/jenkins/imac-012301-gil	(revision 18697)
+@@ -14,6 +14,7 @@
+ 	--with-mumps-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-metis-dir=$ISSM_DIR/externalpackages/petsc/install \
+ 	--with-m1qn3-dir=$ISSM_DIR/externalpackages/m1qn3/install \
++	--with-tao-dir=$ISSM_DIR/externalpackages/tao/install \
+ 	--with-numthreads=8 \
+ 	--enable-debugging \
+ 	--enable-development'
+@@ -49,7 +50,8 @@
+ 						mpich     install-3.0-macosx64.sh    
+ 						cmake     install.sh                
+ 						m1qn3     install.sh    
+-						petsc     install-3.5-macosx64.sh    
++						petsc     install-3.4-macosx64.sh
++						tao       install.sh 
+ 						triangle  install-macosx64.sh 
+ 						shell2junit  install.sh "
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18697-18698.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18697-18698.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18697-18698.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/jenkins/imac-012301-gil
+===================================================================
+--- ../trunk-jpl/jenkins/imac-012301-gil	(revision 18697)
++++ ../trunk-jpl/jenkins/imac-012301-gil	(revision 18698)
+@@ -51,7 +51,7 @@
+ 						cmake     install.sh                
+ 						m1qn3     install.sh    
+ 						petsc     install-3.4-macosx64.sh
+-						tao       install.sh 
++						tao       install-2.2.sh
+ 						triangle  install-macosx64.sh 
+ 						shell2junit  install.sh "
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18698-18699.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18698-18699.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18698-18699.diff	(revision 19102)
@@ -0,0 +1,293 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Element.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18698)
++++ ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18699)
+@@ -219,6 +219,8 @@
+ 		virtual void   ComputeStressTensor(void)=0;
+ 		virtual void   ComputeDeviatoricStressTensor(void)=0;
+ 		virtual void	StressIntensityFactor(void)=0;
++		virtual void	StrainRateparallel(void)=0;
++		virtual void   StrainRateperpendicular(void)=0;
+ 
+ 		virtual void   Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finite_element)=0;
+ 		virtual void   InputExtrude(int input_enum,int start)=0;
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18698)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18699)
+@@ -275,6 +275,95 @@
+ 	delete gauss;
+ }
+ /*}}}*/
++void       Tria::StrainRateperpendicular(){/*{{{*/
++
++	IssmDouble  xyz_list[NUMVERTICES][3];
++	GaussPenta* gauss=NULL;
++	IssmDouble  vx,vy,vel;
++	IssmDouble  strainxx;
++	IssmDouble  strainxy;
++	IssmDouble  strainyy;
++	IssmDouble  strainperpendicular[NUMVERTICES];
++
++	/* Get node coordinates and dof list: */
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++
++	/*Retrieve all inputs we will need*/
++	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
++	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
++	Input* strainxx_input=inputs->GetInput(StrainRatexxEnum);             _assert_(strainxx_input);
++	Input* strainxy_input=inputs->GetInput(StrainRatexyEnum);             _assert_(strainxy_input);
++	Input* strainyy_input=inputs->GetInput(StrainRateyyEnum);             _assert_(strainyy_input);
++
++
++	/* Start looping on the number of vertices: */
++	gauss=new GaussPenta();
++	for (int iv=0;iv<NUMVERTICES;iv++){
++		gauss->GaussVertex(iv);
++
++		/* Get the value we need*/
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		vel=vx*vx+vy*vy;
++		strainxx_input->GetInputValue(&strainxx,gauss);
++		strainxy_input->GetInputValue(&strainxy,gauss);
++		strainyy_input->GetInputValue(&strainyy,gauss);
++
++		/*strainperpendicular= Strain rate perpendicular to the ice flow direction */
++		strainperpendicular[iv]=(vx*vx*(strainyy)+vy*vy*(strainxx)-2*vy*vx*strainxy)/(vel+1.e-6);
++	}
++
++	/*Add input*/
++	this->inputs->AddInput(new PentaInput(StrainRateperpendicularEnum,&strainperpendicular[0],P1Enum));
++
++	/*Clean up and return*/
++	delete gauss;
++}
++/*}}}*/
++void       Tria::StrainRateparallel(){/*{{{*/
++
++	IssmDouble  xyz_list[NUMVERTICES][3];
++	GaussPenta* gauss=NULL;
++	IssmDouble  vx,vy,vel;
++	IssmDouble  strainxx;
++	IssmDouble  strainxy;
++	IssmDouble  strainyy;
++	IssmDouble  strainparallel[NUMVERTICES];
++
++	/* Get node coordinates and dof list: */
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++	
++	/*Retrieve all inputs we will need*/
++	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
++	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
++	Input* strainxx_input=inputs->GetInput(StrainRatexxEnum);             _assert_(strainxx_input);
++	Input* strainxy_input=inputs->GetInput(StrainRatexyEnum);             _assert_(strainxy_input);
++	Input* strainyy_input=inputs->GetInput(StrainRateyyEnum);             _assert_(strainyy_input);
++
++	/* Start looping on the number of vertices: */
++	gauss=new GaussPenta();
++	for (int iv=0;iv<NUMVERTICES;iv++){
++		gauss->GaussVertex(iv);
++
++		/* Get the value we need*/
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		vel=vx*vx+vy*vy;
++		strainxx_input->GetInputValue(&strainxx,gauss);
++		strainxy_input->GetInputValue(&strainxy,gauss);
++		strainyy_input->GetInputValue(&strainyy,gauss);
++
++		/*strainparallel= Strain rate along the ice flow direction */
++		strainparallel[iv]=(vx*vx*(strainxx)+vy*vy*(strainyy)+2*vy*vx*strainxy)/(vel+1.e-6);
++	}
++
++	/*Add input*/
++	this->inputs->AddInput(new PentaInput(StrainRateparallelEnum,&strainparallel[0],P1Enum));
++
++	/*Clean up and return*/
++	delete gauss;
++}
++/*}}}*/
+ void       Tria::ComputeDeviatoricStressTensor(){/*{{{*/
+ 
+ 	IssmDouble  xyz_list[NUMVERTICES][3];
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18698)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18699)
+@@ -56,6 +56,8 @@
+ 		void        ComputeDeviatoricStressTensor();
+ 		void        ComputeSurfaceNormalVelocity();
+ 		void        StressIntensityFactor(void){_error_("not implemented yet");};
++		void			StrainRateparallel();
++		void			StrainRateperpendicular();
+ 		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters);
+ 		void        SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters);
+ 		void        ResetHooks();
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18698)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18699)
+@@ -423,6 +423,95 @@
+ 	this->InputExtrude(StressIntensityFactorEnum,-1);
+ }
+ /*}}}*/
++void       Penta::StrainRateparallel(){/*{{{*/
++
++	IssmDouble  xyz_list[NUMVERTICES][3];
++	GaussPenta* gauss=NULL;
++	IssmDouble  vx,vy,vel;
++	IssmDouble  strainxx;
++	IssmDouble  strainxy;
++	IssmDouble  strainyy;
++	IssmDouble  strainparallel[NUMVERTICES];
++
++	/* Get node coordinates and dof list: */
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++	
++	/*Retrieve all inputs we will need*/
++	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
++	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
++	Input* strainxx_input=inputs->GetInput(StrainRatexxEnum);             _assert_(strainxx_input);
++	Input* strainxy_input=inputs->GetInput(StrainRatexyEnum);             _assert_(strainxy_input);
++	Input* strainyy_input=inputs->GetInput(StrainRateyyEnum);             _assert_(strainyy_input);
++
++	/* Start looping on the number of vertices: */
++	gauss=new GaussPenta();
++	for (int iv=0;iv<NUMVERTICES;iv++){
++		gauss->GaussVertex(iv);
++
++		/* Get the value we need*/
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		vel=vx*vx+vy*vy;
++		strainxx_input->GetInputValue(&strainxx,gauss);
++		strainxy_input->GetInputValue(&strainxy,gauss);
++		strainyy_input->GetInputValue(&strainyy,gauss);
++
++		/*strainparallel= Strain rate along the ice flow direction */
++		strainparallel[iv]=(vx*vx*(strainxx)+vy*vy*(strainyy)+2*vy*vx*strainxy)/(vel+1.e-6);
++	}
++
++	/*Add input*/
++	this->inputs->AddInput(new PentaInput(StrainRateparallelEnum,&strainparallel[0],P1Enum));
++
++	/*Clean up and return*/
++	delete gauss;
++}
++/*}}}*/
++void       Penta::StrainRateperpendicular(){/*{{{*/
++
++	IssmDouble  xyz_list[NUMVERTICES][3];
++	GaussPenta* gauss=NULL;
++	IssmDouble  vx,vy,vel;
++	IssmDouble  strainxx;
++	IssmDouble  strainxy;
++	IssmDouble  strainyy;
++	IssmDouble  strainperpendicular[NUMVERTICES];
++
++	/* Get node coordinates and dof list: */
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++
++	/*Retrieve all inputs we will need*/
++	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
++	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
++	Input* strainxx_input=inputs->GetInput(StrainRatexxEnum);             _assert_(strainxx_input);
++	Input* strainxy_input=inputs->GetInput(StrainRatexyEnum);             _assert_(strainxy_input);
++	Input* strainyy_input=inputs->GetInput(StrainRateyyEnum);             _assert_(strainyy_input);
++
++
++	/* Start looping on the number of vertices: */
++	gauss=new GaussPenta();
++	for (int iv=0;iv<NUMVERTICES;iv++){
++		gauss->GaussVertex(iv);
++
++		/* Get the value we need*/
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		vel=vx*vx+vy*vy;
++		strainxx_input->GetInputValue(&strainxx,gauss);
++		strainxy_input->GetInputValue(&strainxy,gauss);
++		strainyy_input->GetInputValue(&strainyy,gauss);
++
++		/*strainperpendicular= Strain rate perpendicular to the ice flow direction */
++		strainperpendicular[iv]=(vx*vx*(strainyy)+vy*vy*(strainxx)-2*vy*vx*strainxy)/(vel+1.e-6);
++	}
++
++	/*Add input*/
++	this->inputs->AddInput(new PentaInput(StrainRateperpendicularEnum,&strainperpendicular[0],P1Enum));
++
++	/*Clean up and return*/
++	delete gauss;
++}
++/*}}}*/
+ void       Penta::Configure(Elements* elementsin, Loads* loadsin, Nodes* nodesin,Vertices* verticesin, Materials* materialsin, Parameters* parametersin){/*{{{*/
+ 
+ 	int analysis_counter;
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18698)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18699)
+@@ -57,6 +57,8 @@
+ 		void   ComputeStressTensor();
+ 		void   ComputeDeviatoricStressTensor();
+ 		void   StressIntensityFactor();
++		void   StrainRateparallel();
++		void   StrainRateperpendicular();
+ 		void   Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
+ 		void   ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz);
+ 		int    FiniteElement(void);
+Index: ../trunk-jpl/src/c/classes/Elements/Seg.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18698)
++++ ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18699)
+@@ -57,6 +57,8 @@
+ 		void        ComputeStressTensor(){_error_("not implemented yet");};
+ 		void        ComputeDeviatoricStressTensor(){_error_("not implemented yet");};
+ 		void        StressIntensityFactor(void){_error_("not implemented yet");};
++		void			StrainRateparallel(void){_error_("not implemented yet");};
++		void			StrainRateperpendicular(void){_error_("not implemented yet");};
+ 		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters){_error_("not implemented yet");};
+ 		void        SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters){_error_("not implemented yet");};
+ 		void        ResetHooks(){_error_("not implemented yet");};
+Index: ../trunk-jpl/src/c/classes/Elements/Tetra.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18698)
++++ ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18699)
+@@ -57,6 +57,8 @@
+ 		void        ComputeStressTensor(){_error_("not implemented yet");};
+ 		void        ComputeDeviatoricStressTensor(){_error_("not implemented yet");};
+ 		void        StressIntensityFactor(void){_error_("not implemented yet");};
++		void        StrainRateparallel(void){_error_("not implemented yet");};
++		void        StrainRateperpendicular(void){_error_("not implemented yet");};
+ 		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters);
+ 		void        SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters);
+ 		void        ResetHooks();
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18698)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18699)
+@@ -1105,6 +1105,8 @@
+ 				name==SedimentHeadOldEnum ||
+ 				name==EplHeadOldEnum ||
+ 				name==StressIntensityFactorEnum ||
++				name==StrainRateparallelEnum ||
++				name==StrainRateperpendicularEnum ||
+ 				name==HydrologydcEplThicknessOldEnum ||
+ 				name==HydrologydcEplInitialThicknessEnum ||
+ 				name==HydrologydcEplThicknessEnum ||
+@@ -1207,6 +1209,14 @@
+ 				this->StressIntensityFactor();
+ 				input=this->inputs->GetInput(output_enum);
+ 				break;
++			case StrainRateparallelEnum:
++				this->StrainRateparallel();
++				input=this->inputs->GetInput(output_enum);
++				break;
++			case StrainRateperpendicularEnum:
++				this->StrainRateperpendicular();
++				input=this->inputs->GetInput(output_enum);
++				break;
+ 			default:
+ 				_error_("input "<<EnumToStringx(output_enum)<<" not found in element");
+ 		}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18699-18700.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18699-18700.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18699-18700.diff	(revision 19102)
@@ -0,0 +1,16 @@
+Index: ../trunk-jpl/test/Archives/Archive432.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive325.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive436.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive431.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
Index: /issm/oecreview/Archive/18296-19100/ISSM-18700-18701.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18700-18701.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18700-18701.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/test/NightlyRun/test432.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test432.m	(revision 18700)
++++ ../trunk-jpl/test/NightlyRun/test432.m	(revision 18701)
+@@ -12,7 +12,7 @@
+ 
+ %Fields and tolerances to track changes
+ field_names     ={'Vx','Vy','Vz','Vel','Pressure','Temperature','Water fraction','Enthalpy'};
+-field_tolerances={2e-09,1e-09,1e-09,1e-09,1e-13,1e-10,1e-10,2e-10};
++field_tolerances={2e-09,1e-09,1e-09,1e-09,1e-13,1e-10,3e-10,3e-10};
+ field_values={...
+ 	(md.results.SteadystateSolution.Vx),...
+ 	(md.results.SteadystateSolution.Vy),...
Index: /issm/oecreview/Archive/18296-19100/ISSM-18701-18702.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18701-18702.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18701-18702.diff	(revision 19102)
@@ -0,0 +1,17 @@
+Index: ../trunk-jpl/src/m/classes/clusters/hpc.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/hpc.m	(revision 18701)
++++ ../trunk-jpl/src/m/classes/clusters/hpc.m	(revision 18702)
+@@ -49,9 +49,9 @@
+ 		 %}}}
+ 		 function md = checkconsistency(cluster,md,solution,analyses) % {{{
+ 
+-			 available_queues={'pub64','free64','free48'};
+-			 queue_requirements_time=[Inf Inf Inf Inf];
+-			 queue_requirements_np=[64 64 48];
++			 available_queues={'pub64','free64','free48','free*,pub64','free*'};
++			 queue_requirements_time=[Inf Inf Inf Inf Inf];
++			 queue_requirements_np=[64 64 48 48 48];
+ 
+ 			 QueueRequirements(available_queues,queue_requirements_time,queue_requirements_np,cluster.queue,cluster.np,1)
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18702-18703.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18702-18703.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18702-18703.diff	(revision 19102)
@@ -0,0 +1,40 @@
+Index: ../trunk-jpl/src/m/classes/clusters/discover.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/discover.m	(revision 18702)
++++ ../trunk-jpl/src/m/classes/clusters/discover.m	(revision 18703)
+@@ -63,20 +63,17 @@
+ 
+ 			 QueueRequirements(available_queues,queue_requirements_time,queue_requirements_np,cluster.queue,cluster.np,cluster.time)
+ 
+-			 if ( strcmpi(cluster.queue,'general') & cluster.cpuspernode*cluster.numnodes < 17)
+-				 md = checkmessage(md,'cpus must be greater than 17 for general queue');
+-			 end
+ 			 %now, check cluster.cpuspernode according to processor type
+-			 if ( strcmpi(cluster.processor,'neha')),
+-				 if ((cluster.cpuspernode>8 ) | (cluster.cpuspernode<1)),
+-					 md = checkmessage(md,'cpuspernode should be between 1 and 8 for ''neha'' processors');
++			 if ( strcmpi(cluster.processor,'sand')),
++				 if ((cluster.cpuspernode>16 ) | (cluster.cpuspernode<1)),
++					 md = checkmessage(md,'cpuspernode should be between 1 and 16 for ''sand'' processors');
+ 				 end
+ 			 elseif strcmpi(cluster.processor,'west'),
+ 				 if ((cluster.cpuspernode>12 ) | (cluster.cpuspernode<1)),
+ 					 md = checkmessage(md,'cpuspernode should be between 1 and 12 for ''west'' processors');
+ 				 end
+ 			 else
+-				 md = checkmessage(md,'unknown processor type, should be ''neha'' or ''west'' ');
++				 md = checkmessage(md,'unknown processor type, should be ''sand'' or ''west'' ');
+ 			 end
+ 
+ 			 %Miscelaneous
+@@ -99,7 +96,9 @@
+ %			 fprintf(fid,'#PBS -N %s\n',modelname);
+ 			 fprintf(fid,'#PBS -l select=%i:mpiprocs=%i:proc=%s\n',cluster.numnodes,cluster.cpuspernode,cluster.processor);
+ 			 fprintf(fid,'#PBS -l walltime=%i:00\n',cluster.time); %SLURM walltime is in minutes:
+-			 fprintf(fid,'#PBS -q %s \n',cluster.queue);
++			 if ~strcmp(cluster.queue,'general'),
++				 fprintf(fid,'#PBS -q %s \n',cluster.queue);
++			 end
+ 			 fprintf(fid,'#PBS -W group_list=s1010\n');
+ 			 fprintf(fid,'#PBS -m e\n');
+ 			 fprintf(fid,'#PBS -o %s.outlog \n',[cluster.executionpath '/' dirname '/' modelname]);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18703-18704.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18703-18704.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18703-18704.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/test/NightlyRun/test340.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test340.m	(revision 18703)
++++ ../trunk-jpl/test/NightlyRun/test340.m	(revision 18704)
+@@ -21,7 +21,7 @@
+ 
+ %Fields and tolerances to track changes
+ field_names     ={'Gradient','Misfits','FrictionCoefficient','Pressure','Vel','Vx','Vy'};
+-field_tolerances={1e-08,1e-07,1e-10,1e-10,1e-09,1e-09,1e-09};
++field_tolerances={3e-08,1e-07,1e-10,1e-10,1e-09,1e-09,1e-09};
+ field_values={...
+ 	(md.results.StressbalanceSolution.Gradient1),...
+ 	(md.results.StressbalanceSolution.J),...
Index: /issm/oecreview/Archive/18296-19100/ISSM-18704-18705.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18704-18705.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18704-18705.diff	(revision 19102)
@@ -0,0 +1,270 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18704)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18705)
+@@ -688,6 +688,7 @@
+ 				}
+ 			}
+ 		}
++		
+ 	}
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 	xDelete<IssmDouble>(epl_thickness);
+@@ -730,7 +731,7 @@
+ 		}
+ 	}
+ 	else{
+-		/*Do not do anything: at least one node is active for this element but this element is not solved for*/
++		/*Do not do anything: at least one node was active for this element but this element is not solved for*/
+ 	}
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 	xDelete<IssmDouble>(active);
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h	(revision 18704)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h	(revision 18705)
+@@ -40,5 +40,6 @@
+ 		IssmDouble GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* thick_input, Input* base_input);
+ 		IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* thick_input, Input* base_input);
+ 		void ElementizeEplMask(FemModel* femmodel);
++		void ResetCounter(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18704)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18705)
+@@ -16,6 +16,7 @@
+ 	int         transfer_flag;
+ 	int         penalty_lock;
+ 	int         hydro_maxiter;
++	int         *elementactive_counter =NULL;
+ 	bool        isefficientlayer;
+ 	IssmDouble  sedimentlimit;
+ 	IssmDouble  penalty_factor;
+@@ -55,12 +56,18 @@
+ 	parameters->AddObject(new IntParam(HydrologydcPenaltyLockEnum,penalty_lock));
+ 	parameters->AddObject(new IntParam(HydrologydcMaxIterEnum,hydro_maxiter));
+ 
++	if(isefficientlayer==1){
++		elementactive_counter=xNewZeroInit<int>(iomodel->numberofelements);
++		parameters->AddObject(new IntVecParam(ElementActiveCounterEnum,elementactive_counter,iomodel->numberofelements));
++	}
++	
+ }/*}}}*/
+ void HydrologyDCInefficientAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	bool   isefficientlayer;
++	bool   element_active;
+ 	int    hydrology_model;
+-
++	
+ 	/*Fetch data needed: */
+ 	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
+ 
+@@ -92,7 +99,22 @@
+ 		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
+ 	}
+ 
+-	if(isefficientlayer)iomodel->FetchDataToInput(elements,HydrologydcMaskEplactiveNodeEnum);
++	if(isefficientlayer){
++		iomodel->FetchDataToInput(elements,HydrologydcMaskEplactiveNodeEnum);
++
++		for(int i=0;i<iomodel->numberofelements;i++){
++			Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
++			Input* node_mask_input = element->GetInput(HydrologydcMaskEplactiveNodeEnum); _assert_(node_mask_input);
++			
++			if(node_mask_input->Max()>0.) {
++				element_active = true;
++			}
++			else{
++				element_active = false;
++			}
++			element->AddInput(new BoolInput(HydrologydcMaskEplactiveEltEnum,element_active));
++		}
++	}
+ }/*}}}*/
+ void HydrologyDCInefficientAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 
+@@ -660,20 +682,46 @@
+ void HydrologyDCInefficientAnalysis::ElementizeEplMask(FemModel* femmodel){/*{{{*/
+ 
+ 	bool     element_active;
++	bool     old_active;
++	int      penalty_lock;
++	int*     elementactive_counter = NULL;
+ 	Element* element=NULL;
+ 
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+ 		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-
+-		int numvertices = element->GetNumberOfVertices();
+-		Input* node_mask_input = element->GetInput(HydrologydcMaskEplactiveNodeEnum);
++		element->parameters->FindParam(&elementactive_counter,NULL,ElementActiveCounterEnum);
++		element->parameters->FindParam(&penalty_lock,HydrologydcPenaltyLockEnum);
++		
++		Input* node_mask_input = element->GetInput(HydrologydcMaskEplactiveNodeEnum); _assert_(node_mask_input);
++		Input* old_active_input = element->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(old_active_input);
++		old_active_input->GetInputValue(&old_active);
++		
+ 		if(node_mask_input->Max()>0.) {
+ 			element_active = true;
+ 		}
+ 		else{
+ 			element_active = false;
+ 		}
++		if(old_active!=element_active){
++			elementactive_counter[i]=elementactive_counter[i]+1;
++		}
++		if(elementactive_counter[i]>penalty_lock){
++			element_active = true;
++		}
++		//		femmodel->parameters->SetParam(elementactive_counter,ElementActiveCounterEnum);
+ 		element->AddInput(new BoolInput(HydrologydcMaskEplactiveEltEnum,element_active));
+ 	}
+ }/*}}}*/
+ 
++void HydrologyDCInefficientAnalysis::ResetCounter(FemModel* femmodel){/*{{{*/
++
++	int*     elementactive_counter = NULL;
++	Element* element=NULL;
++	
++	for(int i=0;i<femmodel->elements->Size();i++){
++		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		element->parameters->FindParam(&elementactive_counter,NULL,ElementActiveCounterEnum);
++
++		elementactive_counter=0;
++	}
++}/*}}}*/
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18704)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18705)
+@@ -108,6 +108,7 @@
+ 	EplHeadOldEnum,
+ 	EplHeadSlopeXEnum,
+ 	EplHeadSlopeYEnum,
++	ElementActiveCounterEnum,
+ 	HydrologydcMaxIterEnum,
+ 	HydrologydcRelTolEnum,
+ 	HydrologydcSpcsedimentHeadEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18704)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18705)
+@@ -116,6 +116,7 @@
+ 		case EplHeadOldEnum : return "EplHeadOld";
+ 		case EplHeadSlopeXEnum : return "EplHeadSlopeX";
+ 		case EplHeadSlopeYEnum : return "EplHeadSlopeY";
++		case ElementActiveCounterEnum : return "ElementActiveCounter";
+ 		case HydrologydcMaxIterEnum : return "HydrologydcMaxIter";
+ 		case HydrologydcRelTolEnum : return "HydrologydcRelTol";
+ 		case HydrologydcSpcsedimentHeadEnum : return "HydrologydcSpcsedimentHead";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18704)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18705)
+@@ -116,6 +116,7 @@
+ 	      else if (strcmp(name,"EplHeadOld")==0) return EplHeadOldEnum;
+ 	      else if (strcmp(name,"EplHeadSlopeX")==0) return EplHeadSlopeXEnum;
+ 	      else if (strcmp(name,"EplHeadSlopeY")==0) return EplHeadSlopeYEnum;
++	      else if (strcmp(name,"ElementActiveCounter")==0) return ElementActiveCounterEnum;
+ 	      else if (strcmp(name,"HydrologydcMaxIter")==0) return HydrologydcMaxIterEnum;
+ 	      else if (strcmp(name,"HydrologydcRelTol")==0) return HydrologydcRelTolEnum;
+ 	      else if (strcmp(name,"HydrologydcSpcsedimentHead")==0) return HydrologydcSpcsedimentHeadEnum;
+@@ -135,11 +136,11 @@
+ 	      else if (strcmp(name,"HydrologydcEplThickness")==0) return HydrologydcEplThicknessEnum;
+ 	      else if (strcmp(name,"HydrologydcEplThicknessOld")==0) return HydrologydcEplThicknessOldEnum;
+ 	      else if (strcmp(name,"HydrologydcEplConductivity")==0) return HydrologydcEplConductivityEnum;
+-	      else if (strcmp(name,"HydrologydcIsefficientlayer")==0) return HydrologydcIsefficientlayerEnum;
+          else stage=2;
+    }
+    if(stage==2){
+-	      if (strcmp(name,"HydrologydcSedimentlimitFlag")==0) return HydrologydcSedimentlimitFlagEnum;
++	      if (strcmp(name,"HydrologydcIsefficientlayer")==0) return HydrologydcIsefficientlayerEnum;
++	      else if (strcmp(name,"HydrologydcSedimentlimitFlag")==0) return HydrologydcSedimentlimitFlagEnum;
+ 	      else if (strcmp(name,"HydrologydcSedimentlimit")==0) return HydrologydcSedimentlimitEnum;
+ 	      else if (strcmp(name,"HydrologydcTransferFlag")==0) return HydrologydcTransferFlagEnum;
+ 	      else if (strcmp(name,"HydrologydcLeakageFactor")==0) return HydrologydcLeakageFactorEnum;
+@@ -258,11 +259,11 @@
+ 	      else if (strcmp(name,"MasstransportPenaltyFactor")==0) return MasstransportPenaltyFactorEnum;
+ 	      else if (strcmp(name,"MasstransportSpcthickness")==0) return MasstransportSpcthicknessEnum;
+ 	      else if (strcmp(name,"MasstransportCalvingrate")==0) return MasstransportCalvingrateEnum;
+-	      else if (strcmp(name,"MasstransportStabilization")==0) return MasstransportStabilizationEnum;
+          else stage=3;
+    }
+    if(stage==3){
+-	      if (strcmp(name,"MasstransportVertexPairing")==0) return MasstransportVertexPairingEnum;
++	      if (strcmp(name,"MasstransportStabilization")==0) return MasstransportStabilizationEnum;
++	      else if (strcmp(name,"MasstransportVertexPairing")==0) return MasstransportVertexPairingEnum;
+ 	      else if (strcmp(name,"MasstransportNumRequestedOutputs")==0) return MasstransportNumRequestedOutputsEnum;
+ 	      else if (strcmp(name,"MasstransportRequestedOutputs")==0) return MasstransportRequestedOutputsEnum;
+ 	      else if (strcmp(name,"QmuIsdakota")==0) return QmuIsdakotaEnum;
+@@ -381,11 +382,11 @@
+ 	      else if (strcmp(name,"StressbalanceAnalysis")==0) return StressbalanceAnalysisEnum;
+ 	      else if (strcmp(name,"StressbalanceSIAAnalysis")==0) return StressbalanceSIAAnalysisEnum;
+ 	      else if (strcmp(name,"StressbalanceSolution")==0) return StressbalanceSolutionEnum;
+-	      else if (strcmp(name,"StressbalanceVerticalAnalysis")==0) return StressbalanceVerticalAnalysisEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"EnthalpyAnalysis")==0) return EnthalpyAnalysisEnum;
++	      if (strcmp(name,"StressbalanceVerticalAnalysis")==0) return StressbalanceVerticalAnalysisEnum;
++	      else if (strcmp(name,"EnthalpyAnalysis")==0) return EnthalpyAnalysisEnum;
+ 	      else if (strcmp(name,"FlaimAnalysis")==0) return FlaimAnalysisEnum;
+ 	      else if (strcmp(name,"FlaimSolution")==0) return FlaimSolutionEnum;
+ 	      else if (strcmp(name,"HydrologyShreveAnalysis")==0) return HydrologyShreveAnalysisEnum;
+@@ -504,11 +505,11 @@
+ 	      else if (strcmp(name,"Closed")==0) return ClosedEnum;
+ 	      else if (strcmp(name,"Free")==0) return FreeEnum;
+ 	      else if (strcmp(name,"Open")==0) return OpenEnum;
+-	      else if (strcmp(name,"Adjointp")==0) return AdjointpEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"Adjointx")==0) return AdjointxEnum;
++	      if (strcmp(name,"Adjointp")==0) return AdjointpEnum;
++	      else if (strcmp(name,"Adjointx")==0) return AdjointxEnum;
+ 	      else if (strcmp(name,"Adjointy")==0) return AdjointyEnum;
+ 	      else if (strcmp(name,"Adjointz")==0) return AdjointzEnum;
+ 	      else if (strcmp(name,"BalancethicknessMisfit")==0) return BalancethicknessMisfitEnum;
+@@ -627,11 +628,11 @@
+ 	      else if (strcmp(name,"BoolExternalResult")==0) return BoolExternalResultEnum;
+ 	      else if (strcmp(name,"DoubleExternalResult")==0) return DoubleExternalResultEnum;
+ 	      else if (strcmp(name,"DoubleMatExternalResult")==0) return DoubleMatExternalResultEnum;
+-	      else if (strcmp(name,"IntExternalResult")==0) return IntExternalResultEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"J")==0) return JEnum;
++	      if (strcmp(name,"IntExternalResult")==0) return IntExternalResultEnum;
++	      else if (strcmp(name,"J")==0) return JEnum;
+ 	      else if (strcmp(name,"StringExternalResult")==0) return StringExternalResultEnum;
+ 	      else if (strcmp(name,"Step")==0) return StepEnum;
+ 	      else if (strcmp(name,"Time")==0) return TimeEnum;
+@@ -750,11 +751,11 @@
+ 	      else if (strcmp(name,"BasalforcingsRhoOcean")==0) return BasalforcingsRhoOceanEnum;
+ 	      else if (strcmp(name,"BasalforcingsOceanCoef")==0) return BasalforcingsOceanCoefEnum;
+ 	      else if (strcmp(name,"BasalforcingsOceanLinDragCoef")==0) return BasalforcingsOceanLinDragCoefEnum;
+-	      else if (strcmp(name,"BasalforcingsOceanQuadDragCoef")==0) return BasalforcingsOceanQuadDragCoefEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"BasalforcingsOceanTurningAngle")==0) return BasalforcingsOceanTurningAngleEnum;
++	      if (strcmp(name,"BasalforcingsOceanQuadDragCoef")==0) return BasalforcingsOceanQuadDragCoefEnum;
++	      else if (strcmp(name,"BasalforcingsOceanTurningAngle")==0) return BasalforcingsOceanTurningAngleEnum;
+ 	      else if (strcmp(name,"BasalforcingsOceanSsh")==0) return BasalforcingsOceanSshEnum;
+ 	      else if (strcmp(name,"BasalforcingsOceanVx")==0) return BasalforcingsOceanVxEnum;
+ 	      else if (strcmp(name,"BasalforcingsOceanVy")==0) return BasalforcingsOceanVyEnum;
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp	(revision 18704)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp	(revision 18705)
+@@ -221,6 +221,7 @@
+ 					if(VerboseSolution()) _printf0_("eplconverged...\n");
+ 					InputUpdateFromConstantx(femmodel,eplconverged,ConvergedEnum);
+ 					InputUpdateFromSolutionx(femmodel,ug_epl);
++					inefanalysis->ResetCounter(femmodel);
+ 					break;
+ 				}
+ 			}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18705-18706.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18705-18706.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18705-18706.diff	(revision 19102)
@@ -0,0 +1,28 @@
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18705)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18706)
+@@ -108,6 +108,7 @@
+ def EplHeadOldEnum(): return StringToEnum("EplHeadOld")[0]
+ def EplHeadSlopeXEnum(): return StringToEnum("EplHeadSlopeX")[0]
+ def EplHeadSlopeYEnum(): return StringToEnum("EplHeadSlopeY")[0]
++def ElementActiveCounterEnum(): return StringToEnum("ElementActiveCounter")[0]
+ def HydrologydcMaxIterEnum(): return StringToEnum("HydrologydcMaxIter")[0]
+ def HydrologydcRelTolEnum(): return StringToEnum("HydrologydcRelTol")[0]
+ def HydrologydcSpcsedimentHeadEnum(): return StringToEnum("HydrologydcSpcsedimentHead")[0]
+Index: ../trunk-jpl/src/m/enum/ElementActiveCounterEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/ElementActiveCounterEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/ElementActiveCounterEnum.m	(revision 18706)
+@@ -0,0 +1,11 @@
++function macro=ElementActiveCounterEnum()
++%ELEMENTACTIVECOUNTERENUM - Enum of ElementActiveCounter
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=ElementActiveCounterEnum()
++
++macro=StringToEnum('ElementActiveCounter');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18706-18707.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18706-18707.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18706-18707.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18706)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18707)
+@@ -708,7 +708,7 @@
+ 		if(elementactive_counter[i]>penalty_lock){
+ 			element_active = true;
+ 		}
+-		//		femmodel->parameters->SetParam(elementactive_counter,ElementActiveCounterEnum);
++		femmodel->parameters->SetParam(elementactive_counter,femmodel->elements->Size(),ElementActiveCounterEnum);
+ 		element->AddInput(new BoolInput(HydrologydcMaskEplactiveEltEnum,element_active));
+ 	}
+ }/*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18707-18708.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18707-18708.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18707-18708.diff	(revision 19102)
@@ -0,0 +1,61 @@
+Index: ../trunk-jpl/test/NightlyRun/test431.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test431.m	(revision 18707)
++++ ../trunk-jpl/test/NightlyRun/test431.m	(revision 18708)
+@@ -13,7 +13,7 @@
+ 
+ %Fields and tolerances to track changes
+ field_names     ={'Vx','Vy','Vz','Vel','Pressure','Temperature','Water fraction','Enthalpy'};
+-field_tolerances={1e-10,1e-10,1e-09,1e-10,1e-13,1e-10,1e-10,2e-10};
++field_tolerances={3e-10,1e-10,1e-09,1e-10,1e-13,1e-10,1e-10,2e-10};
+ field_values={...
+ 	(md.results.SteadystateSolution.Vx),...
+ 	(md.results.SteadystateSolution.Vy),...
+Index: ../trunk-jpl/test/NightlyRun/test432.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test432.m	(revision 18707)
++++ ../trunk-jpl/test/NightlyRun/test432.m	(revision 18708)
+@@ -12,7 +12,7 @@
+ 
+ %Fields and tolerances to track changes
+ field_names     ={'Vx','Vy','Vz','Vel','Pressure','Temperature','Water fraction','Enthalpy'};
+-field_tolerances={2e-09,1e-09,1e-09,1e-09,1e-13,1e-10,3e-10,3e-10};
++field_tolerances={3e-09,1e-09,1e-09,1e-09,1e-13,1e-10,3e-10,3e-10};
+ field_values={...
+ 	(md.results.SteadystateSolution.Vx),...
+ 	(md.results.SteadystateSolution.Vy),...
+Index: ../trunk-jpl/test/NightlyRun/test701.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test701.m	(revision 18707)
++++ ../trunk-jpl/test/NightlyRun/test701.m	(revision 18708)
+@@ -37,23 +37,27 @@
+ %Misc
+ md=setflowequation(md,'FS','all');
+ md.stressbalance.abstol=NaN;
++md.stressbalance.reltol=10^-16;
+ md.stressbalance.FSreconditioning=1;
+-md.stressbalance.maxiter=20;
++md.stressbalance.maxiter=40;
+ md.flowequation.augmented_lagrangian_r=10000;
+ md.miscellaneous.name = 'flowline';
++md.verbose=verbose('convergence',true);
+ md.cluster=generic('np',2);
+ 
+ %Go solve
+ field_names={};
+ field_tolerances={};
+ field_values={};
+-for i={'MINI','MINIcondensed','TaylorHood','XTaylorHood','LATaylorHood','CrouzeixRaviart','LACrouzeixRaviart'}
++md.initialization.pressure=md.constants.g*md.materials.rho_ice*(md.geometry.surface-md.mesh.y);
++for i={'LATaylorHood'}
++%for i={'MINI','MINIcondensed','TaylorHood','XTaylorHood','LATaylorHood','CrouzeixRaviart','LACrouzeixRaviart'}
+ 	disp(' ');
+ 	disp(['====== Testing ' i{1} ' Full-Stokes Finite element =====']);
+ 	md.flowequation.fe_FS=i{1};
+ 	md=solve(md,StressbalanceSolutionEnum());
+ 	field_names     ={field_names{:},['Vx' i{1}],['Vy' i{1}],['Vel' i{1}],['Pressure' i{1}]};
+-	field_tolerances={field_tolerances{:},8e-5,8e-5,8e-5,1e-10};
++	field_tolerances={field_tolerances{:},9e-5,8e-5,9e-5,1e-10};
+ 	field_values={field_values{:},...
+ 		(md.results.StressbalanceSolution.Vx),...
+ 		(md.results.StressbalanceSolution.Vy),...
Index: /issm/oecreview/Archive/18296-19100/ISSM-18708-18709.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18708-18709.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18708-18709.diff	(revision 19102)
@@ -0,0 +1,75 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18708)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18709)
+@@ -16,7 +16,7 @@
+ 	int         transfer_flag;
+ 	int         penalty_lock;
+ 	int         hydro_maxiter;
+-	int         *elementactive_counter =NULL;
++	int*        elementactive_counter =NULL;
+ 	bool        isefficientlayer;
+ 	IssmDouble  sedimentlimit;
+ 	IssmDouble  penalty_factor;
+@@ -59,6 +59,7 @@
+ 	if(isefficientlayer==1){
+ 		elementactive_counter=xNewZeroInit<int>(iomodel->numberofelements);
+ 		parameters->AddObject(new IntVecParam(ElementActiveCounterEnum,elementactive_counter,iomodel->numberofelements));
++		xDelete<int>(elementactive_counter);
+ 	}
+ 	
+ }/*}}}*/
+@@ -684,19 +685,19 @@
+ 	bool     element_active;
+ 	bool     old_active;
+ 	int      penalty_lock;
+-	int*     elementactive_counter = NULL;
++	int*     elementactive_counter=NULL;
+ 	Element* element=NULL;
+ 
++	femmodel->parameters->FindParam(&elementactive_counter,NULL,ElementActiveCounterEnum);
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+ 		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-		element->parameters->FindParam(&elementactive_counter,NULL,ElementActiveCounterEnum);
+ 		element->parameters->FindParam(&penalty_lock,HydrologydcPenaltyLockEnum);
+ 		
+ 		Input* node_mask_input = element->GetInput(HydrologydcMaskEplactiveNodeEnum); _assert_(node_mask_input);
+ 		Input* old_active_input = element->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(old_active_input);
+ 		old_active_input->GetInputValue(&old_active);
+ 		
+-		if(node_mask_input->Max()>0.) {
++		if(node_mask_input->Max()>0.){
+ 			element_active = true;
+ 		}
+ 		else{
+@@ -708,20 +709,23 @@
+ 		if(elementactive_counter[i]>penalty_lock){
+ 			element_active = true;
+ 		}
+-		femmodel->parameters->SetParam(elementactive_counter,femmodel->elements->Size(),ElementActiveCounterEnum);
+ 		element->AddInput(new BoolInput(HydrologydcMaskEplactiveEltEnum,element_active));
+ 	}
++	femmodel->parameters->SetParam(elementactive_counter,femmodel->elements->Size(),ElementActiveCounterEnum);
++	xDelete<int>(elementactive_counter);
+ }/*}}}*/
+ 
+ void HydrologyDCInefficientAnalysis::ResetCounter(FemModel* femmodel){/*{{{*/
+ 
+-	int*     elementactive_counter = NULL;
++	int*     elementactive_counter=NULL;
+ 	Element* element=NULL;
+-	
++
++	femmodel->parameters->FindParam(&elementactive_counter,NULL,ElementActiveCounterEnum);
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+ 		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-		element->parameters->FindParam(&elementactive_counter,NULL,ElementActiveCounterEnum);
+-
+-		elementactive_counter=0;
+-	}
++		
++		elementactive_counter[i]=0;
++	}		
++	femmodel->parameters->SetParam(elementactive_counter,femmodel->elements->Size(),ElementActiveCounterEnum);
++	xDelete<int>(elementactive_counter);
+ }/*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18709-18710.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18709-18710.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18709-18710.diff	(revision 19102)
@@ -0,0 +1,194 @@
+Index: ../trunk-jpl/src/m/classes/transient.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/transient.py	(revision 18709)
++++ ../trunk-jpl/src/m/classes/transient.py	(revision 18710)
+@@ -57,7 +57,7 @@
+ 		self.isgia           = False
+ 		self.isdamageevolution = False
+ 		self.islevelset      = False
+-                self.ishydrology     = False
++		self.ishydrology     = False
+ 
+ 		#default output
+ 		self.requested_outputs=[]
+@@ -73,7 +73,7 @@
+ 		self.isgia           = False
+ 		self.isdamageevolution = False
+ 		self.islevelset      = False
+-                self.ishydrology     = False
++		self.ishydrology     = False
+ 
+ 		#default output
+ 		self.requested_outputs=['default']
+Index: ../trunk-jpl/src/m/classes/hydrologydc.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 18709)
++++ ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 18710)
+@@ -37,6 +37,7 @@
+ 		self.epl_compressibility      = 0
+ 		self.epl_porosity             = 0
+ 		self.epl_initial_thickness    = 0
++		self.epl_colapse_thickness    = 0
+ 		self.epl_max_thickness        = 0
+ 		self.epl_conductivity         = 0
+ 				 
+@@ -53,37 +54,43 @@
+ 		string="%s\n%s"%(string,fielddisplay(self,'penalty_lock','stabilize unstable constraints that keep zigzagging after n iteration (default is 0, no stabilization)'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'rel_tol','tolerance of the nonlinear iteration for the transfer between layers [dimensionless]'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'max_iter','maximum number of nonlinear iteration'))
++		string="%s\n%s"%(string,fielddisplay(self,'basal_moulin_input','water flux at a given point [m3 s-1]'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'sedimentlimit_flag','what kind of upper limit is applied for the inefficient layer'))
+-		string='%55s  0: no limit',' '
+-		string='%55s  1: user defined: %s',' ','sedimentlimit'
+-		string='%55s  2: hydrostatic pressure',' '
+-		string='%55s  3: normal stress',' '
+-
++		string="%s\n\t\t%s"%(string,'0: no limit')
++		string="%s\n\t\t%s"%(string,'1: user defined sedimentlimit')
++		string="%s\n\t\t%s"%(string,'2: hydrostatic pressure')
++		string="%s\n\t\t%s"%(string,'3: normal stress')
++	
+ 		if self.sedimentlimit_flag==1:
+ 			string="%s\n%s"%(string,fielddisplay(self,'sedimentlimit','user defined upper limit for the inefficient layer [m]'))
+-			string="%s\n%s"%(string,fielddisplay(self,'basal_moulin_input','water flux at a given point [m3 s-1]'))
+-			string="%s\n%s"%(string,fielddisplay(self,'transfer_flag','what kind of transfer method is applied between the layers'))
+-			string='%55s  0: no transfer',' '
+-			string='%55s  1: constant leakage factor: %s',' ','leakage_factor'
++
++
++		string="%s\n%s"%(string,fielddisplay(self,'transfer_flag','what kind of transfer method is applied between the layers'))
++		string="%s\n\t\t%s"%(string,'0: no transfer')
++		string="%s\n\t\t%s"%(string,'1: constant leakage factor: leakage_factor')
+ 			 
+ 		if self.transfer_flag is 1:
+ 			string="%s\n%s"%(string,fielddisplay(self,'leakage_factor','user defined leakage factor [m]'))
+-			string='   - for the sediment layer'
+-			string="%s\n%s"%(string,fielddisplay(self,'spcsediment_head','sediment water head constraints (NaN means no constraint) [m above MSL]'))
+-			string="%s\n%s"%(string,fielddisplay(self,'sediment_compressibility','sediment compressibility [Pa^-1]'))
+-			string="%s\n%s"%(string,fielddisplay(self,'sediment_porosity','sediment [dimensionless]'))
+-			string="%s\n%s"%(string,fielddisplay(self,'sediment_thickness','sediment thickness [m]'))
+-			string="%s\n%s"%(string,fielddisplay(self,'sediment_transmitivity','sediment transmitivity [m^2/s]'))
+ 
++		string="%s\n%s"%(string,'   - for the sediment layer')
++		string="%s\n%s"%(string,fielddisplay(self,'spcsediment_head','sediment water head constraints (NaN means no constraint) [m above MSL]'))
++		string="%s\n%s"%(string,fielddisplay(self,'sediment_compressibility','sediment compressibility [Pa^-1]'))
++		string="%s\n%s"%(string,fielddisplay(self,'sediment_porosity','sediment [dimensionless]'))
++		string="%s\n%s"%(string,fielddisplay(self,'sediment_thickness','sediment thickness [m]'))
++		string="%s\n%s"%(string,fielddisplay(self,'sediment_transmitivity','sediment transmitivity [m^2/s]'))
++
+ 		if self.isefficientlayer==1:
+-			string='   - for the epl layer'
++			string="%s\n%s"%(string,'   - for the epl layer')
+ 			string="%s\n%s"%(string,fielddisplay(self,'spcepl_head','epl water head constraints (NaN means no constraint) [m above MSL]'))
+ 			string="%s\n%s"%(string,fielddisplay(self,'mask_eplactive_node','active (1) or not (0) EPL'))
+ 			string="%s\n%s"%(string,fielddisplay(self,'epl_compressibility','epl compressibility [Pa^-1]'))
+ 			string="%s\n%s"%(string,fielddisplay(self,'epl_porosity','epl [dimensionless]'))
+-			string="%s\n%s"%(string,fielddisplay(self,'epl_initial_thickness','epl initial thickness [m]'))
++			string="%s\n%s"%(string,fielddisplay(self,'epl_max_thickness','epl initial thickness [m]'))
++			string="%s\n%s"%(string,fielddisplay(self,'epl_initial_thickness','epl initial thickness [m]'))			
++			string="%s\n%s"%(string,fielddisplay(self,'epl_colapse_thickness','epl colapsing thickness [m]'))
+ 			string="%s\n%s"%(string,fielddisplay(self,'epl_conductivity','epl conductivity [m^2/s]'))
+-	#}}}
++		return string
++#}}}
+ 	def setdefaultparameters(self): #{{{ 
+ 
+ 		#Parameters from de Fleurian 2014
+@@ -105,15 +112,16 @@
+ 		self.epl_compressibility      = 1.0e-08
+ 		self.epl_porosity             = 0.4
+ 		self.epl_initial_thickness    = 1.0
++		self.epl_colapse_thickness    = 1.0e-3
+ 		self.epl_max_thickness        = 5.0
+ 		self.epl_conductivity         = 8.0e-02
+ 
+ 		return self
+ 	# }}}
+ 
+-	def initialize(self): # {{{
++	def initialize(self,md): # {{{
+ 		if numpy.all(numpy.isnan(self.basal_moulin_input)):
+-			self.basal_moulin_input=numpy.zeros(md.mesh.numberofvertices,1)
++			self.basal_moulin_input=numpy.zeros((md.mesh.numberofvertices,1))
+ 			print"      no hydrology.basal_moulin_input specified: values set as zero"
+ 
+ 		return self
+@@ -121,36 +129,40 @@
+ 	def checkconsistency(self,md,solution,analyses): #{{{ 
+ 
+ 		#Early return
+-		if HydrologyDCInefficientAnalysisEnum() not in analyses:
++		if HydrologyDCInefficientAnalysisEnum() not in analyses and HydrologyDCEfficientAnalysisEnum() not in analyses:
+ 			return md
+ 
+-                md = checkfield(md,'fieldname','hydrology.water_compressibility','>',0,'numel',1)
++		md = checkfield(md,'fieldname','hydrology.water_compressibility','numel',[1],'>',0.)
+ 		md = checkfield(md,'fieldname','hydrology.isefficientlayer','numel',[1],'values',[0,1])
+-		md = checkfield(md,'fieldname','hydrology.penalty_factor','>',0,'numel',1)
+-		md = checkfield(md,'fieldname','hydrology.rel_tol','>',0,'numel',1)
+-		md = checkfield(md,'fieldname','hydrology.max_iter','>',0,'numel',1)
++		md = checkfield(md,'fieldname','hydrology.penalty_factor','>',0.,'numel',[1])
++		md = checkfield(md,'fieldname','hydrology.rel_tol','>',0.,'numel',[1])
++		md = checkfield(md,'fieldname','hydrology.max_iter','>',0.,'numel',[1])
+ 		md = checkfield(md,'fieldname','hydrology.sedimentlimit_flag','numel',[1],'values',[0,1,2,3])
+ 		md = checkfield(md,'fieldname','hydrology.transfer_flag','numel',[1],'values',[0,1])
+ 
+ 		if self.sedimentlimit_flag==1:
+-			md = checkfield(md,'fieldname','hydrology.sedimentlimit','>',0,'numel',1)
++			md = checkfield(md,'fieldname','hydrology.sedimentlimit','>',0.,'numel',[1])
+ 
+ 		if self.transfer_flag==1:
+-			md = checkfield(md,'fieldname','hydrology.leakage_factor','>',0,'numel',1)
++			md = checkfield(md,'fieldname','hydrology.leakage_factor','>',0.,'numel',[1])
+ 
+ 		md = checkfield(md,'fieldname','hydrology.basal_moulin_input','NaN',1,'forcing',1)
+ 		md = checkfield(md,'fieldname','hydrology.spcsediment_head','forcing',1)
+-		md = checkfield(md,'fieldname','hydrology.sediment_compressibility','>',0,'numel',1)
+-		md = checkfield(md,'fieldname','hydrology.sediment_porosity','>',0,'numel',1)
+-		md = checkfield(md,'fieldname','hydrology.sediment_thickness','>',0,'numel',1)
++		md = checkfield(md,'fieldname','hydrology.sediment_compressibility','>',0.,'numel',[1])
++		md = checkfield(md,'fieldname','hydrology.sediment_porosity','>',0.,'numel',[1])
++		md = checkfield(md,'fieldname','hydrology.sediment_thickness','>',0.,'numel',[1])
+ 		md = checkfield(md,'fieldname','hydrology.sediment_transmitivity','>=',0,'size',[md.mesh.numberofvertices,1])
+ 		if self.isefficientlayer==1:
+ 			md = checkfield(md,'fieldname','hydrology.spcepl_head','forcing',1)
+ 			md = checkfield(md,'fieldname','hydrology.mask_eplactive_node','size',[md.mesh.numberofvertices,1],'values',[0,1])
+-			md = checkfield(md,'fieldname','hydrology.epl_compressibility','>',0,'numel',1)
+-			md = checkfield(md,'fieldname','hydrology.epl_porosity','>',0,'numel',1)
+-			md = checkfield(md,'fieldname','hydrology.epl_initial_thickness','>',0,'numel',1)
+-			md = checkfield(md,'fieldname','hydrology.epl_conductivity','>',0,'numel',1)
++			md = checkfield(md,'fieldname','hydrology.epl_compressibility','>',0.,'numel',[1])
++			md = checkfield(md,'fieldname','hydrology.epl_porosity','>',0.,'numel',[1])
++			md = checkfield(md,'fieldname','hydrology.epl_max_thickness','numel',[1],'>',0.)
++			md = checkfield(md,'fieldname','hydrology.epl_initial_thickness','numel',[1],'>',0.)
++			md = checkfield(md,'fieldname','hydrology.epl_colapse_thickness','numel',[1],'>',0.)
++			if self.epl_colapse_thickness > self.epl_initial_thickness:
++				md.checkmessage('Colapsing thickness for EPL larger than initial thickness')
++			md = checkfield(md,'fieldname','hydrology.epl_conductivity','numel',[1],'>',0.)
+ 	# }}}
+ 	def marshall(self,md,fid): #{{{ 
+ 		WriteData(fid,'enum',HydrologyModelEnum(),'data',HydrologydcEnum(),'format','Integer')
+@@ -180,6 +192,8 @@
+ 			WriteData(fid,'object',self,'fieldname','mask_eplactive_node','format','DoubleMat','mattype',1)
+ 			WriteData(fid,'object',self,'fieldname','epl_compressibility','format','Double')			
+ 			WriteData(fid,'object',self,'fieldname','epl_porosity','format','Double')			
+-			WriteData(fid,'object',self,'fieldname','epl_initial_thickness','format','Double')
++			WriteData(fid,'object',self,'fieldname','epl_max_thickness','format','Double')
++			WriteData(fid,'object',self,'fieldname','epl_initial_thickness','format','Double')			
++			WriteData(fid,'object',self,'fieldname','epl_colapse_thickness','format','Double')			
+ 			WriteData(fid,'object',self,'fieldname','epl_conductivity','format','Double')
+ 	# }}}
+Index: ../trunk-jpl/src/m/classes/initialization.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/initialization.py	(revision 18709)
++++ ../trunk-jpl/src/m/classes/initialization.py	(revision 18710)
+@@ -75,7 +75,8 @@
+ 				md = checkfield(md,'fieldname','initialization.waterfraction','>=',0,'size',[md.mesh.numberofvertices])
+ 				md = checkfield(md,'fieldname','initialization.watercolumn'  ,'>=',0,'size',[md.mesh.numberofvertices])
+ 		if HydrologyShreveAnalysisEnum() in analyses:
+-			md = checkfield(md,'fieldname','initialization.watercolumn','NaN',1,'size',[md.mesh.numberofvertices])
++			if hasattr(md.hydrology,'hydrologyshreve'):
++				md = checkfield(md,'fieldname','initialization.watercolumn','NaN',1,'size',[md.mesh.numberofvertices])
+ 		if HydrologyDCInefficientAnalysisEnum() in analyses:
+ 			if hasattr(md.hydrology,'hydrologydc'):
+ 				md = checkfield(md,'fieldname','initialization.sediment_head','NaN',1,'size',[md.mesh.numberofvertices,1])
Index: /issm/oecreview/Archive/18296-19100/ISSM-18710-18711.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18710-18711.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18710-18711.diff	(revision 19102)
@@ -0,0 +1,17 @@
+Index: ../trunk-jpl/src/m/classes/clusters/pfe.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/pfe.m	(revision 18710)
++++ ../trunk-jpl/src/m/classes/clusters/pfe.m	(revision 18711)
+@@ -136,7 +136,11 @@
+ 			 fprintf(fid,'export ISSM_DIR="%s/../"\n',cluster.codepath); %FIXME
+ 			 fprintf(fid,'source $ISSM_DIR/etc/environment.sh\n');       %FIXME
+ 			 fprintf(fid,'cd %s/%s/\n\n',cluster.executionpath,dirname);
+-			 fprintf(fid,'mpiexec -np %i %s/issm.exe %s %s %s\n',cluster.np,cluster.codepath,EnumToString(solution),[cluster.executionpath '/' dirname],modelname);
++			 if ~isvalgrind,
++				 fprintf(fid,'mpiexec -np %i %s/issm.exe %s %s %s\n',cluster.np,cluster.codepath,EnumToString(solution),[cluster.executionpath '/' dirname],modelname);
++			 else
++				 fprintf(fid,'mpiexec -np %i valgrind --leak-check=full %s/issm.exe %s %s %s\n',cluster.np,cluster.codepath,EnumToString(solution),[cluster.executionpath '/' dirname],modelname);
++			 end
+ 			 if ~io_gather, %concatenate the output files:
+ 				 fprintf(fid,'cat %s.outbin.* > %s.outbin',modelname,modelname);
+ 			 end
Index: /issm/oecreview/Archive/18296-19100/ISSM-18711-18712.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18711-18712.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18711-18712.diff	(revision 19102)
@@ -0,0 +1,19 @@
+Index: ../trunk-jpl/m4/issm_options.m4
+===================================================================
+--- ../trunk-jpl/m4/issm_options.m4	(revision 18711)
++++ ../trunk-jpl/m4/issm_options.m4	(revision 18712)
+@@ -262,12 +262,12 @@
+   			*cygwin*) 
+   				if  test $VENDOR = intel-win7-32; then
+   					MEXLIB="-Wl,./../../c/libISSMCore.a -Wl,libISSMApi.a -Wl,libISSMMatlab.a -Wl,./../../c/libISSMModules.a -Wl,libmx.lib -Wl,libmex.lib -Wl,libmat.lib ${OSLIBS} -Wl,libf2cblas.lib -Wl,libf2clapack.lib" 
+-               MEXLINK="/LD -Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win32/microsoft` -no-undefined -Wl,/export:mexFunction"
++               MEXLINK="-Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win32/microsoft` -no-undefined -Wl,/export:mexFunction -Wl,/LD"
+ 					MEXEXT=`$MATLAB_ROOT/bin/mexext.bat`
+ 					MEXEXT=".$MEXEXT"
+   				elif  test l-win7-64; then
+   					MEXLIB="-Wl,./../../c/libISSMCore.a -Wl,libISSMApi.a -Wl,libISSMMatlab.a -Wl,./../../c/libISSMModules.a -Wl,libmx.lib -Wl,libmex.lib -Wl,libmat.lib ${OSLIBS} -Wl,libf2cblas.lib -Wl,libf2clapack.lib" 
+-               MEXLINK="/LD -Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win64/microsoft` -no-undefined -Wl,/export:mexFunction" 
++               MEXLINK="-Wl,/LIBPATH:`cygpath -m ${MATLAB_ROOT}/extern/lib/win64/microsoft` -no-undefined -Wl,/export:mexFunction -Wl,/LD" 
+ 					MEXEXT=".mexw64"
+   				fi
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18712-18713.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18712-18713.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18712-18713.diff	(revision 19102)
@@ -0,0 +1,24 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18712)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18713)
+@@ -103,7 +103,7 @@
+ 	if(isefficientlayer){
+ 		iomodel->FetchDataToInput(elements,HydrologydcMaskEplactiveNodeEnum);
+ 
+-		for(int i=0;i<iomodel->numberofelements;i++){
++		for(int i=0;i<elements->Size();i++){
+ 			Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 			Input* node_mask_input = element->GetInput(HydrologydcMaskEplactiveNodeEnum); _assert_(node_mask_input);
+ 			
+@@ -719,8 +719,9 @@
+ 
+ 	int*     elementactive_counter=NULL;
+ 	Element* element=NULL;
++	int N;
+ 
+-	femmodel->parameters->FindParam(&elementactive_counter,NULL,ElementActiveCounterEnum);
++	femmodel->parameters->FindParam(&elementactive_counter,&N,ElementActiveCounterEnum);
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+ 		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+ 		
Index: /issm/oecreview/Archive/18296-19100/ISSM-18713-18714.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18713-18714.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18713-18714.diff	(revision 19102)
@@ -0,0 +1,129 @@
+Index: ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18713)
++++ ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18714)
+@@ -31,7 +31,7 @@
+ 	long         omode;
+ 	double       f,dxmin,gttol; 
+ 	int          maxsteps,maxiter;
+-	int          intn,num_controls,solution_type;
++	int          intn,numberofvertices,num_controls,solution_type;
+ 	IssmDouble  *scaling_factors = NULL;
+ 	IssmDouble  *X  = NULL;
+ 	IssmDouble  *G  = NULL;
+@@ -45,6 +45,7 @@
+ 	femmodel->parameters->FindParam(&gttol,InversionGttolEnum);
+ 	femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
+ 	femmodel->parameters->SetParam(false,SaveResultsEnum);
++	numberofvertices=femmodel->vertices->NumberOfVertices();
+ 
+ 	/*Initialize M1QN3 parameters*/
+ 	if(VerboseControl())_printf0_("   Initialize M1QN3 parameters\n");
+@@ -61,8 +62,8 @@
+ 	long      io           = 6;         /*Channel number for the output*/
+ 
+ 	/*Optimization criterions*/
+-	long      niter        = long(maxsteps); /*Maximum number of iterations*/
+-	long      nsim         = long(maxiter);/*Maximum number of function calls*/
++	long niter = long(maxsteps); /*Maximum number of iterations*/
++	long nsim  = long(maxiter);/*Maximum number of function calls*/
+ 
+ 	/*Get initial guess*/
+ 	Vector<IssmDouble> *Xpetsc = NULL;
+@@ -70,15 +71,18 @@
+ 	X = Xpetsc->ToMPISerial();
+ 	Xpetsc->GetSize(&intn);
+ 	delete Xpetsc;
++	_assert_(intn==numberofvertices*num_controls);
+ 
+ 	/*Get problem dimension and initialize gradient and initial guess*/
+ 	long n = long(intn);
+ 	G = xNew<double>(n);
+ 
+ 	/*Scale control for M1QN3*/
+-	if(num_controls!=1) _error_("not supported yet...");
+-	for(long i=0;i<n;i++){
+-		X[i] = X[i]/scaling_factors[0];
++	for(int i=0;i<numberofvertices;i++){
++		for(int c=0;c<num_controls;c++){
++			int index = num_controls*i+c;
++			X[index] = X[index]/scaling_factors[c];
++		}
+ 	}
+ 
+ 	/*Allocate m1qn3 working arrays (see doc)*/
+@@ -117,11 +121,13 @@
+ 	IssmDouble  *XU = NULL;
+ 	GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");
+ 	GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
+-	if(num_controls!=1) _error_("not supported yet");
+-	for(long i=0;i<n;i++){
+-		X[i] = X[i]*scaling_factors[0];
+-		if(X[i]>XU[i]) X[i]=XU[i];
+-		if(X[i]<XL[i]) X[i]=XL[i];
++	for(int i=0;i<numberofvertices;i++){
++		for(int c=0;c<num_controls;c++){
++			int index = num_controls*i+c;
++			X[index] = X[index]*scaling_factors[c];
++			if(X[index]>XU[index]) X[index]=XU[index];
++			if(X[index]<XL[index]) X[index]=XL[index];
++		}
+ 	}
+ 	SetControlInputsFromVectorx(femmodel,X);
+ 	ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,G);
+@@ -151,23 +157,25 @@
+ 	FemModel   *femmodel  = (FemModel*)dzs;
+ 
+ 	/*Recover number of cost functions responses*/
+-	int         num_responses;
+-	int         num_controls;
++	int num_responses,num_controls,numberofvertices;
+ 	IssmDouble* scaling_factors = NULL;
+ 	femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum);
+ 	femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
+ 	femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
++	numberofvertices=femmodel->vertices->NumberOfVertices();
+ 
+ 	/*Constrain input vector*/
+ 	IssmDouble  *XL = NULL;
+ 	IssmDouble  *XU = NULL;
+ 	GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");
+ 	GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
+-	if(num_controls!=1) _error_("not supported yet");
+-	for(long i=0;i<*n;i++){
+-		X[i] = X[i]*scaling_factors[0];
+-		if(X[i]>XU[i]) X[i]=XU[i];
+-		if(X[i]<XL[i]) X[i]=XL[i];
++	for(int i=0;i<numberofvertices;i++){
++		for(int c=0;c<num_controls;c++){
++			int index = num_controls*i+c;
++			X[index] = X[index]*scaling_factors[c];
++			if(X[index]>XU[index]) X[index]=XU[index];
++			if(X[index]<XL[index]) X[index]=XL[index];
++		}
+ 	}
+ 
+ 	/*Update control input*/
+@@ -213,13 +221,15 @@
+ 
+ 	/*Constrain Gradient*/
+ 	IssmDouble  Gnorm = 0.;
+-	if(num_controls!=1) _error_("not supported yet");
+-	for(long i=0;i<*n;i++){
+-		if(X[i]>=XU[i]) G[i]=0.;
+-		if(X[i]<=XL[i]) G[i]=0.;
+-		G[i] = G[i]*scaling_factors[0];
+-		X[i] = X[i]/scaling_factors[0];
+-		Gnorm += G[i]*G[i];
++	for(int i=0;i<numberofvertices;i++){
++		for(int c=0;c<num_controls;c++){
++			int index = num_controls*i+c;
++			if(X[index]>=XU[index]) G[index]=0.;
++			if(X[index]<=XL[index]) G[index]=0.;
++			G[index] = G[index]*scaling_factors[c];
++			X[index] = X[index]/scaling_factors[c];
++			Gnorm += G[index]*G[index];
++		}
+ 	}
+ 	Gnorm = sqrt(Gnorm);
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18714-18715.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18714-18715.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18714-18715.diff	(revision 19102)
@@ -0,0 +1,92 @@
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18714)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18715)
+@@ -148,7 +148,7 @@
+ void AdjointBalancethickness2Analysis::GradientJOmega(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+ 	/*Intermediaries*/
+-	IssmDouble dlambda[2],ds[2],D0,Jdet; 
++	IssmDouble dlambda[2],ds[2],D0,omega,Jdet; 
+ 	IssmDouble *xyz_list= NULL;
+ 
+ 	/*Fetch number of vertices for this finite element*/
+@@ -165,6 +165,7 @@
+ 	Input* adjoint_input = element->GetInput(AdjointEnum);            _assert_(adjoint_input);
+ 	Input* s_input       = element->GetInput(SurfaceEnum);            _assert_(s_input);
+ 	Input* D0_input      = element->GetInput(BalancethicknessD0Enum); _assert_(D0_input);
++	Input* omega_input   = element->GetInput(BalancethicknessOmegaEnum); _assert_(omega_input);
+ 
+ 	Gauss* gauss=element->NewGauss(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+@@ -174,12 +175,13 @@
+ 		element->NodalFunctionsP1(basis,gauss);
+ 
+ 		D0_input->GetInputValue(&D0,gauss);
++		omega_input->GetInputValue(&omega,gauss);
+ 		adjoint_input->GetInputDerivativeValue(&dlambda[0],xyz_list,gauss);
+ 		s_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);
+ 
+ 		/*Build gradient vector (actually -dJ/da): */
+ 		for(int i=0;i<numvertices;i++){
+-			ge[i]+= -Jdet*gauss->weight*basis[i]*D0*(ds[0]*dlambda[0] + ds[1]*dlambda[1]);
++			ge[i]+= -Jdet*gauss->weight*basis[i]*exp(omega)*D0*(ds[0]*dlambda[0] + ds[1]*dlambda[1]);
+ 			_assert_(!xIsNan<IssmDouble>(ge[i]));
+ 		}
+ 	}
+Index: ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18714)
++++ ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18715)
+@@ -97,7 +97,7 @@
+ 
+ 		for(int i=0;i<numnodes;i++){
+ 			for(int j=0;j<numnodes;j++){
+-				Ke->values[i*numnodes+j] += D0*omega*gauss->weight*Jdet*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j]);
++				Ke->values[i*numnodes+j] += D0*exp(omega)*gauss->weight*Jdet*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j]);
+ 			}
+ 		}
+ 	}
+Index: ../trunk-jpl/src/c/cores/balancethickness2_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/balancethickness2_core.cpp	(revision 18714)
++++ ../trunk-jpl/src/c/cores/balancethickness2_core.cpp	(revision 18715)
+@@ -13,18 +13,19 @@
+ 
+ 	/*parameters: */
+ 	bool        save_results;
+-	IssmDouble  l = 8.;
++	IssmDouble  l = 3.;
+ 
+ 	/*recover parameters: */
+ 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+ 
+ 	if(VerboseSolution()) _printf0_("computing smooth surface slopes:\n");
+-	femmodel->parameters->SetParam(l,SmoothThicknessMultiplierEnum);
+-	femmodel->SetCurrentConfiguration(SmoothAnalysisEnum);
+-	femmodel->parameters->SetParam(SurfaceSlopeXEnum,InputToSmoothEnum);
+-	solutionsequence_linear(femmodel);
+-	femmodel->parameters->SetParam(SurfaceSlopeYEnum,InputToSmoothEnum);
+-	solutionsequence_linear(femmodel);
++	//femmodel->parameters->SetParam(l,SmoothThicknessMultiplierEnum);
++	//femmodel->SetCurrentConfiguration(SmoothAnalysisEnum);
++	//femmodel->parameters->SetParam(SurfaceSlopeXEnum,InputToSmoothEnum);
++	//solutionsequence_linear(femmodel);
++	//femmodel->parameters->SetParam(SurfaceSlopeYEnum,InputToSmoothEnum);
++	//solutionsequence_linear(femmodel);
++	surfaceslope_core(femmodel);
+ 
+ 	if(VerboseSolution()) _printf0_("call computational core:\n");
+ 	femmodel->SetCurrentConfiguration(Balancethickness2AnalysisEnum);
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18714)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18715)
+@@ -482,6 +482,7 @@
+ 			break;
+ 
+ 		case Balancethickness2SolutionEnum:
++			analyses_temp[numanalyses++]=L2ProjectionBaseAnalysisEnum;
+ 			analyses_temp[numanalyses++]=SmoothAnalysisEnum;
+ 			analyses_temp[numanalyses++]=Balancethickness2AnalysisEnum;
+ 			break;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18715-18716.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18715-18716.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18715-18716.diff	(revision 19102)
@@ -0,0 +1,22 @@
+Index: ../trunk-jpl/src/m/classes/thermal.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/thermal.m	(revision 18715)
++++ ../trunk-jpl/src/m/classes/thermal.m	(revision 18716)
+@@ -36,7 +36,7 @@
+             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="penalty_lock" type="',class(obj.penalty_lock),'" default="',convert2str(obj.penalty_lock),'">','     <section name="thermal" />','     <help> threshold to declare convergence of thermal solution (default is 0)  </help>','  </parameter>');
+             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="penalty_factor" type="',class(obj.penalty_factor),'" default="',convert2str(obj.penalty_factor),'">','     <section name="thermal" />','     <help> scaling exponent (default is 3) </help>','  </parameter>');
+             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isenthalpy" type="',class(obj.isenthalpy),'" default="',convert2str(obj.isenthalpy),'">','     <section name="thermal" />','     <help> use an enthalpy formulation to include temperate ice (default is 0) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isdynamicbasalspc" type="',class(obj.isdynamicbasalspc),'" default="',convert2str(obj.isdynamicbasalspc),'">','     <section name="thermal" />','     <help> enable dynamic setting of basal forcing. required for enthalpy formulation (default is 0)  </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isdynamicbasalspc" type="',class(obj.isdynamicbasalspc),'" default="',convert2str(obj.isdynamicbasalspc),'">','     <section name="thermal" />','     <help> enable dynamic setting of basal forcing. recommended for enthalpy formulation (default is 0)  </help>','  </parameter>');
+             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="requested_outputs" type="',class(obj.requested_outputs),'" default="',convert2str(obj.requested_outputs),'">','     <section name="thermal" />','     <help> additional outputs requested </help>','  </parameter>');
+             fprintf(fid,'%s\n%s\n','</frame>');    
+         
+@@ -94,7 +94,7 @@
+ 			if (ismember(EnthalpyAnalysisEnum(),analyses) & md.thermal.isenthalpy & dimension(md.mesh)==3),
+ 				pos=find(md.thermal.spctemperature(1:md.mesh.numberofvertices,:)~=NaN);
+ 				replicate=repmat(md.geometry.surface-md.mesh.z,1,size(md.thermal.spctemperature,2));
+-				md = checkfield(md,'fieldname','thermal.spctemperature(find(md.thermal.spctemperature(1:md.mesh.numberofvertices,:)~=NaN))','<',md.materials.meltingpoint-md.materials.beta*md.materials.rho_ice*md.constants.g*replicate(pos),'message','spctemperature should be below the adjusted melting point');
++				md = checkfield(md,'fieldname','thermal.spctemperature(find(md.thermal.spctemperature(1:md.mesh.numberofvertices,:)~=NaN))','<=',md.materials.meltingpoint-md.materials.beta*md.materials.rho_ice*md.constants.g*replicate(pos),'message','spctemperature should be less or equal than the adjusted melting point');
+ 				md = checkfield(md,'fieldname','thermal.isenthalpy','numel',[1],'values',[0 1]);
+ 				md = checkfield(md,'fieldname','thermal.isdynamicbasalspc','numel', [1],'values',[0 1]);
+ 				if(md.thermal.isenthalpy)
Index: /issm/oecreview/Archive/18296-19100/ISSM-18716-18717.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18716-18717.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18716-18717.diff	(revision 19102)
@@ -0,0 +1,723 @@
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18716)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18717)
+@@ -330,6 +330,12 @@
+ 	SurfaceforcingsPrecipitationEnum,
+ 	SurfaceforcingsDesfacEnum,
+ 	SurfaceforcingsS0pEnum,
++	SurfaceforcingsS0tEnum,
++	SurfaceforcingsRlapsEnum,
++	SurfaceforcingsRlapslgmEnum,
++	SurfaceforcingsPfacEnum,
++	SurfaceforcingsTdiffEnum,
++	SurfaceforcingsSealevEnum,
+ 	SMBgradientsEnum,
+ 	SurfaceforcingsMonthlytemperaturesEnum,
+ 	SurfaceforcingsHrefEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18716)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18717)
+@@ -336,6 +336,12 @@
+ 		case SurfaceforcingsPrecipitationEnum : return "SurfaceforcingsPrecipitation";
+ 		case SurfaceforcingsDesfacEnum : return "SurfaceforcingsDesfac";
+ 		case SurfaceforcingsS0pEnum : return "SurfaceforcingsS0p";
++		case SurfaceforcingsS0tEnum : return "SurfaceforcingsS0t";
++		case SurfaceforcingsRlapsEnum : return "SurfaceforcingsRlaps";
++		case SurfaceforcingsRlapslgmEnum : return "SurfaceforcingsRlapslgm";
++		case SurfaceforcingsPfacEnum : return "SurfaceforcingsPfac";
++		case SurfaceforcingsTdiffEnum : return "SurfaceforcingsTdiff";
++		case SurfaceforcingsSealevEnum : return "SurfaceforcingsSealev";
+ 		case SMBgradientsEnum : return "SMBgradients";
+ 		case SurfaceforcingsMonthlytemperaturesEnum : return "SurfaceforcingsMonthlytemperatures";
+ 		case SurfaceforcingsHrefEnum : return "SurfaceforcingsHref";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18716)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18717)
+@@ -342,6 +342,12 @@
+ 	      else if (strcmp(name,"SurfaceforcingsPrecipitation")==0) return SurfaceforcingsPrecipitationEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsDesfac")==0) return SurfaceforcingsDesfacEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsS0p")==0) return SurfaceforcingsS0pEnum;
++	      else if (strcmp(name,"SurfaceforcingsS0t")==0) return SurfaceforcingsS0tEnum;
++	      else if (strcmp(name,"SurfaceforcingsRlaps")==0) return SurfaceforcingsRlapsEnum;
++	      else if (strcmp(name,"SurfaceforcingsRlapslgm")==0) return SurfaceforcingsRlapslgmEnum;
++	      else if (strcmp(name,"SurfaceforcingsPfac")==0) return SurfaceforcingsPfacEnum;
++	      else if (strcmp(name,"SurfaceforcingsTdiff")==0) return SurfaceforcingsTdiffEnum;
++	      else if (strcmp(name,"SurfaceforcingsSealev")==0) return SurfaceforcingsSealevEnum;
+ 	      else if (strcmp(name,"SMBgradients")==0) return SMBgradientsEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsMonthlytemperatures")==0) return SurfaceforcingsMonthlytemperaturesEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsHref")==0) return SurfaceforcingsHrefEnum;
+@@ -379,9 +385,6 @@
+ 	      else if (strcmp(name,"BedSlopeSolution")==0) return BedSlopeSolutionEnum;
+ 	      else if (strcmp(name,"DamageEvolutionSolution")==0) return DamageEvolutionSolutionEnum;
+ 	      else if (strcmp(name,"DamageEvolutionAnalysis")==0) return DamageEvolutionAnalysisEnum;
+-	      else if (strcmp(name,"StressbalanceAnalysis")==0) return StressbalanceAnalysisEnum;
+-	      else if (strcmp(name,"StressbalanceSIAAnalysis")==0) return StressbalanceSIAAnalysisEnum;
+-	      else if (strcmp(name,"StressbalanceSolution")==0) return StressbalanceSolutionEnum;
+          else stage=4;
+    }
+    if(stage==4){
+@@ -502,9 +505,6 @@
+ 	      else if (strcmp(name,"Ice")==0) return IceEnum;
+ 	      else if (strcmp(name,"Melange")==0) return MelangeEnum;
+ 	      else if (strcmp(name,"Water")==0) return WaterEnum;
+-	      else if (strcmp(name,"Closed")==0) return ClosedEnum;
+-	      else if (strcmp(name,"Free")==0) return FreeEnum;
+-	      else if (strcmp(name,"Open")==0) return OpenEnum;
+          else stage=5;
+    }
+    if(stage==5){
+@@ -625,9 +625,6 @@
+ 	      else if (strcmp(name,"CrouzeixRaviart")==0) return CrouzeixRaviartEnum;
+ 	      else if (strcmp(name,"LACrouzeixRaviart")==0) return LACrouzeixRaviartEnum;
+ 	      else if (strcmp(name,"SaveResults")==0) return SaveResultsEnum;
+-	      else if (strcmp(name,"BoolExternalResult")==0) return BoolExternalResultEnum;
+-	      else if (strcmp(name,"DoubleExternalResult")==0) return DoubleExternalResultEnum;
+-	      else if (strcmp(name,"DoubleMatExternalResult")==0) return DoubleMatExternalResultEnum;
+          else stage=6;
+    }
+    if(stage==6){
+@@ -748,9 +745,6 @@
+ 	      else if (strcmp(name,"SeaiceSpcvx")==0) return SeaiceSpcvxEnum;
+ 	      else if (strcmp(name,"SeaiceSpcvy")==0) return SeaiceSpcvyEnum;
+ 	      else if (strcmp(name,"SeaiceCoriolisFactor")==0) return SeaiceCoriolisFactorEnum;
+-	      else if (strcmp(name,"BasalforcingsRhoOcean")==0) return BasalforcingsRhoOceanEnum;
+-	      else if (strcmp(name,"BasalforcingsOceanCoef")==0) return BasalforcingsOceanCoefEnum;
+-	      else if (strcmp(name,"BasalforcingsOceanLinDragCoef")==0) return BasalforcingsOceanLinDragCoefEnum;
+          else stage=7;
+    }
+    if(stage==7){
+Index: ../trunk-jpl/src/c/shared/Elements/elements.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Elements/elements.h	(revision 18716)
++++ ../trunk-jpl/src/c/shared/Elements/elements.h	(revision 18717)
+@@ -12,9 +12,12 @@
+ IssmDouble Arrhenius(IssmDouble temperature,IssmDouble depth,IssmDouble n);
+ IssmDouble LliboutryDuval(IssmDouble enthalpy, IssmDouble pressure, IssmDouble n, IssmDouble betaCC, IssmDouble referencetemperature, IssmDouble heatcapacity, IssmDouble latentheat);
+ // IssmDouble LliboutryDuval(IssmDouble temperature, IssmDouble waterfraction, IssmDouble depth,IssmDouble n);
+-IssmDouble PddSurfaceMassBlance(IssmDouble* monthlytemperatures,  IssmDouble* monthlyprec, IssmDouble* pdds, IssmDouble* pds, 
+-				IssmDouble signorm, IssmDouble yts, IssmDouble h, IssmDouble s,
+-				IssmDouble rho_ice, IssmDouble rho_water, IssmDouble desfac, IssmDouble s0p);
++IssmDouble PddSurfaceMassBlance(IssmDouble* monthlytemperatures,  IssmDouble* monthlyprec,
++				IssmDouble* TemperaturesLgm, IssmDouble* TemperaturesPresentday,
++				IssmDouble* pdds, IssmDouble* pds,IssmDouble signorm, IssmDouble yts,
++				IssmDouble h, IssmDouble s, IssmDouble rho_ice,IssmDouble rho_water, IssmDouble desfac,
++				IssmDouble s0t,IssmDouble s0p, IssmDouble rlaps, IssmDouble rlapslgm,
++				IssmDouble PfacTime,IssmDouble TdiffTime,IssmDouble sealevTime);
+ void ComputeDelta18oTemperaturePrecipitation(IssmDouble Delta18oSurfacePresent, IssmDouble Delta18oSurfaceLgm, IssmDouble Delta18oSurfaceTime,
+ 				     IssmDouble Delta18oPresent, IssmDouble Delta18oLgm, IssmDouble Delta18oTime, 
+ 				     IssmDouble* PrecipitationsPresentday,
+Index: ../trunk-jpl/src/c/shared/Elements/ComputeDelta18oTemperaturePrecipitation.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Elements/ComputeDelta18oTemperaturePrecipitation.cpp	(revision 18716)
++++ ../trunk-jpl/src/c/shared/Elements/ComputeDelta18oTemperaturePrecipitation.cpp	(revision 18717)
+@@ -19,7 +19,7 @@
+   glacialindex = 0.;//(Delta18oTime-Delta18oPresent-delta18oLapseRate*(Delta18oSurfaceTime-Delta18oSurfacePresent))
+   //  /(Delta18oLgm-Delta18oPresent-delta18oLapseRate*(Delta18oSurfaceLgm-Delta18oSurfacePresent));
+ 
+-  for (int imonth = 0; imonth<12; imonth++){  
++  for (int imonth = 0; imonth<12; imonth++){
+     monthlytemperaturestmp[imonth] = glacialindex*TemperaturesLgm[imonth] + (1.-glacialindex)*TemperaturesPresentday[imonth];
+     //monthlyprectmp[imonth] = 1.5*pow(2,((monthlytemperaturestmp[imonth]-273.15-0)/10)); //equation from rob's paper
+     monthlyprectmp[imonth] = PrecipitationsPresentday[imonth];
+Index: ../trunk-jpl/src/c/shared/Elements/PddSurfaceMassBalance.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Elements/PddSurfaceMassBalance.cpp	(revision 18716)
++++ ../trunk-jpl/src/c/shared/Elements/PddSurfaceMassBalance.cpp	(revision 18717)
+@@ -5,7 +5,13 @@
+ #include "./elements.h"
+ #include "../Numerics/numerics.h"
+ 
+-IssmDouble PddSurfaceMassBlance(IssmDouble* monthlytemperatures, IssmDouble* monthlyprec, IssmDouble* pdds, IssmDouble* pds, IssmDouble signorm, IssmDouble yts, IssmDouble h, IssmDouble s, IssmDouble rho_ice, IssmDouble rho_water, IssmDouble desfac, IssmDouble s0p){ 
++IssmDouble PddSurfaceMassBlance(IssmDouble* monthlytemperatures, IssmDouble* monthlyprec, 
++				IssmDouble* TemperaturesLgm, IssmDouble* TemperaturesPresentday,
++				IssmDouble* pdds, IssmDouble* pds, IssmDouble signorm, 
++				IssmDouble yts, IssmDouble h, IssmDouble s, IssmDouble rho_ice, 
++				IssmDouble rho_water, IssmDouble desfac, IssmDouble s0t,
++				IssmDouble s0p, IssmDouble rlaps, IssmDouble rlapslgm, 
++				IssmDouble PfacTime,IssmDouble TdiffTime,IssmDouble sealevTime){ 
+ 
+   // output:
+   IssmDouble B;    // surface mass balance, melt+accumulation
+@@ -19,10 +25,14 @@
+   IssmDouble runoff; //meltwater only, does not include rain 
+   IssmDouble sconv; //rhow_rain/rhoi / 12 months
+ 
+-  IssmDouble lapser=6.5, sealev=0.;    // lapse rate. degrees per meter. 7.5 lev's 99 paper, 9 Marshall 99 paper
+-  // IssmDouble desfac = 0.5;                 // desert elevation factor
+-  // IssmDouble s0p=0.;         // should be set to elevation from precip source
+-  IssmDouble s0t=0.;         // should be set to elevation from temperature source
++  //IssmDouble  sealev=0.;         // degrees per meter. 7.5 lev's 99 paper, 9 Marshall 99 paper
++  //IssmDouble  Pfac=0.5,Tdiff=0.5;
++  IssmDouble  rtlaps;
++  // IssmDouble lapser=6.5         // lapse rate
++  // IssmDouble desfac = 0.5;      // desert elevation factor
++  // IssmDouble s0p=0.;            // should be set to elevation from precip source
++  // IssmDouble s0t=0.;         // should be set to elevation from temperature source
++  IssmDouble tdiffh;  
+   IssmDouble st;             // elevation between altitude of the temp record and current altitude
+   IssmDouble sp;             // elevation between altitude of the prec record and current altitude
+ 
+@@ -67,13 +77,18 @@
+   PDup = siglimc+PDCUT;
+ 
+   // seasonal loop
+-    for (iqj = 0; iqj < 12; iqj++){
+-      imonth =  ismon[iqj];
++  for (iqj = 0; iqj < 12; iqj++){
++    imonth =  ismon[iqj];
++    
++    /*********compute lapse rate ****************/
++    st=(s-s0t)/1000.;
++    rtlaps=TdiffTime*rlapslgm + (1.-TdiffTime)*rlaps; // lapse rate
++    
++    /*********compute Surface temperature *******/
++    tdiffh = TdiffTime*( TemperaturesLgm[imonth] - TemperaturesPresentday[imonth] );
++    tstar = tdiffh + TemperaturesPresentday[imonth] - rtlaps *max(st,sealevTime*0.001);
++    Tsurf = tstar*deltm+Tsurf;        
+ 
+-      st=(s-s0t)/1000.;
+-      tstar = monthlytemperatures[imonth] - lapser *max(st,sealev);
+-      Tsurf = tstar*deltm+Tsurf;        
+-
+       /*********compute PD ****************/
+       if (tstar < PDup){
+ 	pd = 1.;
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 18716)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 18717)
+@@ -36,6 +36,10 @@
+ 	IssmDouble  *matrix                     = NULL;
+ 	int          count;
+ 
++	IssmDouble *temp = NULL;
++	IssmDouble  yts;
++	int         N,M;
++
+ 	/*Make sure current dataset is empty*/
+ 	_assert_(parameters->Size()==0); 
+ 
+@@ -103,12 +107,29 @@
+ 			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsIsdelta18oEnum));
+ 			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsDesfacEnum));
+ 			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsS0pEnum));
++			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsS0tEnum));
++			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsRlapsEnum));
++			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsRlapslgmEnum));
+ 			iomodel->Constant(&isdelta18o,SurfaceforcingsIsdelta18oEnum);
++
++			iomodel->FetchData(&temp,&N,&M,SurfaceforcingsPfacEnum); _assert_(N==2);
++			for(i=0;i<M;i++) temp[M+i]=temp[M+i];
++			parameters->AddObject(new TransientParam(SurfaceforcingsPfacEnum,&temp[0],&temp[M],M));
++			iomodel->DeleteData(temp,SurfaceforcingsPfacEnum);
++			
++			iomodel->FetchData(&temp,&N,&M,SurfaceforcingsTdiffEnum); _assert_(N==2);
++			for(i=0;i<M;i++) temp[M+i]=temp[M+i];
++			parameters->AddObject(new TransientParam(SurfaceforcingsTdiffEnum,&temp[0],&temp[M],M));
++			iomodel->DeleteData(temp,SurfaceforcingsTdiffEnum);
++
++			iomodel->FetchData(&temp,&N,&M,SurfaceforcingsSealevEnum); _assert_(N==2);
++			for(i=0;i<M;i++) temp[M+i]=temp[M+i];
++			parameters->AddObject(new TransientParam(SurfaceforcingsSealevEnum,&temp[0],&temp[M],M));
++			iomodel->DeleteData(temp,SurfaceforcingsSealevEnum);
++
+ 			if(isdelta18o){
+-				IssmDouble *temp = NULL;
+-				IssmDouble  yts;
+-				int         N,M;
+ 				iomodel->Constant(&yts,ConstantsYtsEnum);
++
+ 				iomodel->FetchData(&temp,&N,&M,SurfaceforcingsDelta18oEnum); _assert_(N==2);
+ 				for(i=0;i<M;i++) temp[M+i]=yts*temp[M+i];
+ 				parameters->AddObject(new TransientParam(SurfaceforcingsDelta18oEnum,&temp[0],&temp[M],M));
+Index: ../trunk-jpl/src/c/classes/Materials/Matpar.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 18716)
++++ ../trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 18717)
+@@ -51,6 +51,9 @@
+ 				case SMBpddEnum:
+ 					iomodel->Constant(&this->desfac,SurfaceforcingsDesfacEnum);
+ 					iomodel->Constant(&this->s0p,SurfaceforcingsS0pEnum);
++					iomodel->Constant(&this->s0t,SurfaceforcingsS0tEnum);
++					iomodel->Constant(&this->rlaps,SurfaceforcingsRlapsEnum);
++					iomodel->Constant(&this->rlapslgm,SurfaceforcingsRlapslgmEnum);
+ 					break;
+ 				case SMBgradientsEnum:
+ 					/*Nothing to add*/
+@@ -141,6 +144,9 @@
+ 	_printf_("   g: " << g << "\n");
+ 	_printf_("   desfac: " << desfac << "\n");
+ 	_printf_("   s0p: " << s0p << "\n");
++	_printf_("   s0t: " << s0t << "\n");
++	_printf_("   rlaps: " << rlaps << "\n");
++	_printf_("   rlapslgm: " << rlapslgm << "\n");
+ 	return;
+ }
+ /*}}}*/
+@@ -183,6 +189,9 @@
+ 	matpar->g=this->g;
+ 	matpar->desfac=this->desfac;
+ 	matpar->s0p=this->s0p;
++	matpar->s0t=this->s0t;
++	matpar->rlaps=this->rlaps;
++	matpar->rlapslgm=this->rlapslgm;
+ 
+ 	matpar->sediment_compressibility=this->sediment_compressibility;
+ 	matpar->sediment_porosity=this->sediment_porosity;
+@@ -269,6 +278,15 @@
+ 		case SurfaceforcingsS0pEnum:
+ 			this->s0p=constant;
+ 			break;
++		case SurfaceforcingsS0tEnum:
++			this->s0t=constant;
++			break;
++		case SurfaceforcingsRlapsEnum:
++			this->rlaps=constant;
++			break;
++		case SurfaceforcingsRlapslgmEnum:
++			this->rlapslgm=constant;
++			break;
+ 		default: 
+ 			break;
+ 	}
+@@ -366,6 +384,18 @@
+ 	return s0p;
+ }
+ /*}}}*/
++IssmDouble Matpar::GetS0t(){/*{{{*/
++	return s0t;
++}
++/*}}}*/
++IssmDouble Matpar::GetRlaps(){/*{{{*/
++	return rlaps;
++}
++/*}}}*/
++IssmDouble Matpar::GetRlapslgm(){/*{{{*/
++	return rlapslgm;
++}
++/*}}}*/
+ IssmDouble Matpar::TMeltingPoint(IssmDouble pressure){/*{{{*/
+ 	return meltingpoint-beta*pressure;
+ }
+Index: ../trunk-jpl/src/c/classes/Materials/Matpar.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Matpar.h	(revision 18716)
++++ ../trunk-jpl/src/c/classes/Materials/Matpar.h	(revision 18717)
+@@ -32,6 +32,9 @@
+ 		IssmDouble  omega;
+ 		IssmDouble  desfac;
+ 		IssmDouble  s0p;
++		IssmDouble  s0t;
++		IssmDouble  rlaps;
++		IssmDouble  rlapslgm;
+ 
+ 		/*hydrology Dual Porous Continuum: */	 
+ 		IssmDouble  sediment_compressibility;
+@@ -124,6 +127,9 @@
+ 		void       ThermalToEnthalpy(IssmDouble* penthalpy,IssmDouble temperature,IssmDouble waterfraction,IssmDouble pressure);
+ 		IssmDouble GetDesFac();
+ 		IssmDouble GetS0p(); 
++		IssmDouble GetS0t(); 
++		IssmDouble GetRlaps(); 
++		IssmDouble GetRlapslgm(); 
+ 		IssmDouble GetMaterialParameter(int in_enum); 
+ 		/*}}}*/
+ 
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18716)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18717)
+@@ -1720,12 +1720,16 @@
+ 
+    IssmDouble agd[NUMVERTICES];             // surface mass balance
+    IssmDouble monthlytemperatures[NUMVERTICES][12],monthlyprec[NUMVERTICES][12];
++   IssmDouble TemperaturesPresentday[NUMVERTICES][12],TemperaturesLgm[NUMVERTICES][12];
+    IssmDouble h[NUMVERTICES],s[NUMVERTICES];
+-   IssmDouble rho_water,rho_ice,desfac,s0p;
++   IssmDouble rho_water,rho_ice,desfac,s0p,s0t,rlaps,rlapslgm;
++   IssmDouble PfacTime,TdiffTime,sealevTime;
+ 
+-   /*Recover monthly temperatures and precipitation*/
++   /*Recover monthly temperatures and precipitation and Present day and LGm ones*/
+    Input*     input=inputs->GetInput(SurfaceforcingsMonthlytemperaturesEnum); _assert_(input);
+    Input*     input2=inputs->GetInput(SurfaceforcingsPrecipitationEnum); _assert_(input2);
++   Input*     input3=inputs->GetInput(SurfaceforcingsTemperaturesPresentdayEnum);    _assert_(input3);
++   Input*     input4=inputs->GetInput(SurfaceforcingsTemperaturesLgmEnum);          _assert_(input4);
+    GaussTria* gauss=new GaussTria();
+    IssmDouble time,yts;
+    this->parameters->FindParam(&time,TimeEnum);
+@@ -1737,9 +1741,18 @@
+        monthlytemperatures[iv][month]=monthlytemperatures[iv][month]-273.15; // conversion from Kelvin to celcius
+        input2->GetInputValue(&monthlyprec[iv][month],gauss,time+month/12.*yts);
+        monthlyprec[iv][month]=monthlyprec[iv][month]*yts; // convertion in m/y
++       input3->GetInputValue(&TemperaturesPresentday[iv][month],gauss,month/12.*yts);
++       TemperaturesPresentday[iv][month]=TemperaturesPresentday[iv][month]-273.15; // conversion from Kelvin to celcius
++       input4->GetInputValue(&TemperaturesLgm[iv][month],gauss,month/12.*yts);
++       TemperaturesLgm[iv][month]=TemperaturesLgm[iv][month]-273.15; // conversion from Kelvin to celcius
+      }
+    }
+ 
++  /*Recover Pfac, Tdiff and sealev at time t:*/
++  this->parameters->FindParam(&PfacTime,SurfaceforcingsPfacEnum,time);
++  this->parameters->FindParam(&TdiffTime,SurfaceforcingsTdiffEnum,time);
++  this->parameters->FindParam(&sealevTime,SurfaceforcingsSealevEnum,time);
++
+   /*Recover info at the vertices: */
+   GetInputListOnVertices(&h[0],ThicknessEnum);
+   GetInputListOnVertices(&s[0],SurfaceEnum);
+@@ -1748,13 +1761,19 @@
+   rho_ice=matpar->GetRhoIce();
+   rho_water=matpar->GetRhoFreshwater();
+ 
+-  /*Get desertification effect parameters*/
++  /*Get other pdd parameters*/
+   desfac=matpar->GetDesFac();
+   s0p=matpar->GetS0p();
+-
++  s0t=matpar->GetS0t();
++  rlaps=matpar->GetRlaps();
++  rlapslgm=matpar->GetRlapslgm();
++     
+    /*measure the surface mass balance*/
+    for (int iv = 0; iv<NUMVERTICES; iv++){
+-     agd[iv]=PddSurfaceMassBlance(&monthlytemperatures[iv][0], &monthlyprec[iv][0], pdds, pds, signorm, yts, h[iv], s[iv], rho_ice, rho_water, desfac, s0p);
++     agd[iv]=PddSurfaceMassBlance(&monthlytemperatures[iv][0], &monthlyprec[iv][0],
++				  &TemperaturesLgm[iv][0], &TemperaturesPresentday[iv][0], 
++				  pdds, pds, signorm, yts, h[iv], s[iv], rho_ice, rho_water, 
++				  desfac, s0t, s0p,rlaps,rlapslgm,PfacTime,TdiffTime,sealevTime);
+    }
+ 
+    /*Update inputs*/    
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18716)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18717)
+@@ -1915,12 +1915,16 @@
+ 
+    IssmDouble agd[NUMVERTICES];             // surface mass balance
+    IssmDouble monthlytemperatures[NUMVERTICES][12],monthlyprec[NUMVERTICES][12];
+-   IssmDouble h[NUMVERTICES],s[NUMVERTICES]; // ,b
+-   IssmDouble rho_water,rho_ice,desfac,s0p;
++   IssmDouble TemperaturesPresentday[NUMVERTICES][12],TemperaturesLgm[NUMVERTICES][12];
++   IssmDouble h[NUMVERTICES],s[NUMVERTICES];
++   IssmDouble rho_water,rho_ice,desfac,s0p,s0t,rlaps,rlapslgm;
++   IssmDouble PfacTime,TdiffTime,sealevTime;
+ 
+    /*Recover monthly temperatures and precipitation*/
+    Input*     input=inputs->GetInput(SurfaceforcingsMonthlytemperaturesEnum); _assert_(input);
+    Input*     input2=inputs->GetInput(SurfaceforcingsPrecipitationEnum); _assert_(input2);
++   Input*     input3=inputs->GetInput(SurfaceforcingsTemperaturesPresentdayEnum);  _assert_(input3);
++   Input*     input4=inputs->GetInput(SurfaceforcingsTemperaturesLgmEnum);   _assert_(input4);
+    GaussPenta* gauss=new GaussPenta();
+    IssmDouble time,yts;
+    this->parameters->FindParam(&time,TimeEnum);
+@@ -1932,9 +1936,18 @@
+        monthlytemperatures[iv][month]=monthlytemperatures[iv][month]-273.15; // conversion from Kelvin to celcius
+        input2->GetInputValue(&monthlyprec[iv][month],gauss,time+month/12.*yts);
+        monthlyprec[iv][month]=monthlyprec[iv][month]*yts; // convertion to m/yr
++       input3->GetInputValue(&TemperaturesPresentday[iv][month],gauss,month/12.*yts);
++       TemperaturesPresentday[iv][month]=TemperaturesPresentday[iv][month]-273.15; // conversion from Kelvin to celcius
++       input4->GetInputValue(&TemperaturesLgm[iv][month],gauss,month/12.*yts);
++       TemperaturesLgm[iv][month]=TemperaturesLgm[iv][month]-273.15; // conversion from Kelvin to celcius
+      }
+    } 
+ 
++  /*Recover Pfac, Tdiff and sealev at time t:*/
++  this->parameters->FindParam(&PfacTime,SurfaceforcingsPfacEnum,time);
++  this->parameters->FindParam(&TdiffTime,SurfaceforcingsTdiffEnum,time);
++  this->parameters->FindParam(&sealevTime,SurfaceforcingsSealevEnum,time);
++
+   /*Recover info at the vertices: */
+   GetInputListOnVertices(&h[0],ThicknessEnum);
+   GetInputListOnVertices(&s[0],SurfaceEnum);
+@@ -1943,14 +1956,19 @@
+   rho_ice=matpar->GetRhoIce();
+   rho_water=matpar->GetRhoFreshwater();
+ 
+-  /*Get desertification effect parameters*/
++  /*Get other pdd parameters*/
+   desfac=matpar->GetDesFac();
+   s0p=matpar->GetS0p();
++  s0t=matpar->GetS0t();
++  rlaps=matpar->GetRlaps();
++  rlapslgm=matpar->GetRlapslgm();
+ 
+    /*measure the surface mass balance*/
+    for (int iv = 0; iv < NUMVERTICES; iv++){
+-     agd[iv]=PddSurfaceMassBlance(&monthlytemperatures[iv][0], &monthlyprec[iv][0], pdds, pds, 
+-				  signorm, yts, h[iv], s[iv], rho_ice, rho_water, desfac, s0p);
++     agd[iv]=PddSurfaceMassBlance(&monthlytemperatures[iv][0], &monthlyprec[iv][0],  
++				  &TemperaturesLgm[iv][0], &TemperaturesPresentday[iv][0], 
++				  pdds,pds, signorm, yts, h[iv], s[iv], rho_ice, rho_water,
++				  desfac, s0t, s0p,rlaps,rlapslgm,PfacTime,TdiffTime,sealevTime);
+    }
+ 
+    /*Update inputs*/    
+Index: ../trunk-jpl/src/m/classes/SMBpdd.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBpdd.m	(revision 18716)
++++ ../trunk-jpl/src/m/classes/SMBpdd.m	(revision 18717)
+@@ -9,6 +9,12 @@
+ 		monthlytemperatures       = NaN;
+ 		desfac                    = 0.5;
+ 		s0p                       = 0;
++		s0t                       = 0;
++                rlaps                     = 6.5;
++                rlapslgm                  = 6.5;                
++                Pfac                      = NaN;
++                Tdiff                     = NaN;
++                sealev                    = NaN;
+ 		isdelta18o                = 0;
+ 		delta18o                  = NaN;
+ 		delta18o_surface          = NaN;
+@@ -48,12 +54,22 @@
+ 		  obj.isdelta18o = 0;
+ 		  obj.desfac     = 0.5;
+ 		  obj.s0p        = 0;
++		  obj.s0t        = 0;
++		  obj.rlaps      = 6.5;
++		  obj.rlapslgm   = 6.5;
++                  
+ 		end % }}}
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+ 
+ 			if ismember(MasstransportAnalysisEnum(),analyses),
+ 				md = checkfield(md,'fieldname','surfaceforcings.desfac','<=',1,'numel',1);
+ 				md = checkfield(md,'fieldname','surfaceforcings.s0p','>=',0,'numel',1);
++				md = checkfield(md,'fieldname','surfaceforcings.s0t','>=',0,'numel',1);
++				md = checkfield(md,'fieldname','surfaceforcings.rlaps','>=',0,'numel',1);
++				md = checkfield(md,'fieldname','surfaceforcings.rlapslgm','>=',0,'numel',1);
++                                md = checkfield(md,'fieldname','surfaceforcings.Pfac','NaN',1);
++                                md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1);
++                                md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1);
+ 				if(obj.isdelta18o==0)
+ 					md = checkfield(md,'fieldname','surfaceforcings.monthlytemperatures','forcing',1,'NaN',1);
+ 					md = checkfield(md,'fieldname','surfaceforcings.precipitation','forcing',1,'NaN',1);
+@@ -73,7 +89,13 @@
+ 			fielddisplay(obj,'isdelta18o','is temperature and precipitation delta18o parametrisation activated (0 or 1, default is 0)');
+ 			fielddisplay(obj,'desfac','desertification elevation factor (between 0 and 1, default is 0.5) [m]');
+ 			fielddisplay(obj,'s0p','should be set to elevation from precip source (between 0 and a few 1000s m, default is 0) [m]');
+-			fielddisplay(obj,'monthlytemperatures','monthly surface temperatures [K], required if pdd is activated and delta18o not activated');
++			fielddisplay(obj,'s0t','should be set to elevation from temperature source (between 0 and a few 1000s m, default is 0) [m]');
++			fielddisplay(obj,'rlaps','present day lapse rate [degree/km]');
++			fielddisplay(obj,'rlapslgm','LGM lapse rate [degree/km]');
++			fielddisplay(obj,'Pfac','time interpolation parameter for precipitation, 1D(year)');
++			fielddisplay(obj,'Tdiff','time interpolation parameter for temperature, 1D(year)');
++			fielddisplay(obj,'sealev','sea level [m], 1D(year)');
++                        fielddisplay(obj,'monthlytemperatures','monthly surface temperatures [K], required if pdd is activated and delta18o not activated');
+ 			fielddisplay(obj,'precipitation','surface precipitation [m/yr water eq]');
+ 			fielddisplay(obj,'temperatures_presentday','monthly present day surface temperatures [K], required if pdd is activated and delta18o activated');
+ 			fielddisplay(obj,'temperatures_lgm','monthly LGM surface temperatures [K], required if pdd is activated and delta18o activated');
+@@ -91,6 +113,12 @@
+ 			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+ 			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','desfac','format','Double');
+ 			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','s0p','format','Double');
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','s0t','format','Double');
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','rlaps','format','Double');
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','rlapslgm','format','Double');
++                        WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Pfac','format','DoubleMat','mattype',1);
++                        WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1);
++                        WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1);
+ 			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','isdelta18o','format','Boolean');
+ 			if obj.isdelta18o
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1);
+Index: ../trunk-jpl/src/m/classes/clusters/acenet.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/acenet.m	(revision 18716)
++++ ../trunk-jpl/src/m/classes/clusters/acenet.m	(revision 18717)
+@@ -8,8 +8,8 @@
+ classdef acenet
+     properties (SetAccess=public) 
+ 		 % {{{
+-		 name='glacdyn.ace-net.ca'
+-		 %name='placentia.ace-net.ca'
++		 %name='glacdyn.ace-net.ca'
++		 name='placentia.ace-net.ca'
+ 		 %name='brasdor.ace-net.ca'
+ 		 login='klemorza';
+ 		 np=10;
+@@ -18,7 +18,9 @@
+ 		 time=10;
+ 		 % codepath='/usr/local/issm-r11321/bin'; % this one is for issm on acenet global
+ 		 codepath='/home/klemorza/issm/trunk-jpl/bin'; % this one is for issm on my acenet directory
+-		 executionpath='/home/klemorza/issm/trunk-jpl/execution';
++		 %executionpath='/home/klemorza/issm/trunk-jpl/execution';
++		 %executionpath='/home/klemorza/scratch/issmres.dir';
++		 executionpath='/net/glacdyn-data/glacdyn/1/klemorza/issm.dir';
+ 		 %}}}
+ 	 end
+ 	 methods
+@@ -49,7 +51,7 @@
+ 		 function md = checkconsistency(cluster,md,solution,analyses) % {{{
+ 
+ 			 available_queues={'debug','shortq','longq'};
+-			 queue_requirements_time=[60*1 60*3 60*17];
++			 queue_requirements_time=[48*1 48*2 48*5];
+ 			 queue_requirements_np=[32 128 256];
+ 
+ 			 QueueRequirements(available_queues,queue_requirements_time,queue_requirements_np,cluster.queue,cluster.np,cluster.time)
+@@ -65,17 +67,32 @@
+ 			 fprintf(fid,'#!/bin/bash\n');
+ 			 fprintf(fid,'#$ -cwd\n');
+           fprintf(fid,'#$ -N issm\n');
+-          fprintf(fid,'#$ -l h_rt=96:0:0\n');
++          %fprintf(fid,'#$ -l h_rt=25:00:0\n');
++          %fprintf(fid,'#$ -l h_rt=47:59:00\n');
++          %fprintf(fid,'#$ -l h_rt=72:00:0\n');
++          fprintf(fid,'#$ -l h_rt=96:00:0\n');
++	  fprintf(fid,'#$ -l h_vmem=4G\n');
+           fprintf(fid,'#$ -pe ompi* %i\n',cluster.np);
+           fprintf(fid,'#$ -j y\n');
++          fprintf(fid,'#$ -l h=cl27*|cl28*|cl29*|cl30*|cl31*|cl320|cl267|cl268|cl269|cl338 \n');
++          %fprintf(fid,'#$ -l h=cl338 \n');
++          %fprintf(fid,'#$ -pe openmp 20 \n');
++          %fprintf(fid,'#$ -q !tarasov.q\n'); %
++          fprintf(fid,'#$ -pe openmp 8\n');
+           fprintf(fid,'module purge\n');
+-          fprintf(fid,'module load gcc openmpi/gcc\n');
+-          fprintf(fid,'module load issm\n');
+-			 fprintf(fid,'export ISSM_DIR="%s/../"\n',cluster.codepath); %FIXME
+-			 fprintf(fid,'source $ISSM_DIR/etc/environment.sh\n');       %FIXME
++          %fprintf(fid,'module load gcc openmpi/gcc\n');
++          %fprintf(fid,'module unload openmpi\n');
++          fprintf(fid,'module load intel/12.1.7.367\n');
++          fprintf(fid,'module load openmpi/intel/1.2.9\n');
++
++          fprintf(fid,'module load gsl\n');
++          %fprintf(fid,'module load issm\n');
++          fprintf(fid,'export ISSM_DIR="%s/../"\n',cluster.codepath); %FIXME
++          fprintf(fid,'source $ISSM_DIR/etc/environment.sh\n');       %FIXME
+           fprintf(fid,'\n');
+-          fprintf(fid,'mpiexec -np %i %s/issm.exe %s %s %s 2> %s.errlog >%s.outlog ',...
+-                   cluster.np,cluster.codepath,EnumToString(solution),[cluster.executionpath '/' dirname],modelname,modelname,modelname);
++          fprintf(fid,'mpiexec %s/issm.exe %s %s %s 2> %s.errlog >%s.outlog\n',...
++                   cluster.codepath,EnumToString(solution),[cluster.executionpath '/' dirname],modelname,modelname,modelname);
++          %fprintf(fid,'echo $HOSTNAME >>%s.outlog',modelname);
+ 			 fclose(fid);
+ 
+ 		 end
+@@ -94,7 +111,7 @@
+ 
+ 			 disp('launching solution sequence on remote cluster');
+ 			 launchcommand=['cd ' cluster.executionpath ' && rm -rf ./' dirname ' && mkdir ' dirname ...
+-				 ' && cd ' dirname ' && mv ../' dirname '.tar.gz ./ && tar -zxf ' dirname '.tar.gz  && qsub ' modelname '.queue '];
++				 ' && cd ' dirname ' && mv ../' dirname '.tar.gz ./ && tar -zxf ' dirname '.tar.gz && qsub ' modelname '.queue '];
+ 			 issmssh(cluster.name,cluster.login,cluster.port,launchcommand);
+ 		 end %}}}
+ 		 function Download(cluster,dirname,filelist)% {{{
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsTdiffEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsTdiffEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsTdiffEnum.m	(revision 18717)
+@@ -0,0 +1,11 @@
++function macro=SurfaceforcingsTdiffEnum()
++%SURFACEFORCINGSTDIFFENUM - Enum of SurfaceforcingsTdiff
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SurfaceforcingsTdiffEnum()
++
++macro=StringToEnum('SurfaceforcingsTdiff');
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsRlapslgmEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsRlapslgmEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsRlapslgmEnum.m	(revision 18717)
+@@ -0,0 +1,11 @@
++function macro=SurfaceforcingsRlapslgmEnum()
++%SURFACEFORCINGSRLAPSLGMENUM - Enum of SurfaceforcingsRlapslgm
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SurfaceforcingsRlapslgmEnum()
++
++macro=StringToEnum('SurfaceforcingsRlapslgm');
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsRlapsEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsRlapsEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsRlapsEnum.m	(revision 18717)
+@@ -0,0 +1,11 @@
++function macro=SurfaceforcingsRlapsEnum()
++%SURFACEFORCINGSRLAPSENUM - Enum of SurfaceforcingsRlaps
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SurfaceforcingsRlapsEnum()
++
++macro=StringToEnum('SurfaceforcingsRlaps');
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsS0tEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsS0tEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsS0tEnum.m	(revision 18717)
+@@ -0,0 +1,11 @@
++function macro=SurfaceforcingsS0tEnum()
++%SURFACEFORCINGSS0TENUM - Enum of SurfaceforcingsS0t
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SurfaceforcingsS0tEnum()
++
++macro=StringToEnum('SurfaceforcingsS0t');
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsPfacEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsPfacEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsPfacEnum.m	(revision 18717)
+@@ -0,0 +1,11 @@
++function macro=SurfaceforcingsPfacEnum()
++%SURFACEFORCINGSPFACENUM - Enum of SurfaceforcingsPfac
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SurfaceforcingsPfacEnum()
++
++macro=StringToEnum('SurfaceforcingsPfac');
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsSealevEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsSealevEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsSealevEnum.m	(revision 18717)
+@@ -0,0 +1,11 @@
++function macro=SurfaceforcingsSealevEnum()
++%SURFACEFORCINGSSEALEVENUM - Enum of SurfaceforcingsSealev
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SurfaceforcingsSealevEnum()
++
++macro=StringToEnum('SurfaceforcingsSealev');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18716)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18717)
+@@ -328,6 +328,12 @@
+ def SurfaceforcingsPrecipitationEnum(): return StringToEnum("SurfaceforcingsPrecipitation")[0]
+ def SurfaceforcingsDesfacEnum(): return StringToEnum("SurfaceforcingsDesfac")[0]
+ def SurfaceforcingsS0pEnum(): return StringToEnum("SurfaceforcingsS0p")[0]
++def SurfaceforcingsS0tEnum(): return StringToEnum("SurfaceforcingsS0t")[0]
++def SurfaceforcingsRlapsEnum(): return StringToEnum("SurfaceforcingsRlaps")[0]
++def SurfaceforcingsRlapslgmEnum(): return StringToEnum("SurfaceforcingsRlapslgm")[0]
++def SurfaceforcingsPfacEnum(): return StringToEnum("SurfaceforcingsPfac")[0]
++def SurfaceforcingsTdiffEnum(): return StringToEnum("SurfaceforcingsTdiff")[0]
++def SurfaceforcingsSealevEnum(): return StringToEnum("SurfaceforcingsSealev")[0]
+ def SMBgradientsEnum(): return StringToEnum("SMBgradients")[0]
+ def SurfaceforcingsMonthlytemperaturesEnum(): return StringToEnum("SurfaceforcingsMonthlytemperatures")[0]
+ def SurfaceforcingsHrefEnum(): return StringToEnum("SurfaceforcingsHref")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18717-18718.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18717-18718.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18717-18718.diff	(revision 19102)
@@ -0,0 +1,88 @@
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18717)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18718)
+@@ -382,13 +382,16 @@
+ 	      else if (strcmp(name,"BalancevelocitySolution")==0) return BalancevelocitySolutionEnum;
+ 	      else if (strcmp(name,"L2ProjectionEPLAnalysis")==0) return L2ProjectionEPLAnalysisEnum;
+ 	      else if (strcmp(name,"L2ProjectionBaseAnalysis")==0) return L2ProjectionBaseAnalysisEnum;
+-	      else if (strcmp(name,"BedSlopeSolution")==0) return BedSlopeSolutionEnum;
+-	      else if (strcmp(name,"DamageEvolutionSolution")==0) return DamageEvolutionSolutionEnum;
+-	      else if (strcmp(name,"DamageEvolutionAnalysis")==0) return DamageEvolutionAnalysisEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"StressbalanceVerticalAnalysis")==0) return StressbalanceVerticalAnalysisEnum;
++	      if (strcmp(name,"BedSlopeSolution")==0) return BedSlopeSolutionEnum;
++	      else if (strcmp(name,"DamageEvolutionSolution")==0) return DamageEvolutionSolutionEnum;
++	      else if (strcmp(name,"DamageEvolutionAnalysis")==0) return DamageEvolutionAnalysisEnum;
++	      else if (strcmp(name,"StressbalanceAnalysis")==0) return StressbalanceAnalysisEnum;
++	      else if (strcmp(name,"StressbalanceSIAAnalysis")==0) return StressbalanceSIAAnalysisEnum;
++	      else if (strcmp(name,"StressbalanceSolution")==0) return StressbalanceSolutionEnum;
++	      else if (strcmp(name,"StressbalanceVerticalAnalysis")==0) return StressbalanceVerticalAnalysisEnum;
+ 	      else if (strcmp(name,"EnthalpyAnalysis")==0) return EnthalpyAnalysisEnum;
+ 	      else if (strcmp(name,"FlaimAnalysis")==0) return FlaimAnalysisEnum;
+ 	      else if (strcmp(name,"FlaimSolution")==0) return FlaimSolutionEnum;
+@@ -502,13 +505,16 @@
+ 	      else if (strcmp(name,"VertexPId")==0) return VertexPIdEnum;
+ 	      else if (strcmp(name,"VertexSId")==0) return VertexSIdEnum;
+ 	      else if (strcmp(name,"Air")==0) return AirEnum;
+-	      else if (strcmp(name,"Ice")==0) return IceEnum;
+-	      else if (strcmp(name,"Melange")==0) return MelangeEnum;
+-	      else if (strcmp(name,"Water")==0) return WaterEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"Adjointp")==0) return AdjointpEnum;
++	      if (strcmp(name,"Ice")==0) return IceEnum;
++	      else if (strcmp(name,"Melange")==0) return MelangeEnum;
++	      else if (strcmp(name,"Water")==0) return WaterEnum;
++	      else if (strcmp(name,"Closed")==0) return ClosedEnum;
++	      else if (strcmp(name,"Free")==0) return FreeEnum;
++	      else if (strcmp(name,"Open")==0) return OpenEnum;
++	      else if (strcmp(name,"Adjointp")==0) return AdjointpEnum;
+ 	      else if (strcmp(name,"Adjointx")==0) return AdjointxEnum;
+ 	      else if (strcmp(name,"Adjointy")==0) return AdjointyEnum;
+ 	      else if (strcmp(name,"Adjointz")==0) return AdjointzEnum;
+@@ -622,13 +628,16 @@
+ 	      else if (strcmp(name,"LATaylorHood")==0) return LATaylorHoodEnum;
+ 	      else if (strcmp(name,"XTaylorHood")==0) return XTaylorHoodEnum;
+ 	      else if (strcmp(name,"OneLayerP4z")==0) return OneLayerP4zEnum;
+-	      else if (strcmp(name,"CrouzeixRaviart")==0) return CrouzeixRaviartEnum;
+-	      else if (strcmp(name,"LACrouzeixRaviart")==0) return LACrouzeixRaviartEnum;
+-	      else if (strcmp(name,"SaveResults")==0) return SaveResultsEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"IntExternalResult")==0) return IntExternalResultEnum;
++	      if (strcmp(name,"CrouzeixRaviart")==0) return CrouzeixRaviartEnum;
++	      else if (strcmp(name,"LACrouzeixRaviart")==0) return LACrouzeixRaviartEnum;
++	      else if (strcmp(name,"SaveResults")==0) return SaveResultsEnum;
++	      else if (strcmp(name,"BoolExternalResult")==0) return BoolExternalResultEnum;
++	      else if (strcmp(name,"DoubleExternalResult")==0) return DoubleExternalResultEnum;
++	      else if (strcmp(name,"DoubleMatExternalResult")==0) return DoubleMatExternalResultEnum;
++	      else if (strcmp(name,"IntExternalResult")==0) return IntExternalResultEnum;
+ 	      else if (strcmp(name,"J")==0) return JEnum;
+ 	      else if (strcmp(name,"StringExternalResult")==0) return StringExternalResultEnum;
+ 	      else if (strcmp(name,"Step")==0) return StepEnum;
+@@ -742,13 +751,16 @@
+ 	      else if (strcmp(name,"SeaiceMinConcentration")==0) return SeaiceMinConcentrationEnum;
+ 	      else if (strcmp(name,"SeaiceMinThickness")==0) return SeaiceMinThicknessEnum;
+ 	      else if (strcmp(name,"SeaiceMaxThickness")==0) return SeaiceMaxThicknessEnum;
+-	      else if (strcmp(name,"SeaiceSpcvx")==0) return SeaiceSpcvxEnum;
+-	      else if (strcmp(name,"SeaiceSpcvy")==0) return SeaiceSpcvyEnum;
+-	      else if (strcmp(name,"SeaiceCoriolisFactor")==0) return SeaiceCoriolisFactorEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"BasalforcingsOceanQuadDragCoef")==0) return BasalforcingsOceanQuadDragCoefEnum;
++	      if (strcmp(name,"SeaiceSpcvx")==0) return SeaiceSpcvxEnum;
++	      else if (strcmp(name,"SeaiceSpcvy")==0) return SeaiceSpcvyEnum;
++	      else if (strcmp(name,"SeaiceCoriolisFactor")==0) return SeaiceCoriolisFactorEnum;
++	      else if (strcmp(name,"BasalforcingsRhoOcean")==0) return BasalforcingsRhoOceanEnum;
++	      else if (strcmp(name,"BasalforcingsOceanCoef")==0) return BasalforcingsOceanCoefEnum;
++	      else if (strcmp(name,"BasalforcingsOceanLinDragCoef")==0) return BasalforcingsOceanLinDragCoefEnum;
++	      else if (strcmp(name,"BasalforcingsOceanQuadDragCoef")==0) return BasalforcingsOceanQuadDragCoefEnum;
+ 	      else if (strcmp(name,"BasalforcingsOceanTurningAngle")==0) return BasalforcingsOceanTurningAngleEnum;
+ 	      else if (strcmp(name,"BasalforcingsOceanSsh")==0) return BasalforcingsOceanSshEnum;
+ 	      else if (strcmp(name,"BasalforcingsOceanVx")==0) return BasalforcingsOceanVxEnum;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18718-18719.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18718-18719.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18718-18719.diff	(revision 19102)
@@ -0,0 +1,428 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18718)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18719)
+@@ -30,6 +30,7 @@
+ 	bool   isefficientlayer;
+ 	int    hydrology_model;
+ 
++
+ 	/*Now, do we really want DC?*/
+ 	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
+ 	if(hydrology_model!=HydrologydcEnum) return;
+@@ -60,8 +61,8 @@
+ 		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
+ 		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
+ 	}
++}/*}}}*/
+ 
+-}/*}}}*/
+ void HydrologyDCEfficientAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 
+ 	/*Now, do we really want DC?*/
+@@ -97,19 +98,44 @@
+ 	/*Nothing for now*/
+ }/*}}}*/
+ 
++void HydrologyDCEfficientAnalysis::InitZigZagCounter(FemModel* femmodel){/*{{{*/
++	int*   eplzigzag_counter =NULL;
++	
++	eplzigzag_counter=xNewZeroInit<int>(femmodel->nodes->Size());
++	femmodel->parameters->AddObject(new IntVecParam(EplZigZagCounterEnum,eplzigzag_counter,femmodel->nodes->Size()));
++	xDelete<int>(eplzigzag_counter);
++}/*}}}*/
++
++void HydrologyDCEfficientAnalysis::ResetCounter(FemModel* femmodel){/*{{{*/
++
++	int*     eplzigzag_counter=NULL;
++	Element* element=NULL;
++
++	femmodel->parameters->FindParam(&eplzigzag_counter,NULL,EplZigZagCounterEnum);
++	for(int i=0;i<femmodel->nodes->Size();i++){
++
++		eplzigzag_counter[i]=0;
++	}
++	femmodel->parameters->SetParam(eplzigzag_counter,femmodel->nodes->Size(),EplZigZagCounterEnum);
++	xDelete<int>(eplzigzag_counter);
++}/*}}}*/
++
+ /*Finite Element Analysis*/
+ void HydrologyDCEfficientAnalysis::Core(FemModel* femmodel){/*{{{*/
+ 	_error_("not implemented");
+ }/*}}}*/
+-ElementVector* HydrologyDCEfficientAnalysis::CreateDVector(Element* element){/*{{{*/
++
++ ElementVector* HydrologyDCEfficientAnalysis::CreateDVector(Element* element){/*{{{*/
+ 	/*Default, return NULL*/
+ 	return NULL;
+ }/*}}}*/
+-ElementMatrix* HydrologyDCEfficientAnalysis::CreateJacobianMatrix(Element* element){/*{{{*/
++
++ ElementMatrix* HydrologyDCEfficientAnalysis::CreateJacobianMatrix(Element* element){/*{{{*/
+ _error_("Not implemented");
+ }/*}}}*/
+-ElementMatrix* HydrologyDCEfficientAnalysis::CreateKMatrix(Element* element){/*{{{*/
+ 
++ ElementMatrix* HydrologyDCEfficientAnalysis::CreateKMatrix(Element* element){/*{{{*/
++
+ 	/*Intermediaries*/
+ 	bool     active_element;
+ 	int      domaintype;
+@@ -611,14 +637,14 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(dbasis);
+ }/*}}}*/
+-void  HydrologyDCEfficientAnalysis::HydrologyEPLGetMask(Vector<IssmDouble>* vec_mask,Element* element){
++void  HydrologyDCEfficientAnalysis::HydrologyEPLGetMask(Vector<IssmDouble>* vec_mask, int* eplzigzag_counter, Element* element){
+ 
+ 	bool        active_element;
+ 	int         i,j;
+ 	int         domaintype;
+ 	IssmDouble  h_max;
+ 	IssmDouble  sedheadmin;
+-	Element*   basalelement=NULL;
++	Element*    basalelement=NULL;
+ 
+ 	/*Get basal element*/
+ 	element->FindParam(&domaintype,DomainTypeEnum);
+@@ -635,19 +661,22 @@
+ 
+ 	/*Intermediaries*/
+ 
++	int         penalty_lock;
+ 	int         numnodes      =basalelement->GetNumberOfNodes();
+ 	IssmDouble* epl_thickness =xNew<IssmDouble>(numnodes);
+ 	IssmDouble* old_active    =xNew<IssmDouble>(numnodes);
+ 	IssmDouble* sedhead       =xNew<IssmDouble>(numnodes);
+ 	IssmDouble* eplhead       =xNew<IssmDouble>(numnodes);
+ 	IssmDouble* residual      =xNew<IssmDouble>(numnodes);
+-
++	
+ 	IssmDouble init_thick    =basalelement->GetMaterialParameter(HydrologydcEplInitialThicknessEnum);
+ 	IssmDouble colapse_thick =basalelement->GetMaterialParameter(HydrologydcEplColapseThicknessEnum);
+ 
+ 	Input* active_element_input=basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input);
+ 	active_element_input->GetInputValue(&active_element);
+ 
++	basalelement->parameters->FindParam(&penalty_lock,HydrologydcPenaltyLockEnum); 
++
+ 	basalelement-> GetInputListOnVertices(&old_active[0],HydrologydcMaskEplactiveNodeEnum);	
+ 	basalelement-> GetInputListOnVertices(&epl_thickness[0],HydrologydcEplThicknessEnum);	
+ 	basalelement-> GetInputListOnVertices(&sedhead[0],SedimentHeadEnum);
+@@ -661,6 +690,7 @@
+ 	for(i=0;i<numnodes;i++){
+ 		/*Activate EPL if residual is >0 */
+ 		if(residual[i]>0.){
++			if(old_active[i]==0) eplzigzag_counter[basalelement->nodes[i]->Lid()] ++;
+ 			vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+ 		}
+ 
+@@ -669,27 +699,34 @@
+ 			vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+ 			/*If epl thickness gets under 10-3 initial thickness, close the layer*/
+ 			if(epl_thickness[i]<colapse_thick){
+-				vec_mask->SetValue(basalelement->nodes[i]->Sid(),0.,INS_VAL);
+-				epl_thickness[i]=init_thick;
++				eplzigzag_counter[basalelement->nodes[i]->Lid()] ++;
++				if(eplzigzag_counter[basalelement->nodes[i]->Sid()]<penalty_lock |penalty_lock==0){
++					vec_mask->SetValue(basalelement->nodes[i]->Sid(),0.,INS_VAL);
++					epl_thickness[i]=init_thick;
++				}
++				else{
++					vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
++				}
+ 			}
+ 		}
+ 		/*Increase of the efficient system is needed if the epl head reach the maximum value (sediment max value for now)*/
+ 		GetHydrologyDCInefficientHmax(&h_max,basalelement,basalelement->nodes[i]);
+ 
+ 		if(eplhead[i]>=h_max && active_element){
+-
+ 			for(j=0;j<numnodes;j++){
+ 				if(old_active[j]>0.){
+ 					vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+ 				}
+ 				/*Increase of the domain is on the downstream node in term of sediment head*/
+ 				if(sedhead[j] == sedheadmin){
++					if(old_active[i]==0) eplzigzag_counter[basalelement->nodes[j]->Lid()] ++;
+ 					vec_mask->SetValue(basalelement->nodes[j]->Sid(),1.,INS_VAL);
+ 				}
+ 			}
+ 		}
+-		
+ 	}
++	basalelement->AddInput(HydrologydcEplThicknessEnum,epl_thickness,basalelement->GetElementType());
++
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 	xDelete<IssmDouble>(epl_thickness);
+ 	xDelete<IssmDouble>(old_active);
+@@ -722,7 +759,13 @@
+ 	IssmDouble* active   = xNew<IssmDouble>(numnodes);
+ 		
+ 	basalelement->GetInputListOnVertices(&active[0],HydrologydcMaskEplactiveNodeEnum);
++
++	bool active_element;
+ 	
++	Input* 	active_element_input=basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input);		
++	active_element_input->GetInputValue(&active_element);
++
++	
+ 	for(int i=0;i<numnodes;i++) flag+=active[i];
+ 
+ 	if(flag>0.){
+@@ -730,6 +773,12 @@
+ 			active_vec->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+ 		}
+ 	}
++	else if(active_element){
++		/*Checking Stuff*/
++		for(int i=0;i<numnodes;i++){
++			active_vec->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
++		}		
++	}
+ 	else{
+ 		/*Do not do anything: at least one node was active for this element but this element is not solved for*/
+ 	}
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h	(revision 18718)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h	(revision 18719)
+@@ -19,7 +19,9 @@
+ 		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+ 		void CreateLoads(Loads* loads, IoModel* iomodel);
+-
++		void InitZigZagCounter(FemModel* femmodel);
++		void ResetCounter(FemModel* femmodel);
++			
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+ 		ElementVector* CreateDVector(Element* element);
+@@ -37,7 +39,7 @@
+ 		IssmDouble SedimentStoring(Element* element);
+ 		IssmDouble GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* thick_input, Input* base_input);
+ 		IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* thick_input, Input* base_input);
+-		void HydrologyEPLGetMask(Vector<IssmDouble>* vec_mask,Element* element);
++		void HydrologyEPLGetMask(Vector<IssmDouble>* vec_mask, int* eplzigzag_counter, Element* element);
+ 		void HydrologyEPLGetActive(Vector<IssmDouble>* active_vec, Element* element);
+ 		void GetHydrologyDCInefficientHmax(IssmDouble* ph_max,Element* element, Node* innode);
+ 		void ComputeEPLThickness(FemModel* femmodel);
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h	(revision 18718)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h	(revision 18719)
+@@ -40,6 +40,5 @@
+ 		IssmDouble GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* thick_input, Input* base_input);
+ 		IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* thick_input, Input* base_input);
+ 		void ElementizeEplMask(FemModel* femmodel);
+-		void ResetCounter(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18718)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18719)
+@@ -16,7 +16,7 @@
+ 	int         transfer_flag;
+ 	int         penalty_lock;
+ 	int         hydro_maxiter;
+-	int*        elementactive_counter =NULL;
++	/* int*        elementactive_counter =NULL; */
+ 	bool        isefficientlayer;
+ 	IssmDouble  sedimentlimit;
+ 	IssmDouble  penalty_factor;
+@@ -55,12 +55,6 @@
+ 	parameters->AddObject(new DoubleParam(HydrologydcRelTolEnum,rel_tol));
+ 	parameters->AddObject(new IntParam(HydrologydcPenaltyLockEnum,penalty_lock));
+ 	parameters->AddObject(new IntParam(HydrologydcMaxIterEnum,hydro_maxiter));
+-
+-	if(isefficientlayer==1){
+-		elementactive_counter=xNewZeroInit<int>(iomodel->numberofelements);
+-		parameters->AddObject(new IntVecParam(ElementActiveCounterEnum,elementactive_counter,iomodel->numberofelements));
+-		xDelete<int>(elementactive_counter);
+-	}
+ 	
+ }/*}}}*/
+ void HydrologyDCInefficientAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+@@ -103,18 +97,18 @@
+ 	if(isefficientlayer){
+ 		iomodel->FetchDataToInput(elements,HydrologydcMaskEplactiveNodeEnum);
+ 
+-		for(int i=0;i<elements->Size();i++){
+-			Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+-			Input* node_mask_input = element->GetInput(HydrologydcMaskEplactiveNodeEnum); _assert_(node_mask_input);
++		/* for(int i=0;i<elements->Size();i++){ */
++		/* 	Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); */
++		/* 	Input* node_mask_input = element->GetInput(HydrologydcMaskEplactiveNodeEnum); _assert_(node_mask_input); */
+ 			
+-			if(node_mask_input->Max()>0.) {
+-				element_active = true;
+-			}
+-			else{
+-				element_active = false;
+-			}
+-			element->AddInput(new BoolInput(HydrologydcMaskEplactiveEltEnum,element_active));
+-		}
++		/* 	if(node_mask_input->Max()>0.) { */
++		/* 		element_active = true; */
++		/* 	} */
++		/* 	else{ */
++		/* 		element_active = false; */
++		/* 	} */
++		/* 	element->AddInput(new BoolInput(HydrologydcMaskEplactiveEltEnum,element_active)); */
++		/* } */
+ 	}
+ }/*}}}*/
+ void HydrologyDCInefficientAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+@@ -683,50 +677,18 @@
+ void HydrologyDCInefficientAnalysis::ElementizeEplMask(FemModel* femmodel){/*{{{*/
+ 
+ 	bool     element_active;
+-	bool     old_active;
+-	int      penalty_lock;
+-	int*     elementactive_counter=NULL;
+ 	Element* element=NULL;
+ 
+-	femmodel->parameters->FindParam(&elementactive_counter,NULL,ElementActiveCounterEnum);
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+ 		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-		element->parameters->FindParam(&penalty_lock,HydrologydcPenaltyLockEnum);
++			Input* node_mask_input = element->GetInput(HydrologydcMaskEplactiveNodeEnum); _assert_(node_mask_input);
+ 		
+-		Input* node_mask_input = element->GetInput(HydrologydcMaskEplactiveNodeEnum); _assert_(node_mask_input);
+-		Input* old_active_input = element->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(old_active_input);
+-		old_active_input->GetInputValue(&old_active);
+-		
+ 		if(node_mask_input->Max()>0.){
+ 			element_active = true;
+ 		}
+ 		else{
+ 			element_active = false;
+ 		}
+-		if(old_active!=element_active){
+-			elementactive_counter[i]=elementactive_counter[i]+1;
+-		}
+-		if(elementactive_counter[i]>penalty_lock){
+-			element_active = true;
+-		}
+ 		element->AddInput(new BoolInput(HydrologydcMaskEplactiveEltEnum,element_active));
+ 	}
+-	femmodel->parameters->SetParam(elementactive_counter,femmodel->elements->Size(),ElementActiveCounterEnum);
+-	xDelete<int>(elementactive_counter);
+ }/*}}}*/
+-
+-void HydrologyDCInefficientAnalysis::ResetCounter(FemModel* femmodel){/*{{{*/
+-
+-	int*     elementactive_counter=NULL;
+-	Element* element=NULL;
+-	int N;
+-
+-	femmodel->parameters->FindParam(&elementactive_counter,&N,ElementActiveCounterEnum);
+-	for(int i=0;i<femmodel->elements->Size();i++){
+-		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-		
+-		elementactive_counter[i]=0;
+-	}		
+-	femmodel->parameters->SetParam(elementactive_counter,femmodel->elements->Size(),ElementActiveCounterEnum);
+-	xDelete<int>(elementactive_counter);
+-}/*}}}*/
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18718)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18719)
+@@ -108,7 +108,7 @@
+ 	EplHeadOldEnum,
+ 	EplHeadSlopeXEnum,
+ 	EplHeadSlopeYEnum,
+-	ElementActiveCounterEnum,
++	EplZigZagCounterEnum,
+ 	HydrologydcMaxIterEnum,
+ 	HydrologydcRelTolEnum,
+ 	HydrologydcSpcsedimentHeadEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18718)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18719)
+@@ -116,7 +116,7 @@
+ 		case EplHeadOldEnum : return "EplHeadOld";
+ 		case EplHeadSlopeXEnum : return "EplHeadSlopeX";
+ 		case EplHeadSlopeYEnum : return "EplHeadSlopeY";
+-		case ElementActiveCounterEnum : return "ElementActiveCounter";
++		case EplZigZagCounterEnum : return "EplZigZagCounter";
+ 		case HydrologydcMaxIterEnum : return "HydrologydcMaxIter";
+ 		case HydrologydcRelTolEnum : return "HydrologydcRelTol";
+ 		case HydrologydcSpcsedimentHeadEnum : return "HydrologydcSpcsedimentHead";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18718)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18719)
+@@ -116,7 +116,7 @@
+ 	      else if (strcmp(name,"EplHeadOld")==0) return EplHeadOldEnum;
+ 	      else if (strcmp(name,"EplHeadSlopeX")==0) return EplHeadSlopeXEnum;
+ 	      else if (strcmp(name,"EplHeadSlopeY")==0) return EplHeadSlopeYEnum;
+-	      else if (strcmp(name,"ElementActiveCounter")==0) return ElementActiveCounterEnum;
++	      else if (strcmp(name,"EplZigZagCounter")==0) return EplZigZagCounterEnum;
+ 	      else if (strcmp(name,"HydrologydcMaxIter")==0) return HydrologydcMaxIterEnum;
+ 	      else if (strcmp(name,"HydrologydcRelTol")==0) return HydrologydcRelTolEnum;
+ 	      else if (strcmp(name,"HydrologydcSpcsedimentHead")==0) return HydrologydcSpcsedimentHeadEnum;
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp	(revision 18718)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp	(revision 18719)
+@@ -68,6 +68,7 @@
+ 		GetSolutionFromInputsx(&ug_epl,femmodel);
+ 		/*Initialize the element mask*/
+ 		inefanalysis->ElementizeEplMask(femmodel);
++		effanalysis->InitZigZagCounter(femmodel);
+ 	}
+ 	/*The real computation starts here, outermost loop is on the two layer system*/
+ 	for(;;){
+@@ -221,7 +222,7 @@
+ 					if(VerboseSolution()) _printf0_("eplconverged...\n");
+ 					InputUpdateFromConstantx(femmodel,eplconverged,ConvergedEnum);
+ 					InputUpdateFromSolutionx(femmodel,ug_epl);
+-					inefanalysis->ResetCounter(femmodel);
++					effanalysis->ResetCounter(femmodel);
+ 					break;
+ 				}
+ 			}
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18718)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18719)
+@@ -1808,23 +1808,27 @@
+ #endif
+ void FemModel::HydrologyEPLupdateDomainx(void){ /*{{{*/
+ 
+-	Vector<IssmDouble>* mask          = NULL;
+-	IssmDouble*         serial_mask   = NULL;
+-	Vector<IssmDouble>* active        = NULL;
+-	IssmDouble*         serial_active = NULL;
+-	
++	Vector<IssmDouble>* mask							= NULL;
++	IssmDouble*         serial_mask				= NULL;
++	Vector<IssmDouble>* active						= NULL;
++	IssmDouble*         serial_active			= NULL;
++	int*                eplzigzag_counter =	NULL;
++		
+ 	HydrologyDCEfficientAnalysis* effanalysis =  new HydrologyDCEfficientAnalysis();
+ 	/*Step 1: update mask, the mask might be extended by residual and/or using downstream sediment head*/
+-	mask=new Vector<IssmDouble>(nodes->NumberOfNodes(HydrologyDCEfficientAnalysisEnum));
++	mask=new Vector<IssmDouble>(this->nodes->NumberOfNodes(HydrologyDCEfficientAnalysisEnum));
++	this->parameters->FindParam(&eplzigzag_counter,NULL,EplZigZagCounterEnum); 
+ 
+ 	for (int i=0;i<elements->Size();i++){
+ 		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+-		effanalysis->HydrologyEPLGetMask(mask,element);
++		effanalysis->HydrologyEPLGetMask(mask,eplzigzag_counter,element);
+ 	}
+-
++	printf("POINTER = %p\n",eplzigzag_counter);
++	this->parameters->SetParam(eplzigzag_counter,this->nodes->Size(),EplZigZagCounterEnum);
+ 	/*Assemble and serialize*/
+ 	mask->Assemble();
+ 	serial_mask=mask->ToMPISerial();
++	xDelete<int>(eplzigzag_counter);
+ 	delete mask;
+ 
+ 	/*Update Mask*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18719-18720.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18719-18720.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18719-18720.diff	(revision 19102)
@@ -0,0 +1,45 @@
+Index: ../trunk-jpl/src/m/enum/ElementActiveCounterEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/ElementActiveCounterEnum.m	(revision 18719)
++++ ../trunk-jpl/src/m/enum/ElementActiveCounterEnum.m	(revision 18720)
+@@ -1,11 +0,0 @@
+-function macro=ElementActiveCounterEnum()
+-%ELEMENTACTIVECOUNTERENUM - Enum of ElementActiveCounter
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=ElementActiveCounterEnum()
+-
+-macro=StringToEnum('ElementActiveCounter');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18719)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18720)
+@@ -108,7 +108,7 @@
+ def EplHeadOldEnum(): return StringToEnum("EplHeadOld")[0]
+ def EplHeadSlopeXEnum(): return StringToEnum("EplHeadSlopeX")[0]
+ def EplHeadSlopeYEnum(): return StringToEnum("EplHeadSlopeY")[0]
+-def ElementActiveCounterEnum(): return StringToEnum("ElementActiveCounter")[0]
++def EplZigZagCounterEnum(): return StringToEnum("EplZigZagCounter")[0]
+ def HydrologydcMaxIterEnum(): return StringToEnum("HydrologydcMaxIter")[0]
+ def HydrologydcRelTolEnum(): return StringToEnum("HydrologydcRelTol")[0]
+ def HydrologydcSpcsedimentHeadEnum(): return StringToEnum("HydrologydcSpcsedimentHead")[0]
+Index: ../trunk-jpl/src/m/enum/EplZigZagCounterEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/EplZigZagCounterEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/EplZigZagCounterEnum.m	(revision 18720)
+@@ -0,0 +1,11 @@
++function macro=EplZigZagCounterEnum()
++%EPLZIGZAGCOUNTERENUM - Enum of EplZigZagCounter
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=EplZigZagCounterEnum()
++
++macro=StringToEnum('EplZigZagCounter');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18720-18721.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18720-18721.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18720-18721.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18720)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18721)
+@@ -1823,7 +1823,6 @@
+ 		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		effanalysis->HydrologyEPLGetMask(mask,eplzigzag_counter,element);
+ 	}
+-	printf("POINTER = %p\n",eplzigzag_counter);
+ 	this->parameters->SetParam(eplzigzag_counter,this->nodes->Size(),EplZigZagCounterEnum);
+ 	/*Assemble and serialize*/
+ 	mask->Assemble();
Index: /issm/oecreview/Archive/18296-19100/ISSM-18721-18722.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18721-18722.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18721-18722.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18721)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18722)
+@@ -719,7 +719,7 @@
+ 				}
+ 				/*Increase of the domain is on the downstream node in term of sediment head*/
+ 				if(sedhead[j] == sedheadmin){
+-					if(old_active[i]==0) eplzigzag_counter[basalelement->nodes[j]->Lid()] ++;
++					if(old_active[j]==0) eplzigzag_counter[basalelement->nodes[j]->Lid()] ++;
+ 					vec_mask->SetValue(basalelement->nodes[j]->Sid(),1.,INS_VAL);
+ 				}
+ 			}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18722-18723.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18722-18723.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18722-18723.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18722)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18723)
+@@ -700,7 +700,7 @@
+ 			/*If epl thickness gets under 10-3 initial thickness, close the layer*/
+ 			if(epl_thickness[i]<colapse_thick){
+ 				eplzigzag_counter[basalelement->nodes[i]->Lid()] ++;
+-				if(eplzigzag_counter[basalelement->nodes[i]->Sid()]<penalty_lock |penalty_lock==0){
++				if(eplzigzag_counter[basalelement->nodes[i]->Lid()]<penalty_lock |penalty_lock==0){
+ 					vec_mask->SetValue(basalelement->nodes[i]->Sid(),0.,INS_VAL);
+ 					epl_thickness[i]=init_thick;
+ 				}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18723-18724.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18723-18724.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18723-18724.diff	(revision 19102)
@@ -0,0 +1,68 @@
+Index: ../trunk-jpl/test/NightlyRun/test236.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test236.m	(revision 18723)
++++ ../trunk-jpl/test/NightlyRun/test236.m	(revision 18724)
+@@ -43,6 +43,10 @@
+ md.timestepping.time_step=20;
+ md.timestepping.final_time=60;
+ 
++md.surfaceforcings.Pfac=[1;1];
++md.surfaceforcings.Tdiff=[1;1];
++md.surfaceforcings.sealev=[1;1];
++
+ % 
+ md.transient.requested_outputs={'default','SurfaceforcingsMonthlytemperatures'};
+ md=setflowequation(md,'SSA','all');
+Index: ../trunk-jpl/test/NightlyRun/test237.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test237.m	(revision 18723)
++++ ../trunk-jpl/test/NightlyRun/test237.m	(revision 18724)
+@@ -40,6 +40,10 @@
+     md.surfaceforcings.precipitations_presentday(md.mesh.numberofvertices+1,imonth+1)=((imonth+1)/12);
+ end
+ 
++md.surfaceforcings.Pfac=[1;1];
++md.surfaceforcings.Tdiff=[1;1];
++md.surfaceforcings.sealev=[1;1];
++
+ % time steps and resolution
+ md.timestepping.time_step=20;
+ md.settings.output_frequency=1;
+Index: ../trunk-jpl/src/m/classes/SMBpdd.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBpdd.m	(revision 18723)
++++ ../trunk-jpl/src/m/classes/SMBpdd.m	(revision 18724)
+@@ -7,14 +7,14 @@
+ 	properties (SetAccess=public) 
+ 		precipitation             = NaN;
+ 		monthlytemperatures       = NaN;
+-		desfac                    = 0.5;
++		desfac                    = 0;
+ 		s0p                       = 0;
+ 		s0t                       = 0;
+-                rlaps                     = 6.5;
+-                rlapslgm                  = 6.5;                
+-                Pfac                      = NaN;
+-                Tdiff                     = NaN;
+-                sealev                    = NaN;
++      rlaps                     = 0;
++      rlapslgm                  = 0;                
++      Pfac                      = NaN;
++      Tdiff                     = NaN;
++      sealev                    = NaN;
+ 		isdelta18o                = 0;
+ 		delta18o                  = NaN;
+ 		delta18o_surface          = NaN;
+@@ -67,9 +67,9 @@
+ 				md = checkfield(md,'fieldname','surfaceforcings.s0t','>=',0,'numel',1);
+ 				md = checkfield(md,'fieldname','surfaceforcings.rlaps','>=',0,'numel',1);
+ 				md = checkfield(md,'fieldname','surfaceforcings.rlapslgm','>=',0,'numel',1);
+-                                md = checkfield(md,'fieldname','surfaceforcings.Pfac','NaN',1);
+-                                md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1);
+-                                md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1);
++            md = checkfield(md,'fieldname','surfaceforcings.Pfac','NaN',1,'size',[2,NaN]);
++            md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1,'size',[2,NaN]);
++            md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1,'size',[2,NaN]);
+ 				if(obj.isdelta18o==0)
+ 					md = checkfield(md,'fieldname','surfaceforcings.monthlytemperatures','forcing',1,'NaN',1);
+ 					md = checkfield(md,'fieldname','surfaceforcings.precipitation','forcing',1,'NaN',1);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18724-18725.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18724-18725.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18724-18725.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp	(revision 18724)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp	(revision 18725)
+@@ -174,6 +174,7 @@
+ 				inefanalysis->ElementizeEplMask(femmodel);
+ 				femmodel->SetCurrentConfiguration(L2ProjectionEPLAnalysisEnum);
+ 				femmodel->UpdateConstraintsL2ProjectionEPLx();
++				inefanalysis->ElementizeEplMask(femmodel);
+ 				femmodel->parameters->SetParam(EplHeadSlopeXEnum,InputToL2ProjectEnum);
+ 				solutionsequence_linear(femmodel);
+ 				femmodel->parameters->SetParam(EplHeadSlopeYEnum,InputToL2ProjectEnum);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18725-18726.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18725-18726.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18725-18726.diff	(revision 19102)
@@ -0,0 +1,132 @@
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp	(revision 18725)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp	(revision 18726)
+@@ -93,14 +93,14 @@
+ 		/*Reset constraint on the ZigZag Lock, this thing doesn't work, it have to disapear*/
+ 		ResetConstraintsx(femmodel);
+ 
+-		/* {{{ *//*Treating the sediment*/
++		/*{{{*//*Treating the sediment*/
+ 		for(;;){
+ 			sedconverged=false;
+ 			uf_sed_sub_iter=uf_sed->Duplicate();_assert_(uf_sed_sub_iter);
+ 			uf_sed->Copy(uf_sed_sub_iter);
+-			/* {{{ *//*Loop on the sediment layer to deal with the penalization*/
++			/*{{{*//*Loop on the sediment layer to deal with the penalization*/
+ 			for(;;){
+-				/* {{{ *//*Core of the computation*/
++				/*{{{*/ /*Core of the computation*/
+ 				if(VerboseSolution()) _printf0_("Building Sediment Matrix...\n");
+ 				SystemMatricesx(&Kff,&Kfs,&pf,&df,&sediment_kmax,femmodel);
+ 				CreateNodalConstraintsx(&ys,femmodel->nodes,HydrologyDCInefficientAnalysisEnum);
+@@ -112,7 +112,7 @@
+ 				Mergesolutionfromftogx(&ug_sed,uf_sed,ys,femmodel->nodes,femmodel->parameters); delete ys;
+ 				InputUpdateFromSolutionx(femmodel,ug_sed);
+ 				ConstraintsStatex(&constraints_converged,&num_unstable_constraints,femmodel);
+-				/* }}} */
++				/*}}}*/
+ 				if (!sedconverged){
+ 					if(VerboseConvergence()) _printf0_("   # Sediment unstable constraints = " << num_unstable_constraints << "\n");
+ 					if(num_unstable_constraints==0) sedconverged = true;
+@@ -125,11 +125,15 @@
+ 				if(sedconverged)break;
+ 			}
+ 		
+-			/* }}} *//*End of the sediment penalization loop*/
++			/*}}}*//*End of the sediment penalization loop*/
+ 			/*Update EPL mask*/
+-			if(isefficientlayer){
+-				inefanalysis->ElementizeEplMask(femmodel);
+-			}
++			
++			/*++++++This is probably useless+++++++*/
++			/* if(isefficientlayer){ */
++			/* 	inefanalysis->ElementizeEplMask(femmodel); */
++			/* } */
++			/*+++++++++++++*/
++
+ 			sedconverged=false;
+ 			
+ 			/*Checking convegence on the value of the sediment head*/
+@@ -155,12 +159,13 @@
+ 				break;
+ 			}
+ 		}
+-		/* }}} *//*End of the global sediment loop*/
+-		/* {{{ *//*Now dealing with the EPL in the same way*/
++		/*}}}*//*End of the global sediment loop*/
++		/*{{{*//*Now dealing with the EPL in the same way*/
+ 		if(isefficientlayer){
+ 			femmodel->SetCurrentConfiguration(HydrologyDCEfficientAnalysisEnum);
+ 			/*updating mask*/
+ 			femmodel->HydrologyEPLupdateDomainx();
++			inefanalysis->ElementizeEplMask(femmodel);
+ 			InputUpdateFromConstantx(femmodel,true,ResetPenaltiesEnum);
+ 			InputUpdateFromConstantx(femmodel,false,ConvergedEnum);
+ 			femmodel->parameters->SetParam(HydrologyEfficientEnum,HydrologyLayerEnum);
+@@ -169,9 +174,9 @@
+ 				eplconverged=false;
+ 				ug_epl_sub_iter=ug_epl->Duplicate();_assert_(ug_epl_sub_iter);
+ 				ug_epl->Copy(ug_epl_sub_iter);
+-				/* {{{ *//*Retrieve the EPL head slopes and compute EPL Thickness*/
++				/*{{{*//*Retrieve the EPL head slopes and compute EPL Thickness*/
+ 				if(VerboseSolution()) _printf0_("computing EPL Head slope...\n");
+-				inefanalysis->ElementizeEplMask(femmodel);
++				//				inefanalysis->ElementizeEplMask(femmodel);
+ 				femmodel->SetCurrentConfiguration(L2ProjectionEPLAnalysisEnum);
+ 				femmodel->UpdateConstraintsL2ProjectionEPLx();
+ 				inefanalysis->ElementizeEplMask(femmodel);
+@@ -179,14 +184,13 @@
+ 				solutionsequence_linear(femmodel);
+ 				femmodel->parameters->SetParam(EplHeadSlopeYEnum,InputToL2ProjectEnum);
+ 				solutionsequence_linear(femmodel);
++
+ 				femmodel->SetCurrentConfiguration(HydrologyDCEfficientAnalysisEnum);
+-
+ 				effanalysis->ComputeEPLThickness(femmodel);
+-
+ 				//updating mask after the computation of the epl thickness (Allow to close too thin EPL)
+ 				femmodel->HydrologyEPLupdateDomainx();
+ 				inefanalysis->ElementizeEplMask(femmodel);
+-				/* }}} */
++				/*}}}*/
+ 					
+ 				if(VerboseSolution()) _printf0_("Building EPL Matrix...\n");
+ 				SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel);
+@@ -228,9 +232,9 @@
+ 				}
+ 			}
+ 		}
+-		/* }}} */ /*End of the global EPL loop*/
++		/*}}}*/ /*End of the global EPL loop*/
+ 
+-		/* {{{ */ /*Now dealing with the convergence of the whole system*/
++		/*{{{*/ /*Now dealing with the convergence of the whole system*/
+ 		if(!hydroconverged){
+ 			//compute norm(du)/norm(u)
+ 			dug=ug_sed_main_iter->Duplicate(); _assert_(dug);
+@@ -270,7 +274,7 @@
+ 		hydrocount++;
+ 		if(hydroconverged)break;
+ 	}
+-	/* }}} */
++	/*}}}*/
+ 	if(isefficientlayer)InputUpdateFromSolutionx(femmodel,ug_epl);
+ 	femmodel->SetCurrentConfiguration(HydrologyDCInefficientAnalysisEnum);
+ 	InputUpdateFromSolutionx(femmodel,ug_sed);
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18725)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18726)
+@@ -1913,7 +1913,9 @@
+ 	counter=sum_counter;
+ 	if(VerboseSolution()) _printf0_("   Number of active nodes L2 Projection: "<< counter <<"\n");
+ 
++	/*+++++++this is done in the solution sequence+++++++++++++++*/
+ 	/*Update dof indexings*/
+-	this->UpdateConstraintsx();
++	//	this->UpdateConstraintsx();
++	/*++++++++++++++++++++++++++*/
+ }
+ /*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18726-18727.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18726-18727.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18726-18727.diff	(revision 19102)
@@ -0,0 +1,47 @@
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18726)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18727)
+@@ -1815,6 +1815,7 @@
+ 	int*                eplzigzag_counter =	NULL;
+ 		
+ 	HydrologyDCEfficientAnalysis* effanalysis =  new HydrologyDCEfficientAnalysis();
++	HydrologyDCInefficientAnalysis* inefanalysis =  new HydrologyDCInefficientAnalysis();
+ 	/*Step 1: update mask, the mask might be extended by residual and/or using downstream sediment head*/
+ 	mask=new Vector<IssmDouble>(this->nodes->NumberOfNodes(HydrologyDCEfficientAnalysisEnum));
+ 	this->parameters->FindParam(&eplzigzag_counter,NULL,EplZigZagCounterEnum); 
+@@ -1833,7 +1834,7 @@
+ 	/*Update Mask*/
+ 	InputUpdateFromVectorx(this,serial_mask,HydrologydcMaskEplactiveNodeEnum,NodeSIdEnum);
+ 	xDelete<IssmDouble>(serial_mask);
+-
++	inefanalysis->ElementizeEplMask(this);
+ 	/*Step 2: update node activity. If one element is connected to mask=1, all nodes are active*/
+ 	active=new Vector<IssmDouble>(nodes->NumberOfNodes(HydrologyDCEfficientAnalysisEnum));
+ 	for (int i=0;i<elements->Size();i++){
+@@ -1841,6 +1842,7 @@
+ 		effanalysis->HydrologyEPLGetActive(active,element);
+ 	}
+ 
++
+ 	/*Assemble and serialize*/
+ 	active->Assemble();
+ 	serial_active=active->ToMPISerial();
+@@ -1853,7 +1855,7 @@
+ 		if(node->InAnalysis(HydrologyDCEfficientAnalysisEnum)){
+ 			if(serial_active[node->Sid()]==1.){
+ 				node->Activate();
+-				counter++;
++				if(!node->IsClone());counter++;
+ 			}
+ 			else{
+ 				node->Deactivate();
+@@ -1899,7 +1901,7 @@
+ 		if(node->InAnalysis(L2ProjectionEPLAnalysisEnum)){
+ 			if(serial_active[node->Sid()]==1.){
+ 				node->Activate();
+-				counter++;
++				if(!node->IsClone());counter++;
+ 			}
+ 			else{
+ 				node->Deactivate();
Index: /issm/oecreview/Archive/18296-19100/ISSM-18727-18728.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18727-18728.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18727-18728.diff	(revision 19102)
@@ -0,0 +1,92 @@
+Index: ../trunk-jpl/src/m/classes/SMBpdd.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBpdd.py	(revision 18727)
++++ ../trunk-jpl/src/m/classes/SMBpdd.py	(revision 18728)
+@@ -18,6 +18,12 @@
+ 		self.monthlytemperatures       = float('NaN')
+ 		self.desfac                    = 0.
+ 		self.s0p                       = 0.
++		self.s0t                       = 0.
++		self.rlaps                     = 0.
++		self.rlapslgm                  = 0.
++		self.Pfac                      = float('NaN')
++		self.Tdiff                     = float('NaN')
++		self.sealev                    = float('NaN')
+ 		self.isdelta18o                = 0
+ 		self.delta18o                  = float('NaN')
+ 		self.delta18o_surface          = float('NaN')
+@@ -35,6 +41,12 @@
+ 		string="%s\n%s"%(string,fielddisplay(self,'desfac','desertification elevation factor (between 0 and 1, default is 0.5) [m]'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'isdelta18o','is temperature and precipitation delta18o parametrisation activated (0 or 1, default is 0)'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'s0p','should be set to elevation from precip source (between 0 and a few 1000s m, default is 0) [m]'))
++		string="%s\n%s"%(string,fielddisplay(self,'s0t','should be set to elevation from temperature source (between 0 and a few 1000s m, default is 0) [m]'))
++		string="%s\n%s"%(string,fielddisplay(self,'rlaps','present day lapse rate [degree/km]'))
++		string="%s\n%s"%(string,fielddisplay(self,'rlapslgm','LGM lapse rate [degree/km]'))
++		string="%s\n%s"%(string,fielddisplay(self,'Pfac','time interpolation parameter for precipitation, 1D (year)'))
++		string="%s\n%s"%(string,fielddisplay(self,'Tdiff','time interpolation parameter for temperature, 1D (year)'))
++		string="%s\n%s"%(string,fielddisplay(self,'sealev','sea level [m], 1D(year)'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'monthlytemperatures','monthly surface temperatures [K], required if pdd is activated and delta18o not activated'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'temperatures_presentday','monthly present day surface temperatures [K], required if pdd is activated and delta18o activated'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'temperatures_lgm','monthly LGM surface temperatures [K], required if pdd is activated and delta18o activated'))
+@@ -67,6 +79,9 @@
+ 		self.isdelta18o = 0
+ 		self.desfac     = 0.5
+ 		self.s0p        = 0.
++		self.s0t        = 0.
++		self.rlaps      = 6.5 
++		self.rlapslgm   = 6.5
+ 
+ 		return self
+ 	#}}}
+@@ -75,6 +90,12 @@
+ 		if MasstransportAnalysisEnum() in analyses:
+ 			md = checkfield(md,'fieldname','surfaceforcings.desfac','<=',1,'numel',[1]);
+ 			md = checkfield(md,'fieldname','surfaceforcings.s0p','>=',0,'numel',[1]);
++			md = checkfield(md,'fieldname','surfaceforcings.s0t','>=',0,'numel',[1]);
++			md = checkfield(md,'fieldname','surfaceforcings.rlaps','>=',0,'numel',[1]);
++			md = checkfield(md,'fieldname','surfaceforcings.rlapslgm','>=',0,'numel',[1]);
++			md = checkfield(md,'fieldname','surfaceforcings.Pfac','NaN',1,'size',[2,NaN]);
++			md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1,'size',[2,NaN]);
++			md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1,'size',[2,NaN]);
+ 			if not self.isdelta18o:
+ 				md = checkfield(md,'fieldname','surfaceforcings.monthlytemperatures','forcing',1,'NaN',1)
+ 				md = checkfield(md,'fieldname','surfaceforcings.precipitation','forcing',1,'NaN',1)
+@@ -97,6 +118,12 @@
+ 		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','isdelta18o','format','Boolean')
+ 		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','desfac','format','Double');
+ 		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','s0p','format','Double');
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','s0t','format','Double');
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','rlaps','format','Double');
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','rlapslgm','format','Double');
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','Pfac','format','DoubleMat','mattype',1);
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1);
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1);
+ 		if self.isdelta18o:
+ 			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1)
+ 			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','temperatures_lgm','format','DoubleMat','mattype',1)
+Index: ../trunk-jpl/src/m/classes/SMBpdd.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBpdd.m	(revision 18727)
++++ ../trunk-jpl/src/m/classes/SMBpdd.m	(revision 18728)
+@@ -95,7 +95,7 @@
+ 			fielddisplay(obj,'Pfac','time interpolation parameter for precipitation, 1D(year)');
+ 			fielddisplay(obj,'Tdiff','time interpolation parameter for temperature, 1D(year)');
+ 			fielddisplay(obj,'sealev','sea level [m], 1D(year)');
+-                        fielddisplay(obj,'monthlytemperatures','monthly surface temperatures [K], required if pdd is activated and delta18o not activated');
++			fielddisplay(obj,'monthlytemperatures','monthly surface temperatures [K], required if pdd is activated and delta18o not activated');
+ 			fielddisplay(obj,'precipitation','surface precipitation [m/yr water eq]');
+ 			fielddisplay(obj,'temperatures_presentday','monthly present day surface temperatures [K], required if pdd is activated and delta18o activated');
+ 			fielddisplay(obj,'temperatures_lgm','monthly LGM surface temperatures [K], required if pdd is activated and delta18o activated');
+@@ -116,9 +116,9 @@
+ 			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','s0t','format','Double');
+ 			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','rlaps','format','Double');
+ 			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','rlapslgm','format','Double');
+-                        WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Pfac','format','DoubleMat','mattype',1);
+-                        WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1);
+-                        WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Pfac','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1);
+ 			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','isdelta18o','format','Boolean');
+ 			if obj.isdelta18o
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18728-18729.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18728-18729.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18728-18729.diff	(revision 19102)
@@ -0,0 +1,47 @@
+Index: ../trunk-jpl/src/c/analyses/MeltingAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/MeltingAnalysis.cpp	(revision 18728)
++++ ../trunk-jpl/src/c/analyses/MeltingAnalysis.cpp	(revision 18729)
+@@ -9,7 +9,6 @@
+ 	return 1;
+ }/*}}}*/
+ void MeltingAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-	parameters->AddObject(iomodel->CopyConstantObject(FrictionLawEnum));
+ }/*}}}*/
+ void MeltingAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+@@ -28,8 +27,6 @@
+ 		}
+ 	}
+ 
+-	iomodel->Constant(&frictionlaw,FrictionLawEnum);
+-
+ 	/*Create inputs: */
+ 	iomodel->FetchDataToInput(elements,ThicknessEnum);
+ 	iomodel->FetchDataToInput(elements,SurfaceEnum);
+@@ -39,25 +36,7 @@
+ 		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
+ 		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
+ 	}
+-	iomodel->FetchDataToInput(elements,MaterialsRheologyBEnum);
+-	iomodel->FetchDataToInput(elements,MaterialsRheologyNEnum);
+-	iomodel->FetchDataToInput(elements,BasalforcingsGroundediceMeltingRateEnum);
+ 	iomodel->FetchDataToInput(elements,PressureEnum);
+-	
+-	/*Friction law variables*/
+-	switch(frictionlaw){
+-		case 1:
+-			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
+-			iomodel->FetchDataToInput(elements,FrictionPEnum);
+-			iomodel->FetchDataToInput(elements,FrictionQEnum);
+-			break;
+-		case 2:
+-			iomodel->FetchDataToInput(elements,FrictionCEnum);
+-			iomodel->FetchDataToInput(elements,FrictionMEnum);
+-			break;
+-		default:
+-			_error_("not supported");
+-	}
+ }/*}}}*/
+ void MeltingAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18729-18730.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18729-18730.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18729-18730.diff	(revision 19102)
@@ -0,0 +1,22 @@
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18729)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18730)
+@@ -1855,7 +1855,7 @@
+ 		if(node->InAnalysis(HydrologyDCEfficientAnalysisEnum)){
+ 			if(serial_active[node->Sid()]==1.){
+ 				node->Activate();
+-				if(!node->IsClone());counter++;
++				if(!node->IsClone()) counter++;
+ 			}
+ 			else{
+ 				node->Deactivate();
+@@ -1901,7 +1901,7 @@
+ 		if(node->InAnalysis(L2ProjectionEPLAnalysisEnum)){
+ 			if(serial_active[node->Sid()]==1.){
+ 				node->Activate();
+-				if(!node->IsClone());counter++;
++				if(!node->IsClone()) counter++;
+ 			}
+ 			else{
+ 				node->Deactivate();
Index: /issm/oecreview/Archive/18296-19100/ISSM-18730-18731.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18730-18731.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18730-18731.diff	(revision 19102)
@@ -0,0 +1,16 @@
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18730)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18731)
+@@ -64,9 +64,9 @@
+ 
+ 	/*parameters: */
+ 	bool save_results;
+-	int  stabilization=1;
++	int  stabilization;
+ 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+-	//femmodel->parameters->FindParam(&stabilization,LevelsetStabilizationEnum);
++	femmodel->parameters->FindParam(&stabilization,LevelsetStabilizationEnum);
+ 
+ 	/*activate formulation: */
+ 	femmodel->SetCurrentConfiguration(LevelsetAnalysisEnum);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18731-18732.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18731-18732.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18731-18732.diff	(revision 19102)
@@ -0,0 +1,443 @@
+Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18731)
++++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18732)
+@@ -129,6 +129,11 @@
+ 	if(numoutputs)parameters->AddObject(new StringArrayParam(StressbalanceRequestedOutputsEnum,requestedoutputs,numoutputs));
+ 	iomodel->DeleteData(&requestedoutputs,numoutputs,StressbalanceRequestedOutputsEnum);
+ 
++	/*Deal with friction parameters*/
++	int frictionlaw;
++	iomodel->Constant(&frictionlaw,FrictionLawEnum);
++	if(frictionlaw==4) parameters->AddObject(iomodel->CopyConstantObject(FrictionGammaEnum));
++
+ }/*}}}*/
+ void StressbalanceAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+@@ -261,6 +266,13 @@
+ 			iomodel->FetchDataToInput(elements,FrictionCEnum);
+ 			iomodel->FetchDataToInput(elements,FrictionMEnum);
+ 			break;
++		case 4:
++			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
++			iomodel->FetchDataToInput(elements,FrictionPEnum);
++			iomodel->FetchDataToInput(elements,FrictionQEnum);
++			iomodel->FetchDataToInput(elements,PressureEnum);
++			iomodel->FetchDataToInput(elements,TemperatureEnum);
++			break;
+ 		default:
+ 			_error_("not supported");
+ 	}
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18731)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18732)
+@@ -25,6 +25,11 @@
+ 	parameters->AddObject(new IntParam(ThermalNumRequestedOutputsEnum,numoutputs));
+ 	if(numoutputs)parameters->AddObject(new StringArrayParam(ThermalRequestedOutputsEnum,requestedoutputs,numoutputs));
+ 	iomodel->DeleteData(&requestedoutputs,numoutputs,ThermalRequestedOutputsEnum);
++
++	/*Deal with friction parameters*/
++	int frictionlaw;
++	iomodel->Constant(&frictionlaw,FrictionLawEnum);
++	if(frictionlaw==4) parameters->AddObject(iomodel->CopyConstantObject(FrictionGammaEnum));
+ }/*}}}*/
+ void EnthalpyAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+@@ -95,6 +100,13 @@
+ 			iomodel->FetchDataToInput(elements,FrictionCEnum);
+ 			iomodel->FetchDataToInput(elements,FrictionMEnum);
+ 			break;
++		case 4:
++			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
++			iomodel->FetchDataToInput(elements,FrictionPEnum);
++			iomodel->FetchDataToInput(elements,FrictionQEnum);
++			iomodel->FetchDataToInput(elements,PressureEnum);
++			iomodel->FetchDataToInput(elements,TemperatureEnum);
++			break;
+ 		default:
+ 			_error_("not supported");
+ 	}
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18731)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18732)
+@@ -94,6 +94,7 @@
+ 	FrictionMEnum,
+ 	FrictionCEnum,
+ 	FrictionLawEnum,
++	FrictionGammaEnum,
+ 	GeometryHydrostaticRatioEnum,
+ 	HydrologyModelEnum,
+ 	HydrologyshreveEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18731)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18732)
+@@ -102,6 +102,7 @@
+ 		case FrictionMEnum : return "FrictionM";
+ 		case FrictionCEnum : return "FrictionC";
+ 		case FrictionLawEnum : return "FrictionLaw";
++		case FrictionGammaEnum : return "FrictionGamma";
+ 		case GeometryHydrostaticRatioEnum : return "GeometryHydrostaticRatio";
+ 		case HydrologyModelEnum : return "HydrologyModel";
+ 		case HydrologyshreveEnum : return "Hydrologyshreve";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18731)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18732)
+@@ -102,6 +102,7 @@
+ 	      else if (strcmp(name,"FrictionM")==0) return FrictionMEnum;
+ 	      else if (strcmp(name,"FrictionC")==0) return FrictionCEnum;
+ 	      else if (strcmp(name,"FrictionLaw")==0) return FrictionLawEnum;
++	      else if (strcmp(name,"FrictionGamma")==0) return FrictionGammaEnum;
+ 	      else if (strcmp(name,"GeometryHydrostaticRatio")==0) return GeometryHydrostaticRatioEnum;
+ 	      else if (strcmp(name,"HydrologyModel")==0) return HydrologyModelEnum;
+ 	      else if (strcmp(name,"Hydrologyshreve")==0) return HydrologyshreveEnum;
+@@ -135,11 +136,11 @@
+ 	      else if (strcmp(name,"HydrologydcEplMaxThickness")==0) return HydrologydcEplMaxThicknessEnum;
+ 	      else if (strcmp(name,"HydrologydcEplThickness")==0) return HydrologydcEplThicknessEnum;
+ 	      else if (strcmp(name,"HydrologydcEplThicknessOld")==0) return HydrologydcEplThicknessOldEnum;
+-	      else if (strcmp(name,"HydrologydcEplConductivity")==0) return HydrologydcEplConductivityEnum;
+          else stage=2;
+    }
+    if(stage==2){
+-	      if (strcmp(name,"HydrologydcIsefficientlayer")==0) return HydrologydcIsefficientlayerEnum;
++	      if (strcmp(name,"HydrologydcEplConductivity")==0) return HydrologydcEplConductivityEnum;
++	      else if (strcmp(name,"HydrologydcIsefficientlayer")==0) return HydrologydcIsefficientlayerEnum;
+ 	      else if (strcmp(name,"HydrologydcSedimentlimitFlag")==0) return HydrologydcSedimentlimitFlagEnum;
+ 	      else if (strcmp(name,"HydrologydcSedimentlimit")==0) return HydrologydcSedimentlimitEnum;
+ 	      else if (strcmp(name,"HydrologydcTransferFlag")==0) return HydrologydcTransferFlagEnum;
+@@ -258,11 +259,11 @@
+ 	      else if (strcmp(name,"MasstransportMinThickness")==0) return MasstransportMinThicknessEnum;
+ 	      else if (strcmp(name,"MasstransportPenaltyFactor")==0) return MasstransportPenaltyFactorEnum;
+ 	      else if (strcmp(name,"MasstransportSpcthickness")==0) return MasstransportSpcthicknessEnum;
+-	      else if (strcmp(name,"MasstransportCalvingrate")==0) return MasstransportCalvingrateEnum;
+          else stage=3;
+    }
+    if(stage==3){
+-	      if (strcmp(name,"MasstransportStabilization")==0) return MasstransportStabilizationEnum;
++	      if (strcmp(name,"MasstransportCalvingrate")==0) return MasstransportCalvingrateEnum;
++	      else if (strcmp(name,"MasstransportStabilization")==0) return MasstransportStabilizationEnum;
+ 	      else if (strcmp(name,"MasstransportVertexPairing")==0) return MasstransportVertexPairingEnum;
+ 	      else if (strcmp(name,"MasstransportNumRequestedOutputs")==0) return MasstransportNumRequestedOutputsEnum;
+ 	      else if (strcmp(name,"MasstransportRequestedOutputs")==0) return MasstransportRequestedOutputsEnum;
+@@ -381,11 +382,11 @@
+ 	      else if (strcmp(name,"BalancevelocityAnalysis")==0) return BalancevelocityAnalysisEnum;
+ 	      else if (strcmp(name,"BalancevelocitySolution")==0) return BalancevelocitySolutionEnum;
+ 	      else if (strcmp(name,"L2ProjectionEPLAnalysis")==0) return L2ProjectionEPLAnalysisEnum;
+-	      else if (strcmp(name,"L2ProjectionBaseAnalysis")==0) return L2ProjectionBaseAnalysisEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"BedSlopeSolution")==0) return BedSlopeSolutionEnum;
++	      if (strcmp(name,"L2ProjectionBaseAnalysis")==0) return L2ProjectionBaseAnalysisEnum;
++	      else if (strcmp(name,"BedSlopeSolution")==0) return BedSlopeSolutionEnum;
+ 	      else if (strcmp(name,"DamageEvolutionSolution")==0) return DamageEvolutionSolutionEnum;
+ 	      else if (strcmp(name,"DamageEvolutionAnalysis")==0) return DamageEvolutionAnalysisEnum;
+ 	      else if (strcmp(name,"StressbalanceAnalysis")==0) return StressbalanceAnalysisEnum;
+@@ -504,11 +505,11 @@
+ 	      else if (strcmp(name,"Vertex")==0) return VertexEnum;
+ 	      else if (strcmp(name,"VertexPId")==0) return VertexPIdEnum;
+ 	      else if (strcmp(name,"VertexSId")==0) return VertexSIdEnum;
+-	      else if (strcmp(name,"Air")==0) return AirEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"Ice")==0) return IceEnum;
++	      if (strcmp(name,"Air")==0) return AirEnum;
++	      else if (strcmp(name,"Ice")==0) return IceEnum;
+ 	      else if (strcmp(name,"Melange")==0) return MelangeEnum;
+ 	      else if (strcmp(name,"Water")==0) return WaterEnum;
+ 	      else if (strcmp(name,"Closed")==0) return ClosedEnum;
+@@ -627,11 +628,11 @@
+ 	      else if (strcmp(name,"TaylorHood")==0) return TaylorHoodEnum;
+ 	      else if (strcmp(name,"LATaylorHood")==0) return LATaylorHoodEnum;
+ 	      else if (strcmp(name,"XTaylorHood")==0) return XTaylorHoodEnum;
+-	      else if (strcmp(name,"OneLayerP4z")==0) return OneLayerP4zEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"CrouzeixRaviart")==0) return CrouzeixRaviartEnum;
++	      if (strcmp(name,"OneLayerP4z")==0) return OneLayerP4zEnum;
++	      else if (strcmp(name,"CrouzeixRaviart")==0) return CrouzeixRaviartEnum;
+ 	      else if (strcmp(name,"LACrouzeixRaviart")==0) return LACrouzeixRaviartEnum;
+ 	      else if (strcmp(name,"SaveResults")==0) return SaveResultsEnum;
+ 	      else if (strcmp(name,"BoolExternalResult")==0) return BoolExternalResultEnum;
+@@ -750,11 +751,11 @@
+ 	      else if (strcmp(name,"SeaiceConcentration")==0) return SeaiceConcentrationEnum;
+ 	      else if (strcmp(name,"SeaiceMinConcentration")==0) return SeaiceMinConcentrationEnum;
+ 	      else if (strcmp(name,"SeaiceMinThickness")==0) return SeaiceMinThicknessEnum;
+-	      else if (strcmp(name,"SeaiceMaxThickness")==0) return SeaiceMaxThicknessEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"SeaiceSpcvx")==0) return SeaiceSpcvxEnum;
++	      if (strcmp(name,"SeaiceMaxThickness")==0) return SeaiceMaxThicknessEnum;
++	      else if (strcmp(name,"SeaiceSpcvx")==0) return SeaiceSpcvxEnum;
+ 	      else if (strcmp(name,"SeaiceSpcvy")==0) return SeaiceSpcvyEnum;
+ 	      else if (strcmp(name,"SeaiceCoriolisFactor")==0) return SeaiceCoriolisFactorEnum;
+ 	      else if (strcmp(name,"BasalforcingsRhoOcean")==0) return BasalforcingsRhoOceanEnum;
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.h	(revision 18731)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.h	(revision 18732)
+@@ -32,6 +32,7 @@
+ 		void  GetAlpha2Viscous(IssmDouble* palpha2,Gauss* gauss);
+ 		void  GetAlpha2Weertman(IssmDouble* palpha2,Gauss* gauss);
+ 		void  GetAlpha2Hydro(IssmDouble* palpha2,Gauss* gauss);
++		void  GetAlpha2Temp(IssmDouble* palpha2,Gauss* gauss);
+ 		void  GetAlphaComplement(IssmDouble* alpha_complement,Gauss* gauss);
+ };
+ 
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18731)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18732)
+@@ -47,9 +47,13 @@
+ 			break;
+ 		case 2:
+ 			GetAlpha2Weertman(palpha2,gauss);
+-	  case 3:
++			break;
++		case 3:
+ 			GetAlpha2Hydro(palpha2,gauss);
+ 			break;
++		case 4:
++			GetAlpha2Temp(palpha2,gauss);
++			break;
+ 	  default:
+ 			_error_("not supported");
+ 	}
+@@ -218,6 +222,33 @@
+ 	/*Assign output pointers:*/
+ 	*palpha2=alpha2;
+ }/*}}}*/
++void Friction::GetAlpha2Temp(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
++	/*Here, we want to parameterize the friction as a function of temperature
++	 *
++	 * alpha2 = alpha2_viscous * f(T)
++	 *
++	 * where f(T) = exp((T-Tpmp)/gamma)
++	 */
++
++	/*Intermediaries: */
++	IssmDouble  f,T,pressure,Tpmp,gamma;
++	IssmDouble  alpha2;
++
++	/*Get viscous part*/
++	this->GetAlpha2Viscous(&alpha2,gauss);
++
++	/*Get pressure melting point (Tpmp) for local pressure and get current temperature*/
++	element->GetInputValue(&T,gauss,TemperatureEnum);
++	element->GetInputValue(&pressure,gauss,PressureEnum);
++	Tpmp = element->TMeltingPoint(pressure);
++
++	/*Compute scaling parameter*/
++	element->parameters->FindParam(&gamma,FrictionGammaEnum);
++	alpha2 = alpha2*exp((T-Tpmp)/gamma);
++
++	/*Assign output pointers:*/
++	*palpha2=alpha2;
++}/*}}}*/
+ void Friction::GetAlphaComplement(IssmDouble* palpha_complement, Gauss* gauss){/*{{{*/
+ 
+ 	/* FrictionGetAlpha2 computes alpha2= drag^2 * Neff ^r * vel ^s, with Neff=rho_ice*g*thickness+rho_ice*g*bed, r=q/p and s=1/p. 
+Index: ../trunk-jpl/src/m/classes/initialization.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/initialization.m	(revision 18731)
++++ ../trunk-jpl/src/m/classes/initialization.m	(revision 18732)
+@@ -18,23 +18,23 @@
+ 		watercolumn   = NaN;
+ 	end
+ 	methods
+-        function createxml(obj,fid) % {{{
+-            fprintf(fid, '\n\n');
+-            fprintf(fid, '%s\n', '<!-- initialization -->');
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Initial field values">','<section name="initialization" />');                    
+-            
+-			 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="vx" type="',class(obj.vx),'" default="',obj.vx,'">','     <section name="initialization" />','     <help> x component of velocity [m/yr] </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="vy" type="',class(obj.vy),'" default="',obj.vy,'">','     <section name="initialization" />','     <help> y component of velocity [m/yr] </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="vz" type="',class(obj.vz),'" default="',obj.vz,'">','     <section name="initialization" />','     <help> z component of velocity [m/yr] </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="vel" type="',class(obj.vel),'" default="',obj.vel,'">','     <section name="initialization" />','     <help> velocity norm [m/yr] </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="pressure" type="',class(obj.pressure),'" default="',obj.pressure,'">','     <section name="initialization" />','     <help> pressure field [Pa] </help>','</parameter>');
+-        	 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="temperature" type="',class(obj.temperature),'" default="',obj.temperature,'">','     <section name="initialization" />','     <help> fraction of water in the ice </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="waterfraction" type="',class(obj.waterfraction),'" default="',obj.waterfraction,'">','     <section name="initialization" />','     <help> ice thickness [m] </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="sediment_head" type="',class(obj.sediment_head),'" default="',obj.sediment_head,'">','     <section name="initialization" />','     <help> sediment water head of subglacial system [m] </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="epl_head" type="',class(obj.epl_head),'" default="',obj.epl_head,'">','     <section name="initialization" />','     <help> epl water head of subglacial system [m] </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','<parameter key ="watercolumn" type="',class(obj.watercolumn),'" default="',obj.watercolumn,'">','     <section name="initialization" />','     <help> thickness of subglacial water [m] </help>','</parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-        end % }}}
++		function createxml(obj,fid) % {{{
++			fprintf(fid, '\n\n');
++			fprintf(fid, '%s\n', '<!-- initialization -->');
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Initial field values">','<section name="initialization" />');                    
++
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="vx" type="',class(obj.vx),'" default="',obj.vx,'">','     <section name="initialization" />','     <help> x component of velocity [m/yr] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="vy" type="',class(obj.vy),'" default="',obj.vy,'">','     <section name="initialization" />','     <help> y component of velocity [m/yr] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="vz" type="',class(obj.vz),'" default="',obj.vz,'">','     <section name="initialization" />','     <help> z component of velocity [m/yr] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="vel" type="',class(obj.vel),'" default="',obj.vel,'">','     <section name="initialization" />','     <help> velocity norm [m/yr] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="pressure" type="',class(obj.pressure),'" default="',obj.pressure,'">','     <section name="initialization" />','     <help> pressure field [Pa] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="temperature" type="',class(obj.temperature),'" default="',obj.temperature,'">','     <section name="initialization" />','     <help> fraction of water in the ice </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="waterfraction" type="',class(obj.waterfraction),'" default="',obj.waterfraction,'">','     <section name="initialization" />','     <help> ice thickness [m] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="sediment_head" type="',class(obj.sediment_head),'" default="',obj.sediment_head,'">','     <section name="initialization" />','     <help> sediment water head of subglacial system [m] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="epl_head" type="',class(obj.epl_head),'" default="',obj.epl_head,'">','     <section name="initialization" />','     <help> epl water head of subglacial system [m] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','<parameter key ="watercolumn" type="',class(obj.watercolumn),'" default="',obj.watercolumn,'">','     <section name="initialization" />','     <help> thickness of subglacial water [m] </help>','</parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++		end % }}}
+ 		function obj = initialization(varargin) % {{{
+ 			switch nargin
+ 				case 0
+@@ -72,6 +72,7 @@
+ 					md = checkfield(md,'fieldname','initialization.vz','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 				end
+ 				md = checkfield(md,'fieldname','initialization.pressure','NaN',1,'size',[md.mesh.numberofvertices 1]);
++				md = checkfield(md,'fieldname','initialization.temperature','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 			end
+ 			if (ismember(EnthalpyAnalysisEnum(),analyses) & md.thermal.isenthalpy)
+ 				md = checkfield(md,'fieldname','initialization.waterfraction','>=',0,'size',[md.mesh.numberofvertices 1]);
+Index: ../trunk-jpl/src/m/classes/groundingline.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/groundingline.m	(revision 18731)
++++ ../trunk-jpl/src/m/classes/groundingline.m	(revision 18732)
+@@ -8,21 +8,21 @@
+ 		migration    = '';
+ 	end
+ 	methods
+-         function createxml(obj,fid) % {{{
+-            fprintf(fid, '\n\n');
+-            fprintf(fid, '%s\n', '<!-- groundingline -->');
+-            
+-            % Convergence criteria          
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Grounding line migration parameters">','<section name="groundingline" />');  
+-			
+-            % migration (SoftMigration, AggressiveMigration, or None)drop-down
+-            fprintf(fid,'%s\n%s\n%s\n%s\n','<parameter key ="migration" type="alternative" optional="false">','     <section name="groundingline" />','     <help> type of grounding line migration: "SoftMigration","AggressiveMigration" or "None" </help>');
+-            fprintf(fid,'%s\n','       <option value="SoftMigration" type="string" default="true"> </option>');
+-            fprintf(fid,'%s\n','       <option value="AggressiveMigration" type="string" default="false"> </option>');
+-            fprintf(fid, '%s\n%s\n','       <option value="None" type="string" default="false"></option>','</parameter>');
++		function createxml(obj,fid) % {{{
++			fprintf(fid, '\n\n');
++			fprintf(fid, '%s\n', '<!-- groundingline -->');
+ 
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-        end % }}}
++			% Convergence criteria          
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Grounding line migration parameters">','<section name="groundingline" />');  
++
++			% migration (SoftMigration, AggressiveMigration, or None)drop-down
++			fprintf(fid,'%s\n%s\n%s\n%s\n','<parameter key ="migration" type="alternative" optional="false">','     <section name="groundingline" />','     <help> type of grounding line migration: "SoftMigration","AggressiveMigration" or "None" </help>');
++			fprintf(fid,'%s\n','       <option value="SoftMigration" type="string" default="true"> </option>');
++			fprintf(fid,'%s\n','       <option value="AggressiveMigration" type="string" default="false"> </option>');
++			fprintf(fid, '%s\n%s\n','       <option value="None" type="string" default="false"></option>','</parameter>');
++
++			fprintf(fid,'%s\n%s\n','</frame>');
++		end % }}}
+ 		function obj = groundingline(varargin) % {{{
+ 			switch nargin
+ 				case 0
+Index: ../trunk-jpl/src/m/classes/initialization.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/initialization.py	(revision 18731)
++++ ../trunk-jpl/src/m/classes/initialization.py	(revision 18732)
+@@ -68,6 +68,7 @@
+ 		if ThermalAnalysisEnum() in analyses:
+ 			md = checkfield(md,'fieldname','initialization.vx','NaN',1,'size',[md.mesh.numberofvertices])
+ 			md = checkfield(md,'fieldname','initialization.vy','NaN',1,'size',[md.mesh.numberofvertices])
++			md = checkfield(md,'fieldname','initialization.temperature','NaN',1,'size',[md.mesh.numberofvertices])
+ 			if md.mesh.dimension()==3:
+ 				md = checkfield(md,'fieldname','initialization.vz','NaN',1,'size',[md.mesh.numberofvertices])
+ 			md = checkfield(md,'fieldname','initialization.pressure','NaN',1,'size',[md.mesh.numberofvertices])
+Index: ../trunk-jpl/src/m/classes/frictiontemp.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictiontemp.m	(revision 0)
++++ ../trunk-jpl/src/m/classes/frictiontemp.m	(revision 18732)
+@@ -0,0 +1,60 @@
++%FRICTIONTEMP class definition
++%
++%   Usage:
++%      frictiontemp=frictiontemp();
++
++classdef frictiontemp
++	properties (SetAccess=public) 
++		gamma       = 0;
++		coefficient = NaN;
++		p           = NaN;
++		q           = NaN;
++	end
++	methods
++		function obj = frictiontemp(varargin) % {{{
++			switch nargin
++				case 0
++					obj=setdefaultparameters(obj);
++				case 1
++					obj=structtoobj(frictiontemp(),varargin{1});
++				otherwise
++					error('constructor not supported');
++			end
++		end % }}}
++		function obj = setdefaultparameters(obj) % {{{
++
++			%By default gamma = 1;
++			obj.gamma = 1;
++
++
++		end % }}}
++		function md = checkconsistency(obj,md,solution,analyses) % {{{
++
++			%Early return
++			if ~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(ThermalAnalysisEnum(),analyses), return; end
++
++			md = checkfield(md,'fieldname','friction.coefficient','forcing',1,'NaN',1);
++			md = checkfield(md,'fieldname','friction.q','NaN',1,'size',[md.mesh.numberofelements 1]);
++			md = checkfield(md,'fieldname','friction.p','NaN',1,'size',[md.mesh.numberofelements 1]);
++			md = checkfield(md,'fieldname','friction.gamma','NaN',1,'numel',1,'>',0.);
++
++			%Check that temperature is provided
++			md = checkfield(md,'fieldname','initialization.temperature','NaN',1,'size',[md.mesh.numberofvertices 1]);
++		end % }}}
++		function disp(obj) % {{{
++			disp(sprintf('Basal shear stress parameters: tau_b = coefficient^2 * Neff ^r * |u_b|^(s-1) * u_b * 1/f(T)\n(effective stress Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p)'));
++			fielddisplay(obj,'gamma','submelt sliding parameter f(T) = exp((T-Tpmp)/gamma)');
++			fielddisplay(obj,'coefficient','frictiontemp coefficient [SI]');
++			fielddisplay(obj,'p','p exponent');
++			fielddisplay(obj,'q','q exponent');
++		end % }}}
++		function marshall(obj,md,fid) % {{{
++
++			WriteData(fid,'enum',FrictionLawEnum,'data',4,'format','Integer');
++			WriteData(fid,'class','friction','object',obj,'fieldname','gamma','format','Double');
++			WriteData(fid,'class','friction','object',obj,'fieldname','coefficient','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'class','friction','object',obj,'fieldname','p','format','DoubleMat','mattype',2);
++			WriteData(fid,'class','friction','object',obj,'fieldname','q','format','DoubleMat','mattype',2);
++		end % }}}
++	end
++end
+Index: ../trunk-jpl/src/m/enum/FrictionGammaEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/FrictionGammaEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/FrictionGammaEnum.m	(revision 18732)
+@@ -0,0 +1,11 @@
++function macro=FrictionGammaEnum()
++%FRICTIONGAMMAENUM - Enum of FrictionGamma
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=FrictionGammaEnum()
++
++macro=StringToEnum('FrictionGamma');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18731)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18732)
+@@ -94,6 +94,7 @@
+ def FrictionMEnum(): return StringToEnum("FrictionM")[0]
+ def FrictionCEnum(): return StringToEnum("FrictionC")[0]
+ def FrictionLawEnum(): return StringToEnum("FrictionLaw")[0]
++def FrictionGammaEnum(): return StringToEnum("FrictionGamma")[0]
+ def GeometryHydrostaticRatioEnum(): return StringToEnum("GeometryHydrostaticRatio")[0]
+ def HydrologyModelEnum(): return StringToEnum("HydrologyModel")[0]
+ def HydrologyshreveEnum(): return StringToEnum("Hydrologyshreve")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18732-18733.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18732-18733.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18732-18733.diff	(revision 19102)
@@ -0,0 +1,16 @@
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18732)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18733)
+@@ -64,9 +64,9 @@
+ 
+ 	/*parameters: */
+ 	bool save_results;
+-	int  stabilization;
++	int  stabilization = 1;
+ 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+-	femmodel->parameters->FindParam(&stabilization,LevelsetStabilizationEnum);
++	//femmodel->parameters->FindParam(&stabilization,LevelsetStabilizationEnum);
+ 
+ 	/*activate formulation: */
+ 	femmodel->SetCurrentConfiguration(LevelsetAnalysisEnum);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18733-18734.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18733-18734.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18733-18734.diff	(revision 19102)
@@ -0,0 +1,30 @@
+Index: ../trunk-jpl/test/NightlyRun/test236.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test236.py	(revision 18733)
++++ ../trunk-jpl/test/NightlyRun/test236.py	(revision 18734)
+@@ -54,6 +54,10 @@
+ md.timestepping.time_step=20.
+ md.timestepping.final_time=60.
+ 
++md.surfaceforcings.Pfac=[1,1]
++md.surfaceforcings.Tdiff=[1,1]
++md.surfaceforcings.sealev=[1,1]
++
+ # 
+ md.transient.requested_outputs=['default','SurfaceforcingsMonthlytemperatures']
+ md=setflowequation(md,'SSA','all')
+Index: ../trunk-jpl/test/NightlyRun/test237.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test237.py	(revision 18733)
++++ ../trunk-jpl/test/NightlyRun/test237.py	(revision 18734)
+@@ -57,6 +57,10 @@
+ md.settings.output_frequency=1
+ md.timestepping.final_time=60.
+ 
++md.surfaceforcings.Pfac=[1,1]
++md.surfaceforcings.Tdiff=[1,1]
++md.surfaceforcings.sealev=[1,1]
++
+ #
+ md.transient.requested_outputs=['default','SurfaceforcingsMonthlytemperatures']
+ md.extrude(3,1.)
Index: /issm/oecreview/Archive/18296-19100/ISSM-18734-18735.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18734-18735.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18734-18735.diff	(revision 19102)
@@ -0,0 +1,17 @@
+Index: ../trunk-jpl/src/m/classes/SMBpdd.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBpdd.py	(revision 18734)
++++ ../trunk-jpl/src/m/classes/SMBpdd.py	(revision 18735)
+@@ -93,9 +93,9 @@
+ 			md = checkfield(md,'fieldname','surfaceforcings.s0t','>=',0,'numel',[1]);
+ 			md = checkfield(md,'fieldname','surfaceforcings.rlaps','>=',0,'numel',[1]);
+ 			md = checkfield(md,'fieldname','surfaceforcings.rlapslgm','>=',0,'numel',[1]);
+-			md = checkfield(md,'fieldname','surfaceforcings.Pfac','NaN',1,'size',[2,NaN]);
+-			md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1,'size',[2,NaN]);
+-			md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1,'size',[2,NaN]);
++			md = checkfield(md,'fieldname','surfaceforcings.Pfac','NaN',1,'size',[2,numpy.nan]);
++			md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1,'size',[2,numpy.nan]);
++			md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1,'size',[2,numpy.nan]);
+ 			if not self.isdelta18o:
+ 				md = checkfield(md,'fieldname','surfaceforcings.monthlytemperatures','forcing',1,'NaN',1)
+ 				md = checkfield(md,'fieldname','surfaceforcings.precipitation','forcing',1,'NaN',1)
Index: /issm/oecreview/Archive/18296-19100/ISSM-18735-18736.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18735-18736.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18735-18736.diff	(revision 19102)
@@ -0,0 +1,992 @@
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18735)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18736)
+@@ -104,8 +104,8 @@
+ 	IssmDouble kappa;
+ 	IssmDouble Jdet, dt, D_scalar;
+ 	IssmDouble h,hx,hy,hz;
+-	IssmDouble vel, calvingrate;
+-	IssmDouble norm_dlsf;
++	IssmDouble vel;
++//	IssmDouble norm_dlsf;
+ 	IssmDouble* xyz_list = NULL;
+ 
+ 	/*Get problem dimension*/
+@@ -129,30 +129,37 @@
+ 	IssmDouble*    v        = xNew<IssmDouble>(dim);
+ 	IssmDouble*    w        = xNew<IssmDouble>(dim);
+ 	IssmDouble*    c        = xNew<IssmDouble>(dim);
+-	IssmDouble*    dlsf     = xNew<IssmDouble>(dim);
++	//IssmDouble*    dlsf     = xNew<IssmDouble>(dim);
+ 
+ 	/*Retrieve all inputs and parameters*/
+ 	basalelement->GetVerticesCoordinates(&xyz_list);
+ 	basalelement->FindParam(&dt,TimesteppingTimeStepEnum);
+ 	Input* vx_input=NULL;
+ 	Input* vy_input=NULL;
++	Input* calvingratex_input=NULL;
++	Input* calvingratey_input=NULL;
+ 	if(domaintype==Domain2DhorizontalEnum){
+ 		vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input);
+ 		vy_input=basalelement->GetInput(VyEnum); _assert_(vy_input);
++		calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
++		calvingratey_input=basalelement->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
+ 	}
+ 	else{
+ 		if(dim==1){
+ 			vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input);
++			calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
+ 		}
+ 		if(dim==2){
+ 			vx_input=basalelement->GetInput(VxAverageEnum); _assert_(vx_input);
+ 			vy_input=basalelement->GetInput(VyAverageEnum); _assert_(vy_input);
++			calvingratex_input=basalelement->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
++			calvingratey_input=basalelement->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
+ 		}
+ 	}
+ 
+-	Input* lsf_slopex_input  = basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
+-	Input* lsf_slopey_input  = basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
+-	Input* calvingrate_input  = basalelement->GetInput(MasstransportCalvingrateEnum);     _assert_(calvingrate_input);
++//	Input* lsf_slopex_input  = basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
++//	Input* lsf_slopey_input  = basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
++	//Input* calvingrate_input  = basalelement->GetInput(MasstransportCalvingrateEnum);     _assert_(calvingrate_input);
+ 	
+ 	/* Start  looping on the number of gaussian points: */
+ 	Gauss* gauss=basalelement->NewGauss(2);
+@@ -177,18 +184,20 @@
+ 		GetBprime(Bprime,basalelement,xyz_list,gauss); 
+ 		vx_input->GetInputValue(&v[0],gauss); // in 3D case, add mesh velocity 
+ 		vy_input->GetInputValue(&v[1],gauss); 
+-		lsf_slopex_input->GetInputValue(&dlsf[0],gauss);
+-		lsf_slopey_input->GetInputValue(&dlsf[1],gauss);
+-		calvingrate_input->GetInputValue(&calvingrate,gauss);
++		calvingratex_input->GetInputValue(&c[0],gauss); // in 3D case, add mesh velocity 
++		calvingratey_input->GetInputValue(&c[1],gauss); 
++		//lsf_slopex_input->GetInputValue(&dlsf[0],gauss);
++		//lsf_slopey_input->GetInputValue(&dlsf[1],gauss);
++		//calvingrate_input->GetInputValue(&calvingrate,gauss);
+ 
+-		norm_dlsf=0.;
+-		for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
+-		norm_dlsf=sqrt(norm_dlsf);
++		//norm_dlsf=0.;
++		//for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
++		//norm_dlsf=sqrt(norm_dlsf);
+ 
+-		if(norm_dlsf>1.e-10)
+-			for(i=0;i<dim;i++) c[i]=calvingrate*dlsf[i]/norm_dlsf;
+-		else
+-			for(i=0;i<dim;i++) c[i]=0.;
++		//if(norm_dlsf>1.e-10)
++		//	for(i=0;i<dim;i++) c[i]=calvingrate*dlsf[i]/norm_dlsf;
++		//else
++		//for(i=0;i<dim;i++) c[i]=0.;
+ 		
+ 		for(i=0;i<dim;i++) w[i]=v[i]-c[i];
+ 
+@@ -205,9 +214,9 @@
+ 					&Ke->values[0],1);
+ 
+ 		/* Stabilization */
+-		int stabilization=2;
++		int stabilization=1;
+ 		vel=0.;
+-		for(i=0;i<dim;i++) vel+=v[i]*v[i];
++		for(i=0;i<dim;i++) vel+=w[i]*w[i];
+ 		vel=sqrt(vel)+1.e-14;
+ 		switch(stabilization){
+ 			case 0:
+@@ -216,7 +225,7 @@
+ 			case 1:
+ 				/* Artificial Diffusion */
+ 				basalelement->ElementSizes(&hx,&hy,&hz);
+-				h=sqrt( pow(hx*v[0]/vel,2) + pow(hy*v[1]/vel,2) ); 
++				h=sqrt( pow(hx*w[0]/vel,2) + pow(hy*w[1]/vel,2) ); 
+ 				kappa=h*vel/2.;
+ 				for(row=0;row<dim;row++)
+ 					for(col=0;col<dim;col++)
+@@ -233,10 +242,10 @@
+ 			case 2:
+ 				/* Streamline Upwinding */
+ 				basalelement->ElementSizes(&hx,&hy,&hz);
+-				h=sqrt( pow(hx*v[0]/vel,2) + pow(hy*v[1]/vel,2) );
++				h=sqrt( pow(hx*w[0]/vel,2) + pow(hy*w[1]/vel,2) );
+ 				for(row=0;row<dim;row++) 
+ 					for(col=0;col<dim;col++) 
+-						D[row*dim+col] = D_scalar*h/(2.*vel)*v[row]*v[col];
++						D[row*dim+col] = D_scalar*h/(2.*vel)*w[row]*w[col];
+ 
+ 				TripleMultiply(Bprime,dim,numnodes,1,
+ 							D,dim,dim,0,
+@@ -257,7 +266,7 @@
+ 	xDelete<IssmDouble>(v);
+ 	xDelete<IssmDouble>(w);
+ 	xDelete<IssmDouble>(c);
+-	xDelete<IssmDouble>(dlsf);
++	//xDelete<IssmDouble>(dlsf);
+ 	delete gauss;
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 	return Ke;
+Index: ../trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp	(revision 18735)
++++ ../trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp	(revision 18736)
+@@ -47,8 +47,10 @@
+ void DamageEvolutionAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	int finiteelement;
++	bool   islevelset;
+ 
+ 	iomodel->Constant(&finiteelement,DamageElementinterpEnum);
++	iomodel->Constant(&islevelset,TransientIslevelsetEnum);
+ 
+ 	/*Update elements: */
+ 	int counter=0;
+@@ -68,6 +70,10 @@
+ 	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
+ 	iomodel->FetchDataToInput(elements,PressureEnum);
+ 
++	if(islevelset){
++		iomodel->FetchDataToInput(elements,IceMaskNodeActivationEnum);
++	}
++
+ }/*}}}*/
+ void DamageEvolutionAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 
+@@ -440,6 +446,11 @@
+ }/*}}}*/
+ void DamageEvolutionAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
++	bool islevelset;
++	femmodel->parameters->FindParam(&islevelset,TransientIslevelsetEnum);
++	if(islevelset){
++		SetActiveNodesLSMx(femmodel);
++	}
+ 	return;
+ }/*}}}*/
+ 
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18735)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18736)
+@@ -207,6 +207,10 @@
+ 	DamageEnum,
+ 	NewDamageEnum,
+ 	StressIntensityFactorEnum,
++	CalvingratexEnum,
++	CalvingrateyEnum,
++	CalvingratexAverageEnum,
++	CalvingrateyAverageEnum,
+ 	StrainRateparallelEnum,
+ 	StrainRateperpendicularEnum,
+ 	MaterialsRhoIceEnum,
+@@ -244,6 +248,8 @@
+ 	Domain3DEnum,
+ 	MiscellaneousNameEnum, //FIXME: only used by qmu, should not be marshalled (already in queueing script)
+ 	MasstransportHydrostaticAdjustmentEnum,
++	MasstransportIscalvingrateEnum,
++	MasstransportLevermannCalvingCoeffEnum,
+ 	MasstransportIsfreesurfaceEnum,
+ 	MasstransportMinThicknessEnum,
+ 	MasstransportPenaltyFactorEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18735)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18736)
+@@ -215,6 +215,10 @@
+ 		case DamageEnum : return "Damage";
+ 		case NewDamageEnum : return "NewDamage";
+ 		case StressIntensityFactorEnum : return "StressIntensityFactor";
++		case CalvingratexEnum : return "Calvingratex";
++		case CalvingrateyEnum : return "Calvingratey";
++		case CalvingratexAverageEnum : return "CalvingratexAverage";
++		case CalvingrateyAverageEnum : return "CalvingrateyAverage";
+ 		case StrainRateparallelEnum : return "StrainRateparallel";
+ 		case StrainRateperpendicularEnum : return "StrainRateperpendicular";
+ 		case MaterialsRhoIceEnum : return "MaterialsRhoIce";
+@@ -252,6 +256,8 @@
+ 		case Domain3DEnum : return "Domain3D";
+ 		case MiscellaneousNameEnum : return "MiscellaneousName";
+ 		case MasstransportHydrostaticAdjustmentEnum : return "MasstransportHydrostaticAdjustment";
++		case MasstransportIscalvingrateEnum : return "MasstransportIscalvingrate";
++		case MasstransportLevermannCalvingCoeffEnum : return "MasstransportLevermannCalvingCoeff";
+ 		case MasstransportIsfreesurfaceEnum : return "MasstransportIsfreesurface";
+ 		case MasstransportMinThicknessEnum : return "MasstransportMinThickness";
+ 		case MasstransportPenaltyFactorEnum : return "MasstransportPenaltyFactor";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18735)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18736)
+@@ -218,6 +218,10 @@
+ 	      else if (strcmp(name,"Damage")==0) return DamageEnum;
+ 	      else if (strcmp(name,"NewDamage")==0) return NewDamageEnum;
+ 	      else if (strcmp(name,"StressIntensityFactor")==0) return StressIntensityFactorEnum;
++	      else if (strcmp(name,"Calvingratex")==0) return CalvingratexEnum;
++	      else if (strcmp(name,"Calvingratey")==0) return CalvingrateyEnum;
++	      else if (strcmp(name,"CalvingratexAverage")==0) return CalvingratexAverageEnum;
++	      else if (strcmp(name,"CalvingrateyAverage")==0) return CalvingrateyAverageEnum;
+ 	      else if (strcmp(name,"StrainRateparallel")==0) return StrainRateparallelEnum;
+ 	      else if (strcmp(name,"StrainRateperpendicular")==0) return StrainRateperpendicularEnum;
+ 	      else if (strcmp(name,"MaterialsRhoIce")==0) return MaterialsRhoIceEnum;
+@@ -255,14 +259,16 @@
+ 	      else if (strcmp(name,"Domain3D")==0) return Domain3DEnum;
+ 	      else if (strcmp(name,"MiscellaneousName")==0) return MiscellaneousNameEnum;
+ 	      else if (strcmp(name,"MasstransportHydrostaticAdjustment")==0) return MasstransportHydrostaticAdjustmentEnum;
++         else stage=3;
++   }
++   if(stage==3){
++	      if (strcmp(name,"MasstransportIscalvingrate")==0) return MasstransportIscalvingrateEnum;
++	      else if (strcmp(name,"MasstransportLevermannCalvingCoeff")==0) return MasstransportLevermannCalvingCoeffEnum;
+ 	      else if (strcmp(name,"MasstransportIsfreesurface")==0) return MasstransportIsfreesurfaceEnum;
+ 	      else if (strcmp(name,"MasstransportMinThickness")==0) return MasstransportMinThicknessEnum;
+ 	      else if (strcmp(name,"MasstransportPenaltyFactor")==0) return MasstransportPenaltyFactorEnum;
+ 	      else if (strcmp(name,"MasstransportSpcthickness")==0) return MasstransportSpcthicknessEnum;
+-         else stage=3;
+-   }
+-   if(stage==3){
+-	      if (strcmp(name,"MasstransportCalvingrate")==0) return MasstransportCalvingrateEnum;
++	      else if (strcmp(name,"MasstransportCalvingrate")==0) return MasstransportCalvingrateEnum;
+ 	      else if (strcmp(name,"MasstransportStabilization")==0) return MasstransportStabilizationEnum;
+ 	      else if (strcmp(name,"MasstransportVertexPairing")==0) return MasstransportVertexPairingEnum;
+ 	      else if (strcmp(name,"MasstransportNumRequestedOutputs")==0) return MasstransportNumRequestedOutputsEnum;
+@@ -376,16 +382,16 @@
+ 	      else if (strcmp(name,"BalancethicknessAnalysis")==0) return BalancethicknessAnalysisEnum;
+ 	      else if (strcmp(name,"BalancethicknessSolution")==0) return BalancethicknessSolutionEnum;
+ 	      else if (strcmp(name,"Balancethickness2Analysis")==0) return Balancethickness2AnalysisEnum;
+-	      else if (strcmp(name,"Balancethickness2Solution")==0) return Balancethickness2SolutionEnum;
++         else stage=4;
++   }
++   if(stage==4){
++	      if (strcmp(name,"Balancethickness2Solution")==0) return Balancethickness2SolutionEnum;
+ 	      else if (strcmp(name,"BalancethicknessSoftAnalysis")==0) return BalancethicknessSoftAnalysisEnum;
+ 	      else if (strcmp(name,"BalancethicknessSoftSolution")==0) return BalancethicknessSoftSolutionEnum;
+ 	      else if (strcmp(name,"BalancevelocityAnalysis")==0) return BalancevelocityAnalysisEnum;
+ 	      else if (strcmp(name,"BalancevelocitySolution")==0) return BalancevelocitySolutionEnum;
+ 	      else if (strcmp(name,"L2ProjectionEPLAnalysis")==0) return L2ProjectionEPLAnalysisEnum;
+-         else stage=4;
+-   }
+-   if(stage==4){
+-	      if (strcmp(name,"L2ProjectionBaseAnalysis")==0) return L2ProjectionBaseAnalysisEnum;
++	      else if (strcmp(name,"L2ProjectionBaseAnalysis")==0) return L2ProjectionBaseAnalysisEnum;
+ 	      else if (strcmp(name,"BedSlopeSolution")==0) return BedSlopeSolutionEnum;
+ 	      else if (strcmp(name,"DamageEvolutionSolution")==0) return DamageEvolutionSolutionEnum;
+ 	      else if (strcmp(name,"DamageEvolutionAnalysis")==0) return DamageEvolutionAnalysisEnum;
+@@ -499,16 +505,16 @@
+ 	      else if (strcmp(name,"Tria")==0) return TriaEnum;
+ 	      else if (strcmp(name,"TriaInput")==0) return TriaInputEnum;
+ 	      else if (strcmp(name,"Tetra")==0) return TetraEnum;
+-	      else if (strcmp(name,"TetraInput")==0) return TetraInputEnum;
++         else stage=5;
++   }
++   if(stage==5){
++	      if (strcmp(name,"TetraInput")==0) return TetraInputEnum;
+ 	      else if (strcmp(name,"Penta")==0) return PentaEnum;
+ 	      else if (strcmp(name,"PentaInput")==0) return PentaInputEnum;
+ 	      else if (strcmp(name,"Vertex")==0) return VertexEnum;
+ 	      else if (strcmp(name,"VertexPId")==0) return VertexPIdEnum;
+ 	      else if (strcmp(name,"VertexSId")==0) return VertexSIdEnum;
+-         else stage=5;
+-   }
+-   if(stage==5){
+-	      if (strcmp(name,"Air")==0) return AirEnum;
++	      else if (strcmp(name,"Air")==0) return AirEnum;
+ 	      else if (strcmp(name,"Ice")==0) return IceEnum;
+ 	      else if (strcmp(name,"Melange")==0) return MelangeEnum;
+ 	      else if (strcmp(name,"Water")==0) return WaterEnum;
+@@ -622,16 +628,16 @@
+ 	      else if (strcmp(name,"P1xP3")==0) return P1xP3Enum;
+ 	      else if (strcmp(name,"P2xP4")==0) return P2xP4Enum;
+ 	      else if (strcmp(name,"P1P1")==0) return P1P1Enum;
+-	      else if (strcmp(name,"P1P1GLS")==0) return P1P1GLSEnum;
++         else stage=6;
++   }
++   if(stage==6){
++	      if (strcmp(name,"P1P1GLS")==0) return P1P1GLSEnum;
+ 	      else if (strcmp(name,"MINI")==0) return MINIEnum;
+ 	      else if (strcmp(name,"MINIcondensed")==0) return MINIcondensedEnum;
+ 	      else if (strcmp(name,"TaylorHood")==0) return TaylorHoodEnum;
+ 	      else if (strcmp(name,"LATaylorHood")==0) return LATaylorHoodEnum;
+ 	      else if (strcmp(name,"XTaylorHood")==0) return XTaylorHoodEnum;
+-         else stage=6;
+-   }
+-   if(stage==6){
+-	      if (strcmp(name,"OneLayerP4z")==0) return OneLayerP4zEnum;
++	      else if (strcmp(name,"OneLayerP4z")==0) return OneLayerP4zEnum;
+ 	      else if (strcmp(name,"CrouzeixRaviart")==0) return CrouzeixRaviartEnum;
+ 	      else if (strcmp(name,"LACrouzeixRaviart")==0) return LACrouzeixRaviartEnum;
+ 	      else if (strcmp(name,"SaveResults")==0) return SaveResultsEnum;
+@@ -745,16 +751,16 @@
+ 	      else if (strcmp(name,"LevelsetfunctionSlopeX")==0) return LevelsetfunctionSlopeXEnum;
+ 	      else if (strcmp(name,"LevelsetfunctionSlopeY")==0) return LevelsetfunctionSlopeYEnum;
+ 	      else if (strcmp(name,"LevelsetfunctionPicard")==0) return LevelsetfunctionPicardEnum;
+-	      else if (strcmp(name,"Seaiceatm")==0) return SeaiceatmEnum;
++         else stage=7;
++   }
++   if(stage==7){
++	      if (strcmp(name,"Seaiceatm")==0) return SeaiceatmEnum;
+ 	      else if (strcmp(name,"Seaiceocean")==0) return SeaiceoceanEnum;
+ 	      else if (strcmp(name,"SeaiceThickness")==0) return SeaiceThicknessEnum;
+ 	      else if (strcmp(name,"SeaiceConcentration")==0) return SeaiceConcentrationEnum;
+ 	      else if (strcmp(name,"SeaiceMinConcentration")==0) return SeaiceMinConcentrationEnum;
+ 	      else if (strcmp(name,"SeaiceMinThickness")==0) return SeaiceMinThicknessEnum;
+-         else stage=7;
+-   }
+-   if(stage==7){
+-	      if (strcmp(name,"SeaiceMaxThickness")==0) return SeaiceMaxThicknessEnum;
++	      else if (strcmp(name,"SeaiceMaxThickness")==0) return SeaiceMaxThicknessEnum;
+ 	      else if (strcmp(name,"SeaiceSpcvx")==0) return SeaiceSpcvxEnum;
+ 	      else if (strcmp(name,"SeaiceSpcvy")==0) return SeaiceSpcvyEnum;
+ 	      else if (strcmp(name,"SeaiceCoriolisFactor")==0) return SeaiceCoriolisFactorEnum;
+Index: ../trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp	(revision 18735)
++++ ../trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp	(revision 18736)
+@@ -58,7 +58,7 @@
+ 					analysis_type==L2ProjectionBaseAnalysisEnum || 
+ 					analysis_type==BalancethicknessAnalysisEnum ||
+ 					analysis_type==HydrologyDCInefficientAnalysisEnum ||
+-					analysis_type==DamageEvolutionAnalysisEnum || 
++					//analysis_type==DamageEvolutionAnalysisEnum || 
+ 					analysis_type==HydrologyDCEfficientAnalysisEnum ||
+ 					analysis_type==LevelsetAnalysisEnum ||
+ 					analysis_type==ExtrapolationAnalysisEnum
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 18735)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 18736)
+@@ -82,6 +82,8 @@
+ 		parameters->AddObject(iomodel->CopyConstantObject(TransientIslevelsetEnum));
+ 		parameters->AddObject(iomodel->CopyConstantObject(TransientIsdamageevolutionEnum));
+ 		parameters->AddObject(iomodel->CopyConstantObject(TransientIshydrologyEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(MasstransportIscalvingrateEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(MasstransportLevermannCalvingCoeffEnum));
+ 		parameters->AddObject(iomodel->CopyConstantObject(MaterialsRheologyLawEnum));
+ 		parameters->AddObject(iomodel->CopyConstantObject(GiaCrossSectionShapeEnum));
+ 
+Index: ../trunk-jpl/src/c/cores/transient_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/transient_core.cpp	(revision 18735)
++++ ../trunk-jpl/src/c/cores/transient_core.cpp	(revision 18736)
+@@ -20,7 +20,7 @@
+ 
+ 	/*parameters: */
+ 	IssmDouble starttime,finaltime,dt,yts;
+-	bool       isstressbalance,ismasstransport,isFS,isthermal,isgroundingline,isgia,islevelset,isdamageevolution,ishydrology;
++	bool       isstressbalance,ismasstransport,isFS,isthermal,isgroundingline,isgia,islevelset,isdamageevolution,ishydrology,iscalvingrate;
+ 	bool       save_results,dakota_analysis;
+ 	bool       time_adapt=false;
+ 	int        output_frequency;
+@@ -52,6 +52,7 @@
+ 	femmodel->parameters->FindParam(&isdamageevolution,TransientIsdamageevolutionEnum);
+ 	femmodel->parameters->FindParam(&ishydrology,TransientIshydrologyEnum);
+ 	femmodel->parameters->FindParam(&isFS,FlowequationIsFSEnum);
++	femmodel->parameters->FindParam(&iscalvingrate,MasstransportIscalvingrateEnum);
+ 	if(isgroundingline) femmodel->parameters->FindParam(&groundingline_migration,GroundinglineMigrationEnum);
+ 	femmodel->parameters->FindParam(&numoutputs,TransientNumRequestedOutputsEnum);
+ 	if(numoutputs) femmodel->parameters->FindParam(&requested_outputs,&numoutputs,TransientRequestedOutputsEnum);
+@@ -100,6 +101,12 @@
+ 		}
+ 
+ 		if(islevelset){
++			if(iscalvingrate){
++				if(VerboseSolution()) _printf0_("   computing calving rate\n");
++				femmodel->StrainRateparallelx();
++				femmodel->StrainRateperpendicularx();
++				femmodel->CalvingRateLevermannx();
++			}
+ 			if(VerboseSolution()) _printf0_("   computing movement of ice boundaries\n");
+ 			/* smoothen slope of lsf for computation of normal on ice domain*/
+ 			levelsetfunctionslope_core(femmodel);
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18735)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18736)
+@@ -1694,6 +1694,30 @@
+ 	}
+ }
+ 	/*}}}*/
++void FemModel::CalvingRateLevermannx(){/*{{{*/
++
++	   for(int i=0;i<elements->Size();i++){
++			      Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++					      element->CalvingRateLevermann();
++							   }
++}
++/*}}}*/
++void FemModel::StrainRateparallelx(){/*{{{*/
++
++	   for(int i=0;i<elements->Size();i++){
++			      Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++					      element->StrainRateparallel();
++							   }
++}
++/*}}}*/
++void FemModel::StrainRateperpendicularx(){/*{{{*/
++
++	   for(int i=0;i<elements->Size();i++){
++			      Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++					      element->StrainRateperpendicular();
++							   }
++}
++/*}}}*/
+ #ifdef  _HAVE_DAKOTA_
+ void FemModel::DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses){/*{{{*/
+ 
+Index: ../trunk-jpl/src/c/classes/Elements/Element.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18735)
++++ ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18736)
+@@ -220,7 +220,8 @@
+ 		virtual void   ComputeDeviatoricStressTensor(void)=0;
+ 		virtual void	StressIntensityFactor(void)=0;
+ 		virtual void	StrainRateparallel(void)=0;
+-		virtual void   StrainRateperpendicular(void)=0;
++		virtual void	StrainRateperpendicular(void)=0;
++		virtual void	CalvingRateLevermann(void)=0;
+ 
+ 		virtual void   Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finite_element)=0;
+ 		virtual void   InputExtrude(int input_enum,int start)=0;
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18735)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18736)
+@@ -275,29 +275,76 @@
+ 	delete gauss;
+ }
+ /*}}}*/
+-void       Tria::StrainRateperpendicular(){/*{{{*/
++void       Tria::ComputeDeviatoricStressTensor(){/*{{{*/
+ 
+ 	IssmDouble  xyz_list[NUMVERTICES][3];
+-	GaussPenta* gauss=NULL;
++	IssmDouble  viscosity;
++	IssmDouble  epsilon[3]; /* epsilon=[exx,eyy,exy];*/
++	IssmDouble  tau_xx[NUMVERTICES];
++	IssmDouble	tau_yy[NUMVERTICES];
++	IssmDouble	tau_zz[NUMVERTICES]={0,0,0};
++	IssmDouble  tau_xy[NUMVERTICES];
++	IssmDouble	tau_xz[NUMVERTICES]={0,0,0};
++	IssmDouble	tau_yz[NUMVERTICES]={0,0,0};
++	GaussTria*  gauss=NULL;
++	int domaintype,dim=2;
++
++	/* Get node coordinates and dof list: */
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++
++	/*Retrieve all inputs we will be needing: */
++	this->FindParam(&domaintype,DomainTypeEnum);
++	if(domaintype!=Domain2DhorizontalEnum) _error_("deviatoric stress tensor calculation not implemented for mesh of type " <<EnumToStringx(domaintype));
++	Input* vx_input=inputs->GetInput(VxEnum);             _assert_(vx_input);
++	Input* vy_input=inputs->GetInput(VyEnum);             _assert_(vy_input);
++
++	/* Start looping on the number of vertices: */
++	gauss=new GaussTria();
++	for (int iv=0;iv<NUMVERTICES;iv++){
++		gauss->GaussVertex(iv);
++
++		/*Compute strain rate and viscosity: */
++		this->StrainRateSSA(&epsilon[0],&xyz_list[0][0],gauss,vx_input,vy_input);
++		this->ViscositySSA(&viscosity,dim,&xyz_list[0][0],gauss,vx_input,vy_input);
++
++		/*Compute Stress*/
++		tau_xx[iv]=2*viscosity*epsilon[0]; // tau = nu eps
++		tau_yy[iv]=2*viscosity*epsilon[1];
++		tau_xy[iv]=2*viscosity*epsilon[2];
++	}
++
++	/*Add Stress tensor components into inputs*/
++	this->inputs->AddInput(new TriaInput(DeviatoricStressxxEnum,&tau_xx[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(DeviatoricStressxyEnum,&tau_xy[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(DeviatoricStressxzEnum,&tau_xz[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(DeviatoricStressyyEnum,&tau_yy[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(DeviatoricStressyzEnum,&tau_yz[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(DeviatoricStresszzEnum,&tau_zz[0],P1Enum));
++
++	/*Clean up and return*/
++	delete gauss;
++}
++/*}}}*/
++void       Tria::StrainRateparallel(){/*{{{*/
++
++	IssmDouble *xyz_list = NULL;
++	IssmDouble  epsilon[3];
++	GaussTria* gauss=NULL;
+ 	IssmDouble  vx,vy,vel;
+ 	IssmDouble  strainxx;
+ 	IssmDouble  strainxy;
+ 	IssmDouble  strainyy;
+-	IssmDouble  strainperpendicular[NUMVERTICES];
++	IssmDouble  strainparallel[NUMVERTICES];
+ 
+ 	/* Get node coordinates and dof list: */
+-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++	this->GetVerticesCoordinates(&xyz_list);
+ 
+ 	/*Retrieve all inputs we will need*/
+ 	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
+ 	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
+-	Input* strainxx_input=inputs->GetInput(StrainRatexxEnum);             _assert_(strainxx_input);
+-	Input* strainxy_input=inputs->GetInput(StrainRatexyEnum);             _assert_(strainxy_input);
+-	Input* strainyy_input=inputs->GetInput(StrainRateyyEnum);             _assert_(strainyy_input);
+ 
+-
+ 	/* Start looping on the number of vertices: */
+-	gauss=new GaussPenta();
++	gauss=new GaussTria();
+ 	for (int iv=0;iv<NUMVERTICES;iv++){
+ 		gauss->GaussVertex(iv);
+ 
+@@ -305,43 +352,45 @@
+ 		vx_input->GetInputValue(&vx,gauss);
+ 		vy_input->GetInputValue(&vy,gauss);
+ 		vel=vx*vx+vy*vy;
+-		strainxx_input->GetInputValue(&strainxx,gauss);
+-		strainxy_input->GetInputValue(&strainxy,gauss);
+-		strainyy_input->GetInputValue(&strainyy,gauss);
+ 
+-		/*strainperpendicular= Strain rate perpendicular to the ice flow direction */
+-		strainperpendicular[iv]=(vx*vx*(strainyy)+vy*vy*(strainxx)-2*vy*vx*strainxy)/(vel+1.e-6);
++		/*Compute strain rate viscosity and pressure: */
++		this->StrainRateSSA(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
++		strainxx=epsilon[0];
++		strainyy=epsilon[1];
++		strainxy=epsilon[2];
++
++		/*strainparallel= Strain rate along the ice flow direction */
++		strainparallel[iv]=(vx*vx*(strainxx)+vy*vy*(strainyy)+2*vy*vx*strainxy)/(vel+1.e-6);
+ 	}
+ 
+ 	/*Add input*/
+-	this->inputs->AddInput(new PentaInput(StrainRateperpendicularEnum,&strainperpendicular[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(StrainRateparallelEnum,&strainparallel[0],P1Enum));
+ 
+ 	/*Clean up and return*/
+ 	delete gauss;
++	xDelete<IssmDouble>(xyz_list);
+ }
+ /*}}}*/
+-void       Tria::StrainRateparallel(){/*{{{*/
++void       Tria::StrainRateperpendicular(){/*{{{*/
+ 
+-	IssmDouble  xyz_list[NUMVERTICES][3];
+-	GaussPenta* gauss=NULL;
++	IssmDouble *xyz_list = NULL;
++	GaussTria* gauss=NULL;
++	IssmDouble  epsilon[3];
+ 	IssmDouble  vx,vy,vel;
+ 	IssmDouble  strainxx;
+ 	IssmDouble  strainxy;
+ 	IssmDouble  strainyy;
+-	IssmDouble  strainparallel[NUMVERTICES];
++	IssmDouble  strainperpendicular[NUMVERTICES];
+ 
+ 	/* Get node coordinates and dof list: */
+-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-	
++	this->GetVerticesCoordinates(&xyz_list);
++
+ 	/*Retrieve all inputs we will need*/
+ 	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
+ 	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
+-	Input* strainxx_input=inputs->GetInput(StrainRatexxEnum);             _assert_(strainxx_input);
+-	Input* strainxy_input=inputs->GetInput(StrainRatexyEnum);             _assert_(strainxy_input);
+-	Input* strainyy_input=inputs->GetInput(StrainRateyyEnum);             _assert_(strainyy_input);
+ 
+ 	/* Start looping on the number of vertices: */
+-	gauss=new GaussPenta();
++	gauss=new GaussTria();
+ 	for (int iv=0;iv<NUMVERTICES;iv++){
+ 		gauss->GaussVertex(iv);
+ 
+@@ -349,69 +398,77 @@
+ 		vx_input->GetInputValue(&vx,gauss);
+ 		vy_input->GetInputValue(&vy,gauss);
+ 		vel=vx*vx+vy*vy;
+-		strainxx_input->GetInputValue(&strainxx,gauss);
+-		strainxy_input->GetInputValue(&strainxy,gauss);
+-		strainyy_input->GetInputValue(&strainyy,gauss);
+ 
+-		/*strainparallel= Strain rate along the ice flow direction */
+-		strainparallel[iv]=(vx*vx*(strainxx)+vy*vy*(strainyy)+2*vy*vx*strainxy)/(vel+1.e-6);
++		/*Compute strain rate viscosity and pressure: */
++		this->StrainRateSSA(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
++		strainxx=epsilon[0];
++		strainyy=epsilon[1];
++		strainxy=epsilon[2];
++
++		/*strainperpendicular= Strain rate perpendicular to the ice flow direction */
++		strainperpendicular[iv]=(vx*vx*(strainyy)+vy*vy*(strainxx)-2*vy*vx*strainxy)/(vel+1.e-6);
+ 	}
+ 
+ 	/*Add input*/
+-	this->inputs->AddInput(new PentaInput(StrainRateparallelEnum,&strainparallel[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(StrainRateperpendicularEnum,&strainperpendicular[0],P1Enum));
+ 
+ 	/*Clean up and return*/
+ 	delete gauss;
++	xDelete<IssmDouble>(xyz_list);
+ }
+ /*}}}*/
+-void       Tria::ComputeDeviatoricStressTensor(){/*{{{*/
++void       Tria::CalvingRateLevermann(){/*{{{*/
+ 
+ 	IssmDouble  xyz_list[NUMVERTICES][3];
+-	IssmDouble  viscosity;
+-	IssmDouble  epsilon[3]; /* epsilon=[exx,eyy,exy];*/
+-	IssmDouble  tau_xx[NUMVERTICES];
+-	IssmDouble	tau_yy[NUMVERTICES];
+-	IssmDouble	tau_zz[NUMVERTICES]={0,0,0};
+-	IssmDouble  tau_xy[NUMVERTICES];
+-	IssmDouble	tau_xz[NUMVERTICES]={0,0,0};
+-	IssmDouble	tau_yz[NUMVERTICES]={0,0,0};
+-	GaussTria*  gauss=NULL;
+-	int domaintype,dim=2;
++	GaussTria* gauss=NULL;
++	IssmDouble  vx,vy,vel;
++	IssmDouble  strainparallel;
++	IssmDouble  propcoeff;
++	IssmDouble  strainperpendicular;
++	IssmDouble  calvingratex[NUMVERTICES];
++	IssmDouble  calvingratey[NUMVERTICES];
++	IssmDouble  calvingrate[NUMVERTICES];
+ 
++
+ 	/* Get node coordinates and dof list: */
+ 	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+ 
+-	/*Retrieve all inputs we will be needing: */
+-	this->FindParam(&domaintype,DomainTypeEnum);
+-	if(domaintype!=Domain2DhorizontalEnum) _error_("deviatoric stress tensor calculation not implemented for mesh of type " <<EnumToStringx(domaintype));
+-	Input* vx_input=inputs->GetInput(VxEnum);             _assert_(vx_input);
+-	Input* vy_input=inputs->GetInput(VyEnum);             _assert_(vy_input);
++	/*Retrieve all inputs and parameters we will need*/
++	Input* vx_input=inputs->GetInput(VxEnum);																		_assert_(vx_input);
++	Input* vy_input=inputs->GetInput(VyEnum);																		_assert_(vy_input);
++	Input* strainparallel_input=inputs->GetInput(StrainRateparallelEnum);								_assert_(strainparallel_input);
++	Input* strainperpendicular_input=inputs->GetInput(StrainRateperpendicularEnum);					_assert_(strainperpendicular_input);
++	this->parameters->FindParam(&propcoeff,MasstransportLevermannCalvingCoeffEnum);
+ 
+ 	/* Start looping on the number of vertices: */
+ 	gauss=new GaussTria();
+ 	for (int iv=0;iv<NUMVERTICES;iv++){
+ 		gauss->GaussVertex(iv);
+ 
+-		/*Compute strain rate and viscosity: */
+-		this->StrainRateSSA(&epsilon[0],&xyz_list[0][0],gauss,vx_input,vy_input);
+-		this->ViscositySSA(&viscosity,dim,&xyz_list[0][0],gauss,vx_input,vy_input);
++		/* Get the value we need*/
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		vel=vx*vx+vy*vy;
++		strainparallel_input->GetInputValue(&strainparallel,gauss);
++		strainperpendicular_input->GetInputValue(&strainperpendicular,gauss);
+ 
+-		/*Compute Stress*/
+-		tau_xx[iv]=2*viscosity*epsilon[0]; // tau = nu eps
+-		tau_yy[iv]=2*viscosity*epsilon[1];
+-		tau_xy[iv]=2*viscosity*epsilon[2];
++		/*Calving rate proportionnal to the positive product of the strain rate along the ice flow direction and the strain rate perpendicular to the ice flow */
++		calvingrate[iv]=propcoeff*strainparallel*strainperpendicular;
++		if(calvingrate[iv]<0){
++			calvingrate[iv]=0;
++		}
++		calvingratex[iv]=calvingrate[iv]*vx/(vel+1.e-6);
++		calvingratey[iv]=calvingrate[iv]*vy/(vel+1.e-6);
+ 	}
+ 
+-	/*Add Stress tensor components into inputs*/
+-	this->inputs->AddInput(new TriaInput(DeviatoricStressxxEnum,&tau_xx[0],P1Enum));
+-	this->inputs->AddInput(new TriaInput(DeviatoricStressxyEnum,&tau_xy[0],P1Enum));
+-	this->inputs->AddInput(new TriaInput(DeviatoricStressxzEnum,&tau_xz[0],P1Enum));
+-	this->inputs->AddInput(new TriaInput(DeviatoricStressyyEnum,&tau_yy[0],P1Enum));
+-	this->inputs->AddInput(new TriaInput(DeviatoricStressyzEnum,&tau_yz[0],P1Enum));
+-	this->inputs->AddInput(new TriaInput(DeviatoricStresszzEnum,&tau_zz[0],P1Enum));
++	/*Add input*/
++	this->inputs->AddInput(new TriaInput(CalvingratexEnum,&calvingratex[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(CalvingrateyEnum,&calvingratey[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(MasstransportCalvingrateEnum,&calvingrate[0],P1Enum));
+ 
+ 	/*Clean up and return*/
+ 	delete gauss;
++
+ }
+ /*}}}*/
+ void       Tria::Configure(Elements* elementsin, Loads* loadsin,Nodes* nodesin,Vertices *verticesin,Materials* materialsin, Parameters* parametersin){/*{{{*/
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18735)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18736)
+@@ -54,10 +54,11 @@
+ 		void        ComputeSigmaNN();
+ 		void        ComputeStressTensor();
+ 		void        ComputeDeviatoricStressTensor();
++		void			StrainRateparallel();
++		void			StrainRateperpendicular();
+ 		void        ComputeSurfaceNormalVelocity();
+ 		void        StressIntensityFactor(void){_error_("not implemented yet");};
+-		void			StrainRateparallel();
+-		void			StrainRateperpendicular();
++		void			CalvingRateLevermann();
+ 		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters);
+ 		void        SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters);
+ 		void        ResetHooks();
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18735)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18736)
+@@ -346,6 +346,60 @@
+ 	delete gauss;
+ }
+ /*}}}*/
++void       Penta::CalvingRateLevermann(){/*{{{*/
++
++	IssmDouble  xyz_list[NUMVERTICES][3];
++	GaussPenta* gauss=NULL;
++	IssmDouble  vx,vy,vel;
++	IssmDouble  strainparallel;
++	IssmDouble  propcoeff;
++	IssmDouble  strainperpendicular;
++	IssmDouble  calvingratex[NUMVERTICES];
++	IssmDouble  calvingratey[NUMVERTICES];
++	IssmDouble  calvingrate[NUMVERTICES];
++
++
++	/* Get node coordinates and dof list: */
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++
++	/*Retrieve all inputs and parameters we will need*/
++	Input* vx_input=inputs->GetInput(VxEnum);																		_assert_(vx_input);
++	Input* vy_input=inputs->GetInput(VyEnum);																		_assert_(vy_input);
++	Input* strainparallel_input=inputs->GetInput(StrainRateparallelEnum);								_assert_(strainparallel_input);
++	Input* strainperpendicular_input=inputs->GetInput(StrainRateperpendicularEnum);             _assert_(strainperpendicular_input);
++	this->parameters->FindParam(&propcoeff,MasstransportLevermannCalvingCoeffEnum);
++
++	/* Start looping on the number of vertices: */
++	gauss=new GaussPenta();
++	for (int iv=0;iv<NUMVERTICES;iv++){
++		gauss->GaussVertex(iv);
++
++		/* Get the value we need*/
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		vel=vx*vx+vy*vy;
++		strainparallel_input->GetInputValue(&strainparallel,gauss);
++		strainperpendicular_input->GetInputValue(&strainperpendicular,gauss);
++
++		/*Calving rate proportionnal to the positive product of the strain rate along the ice flow direction and the strain rate perpendicular to the ice flow */
++		calvingrate[iv]=propcoeff*strainparallel*strainperpendicular;	
++		if(calvingrate[iv]<0){
++			calvingrate[iv]=0;
++		}
++		calvingratex[iv]=calvingrate[iv]*vx/(vel+1.e-6);
++		calvingratey[iv]=calvingrate[iv]*vy/(vel+1.e-6);
++	}
++
++	/*Add input*/
++	this->inputs->AddInput(new PentaInput(CalvingratexEnum,&calvingratex[0],P1Enum));
++	this->inputs->AddInput(new PentaInput(CalvingrateyEnum,&calvingratey[0],P1Enum));
++	this->inputs->AddInput(new PentaInput(MasstransportCalvingrateEnum,&calvingrate[0],P1Enum));
++
++	/*Clean up and return*/
++	delete gauss;
++
++}
++/*}}}*/
+ void       Penta::StressIntensityFactor(){/*{{{*/
+ 
+ 	/* Check if we are on the base */
+@@ -425,7 +479,8 @@
+ /*}}}*/
+ void       Penta::StrainRateparallel(){/*{{{*/
+ 
+-	IssmDouble  xyz_list[NUMVERTICES][3];
++	IssmDouble *xyz_list = NULL;
++	IssmDouble  epsilon[6];
+ 	GaussPenta* gauss=NULL;
+ 	IssmDouble  vx,vy,vel;
+ 	IssmDouble  strainxx;
+@@ -434,14 +489,12 @@
+ 	IssmDouble  strainparallel[NUMVERTICES];
+ 
+ 	/* Get node coordinates and dof list: */
+-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-	
++	this->GetVerticesCoordinates(&xyz_list);
++
+ 	/*Retrieve all inputs we will need*/
+ 	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
+ 	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
+-	Input* strainxx_input=inputs->GetInput(StrainRatexxEnum);             _assert_(strainxx_input);
+-	Input* strainxy_input=inputs->GetInput(StrainRatexyEnum);             _assert_(strainxy_input);
+-	Input* strainyy_input=inputs->GetInput(StrainRateyyEnum);             _assert_(strainyy_input);
++	Input* vz_input=inputs->GetInput(VzEnum);												_assert_(vz_input);
+ 
+ 	/* Start looping on the number of vertices: */
+ 	gauss=new GaussPenta();
+@@ -452,10 +505,13 @@
+ 		vx_input->GetInputValue(&vx,gauss);
+ 		vy_input->GetInputValue(&vy,gauss);
+ 		vel=vx*vx+vy*vy;
+-		strainxx_input->GetInputValue(&strainxx,gauss);
+-		strainxy_input->GetInputValue(&strainxy,gauss);
+-		strainyy_input->GetInputValue(&strainyy,gauss);
+ 
++		/*Compute strain rate and viscosity: */
++		this->StrainRateFS(&epsilon[0],xyz_list,gauss,vx_input,vy_input,vz_input);
++		strainxx=epsilon[0];
++		strainyy=epsilon[1];
++		strainxy=epsilon[3];
++
+ 		/*strainparallel= Strain rate along the ice flow direction */
+ 		strainparallel[iv]=(vx*vx*(strainxx)+vy*vy*(strainyy)+2*vy*vx*strainxy)/(vel+1.e-6);
+ 	}
+@@ -465,11 +521,13 @@
+ 
+ 	/*Clean up and return*/
+ 	delete gauss;
++	xDelete<IssmDouble>(xyz_list);
+ }
+ /*}}}*/
+ void       Penta::StrainRateperpendicular(){/*{{{*/
+ 
+-	IssmDouble  xyz_list[NUMVERTICES][3];
++	IssmDouble *xyz_list = NULL;
++	IssmDouble  epsilon[6];
+ 	GaussPenta* gauss=NULL;
+ 	IssmDouble  vx,vy,vel;
+ 	IssmDouble  strainxx;
+@@ -478,16 +536,13 @@
+ 	IssmDouble  strainperpendicular[NUMVERTICES];
+ 
+ 	/* Get node coordinates and dof list: */
+-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++	this->GetVerticesCoordinates(&xyz_list);
+ 
+ 	/*Retrieve all inputs we will need*/
+ 	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
+ 	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
+-	Input* strainxx_input=inputs->GetInput(StrainRatexxEnum);             _assert_(strainxx_input);
+-	Input* strainxy_input=inputs->GetInput(StrainRatexyEnum);             _assert_(strainxy_input);
+-	Input* strainyy_input=inputs->GetInput(StrainRateyyEnum);             _assert_(strainyy_input);
++	Input* vz_input=inputs->GetInput(VzEnum);												_assert_(vz_input);
+ 
+-
+ 	/* Start looping on the number of vertices: */
+ 	gauss=new GaussPenta();
+ 	for (int iv=0;iv<NUMVERTICES;iv++){
+@@ -497,10 +552,13 @@
+ 		vx_input->GetInputValue(&vx,gauss);
+ 		vy_input->GetInputValue(&vy,gauss);
+ 		vel=vx*vx+vy*vy;
+-		strainxx_input->GetInputValue(&strainxx,gauss);
+-		strainxy_input->GetInputValue(&strainxy,gauss);
+-		strainyy_input->GetInputValue(&strainyy,gauss);
+ 
++		/*Compute strain rate and viscosity: */
++		this->StrainRateFS(&epsilon[0],xyz_list,gauss,vx_input,vy_input,vz_input);
++		strainxx=epsilon[0];
++		strainyy=epsilon[1];
++		strainxy=epsilon[3];
++
+ 		/*strainperpendicular= Strain rate perpendicular to the ice flow direction */
+ 		strainperpendicular[iv]=(vx*vx*(strainyy)+vy*vy*(strainxx)-2*vy*vx*strainxy)/(vel+1.e-6);
+ 	}
+@@ -510,6 +568,7 @@
+ 
+ 	/*Clean up and return*/
+ 	delete gauss;
++	xDelete<IssmDouble>(xyz_list);
+ }
+ /*}}}*/
+ void       Penta::Configure(Elements* elementsin, Loads* loadsin, Nodes* nodesin,Vertices* verticesin, Materials* materialsin, Parameters* parametersin){/*{{{*/
+@@ -2175,11 +2234,15 @@
+ 	if(this->material->IsDamage())this->InputDepthAverageAtBase(DamageDEnum,DamageDbarEnum);
+ 	if(this->inputs->GetInput(VxEnum)) this->InputDepthAverageAtBase(VxEnum,VxAverageEnum);
+ 	if(this->inputs->GetInput(VyEnum)) this->InputDepthAverageAtBase(VyEnum,VyAverageEnum);
++	if(this->inputs->GetInput(CalvingratexEnum)) this->InputDepthAverageAtBase(CalvingratexEnum,CalvingratexAverageEnum);
++	if(this->inputs->GetInput(CalvingrateyEnum)) this->InputDepthAverageAtBase(CalvingrateyEnum,CalvingrateyAverageEnum);
+ 	Tria* tria=(Tria*)SpawnTria(0,1,2);
+ 	this->inputs->DeleteInput(MaterialsRheologyBbarEnum);
+ 	this->inputs->DeleteInput(DamageDbarEnum);
+ 	this->inputs->DeleteInput(VxAverageEnum);
+ 	this->inputs->DeleteInput(VyAverageEnum);
++	this->inputs->DeleteInput(CalvingratexAverageEnum);
++	this->inputs->DeleteInput(CalvingrateyAverageEnum);
+ 
+ 	return tria;
+ }
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18735)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18736)
+@@ -59,6 +59,7 @@
+ 		void   StressIntensityFactor();
+ 		void   StrainRateparallel();
+ 		void   StrainRateperpendicular();
++		void   CalvingRateLevermann();
+ 		void   Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
+ 		void   ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz);
+ 		int    FiniteElement(void);
+Index: ../trunk-jpl/src/c/classes/Elements/Seg.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18735)
++++ ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18736)
+@@ -57,8 +57,9 @@
+ 		void        ComputeStressTensor(){_error_("not implemented yet");};
+ 		void        ComputeDeviatoricStressTensor(){_error_("not implemented yet");};
+ 		void        StressIntensityFactor(void){_error_("not implemented yet");};
+-		void			StrainRateparallel(void){_error_("not implemented yet");};
+-		void			StrainRateperpendicular(void){_error_("not implemented yet");};
++		void        StrainRateparallel(void){_error_("not implemented yet");};
++		void        StrainRateperpendicular(void){_error_("not implemented yet");};
++		void        CalvingRateLevermann(void){_error_("not implemented yet");};
+ 		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters){_error_("not implemented yet");};
+ 		void        SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters){_error_("not implemented yet");};
+ 		void        ResetHooks(){_error_("not implemented yet");};
+Index: ../trunk-jpl/src/c/classes/Elements/Tetra.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18735)
++++ ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18736)
+@@ -59,6 +59,7 @@
+ 		void        StressIntensityFactor(void){_error_("not implemented yet");};
+ 		void        StrainRateparallel(void){_error_("not implemented yet");};
+ 		void        StrainRateperpendicular(void){_error_("not implemented yet");};
++		void        CalvingRateLevermann(void){_error_("not implemented yet");};
+ 		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters);
+ 		void        SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters);
+ 		void        ResetHooks();
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18735)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18736)
+@@ -1209,6 +1209,14 @@
+ 				this->StressIntensityFactor();
+ 				input=this->inputs->GetInput(output_enum);
+ 				break;
++			case CalvingratexEnum:
++			case CalvingrateyEnum:
++			case MasstransportCalvingrateEnum:
++				this->StrainRateparallel();
++				this->StrainRateperpendicular();
++				this->CalvingRateLevermann();
++				input=this->inputs->GetInput(output_enum);
++				break;
+ 			case StrainRateparallelEnum:
+ 				this->StrainRateparallel();
+ 				input=this->inputs->GetInput(output_enum);
+Index: ../trunk-jpl/src/c/classes/FemModel.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.h	(revision 18735)
++++ ../trunk-jpl/src/c/classes/FemModel.h	(revision 18736)
+@@ -81,6 +81,9 @@
+ 		void ElementResponsex(IssmDouble* presponse,int response_enum);
+ 		void BalancethicknessMisfitx(IssmDouble* pV);
+ 		void StressIntensityFactorx();
++		void StrainRateparallelx();
++		void StrainRateperpendicularx();
++		void CalvingRateLevermannx();
+ 		#ifdef  _HAVE_DAKOTA_
+ 		void DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses);
+ 		#endif
Index: /issm/oecreview/Archive/18296-19100/ISSM-18736-18737.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18736-18737.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18736-18737.diff	(revision 19102)
@@ -0,0 +1,88 @@
+Index: ../trunk-jpl/src/m/enum/CalvingratexAverageEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingratexAverageEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvingratexAverageEnum.m	(revision 18737)
+@@ -0,0 +1,11 @@
++function macro=CalvingratexAverageEnum()
++%CALVINGRATEXAVERAGEENUM - Enum of CalvingratexAverage
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvingratexAverageEnum()
++
++macro=StringToEnum('CalvingratexAverage');
+Index: ../trunk-jpl/src/m/enum/CalvingratexEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingratexEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvingratexEnum.m	(revision 18737)
+@@ -0,0 +1,11 @@
++function macro=CalvingratexEnum()
++%CALVINGRATEXENUM - Enum of Calvingratex
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvingratexEnum()
++
++macro=StringToEnum('Calvingratex');
+Index: ../trunk-jpl/src/m/enum/CalvingrateyAverageEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingrateyAverageEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvingrateyAverageEnum.m	(revision 18737)
+@@ -0,0 +1,11 @@
++function macro=CalvingrateyAverageEnum()
++%CALVINGRATEYAVERAGEENUM - Enum of CalvingrateyAverage
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvingrateyAverageEnum()
++
++macro=StringToEnum('CalvingrateyAverage');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18736)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18737)
+@@ -207,6 +207,10 @@
+ def DamageEnum(): return StringToEnum("Damage")[0]
+ def NewDamageEnum(): return StringToEnum("NewDamage")[0]
+ def StressIntensityFactorEnum(): return StringToEnum("StressIntensityFactor")[0]
++def CalvingratexEnum(): return StringToEnum("Calvingratex")[0]
++def CalvingrateyEnum(): return StringToEnum("Calvingratey")[0]
++def CalvingratexAverageEnum(): return StringToEnum("CalvingratexAverage")[0]
++def CalvingrateyAverageEnum(): return StringToEnum("CalvingrateyAverage")[0]
+ def StrainRateparallelEnum(): return StringToEnum("StrainRateparallel")[0]
+ def StrainRateperpendicularEnum(): return StringToEnum("StrainRateperpendicular")[0]
+ def MaterialsRhoIceEnum(): return StringToEnum("MaterialsRhoIce")[0]
+@@ -244,6 +248,8 @@
+ def Domain3DEnum(): return StringToEnum("Domain3D")[0]
+ def MiscellaneousNameEnum(): return StringToEnum("MiscellaneousName")[0]
+ def MasstransportHydrostaticAdjustmentEnum(): return StringToEnum("MasstransportHydrostaticAdjustment")[0]
++def MasstransportIscalvingrateEnum(): return StringToEnum("MasstransportIscalvingrate")[0]
++def MasstransportLevermannCalvingCoeffEnum(): return StringToEnum("MasstransportLevermannCalvingCoeff")[0]
+ def MasstransportIsfreesurfaceEnum(): return StringToEnum("MasstransportIsfreesurface")[0]
+ def MasstransportMinThicknessEnum(): return StringToEnum("MasstransportMinThickness")[0]
+ def MasstransportPenaltyFactorEnum(): return StringToEnum("MasstransportPenaltyFactor")[0]
+Index: ../trunk-jpl/src/m/enum/CalvingrateyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingrateyEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvingrateyEnum.m	(revision 18737)
+@@ -0,0 +1,11 @@
++function macro=CalvingrateyEnum()
++%CALVINGRATEYENUM - Enum of Calvingratey
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvingrateyEnum()
++
++macro=StringToEnum('Calvingratey');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18737-18738.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18737-18738.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18737-18738.diff	(revision 19102)
@@ -0,0 +1,162 @@
+Index: ../trunk-jpl/src/m/os/oshostname.m
+===================================================================
+--- ../trunk-jpl/src/m/os/oshostname.m	(revision 18737)
++++ ../trunk-jpl/src/m/os/oshostname.m	(revision 18738)
+@@ -4,6 +4,8 @@
+ %   usage: hostname=oshostname();
+ %
+ %
++hostname='sylvestre';
++return;
+ 
+ if ispc(),
+ 	[status,hostname]=system('hostname');
+Index: ../trunk-jpl/src/m/solve/waitonlock.m
+===================================================================
+--- ../trunk-jpl/src/m/solve/waitonlock.m	(revision 18737)
++++ ../trunk-jpl/src/m/solve/waitonlock.m	(revision 18738)
+@@ -60,7 +60,7 @@
+ 		ispresent=(exist(lockfilename,'file') & exist(logfilename,'file'));
+ 		time=etime(clock,time0)/60;
+ 	else
+-		pause(5);
++		pause(60);
+ 		time=etime(clock,time0);
+ 		fprintf('\rchecking for job completion (time: %i min %i sec)      ',floor(time/60),floor(rem(time,60)));
+ 		time=time/60; %converts time from sec to min
+Index: ../trunk-jpl/src/m/boundaryconditions/SetMarineIceSheetBC.m
+===================================================================
+--- ../trunk-jpl/src/m/boundaryconditions/SetMarineIceSheetBC.m	(revision 18737)
++++ ../trunk-jpl/src/m/boundaryconditions/SetMarineIceSheetBC.m	(revision 18738)
+@@ -53,15 +53,25 @@
+ %First find segments that are not completely on the front
+ if strcmp(elementtype(md.mesh),'Penta'),
+ 	numbernodesfront=4;
++	%I added the next part. If not, there would be no segments !
++	md.mesh.vertexconnectivity=NodeConnectivity(md.mesh.elements2d,md.mesh.numberofvertices2d);
++	md.mesh.elementconnectivity=ElementConnectivity(md.mesh.elements2d,md.mesh.vertexconnectivity);
++	segments2=contourenvelope(md);
++	md.mesh.vertexonboundary=zeros(md.mesh.numberofvertices/md.mesh.numberoflayers,1); md.mesh.vertexonboundary(segments2(:,1:2))=1;
++	md.mesh.vertexonboundary=repmat(md.mesh.vertexonboundary,md.mesh.numberoflayers,1);
++	%Then do it for 3d as usual
++	md.mesh.vertexconnectivity=NodeConnectivity(md.mesh.elements,md.mesh.numberofvertices);
++	md.mesh.elementconnectivity=ElementConnectivity(md.mesh.elements,md.mesh.vertexconnectivity);
+ elseif strcmp(elementtype(md.mesh),'Tria'),
+ 	numbernodesfront=2;
++	segments2=md.mesh.segments;
+ else
+ 	error('mesh type not supported yet');
+ end
+-segmentsfront=md.mask.ice_levelset(md.mesh.segments(:,1:numbernodesfront))==0;
++segmentsfront=md.mask.ice_levelset(segments2(:,1:numbernodesfront))==0;
+ segments=find(sum(segmentsfront,2)~=numbernodesfront);
+ %Find all nodes for these segments and spc them
+-pos=md.mesh.segments(segments,1:numbernodesfront);
++pos=segments2(segments,1:numbernodesfront);
+ md.stressbalance.spcvx(pos(:))=0;
+ md.stressbalance.spcvy(pos(:))=0;
+ md.stressbalance.spcvz(pos(:))=0; % FIXME probably shouldn't spc vertical velocity here
+Index: ../trunk-jpl/src/m/classes/clusters/hpc.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/hpc.m	(revision 18737)
++++ ../trunk-jpl/src/m/classes/clusters/hpc.m	(revision 18738)
+@@ -49,9 +49,9 @@
+ 		 %}}}
+ 		 function md = checkconsistency(cluster,md,solution,analyses) % {{{
+ 
+-			 available_queues={'pub64','free64','free48','free*,pub64','free*'};
+-			 queue_requirements_time=[Inf Inf Inf Inf Inf];
+-			 queue_requirements_np=[64 64 48 48 48];
++			 available_queues={'pub64','free64','free48','free*,pub64','free*','free*,free64'};
++			 queue_requirements_time=[Inf Inf Inf Inf Inf Inf];
++			 queue_requirements_np=[64 64 48 48 48 48];
+ 
+ 			 QueueRequirements(available_queues,queue_requirements_time,queue_requirements_np,cluster.queue,cluster.np,1)
+ 
+@@ -105,7 +105,7 @@
+ 			 fprintf(fid,'#$ -q %s \n',cluster.queue);
+ 			 fprintf(fid,'#$ -pe one-node-mpi 2-64\n');
+ 			 fprintf(fid,'#$ -R y\n');
+-			 fprintf(fid,'#$ -m beas\n');
++			 %fprintf(fid,'#$ -m beas\n');
+ 			 fprintf(fid,'#$ -o %s.outlog \n',modelname);
+ 			 fprintf(fid,'#$ -e %s.errlog \n\n',modelname);
+ 			 fprintf(fid,'export ISSM_DIR="%s/../"\n',cluster.codepath); %FIXME
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 18737)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 18738)
+@@ -303,6 +303,9 @@
+ 			if ~isnan(md.mesh.vertexonboundary), mesh.vertexonboundary=project2d(md,md.mesh.vertexonboundary,1); end
+ 			if ~isnan(md.mesh.elementconnectivity), mesh.elementconnectivity=project2d(md,md.mesh.elementconnectivity,1); end
+ 			md.mesh=mesh;
++			md.mesh.vertexconnectivity=NodeConnectivity(md.mesh.elements,md.mesh.numberofvertices);
++			md.mesh.elementconnectivity=ElementConnectivity(md.mesh.elements,md.mesh.vertexconnectivity);
++			md.mesh.segments=contourenvelope(md);
+ 
+ 		end % }}}
+ 		function md2 = extract(md,area) % {{{
+Index: ../trunk-jpl/src/m/classes/masstransport.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/masstransport.m	(revision 18737)
++++ ../trunk-jpl/src/m/classes/masstransport.m	(revision 18738)
+@@ -6,7 +6,9 @@
+ classdef masstransport
+ 	properties (SetAccess=public) 
+ 		 spcthickness           = NaN;
++		 iscalvingrate          = 0;
+ 		 calvingrate            = NaN;
++		 levermann_calving_coeff= 0;
+ 		 isfreesurface          = 0;
+ 		 min_thickness          = 0;
+ 		 hydrostatic_adjustment = 0;
+@@ -48,7 +50,9 @@
+             % Masstransport solution parameters
+             fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Masstransport solution parameters">','<section name="masstransport" />');                    
+             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="spcthickness" type="',class(obj.spcthickness),'" default="',convert2str(obj.spcthickness),'">','     <section name="masstransport" />','     <help> thickness constraints (NaN means no constraint) [m] </help>','  </parameter>');
++				fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="iscalvingrate" type="',class(obj.iscalvingrate),'" default="',convert2str(obj.iscalvingrate),'">','     <section name="masstransport" />','     <help> do we use calving (loss of ice) </help>','  </parameter>');
+             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="calvingrate" type="',class(obj.calvingrate),'" default="',convert2str(obj.calvingrate),'">','     <section name="masstransport" />','     <help> calving rate at given location [m/a] </help>','  </parameter>');
++				fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="levermann_calving_coeff" type="',class(obj.levermann_calving_coeff),'" default="',convert2str(obj.levermann_calving_coeff),'">','     <section name="masstransport" />','     <help> Proportionality coefficient in Levermann model  </help>','  </parameter>');
+             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isfreesurface" type="',class(obj.isfreesurface),'" default="',convert2str(obj.isfreesurface),'">','     <section name="masstransport" />','     <help> do we use free surfaces (FS only) are mass conservation </help>','  </parameter>');
+             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="min_thickness" type="',class(obj.min_thickness),'" default="',convert2str(obj.min_thickness),'">','     <section name="masstransport" />','     <help> minimum ice thickness allowed [m] </help>','  </parameter>');
+             
+@@ -99,6 +103,9 @@
+ 		end % }}}
+ 		function obj = setdefaultparameters(obj) % {{{
+ 
++			%Proportionality coefficient in Levermann model
++			obj.levermann_calving_coeff=8e21;
++			
+ 			%Type of stabilization to use 0:nothing 1:artificial_diffusivity 3:Discontinuous Galerkin
+ 			obj.stabilization=1;
+ 
+@@ -121,7 +128,9 @@
+ 
+ 			md = checkfield(md,'fieldname','masstransport.spcthickness','forcing',1);
+ 			if(ismember(LevelsetAnalysisEnum(), analyses) & md.transient.islevelset)
++				md = checkfield(md,'fieldname','masstransport.iscalvingrate','values',[0 1]);
+ 				md = checkfield(md,'fieldname','masstransport.calvingrate','NaN',1,'size',[md.mesh.numberofvertices 1],'>=',0);
++				md = checkfield(md,'fieldname','masstransport.levermann_calving_coeff','>',0);
+ 			end
+ 
+ 			md = checkfield(md,'fieldname','masstransport.isfreesurface','values',[0 1]);
+@@ -134,7 +143,9 @@
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   Masstransport solution parameters:'));
+ 			fielddisplay(obj,'spcthickness','thickness constraints (NaN means no constraint) [m]');
++			fielddisplay(obj,'iscalvingrate','do we use calving (loss of ice)');
+ 			fielddisplay(obj,'calvingrate','calving rate at given location [m/a]');
++			fielddisplay(obj,'levermann_calving_coeff','proportionality coefficient in Levermann model');
+ 			fielddisplay(obj,'isfreesurface','do we use free surfaces (FS only) are mass conservation');
+ 			fielddisplay(obj,'min_thickness','minimum ice thickness allowed [m]');
+ 			fielddisplay(obj,'hydrostatic_adjustment','adjustment of ice shelves surface and bed elevations: ''Incremental'' or ''Absolute'' ');
+@@ -152,7 +163,9 @@
+ 
+ 			WriteData(fid,'object',obj,'fieldname','spcthickness','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
+ 			WriteData(fid,'object',obj,'fieldname','calvingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts);
++			WriteData(fid,'object',obj,'fieldname','iscalvingrate','format','Boolean');
+ 			WriteData(fid,'object',obj,'fieldname','isfreesurface','format','Boolean');
++			WriteData(fid,'object',obj,'fieldname','levermann_calving_coeff','format','Double');
+ 			WriteData(fid,'object',obj,'fieldname','min_thickness','format','Double');
+ 			WriteData(fid,'data',StringToEnum(obj.hydrostatic_adjustment),'format','Integer','enum',MasstransportHydrostaticAdjustmentEnum());
+ 			WriteData(fid,'object',obj,'fieldname','stabilization','format','Integer');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18738-18739.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18738-18739.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18738-18739.diff	(revision 19102)
@@ -0,0 +1,75 @@
+Index: ../trunk-jpl/src/m/os/oshostname.m
+===================================================================
+--- ../trunk-jpl/src/m/os/oshostname.m	(revision 18738)
++++ ../trunk-jpl/src/m/os/oshostname.m	(revision 18739)
+@@ -4,8 +4,6 @@
+ %   usage: hostname=oshostname();
+ %
+ %
+-hostname='sylvestre';
+-return;
+ 
+ if ispc(),
+ 	[status,hostname]=system('hostname');
+Index: ../trunk-jpl/src/m/solve/waitonlock.m
+===================================================================
+--- ../trunk-jpl/src/m/solve/waitonlock.m	(revision 18738)
++++ ../trunk-jpl/src/m/solve/waitonlock.m	(revision 18739)
+@@ -60,7 +60,7 @@
+ 		ispresent=(exist(lockfilename,'file') & exist(logfilename,'file'));
+ 		time=etime(clock,time0)/60;
+ 	else
+-		pause(60);
++		pause(5);
+ 		time=etime(clock,time0);
+ 		fprintf('\rchecking for job completion (time: %i min %i sec)      ',floor(time/60),floor(rem(time,60)));
+ 		time=time/60; %converts time from sec to min
+Index: ../trunk-jpl/src/m/boundaryconditions/SetMarineIceSheetBC.m
+===================================================================
+--- ../trunk-jpl/src/m/boundaryconditions/SetMarineIceSheetBC.m	(revision 18738)
++++ ../trunk-jpl/src/m/boundaryconditions/SetMarineIceSheetBC.m	(revision 18739)
+@@ -53,25 +53,15 @@
+ %First find segments that are not completely on the front
+ if strcmp(elementtype(md.mesh),'Penta'),
+ 	numbernodesfront=4;
+-	%I added the next part. If not, there would be no segments !
+-	md.mesh.vertexconnectivity=NodeConnectivity(md.mesh.elements2d,md.mesh.numberofvertices2d);
+-	md.mesh.elementconnectivity=ElementConnectivity(md.mesh.elements2d,md.mesh.vertexconnectivity);
+-	segments2=contourenvelope(md);
+-	md.mesh.vertexonboundary=zeros(md.mesh.numberofvertices/md.mesh.numberoflayers,1); md.mesh.vertexonboundary(segments2(:,1:2))=1;
+-	md.mesh.vertexonboundary=repmat(md.mesh.vertexonboundary,md.mesh.numberoflayers,1);
+-	%Then do it for 3d as usual
+-	md.mesh.vertexconnectivity=NodeConnectivity(md.mesh.elements,md.mesh.numberofvertices);
+-	md.mesh.elementconnectivity=ElementConnectivity(md.mesh.elements,md.mesh.vertexconnectivity);
+ elseif strcmp(elementtype(md.mesh),'Tria'),
+ 	numbernodesfront=2;
+-	segments2=md.mesh.segments;
+ else
+ 	error('mesh type not supported yet');
+ end
+-segmentsfront=md.mask.ice_levelset(segments2(:,1:numbernodesfront))==0;
++segmentsfront=md.mask.ice_levelset(md.mesh.segments(:,1:numbernodesfront))==0;
+ segments=find(sum(segmentsfront,2)~=numbernodesfront);
+ %Find all nodes for these segments and spc them
+-pos=segments2(segments,1:numbernodesfront);
++pos=md.mesh.segments(segments,1:numbernodesfront);
+ md.stressbalance.spcvx(pos(:))=0;
+ md.stressbalance.spcvy(pos(:))=0;
+ md.stressbalance.spcvz(pos(:))=0; % FIXME probably shouldn't spc vertical velocity here
+Index: ../trunk-jpl/src/m/classes/clusters/hpc.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/hpc.m	(revision 18738)
++++ ../trunk-jpl/src/m/classes/clusters/hpc.m	(revision 18739)
+@@ -49,9 +49,9 @@
+ 		 %}}}
+ 		 function md = checkconsistency(cluster,md,solution,analyses) % {{{
+ 
+-			 available_queues={'pub64','free64','free48','free*,pub64','free*','free*,free64'};
+-			 queue_requirements_time=[Inf Inf Inf Inf Inf Inf];
+-			 queue_requirements_np=[64 64 48 48 48 48];
++			 available_queues={'pub64','free64','free48','free*,pub64','free*'};
++			 queue_requirements_time=[Inf Inf Inf Inf Inf];
++			 queue_requirements_np=[64 64 48 48 48];
+ 
+ 			 QueueRequirements(available_queues,queue_requirements_time,queue_requirements_np,cluster.queue,cluster.np,1)
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18739-18740.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18739-18740.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18739-18740.diff	(revision 19102)
@@ -0,0 +1,52 @@
+Index: ../trunk-jpl/src/m/classes/masstransport.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/masstransport.py	(revision 18739)
++++ ../trunk-jpl/src/m/classes/masstransport.py	(revision 18740)
+@@ -14,7 +14,9 @@
+ 
+ 	def __init__(self): # {{{
+ 		self.spcthickness           = float('NaN')
++		self.iscalvingrate          = 0
+ 		self.calvingrate            = float('NaN')
++		self.levermann_calving_coeff= 0
+ 		self.isfreesurface          = 0
+ 		self.min_thickness          = 0
+ 		self.hydrostatic_adjustment = 0
+@@ -30,7 +32,9 @@
+ 	def __repr__(self): # {{{
+ 		string='   Masstransport solution parameters:'
+ 		string="%s\n%s"%(string,fielddisplay(self,'spcthickness','thickness constraints (NaN means no constraint) [m]'))
++		string="%s\n%s"%(string,fielddisplay(self,'iscalvingrate','do we use calving (loss of ice)'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'calvingrate','calving rate at given location [m/a]'))
++		string="%s\n%s"%(string,fielddisplay(self,'levermann_calving_coeff','Proportionality coefficient in Levermann model'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'isfreesurface','do we use free surfaces (FS only) are mass conservation'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'min_thickness','minimum ice thickness allowed [m]'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'hydrostatic_adjustment','adjustment of ice shelves surface and bed elevations: ''Incremental'' or ''Absolute'' '))
+@@ -45,6 +49,9 @@
+ 
+ 	#}}}
+ 	def setdefaultparameters(self): # {{{
++
++		#Proportionality coefficient in Levermann model                                 |
++		self.levermann_calving_coeff=2e13;
+ 		
+ 		#Type of stabilization to use 0:nothing 1:artificial_diffusivity 3:Discontinuous Galerkin
+ 		self.stabilization=1
+@@ -71,6 +78,8 @@
+ 		md = checkfield(md,'fieldname','masstransport.spcthickness','forcing',1)
+ 		if LevelsetAnalysisEnum() in analyses and md.transient.islevelset:
+ 			md = checkfield(md,'fieldname','masstransport.calvingrate','NaN',1,'size',[md.mesh.numberofvertices],'>=',0)
++			md = checkfield(md,'fieldname','masstransport.iscalvingrate','values',[0 1])
++			md = checkfield(md,'fieldname','masstransport.levermann_calving_coeff','>',0)
+ 		md = checkfield(md,'fieldname','masstransport.isfreesurface','values',[0,1])
+ 		md = checkfield(md,'fieldname','masstransport.hydrostatic_adjustment','values',['Absolute','Incremental'])
+ 		md = checkfield(md,'fieldname','masstransport.stabilization','values',[0,1,2,3,4])
+@@ -85,6 +94,8 @@
+ 
+ 		WriteData(fid,'object',self,'fieldname','spcthickness','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
+ 		WriteData(fid,'object',self,'fieldname','calvingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts)
++		WriteData(fid,'object',self,'fieldname','iscalvingrate','format','Boolean')
++		WriteData(fid,'object',self,'fieldname','levermann_calving_coeff','format','Double')
+ 		WriteData(fid,'object',self,'fieldname','isfreesurface','format','Boolean')
+ 		WriteData(fid,'object',self,'fieldname','min_thickness','format','Double')
+ 		WriteData(fid,'data',StringToEnum(self.hydrostatic_adjustment)[0],'format','Integer','enum',MasstransportHydrostaticAdjustmentEnum())
Index: /issm/oecreview/Archive/18296-19100/ISSM-18740-18741.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18740-18741.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18740-18741.diff	(revision 19102)
@@ -0,0 +1,34 @@
+Index: ../trunk-jpl/src/m/classes/masstransport.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/masstransport.py	(revision 18740)
++++ ../trunk-jpl/src/m/classes/masstransport.py	(revision 18741)
+@@ -16,9 +16,9 @@
+ 		self.spcthickness           = float('NaN')
+ 		self.iscalvingrate          = 0
+ 		self.calvingrate            = float('NaN')
+-		self.levermann_calving_coeff= 0
++		self.levermann_calving_coeff= 0.
+ 		self.isfreesurface          = 0
+-		self.min_thickness          = 0
++		self.min_thickness          = 0.
+ 		self.hydrostatic_adjustment = 0
+ 		self.stabilization          = 0
+ 		self.vertex_pairing         = float('NaN')
+@@ -51,7 +51,7 @@
+ 	def setdefaultparameters(self): # {{{
+ 
+ 		#Proportionality coefficient in Levermann model                                 |
+-		self.levermann_calving_coeff=2e13;
++		self.levermann_calving_coeff=2.e13
+ 		
+ 		#Type of stabilization to use 0:nothing 1:artificial_diffusivity 3:Discontinuous Galerkin
+ 		self.stabilization=1
+@@ -78,7 +78,7 @@
+ 		md = checkfield(md,'fieldname','masstransport.spcthickness','forcing',1)
+ 		if LevelsetAnalysisEnum() in analyses and md.transient.islevelset:
+ 			md = checkfield(md,'fieldname','masstransport.calvingrate','NaN',1,'size',[md.mesh.numberofvertices],'>=',0)
+-			md = checkfield(md,'fieldname','masstransport.iscalvingrate','values',[0 1])
++			md = checkfield(md,'fieldname','masstransport.iscalvingrate','values',[0,1])
+ 			md = checkfield(md,'fieldname','masstransport.levermann_calving_coeff','>',0)
+ 		md = checkfield(md,'fieldname','masstransport.isfreesurface','values',[0,1])
+ 		md = checkfield(md,'fieldname','masstransport.hydrostatic_adjustment','values',['Absolute','Incremental'])
Index: /issm/oecreview/Archive/18296-19100/ISSM-18741-18742.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18741-18742.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18741-18742.diff	(revision 19102)
@@ -0,0 +1,79 @@
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18741)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18742)
+@@ -99,7 +99,7 @@
+ 	Element* basalelement = element->SpawnBasalElement();
+ 
+ 	/*Intermediaries */
+-	int  dim, domaintype;
++	int  dim, domaintype, iscalvingrate;
+ 	int i, row, col;
+ 	IssmDouble kappa;
+ 	IssmDouble Jdet, dt, D_scalar;
+@@ -108,7 +108,8 @@
+ //	IssmDouble norm_dlsf;
+ 	IssmDouble* xyz_list = NULL;
+ 
+-	/*Get problem dimension*/
++	/*Get problem dimension and whether there is calving or not*/
++	basalelement->FindParam(&iscalvingrate,MasstransportIscalvingrateEnum);
+ 	basalelement->FindParam(&domaintype,DomainTypeEnum);
+ 	switch(domaintype){
+ 		case Domain2DverticalEnum:   dim = 1; break;
+@@ -141,19 +142,25 @@
+ 	if(domaintype==Domain2DhorizontalEnum){
+ 		vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input);
+ 		vy_input=basalelement->GetInput(VyEnum); _assert_(vy_input);
+-		calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
+-		calvingratey_input=basalelement->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
++		if(iscalvingrate){
++			calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
++			calvingratey_input=basalelement->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
++		}
+ 	}
+ 	else{
+ 		if(dim==1){
+ 			vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input);
+-			calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
++			if(iscalvingrate){
++				calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
++			}
+ 		}
+ 		if(dim==2){
+ 			vx_input=basalelement->GetInput(VxAverageEnum); _assert_(vx_input);
+ 			vy_input=basalelement->GetInput(VyAverageEnum); _assert_(vy_input);
+-			calvingratex_input=basalelement->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
+-			calvingratey_input=basalelement->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
++			if(iscalvingrate){
++				calvingratex_input=basalelement->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
++				calvingratey_input=basalelement->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
++			}
+ 		}
+ 	}
+ 
+@@ -184,8 +191,14 @@
+ 		GetBprime(Bprime,basalelement,xyz_list,gauss); 
+ 		vx_input->GetInputValue(&v[0],gauss); // in 3D case, add mesh velocity 
+ 		vy_input->GetInputValue(&v[1],gauss); 
+-		calvingratex_input->GetInputValue(&c[0],gauss); // in 3D case, add mesh velocity 
+-		calvingratey_input->GetInputValue(&c[1],gauss); 
++		if(iscalvingrate){
++			calvingratex_input->GetInputValue(&c[0],gauss); // in 3D case, add mesh velocity 
++			calvingratey_input->GetInputValue(&c[1],gauss); 
++			for(i=0;i<dim;i++) w[i]=v[i]-c[i];
++		}
++		else{
++			for(i=0;i<dim;i++) w[i]=v[i];
++		}
+ 		//lsf_slopex_input->GetInputValue(&dlsf[0],gauss);
+ 		//lsf_slopey_input->GetInputValue(&dlsf[1],gauss);
+ 		//calvingrate_input->GetInputValue(&calvingrate,gauss);
+@@ -199,7 +212,6 @@
+ 		//else
+ 		//for(i=0;i<dim;i++) c[i]=0.;
+ 		
+-		for(i=0;i<dim;i++) w[i]=v[i]-c[i];
+ 
+ 		for(row=0;row<dim;row++)
+ 			for(col=0;col<dim;col++)
Index: /issm/oecreview/Archive/18296-19100/ISSM-18742-18743.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18742-18743.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18742-18743.diff	(revision 19102)
@@ -0,0 +1,32 @@
+Index: ../trunk-jpl/src/m/enum/MasstransportIscalvingrateEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MasstransportIscalvingrateEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MasstransportIscalvingrateEnum.m	(revision 18743)
+@@ -0,0 +1,11 @@
++function macro=MasstransportIscalvingrateEnum()
++%MASSTRANSPORTISCALVINGRATEENUM - Enum of MasstransportIscalvingrate
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MasstransportIscalvingrateEnum()
++
++macro=StringToEnum('MasstransportIscalvingrate');
+Index: ../trunk-jpl/src/m/enum/MasstransportLevermannCalvingCoeffEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MasstransportLevermannCalvingCoeffEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MasstransportLevermannCalvingCoeffEnum.m	(revision 18743)
+@@ -0,0 +1,11 @@
++function macro=MasstransportLevermannCalvingCoeffEnum()
++%MASSTRANSPORTLEVERMANNCALVINGCOEFFENUM - Enum of MasstransportLevermannCalvingCoeff
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MasstransportLevermannCalvingCoeffEnum()
++
++macro=StringToEnum('MasstransportLevermannCalvingCoeff');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18743-18744.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18743-18744.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18743-18744.diff	(revision 19102)
@@ -0,0 +1,23 @@
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18743)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18744)
+@@ -99,7 +99,8 @@
+ 	Element* basalelement = element->SpawnBasalElement();
+ 
+ 	/*Intermediaries */
+-	int  dim, domaintype, iscalvingrate;
++	int  dim, domaintype;
++	bool iscalvingrate;
+ 	int i, row, col;
+ 	IssmDouble kappa;
+ 	IssmDouble Jdet, dt, D_scalar;
+@@ -226,7 +227,7 @@
+ 					&Ke->values[0],1);
+ 
+ 		/* Stabilization */
+-		int stabilization=1;
++		int stabilization=2;
+ 		vel=0.;
+ 		for(i=0;i<dim;i++) vel+=w[i]*w[i];
+ 		vel=sqrt(vel)+1.e-14;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18744-18745.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18744-18745.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18744-18745.diff	(revision 19102)
@@ -0,0 +1,181 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18744)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18745)
+@@ -425,6 +425,7 @@
+ 	IssmDouble hmax;
+ 	IssmDouble epl_head,sediment_head;
+ 	IssmDouble leakage,transfer;
++	IssmDouble continuum, factor;
+ 	HydrologyDCInefficientAnalysis* inefanalysis = NULL;
+ 
+ 	element->FindParam(&transfermethod,HydrologydcTransferFlagEnum);
+@@ -447,19 +448,11 @@
+ 		epl_head_input->GetInputValue(&epl_head,gauss);
+ 		element->FindParam(&leakage,HydrologydcLeakageFactorEnum);
+ 		
+-		if(epl_head>sediment_head){  
+-			/* if(sediment_head>=hmax){ */
+-			/* 	transfer=0.0; */
+-			/* } */
+-			/* else{ */
+-			/* 	transfer=(leakage); */
+-			/* } */
+-			transfer=leakage*(1/(1+exp(-20.0*(hmax-sediment_head))));
+-		}
+-		else{
+-			transfer=(leakage);
+-			
+-		}
++		//Computing continuum function to apply to transfer term, transfer is null only if
++		// epl_head>sediment_head AND sediment_head>h_max
++		continuum=((1.0/(1.0+exp(-20.0*(sediment_head-epl_head)))))+(1.0/(1.0+exp(-20.0*(hmax-sediment_head))));
++		factor=max(continuum,1.0);
++		transfer=leakage*factor;
+ 		break;
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
+@@ -473,6 +466,7 @@
+ 	IssmDouble hmax;
+ 	IssmDouble epl_head,sediment_head;
+ 	IssmDouble leakage,transfer;
++	IssmDouble continuum, factor;
+ 
+ 	HydrologyDCInefficientAnalysis* inefanalysis = NULL;
+ 
+@@ -496,18 +490,12 @@
+ 		epl_head_input->GetInputValue(&epl_head,gauss);
+ 		element->FindParam(&leakage,HydrologydcLeakageFactorEnum);
+ 
+- 		if(epl_head>sediment_head){  
+-			/* if(sediment_head>=hmax){ */
+-			/* 	transfer=0.0; */
+-			/* } */
+-			/* else{ */
+-			/* 	transfer=(sediment_head*leakage); */
+-			/* } */
+-			transfer=sediment_head*leakage*(1/(1+exp(-20.0*(hmax-sediment_head))));
+-		}
+-		else{
+-			transfer=(sediment_head*leakage);
+-		}
++		//Computing continuum function to apply to transfer term, transfer is null only if
++		// epl_head>sediment_head AND sediment_head>h_max
++		continuum=((1.0/(1.0+exp(-20.0*(sediment_head-epl_head)))))+(1.0/(1.0+exp(-20.0*(hmax-sediment_head))));
++		factor=max(continuum,1.0);
++		transfer=sediment_head*leakage*factor;
++
+ 		break;
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
+@@ -737,7 +725,6 @@
+ /*}}}*/
+ void HydrologyDCEfficientAnalysis::HydrologyEPLGetActive(Vector<IssmDouble>* active_vec, Element* element){
+ 	/*Constants*/
+-
+ 	int      domaintype;
+ 	Element*   basalelement=NULL;
+ 
+@@ -759,12 +746,9 @@
+ 	IssmDouble* active   = xNew<IssmDouble>(numnodes);
+ 		
+ 	basalelement->GetInputListOnVertices(&active[0],HydrologydcMaskEplactiveNodeEnum);
+-
+ 	bool active_element;
+-	
+ 	Input* 	active_element_input=basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input);		
+ 	active_element_input->GetInputValue(&active_element);
+-
+ 	
+ 	for(int i=0;i<numnodes;i++) flag+=active[i];
+ 
+@@ -774,13 +758,12 @@
+ 		}
+ 	}
+ 	else if(active_element){
+-		/*Checking Stuff*/
+ 		for(int i=0;i<numnodes;i++){
+ 			active_vec->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+ 		}		
+ 	}
+ 	else{
+-		/*Do not do anything: at least one node was active for this element but this element is not solved for*/
++		/*Do not do anything: at least one node is active for this element but this element is not solved for*/
+ 	}
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 	xDelete<IssmDouble>(active);
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18744)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18745)
+@@ -592,7 +592,8 @@
+ 	IssmDouble hmax;
+ 	IssmDouble epl_head,sediment_head;
+ 	IssmDouble leakage,transfer;
+-
++	IssmDouble continuum, factor;
++	
+ 	element->FindParam(&transfermethod,HydrologydcTransferFlagEnum);
+ 
+ 	/*Switch between the different transfer methods cases*/
+@@ -610,19 +611,13 @@
+ 		element->FindParam(&leakage,HydrologydcLeakageFactorEnum);
+ 
+ 		hmax=GetHydrologyDCInefficientHmax(element, gauss, thick_input, base_input);
+-		
+-		if(epl_head>sediment_head){  
+-			/* if(sediment_head>=hmax){ */
+-			/* 	transfer=0.0; */
+-			/* } */
+-			/* else{ */
+-			/* 	transfer=(leakage); */
+-			/* } */
+-			transfer=leakage*(1/(1+exp(-20.0*(hmax-sediment_head))));
+-		}
+-		else{
+-			transfer=(leakage);
+-		}		
++	
++		//Computing continuum function to apply to transfer term, transfer is null only if
++		//epl_head>sediment_head AND sediment_head>h_max
++		continuum=((1.0/(1.0+exp(-20.0*(sediment_head-epl_head)))))+(1.0/(1.0+exp(-20.0*(hmax-sediment_head))));
++		factor=max(continuum,1.0);
++		transfer=leakage*factor;
++
+ 		break;
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
+@@ -636,7 +631,8 @@
+ 	IssmDouble hmax;
+ 	IssmDouble epl_head,sediment_head;
+ 	IssmDouble leakage,transfer;
+-
++	IssmDouble continuum, factor;
++	
+ 	element->FindParam(&transfermethod,HydrologydcTransferFlagEnum);
+ 
+ 	/*Switch between the different transfer methods cases*/
+@@ -655,18 +651,11 @@
+ 
+ 		hmax=GetHydrologyDCInefficientHmax(element, gauss, thick_input, base_input);
+ 		
+-		if(epl_head>sediment_head){  
+-			/* if(sediment_head>=hmax){ */
+-			/* 	transfer=0.0; */
+-			/* } */
+-			/* else{ */
+-			/* 	transfer=(epl_head*leakage); */
+-			/* } */
+-			transfer=epl_head*leakage*(1/(1+exp(-20.0*(hmax-sediment_head))));
+-		}
+-		else{
+-			transfer=(epl_head*leakage);
+-		}
++		//Computing continuum function to apply to transfer term, transfer is null only if
++		//epl_head>sediment_head AND sediment_head>h_max
++		continuum=((1.0/(1.0+exp(-20.0*(sediment_head-epl_head)))))+(1.0/(1.0+exp(-20.0*(hmax-sediment_head))));
++		factor=max(continuum,1.0);
++		transfer=epl_head*leakage*factor;
+ 		break;
+ 	default:
+ 		_error_("no case higher than 1 for the Transfer method");
Index: /issm/oecreview/Archive/18296-19100/ISSM-18745-18746.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18745-18746.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18745-18746.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/contrib/paraview/enveloppeVTK.m
+===================================================================
+--- ../trunk-jpl/src/m/contrib/paraview/enveloppeVTK.m	(revision 18745)
++++ ../trunk-jpl/src/m/contrib/paraview/enveloppeVTK.m	(revision 18746)
+@@ -59,7 +59,7 @@
+ 	
+ 	timestep=step;
+ 
+-	fid = fopen(strcat(path,filesep,name,filesep,name,'.vtk',int2str(timestep),'.vtk'),'w+');
++	fid = fopen(strcat(path,filesep,name,filesep,'timestep.vtk',int2str(timestep),'.vtk'),'w+');
+ 	fprintf(fid,'# vtk DataFile Version 2.0 \n');
+ 	fprintf(fid,'Data for run %s \n',model.miscellaneous.name);
+ 	fprintf(fid,'ASCII \n');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18746-18747.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18746-18747.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18746-18747.diff	(revision 19102)
@@ -0,0 +1,119 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18746)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18747)
+@@ -663,7 +663,7 @@
+ 	Input* active_element_input=basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input);
+ 	active_element_input->GetInputValue(&active_element);
+ 
+-	basalelement->parameters->FindParam(&penalty_lock,HydrologydcPenaltyLockEnum); 
++	basalelement->parameters->FindParam(&penalty_lock,HydrologydcEplflipLockEnum); 
+ 
+ 	basalelement-> GetInputListOnVertices(&old_active[0],HydrologydcMaskEplactiveNodeEnum);	
+ 	basalelement-> GetInputListOnVertices(&epl_thickness[0],HydrologydcEplThicknessEnum);	
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18746)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18747)
+@@ -136,6 +136,7 @@
+ 	HydrologydcLeakageFactorEnum,
+ 	HydrologydcPenaltyFactorEnum,
+ 	HydrologydcPenaltyLockEnum,
++	HydrologydcEplflipLockEnum,
+ 	HydrologydcBasalMoulinInputEnum,
+ 	HydrologyLayerEnum,
+ 	HydrologySedimentEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18746)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18747)
+@@ -144,6 +144,7 @@
+ 		case HydrologydcLeakageFactorEnum : return "HydrologydcLeakageFactor";
+ 		case HydrologydcPenaltyFactorEnum : return "HydrologydcPenaltyFactor";
+ 		case HydrologydcPenaltyLockEnum : return "HydrologydcPenaltyLock";
++		case HydrologydcEplflipLockEnum : return "HydrologydcEplflipLock";
+ 		case HydrologydcBasalMoulinInputEnum : return "HydrologydcBasalMoulinInput";
+ 		case HydrologyLayerEnum : return "HydrologyLayer";
+ 		case HydrologySedimentEnum : return "HydrologySediment";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18746)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18747)
+@@ -147,6 +147,7 @@
+ 	      else if (strcmp(name,"HydrologydcLeakageFactor")==0) return HydrologydcLeakageFactorEnum;
+ 	      else if (strcmp(name,"HydrologydcPenaltyFactor")==0) return HydrologydcPenaltyFactorEnum;
+ 	      else if (strcmp(name,"HydrologydcPenaltyLock")==0) return HydrologydcPenaltyLockEnum;
++	      else if (strcmp(name,"HydrologydcEplflipLock")==0) return HydrologydcEplflipLockEnum;
+ 	      else if (strcmp(name,"HydrologydcBasalMoulinInput")==0) return HydrologydcBasalMoulinInputEnum;
+ 	      else if (strcmp(name,"HydrologyLayer")==0) return HydrologyLayerEnum;
+ 	      else if (strcmp(name,"HydrologySediment")==0) return HydrologySedimentEnum;
+@@ -258,11 +259,11 @@
+ 	      else if (strcmp(name,"Domain2Dvertical")==0) return Domain2DverticalEnum;
+ 	      else if (strcmp(name,"Domain3D")==0) return Domain3DEnum;
+ 	      else if (strcmp(name,"MiscellaneousName")==0) return MiscellaneousNameEnum;
+-	      else if (strcmp(name,"MasstransportHydrostaticAdjustment")==0) return MasstransportHydrostaticAdjustmentEnum;
+          else stage=3;
+    }
+    if(stage==3){
+-	      if (strcmp(name,"MasstransportIscalvingrate")==0) return MasstransportIscalvingrateEnum;
++	      if (strcmp(name,"MasstransportHydrostaticAdjustment")==0) return MasstransportHydrostaticAdjustmentEnum;
++	      else if (strcmp(name,"MasstransportIscalvingrate")==0) return MasstransportIscalvingrateEnum;
+ 	      else if (strcmp(name,"MasstransportLevermannCalvingCoeff")==0) return MasstransportLevermannCalvingCoeffEnum;
+ 	      else if (strcmp(name,"MasstransportIsfreesurface")==0) return MasstransportIsfreesurfaceEnum;
+ 	      else if (strcmp(name,"MasstransportMinThickness")==0) return MasstransportMinThicknessEnum;
+@@ -381,11 +382,11 @@
+ 	      else if (strcmp(name,"DefaultAnalysis")==0) return DefaultAnalysisEnum;
+ 	      else if (strcmp(name,"BalancethicknessAnalysis")==0) return BalancethicknessAnalysisEnum;
+ 	      else if (strcmp(name,"BalancethicknessSolution")==0) return BalancethicknessSolutionEnum;
+-	      else if (strcmp(name,"Balancethickness2Analysis")==0) return Balancethickness2AnalysisEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"Balancethickness2Solution")==0) return Balancethickness2SolutionEnum;
++	      if (strcmp(name,"Balancethickness2Analysis")==0) return Balancethickness2AnalysisEnum;
++	      else if (strcmp(name,"Balancethickness2Solution")==0) return Balancethickness2SolutionEnum;
+ 	      else if (strcmp(name,"BalancethicknessSoftAnalysis")==0) return BalancethicknessSoftAnalysisEnum;
+ 	      else if (strcmp(name,"BalancethicknessSoftSolution")==0) return BalancethicknessSoftSolutionEnum;
+ 	      else if (strcmp(name,"BalancevelocityAnalysis")==0) return BalancevelocityAnalysisEnum;
+@@ -504,11 +505,11 @@
+ 	      else if (strcmp(name,"SegInput")==0) return SegInputEnum;
+ 	      else if (strcmp(name,"Tria")==0) return TriaEnum;
+ 	      else if (strcmp(name,"TriaInput")==0) return TriaInputEnum;
+-	      else if (strcmp(name,"Tetra")==0) return TetraEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"TetraInput")==0) return TetraInputEnum;
++	      if (strcmp(name,"Tetra")==0) return TetraEnum;
++	      else if (strcmp(name,"TetraInput")==0) return TetraInputEnum;
+ 	      else if (strcmp(name,"Penta")==0) return PentaEnum;
+ 	      else if (strcmp(name,"PentaInput")==0) return PentaInputEnum;
+ 	      else if (strcmp(name,"Vertex")==0) return VertexEnum;
+@@ -627,11 +628,11 @@
+ 	      else if (strcmp(name,"P1xP2")==0) return P1xP2Enum;
+ 	      else if (strcmp(name,"P1xP3")==0) return P1xP3Enum;
+ 	      else if (strcmp(name,"P2xP4")==0) return P2xP4Enum;
+-	      else if (strcmp(name,"P1P1")==0) return P1P1Enum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"P1P1GLS")==0) return P1P1GLSEnum;
++	      if (strcmp(name,"P1P1")==0) return P1P1Enum;
++	      else if (strcmp(name,"P1P1GLS")==0) return P1P1GLSEnum;
+ 	      else if (strcmp(name,"MINI")==0) return MINIEnum;
+ 	      else if (strcmp(name,"MINIcondensed")==0) return MINIcondensedEnum;
+ 	      else if (strcmp(name,"TaylorHood")==0) return TaylorHoodEnum;
+@@ -750,11 +751,11 @@
+ 	      else if (strcmp(name,"IceMaskNodeActivation")==0) return IceMaskNodeActivationEnum;
+ 	      else if (strcmp(name,"LevelsetfunctionSlopeX")==0) return LevelsetfunctionSlopeXEnum;
+ 	      else if (strcmp(name,"LevelsetfunctionSlopeY")==0) return LevelsetfunctionSlopeYEnum;
+-	      else if (strcmp(name,"LevelsetfunctionPicard")==0) return LevelsetfunctionPicardEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"Seaiceatm")==0) return SeaiceatmEnum;
++	      if (strcmp(name,"LevelsetfunctionPicard")==0) return LevelsetfunctionPicardEnum;
++	      else if (strcmp(name,"Seaiceatm")==0) return SeaiceatmEnum;
+ 	      else if (strcmp(name,"Seaiceocean")==0) return SeaiceoceanEnum;
+ 	      else if (strcmp(name,"SeaiceThickness")==0) return SeaiceThicknessEnum;
+ 	      else if (strcmp(name,"SeaiceConcentration")==0) return SeaiceConcentrationEnum;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18747-18748.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18747-18748.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18747-18748.diff	(revision 19102)
@@ -0,0 +1,91 @@
+Index: ../trunk-jpl/src/m/classes/hydrologydc.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologydc.m	(revision 18747)
++++ ../trunk-jpl/src/m/classes/hydrologydc.m	(revision 18748)
+@@ -32,6 +32,7 @@
+ 		epl_colapse_thickness    = 0;
+ 		epl_max_thickness        = 0;
+ 		epl_conductivity         = 0;
++		eplflip_lock             = 0;
+   end
+ 	methods
+ 		% {{{ function obj = hydrologydc(varargin) 
+@@ -58,6 +59,7 @@
+ 			obj.water_compressibility    = 5.04e-10;
+ 			obj.isefficientlayer         = 1;
+ 			obj.penalty_factor           = 3;
++			obj.penalty_lock             = 0;
+ 			obj.rel_tol                  = 1.0e-06;
+ 			obj.max_iter                 = 100;
+ 			obj.sedimentlimit_flag       = 0;
+@@ -76,7 +78,7 @@
+ 			obj.epl_colapse_thickness    = 1.0e-3;
+ 			obj.epl_max_thickness        = 5.0;
+ 			obj.epl_conductivity         = 8.0e-02;
+-
++			obj.eplflip_lock             = 0;
+ 		end 
+ 		% }}}
+ 		% {{{ function md = checkconsistency(obj,md,solution,analyses) 
+@@ -89,6 +91,7 @@
+ 			md = checkfield(md,'fieldname','hydrology.water_compressibility','>',0,'numel',1);
+ 			md = checkfield(md,'fieldname','hydrology.isefficientlayer','numel',[1],'values',[0 1]);
+ 			md = checkfield(md,'fieldname','hydrology.penalty_factor','>',0,'numel',1);
++			md = checkfield(md,'fieldname','hydrology.penalty_lock','>=',0,'numel',1);
+ 			md = checkfield(md,'fieldname','hydrology.rel_tol','>',0,'numel',1);
+ 			md = checkfield(md,'fieldname','hydrology.max_iter','>',0,'numel',1);
+ 			md = checkfield(md,'fieldname','hydrology.sedimentlimit_flag','numel',[1],'values',[0 1 2 3]);
+@@ -116,6 +119,7 @@
+ 				md = checkfield(md,'fieldname','hydrology.epl_colapse_thickness','>',0,'numel',1);
+ 				md = checkfield(md,'fieldname','hydrology.epl_max_thickness','>',0,'numel',1);
+ 				md = checkfield(md,'fieldname','hydrology.epl_conductivity','>',0,'numel',1);
++				md = checkfield(md,'fieldname','hydrology.eplflip_lock','>=',0,'numel',1);
+ 				if (obj.epl_colapse_thickness>obj.epl_initial_thickness),
+ 					md = checkmessage(md,'Colapsing thickness for EPL larger than initial thickness');
+ 				end 
+@@ -164,6 +168,7 @@
+ 				fielddisplay(obj,'epl_colapse_thickness','epl colapsing thickness [m]');
+ 				fielddisplay(obj,'epl_max_thickness','epl maximal thickness [m]');
+ 				fielddisplay(obj,'epl_conductivity','epl conductivity [m^2/s]');
++				fielddisplay(obj,'eplflip_lock','lock the epl activation to avoid fli-floping (default is 0, no stabilization)');
+ 	    end
+ 
+ 		end 
+@@ -202,7 +207,8 @@
+ 				WriteData(fid,'object',obj,'fieldname','epl_colapse_thickness','format','Double');
+ 				WriteData(fid,'object',obj,'fieldname','epl_max_thickness','format','Double');
+ 				WriteData(fid,'object',obj,'fieldname','epl_conductivity','format','Double');
+-			end
++				WriteData(fid,'object',obj,'fieldname','eplflip_lock','format','Integer');
++	    end
+ 		end 
+ % }}}
+   end
+Index: ../trunk-jpl/src/m/enum/HydrologydcEplflipLockEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/HydrologydcEplflipLockEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/HydrologydcEplflipLockEnum.m	(revision 18748)
+@@ -0,0 +1,11 @@
++function macro=HydrologydcEplflipLockEnum()
++%HYDROLOGYDCEPLFLIPLOCKENUM - Enum of HydrologydcEplflipLock
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=HydrologydcEplflipLockEnum()
++
++macro=StringToEnum('HydrologydcEplflipLock');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18747)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18748)
+@@ -136,6 +136,7 @@
+ def HydrologydcLeakageFactorEnum(): return StringToEnum("HydrologydcLeakageFactor")[0]
+ def HydrologydcPenaltyFactorEnum(): return StringToEnum("HydrologydcPenaltyFactor")[0]
+ def HydrologydcPenaltyLockEnum(): return StringToEnum("HydrologydcPenaltyLock")[0]
++def HydrologydcEplflipLockEnum(): return StringToEnum("HydrologydcEplflipLock")[0]
+ def HydrologydcBasalMoulinInputEnum(): return StringToEnum("HydrologydcBasalMoulinInput")[0]
+ def HydrologyLayerEnum(): return StringToEnum("HydrologyLayer")[0]
+ def HydrologySedimentEnum(): return StringToEnum("HydrologySediment")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18748-18749.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18748-18749.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18748-18749.diff	(revision 19102)
@@ -0,0 +1,60 @@
+Index: ../trunk-jpl/src/m/classes/hydrologydc.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 18748)
++++ ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 18749)
+@@ -40,6 +40,7 @@
+ 		self.epl_colapse_thickness    = 0
+ 		self.epl_max_thickness        = 0
+ 		self.epl_conductivity         = 0
++		self.eplflip_lock             = 0
+ 				 
+ 		#set defaults
+ 		self.setdefaultparameters()
+@@ -89,6 +90,7 @@
+ 			string="%s\n%s"%(string,fielddisplay(self,'epl_initial_thickness','epl initial thickness [m]'))			
+ 			string="%s\n%s"%(string,fielddisplay(self,'epl_colapse_thickness','epl colapsing thickness [m]'))
+ 			string="%s\n%s"%(string,fielddisplay(self,'epl_conductivity','epl conductivity [m^2/s]'))
++			string="%s\n%s"%(string,fielddisplay(self,'eplflip_lock','lock epl activity to avoid flip-floping (default is 0, no stabilization)'))
+ 		return string
+ #}}}
+ 	def setdefaultparameters(self): #{{{ 
+@@ -97,6 +99,7 @@
+ 		self.water_compressibility    = 5.04e-10
+ 		self.isefficientlayer         = 1
+ 		self.penalty_factor           = 3
++		self.penalty_lock             = 0
+ 		self.rel_tol                  = 1.0e-06
+ 		self.max_iter                 = 100
+ 		self.sedimentlimit_flag       = 0
+@@ -115,7 +118,8 @@
+ 		self.epl_colapse_thickness    = 1.0e-3
+ 		self.epl_max_thickness        = 5.0
+ 		self.epl_conductivity         = 8.0e-02
+-
++		self.eplflip_lock             = 0
++		
+ 		return self
+ 	# }}}
+ 
+@@ -135,6 +139,7 @@
+ 		md = checkfield(md,'fieldname','hydrology.water_compressibility','numel',[1],'>',0.)
+ 		md = checkfield(md,'fieldname','hydrology.isefficientlayer','numel',[1],'values',[0,1])
+ 		md = checkfield(md,'fieldname','hydrology.penalty_factor','>',0.,'numel',[1])
++		md = checkfield(md,'fieldname','hydrology.penalty_lock','>=',0.,'numel',[1])
+ 		md = checkfield(md,'fieldname','hydrology.rel_tol','>',0.,'numel',[1])
+ 		md = checkfield(md,'fieldname','hydrology.max_iter','>',0.,'numel',[1])
+ 		md = checkfield(md,'fieldname','hydrology.sedimentlimit_flag','numel',[1],'values',[0,1,2,3])
+@@ -160,6 +165,7 @@
+ 			md = checkfield(md,'fieldname','hydrology.epl_max_thickness','numel',[1],'>',0.)
+ 			md = checkfield(md,'fieldname','hydrology.epl_initial_thickness','numel',[1],'>',0.)
+ 			md = checkfield(md,'fieldname','hydrology.epl_colapse_thickness','numel',[1],'>',0.)
++			md = checkfield(md,'fieldname','hydrology.eplflip_lock','>=',0.,'numel',[1])
+ 			if self.epl_colapse_thickness > self.epl_initial_thickness:
+ 				md.checkmessage('Colapsing thickness for EPL larger than initial thickness')
+ 			md = checkfield(md,'fieldname','hydrology.epl_conductivity','numel',[1],'>',0.)
+@@ -196,4 +202,5 @@
+ 			WriteData(fid,'object',self,'fieldname','epl_initial_thickness','format','Double')			
+ 			WriteData(fid,'object',self,'fieldname','epl_colapse_thickness','format','Double')			
+ 			WriteData(fid,'object',self,'fieldname','epl_conductivity','format','Double')
++			WriteData(fid,'object',self,'fieldname','eplflip_lock','format','Integer')
+ 	# }}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18749-18750.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18749-18750.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18749-18750.diff	(revision 19102)
@@ -0,0 +1,1052 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/code_densite/Makefile
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/code_densite/Makefile	(revision 0)
++++ ../trunk-jpl/src/m/contrib/gravity/code_densite/Makefile	(revision 18750)
+@@ -0,0 +1,11 @@
++all:
++		g++ density_rock_uneven.cpp  \
++			-I$(ISSM_DIR)/externalpackages/gsl/install/include \
++			-L$(ISSM_DIR)/externalpackages/gsl/install/lib -lgsl -lgslcblas \
++		   -I$(ISSM_DIR)/externalpackages/mpich/install/include/ \
++		   -L$(ISSM_DIR)/externalpackages/mpich/install/lib/ -lmpich -lpmpich -lmpl -o forward.exe 
++
++forward:
++	   mpirun -np 4 ./forward.exe
++run -np 4 ./forward.execlean:
++		rm ./forward.exe
+Index: ../trunk-jpl/src/m/contrib/gravity/code_densite/density_rock.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/code_densite/density_rock.cpp	(revision 0)
++++ ../trunk-jpl/src/m/contrib/gravity/code_densite/density_rock.cpp	(revision 18750)
+@@ -0,0 +1,510 @@
++#include <iostream>
++#include <cmath>
++#include <fstream>
++#include <string>
++#include <cstdio>
++#include <cstdlib>
++#include <time.h>
++#include <cassert>
++#include <gsl/gsl_multifit.h>
++#include "mpi.h"
++using namespace std;
++
++class Matrix{/*{{{*/
++	private:
++		int     M;        /*Number of lines   */
++		int     N;        /*Number if Columns */
++		double *values;
++	public:
++		Matrix(int m_in,int n_in){/*{{{*/
++			this->M = m_in;
++			this->N = n_in;
++			this->values = new double[M*N]();
++		}/*}}}*/
++		~Matrix(){/*{{{*/
++			delete [] this->values;
++		}/*}}}*/
++		void Echo(void){/*{{{*/
++			for(int i=0;i<M;i++){
++				for(int j=0;j<N;j++){
++					cout << " " << this->values[i*N+j];
++				}
++				cout << endl;
++			}
++		}/*}}}*/
++		void SetValue(int i,int j,double value){/*{{{*/
++			this->values[i*N+j] = value;
++		}/*}}}*/
++		double GetValue(int i,int j){/*{{{*/
++			return this->values[i*N+j];
++		}/*}}}*/
++		void GetSize(int* pM,int* pN){/*{{{*/
++			*pM = this->M;
++			*pN = this->N;
++		}/*}}}*/
++		double* GetPointer(void){/*{{{*/
++			return this->values;
++		}/*}}}*/
++		void MatrixSum(Matrix* A,Matrix* B){/*{{{*/
++			/*Check that sizes are compatible*/
++			int M_B,N_B,M_A,N_A;
++			B->GetSize(&M_B,&N_B);
++			A->GetSize(&M_A,&N_A);
++			assert(this->M==M_B && this->N==N_B);
++			assert(this->M==M_A && this->N==N_A);
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,A->GetValue(i,j) + B->GetValue(i,j));
++				}
++			}
++		}/*}}}*/
++		void MatrixDiff(Matrix* A,Matrix* B){/*{{{*/
++			/*Check that sizes are compatible*/
++			int M_B,N_B,M_A,N_A;
++			B->GetSize(&M_B,&N_B);
++			A->GetSize(&M_A,&N_A);
++			assert(this->M==M_B && this->N==N_B);
++			assert(this->M==M_A && this->N==N_A);
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,A->GetValue(i,j) - B->GetValue(i,j));
++				}
++			}
++		}/*}}}*/
++		void MatrixAbs(Matrix* A){/*{{{*/
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,fabs(A->GetValue(i,j)));
++				}
++			}
++		}/*}}}*/
++		void MatrixEqual(Matrix* A){/*{{{*/
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,A->GetValue(i,j));
++				}
++			}
++		}/*}}}*/
++		double MatrixInternSum(){/*{{{*/
++			double sum=0;
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					sum+=this->GetValue(i,j);
++				}
++			}
++			return sum;
++		}/*}}}*/
++		void ExtractLine(Matrix* A,int i){/*{{{*/
++			/* Check that the size of A is compatible */
++			int M_A,N_A;
++			A->GetSize(&M_A,&N_A);
++			assert(M_A==1 && this->N==N_A);
++			for(int j=0;j<this->N;j++){
++				A->SetValue(0,j,this->GetValue(i,j));
++			}
++		}/*}}}*/
++		void ExtractColumn(Matrix* A,int j){/*{{{*/
++			/* Check that the size of A is compatible */
++			int M_A,N_A;
++			A->GetSize(&M_A,&N_A);
++			assert(N_A==1 && this->M==M_A);
++			for(int i=0;i<this->M;i++){
++				A->SetValue(i,0,this->GetValue(i,j));
++			}
++		}/*}}}*/
++		void AddNumber(double a){/*{{{*/
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,this->GetValue(i,j) + a);
++				}
++			}
++		}/*}}}*/
++};/*}}}*/
++
++/*Local prototypes{{{*/
++void makep(Matrix *Pobs,int nx,int ny, int dx, int dy);
++void vec2grid(Matrix *V,Matrix *V1,Matrix *V2,int nx, int ny);
++void msplit( Matrix *m, Matrix *m1,Matrix *m2,double dlevel);
++void plouff(Matrix *g,Matrix *Pobs,Matrix *Pp,Matrix * mesh,Matrix *rho,int dx,int dy, int dn,int m,int n,int l,Matrix *evalid,int my_rank,int num_procs);
++void vec2gridsimple(Matrix *V,Matrix *V1,int nx, int ny);
++void reshape(Matrix* V,Matrix* V1,int nx,int ny);
++double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,double dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my,int my_rank,int num_procs);
++void GSLsquarefit(Matrix** pX,Matrix* A,Matrix* B);
++/*}}}*/
++
++int main(int argc,char *argv[]){/*{{{*/
++
++	int my_rank,num_procs;
++
++	MPI_Init(&argc, &argv);
++
++	MPI_Comm_size(MPI_COMM_WORLD,&num_procs);
++	MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
++
++	/* Define the variables {{{*/
++
++	int    dx     = 1000;   /* prism dimension in x-direction                           */
++	int    dy     = 1000;   /* prism dimension in y-direction                           */
++	int    mx     = 99;    /* number of prisms in x-direction                          */
++	int    my     = 99;    /* number of prisms in y-direction                          */
++	int    nx     = 99;    /* number of data points in x-direction                     */
++	int    ny     = 99;    /* number of data points in y-direction                     */
++	int    dn     = 15000; /* distance for neighbouting prisms for gravity calculation */
++
++	Matrix *Pobs=new Matrix(nx*ny,2); /* data positions */
++	makep(Pobs,nx,ny,dx,dy);
++	// Pobs->Echo();
++
++
++
++	Matrix *Pp=new Matrix(mx*my,2); /* prisms positions */
++	makep(Pp,mx,my,dx,dy);
++	// Pp->Echo();
++
++	double  rhoi = 917;           /* ice density     */
++	double  rhow = 1030;          /* water density   */
++	// double  rhos = 2013;		      /* sediment density */
++
++	double rhoc_min=2000.;
++	double rhoc_max=3000.;
++
++	Matrix *Rho  = new Matrix(1,2);
++	Rho->SetValue(0,0,rhoi);
++	Rho->SetValue(0,1,rhow);
++	Matrix *rho1  = new Matrix(1,3);
++	rho1->SetValue(0,0,rhoi);
++	rho1->SetValue(0,1,rhow);
++	rho1->SetValue(0,2,rhoc_min);
++	Matrix *rho2  = new Matrix(1,2);
++	rho2->SetValue(0,0,rhoi-rhoc_min);
++	rho2->SetValue(0,1,rhow-rhoc_min);
++
++	double dlevel=3134;         /* level of data acquisition */
++
++
++	Matrix *xobs= new Matrix(ny,nx);
++	Matrix *yobs= new Matrix(ny,nx);
++
++	vec2grid(Pobs,xobs,yobs,nx,ny);
++	//	xobs->Echo();
++	//	yobs->Echo();
++
++
++	/*}}}*/     
++	/* load the data {{{*/
++
++
++	double inputnumber;
++
++	/* Observed gravity anomaly */
++
++	ifstream file1("gravityraw.txt");
++	Matrix * gobs= new Matrix(nx*ny,1);
++	for(int i=0;i<ny*nx; i++){ 
++		file1 >> inputnumber;
++		gobs->SetValue(i,0, inputnumber*1e-5);
++	}
++	file1.close();
++	//	gobs->Echo();
++
++
++	/* id of grid to evaluate misfit */
++
++
++	ifstream file4("evalid1.txt");
++	Matrix * evalid= new Matrix(nx*ny,1);
++	for(int s=0;s<nx*ny; s++){ 
++		file4 >> inputnumber;
++		evalid->SetValue(s,0,inputnumber);
++	}
++	file4.close();
++	//	evalid->Echo();
++
++	/* initial guess of the model */
++
++	ifstream file5("m0_102714contzach.txt");
++	Matrix * mesh_ini= new Matrix(mx*my,3);
++	for(int s=0;s<mx*my; s++){ 
++		for(int j=0;j<3;j++){
++			file5 >> inputnumber;
++			mesh_ini->SetValue(s,j,inputnumber);
++		}
++	}
++	file5.close();
++	//	mesh_ini->Echo();
++	/*}}}*/
++	/* Test {{{ */
++
++
++	double rhoc=rhoc_min;
++	double rhoc_opti=rhoc_min;
++	double E=misfit(mesh_ini,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my,my_rank,num_procs);
++	double E_opti=E;
++
++	for(int i=rhoc_min;i<rhoc_max+1;i++){
++		rhoc=i;
++		rho1->SetValue(0,2,rhoc);
++		rho2->SetValue(0,0,rhoi-rhoc);
++		rho2->SetValue(0,1,rhow-rhoc);
++
++		E=misfit(mesh_ini,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my,my_rank,num_procs);
++
++		if(E<E_opti){
++			E_opti=E;
++			rhoc_opti=rhoc;
++		}
++		if(my_rank==0){
++			cout<<rhoc<<"  "<<rhoc_opti<<"  "<<E<<"  "<<E_opti<<endl;
++		}
++	}
++
++
++
++
++	delete Pobs;
++	delete Pp;
++	delete Rho;
++	delete rho1;
++	delete rho2;
++	delete xobs;
++	delete yobs;
++	delete mesh_ini;
++	delete evalid;
++	delete gobs;
++
++	/*}}}*/
++
++	MPI_Finalize();
++
++	return 0;
++}/*}}}*/
++
++void GSLsquarefit(Matrix** pX,Matrix* A,Matrix* B){/*{{{*/
++
++	/*GSL Matrices and vectors: */
++	int    M,N;
++	double chisq;
++	/*Get system size*/
++	A->GetSize(&M,&N);
++
++	/*Initialize gsl matrices and vectors: */
++	gsl_matrix* a = gsl_matrix_alloc(M,N);
++	for(int i=0;i<M;i++){
++		for(int j=0;j<N;j++){
++			gsl_matrix_set (a,i,j,A->GetValue(i,j));
++		}
++	}
++	gsl_vector* b = gsl_vector_alloc(M);
++	for(int i=0;i<M;i++){
++		gsl_vector_set(b,i,B->GetValue(i,0));
++	}
++
++	gsl_vector* x = gsl_vector_alloc(N);
++	gsl_matrix* cov = gsl_matrix_alloc(N,N);
++
++	/*Least square fit: */
++	gsl_multifit_linear_workspace* work = gsl_multifit_linear_alloc(M,N);
++	gsl_multifit_linear (a, b, x, cov, &chisq, work);
++	gsl_multifit_linear_free (work);
++
++	/*Clean up and assign output pointer*/
++	Matrix* X = new Matrix(N,1);
++	for(int j=0;j<N;j++){
++		X->SetValue(j,0,gsl_vector_get(x,j));
++	}
++	*pX = X;
++
++	gsl_matrix_free(a);
++	gsl_vector_free(x);
++	gsl_vector_free(b);
++	gsl_matrix_free(cov);
++
++}/*}}}*/
++void makep(Matrix *Pobs,int nx,int ny, int dx, int dy){/*{{{*/
++	for(int i=0;i<ny;i++){
++		for(int j=0;j<nx;j++){
++			Pobs->SetValue(j+nx*i,0,j*dx);
++			Pobs->SetValue(j+nx*i,1,i*dy);
++		}
++	}
++}/*}}}*/
++void vec2grid(Matrix *V,Matrix *V1,Matrix *V2,int nx, int ny){/*{{{*/
++	for(int i=0;i<ny;i++){
++		for (int j=0;j<nx;j++){
++			V1->SetValue(i,j, V->GetValue(j+nx*i,0));
++			V2->SetValue(i,j, V->GetValue(j+nx*i,1));
++		}
++	}
++}/*}}}*/
++void msplit( Matrix *m, Matrix *m1,Matrix *m2,double dlevel){/*{{{*/
++	int sizem1,sizem2;
++	m->GetSize(&sizem1,&sizem2);
++	for(int i=0;i<sizem1;i++){
++		for(int j=0;j<sizem2+1;j++){
++			if(j<sizem2){
++				m1->SetValue(i,j,1e-10*(sizem2+1-j));
++				m2->SetValue(i,j,m->GetValue(i,j));
++				if(m->GetValue(i,j)<0){
++					m1->SetValue(i,j,m->GetValue(i,j));
++					m2->SetValue(i,j,i*1e-10);
++				}
++				m1->SetValue(i,j,m1->GetValue(i,j));
++				m2->SetValue(i,j,m2->GetValue(i,j));
++			}
++			else{
++				m1->SetValue(i,j,1e-10);
++			}
++		}
++	}
++	m1->AddNumber(dlevel);
++	m2->AddNumber(dlevel);
++}/*}}}*/
++void plouff(Matrix *g,Matrix *Pobs,Matrix *Pp,Matrix * mesh,Matrix *rho,int dx,int dy, int dn,int m,int n,int l,Matrix *evalid,int my_rank,int num_procs){/*{{{*/
++	double gg=6.673e-11;
++	int si,sj,id,s;
++	double R,Q,P;
++	Matrix *xp= new Matrix(1,2);
++	Matrix *yp= new Matrix(1,2);
++	Matrix *xpp= new Matrix(1,2);
++	Matrix *ypp= new Matrix(1,2);
++	Matrix *U= new Matrix(l,4);
++	Matrix *U1=new Matrix(1,4);
++	Matrix *U2=new Matrix(1,4);
++	Matrix *gl= new Matrix(1,l-1);
++	bool test=true;
++
++	double *glocal=new double[n]();
++
++	for(int c=my_rank;c<n;c+=num_procs){
++		glocal[c]=0;
++		if(evalid->GetValue(c,0)==1){
++			for(int a=0;a<m;a++){
++				test=true;
++				xp->SetValue(0,0,Pp->GetValue(a,0)-Pobs->GetValue(c,0));
++				xp->SetValue(0,1,Pp->GetValue(a,0)-Pobs->GetValue(c,0)+dx);
++				if(xp->GetValue(0,0)<0 && xp->GetValue(0,0)<xp->GetValue(0,1) && xp->GetValue(0,0)*xp->GetValue(0,1)>=0){
++					xpp->SetValue(0,0,xp->GetValue(0,1));
++					xpp->SetValue(0,1,xp->GetValue(0,0));
++					xp->MatrixAbs(xpp);
++				}
++				yp->SetValue(0,0,Pp->GetValue(a,1)-Pobs->GetValue(c,1));
++				yp->SetValue(0,1,Pp->GetValue(a,1)-Pobs->GetValue(c,1)+dy);
++				if(yp->GetValue(0,0)<0 && yp->GetValue(0,0)<yp->GetValue(0,1) && yp->GetValue(0,0)*yp->GetValue(0,1)>=0){
++					ypp->SetValue(0,0,yp->GetValue(0,1));
++					ypp->SetValue(0,1,yp->GetValue(0,0));
++					yp->MatrixAbs(ypp);
++				}
++				P=sqrt(xp->GetValue(0,0)*xp->GetValue(0,0)+yp->GetValue(0,0)*yp->GetValue(0,0));
++				if(P>dn){
++					test=false;
++					for(int i=0;i<l-1;i++){
++						gl->SetValue(0,i,0);
++					}
++				}
++				if(test==true){
++					si=1;
++					sj=1;
++					id=0;
++					for(int i=0;i<2;i++){
++						si*=-1;
++						for(int j=0;j<2;j++){
++							sj*=-1;
++							s=si*sj;
++							for(int k=0;k<l;k++){
++								R=sqrt(xp->GetValue(0,i)*xp->GetValue(0,i)+yp->GetValue(0,j)*yp->GetValue(0,j)+mesh->GetValue(a,k)*mesh->GetValue(a,k));
++								Q=atan(xp->GetValue(0,i)*yp->GetValue(0,j)/(mesh->GetValue(a,k)*R));
++								U->SetValue(k,id,s*(mesh->GetValue(a,k)*Q-xp->GetValue(0,i)*log(R+yp->GetValue(0,j))-yp->GetValue(0,j)*log(R+xp->GetValue(0,i))));
++							}
++							id++;
++						}
++					}
++					for(int b=0;b<l-1;b++){
++						U->ExtractLine(U1,b);
++						U->ExtractLine(U2,b+1);
++						gl->SetValue(0,b,rho->GetValue(0,b)*(U1->MatrixInternSum()*(-1)+U2->MatrixInternSum()));
++					}
++				}
++				glocal[c]=glocal[c]+gg*gl->MatrixInternSum();
++			}
++		}
++	}
++
++	MPI_Allreduce(glocal,g->GetPointer(),n,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
++
++	delete xp;
++	delete yp;
++	delete xpp;
++	delete ypp;
++	delete gl;
++	delete U;
++	delete U1;
++	delete U2;
++	delete []glocal;
++}/*}}}*/
++void vec2gridsimple(Matrix *V,Matrix *V1,int nx, int ny){/*{{{*/
++	for(int i=0;i<ny;i++){
++		for (int j=0;j<nx;j++){
++			V1->SetValue(i,j, V->GetValue(j+nx*i,0));
++		}
++	}
++}/*}}}*/
++void reshape(Matrix* V,Matrix* V1,int nx,int ny){/*{{{*/
++	for (int i=0;i<ny;i++){
++		for(int j=0;j<nx;j++){
++			V1->SetValue(j+nx*i,0,V->GetValue(i,j));
++		}
++	}
++}/*}}}*/
++double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,double dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my,int my_rank,int num_procs){/*{{{*/
++	Matrix* m1=new Matrix(mx*my,4);
++	Matrix* m2=new Matrix(mx*my,3);
++	Matrix* g1=new Matrix(nx*ny,1);
++	Matrix* g2=new Matrix(nx*ny,1);
++	Matrix* g=new Matrix(nx*ny,1);
++	Matrix* gcalgr=new Matrix(ny,nx);
++	Matrix* gcalvec=new Matrix(nx*ny,1);
++	Matrix* df=new Matrix(nx*ny,1);
++	Matrix* G=new Matrix(nx*ny,3);
++	double a=0;
++	double b=0;
++	double e=0;
++	msplit(m0,m1,m2,dlevel);
++	plouff(g1,Pobs,Pp,m1,rho1,dx,dy,dn,mx*my,nx*ny,4,evalid, my_rank, num_procs);
++	plouff(g2,Pobs,Pp,m2,rho2,dx,dy,dn,mx*my,nx*ny,3,evalid, my_rank, num_procs);
++	g->MatrixSum(g1,g2);
++	vec2gridsimple(g,gcalgr,nx,ny);
++	reshape(gcalgr,gcalvec,nx,ny);
++	for (int i=0;i<nx*ny;i++){
++		df->SetValue(i,0,evalid->GetValue(i,0)*(gobs->GetValue(i,0)-gcalvec->GetValue(i,0)));
++		G->SetValue(i,0,evalid->GetValue(i,0)*Pobs->GetValue(i,0));
++		G->SetValue(i,1,evalid->GetValue(i,0)*Pobs->GetValue(i,1));
++		G->SetValue(i,2,evalid->GetValue(i,0));
++	}
++	Matrix* M = NULL;
++	GSLsquarefit(&M,G,df);
++
++	for (int i=0;i<ny;i++){
++		for(int j=0;j<nx;j++){
++			gcalgr->SetValue(i,j,gcalgr->GetValue(i,j)+xobs->GetValue(i,j)*M->GetValue(0,0)+yobs->GetValue(i,j)*M->GetValue(1,0)+M->GetValue(2,0));
++		}
++	}
++	reshape(gcalgr,g,nx,ny);
++	for (int i=0;i<nx*ny;i++){
++		a=a+fabs(evalid->GetValue(i,0)*(gobs->GetValue(i,0)-g->GetValue(i,0)));
++		b=b+fabs(evalid->GetValue(i,0)*(gobs->GetValue(i,0)+g->GetValue(i,0)));
++	}
++	e=2*a/(a+b);
++
++	delete m1;
++	delete m2;
++	delete g1;
++	delete g2;
++	delete g;
++	delete gcalgr;
++	delete gcalvec;
++	delete df;
++	delete G;
++	delete M;
++
++	return e;
++}/*}}}*/
+Index: ../trunk-jpl/src/m/contrib/gravity/code_densite/density_rock_uneven.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/code_densite/density_rock_uneven.cpp	(revision 0)
++++ ../trunk-jpl/src/m/contrib/gravity/code_densite/density_rock_uneven.cpp	(revision 18750)
+@@ -0,0 +1,516 @@
++#include <iostream>
++#include <cmath>
++#include <fstream>
++#include <string>
++#include <cstdio>
++#include <cstdlib>
++#include <time.h>
++#include <cassert>
++#include <gsl/gsl_multifit.h>
++#include "mpi.h"
++using namespace std;
++
++class Matrix{/*{{{*/
++	private:
++		int     M;        /*Number of lines   */
++		int     N;        /*Number if Columns */
++		double *values;
++	public:
++		Matrix(int m_in,int n_in){/*{{{*/
++			this->M = m_in;
++			this->N = n_in;
++			this->values = new double[M*N]();
++		}/*}}}*/
++		~Matrix(){/*{{{*/
++			delete [] this->values;
++		}/*}}}*/
++		void Echo(void){/*{{{*/
++			for(int i=0;i<M;i++){
++				for(int j=0;j<N;j++){
++					cout << " " << this->values[i*N+j];
++				}
++				cout << endl;
++			}
++		}/*}}}*/
++		void SetValue(int i,int j,double value){/*{{{*/
++			this->values[i*N+j] = value;
++		}/*}}}*/
++		double GetValue(int i,int j){/*{{{*/
++			return this->values[i*N+j];
++		}/*}}}*/
++		void GetSize(int* pM,int* pN){/*{{{*/
++			*pM = this->M;
++			*pN = this->N;
++		}/*}}}*/
++		double* GetPointer(void){/*{{{*/
++			return this->values;
++		}/*}}}*/
++		void MatrixSum(Matrix* A,Matrix* B){/*{{{*/
++			/*Check that sizes are compatible*/
++			int M_B,N_B,M_A,N_A;
++			B->GetSize(&M_B,&N_B);
++			A->GetSize(&M_A,&N_A);
++			assert(this->M==M_B && this->N==N_B);
++			assert(this->M==M_A && this->N==N_A);
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,A->GetValue(i,j) + B->GetValue(i,j));
++				}
++			}
++		}/*}}}*/
++		void MatrixDiff(Matrix* A,Matrix* B){/*{{{*/
++			/*Check that sizes are compatible*/
++			int M_B,N_B,M_A,N_A;
++			B->GetSize(&M_B,&N_B);
++			A->GetSize(&M_A,&N_A);
++			assert(this->M==M_B && this->N==N_B);
++			assert(this->M==M_A && this->N==N_A);
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,A->GetValue(i,j) - B->GetValue(i,j));
++				}
++			}
++		}/*}}}*/
++		void MatrixAbs(Matrix* A){/*{{{*/
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,fabs(A->GetValue(i,j)));
++				}
++			}
++		}/*}}}*/
++		void MatrixEqual(Matrix* A){/*{{{*/
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,A->GetValue(i,j));
++				}
++			}
++		}/*}}}*/
++		double MatrixInternSum(){/*{{{*/
++			double sum=0;
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					sum+=this->GetValue(i,j);
++				}
++			}
++			return sum;
++		}/*}}}*/
++		void ExtractLine(Matrix* A,int i){/*{{{*/
++			/* Check that the size of A is compatible */
++			int M_A,N_A;
++			A->GetSize(&M_A,&N_A);
++			assert(M_A==1 && this->N==N_A);
++			for(int j=0;j<this->N;j++){
++				A->SetValue(0,j,this->GetValue(i,j));
++			}
++		}/*}}}*/
++		void ExtractColumn(Matrix* A,int j){/*{{{*/
++			/* Check that the size of A is compatible */
++			int M_A,N_A;
++			A->GetSize(&M_A,&N_A);
++			assert(N_A==1 && this->M==M_A);
++			for(int i=0;i<this->M;i++){
++				A->SetValue(i,0,this->GetValue(i,j));
++			}
++		}/*}}}*/
++		void AddNumber(double a){/*{{{*/
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,this->GetValue(i,j) + a);
++				}
++			}
++		}/*}}}*/
++};/*}}}*/
++
++/*Local prototypes{{{*/
++void makep(Matrix *Pobs,int nx,int ny, int dx, int dy);
++void vec2grid(Matrix *V,Matrix *V1,Matrix *V2,int nx, int ny);
++void msplit( Matrix *m, Matrix *m1,Matrix *m2,Matrix *dlevel);
++void plouff(Matrix *g,Matrix *Pobs,Matrix *Pp,Matrix * mesh,Matrix *rho,int dx,int dy, int dn,int m,int n,int l,Matrix *evalid,int my_rank,int num_procs);
++void vec2gridsimple(Matrix *V,Matrix *V1,int nx, int ny);
++void reshape(Matrix* V,Matrix* V1,int nx,int ny);
++double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,Matrix *dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my,int my_rank,int num_procs);
++void GSLsquarefit(Matrix** pX,Matrix* A,Matrix* B);
++/*}}}*/
++
++int main(int argc,char *argv[]){/*{{{*/
++
++	int my_rank,num_procs;
++
++	MPI_Init(&argc, &argv);
++
++	MPI_Comm_size(MPI_COMM_WORLD,&num_procs);
++	MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
++
++	/* Define the variables {{{*/
++
++	int    dx     = 1000;   /* prism dimension in x-direction                           */
++	int    dy     = 1000;   /* prism dimension in y-direction                           */
++	int    mx     = 99;    /* number of prisms in x-direction                          */
++	int    my     = 99;    /* number of prisms in y-direction                          */
++	int    nx     = 99;    /* number of data points in x-direction                     */
++	int    ny     = 99;    /* number of data points in y-direction                     */
++	int    dn     = 15000; /* distance for neighbouting prisms for gravity calculation */
++
++	Matrix *Pobs=new Matrix(nx*ny,2); /* data positions */
++	makep(Pobs,nx,ny,dx,dy);
++	// Pobs->Echo();
++
++
++
++	Matrix *Pp=new Matrix(mx*my,2); /* prisms positions */
++	makep(Pp,mx,my,dx,dy);
++	// Pp->Echo();
++
++	double  rhoi = 917;           /* ice density     */
++	double  rhow = 1030;          /* water density   */
++	// double  rhos = 2013;		      /* sediment density */
++
++	double rhoc_min=2000.;
++	double rhoc_max=3000.;
++
++	Matrix *Rho  = new Matrix(1,2);
++	Rho->SetValue(0,0,rhoi);
++	Rho->SetValue(0,1,rhow);
++	Matrix *rho1  = new Matrix(1,3);
++	rho1->SetValue(0,0,rhoi);
++	rho1->SetValue(0,1,rhow);
++	rho1->SetValue(0,2,rhoc_min);
++	Matrix *rho2  = new Matrix(1,2);
++	rho2->SetValue(0,0,rhoi-rhoc_min);
++	rho2->SetValue(0,1,rhow-rhoc_min);
++
++
++	Matrix *xobs= new Matrix(ny,nx);
++	Matrix *yobs= new Matrix(ny,nx);
++
++	vec2grid(Pobs,xobs,yobs,nx,ny);
++	//	xobs->Echo();
++	//	yobs->Echo();
++
++
++	/*}}}*/     
++	/* load the data {{{*/
++
++
++	double inputnumber;
++
++	/* Levels of data acquisition */
++
++	ifstream file0("dataalti.txt");
++	Matrix * dlevel= new Matrix(nx*ny,1);
++	for(int i=0;i<ny*nx; i++){
++		file0 >> inputnumber;
++		dlevel->SetValue(i,0,inputnumber);
++	}
++	file0.close();
++
++	/* Observed gravity anomaly */
++
++	ifstream file1("gravityraw.txt");
++	Matrix * gobs= new Matrix(nx*ny,1);
++	for(int i=0;i<ny*nx; i++){ 
++		file1 >> inputnumber;
++		gobs->SetValue(i,0, inputnumber*1e-5);
++	}
++	file1.close();
++	//	gobs->Echo();
++
++
++	/* id of grid to evaluate misfit */
++
++
++	ifstream file4("evalid1.txt");
++	Matrix * evalid= new Matrix(nx*ny,1);
++	for(int s=0;s<nx*ny; s++){ 
++		file4 >> inputnumber;
++		evalid->SetValue(s,0,inputnumber);
++	}
++	file4.close();
++	//	evalid->Echo();
++
++	/* initial guess of the model */
++
++	ifstream file5("m0_102714contzach.txt");
++	Matrix * mesh_ini= new Matrix(mx*my,3);
++	for(int s=0;s<mx*my; s++){ 
++		for(int j=0;j<3;j++){
++			file5 >> inputnumber;
++			mesh_ini->SetValue(s,j,inputnumber);
++		}
++	}
++	file5.close();
++	//	mesh_ini->Echo();
++	/*}}}*/
++	/* Test {{{ */
++
++
++	double rhoc=rhoc_min;
++	double rhoc_opti=rhoc_min;
++	double E=misfit(mesh_ini,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my,my_rank,num_procs);
++	double E_opti=E;
++
++	for(int i=rhoc_min;i<rhoc_max+1;i++){
++		rhoc=i;
++		rho1->SetValue(0,2,rhoc);
++		rho2->SetValue(0,0,rhoi-rhoc);
++		rho2->SetValue(0,1,rhow-rhoc);
++
++		E=misfit(mesh_ini,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my,my_rank,num_procs);
++
++		if(E<E_opti){
++			E_opti=E;
++			rhoc_opti=rhoc;
++		}
++		if(my_rank==0){
++			cout<<rhoc<<"  "<<rhoc_opti<<"  "<<E<<"  "<<E_opti<<endl;
++		}
++	}
++
++
++
++
++	delete Pobs;
++	delete Pp;
++	delete Rho;
++	delete rho1;
++	delete rho2;
++	delete xobs;
++	delete yobs;
++	delete mesh_ini;
++	delete evalid;
++	delete gobs;
++
++	/*}}}*/
++
++	MPI_Finalize();
++
++	return 0;
++}/*}}}*/
++
++void GSLsquarefit(Matrix** pX,Matrix* A,Matrix* B){/*{{{*/
++
++	/*GSL Matrices and vectors: */
++	int    M,N;
++	double chisq;
++	/*Get system size*/
++	A->GetSize(&M,&N);
++
++	/*Initialize gsl matrices and vectors: */
++	gsl_matrix* a = gsl_matrix_alloc(M,N);
++	for(int i=0;i<M;i++){
++		for(int j=0;j<N;j++){
++			gsl_matrix_set (a,i,j,A->GetValue(i,j));
++		}
++	}
++	gsl_vector* b = gsl_vector_alloc(M);
++	for(int i=0;i<M;i++){
++		gsl_vector_set(b,i,B->GetValue(i,0));
++	}
++
++	gsl_vector* x = gsl_vector_alloc(N);
++	gsl_matrix* cov = gsl_matrix_alloc(N,N);
++
++	/*Least square fit: */
++	gsl_multifit_linear_workspace* work = gsl_multifit_linear_alloc(M,N);
++	gsl_multifit_linear (a, b, x, cov, &chisq, work);
++	gsl_multifit_linear_free (work);
++
++	/*Clean up and assign output pointer*/
++	Matrix* X = new Matrix(N,1);
++	for(int j=0;j<N;j++){
++		X->SetValue(j,0,gsl_vector_get(x,j));
++	}
++	*pX = X;
++
++	gsl_matrix_free(a);
++	gsl_vector_free(x);
++	gsl_vector_free(b);
++	gsl_matrix_free(cov);
++
++}/*}}}*/
++void makep(Matrix *Pobs,int nx,int ny, int dx, int dy){/*{{{*/
++	for(int i=0;i<ny;i++){
++		for(int j=0;j<nx;j++){
++			Pobs->SetValue(j+nx*i,0,j*dx);
++			Pobs->SetValue(j+nx*i,1,i*dy);
++		}
++	}
++}/*}}}*/
++void vec2grid(Matrix *V,Matrix *V1,Matrix *V2,int nx, int ny){/*{{{*/
++	for(int i=0;i<ny;i++){
++		for (int j=0;j<nx;j++){
++			V1->SetValue(i,j, V->GetValue(j+nx*i,0));
++			V2->SetValue(i,j, V->GetValue(j+nx*i,1));
++		}
++	}
++}/*}}}*/
++void msplit( Matrix *m, Matrix *m1,Matrix *m2,Matrix* dlevel){/*{{{*/
++	int sizem1,sizem2;
++	m->GetSize(&sizem1,&sizem2);
++	for(int i=0;i<sizem1;i++){
++		for(int j=0;j<sizem2+1;j++){
++			if(j<sizem2){
++				m1->SetValue(i,j,1e-10*(sizem2+1-j));
++				m2->SetValue(i,j,m->GetValue(i,j));
++				if(m->GetValue(i,j)<0){
++					m1->SetValue(i,j,m->GetValue(i,j));
++					m2->SetValue(i,j,i*1e-10);
++				}
++				m1->SetValue(i,j,m1->GetValue(i,j)+dlevel->GetValue(i,1));
++				m2->SetValue(i,j,m2->GetValue(i,j)+dlevel->GetValue(i,1));
++			}
++			else{
++				m1->SetValue(i,j,1e-10+dlevel->GetValue(i,1));
++			}
++		}
++	}
++}/*}}}*/
++void plouff(Matrix *g,Matrix *Pobs,Matrix *Pp,Matrix * mesh,Matrix *rho,int dx,int dy, int dn,int m,int n,int l,Matrix *evalid,int my_rank,int num_procs){/*{{{*/
++	double gg=6.673e-11;
++	int si,sj,id,s;
++	double R,Q,P;
++	Matrix *xp= new Matrix(1,2);
++	Matrix *yp= new Matrix(1,2);
++	Matrix *xpp= new Matrix(1,2);
++	Matrix *ypp= new Matrix(1,2);
++	Matrix *U= new Matrix(l,4);
++	Matrix *U1=new Matrix(1,4);
++	Matrix *U2=new Matrix(1,4);
++	Matrix *gl= new Matrix(1,l-1);
++	bool test=true;
++
++	double *glocal=new double[n]();
++
++	for(int c=my_rank;c<n;c+=num_procs){
++		glocal[c]=0;
++		if(evalid->GetValue(c,0)==1){
++			for(int a=0;a<m;a++){
++				test=true;
++				xp->SetValue(0,0,Pp->GetValue(a,0)-Pobs->GetValue(c,0));
++				xp->SetValue(0,1,Pp->GetValue(a,0)-Pobs->GetValue(c,0)+dx);
++				if(xp->GetValue(0,0)<0 && xp->GetValue(0,0)<xp->GetValue(0,1) && xp->GetValue(0,0)*xp->GetValue(0,1)>=0){
++					xpp->SetValue(0,0,xp->GetValue(0,1));
++					xpp->SetValue(0,1,xp->GetValue(0,0));
++					xp->MatrixAbs(xpp);
++				}
++				yp->SetValue(0,0,Pp->GetValue(a,1)-Pobs->GetValue(c,1));
++				yp->SetValue(0,1,Pp->GetValue(a,1)-Pobs->GetValue(c,1)+dy);
++				if(yp->GetValue(0,0)<0 && yp->GetValue(0,0)<yp->GetValue(0,1) && yp->GetValue(0,0)*yp->GetValue(0,1)>=0){
++					ypp->SetValue(0,0,yp->GetValue(0,1));
++					ypp->SetValue(0,1,yp->GetValue(0,0));
++					yp->MatrixAbs(ypp);
++				}
++				P=sqrt(xp->GetValue(0,0)*xp->GetValue(0,0)+yp->GetValue(0,0)*yp->GetValue(0,0));
++				if(P>dn){
++					test=false;
++					for(int i=0;i<l-1;i++){
++						gl->SetValue(0,i,0);
++					}
++				}
++				if(test==true){
++					si=1;
++					sj=1;
++					id=0;
++					for(int i=0;i<2;i++){
++						si*=-1;
++						for(int j=0;j<2;j++){
++							sj*=-1;
++							s=si*sj;
++							for(int k=0;k<l;k++){
++								R=sqrt(xp->GetValue(0,i)*xp->GetValue(0,i)+yp->GetValue(0,j)*yp->GetValue(0,j)+mesh->GetValue(a,k)*mesh->GetValue(a,k));
++								Q=atan(xp->GetValue(0,i)*yp->GetValue(0,j)/(mesh->GetValue(a,k)*R));
++								U->SetValue(k,id,s*(mesh->GetValue(a,k)*Q-xp->GetValue(0,i)*log(R+yp->GetValue(0,j))-yp->GetValue(0,j)*log(R+xp->GetValue(0,i))));
++							}
++							id++;
++						}
++					}
++					for(int b=0;b<l-1;b++){
++						U->ExtractLine(U1,b);
++						U->ExtractLine(U2,b+1);
++						gl->SetValue(0,b,rho->GetValue(0,b)*(U1->MatrixInternSum()*(-1)+U2->MatrixInternSum()));
++					}
++				}
++				glocal[c]=glocal[c]+gg*gl->MatrixInternSum();
++			}
++		}
++	}
++
++	MPI_Allreduce(glocal,g->GetPointer(),n,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
++
++	delete xp;
++	delete yp;
++	delete xpp;
++	delete ypp;
++	delete gl;
++	delete U;
++	delete U1;
++	delete U2;
++	delete []glocal;
++}/*}}}*/
++void vec2gridsimple(Matrix *V,Matrix *V1,int nx, int ny){/*{{{*/
++	for(int i=0;i<ny;i++){
++		for (int j=0;j<nx;j++){
++			V1->SetValue(i,j, V->GetValue(j+nx*i,0));
++		}
++	}
++}/*}}}*/
++void reshape(Matrix* V,Matrix* V1,int nx,int ny){/*{{{*/
++	for (int i=0;i<ny;i++){
++		for(int j=0;j<nx;j++){
++			V1->SetValue(j+nx*i,0,V->GetValue(i,j));
++		}
++	}
++}/*}}}*/
++double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,Matrix *dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my,int my_rank,int num_procs){/*{{{*/
++	Matrix* m1=new Matrix(mx*my,4);
++	Matrix* m2=new Matrix(mx*my,3);
++	Matrix* g1=new Matrix(nx*ny,1);
++	Matrix* g2=new Matrix(nx*ny,1);
++	Matrix* g=new Matrix(nx*ny,1);
++	Matrix* gcalgr=new Matrix(ny,nx);
++	Matrix* gcalvec=new Matrix(nx*ny,1);
++	Matrix* df=new Matrix(nx*ny,1);
++	Matrix* G=new Matrix(nx*ny,3);
++	double a=0;
++	double b=0;
++	double e=0;
++	msplit(m0,m1,m2,dlevel);
++	plouff(g1,Pobs,Pp,m1,rho1,dx,dy,dn,mx*my,nx*ny,4,evalid, my_rank, num_procs);
++	plouff(g2,Pobs,Pp,m2,rho2,dx,dy,dn,mx*my,nx*ny,3,evalid, my_rank, num_procs);
++	g->MatrixSum(g1,g2);
++	vec2gridsimple(g,gcalgr,nx,ny);
++	reshape(gcalgr,gcalvec,nx,ny);
++	for (int i=0;i<nx*ny;i++){
++		df->SetValue(i,0,evalid->GetValue(i,0)*(gobs->GetValue(i,0)-gcalvec->GetValue(i,0)));
++		G->SetValue(i,0,evalid->GetValue(i,0)*Pobs->GetValue(i,0));
++		G->SetValue(i,1,evalid->GetValue(i,0)*Pobs->GetValue(i,1));
++		G->SetValue(i,2,evalid->GetValue(i,0));
++	}
++	Matrix* M = NULL;
++	GSLsquarefit(&M,G,df);
++
++	for (int i=0;i<ny;i++){
++		for(int j=0;j<nx;j++){
++			gcalgr->SetValue(i,j,gcalgr->GetValue(i,j)+xobs->GetValue(i,j)*M->GetValue(0,0)+yobs->GetValue(i,j)*M->GetValue(1,0)+M->GetValue(2,0));
++		}
++	}
++	reshape(gcalgr,g,nx,ny);
++	for (int i=0;i<nx*ny;i++){
++		a=a+fabs(evalid->GetValue(i,0)*(gobs->GetValue(i,0)-g->GetValue(i,0)));
++		b=b+fabs(evalid->GetValue(i,0)*(gobs->GetValue(i,0)+g->GetValue(i,0)));
++	}
++	e=2*a/(a+b);
++
++	delete m1;
++	delete m2;
++	delete g1;
++	delete g2;
++	delete g;
++	delete gcalgr;
++	delete gcalvec;
++	delete df;
++	delete G;
++	delete M;
++
++	return e;
++}/*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18750-18751.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18750-18751.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18750-18751.diff	(revision 19102)
@@ -0,0 +1,1768 @@
+Index: ../trunk-jpl/src/m/contrib/gravity/code_inversion/vfsa_mpi.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/code_inversion/vfsa_mpi.cpp	(revision 0)
++++ ../trunk-jpl/src/m/contrib/gravity/code_inversion/vfsa_mpi.cpp	(revision 18751)
+@@ -0,0 +1,876 @@
++#include <iostream>
++#include <cmath>
++#include <fstream>
++#include <string>
++#include <cstdio>
++#include <cstdlib>
++#include <time.h>
++#include <cassert>
++#include <gsl/gsl_multifit.h>
++#include "mpi.h"
++using namespace std;
++
++class Matrix{/*{{{*/
++	private:
++		int     M;        /*Number of lines   */
++		int     N;        /*Number if Columns */
++		double *values;
++	public:
++		Matrix(int m_in,int n_in){/*{{{*/
++			this->M = m_in;
++			this->N = n_in;
++			this->values = new double[M*N]();
++		}/*}}}*/
++		~Matrix(){/*{{{*/
++			delete [] this->values;
++		}/*}}}*/
++		void Echo(void){/*{{{*/
++			for(int i=0;i<M;i++){
++				for(int j=0;j<N;j++){
++					cout << " " << this->values[i*N+j];
++				}
++				cout << endl;
++			}
++		}/*}}}*/
++		void SetValue(int i,int j,double value){/*{{{*/
++			this->values[i*N+j] = value;
++		}/*}}}*/
++		double GetValue(int i,int j){/*{{{*/
++			return this->values[i*N+j];
++		}/*}}}*/
++		void GetSize(int* pM,int* pN){/*{{{*/
++			*pM = this->M;
++			*pN = this->N;
++		}/*}}}*/
++		double* GetPointer(void){/*{{{*/
++			return this->values;
++		}/*}}}*/
++		void MatrixSum(Matrix* A,Matrix* B){/*{{{*/
++			/*Check that sizes are compatible*/
++			int M_B,N_B,M_A,N_A;
++			B->GetSize(&M_B,&N_B);
++			A->GetSize(&M_A,&N_A);
++			assert(this->M==M_B && this->N==N_B);
++			assert(this->M==M_A && this->N==N_A);
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,A->GetValue(i,j) + B->GetValue(i,j));
++				}
++			}
++		}/*}}}*/
++		void MatrixDiff(Matrix* A,Matrix* B){/*{{{*/
++			/*Check that sizes are compatible*/
++			int M_B,N_B,M_A,N_A;
++			B->GetSize(&M_B,&N_B);
++			A->GetSize(&M_A,&N_A);
++			assert(this->M==M_B && this->N==N_B);
++			assert(this->M==M_A && this->N==N_A);
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,A->GetValue(i,j) - B->GetValue(i,j));
++				}
++			}
++		}/*}}}*/
++		void MatrixAbs(Matrix* A){/*{{{*/
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,fabs(A->GetValue(i,j)));
++				}
++			}
++		}/*}}}*/
++		void MatrixEqual(Matrix* A){/*{{{*/
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,A->GetValue(i,j));
++				}
++			}
++		}/*}}}*/
++		double MatrixInternSum(){/*{{{*/
++			double sum=0;
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					sum+=this->GetValue(i,j);
++				}
++			}
++			return sum;
++		}/*}}}*/
++		void ExtractLine(Matrix* A,int i){/*{{{*/
++			/* Check that the size of A is compatible */
++			int M_A,N_A;
++			A->GetSize(&M_A,&N_A);
++			assert(M_A==1 && this->N==N_A);
++			for(int j=0;j<this->N;j++){
++				A->SetValue(0,j,this->GetValue(i,j));
++			}
++		}/*}}}*/
++		void ExtractColumn(Matrix* A,int j){/*{{{*/
++			/* Check that the size of A is compatible */
++			int M_A,N_A;
++			A->GetSize(&M_A,&N_A);
++			assert(N_A==1 && this->M==M_A);
++			for(int i=0;i<this->M;i++){
++				A->SetValue(i,0,this->GetValue(i,j));
++			}
++		}/*}}}*/
++		void AddNumber(double a){/*{{{*/
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,this->GetValue(i,j) + a);
++				}
++			}
++		}/*}}}*/
++};/*}}}*/
++
++/*Local prototypes{{{*/
++void makep(Matrix *Pobs,int nx,int ny, int dx, int dy);
++void vec2grid(Matrix *V,Matrix *V1,Matrix *V2,int nx, int ny);
++void msplit( Matrix *m, Matrix *m1,Matrix *m2,double dlevel);
++void plouff(Matrix *g,Matrix *Pobs,Matrix *Pp,Matrix * mesh,Matrix *rho,int dx,int dy, int dn,int m,int n,int l,Matrix *evalid,int my_rank,int num_procs);
++void vec2gridsimple(Matrix *V,Matrix *V1,int nx, int ny);
++void reshape(Matrix* V,Matrix* V1,int nx,int ny);
++double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,double dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my,int my_rank,int num_procs);
++void GSLsquarefit(Matrix** pX,Matrix* A,Matrix* B);
++double signe(double a);
++void filtergrav(Matrix* A,Matrix* Ain,double ctr,double sd,int mx,int my);
++void newmodelgen(Matrix* m0,Matrix* m1,Matrix* bathy,Matrix* icethick,int mx,int my,double T,double ptval,double mmax,double mmax2,double ctr,double sd, Matrix *landmask);
++double coolshed(double T0,double k,double c,double D);
++/*}}}*/
++
++int main(int argc,char *argv[]){/*{{{*/
++	
++	int my_rank,num_procs;
++
++	MPI_Init(&argc, &argv);
++
++	MPI_Comm_size(MPI_COMM_WORLD,&num_procs);
++	MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
++
++	/* Seed the random number generator {{{*/
++		srand (time(NULL));            /*}}}*/
++	/* Define the variables {{{*/
++
++	int    dx     = 1000;   /* prism dimension in x-direction                           */
++	int    dy     = 1000;   /* prism dimension in y-direction                           */
++	int    mx     = 99;    /* number of prisms in x-direction                          */
++	int    my     = 99;    /* number of prisms in y-direction                          */
++	int    nx     = 99;    /* number of data points in x-direction                     */
++	int    ny     = 99;    /* number of data points in y-direction                     */
++	int    dn     = 15000; /* distance for neighbouting prisms for gravity calculation */
++	double ptval  = 100.;  /* max. amount to perturb model                             */
++	double ptval2 = 100.;
++
++	Matrix *Pobs=new Matrix(nx*ny,2); /* data positions */
++	makep(Pobs,nx,ny,dx,dy);
++	// Pobs->Echo();
++
++
++	Matrix *Pp=new Matrix(mx*my,2); /* prisms positions */
++	makep(Pp,mx,my,dx,dy);
++	// Pp->Echo();
++
++	double  rhoi = 917;           /* ice density     */
++	double  rhow = 1030;          /* water density   */
++	// double  rhos = 2013;		      /* sediment density */
++	double  rhoc = 2670;          /* bedrock density */
++
++	Matrix *Rho  = new Matrix(1,2);
++	Rho->SetValue(0,0,rhoi);
++	Rho->SetValue(0,1,rhow);
++	Matrix *rho1  = new Matrix(1,3);
++	rho1->SetValue(0,0,rhoi);
++	rho1->SetValue(0,1,rhow);
++	rho1->SetValue(0,2,rhoc);
++	Matrix *rho2  = new Matrix(1,2);
++	rho2->SetValue(0,0,rhoi-rhoc);
++	rho2->SetValue(0,1,rhow-rhoc);
++
++	double dlevel=3134;         /* level of data acquisition */
++
++	double ctr=1;            /* parameter for filtering */
++	double sd=0.1;
++
++	Matrix *xobs= new Matrix(ny,nx);
++	Matrix *yobs= new Matrix(ny,nx);
++
++	vec2grid(Pobs,xobs,yobs,nx,ny);
++	//	xobs->Echo();
++	//	yobs->Echo();
++
++
++	double mmax  = 1000;               /* max value for layer interfaces */
++	double mmax2 = 1000;
++	double mmax3 = 1000;
++
++	/* control parameter for temperature schedule  */
++
++	double ca=0.9;                    /* for acceptance */
++	double cm=0.5;                    /* for model perturbation */
++
++	double T0a          = 0.1;      /* initial temperature for acceptance           */
++	double T0m          = 0.9;      /* initial temperature for model perturbation   */
++	double D            = 2;        /* dimension of the model                       */
++	int    maxconsecrej = 1000;     /* max consecutive rejection                    */
++	int    maxsuccess   = 100;      /* max number of success within one temperature */
++	double T_min        = 1e-10;    /* stopping temp                                */
++	double Tred         = 1;
++	double E_min        = -1000000;
++	double E_exp        = 0.0291;   /* expected misfit                              */
++	int    maxiter      = 10000;
++	int    maxtotaliter = 1000000;
++	double Tol          = 1e-10;    /* tolerance on misfit                          */
++	int    sfreq        = 100;
++
++	/*}}}*/     
++	/* load the data {{{*/
++
++	/*landmask */
++
++	ifstream file("landmaskzach.txt");
++	Matrix * landmask= new Matrix(nx*ny,1);
++	double inputnumber;
++	for(int i=0;i<ny*nx; i++){ 
++		file >> inputnumber;
++		landmask->SetValue(i,0,inputnumber);
++	}
++	file.close();
++
++	/* Observed gravity anomaly */
++
++	ifstream file1("gravityzach.txt");
++	Matrix * gobs= new Matrix(nx*ny,1);
++	for(int i=0;i<ny*nx; i++){ 
++		file1 >> inputnumber;
++		gobs->SetValue(i,0, inputnumber*1e-5);
++	}
++	file1.close();
++	//	gobs->Echo();
++
++	/* load data about the ice thickness */
++
++	ifstream file2("icethickzach.txt");
++	Matrix * icethick= new Matrix(mx*my,1);
++	for(int s=0;s<mx*my; s++){ 
++		file2 >> inputnumber;
++		icethick->SetValue(s,0,inputnumber);
++	}
++	file2.close();
++	//	icethick->Echo();
++
++	/* load the batimethry data */
++
++	ifstream file3("bathymetryzach.txt");
++	Matrix * bathy= new Matrix(mx*my,1);
++	for(int s=0;s<mx*my; s++){ 
++		file3 >> inputnumber;
++		bathy->SetValue(s,0,inputnumber);
++	}
++	file3.close();
++	//	bathy->Echo();
++
++	/* id of grid to evaluate misfit */
++
++
++	ifstream file4("evalidzach.txt");
++	Matrix * evalid= new Matrix(nx*ny,1);
++	for(int s=0;s<nx*ny; s++){ 
++		file4 >> inputnumber;
++		evalid->SetValue(s,0,inputnumber);
++	}
++	file4.close();
++	//	evalid->Echo();
++
++	/* initial guess of the model */
++
++	ifstream file5("m0_102714contzach.txt");
++	Matrix * mesh_ini= new Matrix(mx*my,3);
++	for(int s=0;s<mx*my; s++){ 
++		for(int j=0;j<3;j++){
++			file5 >> inputnumber;
++			mesh_ini->SetValue(s,j,inputnumber);
++		}
++	}
++	file5.close();
++	//	mesh_ini->Echo();
++	/*}}}*/
++	/* VFSA {{{ */
++
++	/* name of the files to save results */
++	std::ofstream savefile1 ("r_zach.txt");
++	std::ofstream savefile2("m_zach.txt");
++
++	/* counters initialization */
++	int    success   = 0;
++	int    finished  = 0;
++	int    consec    = 0;
++	double Ta        = T0a;
++	double Tm        = T0m;
++	int    iterT     = 0;   /* iteration within a T      */
++	int    total     = 0;   /* total number of iteration */
++	int    totaliter = 0;
++	int    msave     = 0;
++	double E_new;
++	double E_final;
++	double dE;
++	double P;
++	double rn;
++	Matrix* m_old    = new Matrix(mx *my,3);
++	Matrix* m_min    = new Matrix(mx *my,3);
++	Matrix* m_new    = new Matrix(mx *my,3);
++	m_old->MatrixEqual(mesh_ini);
++
++	/* calculate initial misfit */
++	double E_old=misfit(m_old,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my, my_rank, num_procs);
++	/* record initial settings */
++	if(!my_rank){
++		savefile1 << "P     "<< "Ta    "<< "Tm    "<< "Eold  "<< "totaliter "<< "Tred   "<< endl;
++		savefile1 << "nan   "<<  Ta<<"   "<< Tm<<"   "<< E_old<<"     "<< totaliter<<"         "<< Tred <<"  "<< endl;
++		savefile2 << totaliter<< endl;
++		for(int i=0;i<mx*my;i++){
++			savefile2 << m_old->GetValue(i,0)<<"   "<< m_old->GetValue(i,1)<<"   "<< m_old->GetValue(i,2)<<endl;
++		}
++		savefile2 << "111111111111111111111111111111111111111111111111111111111111111111111111111"<< endl;
++	}
++	/* beginning of the loop */
++
++	while(finished==0){
++		iterT++;
++		totaliter++;
++
++		/* stop or reduce T */
++		if(iterT>=maxiter || success>maxsuccess){
++			if(Ta<T_min || total>maxtotaliter || fabs(E_old)<=Tol){
++				finished=1;
++				total+=iterT;
++				break;
++			}
++			else{ /* reduce T */
++				Ta=coolshed(T0a,Tred,ca,D);
++				Tm=coolshed(T0m,Tred,cm,D);
++				total+=iterT;
++				iterT=0;
++				success=1;
++				Tred++;
++				consec=0;
++			}
++		}
++
++		/* update model and calculate energy */
++
++		newmodelgen(m_old,m_new,bathy,icethick,mx,my,Tm,ptval,mmax,mmax2,ctr,sd, landmask);  /* new model */
++		E_new=misfit(m_new,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my, my_rank, num_procs); /* new energy */
++		dE=E_new-E_old;                                        /* energy difference */
++
++		/* acceptance probability */
++
++		P=exp(-dE/Ta);
++
++		/* stop if energy is lower than specified minimum */
++		if (E_new<E_min){
++			m_old->MatrixEqual(m_new);
++			E_old=E_new;
++			break;
++		}
++
++		rn=rand()/double (RAND_MAX);
++
++		/* accept new model or not */
++		if(dE<=0){
++			m_old->MatrixEqual(m_new);
++			E_old=E_new;
++			E_final=E_old;
++			success++;
++			consec=0;
++			if(!my_rank){
++				savefile1 << P<<"   "<<  Ta<<"   "<< Tm<<"   "<< E_old<<"     "<< totaliter<<"         "<< Tred <<"  "<< endl;
++			}
++			if(Ta<1e-3){
++				if(!my_rank){
++					savefile2 << totaliter<< endl;
++					for(int i=0;i<mx*my;i++){
++						savefile2 << m_old->GetValue(i,0)<<"   "<< m_old->GetValue(i,1)<<"   "<< m_old->GetValue(i,2)<<endl;
++					}
++					savefile2 << "111111111111111111111111111111111111111111111111111111111111111111111111111"<< endl;
++				}
++			}
++		}
++		else{
++			if(P>rn){
++				m_old->MatrixEqual(m_new);
++				E_old=E_new;
++				success++;
++				consec=0;
++				if(!my_rank){
++					savefile1 << P<<"   "<<  Ta<<"   "<< Tm<<"   "<< E_old<<"     "<< totaliter<<"         "<< Tred <<"  "<< endl;
++					if(Ta<1e-3){
++						savefile2 << totaliter<< endl;
++						for(int i=0;i<mx*my;i++){
++							savefile2 << m_old->GetValue(i,0)<<"   "<< m_old->GetValue(i,1)<<"   "<< m_old->GetValue(i,2)<<endl;
++						}
++						savefile2 << "111111111111111111111111111111111111111111111111111111111111111111111111111"<< endl;
++					}
++				}
++			}
++			else{
++				consec++;
++			}
++		}
++	}
++
++	m_min->MatrixEqual(m_old);
++	if(!my_rank){
++		savefile1 << "nan"<<"   "<<  "nan"<<"   "<< "nan"<<"   "<< E_final<<"     "<< "nan"<<"         "<< "nan" <<"  "<< endl;
++		savefile2 << " Mesh final"<< endl;
++		for(int i=0;i<mx*my;i++){
++			savefile2 << m_min->GetValue(i,0)<<"   "<< m_min->GetValue(i,1)<<"   "<< m_min->GetValue(i,2)<<endl;
++		}
++	}
++	savefile1.close();
++	savefile2.close();
++
++	delete m_old;
++	delete m_min;
++	delete m_new;
++	delete Pobs;
++	delete Pp;
++	delete Rho;
++	delete rho1;
++	delete rho2;
++	delete xobs;
++	delete yobs;
++	delete mesh_ini;
++	delete bathy;
++	delete icethick;
++	delete evalid;
++	delete gobs;
++	delete landmask;
++
++	/*}}}*/
++
++   MPI_Finalize();
++
++	return 0;
++}/*}}}*/
++
++void GSLsquarefit(Matrix** pX,Matrix* A,Matrix* B){/*{{{*/
++
++	/*GSL Matrices and vectors: */
++	int    M,N;
++	double chisq;
++	/*Get system size*/
++	A->GetSize(&M,&N);
++
++	/*Initialize gsl matrices and vectors: */
++	gsl_matrix* a = gsl_matrix_alloc(M,N);
++	for(int i=0;i<M;i++){
++		for(int j=0;j<N;j++){
++			gsl_matrix_set (a,i,j,A->GetValue(i,j));
++		}
++	}
++	gsl_vector* b = gsl_vector_alloc(M);
++	for(int i=0;i<M;i++){
++		gsl_vector_set(b,i,B->GetValue(i,0));
++	}
++
++	gsl_vector* x = gsl_vector_alloc(N);
++	gsl_matrix* cov = gsl_matrix_alloc(N,N);
++
++	/*Least square fit: */
++	gsl_multifit_linear_workspace* work = gsl_multifit_linear_alloc(M,N);
++	gsl_multifit_linear (a, b, x, cov, &chisq, work);
++	gsl_multifit_linear_free (work);
++
++	/*Clean up and assign output pointer*/
++	Matrix* X = new Matrix(N,1);
++	for(int j=0;j<N;j++){
++		X->SetValue(j,0,gsl_vector_get(x,j));
++	}
++	*pX = X;
++
++	gsl_matrix_free(a);
++	gsl_vector_free(x);
++	gsl_vector_free(b);
++	gsl_matrix_free(cov);
++
++}/*}}}*/
++void makep(Matrix *Pobs,int nx,int ny, int dx, int dy){/*{{{*/
++	for(int i=0;i<ny;i++){
++		for(int j=0;j<nx;j++){
++			Pobs->SetValue(j+nx*i,0,j*dx);
++			Pobs->SetValue(j+nx*i,1,i*dy);
++		}
++	}
++}/*}}}*/
++void vec2grid(Matrix *V,Matrix *V1,Matrix *V2,int nx, int ny){/*{{{*/
++	for(int i=0;i<ny;i++){
++		for (int j=0;j<nx;j++){
++			V1->SetValue(i,j, V->GetValue(j+nx*i,0));
++			V2->SetValue(i,j, V->GetValue(j+nx*i,1));
++		}
++	}
++}/*}}}*/
++void msplit( Matrix *m, Matrix *m1,Matrix *m2,double dlevel){/*{{{*/
++	int sizem1,sizem2;
++	m->GetSize(&sizem1,&sizem2);
++	for(int i=0;i<sizem1;i++){
++		for(int j=0;j<sizem2+1;j++){
++			if(j<sizem2){
++				m1->SetValue(i,j,1e-10*(sizem2+1-j));
++				m2->SetValue(i,j,m->GetValue(i,j));
++				if(m->GetValue(i,j)<0){
++					m1->SetValue(i,j,m->GetValue(i,j));
++					m2->SetValue(i,j,i*1e-10);
++				}
++				m1->SetValue(i,j,m1->GetValue(i,j));
++				m2->SetValue(i,j,m2->GetValue(i,j));
++			}
++			else{
++				m1->SetValue(i,j,1e-10);
++			}
++		}
++	}
++	m1->AddNumber(dlevel);
++	m2->AddNumber(dlevel);
++}/*}}}*/
++void plouff(Matrix *g,Matrix *Pobs,Matrix *Pp,Matrix * mesh,Matrix *rho,int dx,int dy, int dn,int m,int n,int l,Matrix* evalid,int my_rank,int num_procs){/*{{{*/
++	double gg=6.673e-11;
++	int si,sj,id,s;
++	double R,Q,P;
++	Matrix *xp= new Matrix(1,2);
++	Matrix *yp= new Matrix(1,2);
++	Matrix *xpp= new Matrix(1,2);
++	Matrix *ypp= new Matrix(1,2);
++	Matrix *U= new Matrix(l,4);
++	Matrix *U1=new Matrix(1,4);
++	Matrix *U2=new Matrix(1,4);
++	Matrix *gl= new Matrix(1,l-1);
++	bool test=true;
++
++	double *glocal=new double[n]();
++
++	for(int c=my_rank;c<n;c+=num_procs){
++		glocal[c]=0;
++		if(evalid->GetValue(i,0)==1){
++			for(int a=0;a<m;a++){
++				test=true;
++				xp->SetValue(0,0,Pp->GetValue(a,0)-Pobs->GetValue(c,0));
++				xp->SetValue(0,1,Pp->GetValue(a,0)-Pobs->GetValue(c,0)+dx);
++				if(xp->GetValue(0,0)<0 && xp->GetValue(0,0)<xp->GetValue(0,1) && xp->GetValue(0,0)*xp->GetValue(0,1)>=0){
++					xpp->SetValue(0,0,xp->GetValue(0,1));
++					xpp->SetValue(0,1,xp->GetValue(0,0));
++					xp->MatrixAbs(xpp);
++				}
++				yp->SetValue(0,0,Pp->GetValue(a,1)-Pobs->GetValue(c,1));
++				yp->SetValue(0,1,Pp->GetValue(a,1)-Pobs->GetValue(c,1)+dy);
++				if(yp->GetValue(0,0)<0 && yp->GetValue(0,0)<yp->GetValue(0,1) && yp->GetValue(0,0)*yp->GetValue(0,1)>=0){
++					ypp->SetValue(0,0,yp->GetValue(0,1));
++					ypp->SetValue(0,1,yp->GetValue(0,0));
++					yp->MatrixAbs(ypp);
++				}
++				P=sqrt(xp->GetValue(0,0)*xp->GetValue(0,0)+yp->GetValue(0,0)*yp->GetValue(0,0));
++				if(P>dn){
++					test=false;
++					for(int i=0;i<l-1;i++){
++						gl->SetValue(0,i,0);
++					}
++				}
++				if(test==true){
++					si=1;
++					sj=1;
++					id=0;
++					for(int i=0;i<2;i++){
++						si*=-1;
++						for(int j=0;j<2;j++){
++							sj*=-1;
++							s=si*sj;
++							for(int k=0;k<l;k++){
++								R=sqrt(xp->GetValue(0,i)*xp->GetValue(0,i)+yp->GetValue(0,j)*yp->GetValue(0,j)+mesh->GetValue(a,k)*mesh->GetValue(a,k));
++								Q=atan(xp->GetValue(0,i)*yp->GetValue(0,j)/(mesh->GetValue(a,k)*R));
++								U->SetValue(k,id,s*(mesh->GetValue(a,k)*Q-xp->GetValue(0,i)*log(R+yp->GetValue(0,j))-yp->GetValue(0,j)*log(R+xp->GetValue(0,i))));
++							}
++							id++;
++						}
++					}
++					for(int b=0;b<l-1;b++){
++						U->ExtractLine(U1,b);
++						U->ExtractLine(U2,b+1);
++						gl->SetValue(0,b,rho->GetValue(0,b)*(U1->MatrixInternSum()*(-1)+U2->MatrixInternSum()));
++					}
++				}
++				glocal[c]=glocal[c]+gg*gl->MatrixInternSum();
++			}
++		}
++	}
++
++	MPI_Allreduce(glocal,g->GetPointer(),n,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
++
++	delete xp;
++	delete yp;
++	delete xpp;
++	delete ypp;
++	delete gl;
++	delete U;
++	delete U1;
++	delete U2;
++	delete []glocal;
++}/*}}}*/
++void vec2gridsimple(Matrix *V,Matrix *V1,int nx, int ny){/*{{{*/
++	for(int i=0;i<ny;i++){
++		for (int j=0;j<nx;j++){
++			V1->SetValue(i,j, V->GetValue(j+nx*i,0));
++		}
++	}
++}/*}}}*/
++void reshape(Matrix* V,Matrix* V1,int nx,int ny){/*{{{*/
++	for (int i=0;i<ny;i++){
++		for(int j=0;j<nx;j++){
++			V1->SetValue(j+nx*i,0,V->GetValue(i,j));
++		}
++	}
++}/*}}}*/
++double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,double dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my,int my_rank,int num_procs){/*{{{*/
++	Matrix* m1=new Matrix(mx*my,4);
++	Matrix* m2=new Matrix(mx*my,3);
++	Matrix* g1=new Matrix(nx*ny,1);
++	Matrix* g2=new Matrix(nx*ny,1);
++	Matrix* g=new Matrix(nx*ny,1);
++	Matrix* gcalgr=new Matrix(ny,nx);
++	Matrix* gcalvec=new Matrix(nx*ny,1);
++	Matrix* df=new Matrix(nx*ny,1);
++	Matrix* G=new Matrix(nx*ny,3);
++	double a=0;
++	double b=0;
++	double e=0;
++	msplit(m0,m1,m2,dlevel);
++	plouff(g1,Pobs,Pp,m1,rho1,dx,dy,dn,mx*my,nx*ny,4,evalid, my_rank, num_procs);
++	plouff(g2,Pobs,Pp,m2,rho2,dx,dy,dn,mx*my,nx*ny,3,evalid, my_rank, num_procs);
++	g->MatrixSum(g1,g2);
++	vec2gridsimple(g,gcalgr,nx,ny);
++	reshape(gcalgr,gcalvec,nx,ny);
++	for (int i=0;i<nx*ny;i++){
++		df->SetValue(i,0,evalid->GetValue(i,0)*(gobs->GetValue(i,0)-gcalvec->GetValue(i,0)));
++		G->SetValue(i,0,evalid->GetValue(i,0)*Pobs->GetValue(i,0));
++		G->SetValue(i,1,evalid->GetValue(i,0)*Pobs->GetValue(i,1));
++		G->SetValue(i,2,evalid->GetValue(i,0));
++	}
++	Matrix* M = NULL;
++	GSLsquarefit(&M,G,df);
++
++	for (int i=0;i<ny;i++){
++		for(int j=0;j<nx;j++){
++			gcalgr->SetValue(i,j,gcalgr->GetValue(i,j)+xobs->GetValue(i,j)*M->GetValue(0,0)+yobs->GetValue(i,j)*M->GetValue(1,0)+M->GetValue(2,0));
++		}
++	}
++	reshape(gcalgr,g,nx,ny);
++	for (int i=0;i<nx*ny;i++){
++		a=a+fabs(evalid->GetValue(i,0)*(gobs->GetValue(i,0)-g->GetValue(i,0)));
++		b=b+fabs(evalid->GetValue(i,0)*(gobs->GetValue(i,0)+g->GetValue(i,0)));
++	}
++	e=2*a/(a+b);
++
++	delete m1;
++	delete m2;
++	delete g1;
++	delete g2;
++	delete g;
++	delete gcalgr;
++	delete gcalvec;
++	delete df;
++	delete G;
++	delete M;
++
++	return e;
++}/*}}}*/
++void newmodelgen(Matrix* m0,Matrix* m1,Matrix* bathy,Matrix* icethick,int mx,int my,double T,double ptval,double mmax,double mmax2,double ctr,double sd, Matrix *landmask){/*{{{*/
++	Matrix* m1gr=new Matrix(my,mx);
++	Matrix* m1grsm=new Matrix(my,mx);
++	Matrix* m1col=new Matrix(mx*my,1);
++	Matrix* m1gr2=new Matrix(my,mx);
++	Matrix* m1grsm2=new Matrix(my,mx);
++	Matrix* m1col2=new Matrix(mx*my,1);
++	Matrix* nptflag= new Matrix(mx*my,1);
++	double u=0;
++	double y=0;
++	m1->MatrixEqual(m0);
++	nptflag->MatrixSum(icethick,bathy);
++	/* first layer: ice */
++	for (int i=0;i<mx*my;i++){
++		if(landmask->GetValue(i,0)==2){
++			if(nptflag->GetValue(i,0)==0){
++				u=double(rand())/double(RAND_MAX);
++				y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
++				m1->SetValue(i,1,m0->GetValue(i,1)+y*ptval);
++				m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++				if(m1->GetValue(i,1)<=m1->GetValue(i,0)){
++					m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
++					m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++				}
++				if(m1->GetValue(i,1)>=m1->GetValue(i,0)+mmax){
++					m1->SetValue(i,1,m1->GetValue(i,0)+mmax);
++					m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++				}
++			}
++		}
++		else if(landmask->GetValue(i,0)==0){
++			if(nptflag->GetValue(i,0)==0){
++				u=double(rand())/double(RAND_MAX);
++				y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
++				m1->SetValue(i,2,m0->GetValue(i,2)+y*ptval);
++				if(m1->GetValue(i,2)<=m1->GetValue(i,0)){
++					m1->SetValue(i,2,m1->GetValue(i,0)+1e-10);
++				}
++				if(m1->GetValue(i,2)>=m1->GetValue(i,0)+mmax2){
++					m1->SetValue(i,2,m1->GetValue(i,0)+mmax2);
++				}
++			}
++		}
++		else if(landmask->GetValue(i,0)==3){
++			if(nptflag->GetValue(i,0)==0){
++				u=double(rand())/double(RAND_MAX);
++				y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
++				m1->SetValue(i,1,m0->GetValue(i,1)+y*ptval);
++				if(m1->GetValue(i,1)<=m1->GetValue(i,0)){
++					m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
++				}
++				if(m1->GetValue(i,1)>=m1->GetValue(i,0)+mmax){
++					m1->SetValue(i,1,m1->GetValue(i,0)+mmax);
++				}
++				u=double(rand())/double(RAND_MAX);
++				y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
++				m1->SetValue(i,2,m0->GetValue(i,2)+y*ptval);
++				if(m1->GetValue(i,2)<=m1->GetValue(i,1)){
++					m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++				}
++				if(m1->GetValue(i,2)>=m1->GetValue(i,1)+mmax2){
++					m1->SetValue(i,2,m1->GetValue(i,1)+mmax2);
++				}
++			}
++		}
++	}
++
++	m1->ExtractColumn(m1col,1);
++	vec2gridsimple(m1col,m1gr,mx,my);
++	filtergrav(m1grsm,m1gr,ctr,sd,mx,my);
++	reshape(m1grsm,m1col,mx,my);
++	m1->ExtractColumn(m1col2,2);
++	vec2gridsimple(m1col2,m1gr2,mx,my);
++	filtergrav(m1grsm2,m1gr2,ctr,sd,mx,my);
++	reshape(m1grsm2,m1col2,mx,my);
++
++	for (int i=0;i<mx*my;i++){
++		if(landmask->GetValue(i,0)==2){
++			if(nptflag->GetValue(i,0)==0){
++				m1->SetValue(i,1,m1col->GetValue(i,0));
++				m1->SetValue(i,2,m1col2->GetValue(i,0));
++				if(m1->GetValue(i,1)<=m1->GetValue(i,0)){
++					m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
++					m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++				}
++				if(fabs(m1->GetValue(i,2)-m1->GetValue(i,1))>1){
++					m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++				}
++			}
++			else{
++				m1->SetValue(i,1,m0->GetValue(i,1));
++				m1->SetValue(i,2,m0->GetValue(i,2));
++			}
++		}
++		else if(landmask->GetValue(i,0)==0){
++			if(nptflag->GetValue(i,0)==0){
++				m1->SetValue(i,2,m1col2->GetValue(i,0));
++				if(m1->GetValue(i,2)<=m1->GetValue(i,0)){
++					m1->SetValue(i,2,m1->GetValue(i,0)+1e-10);
++				}
++				if(fabs(m1->GetValue(i,0)-m1->GetValue(i,1))>1){
++					m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
++				}
++			}
++			else{
++				m1->SetValue(i,1,m0->GetValue(i,1));
++				m1->SetValue(i,2,m0->GetValue(i,2));
++			}
++		}
++		else if(landmask->GetValue(i,0)==3){
++			if(nptflag->GetValue(i,0)==0){
++				m1->SetValue(i,1,m1col->GetValue(i,0));
++				m1->SetValue(i,2,m1col2->GetValue(i,0));
++				if(m1->GetValue(i,1)<=m1->GetValue(i,0)){
++					m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
++				}
++				if(m1->GetValue(i,2)<=m1->GetValue(i,1)){
++					m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++				}
++			}
++			else{
++				m1->SetValue(i,1,m0->GetValue(i,1));
++				m1->SetValue(i,2,m0->GetValue(i,2));
++			}
++		}
++		else {
++			if(nptflag->GetValue(i,0)==0){
++				if(fabs(m1->GetValue(i,0)-m1->GetValue(i,1))>1){
++					m1->SetValue(i,1,m1->GetValue(i,0));
++				}
++				if(fabs(m1->GetValue(i,0)-m1->GetValue(i,2))>1){
++					m1->SetValue(i,2,m1->GetValue(i,0));
++				}
++			}
++			else{
++				m1->SetValue(i,1,m0->GetValue(i,1));
++				m1->SetValue(i,2,m0->GetValue(i,2));
++			}
++		}
++	}
++
++				/* second layer: water */
++//	for (int i=0;i<mx*my;i++){
++//		if(bathy->GetValue(i,0)==0){
++//			u=double (rand())/ double(RAND_MAX);
++//			y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
++//			m1->SetValue(i,2,m0->GetValue(i,2)+y*ptval);
++//			if(m1->GetValue(i,2)<=m1->GetValue(i,1)){
++//				m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++//			}
++//			if(m1->GetValue(i,2)>=m1->GetValue(i,1)+mmax2){
++//				m1->SetValue(i,2,m1->GetValue(i,1)+mmax2);
++//			}
++//		}
++//	}
++//	m1->ExtractColumn(m1col,2);
++//	vec2gridsimple(m1col,m1gr,mx,my);
++//	filtergrav(m1grsm,m1gr,ctr,sd,mx,my);
++//	reshape(m1grsm,m1col,mx,my);
++//	for (int i=0;i<mx*my;i++){
++//		if(bathy->GetValue(i,0)==0){
++//			m1->SetValue(i,2,m1col->GetValue(i,0));
++//		}
++//		else{
++//			m1->SetValue(i,2,m0->GetValue(i,2));
++//		}
++//		if(m1->GetValue(i,2)<=m1->GetValue(i,1)){
++//			m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++//		}
++//	}
++	delete m1gr;
++	delete m1grsm;
++	delete m1col;
++	delete m1gr2;
++	delete m1grsm2;
++	delete m1col2;
++	delete nptflag;
++}/*}}}*/
++double signe(double a){/*{{{*/
++	if(a<0){return -1;}
++	else{return 1;}
++}/*}}}*/
++void filtergrav(Matrix* A,Matrix* Ain,double ctr,double sd,int mx,int my){/*{{{*/
++	A->MatrixEqual(Ain);
++	for (int i=1;i<my-1;i++){
++		for(int j=1;j<mx-1;j++){
++			A->SetValue(i,j,(ctr*Ain->GetValue(i,j)+sd*(Ain->GetValue(i-1,j)+Ain->GetValue(i+1,j)+Ain->GetValue(i,j-1)+Ain->GetValue(i,j+1)))/(ctr+4*sd));
++		}
++	}
++}/*}}}*/
++double coolshed(double T0,double k,double c,double D){/*{{{*/
++	double T1=T0*exp(-c*pow(k,1/D));
++	return T1;
++}/*}}}*/
+Index: ../trunk-jpl/src/m/contrib/gravity/code_inversion/vfsa_mpi_uneven.cpp
+===================================================================
+--- ../trunk-jpl/src/m/contrib/gravity/code_inversion/vfsa_mpi_uneven.cpp	(revision 0)
++++ ../trunk-jpl/src/m/contrib/gravity/code_inversion/vfsa_mpi_uneven.cpp	(revision 18751)
+@@ -0,0 +1,882 @@
++#include <iostream>
++#include <cmath>
++#include <fstream>
++#include <string>
++#include <cstdio>
++#include <cstdlib>
++#include <time.h>
++#include <cassert>
++#include <gsl/gsl_multifit.h>
++#include "mpi.h"
++using namespace std;
++
++class Matrix{/*{{{*/
++	private:
++		int     M;        /*Number of lines   */
++		int     N;        /*Number if Columns */
++		double *values;
++	public:
++		Matrix(int m_in,int n_in){/*{{{*/
++			this->M = m_in;
++			this->N = n_in;
++			this->values = new double[M*N]();
++		}/*}}}*/
++		~Matrix(){/*{{{*/
++			delete [] this->values;
++		}/*}}}*/
++		void Echo(void){/*{{{*/
++			for(int i=0;i<M;i++){
++				for(int j=0;j<N;j++){
++					cout << " " << this->values[i*N+j];
++				}
++				cout << endl;
++			}
++		}/*}}}*/
++		void SetValue(int i,int j,double value){/*{{{*/
++			this->values[i*N+j] = value;
++		}/*}}}*/
++		double GetValue(int i,int j){/*{{{*/
++			return this->values[i*N+j];
++		}/*}}}*/
++		void GetSize(int* pM,int* pN){/*{{{*/
++			*pM = this->M;
++			*pN = this->N;
++		}/*}}}*/
++		double* GetPointer(void){/*{{{*/
++			return this->values;
++		}/*}}}*/
++		void MatrixSum(Matrix* A,Matrix* B){/*{{{*/
++			/*Check that sizes are compatible*/
++			int M_B,N_B,M_A,N_A;
++			B->GetSize(&M_B,&N_B);
++			A->GetSize(&M_A,&N_A);
++			assert(this->M==M_B && this->N==N_B);
++			assert(this->M==M_A && this->N==N_A);
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,A->GetValue(i,j) + B->GetValue(i,j));
++				}
++			}
++		}/*}}}*/
++		void MatrixDiff(Matrix* A,Matrix* B){/*{{{*/
++			/*Check that sizes are compatible*/
++			int M_B,N_B,M_A,N_A;
++			B->GetSize(&M_B,&N_B);
++			A->GetSize(&M_A,&N_A);
++			assert(this->M==M_B && this->N==N_B);
++			assert(this->M==M_A && this->N==N_A);
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,A->GetValue(i,j) - B->GetValue(i,j));
++				}
++			}
++		}/*}}}*/
++		void MatrixAbs(Matrix* A){/*{{{*/
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,fabs(A->GetValue(i,j)));
++				}
++			}
++		}/*}}}*/
++		void MatrixEqual(Matrix* A){/*{{{*/
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,A->GetValue(i,j));
++				}
++			}
++		}/*}}}*/
++		double MatrixInternSum(){/*{{{*/
++			double sum=0;
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					sum+=this->GetValue(i,j);
++				}
++			}
++			return sum;
++		}/*}}}*/
++		void ExtractLine(Matrix* A,int i){/*{{{*/
++			/* Check that the size of A is compatible */
++			int M_A,N_A;
++			A->GetSize(&M_A,&N_A);
++			assert(M_A==1 && this->N==N_A);
++			for(int j=0;j<this->N;j++){
++				A->SetValue(0,j,this->GetValue(i,j));
++			}
++		}/*}}}*/
++		void ExtractColumn(Matrix* A,int j){/*{{{*/
++			/* Check that the size of A is compatible */
++			int M_A,N_A;
++			A->GetSize(&M_A,&N_A);
++			assert(N_A==1 && this->M==M_A);
++			for(int i=0;i<this->M;i++){
++				A->SetValue(i,0,this->GetValue(i,j));
++			}
++		}/*}}}*/
++		void AddNumber(double a){/*{{{*/
++			for(int i=0;i<this->M;i++){
++				for(int j=0;j<this->N;j++){
++					this->SetValue(i,j,this->GetValue(i,j) + a);
++				}
++			}
++		}/*}}}*/
++};/*}}}*/
++
++/*Local prototypes{{{*/
++void makep(Matrix *Pobs,int nx,int ny, int dx, int dy);
++void vec2grid(Matrix *V,Matrix *V1,Matrix *V2,int nx, int ny);
++void msplit( Matrix *m, Matrix *m1,Matrix *m2,Matrix *dlevel);
++void plouff(Matrix *g,Matrix *Pobs,Matrix *Pp,Matrix * mesh,Matrix *rho,int dx,int dy, int dn,int m,int n,int l,Matrix *evalid,int my_rank,int num_procs);
++void vec2gridsimple(Matrix *V,Matrix *V1,int nx, int ny);
++void reshape(Matrix* V,Matrix* V1,int nx,int ny);
++double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,Matrix *dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my,int my_rank,int num_procs);
++void GSLsquarefit(Matrix** pX,Matrix* A,Matrix* B);
++double signe(double a);
++void filtergrav(Matrix* A,Matrix* Ain,double ctr,double sd,int mx,int my);
++void newmodelgen(Matrix* m0,Matrix* m1,Matrix* bathy,Matrix* icethick,int mx,int my,double T,double ptval,double mmax,double mmax2,double ctr,double sd, Matrix *landmask);
++double coolshed(double T0,double k,double c,double D);
++/*}}}*/
++
++int main(int argc,char *argv[]){/*{{{*/
++	
++	int my_rank,num_procs;
++
++	MPI_Init(&argc, &argv);
++
++	MPI_Comm_size(MPI_COMM_WORLD,&num_procs);
++	MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
++
++	/* Seed the random number generator {{{*/
++		srand (time(NULL));            /*}}}*/
++	/* Define the variables {{{*/
++
++	int    dx     = 1000;   /* prism dimension in x-direction                           */
++	int    dy     = 1000;   /* prism dimension in y-direction                           */
++	int    mx     = 99;    /* number of prisms in x-direction                          */
++	int    my     = 99;    /* number of prisms in y-direction                          */
++	int    nx     = 99;    /* number of data points in x-direction                     */
++	int    ny     = 99;    /* number of data points in y-direction                     */
++	int    dn     = 15000; /* distance for neighbouting prisms for gravity calculation */
++	double ptval  = 100.;  /* max. amount to perturb model                             */
++	double ptval2 = 100.;
++
++	Matrix *Pobs=new Matrix(nx*ny,2); /* data positions */
++	makep(Pobs,nx,ny,dx,dy);
++	// Pobs->Echo();
++
++
++	Matrix *Pp=new Matrix(mx*my,2); /* prisms positions */
++	makep(Pp,mx,my,dx,dy);
++	// Pp->Echo();
++
++	double  rhoi = 917;           /* ice density     */
++	double  rhow = 1030;          /* water density   */
++	// double  rhos = 2013;		      /* sediment density */
++	double  rhoc = 2670;          /* bedrock density */
++
++	Matrix *Rho  = new Matrix(1,2);
++	Rho->SetValue(0,0,rhoi);
++	Rho->SetValue(0,1,rhow);
++	Matrix *rho1  = new Matrix(1,3);
++	rho1->SetValue(0,0,rhoi);
++	rho1->SetValue(0,1,rhow);
++	rho1->SetValue(0,2,rhoc);
++	Matrix *rho2  = new Matrix(1,2);
++	rho2->SetValue(0,0,rhoi-rhoc);
++	rho2->SetValue(0,1,rhow-rhoc);
++
++	double ctr=1;            /* parameter for filtering */
++	double sd=0.1;
++
++	Matrix *xobs= new Matrix(ny,nx);
++	Matrix *yobs= new Matrix(ny,nx);
++
++	vec2grid(Pobs,xobs,yobs,nx,ny);
++	//	xobs->Echo();
++	//	yobs->Echo();
++
++
++	double mmax  = 1000;               /* max value for layer interfaces */
++	double mmax2 = 1000;
++	double mmax3 = 1000;
++
++	/* control parameter for temperature schedule  */
++
++	double ca=0.9;                    /* for acceptance */
++	double cm=0.5;                    /* for model perturbation */
++
++	double T0a          = 0.1;      /* initial temperature for acceptance           */
++	double T0m          = 0.9;      /* initial temperature for model perturbation   */
++	double D            = 2;        /* dimension of the model                       */
++	int    maxconsecrej = 1000;     /* max consecutive rejection                    */
++	int    maxsuccess   = 100;      /* max number of success within one temperature */
++	double T_min        = 1e-10;    /* stopping temp                                */
++	double Tred         = 1;
++	double E_min        = -1000000;
++	double E_exp        = 0.0291;   /* expected misfit                              */
++	int    maxiter      = 10000;
++	int    maxtotaliter = 1000000;
++	double Tol          = 1e-10;    /* tolerance on misfit                          */
++	int    sfreq        = 100;
++
++	/*}}}*/     
++	/* load the data {{{*/
++
++	/*landmask */
++
++	ifstream file("landmaskzach.txt");
++	Matrix * landmask= new Matrix(nx*ny,1);
++	double inputnumber;
++	for(int i=0;i<ny*nx; i++){ 
++		file >> inputnumber;
++		landmask->SetValue(i,0,inputnumber);
++	}
++	file.close();
++
++	/* Levels of data acquisition */
++
++	ifstream file0("altizach.txt");
++	Matrix * dlevel= new Matrix(nx*ny,1);
++	for(int i=0;i<ny*nx; i++){
++		file0 >> inputnumber;
++		dlevel->SetValue(i,0,inputnumber);
++	}
++	file0.close();
++
++	/* Observed gravity anomaly */
++
++	ifstream file1("gravityzach.txt");
++	Matrix * gobs= new Matrix(nx*ny,1);
++	for(int i=0;i<ny*nx; i++){ 
++		file1 >> inputnumber;
++		gobs->SetValue(i,0, inputnumber*1e-5);
++	}
++	file1.close();
++	//	gobs->Echo();
++
++	/* load data about the ice thickness */
++
++	ifstream file2("icethickzach.txt");
++	Matrix * icethick= new Matrix(mx*my,1);
++	for(int s=0;s<mx*my; s++){ 
++		file2 >> inputnumber;
++		icethick->SetValue(s,0,inputnumber);
++	}
++	file2.close();
++	//	icethick->Echo();
++
++	/* load the batimethry data */
++
++	ifstream file3("bathymetryzach.txt");
++	Matrix * bathy= new Matrix(mx*my,1);
++	for(int s=0;s<mx*my; s++){ 
++		file3 >> inputnumber;
++		bathy->SetValue(s,0,inputnumber);
++	}
++	file3.close();
++	//	bathy->Echo();
++
++	/* id of grid to evaluate misfit */
++
++
++	ifstream file4("evalidzach.txt");
++	Matrix * evalid= new Matrix(nx*ny,1);
++	for(int s=0;s<nx*ny; s++){ 
++		file4 >> inputnumber;
++		evalid->SetValue(s,0,inputnumber);
++	}
++	file4.close();
++	//	evalid->Echo();
++
++	/* initial guess of the model */
++
++	ifstream file5("m0_102714contzach.txt");
++	Matrix * mesh_ini= new Matrix(mx*my,3);
++	for(int s=0;s<mx*my; s++){ 
++		for(int j=0;j<3;j++){
++			file5 >> inputnumber;
++			mesh_ini->SetValue(s,j,inputnumber);
++		}
++	}
++	file5.close();
++	//	mesh_ini->Echo();
++	/*}}}*/
++	/* VFSA {{{ */
++
++	/* name of the files to save results */
++	std::ofstream savefile1 ("r_zach.txt");
++	std::ofstream savefile2("m_zach.txt");
++
++	/* counters initialization */
++	int    success   = 0;
++	int    finished  = 0;
++	int    consec    = 0;
++	double Ta        = T0a;
++	double Tm        = T0m;
++	int    iterT     = 0;   /* iteration within a T      */
++	int    total     = 0;   /* total number of iteration */
++	int    totaliter = 0;
++	int    msave     = 0;
++	double E_new;
++	double E_final;
++	double dE;
++	double P;
++	double rn;
++	Matrix* m_old    = new Matrix(mx *my,3);
++	Matrix* m_min    = new Matrix(mx *my,3);
++	Matrix* m_new    = new Matrix(mx *my,3);
++	m_old->MatrixEqual(mesh_ini);
++
++	/* calculate initial misfit */
++	double E_old=misfit(m_old,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my, my_rank, num_procs);
++	/* record initial settings */
++	if(!my_rank){
++		savefile1 << "P     "<< "Ta    "<< "Tm    "<< "Eold  "<< "totaliter "<< "Tred   "<< endl;
++		savefile1 << "nan   "<<  Ta<<"   "<< Tm<<"   "<< E_old<<"     "<< totaliter<<"         "<< Tred <<"  "<< endl;
++		savefile2 << totaliter<< endl;
++		for(int i=0;i<mx*my;i++){
++			savefile2 << m_old->GetValue(i,0)<<"   "<< m_old->GetValue(i,1)<<"   "<< m_old->GetValue(i,2)<<endl;
++		}
++		savefile2 << "111111111111111111111111111111111111111111111111111111111111111111111111111"<< endl;
++	}
++	/* beginning of the loop */
++
++	while(finished==0){
++		iterT++;
++		totaliter++;
++
++		/* stop or reduce T */
++		if(iterT>=maxiter || success>maxsuccess){
++			if(Ta<T_min || total>maxtotaliter || fabs(E_old)<=Tol){
++				finished=1;
++				total+=iterT;
++				break;
++			}
++			else{ /* reduce T */
++				Ta=coolshed(T0a,Tred,ca,D);
++				Tm=coolshed(T0m,Tred,cm,D);
++				total+=iterT;
++				iterT=0;
++				success=1;
++				Tred++;
++				consec=0;
++			}
++		}
++
++		/* update model and calculate energy */
++
++		newmodelgen(m_old,m_new,bathy,icethick,mx,my,Tm,ptval,mmax,mmax2,ctr,sd, landmask);  /* new model */
++		E_new=misfit(m_new,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my, my_rank, num_procs); /* new energy */
++		dE=E_new-E_old;                                        /* energy difference */
++
++		/* acceptance probability */
++
++		P=exp(-dE/Ta);
++
++		/* stop if energy is lower than specified minimum */
++		if (E_new<E_min){
++			m_old->MatrixEqual(m_new);
++			E_old=E_new;
++			break;
++		}
++
++		rn=rand()/double (RAND_MAX);
++
++		/* accept new model or not */
++		if(dE<=0){
++			m_old->MatrixEqual(m_new);
++			E_old=E_new;
++			E_final=E_old;
++			success++;
++			consec=0;
++			if(!my_rank){
++				savefile1 << P<<"   "<<  Ta<<"   "<< Tm<<"   "<< E_old<<"     "<< totaliter<<"         "<< Tred <<"  "<< endl;
++			}
++			if(Ta<1e-3){
++				if(!my_rank){
++					savefile2 << totaliter<< endl;
++					for(int i=0;i<mx*my;i++){
++						savefile2 << m_old->GetValue(i,0)<<"   "<< m_old->GetValue(i,1)<<"   "<< m_old->GetValue(i,2)<<endl;
++					}
++					savefile2 << "111111111111111111111111111111111111111111111111111111111111111111111111111"<< endl;
++				}
++			}
++		}
++		else{
++			if(P>rn){
++				m_old->MatrixEqual(m_new);
++				E_old=E_new;
++				success++;
++				consec=0;
++				if(!my_rank){
++					savefile1 << P<<"   "<<  Ta<<"   "<< Tm<<"   "<< E_old<<"     "<< totaliter<<"         "<< Tred <<"  "<< endl;
++					if(Ta<1e-3){
++						savefile2 << totaliter<< endl;
++						for(int i=0;i<mx*my;i++){
++							savefile2 << m_old->GetValue(i,0)<<"   "<< m_old->GetValue(i,1)<<"   "<< m_old->GetValue(i,2)<<endl;
++						}
++						savefile2 << "111111111111111111111111111111111111111111111111111111111111111111111111111"<< endl;
++					}
++				}
++			}
++			else{
++				consec++;
++			}
++		}
++	}
++
++	m_min->MatrixEqual(m_old);
++	if(!my_rank){
++		savefile1 << "nan"<<"   "<<  "nan"<<"   "<< "nan"<<"   "<< E_final<<"     "<< "nan"<<"         "<< "nan" <<"  "<< endl;
++		savefile2 << " Mesh final"<< endl;
++		for(int i=0;i<mx*my;i++){
++			savefile2 << m_min->GetValue(i,0)<<"   "<< m_min->GetValue(i,1)<<"   "<< m_min->GetValue(i,2)<<endl;
++		}
++	}
++	savefile1.close();
++	savefile2.close();
++
++	delete m_old;
++	delete m_min;
++	delete m_new;
++	delete Pobs;
++	delete Pp;
++	delete Rho;
++	delete rho1;
++	delete rho2;
++	delete xobs;
++	delete yobs;
++	delete mesh_ini;
++	delete bathy;
++	delete icethick;
++	delete evalid;
++	delete gobs;
++	delete landmask;
++
++	/*}}}*/
++
++   MPI_Finalize();
++
++	return 0;
++}/*}}}*/
++
++void GSLsquarefit(Matrix** pX,Matrix* A,Matrix* B){/*{{{*/
++
++	/*GSL Matrices and vectors: */
++	int    M,N;
++	double chisq;
++	/*Get system size*/
++	A->GetSize(&M,&N);
++
++	/*Initialize gsl matrices and vectors: */
++	gsl_matrix* a = gsl_matrix_alloc(M,N);
++	for(int i=0;i<M;i++){
++		for(int j=0;j<N;j++){
++			gsl_matrix_set (a,i,j,A->GetValue(i,j));
++		}
++	}
++	gsl_vector* b = gsl_vector_alloc(M);
++	for(int i=0;i<M;i++){
++		gsl_vector_set(b,i,B->GetValue(i,0));
++	}
++
++	gsl_vector* x = gsl_vector_alloc(N);
++	gsl_matrix* cov = gsl_matrix_alloc(N,N);
++
++	/*Least square fit: */
++	gsl_multifit_linear_workspace* work = gsl_multifit_linear_alloc(M,N);
++	gsl_multifit_linear (a, b, x, cov, &chisq, work);
++	gsl_multifit_linear_free (work);
++
++	/*Clean up and assign output pointer*/
++	Matrix* X = new Matrix(N,1);
++	for(int j=0;j<N;j++){
++		X->SetValue(j,0,gsl_vector_get(x,j));
++	}
++	*pX = X;
++
++	gsl_matrix_free(a);
++	gsl_vector_free(x);
++	gsl_vector_free(b);
++	gsl_matrix_free(cov);
++
++}/*}}}*/
++void makep(Matrix *Pobs,int nx,int ny, int dx, int dy){/*{{{*/
++	for(int i=0;i<ny;i++){
++		for(int j=0;j<nx;j++){
++			Pobs->SetValue(j+nx*i,0,j*dx);
++			Pobs->SetValue(j+nx*i,1,i*dy);
++		}
++	}
++}/*}}}*/
++void vec2grid(Matrix *V,Matrix *V1,Matrix *V2,int nx, int ny){/*{{{*/
++	for(int i=0;i<ny;i++){
++		for (int j=0;j<nx;j++){
++			V1->SetValue(i,j, V->GetValue(j+nx*i,0));
++			V2->SetValue(i,j, V->GetValue(j+nx*i,1));
++		}
++	}
++}/*}}}*/
++void msplit( Matrix *m, Matrix *m1,Matrix *m2,Matrix* dlevel){/*{{{*/
++	int sizem1,sizem2;
++	m->GetSize(&sizem1,&sizem2);
++	for(int i=0;i<sizem1;i++){
++		for(int j=0;j<sizem2+1;j++){
++			if(j<sizem2){
++				m1->SetValue(i,j,1e-10*(sizem2+1-j));
++				m2->SetValue(i,j,m->GetValue(i,j));
++				if(m->GetValue(i,j)<0){
++					m1->SetValue(i,j,m->GetValue(i,j));
++					m2->SetValue(i,j,i*1e-10);
++				}
++				m1->SetValue(i,j,m1->GetValue(i,j)+dlevel->GetValue(i,1));
++				m2->SetValue(i,j,m2->GetValue(i,j)+dlevel->GetValue(i,1));
++			}
++			else{
++				m1->SetValue(i,j,1e-10+dlevel->GetValue(i,1));
++			}
++		}
++	}
++}/*}}}*/
++void plouff(Matrix *g,Matrix *Pobs,Matrix *Pp,Matrix * mesh,Matrix *rho,int dx,int dy, int dn,int m,int n,int l,Matrix* evalid,int my_rank,int num_procs){/*{{{*/
++	double gg=6.673e-11;
++	int si,sj,id,s;
++	double R,Q,P;
++	Matrix *xp= new Matrix(1,2);
++	Matrix *yp= new Matrix(1,2);
++	Matrix *xpp= new Matrix(1,2);
++	Matrix *ypp= new Matrix(1,2);
++	Matrix *U= new Matrix(l,4);
++	Matrix *U1=new Matrix(1,4);
++	Matrix *U2=new Matrix(1,4);
++	Matrix *gl= new Matrix(1,l-1);
++	bool test=true;
++
++	double *glocal=new double[n]();
++
++	for(int c=my_rank;c<n;c+=num_procs){
++		glocal[c]=0;
++		if(evalid->GetValue(i,0)==1){
++			for(int a=0;a<m;a++){
++				test=true;
++				xp->SetValue(0,0,Pp->GetValue(a,0)-Pobs->GetValue(c,0));
++				xp->SetValue(0,1,Pp->GetValue(a,0)-Pobs->GetValue(c,0)+dx);
++				if(xp->GetValue(0,0)<0 && xp->GetValue(0,0)<xp->GetValue(0,1) && xp->GetValue(0,0)*xp->GetValue(0,1)>=0){
++					xpp->SetValue(0,0,xp->GetValue(0,1));
++					xpp->SetValue(0,1,xp->GetValue(0,0));
++					xp->MatrixAbs(xpp);
++				}
++				yp->SetValue(0,0,Pp->GetValue(a,1)-Pobs->GetValue(c,1));
++				yp->SetValue(0,1,Pp->GetValue(a,1)-Pobs->GetValue(c,1)+dy);
++				if(yp->GetValue(0,0)<0 && yp->GetValue(0,0)<yp->GetValue(0,1) && yp->GetValue(0,0)*yp->GetValue(0,1)>=0){
++					ypp->SetValue(0,0,yp->GetValue(0,1));
++					ypp->SetValue(0,1,yp->GetValue(0,0));
++					yp->MatrixAbs(ypp);
++				}
++				P=sqrt(xp->GetValue(0,0)*xp->GetValue(0,0)+yp->GetValue(0,0)*yp->GetValue(0,0));
++				if(P>dn){
++					test=false;
++					for(int i=0;i<l-1;i++){
++						gl->SetValue(0,i,0);
++					}
++				}
++				if(test==true){
++					si=1;
++					sj=1;
++					id=0;
++					for(int i=0;i<2;i++){
++						si*=-1;
++						for(int j=0;j<2;j++){
++							sj*=-1;
++							s=si*sj;
++							for(int k=0;k<l;k++){
++								R=sqrt(xp->GetValue(0,i)*xp->GetValue(0,i)+yp->GetValue(0,j)*yp->GetValue(0,j)+mesh->GetValue(a,k)*mesh->GetValue(a,k));
++								Q=atan(xp->GetValue(0,i)*yp->GetValue(0,j)/(mesh->GetValue(a,k)*R));
++								U->SetValue(k,id,s*(mesh->GetValue(a,k)*Q-xp->GetValue(0,i)*log(R+yp->GetValue(0,j))-yp->GetValue(0,j)*log(R+xp->GetValue(0,i))));
++							}
++							id++;
++						}
++					}
++					for(int b=0;b<l-1;b++){
++						U->ExtractLine(U1,b);
++						U->ExtractLine(U2,b+1);
++						gl->SetValue(0,b,rho->GetValue(0,b)*(U1->MatrixInternSum()*(-1)+U2->MatrixInternSum()));
++					}
++				}
++				glocal[c]=glocal[c]+gg*gl->MatrixInternSum();
++			}
++		}
++	}
++
++	MPI_Allreduce(glocal,g->GetPointer(),n,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
++
++	delete xp;
++	delete yp;
++	delete xpp;
++	delete ypp;
++	delete gl;
++	delete U;
++	delete U1;
++	delete U2;
++	delete []glocal;
++}/*}}}*/
++void vec2gridsimple(Matrix *V,Matrix *V1,int nx, int ny){/*{{{*/
++	for(int i=0;i<ny;i++){
++		for (int j=0;j<nx;j++){
++			V1->SetValue(i,j, V->GetValue(j+nx*i,0));
++		}
++	}
++}/*}}}*/
++void reshape(Matrix* V,Matrix* V1,int nx,int ny){/*{{{*/
++	for (int i=0;i<ny;i++){
++		for(int j=0;j<nx;j++){
++			V1->SetValue(j+nx*i,0,V->GetValue(i,j));
++		}
++	}
++}/*}}}*/
++double misfit(Matrix* m0,Matrix* evalid,Matrix* gobs,Matrix *dlevel,Matrix* Pobs,Matrix* xobs,Matrix* yobs,Matrix* Pp,Matrix* rho1, Matrix* rho2,int dx,int dy,int dn,int nx,int ny, int mx,int my,int my_rank,int num_procs){/*{{{*/
++	Matrix* m1=new Matrix(mx*my,4);
++	Matrix* m2=new Matrix(mx*my,3);
++	Matrix* g1=new Matrix(nx*ny,1);
++	Matrix* g2=new Matrix(nx*ny,1);
++	Matrix* g=new Matrix(nx*ny,1);
++	Matrix* gcalgr=new Matrix(ny,nx);
++	Matrix* gcalvec=new Matrix(nx*ny,1);
++	Matrix* df=new Matrix(nx*ny,1);
++	Matrix* G=new Matrix(nx*ny,3);
++	double a=0;
++	double b=0;
++	double e=0;
++	msplit(m0,m1,m2,dlevel);
++	plouff(g1,Pobs,Pp,m1,rho1,dx,dy,dn,mx*my,nx*ny,4,evalid, my_rank, num_procs);
++	plouff(g2,Pobs,Pp,m2,rho2,dx,dy,dn,mx*my,nx*ny,3,evalid, my_rank, num_procs);
++	g->MatrixSum(g1,g2);
++	vec2gridsimple(g,gcalgr,nx,ny);
++	reshape(gcalgr,gcalvec,nx,ny);
++	for (int i=0;i<nx*ny;i++){
++		df->SetValue(i,0,evalid->GetValue(i,0)*(gobs->GetValue(i,0)-gcalvec->GetValue(i,0)));
++		G->SetValue(i,0,evalid->GetValue(i,0)*Pobs->GetValue(i,0));
++		G->SetValue(i,1,evalid->GetValue(i,0)*Pobs->GetValue(i,1));
++		G->SetValue(i,2,evalid->GetValue(i,0));
++	}
++	Matrix* M = NULL;
++	GSLsquarefit(&M,G,df);
++
++	for (int i=0;i<ny;i++){
++		for(int j=0;j<nx;j++){
++			gcalgr->SetValue(i,j,gcalgr->GetValue(i,j)+xobs->GetValue(i,j)*M->GetValue(0,0)+yobs->GetValue(i,j)*M->GetValue(1,0)+M->GetValue(2,0));
++		}
++	}
++	reshape(gcalgr,g,nx,ny);
++	for (int i=0;i<nx*ny;i++){
++		a=a+fabs(evalid->GetValue(i,0)*(gobs->GetValue(i,0)-g->GetValue(i,0)));
++		b=b+fabs(evalid->GetValue(i,0)*(gobs->GetValue(i,0)+g->GetValue(i,0)));
++	}
++	e=2*a/(a+b);
++
++	delete m1;
++	delete m2;
++	delete g1;
++	delete g2;
++	delete g;
++	delete gcalgr;
++	delete gcalvec;
++	delete df;
++	delete G;
++	delete M;
++
++	return e;
++}/*}}}*/
++void newmodelgen(Matrix* m0,Matrix* m1,Matrix* bathy,Matrix* icethick,int mx,int my,double T,double ptval,double mmax,double mmax2,double ctr,double sd, Matrix *landmask){/*{{{*/
++	Matrix* m1gr=new Matrix(my,mx);
++	Matrix* m1grsm=new Matrix(my,mx);
++	Matrix* m1col=new Matrix(mx*my,1);
++	Matrix* m1gr2=new Matrix(my,mx);
++	Matrix* m1grsm2=new Matrix(my,mx);
++	Matrix* m1col2=new Matrix(mx*my,1);
++	Matrix* nptflag= new Matrix(mx*my,1);
++	double u=0;
++	double y=0;
++	m1->MatrixEqual(m0);
++	nptflag->MatrixSum(icethick,bathy);
++	/* first layer: ice */
++	for (int i=0;i<mx*my;i++){
++		if(landmask->GetValue(i,0)==2){
++			if(nptflag->GetValue(i,0)==0){
++				u=double(rand())/double(RAND_MAX);
++				y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
++				m1->SetValue(i,1,m0->GetValue(i,1)+y*ptval);
++				m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++				if(m1->GetValue(i,1)<=m1->GetValue(i,0)){
++					m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
++					m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++				}
++				if(m1->GetValue(i,1)>=m1->GetValue(i,0)+mmax){
++					m1->SetValue(i,1,m1->GetValue(i,0)+mmax);
++					m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++				}
++			}
++		}
++		else if(landmask->GetValue(i,0)==0){
++			if(nptflag->GetValue(i,0)==0){
++				u=double(rand())/double(RAND_MAX);
++				y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
++				m1->SetValue(i,2,m0->GetValue(i,2)+y*ptval);
++				if(m1->GetValue(i,2)<=m1->GetValue(i,0)){
++					m1->SetValue(i,2,m1->GetValue(i,0)+1e-10);
++				}
++				if(m1->GetValue(i,2)>=m1->GetValue(i,0)+mmax2){
++					m1->SetValue(i,2,m1->GetValue(i,0)+mmax2);
++				}
++			}
++		}
++		else if(landmask->GetValue(i,0)==3){
++			if(nptflag->GetValue(i,0)==0){
++				u=double(rand())/double(RAND_MAX);
++				y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
++				m1->SetValue(i,1,m0->GetValue(i,1)+y*ptval);
++				if(m1->GetValue(i,1)<=m1->GetValue(i,0)){
++					m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
++				}
++				if(m1->GetValue(i,1)>=m1->GetValue(i,0)+mmax){
++					m1->SetValue(i,1,m1->GetValue(i,0)+mmax);
++				}
++				u=double(rand())/double(RAND_MAX);
++				y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
++				m1->SetValue(i,2,m0->GetValue(i,2)+y*ptval);
++				if(m1->GetValue(i,2)<=m1->GetValue(i,1)){
++					m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++				}
++				if(m1->GetValue(i,2)>=m1->GetValue(i,1)+mmax2){
++					m1->SetValue(i,2,m1->GetValue(i,1)+mmax2);
++				}
++			}
++		}
++	}
++
++	m1->ExtractColumn(m1col,1);
++	vec2gridsimple(m1col,m1gr,mx,my);
++	filtergrav(m1grsm,m1gr,ctr,sd,mx,my);
++	reshape(m1grsm,m1col,mx,my);
++	m1->ExtractColumn(m1col2,2);
++	vec2gridsimple(m1col2,m1gr2,mx,my);
++	filtergrav(m1grsm2,m1gr2,ctr,sd,mx,my);
++	reshape(m1grsm2,m1col2,mx,my);
++
++	for (int i=0;i<mx*my;i++){
++		if(landmask->GetValue(i,0)==2){
++			if(nptflag->GetValue(i,0)==0){
++				m1->SetValue(i,1,m1col->GetValue(i,0));
++				m1->SetValue(i,2,m1col2->GetValue(i,0));
++				if(m1->GetValue(i,1)<=m1->GetValue(i,0)){
++					m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
++					m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++				}
++				if(fabs(m1->GetValue(i,2)-m1->GetValue(i,1))>1){
++					m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++				}
++			}
++			else{
++				m1->SetValue(i,1,m0->GetValue(i,1));
++				m1->SetValue(i,2,m0->GetValue(i,2));
++			}
++		}
++		else if(landmask->GetValue(i,0)==0){
++			if(nptflag->GetValue(i,0)==0){
++				m1->SetValue(i,2,m1col2->GetValue(i,0));
++				if(m1->GetValue(i,2)<=m1->GetValue(i,0)){
++					m1->SetValue(i,2,m1->GetValue(i,0)+1e-10);
++				}
++				if(fabs(m1->GetValue(i,0)-m1->GetValue(i,1))>1){
++					m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
++				}
++			}
++			else{
++				m1->SetValue(i,1,m0->GetValue(i,1));
++				m1->SetValue(i,2,m0->GetValue(i,2));
++			}
++		}
++		else if(landmask->GetValue(i,0)==3){
++			if(nptflag->GetValue(i,0)==0){
++				m1->SetValue(i,1,m1col->GetValue(i,0));
++				m1->SetValue(i,2,m1col2->GetValue(i,0));
++				if(m1->GetValue(i,1)<=m1->GetValue(i,0)){
++					m1->SetValue(i,1,m1->GetValue(i,0)+1e-10);
++				}
++				if(m1->GetValue(i,2)<=m1->GetValue(i,1)){
++					m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++				}
++			}
++			else{
++				m1->SetValue(i,1,m0->GetValue(i,1));
++				m1->SetValue(i,2,m0->GetValue(i,2));
++			}
++		}
++		else {
++			if(nptflag->GetValue(i,0)==0){
++				if(fabs(m1->GetValue(i,0)-m1->GetValue(i,1))>1){
++					m1->SetValue(i,1,m1->GetValue(i,0));
++				}
++				if(fabs(m1->GetValue(i,0)-m1->GetValue(i,2))>1){
++					m1->SetValue(i,2,m1->GetValue(i,0));
++				}
++			}
++			else{
++				m1->SetValue(i,1,m0->GetValue(i,1));
++				m1->SetValue(i,2,m0->GetValue(i,2));
++			}
++		}
++	}
++
++				/* second layer: water */
++//	for (int i=0;i<mx*my;i++){
++//		if(bathy->GetValue(i,0)==0){
++//			u=double (rand())/ double(RAND_MAX);
++//			y=signe(u-0.5)*T*(pow(1+1/T,fabs(2*u-1))-1);
++//			m1->SetValue(i,2,m0->GetValue(i,2)+y*ptval);
++//			if(m1->GetValue(i,2)<=m1->GetValue(i,1)){
++//				m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++//			}
++//			if(m1->GetValue(i,2)>=m1->GetValue(i,1)+mmax2){
++//				m1->SetValue(i,2,m1->GetValue(i,1)+mmax2);
++//			}
++//		}
++//	}
++//	m1->ExtractColumn(m1col,2);
++//	vec2gridsimple(m1col,m1gr,mx,my);
++//	filtergrav(m1grsm,m1gr,ctr,sd,mx,my);
++//	reshape(m1grsm,m1col,mx,my);
++//	for (int i=0;i<mx*my;i++){
++//		if(bathy->GetValue(i,0)==0){
++//			m1->SetValue(i,2,m1col->GetValue(i,0));
++//		}
++//		else{
++//			m1->SetValue(i,2,m0->GetValue(i,2));
++//		}
++//		if(m1->GetValue(i,2)<=m1->GetValue(i,1)){
++//			m1->SetValue(i,2,m1->GetValue(i,1)+1e-10);
++//		}
++//	}
++	delete m1gr;
++	delete m1grsm;
++	delete m1col;
++	delete m1gr2;
++	delete m1grsm2;
++	delete m1col2;
++	delete nptflag;
++}/*}}}*/
++double signe(double a){/*{{{*/
++	if(a<0){return -1;}
++	else{return 1;}
++}/*}}}*/
++void filtergrav(Matrix* A,Matrix* Ain,double ctr,double sd,int mx,int my){/*{{{*/
++	A->MatrixEqual(Ain);
++	for (int i=1;i<my-1;i++){
++		for(int j=1;j<mx-1;j++){
++			A->SetValue(i,j,(ctr*Ain->GetValue(i,j)+sd*(Ain->GetValue(i-1,j)+Ain->GetValue(i+1,j)+Ain->GetValue(i,j-1)+Ain->GetValue(i,j+1)))/(ctr+4*sd));
++		}
++	}
++}/*}}}*/
++double coolshed(double T0,double k,double c,double D){/*{{{*/
++	double T1=T0*exp(-c*pow(k,1/D));
++	return T1;
++}/*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18751-18752.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18751-18752.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18751-18752.diff	(revision 19102)
@@ -0,0 +1,24 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18751)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18752)
+@@ -11,6 +11,7 @@
+ void HydrologyDCEfficientAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ 
+ 	int         hydrology_model;
++	int         eplflip_lock;
+ 	bool        isefficientlayer;
+ 
+ 	/*retrieve some parameters: */
+@@ -21,8 +22,11 @@
+ 
+ 	/*Do we want an efficient layer*/
+ 	iomodel->Constant(&isefficientlayer,HydrologydcIsefficientlayerEnum);
++	iomodel->FetchData(&eplflip_lock,HydrologydcEplflipLockEnum);
+ 	if(!isefficientlayer) return;
+ 
++	parameters->AddObject(new IntParam(HydrologydcEplflipLockEnum,eplflip_lock));
++	
+ 	/*Nothing for now*/
+ }/*}}}*/
+ void HydrologyDCEfficientAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18752-18753.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18752-18753.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18752-18753.diff	(revision 19102)
@@ -0,0 +1,17 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18752)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18753)
+@@ -22,9 +22,10 @@
+ 
+ 	/*Do we want an efficient layer*/
+ 	iomodel->Constant(&isefficientlayer,HydrologydcIsefficientlayerEnum);
++
++	if(!isefficientlayer) return;
+ 	iomodel->FetchData(&eplflip_lock,HydrologydcEplflipLockEnum);
+-	if(!isefficientlayer) return;
+-
++ 
+ 	parameters->AddObject(new IntParam(HydrologydcEplflipLockEnum,eplflip_lock));
+ 	
+ 	/*Nothing for now*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18753-18754.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18753-18754.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18753-18754.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/classes/thermal.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/thermal.m	(revision 18753)
++++ ../trunk-jpl/src/m/classes/thermal.m	(revision 18754)
+@@ -94,7 +94,7 @@
+ 			if (ismember(EnthalpyAnalysisEnum(),analyses) & md.thermal.isenthalpy & dimension(md.mesh)==3),
+ 				pos=find(md.thermal.spctemperature(1:md.mesh.numberofvertices,:)~=NaN);
+ 				replicate=repmat(md.geometry.surface-md.mesh.z,1,size(md.thermal.spctemperature,2));
+-				md = checkfield(md,'fieldname','thermal.spctemperature(find(md.thermal.spctemperature(1:md.mesh.numberofvertices,:)~=NaN))','<=',md.materials.meltingpoint-md.materials.beta*md.materials.rho_ice*md.constants.g*replicate(pos),'message','spctemperature should be less or equal than the adjusted melting point');
++				md = checkfield(md,'fieldname','thermal.spctemperature(find(md.thermal.spctemperature(1:md.mesh.numberofvertices,:)~=NaN))','<=',md.materials.meltingpoint-md.materials.beta*md.materials.rho_ice*md.constants.g*replicate(pos)+10^-5,'message','spctemperature should be less or equal than the adjusted melting point');
+ 				md = checkfield(md,'fieldname','thermal.isenthalpy','numel',[1],'values',[0 1]);
+ 				md = checkfield(md,'fieldname','thermal.isdynamicbasalspc','numel', [1],'values',[0 1]);
+ 				if(md.thermal.isenthalpy)
Index: /issm/oecreview/Archive/18296-19100/ISSM-18754-18755.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18754-18755.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18754-18755.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/classes/clusters/pfe.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/pfe.m	(revision 18754)
++++ ../trunk-jpl/src/m/classes/clusters/pfe.m	(revision 18755)
+@@ -15,7 +15,7 @@
+ 		 port           = 1025;
+ 		 queue          = 'long';
+ 		 time           = 12*60;
+-		 processor      = 'neh';
++		 processor      = 'wes';
+ 		 codepath       = '';
+ 		 executionpath  = '';
+ 		 grouplist     = 's1010';
Index: /issm/oecreview/Archive/18296-19100/ISSM-18755-18756.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18755-18756.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18755-18756.diff	(revision 19102)
@@ -0,0 +1,55 @@
+Index: ../trunk-jpl/src/m/classes/masstransport.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/masstransport.py	(revision 18755)
++++ ../trunk-jpl/src/m/classes/masstransport.py	(revision 18756)
+@@ -14,9 +14,6 @@
+ 
+ 	def __init__(self): # {{{
+ 		self.spcthickness           = float('NaN')
+-		self.iscalvingrate          = 0
+-		self.calvingrate            = float('NaN')
+-		self.levermann_calving_coeff= 0.
+ 		self.isfreesurface          = 0
+ 		self.min_thickness          = 0.
+ 		self.hydrostatic_adjustment = 0
+@@ -32,9 +29,6 @@
+ 	def __repr__(self): # {{{
+ 		string='   Masstransport solution parameters:'
+ 		string="%s\n%s"%(string,fielddisplay(self,'spcthickness','thickness constraints (NaN means no constraint) [m]'))
+-		string="%s\n%s"%(string,fielddisplay(self,'iscalvingrate','do we use calving (loss of ice)'))
+-		string="%s\n%s"%(string,fielddisplay(self,'calvingrate','calving rate at given location [m/a]'))
+-		string="%s\n%s"%(string,fielddisplay(self,'levermann_calving_coeff','Proportionality coefficient in Levermann model'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'isfreesurface','do we use free surfaces (FS only) are mass conservation'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'min_thickness','minimum ice thickness allowed [m]'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'hydrostatic_adjustment','adjustment of ice shelves surface and bed elevations: ''Incremental'' or ''Absolute'' '))
+@@ -50,9 +44,6 @@
+ 	#}}}
+ 	def setdefaultparameters(self): # {{{
+ 
+-		#Proportionality coefficient in Levermann model                                 |
+-		self.levermann_calving_coeff=2.e13
+-		
+ 		#Type of stabilization to use 0:nothing 1:artificial_diffusivity 3:Discontinuous Galerkin
+ 		self.stabilization=1
+ 
+@@ -76,10 +67,6 @@
+ 			return md
+ 
+ 		md = checkfield(md,'fieldname','masstransport.spcthickness','forcing',1)
+-		if LevelsetAnalysisEnum() in analyses and md.transient.islevelset:
+-			md = checkfield(md,'fieldname','masstransport.calvingrate','NaN',1,'size',[md.mesh.numberofvertices],'>=',0)
+-			md = checkfield(md,'fieldname','masstransport.iscalvingrate','values',[0,1])
+-			md = checkfield(md,'fieldname','masstransport.levermann_calving_coeff','>',0)
+ 		md = checkfield(md,'fieldname','masstransport.isfreesurface','values',[0,1])
+ 		md = checkfield(md,'fieldname','masstransport.hydrostatic_adjustment','values',['Absolute','Incremental'])
+ 		md = checkfield(md,'fieldname','masstransport.stabilization','values',[0,1,2,3,4])
+@@ -93,9 +80,6 @@
+ 		yts=365.*24.*3600.
+ 
+ 		WriteData(fid,'object',self,'fieldname','spcthickness','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
+-		WriteData(fid,'object',self,'fieldname','calvingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts)
+-		WriteData(fid,'object',self,'fieldname','iscalvingrate','format','Boolean')
+-		WriteData(fid,'object',self,'fieldname','levermann_calving_coeff','format','Double')
+ 		WriteData(fid,'object',self,'fieldname','isfreesurface','format','Boolean')
+ 		WriteData(fid,'object',self,'fieldname','min_thickness','format','Double')
+ 		WriteData(fid,'data',StringToEnum(self.hydrostatic_adjustment)[0],'format','Integer','enum',MasstransportHydrostaticAdjustmentEnum())
Index: /issm/oecreview/Archive/18296-19100/ISSM-18756-18757.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18756-18757.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18756-18757.diff	(revision 19102)
@@ -0,0 +1,458 @@
+Index: ../trunk-jpl/src/m/classes/calving.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/calving.py	(revision 0)
++++ ../trunk-jpl/src/m/classes/calving.py	(revision 18757)
+@@ -0,0 +1,52 @@
++from fielddisplay import fielddisplay
++from EnumDefinitions import *
++from StringToEnum import StringToEnum
++from checkfield import checkfield
++from WriteData import WriteData
++
++class calving(object):
++	"""
++	CALVING class definition
++
++	   Usage:
++	      calving=calving();
++	"""
++
++	def __init__(self): # {{{
++		self.calvingrate            = float('NaN')
++
++		#set defaults
++		self.setdefaultparameters()
++
++		#}}}
++	def __repr__(self): # {{{
++		string='   Calving parameters:'
++		string="%s\n%s"%(string,fielddisplay(self,'calvingrate','calving rate at given location [m/a]'))
++
++		return string
++		#}}}
++	def defaultoutputs(self,md): # {{{
++
++		return []
++
++	#}}}
++	def setdefaultparameters(self): # {{{
++
++		return self
++	#}}}
++	def checkconsistency(self,md,solution,analyses):    # {{{
++
++		#Early return
++		if (solution!=TransientSolutionEnum()) or (not md.transient.iscalving):
++			return md
++
++		md = checkfield(md,'fieldname','calving.calvingrate','NaN',1,'size',[md.mesh.numberofvertices],'>=',0)
++		return md
++	# }}}
++	def marshall(self,md,fid):    # {{{
++
++		yts=365.*24.*3600.
++
++		WriteData(fid,'enum',CalvingLawEnum(),'data',DefaultCalvingEnum(),'format','Integer');
++		WriteData(fid,'object',self,'fieldname','calvingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts)
++	# }}}
+Index: ../trunk-jpl/src/m/classes/transient.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/transient.m	(revision 18756)
++++ ../trunk-jpl/src/m/classes/transient.m	(revision 18757)
+@@ -12,6 +12,7 @@
+ 		isgia             = 0;
+ 		isdamageevolution = 0;
+ 		islevelset        = 0;
++		iscalving         = 0;
+ 		ishydrology       = 0;
+ 		requested_outputs = {};
+ 	end
+@@ -28,6 +29,7 @@
+                 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isgia" type="',class(obj.isgia),'" default="',convert2str(obj.isgia),'">','     <section name="transient" />','     <help> indicates whether a postglacial rebound model is used in the transient </help>','  </parameter>');
+                 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isdamageevolution" type="',class(obj.isdamageevolution),'" default="',convert2str(obj.isdamageevolution),'">','     <section name="transient" />','     <help> indicates whether damage evolution is used in the transient </help>','  </parameter>');
+                 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="islevelset" type="',class(obj.islevelset),'" default="',convert2str(obj.islevelset),'">','     <section name="transient" />','     <help> LEVEL SET DESCRIPTION...  </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="iscalving" type="',class(obj.iscalving),'" default="',convert2str(obj.iscalving),'">','     <section name="transient" />','     <help> indicates whether calving is used in the transient </help>','  </parameter>');
+                 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="requested_outputs" type="',class(obj.requested_outputs),'" default="',convert2str(obj.requested_outputs),'">','     <section name="transient" />','     <help> list of additional outputs requested </help>','  </parameter>');
+             fprintf(fid,'%s\n%s\n','</frame>');    
+         
+@@ -50,6 +52,7 @@
+ 			obj.isgia           = 0;
+ 			obj.isdamageevolution = 0;
+ 			obj.islevelset      = 0;
++			obj.iscalving       =0;
+ 			obj.ishydrology     = 0;
+ 
+ 			%default output
+@@ -65,6 +68,7 @@
+ 			obj.isgia           = 0;
+ 			obj.isdamageevolution = 0;
+ 			obj.islevelset      = 0;
++			obj.iscalving       = 0;
+ 			obj.ishydrology     = 0;
+ 
+ 			%default output
+@@ -89,6 +93,7 @@
+ 			md = checkfield(md,'fieldname','transient.isgia','numel',[1],'values',[0 1]);
+ 			md = checkfield(md,'fieldname','transient.isdamageevolution','numel',[1],'values',[0 1]);
+ 			md = checkfield(md,'fieldname','transient.islevelset','numel',[1],'values',[0 1]);
++			md = checkfield(md,'fieldname','transient.iscalving','numel',[1],'values',[0 1]);
+ 			md = checkfield(md,'fieldname','transient.ishydrology','numel',[1],'values',[0 1]);
+ 			md = checkfield(md,'fieldname','transient.requested_outputs','stringrow',1);
+ 
+@@ -103,6 +108,7 @@
+ 			fielddisplay(obj,'isgia','indicates whether a postglacial rebound model is used in the transient');
+ 			fielddisplay(obj,'isdamageevolution','indicates whether damage evolution is used in the transient');
+ 			fielddisplay(obj,'islevelset','LEVEL SET DESCRIPTION...');
++			fielddisplay(obj,'iscalving','indicates whether calving is used in the transient');
+ 			fielddisplay(obj,'ishydrology','indicates whether an hydrology model is used');
+ 			fielddisplay(obj,'requested_outputs','list of additional outputs requested');
+ 
+@@ -116,6 +122,7 @@
+ 			WriteData(fid,'object',obj,'fieldname','isdamageevolution','format','Boolean');
+ 			WriteData(fid,'object',obj,'fieldname','ishydrology','format','Boolean');
+ 			WriteData(fid,'object',obj,'fieldname','islevelset','format','Boolean');
++			WriteData(fid,'object',obj,'fieldname','iscalving','format','Boolean');
+ 
+ 			%process requested outputs
+ 			outputs = obj.requested_outputs;
+Index: ../trunk-jpl/src/m/classes/calving.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calving.m	(revision 0)
++++ ../trunk-jpl/src/m/classes/calving.m	(revision 18757)
+@@ -0,0 +1,73 @@
++%CALVING class definition
++%
++%   Usage:
++%      calving=calving();
++
++classdef calving
++	properties (SetAccess=public) 
++		 calvingrate            = NaN;
++	end
++	methods (Static)
++		function obj = loadobj(obj) % {{{
++			% This function is directly called by matlab when a model object is
++			% loaded. If the input is a struct it is an old version of this class and
++			% old fields must be recovered (make sure they are in the deprecated
++			% model properties)
++
++			if verLessThan('matlab','7.9'),
++				disp('Warning: your matlab version is old and there is a risk that load does not work correctly');
++				disp('         if the model is not loaded correctly, rename temporarily loadobj so that matlab does not use it');
++
++				% This is a Matlab bug: all the fields of md have their default value
++				% Example of error message:
++				% Warning: Error loading an object of class 'model':
++				% Undefined function or method 'exist' for input arguments of type 'cell'
++				%
++				% This has been fixed in MATLAB 7.9 (R2009b) and later versions
++			end
++
++			if isstruct(obj)
++				disp('Recovering calving from older version');
++				objstruct = obj;
++				obj = structtoobj(calving(),objstruct);
++			end
++		end% }}}
++	end
++	methods
++		function obj = calving(varargin) % {{{
++			switch nargin
++				case 0
++					obj=setdefaultparameters(obj);
++				case 1
++					inputstruct=varargin{1};
++					list1 = properties('calving');
++					list2 = fieldnames(inputstruct);
++					for i=1:length(list1)
++						fieldname = list1{i};
++						if ismember(fieldname,list2),
++							obj.(fieldname) = inputstruct.(fieldname);
++						end
++					end
++				otherwise
++					error('constructor not supported');
++			end
++		end % }}}
++		function obj = setdefaultparameters(obj) % {{{
++
++		end % }}}
++		function md = checkconsistency(obj,md,solution,analyses) % {{{
++			%Early return
++			if (solution~=TransientSolutionEnum() | md.transient.iscalving==0), return; end
++			md = checkfield(md,'fieldname','calving.calvingrate','NaN',1,'size',[md.mesh.numberofvertices 1],'>=',0);
++		end % }}}
++		function disp(obj) % {{{
++			disp(sprintf('   Calving parameters:'));
++			fielddisplay(obj,'calvingrate','calving rate at given location [m/a]');
++		end % }}}
++		function marshall(obj,md,fid) % {{{
++			yts=365.0*24.0*3600.0;
++			WriteData(fid,'enum',CalvingLawEnum(),'data',DefaultCalvingEnum(),'format','Integer');
++			WriteData(fid,'object',obj,'fieldname','calvingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts);
++		end % }}}
++	end
++end
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 18756)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 18757)
+@@ -36,6 +36,7 @@
+ 		thermal          = 0;
+ 		steadystate      = 0;
+ 		transient        = 0;
++		calving          = 0;
+ 		gia              = 0;
+ 
+ 		seaice           = 0;
+@@ -795,12 +796,15 @@
+ 				end
+ 			end
+ 			md.masstransport.spcthickness=project3d(md,'vector',md.masstransport.spcthickness,'type','node');
+-			md.masstransport.calvingrate=project3d(md,'vector',md.masstransport.calvingrate,'type','node');
+ 			md.balancethickness.spcthickness=project3d(md,'vector',md.balancethickness.spcthickness,'type','node');
+ 			md.damage.spcdamage=project3d(md,'vector',md.damage.spcdamage,'type','node');
+ 			md.stressbalance.referential=project3d(md,'vector',md.stressbalance.referential,'type','node');
+ 			md.stressbalance.loadingforce=project3d(md,'vector',md.stressbalance.loadingforce,'type','node');
+ 
++			% Calving variables
++			if isa(md.calving,'calving'),md.calving.calvingrate=project3d(md,'vector',md.calving.calvingrate,'type','node');end;
++			if isa(md.calving,'calvinglevermann'),md.calving.coeff=project3d(md,'vector',md.calving.coeff,'type','node');end;
++
+ 			% Hydrologydc variables
+ 			if isa(md.hydrology,'hydrologydc');
+ 				md.hydrology.spcsediment_head=project3d(md,'vector',md.hydrology.spcsediment_head,'type','node','layer',1);
+@@ -1159,6 +1163,7 @@
+ 			md.thermal          = thermal();
+ 			md.steadystate      = steadystate();
+ 			md.transient        = transient();
++			md.calving          = calving();
+ 			md.gia              = gia();
+ 			md.seaice           = seaice();
+ 			md.autodiff         = autodiff();
+@@ -1319,17 +1324,18 @@
+ 			disp(sprintf('%19s: %-22s -- %s','debug'           ,['[1x1 ' class(obj.debug) ']'],'debugging tools (valgrind, gprof)'));
+ 			disp(sprintf('%19s: %-22s -- %s','verbose'         ,['[1x1 ' class(obj.verbose) ']'],'verbosity level in solve'));
+ 			disp(sprintf('%19s: %-22s -- %s','settings'        ,['[1x1 ' class(obj.settings) ']'],'settings properties'));
+-			disp(sprintf('%19s: %-22s -- %s','toolkits'          ,['[1x1 ' class(obj.toolkits) ']'],'PETSc options for each solution'));
++			disp(sprintf('%19s: %-22s -- %s','toolkits'        ,['[1x1 ' class(obj.toolkits) ']'],'PETSc options for each solution'));
+ 			disp(sprintf('%19s: %-22s -- %s','cluster'         ,['[1x1 ' class(obj.cluster) ']'],'cluster parameters (number of cpus...)'));
+ 			disp(sprintf('%19s: %-22s -- %s','balancethickness',['[1x1 ' class(obj.balancethickness) ']'],'parameters for balancethickness solution'));
+-			disp(sprintf('%19s: %-22s -- %s','stressbalance'      ,['[1x1 ' class(obj.stressbalance) ']'],'parameters for stressbalance solution'));
++			disp(sprintf('%19s: %-22s -- %s','stressbalance'   ,['[1x1 ' class(obj.stressbalance) ']'],'parameters for stressbalance solution'));
+ 			disp(sprintf('%19s: %-22s -- %s','groundingline'   ,['[1x1 ' class(obj.groundingline) ']'],'parameters for groundingline solution'));
+ 			disp(sprintf('%19s: %-22s -- %s','hydrology'       ,['[1x1 ' class(obj.hydrology) ']'],'parameters for hydrology solution'));
+-			disp(sprintf('%19s: %-22s -- %s','masstransport'      ,['[1x1 ' class(obj.masstransport) ']'],'parameters for masstransport solution'));
++			disp(sprintf('%19s: %-22s -- %s','masstransport'   ,['[1x1 ' class(obj.masstransport) ']'],'parameters for masstransport solution'));
+ 			disp(sprintf('%19s: %-22s -- %s','thermal'         ,['[1x1 ' class(obj.thermal) ']'],'parameters for thermal solution'));
+ 			disp(sprintf('%19s: %-22s -- %s','steadystate'     ,['[1x1 ' class(obj.steadystate) ']'],'parameters for steadystate solution'));
+ 			disp(sprintf('%19s: %-22s -- %s','transient'       ,['[1x1 ' class(obj.transient) ']'],'parameters for transient solution'));
+-			disp(sprintf('%19s: %-22s -- %s','gia'       ,['[1x1 ' class(obj.gia) ']'],'parameters for gia solution'));
++			disp(sprintf('%19s: %-22s -- %s','calving'         ,['[1x1 ' class(obj.calving) ']'],'parameters for calving'));
++			disp(sprintf('%19s: %-22s -- %s','gia'             ,['[1x1 ' class(obj.gia) ']'],'parameters for gia solution'));
+ 			disp(sprintf('%19s: %-22s -- %s','autodiff'        ,['[1x1 ' class(obj.autodiff) ']'],'automatic differentiation parameters'));
+ 			disp(sprintf('%19s: %-22s -- %s','flaim'           ,['[1x1 ' class(obj.flaim) ']'],'flaim parameters'));
+ 			disp(sprintf('%19s: %-22s -- %s','inversion'       ,['[1x1 ' class(obj.inversion) ']'],'parameters for inverse methods'));
+Index: ../trunk-jpl/src/m/classes/calvinglevermann.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvinglevermann.m	(revision 0)
++++ ../trunk-jpl/src/m/classes/calvinglevermann.m	(revision 18757)
+@@ -0,0 +1,48 @@
++%CALVINGLEVERMANN class definition
++%
++%   Usage:
++%      calvinglevermann=calvinglevermann();
++
++classdef calvinglevermann
++	properties (SetAccess=public) 
++		 coeff                  = 0;
++	end
++	methods
++		function obj = calvinglevermann(varargin) % {{{
++			switch nargin
++				case 0
++					obj=setdefaultparameters(obj);
++				case 1
++					inputstruct=varargin{1};
++					list1 = properties('calvinglevermann');
++					list2 = fieldnames(inputstruct);
++					for i=1:length(list1)
++						fieldname = list1{i};
++						if ismember(fieldname,list2),
++							obj.(fieldname) = inputstruct.(fieldname);
++						end
++					end
++				otherwise
++					error('constructor not supported');
++			end
++		end % }}}
++		function obj = setdefaultparameters(obj) % {{{
++			%Proportionality coefficient in Levermann model
++			obj.coeff=2e13;
++		end % }}}
++		function md = checkconsistency(obj,md,solution,analyses) % {{{
++			%Early return
++			if (solution~=TransientSolutionEnum() | md.transient.iscalving==0), return; end
++			md = checkfield(md,'fieldname','calving.coeff','>',0,'size',[md.mesh.numberofvertices 1]);
++		end % }}}
++		function disp(obj) % {{{
++			disp(sprintf('   Calving parameters:'));
++			fielddisplay(obj,'coeff','proportionality coefficient in Levermann model');
++
++		end % }}}
++		function marshall(obj,md,fid) % {{{
++			WriteData(fid,'enum',CalvingLawEnum(),'data',CalvingLevermannEnum(),'format','Integer');
++			WriteData(fid,'enum',CalvinglevermannCoeffEnum(),'data',obj.coeff,'format','DoubleMat','mattype',1);
++		end % }}}
++	end
++end
+Index: ../trunk-jpl/src/m/classes/model.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.py	(revision 18756)
++++ ../trunk-jpl/src/m/classes/model.py	(revision 18757)
+@@ -14,6 +14,7 @@
+ from SMBmeltcomponents import SMBmeltcomponents
+ from basalforcings import basalforcings
+ from matice import matice
++from calving import calving
+ from damage import damage
+ from friction import friction
+ from flowequation import flowequation
+@@ -87,6 +88,7 @@
+ 		self.thermal          = thermal()
+ 		self.steadystate      = steadystate()
+ 		self.transient        = transient()
++		self.calving          = calving()
+ 		self.gia              = gia()
+ 
+ 		self.autodiff         = autodiff()
+@@ -128,6 +130,7 @@
+ 		        'thermal',\
+ 		        'steadystate',\
+ 		        'transient',\
++		        'calving',\
+                         'gia',\
+ 		        'autodiff',\
+ 		        'flaim',\
+@@ -167,6 +170,7 @@
+ 		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("thermal","[%s,%s]" % ("1x1",obj.thermal.__class__.__name__),"parameters for thermal solution"))
+ 		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("steadystate","[%s,%s]" % ("1x1",obj.steadystate.__class__.__name__),"parameters for steadystate solution"))
+ 		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("transient","[%s,%s]" % ("1x1",obj.transient.__class__.__name__),"parameters for transient solution"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("calving","[%s,%s]" % ("1x1",obj.calving.__class__.__name__),"parameters for calving"))
+ 		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("autodiff","[%s,%s]" % ("1x1",obj.autodiff.__class__.__name__),"automatic differentiation parameters"))
+ 		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("flaim","[%s,%s]" % ("1x1",obj.flaim.__class__.__name__),"flaim parameters"))
+ 		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("inversion","[%s,%s]" % ("1x1",obj.inversion.__class__.__name__),"parameters for inverse methods"))
+@@ -657,8 +661,13 @@
+ 		md.damage.spcdamage=project3d(md,'vector',md.damage.spcdamage,'type','node')
+ 		md.stressbalance.referential=project3d(md,'vector',md.stressbalance.referential,'type','node')
+ 		md.stressbalance.loadingforce=project3d(md,'vector',md.stressbalance.loadingforce,'type','node')
+-		md.masstransport.calvingrate=project3d(md,'vector',md.masstransport.calvingrate,'type','node')
+ 
++		# Calving variables
++		if hasattr(md.calving,'calving'):
++			md.calving.calvingrate=project3d(md,'vector',md.calving.calvingrate,'type','node')
++		if hasattr(md.calving,'calvinglevermann'):
++			md.calving.coeff=project3d(md,'vector',md.calving.coeff,'type','node')
++
+ 		# Hydrologydc variables
+ 		if hasattr(md.hydrology,'hydrologydc'):
+ 			md.hydrology.spcsediment_head=project3d(md,'vector',md.hydrology.spcsediment_head,'type','node','layer',1)
+Index: ../trunk-jpl/src/m/classes/masstransport.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/masstransport.m	(revision 18756)
++++ ../trunk-jpl/src/m/classes/masstransport.m	(revision 18757)
+@@ -6,9 +6,6 @@
+ classdef masstransport
+ 	properties (SetAccess=public) 
+ 		 spcthickness           = NaN;
+-		 iscalvingrate          = 0;
+-		 calvingrate            = NaN;
+-		 levermann_calving_coeff= 0;
+ 		 isfreesurface          = 0;
+ 		 min_thickness          = 0;
+ 		 hydrostatic_adjustment = 0;
+@@ -44,40 +41,6 @@
+ 		end% }}}
+ 	end
+ 	methods
+-         function createxml(obj,fid) % {{{
+-            fprintf(fid, '<!-- masstransport -->\n');            
+-                    
+-            % Masstransport solution parameters
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Masstransport solution parameters">','<section name="masstransport" />');                    
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="spcthickness" type="',class(obj.spcthickness),'" default="',convert2str(obj.spcthickness),'">','     <section name="masstransport" />','     <help> thickness constraints (NaN means no constraint) [m] </help>','  </parameter>');
+-				fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="iscalvingrate" type="',class(obj.iscalvingrate),'" default="',convert2str(obj.iscalvingrate),'">','     <section name="masstransport" />','     <help> do we use calving (loss of ice) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="calvingrate" type="',class(obj.calvingrate),'" default="',convert2str(obj.calvingrate),'">','     <section name="masstransport" />','     <help> calving rate at given location [m/a] </help>','  </parameter>');
+-				fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="levermann_calving_coeff" type="',class(obj.levermann_calving_coeff),'" default="',convert2str(obj.levermann_calving_coeff),'">','     <section name="masstransport" />','     <help> Proportionality coefficient in Levermann model  </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isfreesurface" type="',class(obj.isfreesurface),'" default="',convert2str(obj.isfreesurface),'">','     <section name="masstransport" />','     <help> do we use free surfaces (FS only) are mass conservation </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="min_thickness" type="',class(obj.min_thickness),'" default="',convert2str(obj.min_thickness),'">','     <section name="masstransport" />','     <help> minimum ice thickness allowed [m] </help>','  </parameter>');
+-            
+-            % hydrostatic_adjustment drop-down (incremental or absolute )
+-            fprintf(fid,'%s\n%s\n%s\n%s\n','  <parameter key ="hydrostatic_adjustment" type="alternative" optional ="false">','     <section name="masstransport" />','     <help> adjustment of ice shelves surface and bed elevations: ''Incremental'' or ''Absolute''  </help>');
+-            fprintf(fid,'%s\n','       <option value="Incremental" type="string" default="true"> </option>');
+-            fprintf(fid,'%s\n%s\n','       <option value="Absolute" type="string" default="false"> </option>','</parameter>');
+-            
+-            %stabilization drop-down (0, 1, 2, or 3)
+-            fprintf(fid,'%s\n%s\n%s\n%s\n','  <parameter key ="stabilization" type="alternative" optional="false">','     <section name="masstransport" />','     <help> 0: no, 1:  artificial_diffusivity, 2: streamline upwinding, 3: discontinuous Galerkin </help>');
+-            fprintf(fid,'%s\n','       <option value="0" type="string" default="true"> </option>');
+-            fprintf(fid,'%s\n','       <option value="1" type="string" default="false"> </option>');
+-            fprintf(fid,'%s\n','       <option value="2" type="string" default="false"> </option>');
+-            fprintf(fid,'%s\n%s\n','       <option value="3" type="string" default="false"> </option>','</parameter>');
+-
+-            fprintf(fid,'%s\n%s\n','</frame>');    
+-            
+-            %Penalty options
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="2" label="Penalty options">','<section name="masstransport" />'); 
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertex_pairing" type="',class(obj.vertex_pairing),'" default="',convert2str(obj.vertex_pairing),'">','     <section name="masstransport" />','     <help> offset used by penalties: penalty = Kmax*10^offset </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="penalty_factor" type="',class(obj.penalty_factor),'" default="',convert2str(obj.penalty_factor),'">','     <section name="masstransport" />','     <help> pairs of vertices that are penalized </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="requested_outputs" type="',class(obj.requested_outputs),'" default="',convert2str(obj.requested_outputs),'">','     <section name="masstransport" />','     <help> additional outputs requested </help>','  </parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-        
+-        end % }}}
+ 		function obj = masstransport(varargin) % {{{
+ 			switch nargin
+ 				case 0
+@@ -103,9 +66,6 @@
+ 		end % }}}
+ 		function obj = setdefaultparameters(obj) % {{{
+ 
+-			%Proportionality coefficient in Levermann model
+-			obj.levermann_calving_coeff=8e21;
+-			
+ 			%Type of stabilization to use 0:nothing 1:artificial_diffusivity 3:Discontinuous Galerkin
+ 			obj.stabilization=1;
+ 
+@@ -127,12 +87,6 @@
+ 			if ~ismember(MasstransportAnalysisEnum(),analyses) |  (solution==TransientSolutionEnum() & md.transient.ismasstransport==0), return; end
+ 
+ 			md = checkfield(md,'fieldname','masstransport.spcthickness','forcing',1);
+-			if(ismember(LevelsetAnalysisEnum(), analyses) & md.transient.islevelset)
+-				md = checkfield(md,'fieldname','masstransport.iscalvingrate','values',[0 1]);
+-				md = checkfield(md,'fieldname','masstransport.calvingrate','NaN',1,'size',[md.mesh.numberofvertices 1],'>=',0);
+-				md = checkfield(md,'fieldname','masstransport.levermann_calving_coeff','>',0);
+-			end
+-
+ 			md = checkfield(md,'fieldname','masstransport.isfreesurface','values',[0 1]);
+ 			md = checkfield(md,'fieldname','masstransport.hydrostatic_adjustment','values',{'Absolute' 'Incremental'});
+ 			md = checkfield(md,'fieldname','masstransport.stabilization','values',[0 1 2 3 4]);
+@@ -143,9 +97,6 @@
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   Masstransport solution parameters:'));
+ 			fielddisplay(obj,'spcthickness','thickness constraints (NaN means no constraint) [m]');
+-			fielddisplay(obj,'iscalvingrate','do we use calving (loss of ice)');
+-			fielddisplay(obj,'calvingrate','calving rate at given location [m/a]');
+-			fielddisplay(obj,'levermann_calving_coeff','proportionality coefficient in Levermann model');
+ 			fielddisplay(obj,'isfreesurface','do we use free surfaces (FS only) are mass conservation');
+ 			fielddisplay(obj,'min_thickness','minimum ice thickness allowed [m]');
+ 			fielddisplay(obj,'hydrostatic_adjustment','adjustment of ice shelves surface and bed elevations: ''Incremental'' or ''Absolute'' ');
+@@ -162,10 +113,7 @@
+ 			yts=365.*24.*3600.;
+ 
+ 			WriteData(fid,'object',obj,'fieldname','spcthickness','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'fieldname','calvingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts);
+-			WriteData(fid,'object',obj,'fieldname','iscalvingrate','format','Boolean');
+ 			WriteData(fid,'object',obj,'fieldname','isfreesurface','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','levermann_calving_coeff','format','Double');
+ 			WriteData(fid,'object',obj,'fieldname','min_thickness','format','Double');
+ 			WriteData(fid,'data',StringToEnum(obj.hydrostatic_adjustment),'format','Integer','enum',MasstransportHydrostaticAdjustmentEnum());
+ 			WriteData(fid,'object',obj,'fieldname','stabilization','format','Integer');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18757-18758.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18757-18758.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18757-18758.diff	(revision 19102)
@@ -0,0 +1,606 @@
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18757)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18758)
+@@ -19,10 +19,9 @@
+ }
+ /*}}}*/
+ void LevelsetAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+-	int  finiteelement;
+ 
+ 	/*Finite element type*/
+-	finiteelement = P1Enum;
++	int finiteelement = P1Enum;
+ 
+ 	/*Update elements: */
+ 	int counter=0;
+@@ -37,7 +36,20 @@
+ 	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
+ 	iomodel->FetchDataToInput(elements,VxEnum);
+ 	iomodel->FetchDataToInput(elements,VyEnum);
+-	iomodel->FetchDataToInput(elements,MasstransportCalvingrateEnum);
++
++	/*Get calving parameters*/
++	int calvinglaw;
++	iomodel->Constant(&calvinglaw,CalvingLawEnum);
++	switch(calvinglaw){
++		case DefaultCalvingEnum:
++			iomodel->FetchDataToInput(elements,CalvingCalvingrateEnum);
++			break;
++		case CalvingLevermannEnum:
++			iomodel->FetchDataToInput(elements,CalvinglevermannCoeffEnum);
++			break;
++		default:
++			_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
++	}
+ }
+ /*}}}*/
+ void LevelsetAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+@@ -99,19 +111,21 @@
+ 	Element* basalelement = element->SpawnBasalElement();
+ 
+ 	/*Intermediaries */
+-	int  dim, domaintype;
+-	bool iscalvingrate;
++	int  stabilization=2;
++	int  dim, domaintype, calvinglaw;
++	bool iscalving;
+ 	int i, row, col;
+ 	IssmDouble kappa;
+ 	IssmDouble Jdet, dt, D_scalar;
+ 	IssmDouble h,hx,hy,hz;
+ 	IssmDouble vel;
+-//	IssmDouble norm_dlsf;
++	IssmDouble norm_dlsf, calvingrate;
+ 	IssmDouble* xyz_list = NULL;
+ 
+ 	/*Get problem dimension and whether there is calving or not*/
+-	basalelement->FindParam(&iscalvingrate,MasstransportIscalvingrateEnum);
++	basalelement->FindParam(&iscalving,TransientIscalvingEnum);
+ 	basalelement->FindParam(&domaintype,DomainTypeEnum);
++	basalelement->FindParam(&calvinglaw,CalvingLawEnum);
+ 	switch(domaintype){
+ 		case Domain2DverticalEnum:   dim = 1; break;
+ 		case Domain2DhorizontalEnum: dim = 2; break;
+@@ -130,45 +144,63 @@
+ 	IssmDouble*    D        = xNew<IssmDouble>(dim*dim);
+ 	IssmDouble*    v        = xNew<IssmDouble>(dim);
+ 	IssmDouble*    w        = xNew<IssmDouble>(dim);
+-	IssmDouble*    c        = xNew<IssmDouble>(dim);
+-	//IssmDouble*    dlsf     = xNew<IssmDouble>(dim);
++	IssmDouble*    c        = xNewZeroInit<IssmDouble>(dim);
++	IssmDouble*    dlsf     = xNew<IssmDouble>(dim);
+ 
+ 	/*Retrieve all inputs and parameters*/
+ 	basalelement->GetVerticesCoordinates(&xyz_list);
+ 	basalelement->FindParam(&dt,TimesteppingTimeStepEnum);
+-	Input* vx_input=NULL;
+-	Input* vy_input=NULL;
+-	Input* calvingratex_input=NULL;
+-	Input* calvingratey_input=NULL;
++	Input* vx_input           = NULL;
++	Input* vy_input           = NULL;
++	Input* calvingratex_input = NULL;
++	Input* calvingratey_input = NULL;
++	Input* lsf_slopex_input   = NULL;
++	Input* lsf_slopey_input   = NULL;
++	Input* calvingrate_input  = NULL;
++
++	/*Load velocities*/
+ 	if(domaintype==Domain2DhorizontalEnum){
+ 		vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input);
+ 		vy_input=basalelement->GetInput(VyEnum); _assert_(vy_input);
+-		if(iscalvingrate){
+-			calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
+-			calvingratey_input=basalelement->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
+-		}
+ 	}
+ 	else{
+ 		if(dim==1){
+ 			vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input);
+-			if(iscalvingrate){
+-				calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
+-			}
+ 		}
+ 		if(dim==2){
+ 			vx_input=basalelement->GetInput(VxAverageEnum); _assert_(vx_input);
+ 			vy_input=basalelement->GetInput(VyAverageEnum); _assert_(vy_input);
+-			if(iscalvingrate){
+-				calvingratex_input=basalelement->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
+-				calvingratey_input=basalelement->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
+-			}
+ 		}
+ 	}
+ 
+-//	Input* lsf_slopex_input  = basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
+-//	Input* lsf_slopey_input  = basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
+-	//Input* calvingrate_input  = basalelement->GetInput(MasstransportCalvingrateEnum);     _assert_(calvingrate_input);
+-	
++	/*Load calving inputs*/
++	if(iscalving){
++		switch(calvinglaw){
++			case DefaultCalvingEnum:
++				lsf_slopex_input  = basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
++				if(dim==2) lsf_slopey_input  = basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
++				calvingrate_input = basalelement->GetInput(CalvingCalvingrateEnum);     _assert_(calvingrate_input);
++				break;
++			case CalvingLevermannEnum:
++				if(domaintype==Domain2DhorizontalEnum){
++					calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
++					calvingratey_input=basalelement->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
++				}
++				else{
++					if(dim==1){
++						calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
++					}
++					if(dim==2){
++						calvingratex_input=basalelement->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
++						calvingratey_input=basalelement->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
++					}
++				}
++				break;
++			default:
++				_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
++		}
++	}
++
+ 	/* Start  looping on the number of gaussian points: */
+ 	Gauss* gauss=basalelement->NewGauss(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+@@ -192,34 +224,45 @@
+ 		GetBprime(Bprime,basalelement,xyz_list,gauss); 
+ 		vx_input->GetInputValue(&v[0],gauss); // in 3D case, add mesh velocity 
+ 		vy_input->GetInputValue(&v[1],gauss); 
+-		if(iscalvingrate){
+-			calvingratex_input->GetInputValue(&c[0],gauss); // in 3D case, add mesh velocity 
+-			calvingratey_input->GetInputValue(&c[1],gauss); 
+-			for(i=0;i<dim;i++) w[i]=v[i]-c[i];
++
++		/*Get calving speed*/
++		if(iscalving){
++			switch(calvinglaw){
++				case DefaultCalvingEnum:
++					lsf_slopex_input->GetInputValue(&dlsf[0],gauss);
++					if(dim==2) lsf_slopey_input->GetInputValue(&dlsf[1],gauss);
++					calvingrate_input->GetInputValue(&calvingrate,gauss);
++
++					norm_dlsf=0.;
++					for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
++					norm_dlsf=sqrt(norm_dlsf);
++
++					if(norm_dlsf>1.e-10)
++					 for(i=0;i<dim;i++) c[i]=calvingrate*dlsf[i]/norm_dlsf;
++					else
++					 for(i=0;i<dim;i++) c[i]=0.;
++					break;
++				case CalvingLevermannEnum:
++					calvingratex_input->GetInputValue(&c[0],gauss); // in 3D case, add mesh velocity 
++					if(dim==2) calvingratey_input->GetInputValue(&c[1],gauss);
++					break;
++				default:
++					_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
++			}
+ 		}
+-		else{
+-			for(i=0;i<dim;i++) w[i]=v[i];
+-		}
+-		//lsf_slopex_input->GetInputValue(&dlsf[0],gauss);
+-		//lsf_slopey_input->GetInputValue(&dlsf[1],gauss);
+-		//calvingrate_input->GetInputValue(&calvingrate,gauss);
+ 
+-		//norm_dlsf=0.;
+-		//for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
+-		//norm_dlsf=sqrt(norm_dlsf);
++		/*Levelset speed is ice velocity - calving rate*/
++		for(i=0;i<dim;i++) w[i]=v[i]-c[i];
+ 
+-		//if(norm_dlsf>1.e-10)
+-		//	for(i=0;i<dim;i++) c[i]=calvingrate*dlsf[i]/norm_dlsf;
+-		//else
+-		//for(i=0;i<dim;i++) c[i]=0.;
+-		
+-
+-		for(row=0;row<dim;row++)
+-			for(col=0;col<dim;col++)
++		/*Compute D*/
++		for(row=0;row<dim;row++){
++			for(col=0;col<dim;col++){
+ 				if(row==col)
+-					D[row*dim+col]=D_scalar*w[row];
++				 D[row*dim+col]=D_scalar*w[row];
+ 				else
+-				   D[row*dim+col]=0.;
++				 D[row*dim+col]=0.;
++			}
++		}
+ 
+ 		TripleMultiply(B,dim,numnodes,1,
+ 					D,dim,dim,0,
+@@ -227,9 +270,8 @@
+ 					&Ke->values[0],1);
+ 
+ 		/* Stabilization */
+-		int stabilization=2;
+ 		vel=0.;
+-		for(i=0;i<dim;i++) vel+=w[i]*w[i];
++		for(i=0;i<dim;i++) vel+=v[i]*v[i];
+ 		vel=sqrt(vel)+1.e-14;
+ 		switch(stabilization){
+ 			case 0:
+@@ -255,10 +297,10 @@
+ 			case 2:
+ 				/* Streamline Upwinding */
+ 				basalelement->ElementSizes(&hx,&hy,&hz);
+-				h=sqrt( pow(hx*w[0]/vel,2) + pow(hy*w[1]/vel,2) );
++				h=sqrt( pow(hx*v[0]/vel,2) + pow(hy*v[1]/vel,2) );
+ 				for(row=0;row<dim;row++) 
+ 					for(col=0;col<dim;col++) 
+-						D[row*dim+col] = D_scalar*h/(2.*vel)*w[row]*w[col];
++						D[row*dim+col] = D_scalar*h/(2.*vel)*v[row]*v[col];
+ 
+ 				TripleMultiply(Bprime,dim,numnodes,1,
+ 							D,dim,dim,0,
+@@ -279,7 +321,7 @@
+ 	xDelete<IssmDouble>(v);
+ 	xDelete<IssmDouble>(w);
+ 	xDelete<IssmDouble>(c);
+-	//xDelete<IssmDouble>(dlsf);
++	xDelete<IssmDouble>(dlsf);
+ 	delete gauss;
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 	return Ke;
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18757)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18758)
+@@ -208,6 +208,12 @@
+ 	DamageEnum,
+ 	NewDamageEnum,
+ 	StressIntensityFactorEnum,
++	CalvingLawEnum,
++	CalvingCalvingrateEnum,
++	CalvingLevermannEnum,
++	DefaultCalvingEnum,
++	CalvingRequestedOutputsEnum,
++	CalvinglevermannCoeffEnum,
+ 	CalvingratexEnum,
+ 	CalvingrateyEnum,
+ 	CalvingratexAverageEnum,
+@@ -249,13 +255,10 @@
+ 	Domain3DEnum,
+ 	MiscellaneousNameEnum, //FIXME: only used by qmu, should not be marshalled (already in queueing script)
+ 	MasstransportHydrostaticAdjustmentEnum,
+-	MasstransportIscalvingrateEnum,
+-	MasstransportLevermannCalvingCoeffEnum,
+ 	MasstransportIsfreesurfaceEnum,
+ 	MasstransportMinThicknessEnum,
+ 	MasstransportPenaltyFactorEnum,
+ 	MasstransportSpcthicknessEnum,
+-	MasstransportCalvingrateEnum,
+ 	MasstransportStabilizationEnum,
+ 	MasstransportVertexPairingEnum,
+ 	MasstransportNumRequestedOutputsEnum,
+@@ -313,6 +316,7 @@
+ 	TransientIsgiaEnum,
+ 	TransientIsdamageevolutionEnum,
+ 	TransientIshydrologyEnum,
++	TransientIscalvingEnum,
+ 	TransientNumRequestedOutputsEnum,
+ 	TransientRequestedOutputsEnum,
+ 	PotentialEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18757)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18758)
+@@ -216,6 +216,12 @@
+ 		case DamageEnum : return "Damage";
+ 		case NewDamageEnum : return "NewDamage";
+ 		case StressIntensityFactorEnum : return "StressIntensityFactor";
++		case CalvingLawEnum : return "CalvingLaw";
++		case CalvingCalvingrateEnum : return "CalvingCalvingrate";
++		case CalvingLevermannEnum : return "CalvingLevermann";
++		case DefaultCalvingEnum : return "DefaultCalving";
++		case CalvingRequestedOutputsEnum : return "CalvingRequestedOutputs";
++		case CalvinglevermannCoeffEnum : return "CalvinglevermannCoeff";
+ 		case CalvingratexEnum : return "Calvingratex";
+ 		case CalvingrateyEnum : return "Calvingratey";
+ 		case CalvingratexAverageEnum : return "CalvingratexAverage";
+@@ -257,13 +263,10 @@
+ 		case Domain3DEnum : return "Domain3D";
+ 		case MiscellaneousNameEnum : return "MiscellaneousName";
+ 		case MasstransportHydrostaticAdjustmentEnum : return "MasstransportHydrostaticAdjustment";
+-		case MasstransportIscalvingrateEnum : return "MasstransportIscalvingrate";
+-		case MasstransportLevermannCalvingCoeffEnum : return "MasstransportLevermannCalvingCoeff";
+ 		case MasstransportIsfreesurfaceEnum : return "MasstransportIsfreesurface";
+ 		case MasstransportMinThicknessEnum : return "MasstransportMinThickness";
+ 		case MasstransportPenaltyFactorEnum : return "MasstransportPenaltyFactor";
+ 		case MasstransportSpcthicknessEnum : return "MasstransportSpcthickness";
+-		case MasstransportCalvingrateEnum : return "MasstransportCalvingrate";
+ 		case MasstransportStabilizationEnum : return "MasstransportStabilization";
+ 		case MasstransportVertexPairingEnum : return "MasstransportVertexPairing";
+ 		case MasstransportNumRequestedOutputsEnum : return "MasstransportNumRequestedOutputs";
+@@ -321,6 +324,7 @@
+ 		case TransientIsgiaEnum : return "TransientIsgia";
+ 		case TransientIsdamageevolutionEnum : return "TransientIsdamageevolution";
+ 		case TransientIshydrologyEnum : return "TransientIshydrology";
++		case TransientIscalvingEnum : return "TransientIscalving";
+ 		case TransientNumRequestedOutputsEnum : return "TransientNumRequestedOutputs";
+ 		case TransientRequestedOutputsEnum : return "TransientRequestedOutputs";
+ 		case PotentialEnum : return "Potential";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18757)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18758)
+@@ -219,6 +219,12 @@
+ 	      else if (strcmp(name,"Damage")==0) return DamageEnum;
+ 	      else if (strcmp(name,"NewDamage")==0) return NewDamageEnum;
+ 	      else if (strcmp(name,"StressIntensityFactor")==0) return StressIntensityFactorEnum;
++	      else if (strcmp(name,"CalvingLaw")==0) return CalvingLawEnum;
++	      else if (strcmp(name,"CalvingCalvingrate")==0) return CalvingCalvingrateEnum;
++	      else if (strcmp(name,"CalvingLevermann")==0) return CalvingLevermannEnum;
++	      else if (strcmp(name,"DefaultCalving")==0) return DefaultCalvingEnum;
++	      else if (strcmp(name,"CalvingRequestedOutputs")==0) return CalvingRequestedOutputsEnum;
++	      else if (strcmp(name,"CalvinglevermannCoeff")==0) return CalvinglevermannCoeffEnum;
+ 	      else if (strcmp(name,"Calvingratex")==0) return CalvingratexEnum;
+ 	      else if (strcmp(name,"Calvingratey")==0) return CalvingrateyEnum;
+ 	      else if (strcmp(name,"CalvingratexAverage")==0) return CalvingratexAverageEnum;
+@@ -253,23 +259,20 @@
+ 	      else if (strcmp(name,"MeshY")==0) return MeshYEnum;
+ 	      else if (strcmp(name,"MeshZ")==0) return MeshZEnum;
+ 	      else if (strcmp(name,"MeshElementtype")==0) return MeshElementtypeEnum;
+-	      else if (strcmp(name,"DomainType")==0) return DomainTypeEnum;
++         else stage=3;
++   }
++   if(stage==3){
++	      if (strcmp(name,"DomainType")==0) return DomainTypeEnum;
+ 	      else if (strcmp(name,"DomainDimension")==0) return DomainDimensionEnum;
+ 	      else if (strcmp(name,"Domain2Dhorizontal")==0) return Domain2DhorizontalEnum;
+ 	      else if (strcmp(name,"Domain2Dvertical")==0) return Domain2DverticalEnum;
+ 	      else if (strcmp(name,"Domain3D")==0) return Domain3DEnum;
+ 	      else if (strcmp(name,"MiscellaneousName")==0) return MiscellaneousNameEnum;
+-         else stage=3;
+-   }
+-   if(stage==3){
+-	      if (strcmp(name,"MasstransportHydrostaticAdjustment")==0) return MasstransportHydrostaticAdjustmentEnum;
+-	      else if (strcmp(name,"MasstransportIscalvingrate")==0) return MasstransportIscalvingrateEnum;
+-	      else if (strcmp(name,"MasstransportLevermannCalvingCoeff")==0) return MasstransportLevermannCalvingCoeffEnum;
++	      else if (strcmp(name,"MasstransportHydrostaticAdjustment")==0) return MasstransportHydrostaticAdjustmentEnum;
+ 	      else if (strcmp(name,"MasstransportIsfreesurface")==0) return MasstransportIsfreesurfaceEnum;
+ 	      else if (strcmp(name,"MasstransportMinThickness")==0) return MasstransportMinThicknessEnum;
+ 	      else if (strcmp(name,"MasstransportPenaltyFactor")==0) return MasstransportPenaltyFactorEnum;
+ 	      else if (strcmp(name,"MasstransportSpcthickness")==0) return MasstransportSpcthicknessEnum;
+-	      else if (strcmp(name,"MasstransportCalvingrate")==0) return MasstransportCalvingrateEnum;
+ 	      else if (strcmp(name,"MasstransportStabilization")==0) return MasstransportStabilizationEnum;
+ 	      else if (strcmp(name,"MasstransportVertexPairing")==0) return MasstransportVertexPairingEnum;
+ 	      else if (strcmp(name,"MasstransportNumRequestedOutputs")==0) return MasstransportNumRequestedOutputsEnum;
+@@ -327,6 +330,7 @@
+ 	      else if (strcmp(name,"TransientIsgia")==0) return TransientIsgiaEnum;
+ 	      else if (strcmp(name,"TransientIsdamageevolution")==0) return TransientIsdamageevolutionEnum;
+ 	      else if (strcmp(name,"TransientIshydrology")==0) return TransientIshydrologyEnum;
++	      else if (strcmp(name,"TransientIscalving")==0) return TransientIscalvingEnum;
+ 	      else if (strcmp(name,"TransientNumRequestedOutputs")==0) return TransientNumRequestedOutputsEnum;
+ 	      else if (strcmp(name,"TransientRequestedOutputs")==0) return TransientRequestedOutputsEnum;
+ 	      else if (strcmp(name,"Potential")==0) return PotentialEnum;
+@@ -378,14 +382,14 @@
+ 	      else if (strcmp(name,"AdjointBalancethicknessAnalysis")==0) return AdjointBalancethicknessAnalysisEnum;
+ 	      else if (strcmp(name,"AdjointBalancethickness2Analysis")==0) return AdjointBalancethickness2AnalysisEnum;
+ 	      else if (strcmp(name,"AdjointHorizAnalysis")==0) return AdjointHorizAnalysisEnum;
+-	      else if (strcmp(name,"AnalysisCounter")==0) return AnalysisCounterEnum;
++         else stage=4;
++   }
++   if(stage==4){
++	      if (strcmp(name,"AnalysisCounter")==0) return AnalysisCounterEnum;
+ 	      else if (strcmp(name,"DefaultAnalysis")==0) return DefaultAnalysisEnum;
+ 	      else if (strcmp(name,"BalancethicknessAnalysis")==0) return BalancethicknessAnalysisEnum;
+ 	      else if (strcmp(name,"BalancethicknessSolution")==0) return BalancethicknessSolutionEnum;
+-         else stage=4;
+-   }
+-   if(stage==4){
+-	      if (strcmp(name,"Balancethickness2Analysis")==0) return Balancethickness2AnalysisEnum;
++	      else if (strcmp(name,"Balancethickness2Analysis")==0) return Balancethickness2AnalysisEnum;
+ 	      else if (strcmp(name,"Balancethickness2Solution")==0) return Balancethickness2SolutionEnum;
+ 	      else if (strcmp(name,"BalancethicknessSoftAnalysis")==0) return BalancethicknessSoftAnalysisEnum;
+ 	      else if (strcmp(name,"BalancethicknessSoftSolution")==0) return BalancethicknessSoftSolutionEnum;
+@@ -501,14 +505,14 @@
+ 	      else if (strcmp(name,"SpcTransient")==0) return SpcTransientEnum;
+ 	      else if (strcmp(name,"StringArrayParam")==0) return StringArrayParamEnum;
+ 	      else if (strcmp(name,"StringParam")==0) return StringParamEnum;
+-	      else if (strcmp(name,"Seg")==0) return SegEnum;
++         else stage=5;
++   }
++   if(stage==5){
++	      if (strcmp(name,"Seg")==0) return SegEnum;
+ 	      else if (strcmp(name,"SegInput")==0) return SegInputEnum;
+ 	      else if (strcmp(name,"Tria")==0) return TriaEnum;
+ 	      else if (strcmp(name,"TriaInput")==0) return TriaInputEnum;
+-         else stage=5;
+-   }
+-   if(stage==5){
+-	      if (strcmp(name,"Tetra")==0) return TetraEnum;
++	      else if (strcmp(name,"Tetra")==0) return TetraEnum;
+ 	      else if (strcmp(name,"TetraInput")==0) return TetraInputEnum;
+ 	      else if (strcmp(name,"Penta")==0) return PentaEnum;
+ 	      else if (strcmp(name,"PentaInput")==0) return PentaInputEnum;
+@@ -624,14 +628,14 @@
+ 	      else if (strcmp(name,"P2")==0) return P2Enum;
+ 	      else if (strcmp(name,"P2bubble")==0) return P2bubbleEnum;
+ 	      else if (strcmp(name,"P2bubblecondensed")==0) return P2bubblecondensedEnum;
+-	      else if (strcmp(name,"P2xP1")==0) return P2xP1Enum;
++         else stage=6;
++   }
++   if(stage==6){
++	      if (strcmp(name,"P2xP1")==0) return P2xP1Enum;
+ 	      else if (strcmp(name,"P1xP2")==0) return P1xP2Enum;
+ 	      else if (strcmp(name,"P1xP3")==0) return P1xP3Enum;
+ 	      else if (strcmp(name,"P2xP4")==0) return P2xP4Enum;
+-         else stage=6;
+-   }
+-   if(stage==6){
+-	      if (strcmp(name,"P1P1")==0) return P1P1Enum;
++	      else if (strcmp(name,"P1P1")==0) return P1P1Enum;
+ 	      else if (strcmp(name,"P1P1GLS")==0) return P1P1GLSEnum;
+ 	      else if (strcmp(name,"MINI")==0) return MINIEnum;
+ 	      else if (strcmp(name,"MINIcondensed")==0) return MINIcondensedEnum;
+@@ -747,14 +751,14 @@
+ 	      else if (strcmp(name,"Arrhenius")==0) return ArrheniusEnum;
+ 	      else if (strcmp(name,"LliboutryDuval")==0) return LliboutryDuvalEnum;
+ 	      else if (strcmp(name,"TransientIslevelset")==0) return TransientIslevelsetEnum;
+-	      else if (strcmp(name,"ExtrapolationVariable")==0) return ExtrapolationVariableEnum;
++         else stage=7;
++   }
++   if(stage==7){
++	      if (strcmp(name,"ExtrapolationVariable")==0) return ExtrapolationVariableEnum;
+ 	      else if (strcmp(name,"IceMaskNodeActivation")==0) return IceMaskNodeActivationEnum;
+ 	      else if (strcmp(name,"LevelsetfunctionSlopeX")==0) return LevelsetfunctionSlopeXEnum;
+ 	      else if (strcmp(name,"LevelsetfunctionSlopeY")==0) return LevelsetfunctionSlopeYEnum;
+-         else stage=7;
+-   }
+-   if(stage==7){
+-	      if (strcmp(name,"LevelsetfunctionPicard")==0) return LevelsetfunctionPicardEnum;
++	      else if (strcmp(name,"LevelsetfunctionPicard")==0) return LevelsetfunctionPicardEnum;
+ 	      else if (strcmp(name,"Seaiceatm")==0) return SeaiceatmEnum;
+ 	      else if (strcmp(name,"Seaiceocean")==0) return SeaiceoceanEnum;
+ 	      else if (strcmp(name,"SeaiceThickness")==0) return SeaiceThicknessEnum;
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 18757)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 18758)
+@@ -66,6 +66,7 @@
+ 	parameters->AddObject(iomodel->CopyConstantObject(QmuIsdakotaEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(InversionIscontrolEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(InversionTypeEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(CalvingLawEnum));
+ 	if(solution_type==SeaiceSolutionEnum){
+ 	}
+ 	else{
+@@ -82,8 +83,7 @@
+ 		parameters->AddObject(iomodel->CopyConstantObject(TransientIslevelsetEnum));
+ 		parameters->AddObject(iomodel->CopyConstantObject(TransientIsdamageevolutionEnum));
+ 		parameters->AddObject(iomodel->CopyConstantObject(TransientIshydrologyEnum));
+-		parameters->AddObject(iomodel->CopyConstantObject(MasstransportIscalvingrateEnum));
+-		parameters->AddObject(iomodel->CopyConstantObject(MasstransportLevermannCalvingCoeffEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(TransientIscalvingEnum));
+ 		parameters->AddObject(iomodel->CopyConstantObject(MaterialsRheologyLawEnum));
+ 		parameters->AddObject(iomodel->CopyConstantObject(GiaCrossSectionShapeEnum));
+ 
+Index: ../trunk-jpl/src/c/cores/transient_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/transient_core.cpp	(revision 18757)
++++ ../trunk-jpl/src/c/cores/transient_core.cpp	(revision 18758)
+@@ -20,11 +20,11 @@
+ 
+ 	/*parameters: */
+ 	IssmDouble starttime,finaltime,dt,yts;
+-	bool       isstressbalance,ismasstransport,isFS,isthermal,isgroundingline,isgia,islevelset,isdamageevolution,ishydrology,iscalvingrate;
++	bool       isstressbalance,ismasstransport,isFS,isthermal,isgroundingline,isgia,islevelset,isdamageevolution,ishydrology,iscalving;
+ 	bool       save_results,dakota_analysis;
+ 	bool       time_adapt=false;
+ 	int        output_frequency;
+-	int        domaintype,groundingline_migration;
++	int        domaintype,groundingline_migration,calvinglaw;
+ 	int        numoutputs         = 0;
+ 	Analysis  *analysis = NULL;
+ 	char**     requested_outputs = NULL;
+@@ -52,7 +52,8 @@
+ 	femmodel->parameters->FindParam(&isdamageevolution,TransientIsdamageevolutionEnum);
+ 	femmodel->parameters->FindParam(&ishydrology,TransientIshydrologyEnum);
+ 	femmodel->parameters->FindParam(&isFS,FlowequationIsFSEnum);
+-	femmodel->parameters->FindParam(&iscalvingrate,MasstransportIscalvingrateEnum);
++	femmodel->parameters->FindParam(&iscalving,TransientIscalvingEnum);
++	femmodel->parameters->FindParam(&calvinglaw,CalvingLawEnum);
+ 	if(isgroundingline) femmodel->parameters->FindParam(&groundingline_migration,GroundinglineMigrationEnum);
+ 	femmodel->parameters->FindParam(&numoutputs,TransientNumRequestedOutputsEnum);
+ 	if(numoutputs) femmodel->parameters->FindParam(&requested_outputs,&numoutputs,TransientRequestedOutputsEnum);
+@@ -101,7 +102,7 @@
+ 		}
+ 
+ 		if(islevelset){
+-			if(iscalvingrate){
++			if(iscalving && calvinglaw==CalvingLevermannEnum){
+ 				if(VerboseSolution()) _printf0_("   computing calving rate\n");
+ 				femmodel->StrainRateparallelx();
+ 				femmodel->StrainRateperpendicularx();
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18757)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18758)
+@@ -438,7 +438,7 @@
+ 	Input* vy_input=inputs->GetInput(VyEnum);																		_assert_(vy_input);
+ 	Input* strainparallel_input=inputs->GetInput(StrainRateparallelEnum);								_assert_(strainparallel_input);
+ 	Input* strainperpendicular_input=inputs->GetInput(StrainRateperpendicularEnum);					_assert_(strainperpendicular_input);
+-	this->parameters->FindParam(&propcoeff,MasstransportLevermannCalvingCoeffEnum);
++	Input* levermanncoeff_input=inputs->GetInput(CalvinglevermannCoeffEnum);                     _assert_(levermanncoeff_input);
+ 
+ 	/* Start looping on the number of vertices: */
+ 	gauss=new GaussTria();
+@@ -451,6 +451,7 @@
+ 		vel=vx*vx+vy*vy;
+ 		strainparallel_input->GetInputValue(&strainparallel,gauss);
+ 		strainperpendicular_input->GetInputValue(&strainperpendicular,gauss);
++		levermanncoeff_input->GetInputValue(&propcoeff,gauss);
+ 
+ 		/*Calving rate proportionnal to the positive product of the strain rate along the ice flow direction and the strain rate perpendicular to the ice flow */
+ 		calvingrate[iv]=propcoeff*strainparallel*strainperpendicular;
+@@ -464,7 +465,7 @@
+ 	/*Add input*/
+ 	this->inputs->AddInput(new TriaInput(CalvingratexEnum,&calvingratex[0],P1Enum));
+ 	this->inputs->AddInput(new TriaInput(CalvingrateyEnum,&calvingratey[0],P1Enum));
+-	this->inputs->AddInput(new TriaInput(MasstransportCalvingrateEnum,&calvingrate[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(CalvingCalvingrateEnum,&calvingrate[0],P1Enum));
+ 
+ 	/*Clean up and return*/
+ 	delete gauss;
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18757)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18758)
+@@ -366,8 +366,8 @@
+ 	Input* vx_input=inputs->GetInput(VxEnum);																		_assert_(vx_input);
+ 	Input* vy_input=inputs->GetInput(VyEnum);																		_assert_(vy_input);
+ 	Input* strainparallel_input=inputs->GetInput(StrainRateparallelEnum);								_assert_(strainparallel_input);
+-	Input* strainperpendicular_input=inputs->GetInput(StrainRateperpendicularEnum);             _assert_(strainperpendicular_input);
+-	this->parameters->FindParam(&propcoeff,MasstransportLevermannCalvingCoeffEnum);
++	Input* strainperpendicular_input=inputs->GetInput(StrainRateperpendicularEnum);              _assert_(strainperpendicular_input);
++	Input* levermanncoeff_input=inputs->GetInput(CalvinglevermannCoeffEnum);                     _assert_(levermanncoeff_input);
+ 
+ 	/* Start looping on the number of vertices: */
+ 	gauss=new GaussPenta();
+@@ -380,6 +380,7 @@
+ 		vel=vx*vx+vy*vy;
+ 		strainparallel_input->GetInputValue(&strainparallel,gauss);
+ 		strainperpendicular_input->GetInputValue(&strainperpendicular,gauss);
++		levermanncoeff_input->GetInputValue(&propcoeff,gauss);
+ 
+ 		/*Calving rate proportionnal to the positive product of the strain rate along the ice flow direction and the strain rate perpendicular to the ice flow */
+ 		calvingrate[iv]=propcoeff*strainparallel*strainperpendicular;	
+@@ -393,7 +394,7 @@
+ 	/*Add input*/
+ 	this->inputs->AddInput(new PentaInput(CalvingratexEnum,&calvingratex[0],P1Enum));
+ 	this->inputs->AddInput(new PentaInput(CalvingrateyEnum,&calvingratey[0],P1Enum));
+-	this->inputs->AddInput(new PentaInput(MasstransportCalvingrateEnum,&calvingrate[0],P1Enum));
++	this->inputs->AddInput(new PentaInput(CalvingCalvingrateEnum,&calvingrate[0],P1Enum));
+ 
+ 	/*Clean up and return*/
+ 	delete gauss;
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18757)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18758)
+@@ -1091,7 +1091,7 @@
+ 				name==LevelsetfunctionSlopeXEnum ||
+ 				name==LevelsetfunctionSlopeYEnum ||
+ 				name==LevelsetfunctionPicardEnum ||
+-				name==MasstransportCalvingrateEnum ||
++				//name==CalvingCalvingrateEnum ||
+ 				name==GradientEnum ||
+ 				name==OldGradientEnum  ||
+ 				name==ConvergedEnum || 
+@@ -1211,7 +1211,7 @@
+ 				break;
+ 			case CalvingratexEnum:
+ 			case CalvingrateyEnum:
+-			case MasstransportCalvingrateEnum:
++			case CalvingCalvingrateEnum:
+ 				this->StrainRateparallel();
+ 				this->StrainRateperpendicular();
+ 				this->CalvingRateLevermann();
Index: /issm/oecreview/Archive/18296-19100/ISSM-18758-18759.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18758-18759.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18758-18759.diff	(revision 19102)
@@ -0,0 +1,199 @@
+Index: ../trunk-jpl/src/m/enum/MasstransportIscalvingrateEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MasstransportIscalvingrateEnum.m	(revision 18758)
++++ ../trunk-jpl/src/m/enum/MasstransportIscalvingrateEnum.m	(revision 18759)
+@@ -1,11 +0,0 @@
+-function macro=MasstransportIscalvingrateEnum()
+-%MASSTRANSPORTISCALVINGRATEENUM - Enum of MasstransportIscalvingrate
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=MasstransportIscalvingrateEnum()
+-
+-macro=StringToEnum('MasstransportIscalvingrate');
+Index: ../trunk-jpl/src/m/enum/MasstransportCalvingrateEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MasstransportCalvingrateEnum.m	(revision 18758)
++++ ../trunk-jpl/src/m/enum/MasstransportCalvingrateEnum.m	(revision 18759)
+@@ -1,11 +0,0 @@
+-function macro=MasstransportCalvingrateEnum()
+-%MASSTRANSPORTCALVINGRATEENUM - Enum of MasstransportCalvingrate
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=MasstransportCalvingrateEnum()
+-
+-macro=StringToEnum('MasstransportCalvingrate');
+Index: ../trunk-jpl/src/m/enum/MasstransportLevermannCalvingCoeffEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MasstransportLevermannCalvingCoeffEnum.m	(revision 18758)
++++ ../trunk-jpl/src/m/enum/MasstransportLevermannCalvingCoeffEnum.m	(revision 18759)
+@@ -1,11 +0,0 @@
+-function macro=MasstransportLevermannCalvingCoeffEnum()
+-%MASSTRANSPORTLEVERMANNCALVINGCOEFFENUM - Enum of MasstransportLevermannCalvingCoeff
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=MasstransportLevermannCalvingCoeffEnum()
+-
+-macro=StringToEnum('MasstransportLevermannCalvingCoeff');
+Index: ../trunk-jpl/src/m/enum/CalvingLawEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingLawEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvingLawEnum.m	(revision 18759)
+@@ -0,0 +1,11 @@
++function macro=CalvingLawEnum()
++%CALVINGLAWENUM - Enum of CalvingLaw
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvingLawEnum()
++
++macro=StringToEnum('CalvingLaw');
+Index: ../trunk-jpl/src/m/enum/TransientIscalvingEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/TransientIscalvingEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/TransientIscalvingEnum.m	(revision 18759)
+@@ -0,0 +1,11 @@
++function macro=TransientIscalvingEnum()
++%TRANSIENTISCALVINGENUM - Enum of TransientIscalving
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=TransientIscalvingEnum()
++
++macro=StringToEnum('TransientIscalving');
+Index: ../trunk-jpl/src/m/enum/CalvingLevermannEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingLevermannEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvingLevermannEnum.m	(revision 18759)
+@@ -0,0 +1,11 @@
++function macro=CalvingLevermannEnum()
++%CALVINGLEVERMANNENUM - Enum of CalvingLevermann
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvingLevermannEnum()
++
++macro=StringToEnum('CalvingLevermann');
+Index: ../trunk-jpl/src/m/enum/CalvingCalvingrateEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingCalvingrateEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvingCalvingrateEnum.m	(revision 18759)
+@@ -0,0 +1,11 @@
++function macro=CalvingCalvingrateEnum()
++%CALVINGCALVINGRATEENUM - Enum of CalvingCalvingrate
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvingCalvingrateEnum()
++
++macro=StringToEnum('CalvingCalvingrate');
+Index: ../trunk-jpl/src/m/enum/CalvingRequestedOutputsEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingRequestedOutputsEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvingRequestedOutputsEnum.m	(revision 18759)
+@@ -0,0 +1,11 @@
++function macro=CalvingRequestedOutputsEnum()
++%CALVINGREQUESTEDOUTPUTSENUM - Enum of CalvingRequestedOutputs
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvingRequestedOutputsEnum()
++
++macro=StringToEnum('CalvingRequestedOutputs');
+Index: ../trunk-jpl/src/m/enum/CalvinglevermannCoeffEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvinglevermannCoeffEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvinglevermannCoeffEnum.m	(revision 18759)
+@@ -0,0 +1,11 @@
++function macro=CalvinglevermannCoeffEnum()
++%CALVINGLEVERMANNCOEFFENUM - Enum of CalvinglevermannCoeff
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvinglevermannCoeffEnum()
++
++macro=StringToEnum('CalvinglevermannCoeff');
+Index: ../trunk-jpl/src/m/enum/DefaultCalvingEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/DefaultCalvingEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/DefaultCalvingEnum.m	(revision 18759)
+@@ -0,0 +1,11 @@
++function macro=DefaultCalvingEnum()
++%DEFAULTCALVINGENUM - Enum of DefaultCalving
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=DefaultCalvingEnum()
++
++macro=StringToEnum('DefaultCalving');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18758)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18759)
+@@ -208,6 +208,12 @@
+ def DamageEnum(): return StringToEnum("Damage")[0]
+ def NewDamageEnum(): return StringToEnum("NewDamage")[0]
+ def StressIntensityFactorEnum(): return StringToEnum("StressIntensityFactor")[0]
++def CalvingLawEnum(): return StringToEnum("CalvingLaw")[0]
++def CalvingCalvingrateEnum(): return StringToEnum("CalvingCalvingrate")[0]
++def CalvingLevermannEnum(): return StringToEnum("CalvingLevermann")[0]
++def DefaultCalvingEnum(): return StringToEnum("DefaultCalving")[0]
++def CalvingRequestedOutputsEnum(): return StringToEnum("CalvingRequestedOutputs")[0]
++def CalvinglevermannCoeffEnum(): return StringToEnum("CalvinglevermannCoeff")[0]
+ def CalvingratexEnum(): return StringToEnum("Calvingratex")[0]
+ def CalvingrateyEnum(): return StringToEnum("Calvingratey")[0]
+ def CalvingratexAverageEnum(): return StringToEnum("CalvingratexAverage")[0]
+@@ -249,13 +255,10 @@
+ def Domain3DEnum(): return StringToEnum("Domain3D")[0]
+ def MiscellaneousNameEnum(): return StringToEnum("MiscellaneousName")[0]
+ def MasstransportHydrostaticAdjustmentEnum(): return StringToEnum("MasstransportHydrostaticAdjustment")[0]
+-def MasstransportIscalvingrateEnum(): return StringToEnum("MasstransportIscalvingrate")[0]
+-def MasstransportLevermannCalvingCoeffEnum(): return StringToEnum("MasstransportLevermannCalvingCoeff")[0]
+ def MasstransportIsfreesurfaceEnum(): return StringToEnum("MasstransportIsfreesurface")[0]
+ def MasstransportMinThicknessEnum(): return StringToEnum("MasstransportMinThickness")[0]
+ def MasstransportPenaltyFactorEnum(): return StringToEnum("MasstransportPenaltyFactor")[0]
+ def MasstransportSpcthicknessEnum(): return StringToEnum("MasstransportSpcthickness")[0]
+-def MasstransportCalvingrateEnum(): return StringToEnum("MasstransportCalvingrate")[0]
+ def MasstransportStabilizationEnum(): return StringToEnum("MasstransportStabilization")[0]
+ def MasstransportVertexPairingEnum(): return StringToEnum("MasstransportVertexPairing")[0]
+ def MasstransportNumRequestedOutputsEnum(): return StringToEnum("MasstransportNumRequestedOutputs")[0]
+@@ -313,6 +316,7 @@
+ def TransientIsgiaEnum(): return StringToEnum("TransientIsgia")[0]
+ def TransientIsdamageevolutionEnum(): return StringToEnum("TransientIsdamageevolution")[0]
+ def TransientIshydrologyEnum(): return StringToEnum("TransientIshydrology")[0]
++def TransientIscalvingEnum(): return StringToEnum("TransientIscalving")[0]
+ def TransientNumRequestedOutputsEnum(): return StringToEnum("TransientNumRequestedOutputs")[0]
+ def TransientRequestedOutputsEnum(): return StringToEnum("TransientRequestedOutputs")[0]
+ def PotentialEnum(): return StringToEnum("Potential")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18759-18760.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18759-18760.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18759-18760.diff	(revision 19102)
@@ -0,0 +1,43 @@
+Index: ../trunk-jpl/test/Par/ValleyGlacierShelf.par
+===================================================================
+--- ../trunk-jpl/test/Par/ValleyGlacierShelf.par	(revision 18759)
++++ ../trunk-jpl/test/Par/ValleyGlacierShelf.par	(revision 18760)
+@@ -74,7 +74,7 @@
+ md.stressbalance.abstol = NaN;
+ 
+ %Masstransport;
+-md.masstransport.calvingrate = 0.*ones(md.mesh.numberofvertices,1);
++md.calving.calvingrate = 0.*ones(md.mesh.numberofvertices,1);
+ md.masstransport.stabilization = 1.;
+ 
+ %Numerical parameters
+Index: ../trunk-jpl/test/NightlyRun/test804.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test804.m	(revision 18759)
++++ ../trunk-jpl/test/NightlyRun/test804.m	(revision 18760)
+@@ -11,8 +11,9 @@
+ md.transient.isthermal=0;
+ md.transient.isgroundingline=1;
+ md.transient.isgia=0;
++md.transient.iscalving=1;
+ 
+-md.masstransport.calvingrate=1000.*ones(md.mesh.numberofvertices,1);
++md.calving.calvingrate=1000.*ones(md.mesh.numberofvertices,1);
+ 
+ md=solve(md,TransientSolutionEnum());
+ 
+Index: ../trunk-jpl/test/NightlyRun/test805.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test805.m	(revision 18759)
++++ ../trunk-jpl/test/NightlyRun/test805.m	(revision 18760)
+@@ -18,8 +18,9 @@
+ md.transient.isthermal=1;
+ md.transient.isgroundingline=1;
+ md.transient.isgia=0;
++md.transient.iscalving=1;
+ 
+-md.masstransport.calvingrate=1000.*ones(md.mesh.numberofvertices,1);
++md.calving.calvingrate=1000.*ones(md.mesh.numberofvertices,1);
+ 
+ md=solve(md,TransientSolutionEnum());
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18760-18761.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18760-18761.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18760-18761.diff	(revision 19102)
@@ -0,0 +1,29 @@
+Index: ../trunk-jpl/test/Par/SquareSheetConstrained.par
+===================================================================
+--- ../trunk-jpl/test/Par/SquareSheetConstrained.par	(revision 18760)
++++ ../trunk-jpl/test/Par/SquareSheetConstrained.par	(revision 18761)
+@@ -29,7 +29,8 @@
+ md.materials.rheology_B=paterson(md.initialization.temperature);
+ md.materials.rheology_n=3.*ones(md.mesh.numberofelements,1);
+ 
+-md.masstransport.calvingrate=zeros(md.mesh.numberofvertices,1);
++%Calving
++md.calving.calvingrate=zeros(md.mesh.numberofvertices,1);
+ 
+ %Friction
+ md.friction.coefficient=20.*ones(md.mesh.numberofvertices,1);
+Index: ../trunk-jpl/test/Par/SquareSheetConstrained.py
+===================================================================
+--- ../trunk-jpl/test/Par/SquareSheetConstrained.py	(revision 18760)
++++ ../trunk-jpl/test/Par/SquareSheetConstrained.py	(revision 18761)
+@@ -39,8 +39,8 @@
+ md.materials.rheology_B=paterson(md.initialization.temperature)
+ md.materials.rheology_n=3.*numpy.ones((md.mesh.numberofelements,1))
+ 
+-#Masstransport
+-md.masstransport.calvingrate=0.*numpy.ones((md.mesh.numberofvertices,1))
++#Calving
++md.calvingrate.calvingrate=0.*numpy.ones((md.mesh.numberofvertices,1))
+ 
+ #Friction
+ md.friction.coefficient=20.*numpy.ones((md.mesh.numberofvertices,1))
Index: /issm/oecreview/Archive/18296-19100/ISSM-18761-18762.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18761-18762.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18761-18762.diff	(revision 19102)
@@ -0,0 +1,43 @@
+Index: ../trunk-jpl/test/Par/ValleyGlacierShelf.py
+===================================================================
+--- ../trunk-jpl/test/Par/ValleyGlacierShelf.py	(revision 18761)
++++ ../trunk-jpl/test/Par/ValleyGlacierShelf.py	(revision 18762)
+@@ -81,7 +81,7 @@
+ md.stressbalance.abstol=float('nan')
+ 
+ #Masstransport
+-md.masstransport.calvingrate=0.*numpy.ones((md.mesh.numberofvertices,1))
++md.calving.calvingrate=0.*numpy.ones((md.mesh.numberofvertices,1))
+ md.masstransport.stabilization=1.
+ 
+ #Numerical parameters
+Index: ../trunk-jpl/test/NightlyRun/test804.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test804.py	(revision 18761)
++++ ../trunk-jpl/test/NightlyRun/test804.py	(revision 18762)
+@@ -21,8 +21,9 @@
+ md.transient.isthermal=False
+ md.transient.isgroundingline=True
+ md.transient.isgia=False
++md.transient.iscalving=True;
+ 
+-md.masstransport.calvingrate=1000.*numpy.ones((md.mesh.numberofvertices,1))
++md.calving.calvingrate=1000.*numpy.ones((md.mesh.numberofvertices,1))
+ 
+ md=solve(md,TransientSolutionEnum())
+ 
+Index: ../trunk-jpl/test/NightlyRun/test805.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test805.py	(revision 18761)
++++ ../trunk-jpl/test/NightlyRun/test805.py	(revision 18762)
+@@ -28,8 +28,9 @@
+ md.transient.isthermal=True
+ md.transient.isgroundingline=True
+ md.transient.isgia=False
++md.transient.iscalving=True;
+ 
+-md.masstransport.calvingrate=1000.*numpy.ones((md.mesh.numberofvertices,1))
++md.calving.calvingrate=1000.*numpy.ones((md.mesh.numberofvertices,1))
+ 
+ md=solve(md,TransientSolutionEnum())
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18762-18763.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18762-18763.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18762-18763.diff	(revision 19102)
@@ -0,0 +1,67 @@
+Index: ../trunk-jpl/src/m/classes/transient.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/transient.py	(revision 18762)
++++ ../trunk-jpl/src/m/classes/transient.py	(revision 18763)
+@@ -19,6 +19,7 @@
+ 		self.isgia             = False
+ 		self.isdamageevolution = False
+ 		self.islevelset        = False
++		self.iscalving         = False
+ 		self.ishydrology       = False
+ 		self.requested_outputs = []
+ 
+@@ -35,6 +36,7 @@
+ 		string="%s\n%s"%(string,fielddisplay(self,'isgia','indicates if a postglacial rebound is used in the transient'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'isdamageevolution','indicates whether damage evolution is used in the transient'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'islevelset','LEVELSET METHOD DESCRIPTION'))
++		string="%s\n%s"%(string,fielddisplay(self,'iscalving','indicates whether calving is used in the transient'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'ishydrology','indicates whether an hydrology model is used'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'requested_outputs','list of additional outputs requested'))
+ 		return string
+@@ -50,14 +52,15 @@
+ 	def setallnullparameters(self): # {{{
+ 		
+ 		#Nothing done
+-		self.ismasstransport = False
+-		self.isstressbalance = False
+-		self.isthermal       = False
+-		self.isgroundingline = False
+-		self.isgia           = False
++		self.ismasstransport   = False
++		self.isstressbalance   = False
++		self.isthermal         = False
++		self.isgroundingline   = False
++		self.isgia             = False
+ 		self.isdamageevolution = False
+-		self.islevelset      = False
+-		self.ishydrology     = False
++		self.islevelset        = False
++		self.iscalving         = False
++		self.ishydrology       = False
+ 
+ 		#default output
+ 		self.requested_outputs=[]
+@@ -73,6 +76,7 @@
+ 		self.isgia           = False
+ 		self.isdamageevolution = False
+ 		self.islevelset      = False
++		self.iscalving       = False
+ 		self.ishydrology     = False
+ 
+ 		#default output
+@@ -93,6 +97,7 @@
+ 		md = checkfield(md,'fieldname','transient.isdamageevolution','numel',[1],'values',[0,1])
+ 		md = checkfield(md,'fieldname','transient.islevelset','numel',[1],'values',[0,1])
+ 		md = checkfield(md,'fieldname','transient.ishydrology','numel',[1],'values',[0,1])
++		md = checkfield(md,'fieldname','transient.iscalving','numel',[1],'values',[0,1]);
+ 		md = checkfield(md,'fieldname','transient.requested_outputs','stringrow',1)
+ 
+ 		return md
+@@ -106,6 +111,7 @@
+ 		WriteData(fid,'object',self,'fieldname','isdamageevolution','format','Boolean')
+ 		WriteData(fid,'object',self,'fieldname','islevelset','format','Boolean')
+ 		WriteData(fid,'object',self,'fieldname','ishydrology','format','Boolean')
++		WriteData(fid,'object',self,'fieldname','iscalving','format','Boolean')
+ 
+ 		#process requested outputs
+ 		outputs = self.requested_outputs
Index: /issm/oecreview/Archive/18296-19100/ISSM-18763-18764.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18763-18764.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18763-18764.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp	(revision 18763)
++++ ../trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp	(revision 18764)
+@@ -114,7 +114,7 @@
+ 
+ 	/*Clean up and return*/
+ 	delete vec_mask_ice;
+-	delete mask_ice;
++	xDelete<IssmDouble>(mask_ice);
+ 
+ }/*}}}*/
+ void SetMaskOfIceElement(Vector<IssmDouble>* vec_mask_ice, Element* element){/*{{{*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18764-18765.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18764-18765.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18764-18765.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/test/Par/SquareSheetConstrained.py
+===================================================================
+--- ../trunk-jpl/test/Par/SquareSheetConstrained.py	(revision 18764)
++++ ../trunk-jpl/test/Par/SquareSheetConstrained.py	(revision 18765)
+@@ -40,7 +40,7 @@
+ md.materials.rheology_n=3.*numpy.ones((md.mesh.numberofelements,1))
+ 
+ #Calving
+-md.calvingrate.calvingrate=0.*numpy.ones((md.mesh.numberofvertices,1))
++md.calving.calvingrate=0.*numpy.ones((md.mesh.numberofvertices,1))
+ 
+ #Friction
+ md.friction.coefficient=20.*numpy.ones((md.mesh.numberofvertices,1))
Index: /issm/oecreview/Archive/18296-19100/ISSM-18765-18766.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18765-18766.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18765-18766.diff	(revision 19102)
@@ -0,0 +1,112 @@
+Index: ../trunk-jpl/src/m/classes/calving.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/calving.py	(revision 18765)
++++ ../trunk-jpl/src/m/classes/calving.py	(revision 18766)
+@@ -25,11 +25,6 @@
+ 
+ 		return string
+ 		#}}}
+-	def defaultoutputs(self,md): # {{{
+-
+-		return []
+-
+-	#}}}
+ 	def setdefaultparameters(self): # {{{
+ 
+ 		return self
+Index: ../trunk-jpl/src/m/classes/calvinglevermann.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvinglevermann.py	(revision 0)
++++ ../trunk-jpl/src/m/classes/calvinglevermann.py	(revision 18766)
+@@ -0,0 +1,45 @@
++from fielddisplay import fielddisplay
++from EnumDefinitions import *
++from StringToEnum import StringToEnum
++from checkfield import checkfield
++from WriteData import WriteData
++
++class calvinglevermann(object):
++	"""
++	CALVINGLEVERMANN class definition
++
++	   Usage:
++	      calvinglevermann=calvinglevermann();
++	"""
++
++	def __init__(self): # {{{
++		self.coeff = float('NaN')
++
++		#set defaults
++		self.setdefaultparameters()
++
++		#}}}
++	def __repr__(self): # {{{
++		string='   Calving Levermann parameters:'
++		string="%s\n%s"%(string,fielddisplay(self,'coeff','proportionality coefficient in Levermann model'))
++
++		return string
++		#}}}
++	def setdefaultparameters(self): # {{{
++
++		#Proportionality coefficient in Levermann model
++		self.coeff=2e13;
++	#}}}
++	def checkconsistency(self,md,solution,analyses):    # {{{
++
++		#Early return
++		if (solution!=TransientSolutionEnum()) or (not md.transient.iscalvinglevermann):
++			return md
++
++		md = checkfield(md,'fieldname','calving.coeff','NaN',1,'size',[md.mesh.numberofvertices],'>',0)
++		return md
++	# }}}
++	def marshall(self,md,fid):    # {{{
++		WriteData(fid,'enum',CalvingLawEnum(),'data',CalvingLevermannEnum(),'format','Integer');
++		WriteData(fid,'enum',CalvinglevermannCoeffEnum(),'data',self.coeff,'format','DoubleMat','mattype',1)
++	# }}}
+Index: ../trunk-jpl/src/m/classes/calvinglevermann.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvinglevermann.m	(revision 18765)
++++ ../trunk-jpl/src/m/classes/calvinglevermann.m	(revision 18766)
+@@ -5,7 +5,7 @@
+ 
+ classdef calvinglevermann
+ 	properties (SetAccess=public) 
+-		 coeff                  = 0;
++		 coeff = NaN;
+ 	end
+ 	methods
+ 		function obj = calvinglevermann(varargin) % {{{
+@@ -36,7 +36,7 @@
+ 			md = checkfield(md,'fieldname','calving.coeff','>',0,'size',[md.mesh.numberofvertices 1]);
+ 		end % }}}
+ 		function disp(obj) % {{{
+-			disp(sprintf('   Calving parameters:'));
++			disp(sprintf('   Calving Levermann parameters:'));
+ 			fielddisplay(obj,'coeff','proportionality coefficient in Levermann model');
+ 
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/model.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.py	(revision 18765)
++++ ../trunk-jpl/src/m/classes/model.py	(revision 18766)
+@@ -15,6 +15,7 @@
+ from basalforcings import basalforcings
+ from matice import matice
+ from calving import calving
++from calvinglevermann import calvinglevermann
+ from damage import damage
+ from friction import friction
+ from flowequation import flowequation
+@@ -663,9 +664,9 @@
+ 		md.stressbalance.loadingforce=project3d(md,'vector',md.stressbalance.loadingforce,'type','node')
+ 
+ 		# Calving variables
+-		if hasattr(md.calving,'calving'):
++		if isinstance(md.calving,calving):
+ 			md.calving.calvingrate=project3d(md,'vector',md.calving.calvingrate,'type','node')
+-		if hasattr(md.calving,'calvinglevermann'):
++		if isinstance(md.calving,calvinglevermann):
+ 			md.calving.coeff=project3d(md,'vector',md.calving.coeff,'type','node')
+ 
+ 		# Hydrologydc variables
Index: /issm/oecreview/Archive/18296-19100/ISSM-18766-18767.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18766-18767.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18766-18767.diff	(revision 19102)
@@ -0,0 +1,73 @@
+Index: ../trunk-jpl/test/NightlyRun/test431.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test431.py	(revision 18766)
++++ ../trunk-jpl/test/NightlyRun/test431.py	(revision 18767)
+@@ -22,8 +22,8 @@
+ md=solve(md,SteadystateSolutionEnum())
+ 
+ #Fields and tolerances to track changes
+-field_names     =['Vx','Vy','Vz','Vel','Pressure','Temperature','Water fraction','Enthalpy']
+-field_tolerances=[1e-10,1e-10,1e-09,1e-10,1e-13,1e-10,1e-10,2e-10]
++field_names     =['Vx','Vy','Vz','Vel','Pressure','Temperature','Waterfraction','Enthalpy']
++field_tolerances=[8e-5,5e-5,5e-5,5e-5,1e-13,1e-5,5e-5,5e-5]
+ field_values=[\
+ 	md.results.SteadystateSolution.Vx,\
+ 	md.results.SteadystateSolution.Vy,\
+Index: ../trunk-jpl/test/NightlyRun/test436.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test436.m	(revision 18766)
++++ ../trunk-jpl/test/NightlyRun/test436.m	(revision 18767)
+@@ -12,8 +12,8 @@
+ md=solve(md,SteadystateSolutionEnum());
+ 
+ %Fields and tolerances to track changes
+-field_names     ={'Vx','Vy','Vz','Vel','Pressure','Temperature','Water fraction','Enthalpy'};
+-field_tolerances={2e-09,1e-09,1e-09,1e-09,1e-13,1e-10,1e-10,5e-10};
++field_names     ={'Vx','Vy','Vz','Vel','Pressure','Temperature','Waterfraction','Enthalpy'};
++field_tolerances={2e-09,1e-09,1e-09,1e-09,1e-13,1e-10,5e-10,5e-10};
+ field_values={...
+ 	(md.results.SteadystateSolution.Vx),...
+ 	(md.results.SteadystateSolution.Vy),...
+Index: ../trunk-jpl/test/NightlyRun/test432.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test432.py	(revision 18766)
++++ ../trunk-jpl/test/NightlyRun/test432.py	(revision 18767)
+@@ -21,8 +21,8 @@
+ md=solve(md,SteadystateSolutionEnum())
+ 
+ #Fields and tolerances to track changes
+-field_names     =['Vx','Vy','Vz','Vel','Pressure','Temperature','Water fraction','Enthalpy']
+-field_tolerances=[1e-09,1e-09,1e-09,1e-09,1e-13,1e-10,1e-10,2e-10]
++field_names     =['Vx','Vy','Vz','Vel','Pressure','Temperature','Waterfraction','Enthalpy']
++field_tolerances=[3e-09,1e-09,1e-09,1e-09,1e-13,1e-10,3e-10,3e-10]
+ field_values=[\
+ 	md.results.SteadystateSolution.Vx,\
+ 	md.results.SteadystateSolution.Vy,\
+Index: ../trunk-jpl/test/NightlyRun/test431.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test431.m	(revision 18766)
++++ ../trunk-jpl/test/NightlyRun/test431.m	(revision 18767)
+@@ -12,8 +12,8 @@
+ md=solve(md,SteadystateSolutionEnum());
+ 
+ %Fields and tolerances to track changes
+-field_names     ={'Vx','Vy','Vz','Vel','Pressure','Temperature','Water fraction','Enthalpy'};
+-field_tolerances={3e-10,1e-10,1e-09,1e-10,1e-13,1e-10,1e-10,2e-10};
++field_names     ={'Vx','Vy','Vz','Vel','Pressure','Temperature','Waterfraction','Enthalpy'};
++field_tolerances={8e-5,5e-5,5e-5,5e-5,1e-13,1e-5,5e-5,5e-5};
+ field_values={...
+ 	(md.results.SteadystateSolution.Vx),...
+ 	(md.results.SteadystateSolution.Vy),...
+Index: ../trunk-jpl/test/NightlyRun/test432.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test432.m	(revision 18766)
++++ ../trunk-jpl/test/NightlyRun/test432.m	(revision 18767)
+@@ -11,7 +11,7 @@
+ md=solve(md,SteadystateSolutionEnum());
+ 
+ %Fields and tolerances to track changes
+-field_names     ={'Vx','Vy','Vz','Vel','Pressure','Temperature','Water fraction','Enthalpy'};
++field_names     ={'Vx','Vy','Vz','Vel','Pressure','Temperature','Waterfraction','Enthalpy'};
+ field_tolerances={3e-09,1e-09,1e-09,1e-09,1e-13,1e-10,3e-10,3e-10};
+ field_values={...
+ 	(md.results.SteadystateSolution.Vx),...
Index: /issm/oecreview/Archive/18296-19100/ISSM-18767-18768.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18767-18768.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18767-18768.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/test/NightlyRun/test340.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test340.m	(revision 18767)
++++ ../trunk-jpl/test/NightlyRun/test340.m	(revision 18768)
+@@ -21,7 +21,7 @@
+ 
+ %Fields and tolerances to track changes
+ field_names     ={'Gradient','Misfits','FrictionCoefficient','Pressure','Vel','Vx','Vy'};
+-field_tolerances={3e-08,1e-07,1e-10,1e-10,1e-09,1e-09,1e-09};
++field_tolerances={3e-08,1e-07,5e-10,1e-10,1e-09,1e-09,1e-09};
+ field_values={...
+ 	(md.results.StressbalanceSolution.Gradient1),...
+ 	(md.results.StressbalanceSolution.J),...
Index: /issm/oecreview/Archive/18296-19100/ISSM-18768-18769.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18768-18769.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18768-18769.diff	(revision 19102)
@@ -0,0 +1,11 @@
+Index: ../trunk-jpl/packagers/ubuntu/package.sh
+===================================================================
+--- ../trunk-jpl/packagers/ubuntu/package.sh	(revision 18768)
++++ ../trunk-jpl/packagers/ubuntu/package.sh	(revision 18769)
+@@ -31,4 +31,6 @@
+ ls -lah $tarball_name
+ 
+ echo "Shipping binaries to website"
++cp $tarball_name /u/astrid-r1b/morlighe/public/
++chmod 777 /u/astrid-r1b/morlighe/public/$tarball_name
+ scp $tarball_name websites.jpl.nasa.gov:/home/larour/files/$tarball_name
Index: /issm/oecreview/Archive/18296-19100/ISSM-18769-18770.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18769-18770.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18769-18770.diff	(revision 19102)
@@ -0,0 +1,152 @@
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.h	(revision 18769)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.h	(revision 18770)
+@@ -33,6 +33,7 @@
+ 		void  GetAlpha2Weertman(IssmDouble* palpha2,Gauss* gauss);
+ 		void  GetAlpha2Hydro(IssmDouble* palpha2,Gauss* gauss);
+ 		void  GetAlpha2Temp(IssmDouble* palpha2,Gauss* gauss);
++		void  GetAlpha2WaterLayer(IssmDouble* palpha2,Gauss* gauss);
+ 		void  GetAlphaComplement(IssmDouble* alpha_complement,Gauss* gauss);
+ };
+ 
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18769)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18770)
+@@ -54,6 +54,9 @@
+ 		case 4:
+ 			GetAlpha2Temp(palpha2,gauss);
+ 			break;
++		case 5:
++			GetAlpha2WaterLayer(palpha2,gauss);
++			break;
+ 	  default:
+ 			_error_("not supported");
+ 	}
+@@ -249,6 +252,66 @@
+ 	/*Assign output pointers:*/
+ 	*palpha2=alpha2;
+ }/*}}}*/
++void Friction::GetAlpha2WaterLayer(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
++
++	/*This routine calculates the basal friction coefficient 
++	  alpha2= drag^2 * Neff ^r * | vel | ^(s-1), with Neff=rho_ice*g*thickness+rho_ice*g*bed, r=q/p and s=1/p**/
++
++	/*diverse: */
++	IssmDouble  r,s;
++	IssmDouble  drag_p, drag_q;
++	IssmDouble  Neff;
++	IssmDouble  thickness,bed;
++	IssmDouble  vx,vy,vz,vmag;
++	IssmDouble  drag_coefficient;
++	IssmDouble  alpha2;
++
++	/*Recover parameters: */
++	element->GetInputValue(&drag_p,FrictionPEnum);
++	element->GetInputValue(&drag_q,FrictionQEnum);
++	element->GetInputValue(&thickness, gauss,ThicknessEnum);
++	element->GetInputValue(&bed, gauss,BaseEnum);
++	element->GetInputValue(&drag_coefficient, gauss,FrictionCoefficientEnum);
++	IssmDouble rho_water   = element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
++	IssmDouble rho_ice     = element->GetMaterialParameter(MaterialsRhoIceEnum);
++	IssmDouble gravity     = element->GetMaterialParameter(ConstantsGEnum);
++
++	//compute r and q coefficients: */
++	r=drag_q/drag_p;
++	s=1./drag_p;
++
++	//From bed and thickness, compute effective pressure when drag is viscous:
++	Neff=gravity*(rho_ice*thickness+rho_water*bed);
++	if(Neff<0)Neff=0;
++
++	switch(dim){
++		case 1:
++			element->GetInputValue(&vx,gauss,VxEnum);
++			vmag=sqrt(vx*vx);
++			break;
++		case 2:
++			element->GetInputValue(&vx,gauss,VxEnum);
++			element->GetInputValue(&vy,gauss,VyEnum);
++			vmag=sqrt(vx*vx+vy*vy);
++			break;
++		case 3:
++			element->GetInputValue(&vx,gauss,VxEnum);
++			element->GetInputValue(&vy,gauss,VyEnum);
++			element->GetInputValue(&vz,gauss,VzEnum);
++			vmag=sqrt(vx*vx+vy*vy+vz*vz);
++			break;
++		default:
++			_error_("not supported");
++	}
++
++	/*Check to prevent dividing by zero if vmag==0*/
++	if(vmag==0. && (s-1.)<0.) alpha2=0.;
++	else alpha2=drag_coefficient*drag_coefficient*pow(Neff,r)*pow(vmag,(s-1.));
++	_assert_(!xIsNan<IssmDouble>(alpha2));
++
++	/*Assign output pointers:*/
++	*palpha2=alpha2;
++}/*}}}*/
+ void Friction::GetAlphaComplement(IssmDouble* palpha_complement, Gauss* gauss){/*{{{*/
+ 
+ 	/* FrictionGetAlpha2 computes alpha2= drag^2 * Neff ^r * vel ^s, with Neff=rho_ice*g*thickness+rho_ice*g*bed, r=q/p and s=1/p. 
+Index: ../trunk-jpl/src/m/classes/frictionwaterlayer.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionwaterlayer.m	(revision 0)
++++ ../trunk-jpl/src/m/classes/frictionwaterlayer.m	(revision 18770)
+@@ -0,0 +1,54 @@
++%FRICTIONWATERLAYER class definition
++%
++%   Usage:
++%      frictionwaterlayer=frictionwaterlayer();
++
++classdef frictiontemp
++	properties (SetAccess=public) 
++		coefficient = NaN;
++		p           = NaN;
++		q           = NaN;
++		water_layer = NaN;
++	end
++	methods
++		function obj = frictionwaterlayer(varargin) % {{{
++			switch nargin
++				case 0
++					obj=setdefaultparameters(obj);
++				case 1
++					obj=structtoobj(frictiontemp(),varargin{1});
++				otherwise
++					error('constructor not supported');
++			end
++		end % }}}
++		function obj = setdefaultparameters(obj) % {{{
++
++		end % }}}
++		function md = checkconsistency(obj,md,solution,analyses) % {{{
++
++			%Early return
++			if ~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(ThermalAnalysisEnum(),analyses), return; end
++
++			md = checkfield(md,'fieldname','friction.coefficient','forcing',1,'NaN',1);
++			md = checkfield(md,'fieldname','friction.q','NaN',1,'size',[md.mesh.numberofelements 1]);
++			md = checkfield(md,'fieldname','friction.p','NaN',1,'size',[md.mesh.numberofelements 1]);
++			md = checkfield(md,'fieldname','thermal.spctemperature','forcing',1,'>=',0.);
++
++		end % }}}
++		function disp(obj) % {{{
++			disp(sprintf('Basal shear stress parameters: tau_b = coefficient^2 * Neff ^r * |u_b|^(s-1) * u_b * 1/f(T)\n(effective stress Neff=rho_ice*g*thickness+rho_water*g*(bed+water_layer), r=q/p and s=1/p)'));
++			fielddisplay(obj,'coefficient','frictiontemp coefficient [SI]');
++			fielddisplay(obj,'p','p exponent');
++			fielddisplay(obj,'q','q exponent');
++			fielddisplay(obj,'water_layer','water thickness at the base of the ice (m)');
++		end % }}}
++		function marshall(obj,md,fid) % {{{
++
++			WriteData(fid,'enum',FrictionLawEnum,'data',5,'format','Integer');
++			WriteData(fid,'class','friction','object',obj,'fieldname','coefficient','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'class','friction','object',obj,'fieldname','p','format','DoubleMat','mattype',2);
++			WriteData(fid,'class','friction','object',obj,'fieldname','q','format','DoubleMat','mattype',2);
++			WriteData(fid,'class','friction','object',obj,'fieldname','water_layer','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++		end % }}}
++	end
++end
Index: /issm/oecreview/Archive/18296-19100/ISSM-18770-18771.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18770-18771.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18770-18771.diff	(revision 19102)
@@ -0,0 +1,153 @@
+Index: ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 18770)
++++ ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 18771)
+@@ -41,6 +41,8 @@
+ 	switch(approximation){
+ 		case SSAApproximationEnum: 
+ 			return CreateKMatrixSSA(element);
++		case L1L2ApproximationEnum: 
++			return CreateKMatrixL1L2(element);
+ 		case HOApproximationEnum: 
+ 			return CreateKMatrixHO(element);
+ 		case FSApproximationEnum: 
+@@ -138,6 +140,23 @@
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 	return Ke;
+ }/*}}}*/
++ElementMatrix* AdjointHorizAnalysis::CreateKMatrixL1L2(Element* element){/*{{{*/
++
++	/*Intermediaries*/
++	bool incomplete_adjoint;
++
++	/*Initialize Jacobian with regular L1L2 (first part of the Gateau derivative)*/
++	StressbalanceAnalysis* analysis = new StressbalanceAnalysis();
++	ElementMatrix* Ke=analysis->CreateKMatrix(element);
++	delete analysis;
++
++	/*return*/
++	element->FindParam(&incomplete_adjoint,InversionIncompleteAdjointEnum);
++	if(!incomplete_adjoint){
++		_error_("Exact adjoint not supported yet for L1L2 model");
++	}
++	return Ke;
++}/*}}}*/
+ ElementMatrix* AdjointHorizAnalysis::CreateKMatrixHO(Element* element){/*{{{*/
+ 
+ 	/*Intermediaries */
+@@ -299,6 +318,8 @@
+ 	switch(approximation){
+ 		case SSAApproximationEnum: 
+ 			return CreatePVectorSSA(element);
++		case L1L2ApproximationEnum: 
++			return CreatePVectorL1L2(element);
+ 		case HOApproximationEnum: 
+ 			return CreatePVectorHO(element);
+ 		case FSApproximationEnum: 
+@@ -896,6 +917,11 @@
+ 	delete gauss;
+ 	return pe;
+ }/*}}}*/
++ElementVector* AdjointHorizAnalysis::CreatePVectorL1L2(Element* element){/*{{{*/
++
++	/*Same as SSA*/
++	return this->CreatePVectorSSA(element);
++}/*}}}*/
+ void AdjointHorizAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+@@ -945,6 +971,7 @@
+ 		case FrictionCoefficientEnum:
+ 			switch(approximation){
+ 				case SSAApproximationEnum: GradientJDragSSA(element,gradient,control_index); break;
++				case L1L2ApproximationEnum:GradientJDragL1L2(element,gradient,control_index); break;
+ 				case HOApproximationEnum:  GradientJDragHO( element,gradient,control_index); break;
+ 				case FSApproximationEnum:  GradientJDragFS( element,gradient,control_index); break;
+ 				case NoneApproximationEnum: /*Gradient is 0*/                    break;
+@@ -954,6 +981,7 @@
+ 		case MaterialsRheologyBbarEnum:
+ 			switch(approximation){
+ 				case SSAApproximationEnum: GradientJBbarSSA(element,gradient,control_index); break;
++				case L1L2ApproximationEnum:GradientJBbarL1L2(element,gradient,control_index); break;
+ 				case HOApproximationEnum:  GradientJBbarHO( element,gradient,control_index); break;
+ 				case FSApproximationEnum:  GradientJBbarFS( element,gradient,control_index); break;
+ 				case NoneApproximationEnum: /*Gradient is 0*/                    break;
+@@ -1222,6 +1250,11 @@
+ 	delete friction;
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ }/*}}}*/
++void AdjointHorizAnalysis::GradientJDragL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++
++	/*Same as SSA*/
++	return this->GradientJDragSSA(element,gradient,control_index);
++}/*}}}*/
+ void AdjointHorizAnalysis::GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+ 	/*return if floating or not on bed (gradient is 0)*/
+@@ -1445,6 +1478,11 @@
+ 	delete gauss;
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ }/*}}}*/
++void AdjointHorizAnalysis::GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++
++	   /*Same as SSA*/
++	   return this->GradientJBbarSSA(element,gradient,control_index);
++}/*}}}*/
+ void AdjointHorizAnalysis::GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+ 	/*WARNING: We use SSA as an estimate for now*/
+Index: ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h	(revision 18770)
++++ ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h	(revision 18771)
+@@ -25,10 +25,12 @@
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrixSSA(Element* element);
++		ElementMatrix* CreateKMatrixL1L2(Element* element);
+ 		ElementMatrix* CreateKMatrixHO(Element* element);
+ 		ElementMatrix* CreateKMatrixFS(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+ 		ElementVector* CreatePVectorSSA(Element* element);
++		ElementVector* CreatePVectorL1L2(Element* element);
+ 		ElementVector* CreatePVectorHO(Element* element);
+ 		ElementVector* CreatePVectorFS(Element* element);
+ 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+@@ -36,9 +38,11 @@
+ 		void GradientJDragGradient(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void GradientJDragL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void GradientJDragFS(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void GradientJBbarSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void GradientJBbarFS(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void GradientJDSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
+Index: ../trunk-jpl/src/m/classes/inversion.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversion.py	(revision 18770)
++++ ../trunk-jpl/src/m/classes/inversion.py	(revision 18771)
+@@ -130,7 +130,7 @@
+ 
+ 		#Only SSA, HO and FS are supported right now
+ 		if solution==StressbalanceSolutionEnum():
+-			if not (md.flowequation.isSSA or md.flowequation.isHO or md.flowequation.isFS):
++			if not (md.flowequation.isSSA or md.flowequation.isHO or md.flowequation.isFS or md.flowequation.isL1L2):
+ 				md.checkmessage("'inversion can only be performed for SSA, HO or FS ice flow models");
+ 
+ 		if solution==BalancethicknessSolutionEnum():
+Index: ../trunk-jpl/src/m/classes/inversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversion.m	(revision 18770)
++++ ../trunk-jpl/src/m/classes/inversion.m	(revision 18771)
+@@ -145,7 +145,7 @@
+ 
+ 			%Only SSA, HO and FS are supported right now
+ 			if solution==StressbalanceSolutionEnum()
+-				if ~(md.flowequation.isSSA || md.flowequation.isHO || md.flowequation.isFS),
++				if ~(md.flowequation.isSSA || md.flowequation.isHO || md.flowequation.isFS || md.flowequation.isL1L2),
+ 					md = checkmessage(md,['inversion can only be performed for SSA, HO or FS ice flow models']);
+ 				end
+ 			end
Index: /issm/oecreview/Archive/18296-19100/ISSM-18771-18772.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18771-18772.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18771-18772.diff	(revision 19102)
@@ -0,0 +1,338 @@
+Index: ../trunk-jpl/test/NightlyRun/test438.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test438.m	(revision 0)
++++ ../trunk-jpl/test/NightlyRun/test438.m	(revision 18772)
+@@ -0,0 +1,37 @@
++md=triangle(model(),'../Exp/Square.exp',150000.);
++md=setmask(md,'../Exp/SquareShelf.exp','');
++md=parameterize(md,'../Par/SquareSheetShelf.par');
++md=setflowequation(md,'SSA','all');
++md.friction=frictionwaterlayer(md.friction);
++md.friction.water_layer=zeros(md.mesh.numberofvertices,2);
++md.friction.water_layer(:,2)=1;
++md.friction.water_layer(md.mesh.numberofvertices+1,:)=[1 2];
++md.cluster=generic('name',oshostname(),'np',3);
++md=solve(md,TransientSolutionEnum());
++
++%Fields and tolerances to track changes
++field_names     ={'Vx1','Vy1','Vel1','Pressure1','Bed1','Surface1','Thickness1','Vx2','Vy2','Vel2','Pressure2','Bed2','Surface2','Thickness2','Vx3','Vy3','Vel3','Pressure3','Bed3','Surface3','Thickness3'};
++field_tolerances={1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13};
++field_values={...
++	(md.results.TransientSolution(1).Vx),...
++	(md.results.TransientSolution(1).Vy),...
++	(md.results.TransientSolution(1).Vel),...
++	(md.results.TransientSolution(1).Pressure),...
++	(md.results.TransientSolution(1).Base),...
++	(md.results.TransientSolution(1).Surface),...
++	(md.results.TransientSolution(1).Thickness),...
++	(md.results.TransientSolution(2).Vx),...
++	(md.results.TransientSolution(2).Vy),...
++	(md.results.TransientSolution(2).Vel),...
++	(md.results.TransientSolution(2).Pressure),...
++	(md.results.TransientSolution(2).Base),...
++	(md.results.TransientSolution(2).Surface),...
++	(md.results.TransientSolution(2).Thickness),...
++	(md.results.TransientSolution(3).Vx),...
++	(md.results.TransientSolution(3).Vy),...
++	(md.results.TransientSolution(3).Vel),...
++	(md.results.TransientSolution(3).Pressure),...
++	(md.results.TransientSolution(3).Base),...
++	(md.results.TransientSolution(3).Surface),...
++	(md.results.TransientSolution(3).Thickness),...
++	};
+Index: ../trunk-jpl/test/NightlyRun/test439.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test439.m	(revision 0)
++++ ../trunk-jpl/test/NightlyRun/test439.m	(revision 18772)
+@@ -0,0 +1,38 @@
++md=triangle(model(),'../Exp/Square.exp',150000.);
++md=setmask(md,'../Exp/SquareShelf.exp','');
++md=parameterize(md,'../Par/SquareSheetShelf.par');
++md=extrude(md,4,1);
++md=setflowequation(md,'HO','all');
++md.friction=frictionwaterlayer(md.friction);
++md.friction.water_layer=zeros(md.mesh.numberofvertices,2);
++md.friction.water_layer(:,2)=1;
++md.friction.water_layer(md.mesh.numberofvertices+1,:)=[1 2];
++md.cluster=generic('name',oshostname(),'np',3);
++md=solve(md,TransientSolutionEnum());
++
++%Fields and tolerances to track changes
++field_names     ={'Vx1','Vy1','Vel1','Pressure1','Bed1','Surface1','Thickness1','Vx2','Vy2','Vel2','Pressure2','Bed2','Surface2','Thickness2','Vx3','Vy3','Vel3','Pressure3','Bed3','Surface3','Thickness3'};
++field_tolerances={1e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-09,1e-09};
++field_values={...
++	(md.results.TransientSolution(1).Vx),...
++	(md.results.TransientSolution(1).Vy),...
++	(md.results.TransientSolution(1).Vel),...
++	(md.results.TransientSolution(1).Pressure),...
++	(md.results.TransientSolution(1).Base),...
++	(md.results.TransientSolution(1).Surface),...
++	(md.results.TransientSolution(1).Thickness),...
++	(md.results.TransientSolution(2).Vx),...
++	(md.results.TransientSolution(2).Vy),...
++	(md.results.TransientSolution(2).Vel),...
++	(md.results.TransientSolution(2).Pressure),...
++	(md.results.TransientSolution(2).Base),...
++	(md.results.TransientSolution(2).Surface),...
++	(md.results.TransientSolution(2).Thickness),...
++	(md.results.TransientSolution(3).Vx),...
++	(md.results.TransientSolution(3).Vy),...
++	(md.results.TransientSolution(3).Vel),...
++	(md.results.TransientSolution(3).Pressure),...
++	(md.results.TransientSolution(3).Base),...
++	(md.results.TransientSolution(3).Surface),...
++	(md.results.TransientSolution(3).Thickness),...
++	};
+Index: ../trunk-jpl/test/Archives/Archive439.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive439.nc
+===================================================================
+--- ../trunk-jpl/test/Archives/Archive439.nc	(revision 18771)
++++ ../trunk-jpl/test/Archives/Archive439.nc	(revision 18772)
+
+Property changes on: ../trunk-jpl/test/Archives/Archive439.nc
+___________________________________________________________________
+Added: svn:mime-type
+## -0,0 +1 ##
++application/octet-stream
+\ No newline at end of property
+Index: ../trunk-jpl/test/Archives/Archive438.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive438.nc
+===================================================================
+--- ../trunk-jpl/test/Archives/Archive438.nc	(revision 18771)
++++ ../trunk-jpl/test/Archives/Archive438.nc	(revision 18772)
+
+Property changes on: ../trunk-jpl/test/Archives/Archive438.nc
+___________________________________________________________________
+Added: svn:mime-type
+## -0,0 +1 ##
++application/octet-stream
+\ No newline at end of property
+Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18771)
++++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18772)
+@@ -273,6 +273,12 @@
+ 			iomodel->FetchDataToInput(elements,PressureEnum);
+ 			iomodel->FetchDataToInput(elements,TemperatureEnum);
+ 			break;
++		case 5:
++			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
++			iomodel->FetchDataToInput(elements,FrictionPEnum);
++			iomodel->FetchDataToInput(elements,FrictionQEnum);
++			iomodel->FetchDataToInput(elements,FrictionWaterLayerEnum);
++			break;
+ 		default:
+ 			_error_("not supported");
+ 	}
+Index: ../trunk-jpl/src/c/analyses/ThermalAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/ThermalAnalysis.cpp	(revision 18771)
++++ ../trunk-jpl/src/c/analyses/ThermalAnalysis.cpp	(revision 18772)
+@@ -88,6 +88,12 @@
+ 			iomodel->FetchDataToInput(elements,FrictionCEnum);
+ 			iomodel->FetchDataToInput(elements,FrictionMEnum);
+ 			break;
++		case 5:
++			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
++			iomodel->FetchDataToInput(elements,FrictionPEnum);
++			iomodel->FetchDataToInput(elements,FrictionQEnum);
++			iomodel->FetchDataToInput(elements,FrictionWaterLayerEnum);
++			break;
+ 		default:
+ 			_error_("not supported");
+ 	}
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18771)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18772)
+@@ -107,6 +107,12 @@
+ 			iomodel->FetchDataToInput(elements,PressureEnum);
+ 			iomodel->FetchDataToInput(elements,TemperatureEnum);
+ 			break;
++		case 5:
++			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
++			iomodel->FetchDataToInput(elements,FrictionPEnum);
++			iomodel->FetchDataToInput(elements,FrictionQEnum);
++			iomodel->FetchDataToInput(elements,FrictionWaterLayerEnum);
++			break;
+ 		default:
+ 			_error_("not supported");
+ 	}
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18771)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18772)
+@@ -95,6 +95,7 @@
+ 	FrictionCEnum,
+ 	FrictionLawEnum,
+ 	FrictionGammaEnum,
++	FrictionWaterLayerEnum,
+ 	GeometryHydrostaticRatioEnum,
+ 	HydrologyModelEnum,
+ 	HydrologyshreveEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18771)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18772)
+@@ -103,6 +103,7 @@
+ 		case FrictionCEnum : return "FrictionC";
+ 		case FrictionLawEnum : return "FrictionLaw";
+ 		case FrictionGammaEnum : return "FrictionGamma";
++		case FrictionWaterLayerEnum : return "FrictionWaterLayer";
+ 		case GeometryHydrostaticRatioEnum : return "GeometryHydrostaticRatio";
+ 		case HydrologyModelEnum : return "HydrologyModel";
+ 		case HydrologyshreveEnum : return "Hydrologyshreve";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18771)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18772)
+@@ -103,6 +103,7 @@
+ 	      else if (strcmp(name,"FrictionC")==0) return FrictionCEnum;
+ 	      else if (strcmp(name,"FrictionLaw")==0) return FrictionLawEnum;
+ 	      else if (strcmp(name,"FrictionGamma")==0) return FrictionGammaEnum;
++	      else if (strcmp(name,"FrictionWaterLayer")==0) return FrictionWaterLayerEnum;
+ 	      else if (strcmp(name,"GeometryHydrostaticRatio")==0) return GeometryHydrostaticRatioEnum;
+ 	      else if (strcmp(name,"HydrologyModel")==0) return HydrologyModelEnum;
+ 	      else if (strcmp(name,"Hydrologyshreve")==0) return HydrologyshreveEnum;
+@@ -135,11 +136,11 @@
+ 	      else if (strcmp(name,"HydrologydcEplColapseThickness")==0) return HydrologydcEplColapseThicknessEnum;
+ 	      else if (strcmp(name,"HydrologydcEplMaxThickness")==0) return HydrologydcEplMaxThicknessEnum;
+ 	      else if (strcmp(name,"HydrologydcEplThickness")==0) return HydrologydcEplThicknessEnum;
+-	      else if (strcmp(name,"HydrologydcEplThicknessOld")==0) return HydrologydcEplThicknessOldEnum;
+          else stage=2;
+    }
+    if(stage==2){
+-	      if (strcmp(name,"HydrologydcEplConductivity")==0) return HydrologydcEplConductivityEnum;
++	      if (strcmp(name,"HydrologydcEplThicknessOld")==0) return HydrologydcEplThicknessOldEnum;
++	      else if (strcmp(name,"HydrologydcEplConductivity")==0) return HydrologydcEplConductivityEnum;
+ 	      else if (strcmp(name,"HydrologydcIsefficientlayer")==0) return HydrologydcIsefficientlayerEnum;
+ 	      else if (strcmp(name,"HydrologydcSedimentlimitFlag")==0) return HydrologydcSedimentlimitFlagEnum;
+ 	      else if (strcmp(name,"HydrologydcSedimentlimit")==0) return HydrologydcSedimentlimitEnum;
+@@ -258,11 +259,11 @@
+ 	      else if (strcmp(name,"MeshX")==0) return MeshXEnum;
+ 	      else if (strcmp(name,"MeshY")==0) return MeshYEnum;
+ 	      else if (strcmp(name,"MeshZ")==0) return MeshZEnum;
+-	      else if (strcmp(name,"MeshElementtype")==0) return MeshElementtypeEnum;
+          else stage=3;
+    }
+    if(stage==3){
+-	      if (strcmp(name,"DomainType")==0) return DomainTypeEnum;
++	      if (strcmp(name,"MeshElementtype")==0) return MeshElementtypeEnum;
++	      else if (strcmp(name,"DomainType")==0) return DomainTypeEnum;
+ 	      else if (strcmp(name,"DomainDimension")==0) return DomainDimensionEnum;
+ 	      else if (strcmp(name,"Domain2Dhorizontal")==0) return Domain2DhorizontalEnum;
+ 	      else if (strcmp(name,"Domain2Dvertical")==0) return Domain2DverticalEnum;
+@@ -381,11 +382,11 @@
+ 	      else if (strcmp(name,"ConfigurationType")==0) return ConfigurationTypeEnum;
+ 	      else if (strcmp(name,"AdjointBalancethicknessAnalysis")==0) return AdjointBalancethicknessAnalysisEnum;
+ 	      else if (strcmp(name,"AdjointBalancethickness2Analysis")==0) return AdjointBalancethickness2AnalysisEnum;
+-	      else if (strcmp(name,"AdjointHorizAnalysis")==0) return AdjointHorizAnalysisEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"AnalysisCounter")==0) return AnalysisCounterEnum;
++	      if (strcmp(name,"AdjointHorizAnalysis")==0) return AdjointHorizAnalysisEnum;
++	      else if (strcmp(name,"AnalysisCounter")==0) return AnalysisCounterEnum;
+ 	      else if (strcmp(name,"DefaultAnalysis")==0) return DefaultAnalysisEnum;
+ 	      else if (strcmp(name,"BalancethicknessAnalysis")==0) return BalancethicknessAnalysisEnum;
+ 	      else if (strcmp(name,"BalancethicknessSolution")==0) return BalancethicknessSolutionEnum;
+@@ -504,11 +505,11 @@
+ 	      else if (strcmp(name,"SpcStatic")==0) return SpcStaticEnum;
+ 	      else if (strcmp(name,"SpcTransient")==0) return SpcTransientEnum;
+ 	      else if (strcmp(name,"StringArrayParam")==0) return StringArrayParamEnum;
+-	      else if (strcmp(name,"StringParam")==0) return StringParamEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"Seg")==0) return SegEnum;
++	      if (strcmp(name,"StringParam")==0) return StringParamEnum;
++	      else if (strcmp(name,"Seg")==0) return SegEnum;
+ 	      else if (strcmp(name,"SegInput")==0) return SegInputEnum;
+ 	      else if (strcmp(name,"Tria")==0) return TriaEnum;
+ 	      else if (strcmp(name,"TriaInput")==0) return TriaInputEnum;
+@@ -627,11 +628,11 @@
+ 	      else if (strcmp(name,"P1bubblecondensed")==0) return P1bubblecondensedEnum;
+ 	      else if (strcmp(name,"P2")==0) return P2Enum;
+ 	      else if (strcmp(name,"P2bubble")==0) return P2bubbleEnum;
+-	      else if (strcmp(name,"P2bubblecondensed")==0) return P2bubblecondensedEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"P2xP1")==0) return P2xP1Enum;
++	      if (strcmp(name,"P2bubblecondensed")==0) return P2bubblecondensedEnum;
++	      else if (strcmp(name,"P2xP1")==0) return P2xP1Enum;
+ 	      else if (strcmp(name,"P1xP2")==0) return P1xP2Enum;
+ 	      else if (strcmp(name,"P1xP3")==0) return P1xP3Enum;
+ 	      else if (strcmp(name,"P2xP4")==0) return P2xP4Enum;
+@@ -750,11 +751,11 @@
+ 	      else if (strcmp(name,"Paterson")==0) return PatersonEnum;
+ 	      else if (strcmp(name,"Arrhenius")==0) return ArrheniusEnum;
+ 	      else if (strcmp(name,"LliboutryDuval")==0) return LliboutryDuvalEnum;
+-	      else if (strcmp(name,"TransientIslevelset")==0) return TransientIslevelsetEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"ExtrapolationVariable")==0) return ExtrapolationVariableEnum;
++	      if (strcmp(name,"TransientIslevelset")==0) return TransientIslevelsetEnum;
++	      else if (strcmp(name,"ExtrapolationVariable")==0) return ExtrapolationVariableEnum;
+ 	      else if (strcmp(name,"IceMaskNodeActivation")==0) return IceMaskNodeActivationEnum;
+ 	      else if (strcmp(name,"LevelsetfunctionSlopeX")==0) return LevelsetfunctionSlopeXEnum;
+ 	      else if (strcmp(name,"LevelsetfunctionSlopeY")==0) return LevelsetfunctionSlopeYEnum;
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18771)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18772)
+@@ -263,7 +263,7 @@
+ 	IssmDouble  Neff;
+ 	IssmDouble  thickness,bed;
+ 	IssmDouble  vx,vy,vz,vmag;
+-	IssmDouble  drag_coefficient;
++	IssmDouble  drag_coefficient,water_layer;
+ 	IssmDouble  alpha2;
+ 
+ 	/*Recover parameters: */
+@@ -272,6 +272,7 @@
+ 	element->GetInputValue(&thickness, gauss,ThicknessEnum);
+ 	element->GetInputValue(&bed, gauss,BaseEnum);
+ 	element->GetInputValue(&drag_coefficient, gauss,FrictionCoefficientEnum);
++	element->GetInputValue(&water_layer, gauss,FrictionWaterLayerEnum);
+ 	IssmDouble rho_water   = element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
+ 	IssmDouble rho_ice     = element->GetMaterialParameter(MaterialsRhoIceEnum);
+ 	IssmDouble gravity     = element->GetMaterialParameter(ConstantsGEnum);
+@@ -281,7 +282,7 @@
+ 	s=1./drag_p;
+ 
+ 	//From bed and thickness, compute effective pressure when drag is viscous:
+-	Neff=gravity*(rho_ice*thickness+rho_water*bed);
++	Neff=gravity*(rho_ice*thickness+rho_water*(bed+water_layer));
+ 	if(Neff<0)Neff=0;
+ 
+ 	switch(dim){
+Index: ../trunk-jpl/src/m/classes/frictionwaterlayer.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionwaterlayer.m	(revision 18771)
++++ ../trunk-jpl/src/m/classes/frictionwaterlayer.m	(revision 18772)
+@@ -3,7 +3,7 @@
+ %   Usage:
+ %      frictionwaterlayer=frictionwaterlayer();
+ 
+-classdef frictiontemp
++classdef frictionwaterlayer
+ 	properties (SetAccess=public) 
+ 		coefficient = NaN;
+ 		p           = NaN;
+@@ -16,7 +16,7 @@
+ 				case 0
+ 					obj=setdefaultparameters(obj);
+ 				case 1
+-					obj=structtoobj(frictiontemp(),varargin{1});
++					obj=structtoobj(frictionwaterlayer(),varargin{1});
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
Index: /issm/oecreview/Archive/18296-19100/ISSM-18772-18773.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18772-18773.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18772-18773.diff	(revision 19102)
@@ -0,0 +1,148 @@
+Index: ../trunk-jpl/src/m/exp/exp_to_levelset.m
+===================================================================
+--- ../trunk-jpl/src/m/exp/exp_to_levelset.m	(revision 0)
++++ ../trunk-jpl/src/m/exp/exp_to_levelset.m	(revision 18773)
+@@ -0,0 +1,143 @@
++function  levelset=exp_to_levelset(md,contourname)
++%EXP_TO_LEVELSET - from an exp contour file, build a levelset which has positive sign inside the contour, and negative outside.
++%
++%   Usage:
++%      levelset=exp_to_levelset(md,contourname)
++%
++%   Where: 
++%      - 'md'     : model specifying the mesh
++%      - 'contourname'  : exp file which defines the closed contour
++%      - 'levelset'  : levelset vector on each vertex of the mesh, size md.mesh.numberofvertices
++%
++%   Example:
++%      level=exp_to_levelset(md,'DomainOutline.exp');
++%
++%   See also MESHPROFILEINTERSECTION, SHPREAD, EXPREAD
++	
++	tolerance=1e-5; %tolerance level used for detection of edges, points coinciding, etc ...
++		
++	%from exp contour, build list of segments throughout our mesh:
++	segments=MeshProfileIntersection(md.mesh.elements,md.mesh.x,md.mesh.y,contourname);
++
++	%cleanup: remove 0 length segments: 
++	cleanup=1;
++	if cleanup,
++		flags=zeros(length(segments),1);
++		for j=1:length(segments),
++			segment=segments(j,:);
++			x1=segment(1); x2=segment(3); 
++			y1=segment(2); y2=segment(4); 
++			Q1=[x1;y1];Q2=[x2;y2];
++			if norm(Q2-Q1)==0, 
++				flags(j)=1;
++			end
++		end
++		pos=find(flags);
++		segments(pos,:)=[];
++	end
++
++	%simplify segments. levelsets are P1 through our triangular elements, which means we can only have one segment per element. 
++	%We simplify by merging all segments into one for each element.
++	simplify=1;
++	if simplify,
++		ids=unique(segments(:,5));
++		newsegs=zeros(length(ids),5);
++		newsegs(:,5)=ids;
++		for j=1:length(ids),
++			pos=find(segments(:,5)==ids(j));
++			segs=segments(pos,1:4);
++			count=0;
++			while(size(segs,1)>1),
++				count=count+1;
++				if count>10,
++					%keep first segment cause something funky in the configuration is happening.
++					segs=segs(1,:);
++					break;
++				end
++				if (abs(segs(1,3)-segs(2,1))<tolerance & abs(segs(1,4)-segs(2,2))<tolerance),
++					%the second segment disappears, extending the first segment:
++					if size(segs,1)==2,
++						segs=[segs(1,1) segs(1,2) segs(2,3) segs(2,4)];
++					else
++						segs=[segs(1,1), segs(1,2), segs(2,3), segs(2,4); segs(3:end,:)];
++					end
++				else
++					%put the first segment at the end
++					segs=[segs(2:end,:); segs(1,:)];
++				end
++			end
++			newsegs(j,1:4)=segs;
++		end
++		segments=newsegs;
++	end
++
++	%cleanup: remove 0 length segments: 
++	if cleanup,
++		flags=zeros(length(segments),1);
++		for j=1:length(segments),
++			segment=segments(j,:);
++			x1=segment(1); x2=segment(3); 
++			y1=segment(2); y2=segment(4); 
++			Q1=[x1;y1];Q2=[x2;y2];
++			if norm(Q2-Q1)<tolerance,
++				flags(j)=1;
++			end
++		end
++		pos=find(flags);
++		segments(pos,:)=[];
++	end
++
++	%now, using the segments, create level set flags on each element that touches the segment.
++	distance=zeros(md.mesh.numberofvertices,1);
++	flags=zeros(md.mesh.numberofvertices,1);
++	for j=1:size(segments,1),
++		segment=segments(j,:);
++		id=segment(5);
++		x1=segment(1); x2=segment(3); 
++		y1=segment(2); y2=segment(4); 
++		for k=1:3,
++			node=md.mesh.elements(id,k);
++			xk=md.mesh.x(node); yk=md.mesh.y(node);
++			
++			%on which side of the segment is this node k? 
++			P=[xk;yk]; Q1=[x1;y1];Q2=[x2;y2];
++			d=(det([Q2-Q1,P-Q1]))/norm(Q2-Q1);
++			if(~flags(node)),
++				distance(node)=d;
++				flags(node)=1;
++			end
++		end
++	end
++		
++	%now go through all the other nodes and complete (similar to phase unwrapping: we march through the domain, and each time we 
++	%are connected to a node which has a levelset value, we adopt the same one.
++	complete=1;
++	if complete,
++		while(length(find(flags==0))),
++			sumf=sum(flags(md.mesh.elements),2);
++			pos=find(sumf==2);
++			if ~isempty(pos),
++				for j=1:length(pos),
++					el=pos(j);
++					f=flags(md.mesh.elements(el,:));
++					ids=find(f==1); 
++					d=distance(md.mesh.elements(el,ids));
++					if d(1)*d(2)<0,
++						%we have hit a snag here, can't decide!
++						continue;
++					else
++						d=d(1);
++					end
++					if abs(d)<tolerance,
++						continue;
++					end
++					ids=find(f==0);
++					if ~isempty(ids),
++						flags(md.mesh.elements(el,ids))=1;
++						distance(md.mesh.elements(el,ids))=d;
++					end
++				end
++			end
++		end
++	end
++	levelset=distance;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18773-18774.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18773-18774.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18773-18774.diff	(revision 19102)
@@ -0,0 +1,28 @@
+Index: ../trunk-jpl/src/m/enum/FrictionWaterLayerEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/FrictionWaterLayerEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/FrictionWaterLayerEnum.m	(revision 18774)
+@@ -0,0 +1,11 @@
++function macro=FrictionWaterLayerEnum()
++%FRICTIONWATERLAYERENUM - Enum of FrictionWaterLayer
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=FrictionWaterLayerEnum()
++
++macro=StringToEnum('FrictionWaterLayer');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18773)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18774)
+@@ -95,6 +95,7 @@
+ def FrictionCEnum(): return StringToEnum("FrictionC")[0]
+ def FrictionLawEnum(): return StringToEnum("FrictionLaw")[0]
+ def FrictionGammaEnum(): return StringToEnum("FrictionGamma")[0]
++def FrictionWaterLayerEnum(): return StringToEnum("FrictionWaterLayer")[0]
+ def GeometryHydrostaticRatioEnum(): return StringToEnum("GeometryHydrostaticRatio")[0]
+ def HydrologyModelEnum(): return StringToEnum("HydrologyModel")[0]
+ def HydrologyshreveEnum(): return StringToEnum("Hydrologyshreve")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18774-18775.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18774-18775.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18774-18775.diff	(revision 19102)
@@ -0,0 +1,133 @@
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 18774)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 18775)
+@@ -130,6 +130,10 @@
+ 			if isa(md.seaice,'double');
+ 				md.seaice=seaice();
+ 			end
++			%2014 November 12
++			if isa(md.calving,'double');
++				md.calving=calving();
++			end
+ 		end% }}}
+ 	end
+ 	methods
+@@ -187,13 +191,26 @@
+ 
+ 			%Start with changing all the fields from the 3d mesh 
+ 
++			%dealing with the friciton law
+ 			%drag is limited to nodes that are on the bedrock.
+-			md.friction.coefficient=project2d(md,md.friction.coefficient,1);
++			if isa(md.friction,'friction'),
++				md.friction.coefficient=project2d(md,md.friction.coefficient,1);
++				md.friction.p=project2d(md,md.friction.p,1);
++				md.friction.q=project2d(md,md.friction.q,1);
++			elseif isa(md.friction,'frictionhydro'),
++				md.friction.q=project2d(md,md.friction.q,1);
++				md.friction.C=project2d(md,md.friction.C,1);
++				md.friction.As=project2d(md,md.friction.As,1);
++			elseif isa(md.friction,'frictionwaterlayer'),
++				md.friction.coefficient=project2d(md,md.friction.coefficient,1);
++				md.friction.p=project2d(md,md.friction.p,1);
++				md.friction.q=project2d(md,md.friction.q,1);
++				md.friction.water_layer=project2d(md,md.friction.water_layer,1);
++			elseif isa(md.friction,'frictionweertman'),
++				md.friction.C=project2d(md,md.friction.C,1);
++				md.friction.m=project2d(md,md.friction.m,1);
++	    end
+ 
+-			%p and q (same deal, except for element that are on the bedrock: )
+-			md.friction.p=project2d(md,md.friction.p,1);
+-			md.friction.q=project2d(md,md.friction.q,1);
+-
+ 			%observations
+ 			if ~isnan(md.inversion.vx_obs), md.inversion.vx_obs=project2d(md,md.inversion.vx_obs,md.mesh.numberoflayers); end;
+ 			if ~isnan(md.inversion.vy_obs), md.inversion.vy_obs=project2d(md,md.inversion.vy_obs,md.mesh.numberoflayers); end;
+@@ -736,12 +753,24 @@
+ 			md.mesh.long=project3d(md,'vector',md.mesh.long,'type','node');
+ 
+ 			%drag coefficient is limited to nodes that are on the bedrock.
+-			md.friction.coefficient=project3d(md,'vector',md.friction.coefficient,'type','node','layer',1);
+-
+-			%p and q (same deal, except for element that are on the bedrock: )
+-			md.friction.p=project3d(md,'vector',md.friction.p,'type','element');
+-			md.friction.q=project3d(md,'vector',md.friction.q,'type','element');
+-
++			if isa(md.friction,'friction'),
++				md.friction.coefficient=project3d(md,'vector',md.friction.coefficient,'type','node','layer',1);
++				md.friction.p=project3d(md,'vector',md.friction.p,'type','element');
++				md.friction.q=project3d(md,'vector',md.friction.q,'type','element');
++			elseif isa(md.friction,'frictionhydro'),
++				md.friction.q=project3d(md,'vector',md.friction.q,'type','element');
++				md.friction.C=project3d(md,'vector',md.friction.C,'type','element');
++				md.friction.As=project3d(md,'vector',md.friction.As,'type','element');
++			elseif isa(md.friction,'frictionwaterlayer'),
++				md.friction.coefficient=project3d(md,'vector',md.friction.coefficient,'type','node','layer',1);
++				md.friction.p=project3d(md,'vector',md.friction.p,'type','element');
++				md.friction.q=project3d(md,'vector',md.friction.q,'type','element');
++				md.friction.water_layer=project3d(md,'vector',md.friction.water_layer,'type','node','layer',1);
++			elseif isa(md.friction,'frictionweertman'),
++				md.friction.C=project3d(md,'vector',md.friction.C,'type','node','layer',1);
++				md.friction.m=project3d(md,'vector',md.friction.m,'type','element');
++	    end
++	 
+ 			%observations
+ 			md.inversion.vx_obs=project3d(md,'vector',md.inversion.vx_obs,'type','node');
+ 			md.inversion.vy_obs=project3d(md,'vector',md.inversion.vy_obs,'type','node');
+Index: ../trunk-jpl/src/m/classes/frictionweertman.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionweertman.m	(revision 18774)
++++ ../trunk-jpl/src/m/classes/frictionweertman.m	(revision 18775)
+@@ -38,7 +38,7 @@
+ 		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('Weertman sliding law parameters: Sigma_b = C^2 * |u_b|^(1/m-1) * u_b'));
+-			fielddisplay(obj,'coefficient','friction coefficient [SI]');
++			fielddisplay(obj,'C','friction coefficient [SI]');
+ 			fielddisplay(obj,'m','m exponent');
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+Index: ../trunk-jpl/src/m/classes/hydrologydc.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 18774)
++++ ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 18775)
+@@ -65,7 +65,6 @@
+ 		if self.sedimentlimit_flag==1:
+ 			string="%s\n%s"%(string,fielddisplay(self,'sedimentlimit','user defined upper limit for the inefficient layer [m]'))
+ 
+-
+ 		string="%s\n%s"%(string,fielddisplay(self,'transfer_flag','what kind of transfer method is applied between the layers'))
+ 		string="%s\n\t\t%s"%(string,'0: no transfer')
+ 		string="%s\n\t\t%s"%(string,'1: constant leakage factor: leakage_factor')
+Index: ../trunk-jpl/src/m/classes/frictionhydro.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionhydro.m	(revision 18774)
++++ ../trunk-jpl/src/m/classes/frictionhydro.m	(revision 18775)
+@@ -1,7 +1,7 @@
+ %FRICTIONWEERTMAN class definition
+ %
+ %   Usage:
+-%      frictionweertman=frictionhydro();
++%      friction=frictionhydro();
+ 
+ classdef frictionhydro
+ 	properties (SetAccess=public) 
+@@ -25,12 +25,12 @@
+ 
+ 			%Early return
+ 			if ~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(ThermalAnalysisEnum(),analyses), return; end
+-			md = checkfield(md,'fieldname','frictionhydro.q','NaN',1,'size',[md.mesh.numberofelements 1]);
+-			md = checkfield(md,'fieldname','frictionhydro.C','NaN',1,'size',[md.mesh.numberofelements 1]);
+-			md = checkfield(md,'fieldname','frictionhydro.As','NaN',1,'size',[md.mesh.numberofelements 1]);
++			md = checkfield(md,'fieldname','friction.q','NaN',1,'size',[md.mesh.numberofelements 1]);
++			md = checkfield(md,'fieldname','friction.C','NaN',1,'size',[md.mesh.numberofelements 1]);
++			md = checkfield(md,'fieldname','friction.As','NaN',1,'size',[md.mesh.numberofelements 1]);
+ 		end % }}}
+ 		function disp(obj) % {{{
+-			disp(sprintf('Effective Pressure based friction law described in Gagliardini 2007')
++			disp(sprintf('Effective Pressure based friction law described in Gagliardini 2007'));
+ 			fielddisplay(obj,'q','friction law exponent q>=1');
+ 			fielddisplay(obj,'C','friction law max value [SI]');
+ 			fielddisplay(obj,'As','Sliding Parameter without cavitation [m Pa^-n s^-1]');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18775-18776.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18775-18776.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18775-18776.diff	(revision 19102)
@@ -0,0 +1,23 @@
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18775)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18776)
+@@ -167,7 +167,8 @@
+ 
+ 	/*This routine calculates the basal friction coefficient 
+ 		Based on Gagliardini 2007, needs a good effective pressure computation
+-	  alpha2= C*Neff*[|vel|/{(C^n*Neff^n*As)*(1+alpha*Chi^q)}]^(1/n)  with
++		Not tested so far so use at your own risks
++	  alpha2= [vel^(1-n)/{(As)*(1+alpha*Chi^q)}]^(1/n)  with
+ 		-Chi=|vel|/(C^n*Neff^n*As)
+ 		-alpha=(q-1)^(q-1)/q^q  **/
+ 
+@@ -219,7 +220,7 @@
+ 	alpha=(pow(q_exp-1,q_exp-1))/pow(q_exp,q_exp);
+ 	Chi=vmag/(pow(C_param,n)*pow(Neff,n)*As);
+ 
+-	alpha2=C_param*Neff*pow((Chi/(1+alpha*pow(Chi,q_exp))),1./n);
++	alpha2=pow((pow(vmag,1.-n)/(As*(1+alpha*pow(Chi,q_exp)))),1./n);
+ 	_assert_(!xIsNan<IssmDouble>(alpha2));
+ 	
+ 	/*Assign output pointers:*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18776-18777.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18776-18777.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18776-18777.diff	(revision 19102)
@@ -0,0 +1,16 @@
+Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18776)
++++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18777)
+@@ -266,6 +266,11 @@
+ 			iomodel->FetchDataToInput(elements,FrictionCEnum);
+ 			iomodel->FetchDataToInput(elements,FrictionMEnum);
+ 			break;
++		case 3:
++			iomodel->FetchDataToInput(elements,FrictionCEnum);
++			iomodel->FetchDataToInput(elements,FrictionAsEnum);
++			iomodel->FetchDataToInput(elements,FrictionQEnum);
++			break;
+ 		case 4:
+ 			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
+ 			iomodel->FetchDataToInput(elements,FrictionPEnum);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18777-18778.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18777-18778.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18777-18778.diff	(revision 19102)
@@ -0,0 +1,186 @@
+Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18777)
++++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18778)
+@@ -270,6 +270,7 @@
+ 			iomodel->FetchDataToInput(elements,FrictionCEnum);
+ 			iomodel->FetchDataToInput(elements,FrictionAsEnum);
+ 			iomodel->FetchDataToInput(elements,FrictionQEnum);
++			iomodel->FetchDataToInput(elements,FrictionEffectivePressureEnum);
+ 			break;
+ 		case 4:
+ 			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
+Index: ../trunk-jpl/src/c/analyses/ThermalAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/ThermalAnalysis.cpp	(revision 18777)
++++ ../trunk-jpl/src/c/analyses/ThermalAnalysis.cpp	(revision 18778)
+@@ -88,6 +88,19 @@
+ 			iomodel->FetchDataToInput(elements,FrictionCEnum);
+ 			iomodel->FetchDataToInput(elements,FrictionMEnum);
+ 			break;
++		case 3:
++			iomodel->FetchDataToInput(elements,FrictionCEnum);
++			iomodel->FetchDataToInput(elements,FrictionAsEnum);
++			iomodel->FetchDataToInput(elements,FrictionQEnum);
++			iomodel->FetchDataToInput(elements,FrictionEffectivePressureEnum);
++			break;
++		case 4:
++			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
++			iomodel->FetchDataToInput(elements,FrictionPEnum);
++			iomodel->FetchDataToInput(elements,FrictionQEnum);
++			iomodel->FetchDataToInput(elements,PressureEnum);
++			iomodel->FetchDataToInput(elements,TemperatureEnum);
++			break;
+ 		case 5:
+ 			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
+ 			iomodel->FetchDataToInput(elements,FrictionPEnum);
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18777)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18778)
+@@ -100,6 +100,12 @@
+ 			iomodel->FetchDataToInput(elements,FrictionCEnum);
+ 			iomodel->FetchDataToInput(elements,FrictionMEnum);
+ 			break;
++		case 3:
++			iomodel->FetchDataToInput(elements,FrictionCEnum);
++			iomodel->FetchDataToInput(elements,FrictionAsEnum);
++			iomodel->FetchDataToInput(elements,FrictionQEnum);
++			iomodel->FetchDataToInput(elements,FrictionEffectivePressureEnum);
++			break;
+ 		case 4:
+ 			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
+ 			iomodel->FetchDataToInput(elements,FrictionPEnum);
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18777)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18778)
+@@ -96,6 +96,7 @@
+ 	FrictionLawEnum,
+ 	FrictionGammaEnum,
+ 	FrictionWaterLayerEnum,
++	FrictionEffectivePressureEnum,
+ 	GeometryHydrostaticRatioEnum,
+ 	HydrologyModelEnum,
+ 	HydrologyshreveEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18777)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18778)
+@@ -104,6 +104,7 @@
+ 		case FrictionLawEnum : return "FrictionLaw";
+ 		case FrictionGammaEnum : return "FrictionGamma";
+ 		case FrictionWaterLayerEnum : return "FrictionWaterLayer";
++		case FrictionEffectivePressureEnum : return "FrictionEffectivePressure";
+ 		case GeometryHydrostaticRatioEnum : return "GeometryHydrostaticRatio";
+ 		case HydrologyModelEnum : return "HydrologyModel";
+ 		case HydrologyshreveEnum : return "Hydrologyshreve";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18777)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18778)
+@@ -104,6 +104,7 @@
+ 	      else if (strcmp(name,"FrictionLaw")==0) return FrictionLawEnum;
+ 	      else if (strcmp(name,"FrictionGamma")==0) return FrictionGammaEnum;
+ 	      else if (strcmp(name,"FrictionWaterLayer")==0) return FrictionWaterLayerEnum;
++	      else if (strcmp(name,"FrictionEffectivePressure")==0) return FrictionEffectivePressureEnum;
+ 	      else if (strcmp(name,"GeometryHydrostaticRatio")==0) return GeometryHydrostaticRatioEnum;
+ 	      else if (strcmp(name,"HydrologyModel")==0) return HydrologyModelEnum;
+ 	      else if (strcmp(name,"Hydrologyshreve")==0) return HydrologyshreveEnum;
+@@ -135,11 +136,11 @@
+ 	      else if (strcmp(name,"HydrologydcEplInitialThickness")==0) return HydrologydcEplInitialThicknessEnum;
+ 	      else if (strcmp(name,"HydrologydcEplColapseThickness")==0) return HydrologydcEplColapseThicknessEnum;
+ 	      else if (strcmp(name,"HydrologydcEplMaxThickness")==0) return HydrologydcEplMaxThicknessEnum;
+-	      else if (strcmp(name,"HydrologydcEplThickness")==0) return HydrologydcEplThicknessEnum;
+          else stage=2;
+    }
+    if(stage==2){
+-	      if (strcmp(name,"HydrologydcEplThicknessOld")==0) return HydrologydcEplThicknessOldEnum;
++	      if (strcmp(name,"HydrologydcEplThickness")==0) return HydrologydcEplThicknessEnum;
++	      else if (strcmp(name,"HydrologydcEplThicknessOld")==0) return HydrologydcEplThicknessOldEnum;
+ 	      else if (strcmp(name,"HydrologydcEplConductivity")==0) return HydrologydcEplConductivityEnum;
+ 	      else if (strcmp(name,"HydrologydcIsefficientlayer")==0) return HydrologydcIsefficientlayerEnum;
+ 	      else if (strcmp(name,"HydrologydcSedimentlimitFlag")==0) return HydrologydcSedimentlimitFlagEnum;
+@@ -258,11 +259,11 @@
+ 	      else if (strcmp(name,"MeshVertexonboundary")==0) return MeshVertexonboundaryEnum;
+ 	      else if (strcmp(name,"MeshX")==0) return MeshXEnum;
+ 	      else if (strcmp(name,"MeshY")==0) return MeshYEnum;
+-	      else if (strcmp(name,"MeshZ")==0) return MeshZEnum;
+          else stage=3;
+    }
+    if(stage==3){
+-	      if (strcmp(name,"MeshElementtype")==0) return MeshElementtypeEnum;
++	      if (strcmp(name,"MeshZ")==0) return MeshZEnum;
++	      else if (strcmp(name,"MeshElementtype")==0) return MeshElementtypeEnum;
+ 	      else if (strcmp(name,"DomainType")==0) return DomainTypeEnum;
+ 	      else if (strcmp(name,"DomainDimension")==0) return DomainDimensionEnum;
+ 	      else if (strcmp(name,"Domain2Dhorizontal")==0) return Domain2DhorizontalEnum;
+@@ -381,11 +382,11 @@
+ 	      else if (strcmp(name,"AnalysisType")==0) return AnalysisTypeEnum;
+ 	      else if (strcmp(name,"ConfigurationType")==0) return ConfigurationTypeEnum;
+ 	      else if (strcmp(name,"AdjointBalancethicknessAnalysis")==0) return AdjointBalancethicknessAnalysisEnum;
+-	      else if (strcmp(name,"AdjointBalancethickness2Analysis")==0) return AdjointBalancethickness2AnalysisEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"AdjointHorizAnalysis")==0) return AdjointHorizAnalysisEnum;
++	      if (strcmp(name,"AdjointBalancethickness2Analysis")==0) return AdjointBalancethickness2AnalysisEnum;
++	      else if (strcmp(name,"AdjointHorizAnalysis")==0) return AdjointHorizAnalysisEnum;
+ 	      else if (strcmp(name,"AnalysisCounter")==0) return AnalysisCounterEnum;
+ 	      else if (strcmp(name,"DefaultAnalysis")==0) return DefaultAnalysisEnum;
+ 	      else if (strcmp(name,"BalancethicknessAnalysis")==0) return BalancethicknessAnalysisEnum;
+@@ -504,11 +505,11 @@
+ 	      else if (strcmp(name,"SpcDynamic")==0) return SpcDynamicEnum;
+ 	      else if (strcmp(name,"SpcStatic")==0) return SpcStaticEnum;
+ 	      else if (strcmp(name,"SpcTransient")==0) return SpcTransientEnum;
+-	      else if (strcmp(name,"StringArrayParam")==0) return StringArrayParamEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"StringParam")==0) return StringParamEnum;
++	      if (strcmp(name,"StringArrayParam")==0) return StringArrayParamEnum;
++	      else if (strcmp(name,"StringParam")==0) return StringParamEnum;
+ 	      else if (strcmp(name,"Seg")==0) return SegEnum;
+ 	      else if (strcmp(name,"SegInput")==0) return SegInputEnum;
+ 	      else if (strcmp(name,"Tria")==0) return TriaEnum;
+@@ -627,11 +628,11 @@
+ 	      else if (strcmp(name,"P1bubble")==0) return P1bubbleEnum;
+ 	      else if (strcmp(name,"P1bubblecondensed")==0) return P1bubblecondensedEnum;
+ 	      else if (strcmp(name,"P2")==0) return P2Enum;
+-	      else if (strcmp(name,"P2bubble")==0) return P2bubbleEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"P2bubblecondensed")==0) return P2bubblecondensedEnum;
++	      if (strcmp(name,"P2bubble")==0) return P2bubbleEnum;
++	      else if (strcmp(name,"P2bubblecondensed")==0) return P2bubblecondensedEnum;
+ 	      else if (strcmp(name,"P2xP1")==0) return P2xP1Enum;
+ 	      else if (strcmp(name,"P1xP2")==0) return P1xP2Enum;
+ 	      else if (strcmp(name,"P1xP3")==0) return P1xP3Enum;
+@@ -750,11 +751,11 @@
+ 	      else if (strcmp(name,"Cuffey")==0) return CuffeyEnum;
+ 	      else if (strcmp(name,"Paterson")==0) return PatersonEnum;
+ 	      else if (strcmp(name,"Arrhenius")==0) return ArrheniusEnum;
+-	      else if (strcmp(name,"LliboutryDuval")==0) return LliboutryDuvalEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"TransientIslevelset")==0) return TransientIslevelsetEnum;
++	      if (strcmp(name,"LliboutryDuval")==0) return LliboutryDuvalEnum;
++	      else if (strcmp(name,"TransientIslevelset")==0) return TransientIslevelsetEnum;
+ 	      else if (strcmp(name,"ExtrapolationVariable")==0) return ExtrapolationVariableEnum;
+ 	      else if (strcmp(name,"IceMaskNodeActivation")==0) return IceMaskNodeActivationEnum;
+ 	      else if (strcmp(name,"LevelsetfunctionSlopeX")==0) return LevelsetfunctionSlopeXEnum;
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18777)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18778)
+@@ -191,7 +191,7 @@
+ 	element->GetInputValue(&C_param,FrictionCEnum);
+ 	element->GetInputValue(&As,FrictionAsEnum);
+ 
+-	element->GetInputValue(&Neff,gauss,EffectivePressureEnum);
++	element->GetInputValue(&Neff,gauss,FrictionEffectivePressureEnum);
+ 	element->GetInputValue(&n,gauss,MaterialsRheologyNEnum);
+ 	
+ 	if(Neff<0)Neff=0;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18778-18779.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18778-18779.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18778-18779.diff	(revision 19102)
@@ -0,0 +1,61 @@
+Index: ../trunk-jpl/src/m/classes/frictionhydro.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionhydro.m	(revision 18778)
++++ ../trunk-jpl/src/m/classes/frictionhydro.m	(revision 18779)
+@@ -5,9 +5,10 @@
+ 
+ classdef frictionhydro
+ 	properties (SetAccess=public) 
+-		q  = NaN;
+-		C  = NaN;
+-		As = NaN;
++		q                  = NaN;
++		C                  = NaN;
++		As                 = NaN;
++		effective_pressure = NaN; 
+ 	end
+ 	methods
+ 		function obj = frictionhydro(varargin) % {{{
+@@ -34,12 +35,14 @@
+ 			fielddisplay(obj,'q','friction law exponent q>=1');
+ 			fielddisplay(obj,'C','friction law max value [SI]');
+ 			fielddisplay(obj,'As','Sliding Parameter without cavitation [m Pa^-n s^-1]');
++			fielddisplay(obj,'effecitve_pressure','Effective Pressure [Pa]');
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+ 			WriteData(fid,'enum',FrictionLawEnum,'data',3,'format','Integer');
+ 			WriteData(fid,'class','friction','object',obj,'fieldname','q','format','DoubleMat','mattype',2);
+ 			WriteData(fid,'class','friction','object',obj,'fieldname','C','format','DoubleMat','mattype',2);
+ 			WriteData(fid,'class','friction','object',obj,'fieldname','As','format','DoubleMat','mattype',2);
++			WriteData(fid,'class','friction','object',obj,'fieldname','effective_pressure','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/enum/FrictionEffectivePressureEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/FrictionEffectivePressureEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/FrictionEffectivePressureEnum.m	(revision 18779)
+@@ -0,0 +1,11 @@
++function macro=FrictionEffectivePressureEnum()
++%FRICTIONEFFECTIVEPRESSUREENUM - Enum of FrictionEffectivePressure
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=FrictionEffectivePressureEnum()
++
++macro=StringToEnum('FrictionEffectivePressure');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18778)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18779)
+@@ -96,6 +96,7 @@
+ def FrictionLawEnum(): return StringToEnum("FrictionLaw")[0]
+ def FrictionGammaEnum(): return StringToEnum("FrictionGamma")[0]
+ def FrictionWaterLayerEnum(): return StringToEnum("FrictionWaterLayer")[0]
++def FrictionEffectivePressureEnum(): return StringToEnum("FrictionEffectivePressure")[0]
+ def GeometryHydrostaticRatioEnum(): return StringToEnum("GeometryHydrostaticRatio")[0]
+ def HydrologyModelEnum(): return StringToEnum("HydrologyModel")[0]
+ def HydrologyshreveEnum(): return StringToEnum("Hydrologyshreve")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18779-18780.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18779-18780.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18779-18780.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18779)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18780)
+@@ -1582,7 +1582,7 @@
+ 			element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+ 
+ 			/*Get all parameters at gaussian point*/
+-			weights_input->GetInputValue(&weight,gauss,ThicknessAbsMisfitEnum);
++			weights_input->GetInputValue(&weight,gauss,ThicknessAbsGradientEnum);
+ 			thickness_input->GetInputDerivativeValue(&dp[0],xyz_list,gauss);
+ 
+ 			/*Tikhonov regularization: J = 1/2 ((dp/dx)^2 + (dp/dy)^2) */ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18780-18781.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18780-18781.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18780-18781.diff	(revision 19102)
@@ -0,0 +1,19 @@
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18780)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18781)
+@@ -217,7 +217,13 @@
+ 	}
+ 
+ 	//compute alpha and Chi coefficients: */
+-	alpha=(pow(q_exp-1,q_exp-1))/pow(q_exp,q_exp);
++	if (q_exp==1){
++		alpha=1;
++	}
++	else{
++		alpha=(pow(q_exp-1,q_exp-1))/pow(q_exp,q_exp);
++	}
++	
+ 	Chi=vmag/(pow(C_param,n)*pow(Neff,n)*As);
+ 
+ 	alpha2=pow((pow(vmag,1.-n)/(As*(1+alpha*pow(Chi,q_exp)))),1./n);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18781-18782.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18781-18782.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18781-18782.diff	(revision 19102)
@@ -0,0 +1,202 @@
+Index: ../trunk-jpl/test/NightlyRun/test806.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test806.py	(revision 0)
++++ ../trunk-jpl/test/NightlyRun/test806.py	(revision 18782)
+@@ -0,0 +1,84 @@
++from model import *
++from triangle import *
++from squaremesh import *
++from setmask import *
++from parameterize import *
++from setflowequation import *
++from EnumDefinitions import *
++from solve import *
++from MatlabFuncs import *
++
++md=triangle(model(),'../Exp/Square.exp',50000.)
++md=setmask(md,'','')
++md=parameterize(md,'../Par/SquareShelf.py')
++md=setflowequation(md,'SSA','all')
++md.cluster=generic('name',oshostname(),'np',3)
++
++x = md.mesh.x
++xmin = min(x)
++xmax = max(x)
++Lx = (xmax-xmin)
++alpha = 2./3.
++md.mask.ice_levelset = ((x - alpha*Lx)>0) - ((x - alpha*Lx)<0)
++
++md.timestepping.time_step=10
++md.timestepping.final_time=30
++
++
++
++#Transient
++md.transient.isstressbalance=True
++md.transient.islevelset=True
++md.transient.ismasstransport=True
++md.transient.isthermal=False
++md.transient.isgroundingline=False
++md.transient.isgia=False
++md.transient.iscalving=True;
++
++md.calving=calvinglevermann();
++md.calving.coeff=4.89e13*numpy.ones(md.mesh.numberofvertices,1);
++
++md.transient.requested_outputs={'default','StrainRateparallel','StrainRateperpendicular','Calvingratex','Calvingratey','CalvingCalvingrate'}
++
++md=solve(md,TransientSolutionEnum())
++
++#Fields and tolerances to track changes
++field_names     =['Vx1','Vy1','Vel1','Pressure1','Thickness1','Surface1','MaskIceLevelset1','StrainRateparallel1','StrainRateperpendicular1','CalvingCalvingrate1',\
++		'Vx2','Vy2','Vel2','Pressure2','Thickness2','Surface2','MaskIceLevelset2','StrainRateparallel2','StrainRateperpendicular2','CalvingCalvingrate2',\
++		'Vx3','Vy3','Vel3','Pressure3','Thickness3','Surface3','MaskIceLevelset3','StrainRateparallel3','StrainRateperpendicular3','CalvingCalvingrate3']
++field_tolerances=[1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,\
++		2e-13,2e-13,2e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,\
++		2e-13,2e-13,2e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13]
++field_values=[\
++	md.results.TransientSolution[0].Vx,\
++	md.results.TransientSolution[0].Vy,\
++	md.results.TransientSolution[0].Vel,\
++	md.results.TransientSolution[0].Pressure,\
++	md.results.TransientSolution[0].Thickness,\
++	md.results.TransientSolution[0].Surface,\
++	md.results.TransientSolution[0].MaskIceLevelset,\
++	md.results.TransientSolution[0].StrainRateparallel,\
++	md.results.TransientSolution[0].StrainRateperpendicular,\
++	md.results.TransientSolution[0].CalvingCalvingrate,\
++	md.results.TransientSolution[1].Vx,\
++	md.results.TransientSolution[1].Vy,\
++	md.results.TransientSolution[1].Vel,\
++	md.results.TransientSolution[1].Pressure,\
++	md.results.TransientSolution[1].Thickness,\
++	md.results.TransientSolution[1].Surface,\
++	md.results.TransientSolution[1].MaskIceLevelset,\
++	md.results.TransientSolution[1].StrainRateparallel,\
++	md.results.TransientSolution[1].StrainRateperpendicular,\
++	md.results.TransientSolution[1].CalvingCalvingrate,\
++	md.results.TransientSolution[2].Vx,\
++	md.results.TransientSolution[2].Vy,\
++	md.results.TransientSolution[2].Vel,\
++	md.results.TransientSolution[2].Pressure,\
++	md.results.TransientSolution[2].Thickness,\
++	md.results.TransientSolution[2].Surface,\
++	md.results.TransientSolution[2].MaskIceLevelset,\
++	md.results.TransientSolution[2].StrainRateparallel,\
++	md.results.TransientSolution[2].StrainRateperpendicular,\
++	md.results.TransientSolution[2].CalvingCalvingrate,\
++
++	]
+Index: ../trunk-jpl/test/NightlyRun/test806.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test806.m	(revision 0)
++++ ../trunk-jpl/test/NightlyRun/test806.m	(revision 18782)
+@@ -0,0 +1,71 @@
++md=triangle(model(),'../Exp/Square.exp',50000.);
++md=setmask(md,'all','');
++md=parameterize(md,'../Par/SquareShelf.par');
++md=setflowequation(md,'SSA','all');
++md.cluster=generic('name',oshostname(),'np',3);
++
++x = md.mesh.x;
++xmin = min(x);
++xmax = max(x);
++Lx = (xmax-xmin);
++alpha = 2./3.;
++md.mask.ice_levelset = ((x - alpha*Lx)>0) - ((x - alpha*Lx)<0);
++
++md.timestepping.time_step=10;
++md.timestepping.final_time=30;
++
++%Transient
++md.transient.isstressbalance=1;
++md.transient.islevelset=1;
++md.transient.ismasstransport=1;
++md.transient.isthermal=0;
++md.transient.isgroundingline=0;
++md.transient.isgia=0;
++md.transient.iscalving=1;
++
++md.calving=calvinglevermann();
++md.calving.coeff=4.89e13*ones(md.mesh.numberofvertices,1);
++
++md.transient.requested_outputs={'default','StrainRateparallel','StrainRateperpendicular','Calvingratex','Calvingratey','CalvingCalvingrate'};
++
++md=solve(md,TransientSolutionEnum());
++
++%Fields and tolerances to track changes
++field_names     ={'Vx1','Vy1','Vel1','Pressure1','Thickness1','Surface1','MaskIceLevelset1','StrainRateparallel1','StrainRateperpendicular1','CalvingCalvingrate1'...
++		'Vx2','Vy2','Vel2','Pressure2','Thickness2','Surface2','MaskIceLevelset2','StrainRateparallel2','StrainRateperpendicular2','CalvingCalvingrate2'...
++		'Vx3','Vy3','Vel3','Pressure3','Thickness3','Surface3','MaskIceLevelset3','StrainRateparallel3','StrainRateperpendicular3','CalvingCalvingrate3'};
++field_tolerances={1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,...
++		2e-13,2e-13,2e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,...
++		2e-13,2e-13,2e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13};
++field_values={...
++	md.results.TransientSolution(1).Vx,...
++	md.results.TransientSolution(1).Vy,...
++	md.results.TransientSolution(1).Vel,...
++	md.results.TransientSolution(1).Pressure,...
++	md.results.TransientSolution(1).Thickness,...
++	md.results.TransientSolution(1).Surface,...
++	md.results.TransientSolution(1).MaskIceLevelset,...
++	md.results.TransientSolution(1).StrainRateparallel,...
++	md.results.TransientSolution(1).StrainRateperpendicular,...
++	md.results.TransientSolution(1).CalvingCalvingrate,...
++	md.results.TransientSolution(2).Vx,...
++	md.results.TransientSolution(2).Vy,...
++	md.results.TransientSolution(2).Vel,...
++	md.results.TransientSolution(2).Pressure,...
++	md.results.TransientSolution(2).Thickness,...
++	md.results.TransientSolution(2).Surface,...
++	md.results.TransientSolution(2).MaskIceLevelset,...
++	md.results.TransientSolution(2).StrainRateparallel,...
++	md.results.TransientSolution(2).StrainRateperpendicular,...
++	md.results.TransientSolution(2).CalvingCalvingrate,...
++	md.results.TransientSolution(3).Vx,...
++	md.results.TransientSolution(3).Vy,...
++	md.results.TransientSolution(3).Vel,...
++	md.results.TransientSolution(3).Pressure,...
++	md.results.TransientSolution(3).Thickness,...
++	md.results.TransientSolution(3).Surface,...
++	md.results.TransientSolution(3).MaskIceLevelset,...
++	md.results.TransientSolution(3).StrainRateparallel,...
++	md.results.TransientSolution(3).StrainRateperpendicular,...
++	md.results.TransientSolution(3).CalvingCalvingrate,...
++	};
+Index: ../trunk-jpl/test/NightlyRun/IdToName.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/IdToName.m	(revision 18781)
++++ ../trunk-jpl/test/NightlyRun/IdToName.m	(revision 18782)
+@@ -194,6 +194,7 @@
+ 	case 803, name='ValleyGlacierLevelsetEnthalpyHO3d';
+ 	case 804, name='ValleyGlacierLevelsetCalvingSIA2d';
+ 	case 805, name='ValleyGlacierLevelsetEnthCalvingHO3d';
++	case 806, name='SquareShelfLevelsetCalvingSIA2dLevermann';
+ 	case 1101, name='ISMIPAHO';
+ 	case 1102, name='ISMIPAFS';
+ 	case 1103, name='ISMIPBHO';
+Index: ../trunk-jpl/test/NightlyRun/IdToName.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/IdToName.py	(revision 18781)
++++ ../trunk-jpl/test/NightlyRun/IdToName.py	(revision 18782)
+@@ -179,6 +179,7 @@
+ 	803  : 'ValleyGlacierLevelsetEnthalpyHO3d',	
+ 	804  : 'ValleyGlacierLevelsetCalvingSIA2d',	
+ 	805  : 'ValleyGlacierLevelsetEnthCalvingHO3d',	
++	806  : 'SquareShelfLevelsetCalvingSIA2dLevermann',	
+ 	1101 : 'ISMIPAHO',
+ 	1102 : 'ISMIPAFS',
+ 	1103 : 'ISMIPBHO',
+Index: ../trunk-jpl/src/m/classes/calvinglevermann.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvinglevermann.py	(revision 18781)
++++ ../trunk-jpl/src/m/classes/calvinglevermann.py	(revision 18782)
+@@ -36,7 +36,7 @@
+ 		if (solution!=TransientSolutionEnum()) or (not md.transient.iscalvinglevermann):
+ 			return md
+ 
+-		md = checkfield(md,'fieldname','calving.coeff','NaN',1,'size',[md.mesh.numberofvertices],'>',0)
++		md = checkfield(md,'fieldname','calving.coeff','size',[md.mesh.numberofvertices],'>',0)
+ 		return md
+ 	# }}}
+ 	def marshall(self,md,fid):    # {{{
Index: /issm/oecreview/Archive/18296-19100/ISSM-18782-18783.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18782-18783.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18782-18783.diff	(revision 19102)
@@ -0,0 +1,28 @@
+Index: ../trunk-jpl/test/NightlyRun/test806.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test806.py	(revision 18782)
++++ ../trunk-jpl/test/NightlyRun/test806.py	(revision 18783)
+@@ -36,7 +36,7 @@
+ md.transient.iscalving=True;
+ 
+ md.calving=calvinglevermann();
+-md.calving.coeff=4.89e13*numpy.ones(md.mesh.numberofvertices,1);
++md.calving.coeff=4.89e13*numpy.ones((md.mesh.numberofvertices,1));
+ 
+ md.transient.requested_outputs={'default','StrainRateparallel','StrainRateperpendicular','Calvingratex','Calvingratey','CalvingCalvingrate'}
+ 
+Index: ../trunk-jpl/test/Archives/Archive806.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive806.nc
+===================================================================
+--- ../trunk-jpl/test/Archives/Archive806.nc	(revision 18782)
++++ ../trunk-jpl/test/Archives/Archive806.nc	(revision 18783)
+
+Property changes on: ../trunk-jpl/test/Archives/Archive806.nc
+___________________________________________________________________
+Added: svn:mime-type
+## -0,0 +1 ##
++application/octet-stream
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18783-18784.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18783-18784.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18783-18784.diff	(revision 19102)
@@ -0,0 +1,26 @@
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18783)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18784)
+@@ -271,7 +271,7 @@
+ 
+ 		/* Stabilization */
+ 		vel=0.;
+-		for(i=0;i<dim;i++) vel+=v[i]*v[i];
++		for(i=0;i<dim;i++) vel+=w[i]*w[i];
+ 		vel=sqrt(vel)+1.e-14;
+ 		switch(stabilization){
+ 			case 0:
+@@ -297,10 +297,10 @@
+ 			case 2:
+ 				/* Streamline Upwinding */
+ 				basalelement->ElementSizes(&hx,&hy,&hz);
+-				h=sqrt( pow(hx*v[0]/vel,2) + pow(hy*v[1]/vel,2) );
++				h=sqrt( pow(hx*w[0]/vel,2) + pow(hy*w[1]/vel,2) );
+ 				for(row=0;row<dim;row++) 
+ 					for(col=0;col<dim;col++) 
+-						D[row*dim+col] = D_scalar*h/(2.*vel)*v[row]*v[col];
++						D[row*dim+col] = D_scalar*h/(2.*vel)*w[row]*w[col];
+ 
+ 				TripleMultiply(Bprime,dim,numnodes,1,
+ 							D,dim,dim,0,
Index: /issm/oecreview/Archive/18296-19100/ISSM-18784-18785.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18784-18785.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18784-18785.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/m4/issm_options.m4
+===================================================================
+--- ../trunk-jpl/m4/issm_options.m4	(revision 18784)
++++ ../trunk-jpl/m4/issm_options.m4	(revision 18785)
+@@ -422,7 +422,7 @@
+ 				if      test x$DAKOTA_VERSION = x4.2 || test x$DAKOTA_VERSION = x4.2+; then
+ 					DAKOTALIB="-L$DAKOTA_ROOT/lib -ldakota -lteuchos -lpecos -lfftw3 -llhs -levidence -lsurfpack -lconmin -lddace -lfsudace -ljega -lcport -lopt -lpsuade -lnewmat -lncsuopt -lgsl -lquadrature -lcoliny -lcolin -lpebbl -lutilib -l3po -lnappspack -lappspack -lconveyor -lshared -lcdd -lamplsolver"
+ 				else if test x$DAKOTA_VERSION = x5.1 || test x$DAKOTA_VERSION = x5.2; then
+--					DAKOTALIB="-L$DAKOTA_ROOT/lib -ldakota -lteuchos -lpecos -llhs -lsparsegrid -lsurfpack -lconmin -lddace -lfsudace -ljega -lcport -loptpp -lpsuade -lncsuopt -lcolin -linterfaces -lmomh -lscolib -lpebbl -ltinyxml -lutilib -l3po -lhopspack -lnidr -lamplsolver -lboost_signals -lboost_regex -lboost_filesystem -lboost_system -ldl"
++					DAKOTALIB="-L$DAKOTA_ROOT/lib -ldakota -lteuchos -lpecos -llhs -lsparsegrid -lsurfpack -lconmin -lddace -lfsudace -ljega -lcport -loptpp -lpsuade -lncsuopt -lcolin -linterfaces -lmomh -lscolib -lpebbl -ltinyxml -lutilib -l3po -lhopspack -lnidr -lamplsolver -lboost_signals -lboost_regex -lboost_filesystem -lboost_system -ldl"
+ 				else if test x$DAKOTA_VERSION = x5.3 || test x$DAKOTA_VERSION = x5.3.1; then
+ 					DAKOTAFLAGS="-DDISABLE_DAKOTA_CONFIG_H -DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DDAKOTA_PLUGIN -DBOOST_DISABLE_ASSERTS -DDAKOTA_HAVE_BOOST_FS -DHAVE_UNISTD_H -DHAVE_SYSTEM -DHAVE_WORKING_FORK -DHAVE_WORKING_VFORK -DHAVE_SYS_WAIT_H -DHAVE_USLEEP -DDAKOTA_F90 -DDAKOTA_HAVE_MPI -DHAVE_PECOS -DHAVE_SURFPACK -DDAKOTA_COLINY -DDAKOTA_UTILIB -DHAVE_ADAPTIVE_SAMPLING -DHAVE_CONMIN -DDAKOTA_DDACE -DHAVE_FSUDACE -DDAKOTA_HOPS -DHAVE_JEGA -DHAVE_NCSU -DHAVE_NL2SOL -DHAVE_OPTPP -DDAKOTA_OPTPP -DHAVE_PSUADE -DHAVE_AMPL"
+ 					DAKOTALIB="-L$DAKOTA_ROOT/lib -L$BOOST_ROOT/lib -ldakota_src -lpecos_src -lscolib -ljega_fe -llhs -lpebbl -lcolin -linterfaces -lmods -lmoga -loptpp -lsampling -lsoga -lsurfpack -lutilib -lconmin -ldakota_src_fortran -lmod -lncsuopt -lsurfpack_fortran -lteuchos -l3po -lamplsolver -lanalyzer -lbose -lcport -ldace -ldfftpack -leutils -lfsudace -lhopspack -ljega -lnidr -lpecos -lpsuade -lrandom -ltinyxml -lutilities -lsparsegrid -lboost_signals -lboost_regex -lboost_filesystem -lboost_system"
Index: /issm/oecreview/Archive/18296-19100/ISSM-18785-18786.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18785-18786.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18785-18786.diff	(revision 19102)
@@ -0,0 +1,664 @@
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18785)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18786)
+@@ -490,6 +490,9 @@
+ 	PenpairEnum,
+ 	ProfilerEnum,
+ 	MatrixParamEnum,
++	MassconEnum,
++	MassconNameEnum,
++	MassconLevelsetEnum,
+ 	NodeSIdEnum,
+ 	VectorParamEnum,
+ 	RiftfrontEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18785)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18786)
+@@ -487,6 +487,9 @@
+ 		case PenpairEnum : return "Penpair";
+ 		case ProfilerEnum : return "Profiler";
+ 		case MatrixParamEnum : return "MatrixParam";
++		case MassconEnum : return "Masscon";
++		case MassconNameEnum : return "MassconName";
++		case MassconLevelsetEnum : return "MassconLevelset";
+ 		case NodeSIdEnum : return "NodeSId";
+ 		case VectorParamEnum : return "VectorParam";
+ 		case RiftfrontEnum : return "Riftfront";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18785)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18786)
+@@ -496,19 +496,22 @@
+ 	      else if (strcmp(name,"Penpair")==0) return PenpairEnum;
+ 	      else if (strcmp(name,"Profiler")==0) return ProfilerEnum;
+ 	      else if (strcmp(name,"MatrixParam")==0) return MatrixParamEnum;
++	      else if (strcmp(name,"Masscon")==0) return MassconEnum;
++	      else if (strcmp(name,"MassconName")==0) return MassconNameEnum;
++	      else if (strcmp(name,"MassconLevelset")==0) return MassconLevelsetEnum;
+ 	      else if (strcmp(name,"NodeSId")==0) return NodeSIdEnum;
+ 	      else if (strcmp(name,"VectorParam")==0) return VectorParamEnum;
+ 	      else if (strcmp(name,"Riftfront")==0) return RiftfrontEnum;
+ 	      else if (strcmp(name,"RiftfrontType")==0) return RiftfrontTypeEnum;
+ 	      else if (strcmp(name,"Segment")==0) return SegmentEnum;
+ 	      else if (strcmp(name,"SegmentRiftfront")==0) return SegmentRiftfrontEnum;
+-	      else if (strcmp(name,"SpcDynamic")==0) return SpcDynamicEnum;
+-	      else if (strcmp(name,"SpcStatic")==0) return SpcStaticEnum;
+-	      else if (strcmp(name,"SpcTransient")==0) return SpcTransientEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"StringArrayParam")==0) return StringArrayParamEnum;
++	      if (strcmp(name,"SpcDynamic")==0) return SpcDynamicEnum;
++	      else if (strcmp(name,"SpcStatic")==0) return SpcStaticEnum;
++	      else if (strcmp(name,"SpcTransient")==0) return SpcTransientEnum;
++	      else if (strcmp(name,"StringArrayParam")==0) return StringArrayParamEnum;
+ 	      else if (strcmp(name,"StringParam")==0) return StringParamEnum;
+ 	      else if (strcmp(name,"Seg")==0) return SegEnum;
+ 	      else if (strcmp(name,"SegInput")==0) return SegInputEnum;
+@@ -625,13 +628,13 @@
+ 	      else if (strcmp(name,"P0")==0) return P0Enum;
+ 	      else if (strcmp(name,"P1")==0) return P1Enum;
+ 	      else if (strcmp(name,"P1DG")==0) return P1DGEnum;
+-	      else if (strcmp(name,"P1bubble")==0) return P1bubbleEnum;
+-	      else if (strcmp(name,"P1bubblecondensed")==0) return P1bubblecondensedEnum;
+-	      else if (strcmp(name,"P2")==0) return P2Enum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"P2bubble")==0) return P2bubbleEnum;
++	      if (strcmp(name,"P1bubble")==0) return P1bubbleEnum;
++	      else if (strcmp(name,"P1bubblecondensed")==0) return P1bubblecondensedEnum;
++	      else if (strcmp(name,"P2")==0) return P2Enum;
++	      else if (strcmp(name,"P2bubble")==0) return P2bubbleEnum;
+ 	      else if (strcmp(name,"P2bubblecondensed")==0) return P2bubblecondensedEnum;
+ 	      else if (strcmp(name,"P2xP1")==0) return P2xP1Enum;
+ 	      else if (strcmp(name,"P1xP2")==0) return P1xP2Enum;
+@@ -748,13 +751,13 @@
+ 	      else if (strcmp(name,"GenericOption")==0) return GenericOptionEnum;
+ 	      else if (strcmp(name,"OptionCell")==0) return OptionCellEnum;
+ 	      else if (strcmp(name,"OptionStruct")==0) return OptionStructEnum;
+-	      else if (strcmp(name,"Cuffey")==0) return CuffeyEnum;
+-	      else if (strcmp(name,"Paterson")==0) return PatersonEnum;
+-	      else if (strcmp(name,"Arrhenius")==0) return ArrheniusEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"LliboutryDuval")==0) return LliboutryDuvalEnum;
++	      if (strcmp(name,"Cuffey")==0) return CuffeyEnum;
++	      else if (strcmp(name,"Paterson")==0) return PatersonEnum;
++	      else if (strcmp(name,"Arrhenius")==0) return ArrheniusEnum;
++	      else if (strcmp(name,"LliboutryDuval")==0) return LliboutryDuvalEnum;
+ 	      else if (strcmp(name,"TransientIslevelset")==0) return TransientIslevelsetEnum;
+ 	      else if (strcmp(name,"ExtrapolationVariable")==0) return ExtrapolationVariableEnum;
+ 	      else if (strcmp(name,"IceMaskNodeActivation")==0) return IceMaskNodeActivationEnum;
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 18785)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 18786)
+@@ -113,7 +113,40 @@
+ 				xDelete<int>(misfit_weights_enum_s);
+ 				/*}}}*/
+ 			}
++			else if (output_definition_enums[i]==MassconEnum){
++				/*Deal with masscons: {{{*/
++				
++				/*masscon variables: */
++				int          nummasscons;
++				char**       masscon_name_s             = NULL;    
++				IssmDouble** masscon_levelset_s           = NULL;
++				int*         masscon_levelset_M_s    = NULL;
++				int*         masscon_levelset_N_s    = NULL;
+ 
++				/*Fetch name and levelset, etc ... (see src/m/classes/masscon.m): */
++				iomodel->FetchMultipleData(&masscon_name_s,&nummasscons,MassconNameEnum);
++				iomodel->FetchMultipleData(&masscon_levelset_s,&masscon_levelset_M_s,&masscon_levelset_N_s,&nummasscons,MassconLevelsetEnum);
++				for(j=0;j<nummasscons;j++){
++
++					/*Create a masscon object: */
++					output_definitions->AddObject(new Masscon(masscon_name_s[j],masscon_levelset_s[j],masscon_levelset_M_s[j]));
++
++				}
++
++				/*Free ressources:*/
++				for(j=0;j<nummasscons;j++){
++					char* string=NULL;
++					IssmDouble* matrix = NULL;
++
++					string = masscon_name_s[j];    xDelete<char>(string);
++					matrix = masscon_levelset_s[j]; xDelete<IssmDouble>(matrix);
++				}
++				xDelete<char*>(masscon_name_s);
++				xDelete<IssmDouble*>(masscon_levelset_s);
++				xDelete<int>(masscon_levelset_M_s);
++				xDelete<int>(masscon_levelset_N_s);
++				/*}}}*/
++			}
+ 			else _error_("output definition enum " << output_definition_enums[i] << "not supported yet!");
+ 		}
+ 	}
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 18785)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 18786)
+@@ -436,6 +436,7 @@
+ 					./modules/ConstraintsStatex/RiftConstraintsState.cpp\
+ 					./classes/Massfluxatgate.h \
+ 					./classes/Misfit.h \
++					./classes/Masscon.h \
+ 					./modules/ModelProcessorx/CreateOutputDefinitions.cpp\
+ 					./modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.h\
+ 					./modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.cpp\
+Index: ../trunk-jpl/src/c/classes/classes.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/classes.h	(revision 18785)
++++ ../trunk-jpl/src/c/classes/classes.h	(revision 18786)
+@@ -18,6 +18,7 @@
+ #include "./Segment.h"
+ #include "./Massfluxatgate.h"
+ #include "./Misfit.h"
++#include "./Masscon.h"
+ 
+ /*Constraints: */
+ #include "./Constraints/Constraints.h"
+Index: ../trunk-jpl/src/c/classes/Masscon.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Masscon.h	(revision 0)
++++ ../trunk-jpl/src/c/classes/Masscon.h	(revision 18786)
+@@ -0,0 +1,105 @@
++/*!\file Masscon.h
++ * \brief: header file for Masscon object
++ */
++
++#ifndef _MASSCON_H_
++#define _MASSCON_H_
++
++/*Headers:*/
++/*{{{*/
++#include "./Definition.h"
++#include "../datastructures/datastructures.h"
++#include "./Elements/Element.h"
++#include "./Elements/Elements.h"
++#include "./FemModel.h"
++#include "../classes/Params/Parameters.h"
++/*}}}*/
++
++class Masscon: public Object, public Definition{
++
++	public: 
++
++		char*       name;
++		IssmDouble* levelset;
++		int         M;
++		
++		/*Masscon constructors, destructors :*/
++		Masscon(){/*{{{*/
++
++			this->name = NULL;
++			this->levelset=NULL;
++			this->M=0;
++
++		}
++		/*}}}*/
++		Masscon(char* in_name, IssmDouble* levelsetin, int Min){ /*{{{*/
++
++			this->name   = xNew<char>(strlen(in_name)+1);
++			xMemCpy<char>(this->name,in_name,strlen(in_name)+1);
++
++			this->levelset   = xNew<IssmDouble>(Min);
++			xMemCpy<IssmDouble>(this->levelset, levelsetin, Min);
++
++			this->M=Min;
++
++		}
++		/*}}}*/
++		~Masscon(){/*{{{*/
++			if(this->name)xDelete(this->name); 
++			if(this->levelset)xDelete(this->levelset);
++		}
++		/*}}}*/
++		/*Object virtual function resolutoin: */
++		void Echo(void){/*{{{*/
++			_printf_(" Masscon: " << name << "\n");
++			_printf_("    levelset: " << this->levelset << "\n");
++			_printf_("    M: " << this->M << "\n");
++		}
++		/*}}}*/
++		void DeepEcho(void){/*{{{*/
++			this->Echo();
++		}
++		/*}}}*/
++		int Id(void){/*{{{*/
++			return -1;
++		}
++		/*}}}*/
++		int ObjectEnum(void){/*{{{*/
++			return MassconEnum;
++		}
++		/*}}}*/
++		Object* copy() {/*{{{*/
++			Masscon* mf = new Masscon(this->name,this->levelset,this->M);
++			return (Object*) mf;
++		}
++		/*}}}*/
++		/*Definition virtual function resolutoin: */
++		char* Name(){/*{{{*/
++
++			char* name2=xNew<char>(strlen(this->name)+1);
++			xMemCpy(name2,this->name,strlen(this->name)+1);
++
++			return name2;
++		}
++		/*}}}*/
++		 IssmDouble Response(FemModel* femmodel){/*{{{*/
++
++			 int i;
++			 IssmDouble mass_t=0.;
++			 IssmDouble all_mass_t=0.;
++
++
++			 for(i=0;i<femmodel->elements->Size();i++){
++				 Element* element=(Element*)femmodel->elements->GetObjectByOffset(i);
++				 mass_t+=element->Masscon(this->levelset);
++			 }
++
++			 ISSM_MPI_Allreduce ( (void*)&mass_t,(void*)&all_mass_t,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
++			 mass_t=all_mass_t;
++			 
++			 return mass_t;
++		 }
++			/*}}}*/
++};
++
++#endif  /* _MASSCON_H_ */
+Index: ../trunk-jpl/src/c/classes/Elements/Element.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18785)
++++ ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18786)
+@@ -204,6 +204,7 @@
+ 		virtual bool   IsOnBase()=0;
+ 		virtual bool   IsOnSurface()=0;
+ 		virtual void   GetGroundedPart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlyfloating)=0;
++		virtual void   GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues)=0;
+ 		virtual IssmDouble GetGroundedPortion(IssmDouble* xyz_list)=0;
+ 		virtual void   GetInputValue(IssmDouble* pvalue,Node* node,int enumtype)=0;
+ 		virtual Node*  GetNode(int node_number)=0;
+@@ -272,6 +273,7 @@
+ 		virtual IssmDouble IceVolumeAboveFloatation(void)=0;
+ 		virtual IssmDouble TotalSmb(void)=0;
+ 		virtual IssmDouble Misfit(int modelenum,int observationenum,int weightsenum)=0;
++		virtual IssmDouble Masscon(IssmDouble* levelset)=0;
+ 		virtual IssmDouble MisfitArea(int weightsenum)=0;
+ 		virtual int    VertexConnectivity(int vertexindex)=0;
+ 		virtual void   VerticalSegmentIndices(int** pindices,int* pnumseg)=0;
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18785)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18786)
+@@ -667,6 +667,56 @@
+ 
+ }
+ /*}}}*/
++void        Tria::GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* gl){/*{{{*/
++	
++	/*Computeportion of the element that has a positive levelset*/ 
++
++	bool               negative=true;
++	int                point;
++	const IssmPDouble  epsilon= 1.e-15;
++	IssmDouble         f1,f2;
++
++	/*Be sure that values are not zero*/
++	if(gl[0]==0.) gl[0]=gl[0]+epsilon;
++	if(gl[1]==0.) gl[1]=gl[1]+epsilon;
++	if(gl[2]==0.) gl[2]=gl[2]+epsilon;
++
++	/*Check that not all nodes are positive or negative*/
++	if(gl[0]>0 && gl[1]>0 && gl[2]>0){ // All positive
++		point=0;
++		f1=1.;
++		f2=1.;
++	}
++	else if(gl[0]<0 && gl[1]<0 && gl[2]<0){ //All negative
++		point=0;
++		f1=0.;
++		f2=0.;
++	}
++	else{
++		if(gl[0]*gl[1]*gl[2]<0) negative=false;
++
++		if(gl[0]*gl[1]>0){ //Nodes 0 and 1 are similar, so points must be found on segment 0-2 and 1-2
++			point=2;
++			f1=gl[2]/(gl[2]-gl[0]);
++			f2=gl[2]/(gl[2]-gl[1]);
++		}
++		else if(gl[1]*gl[2]>0){ //Nodes 1 and 2 are similar, so points must be found on segment 0-1 and 0-2
++			point=0;
++			f1=gl[0]/(gl[0]-gl[1]);
++			f2=gl[0]/(gl[0]-gl[2]);
++		}
++		else if(gl[0]*gl[2]>0){ //Nodes 0 and 2 are similar, so points must be found on segment 1-0 and 1-2
++			point=1;
++			f1=gl[1]/(gl[1]-gl[2]);
++			f2=gl[1]/(gl[1]-gl[0]);
++		}
++	}
++	*point1=point;
++	*fraction1=f1;
++	*fraction2=f2;
++	*mainlynegative=negative;
++}
++/*}}}*/
+ void       Tria::GetGroundedPart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlyfloating){/*{{{*/
+ 	/*Computeportion of the element that is grounded*/ 
+ 
+@@ -2715,7 +2765,63 @@
+ 	return Jelem;
+ }
+ /*}}}*/
++IssmDouble Tria::Masscon(IssmDouble* levelset){ /*{{{*/
+ 
++
++	/*intermediary: */
++	IssmDouble* values=NULL;
++	Input*      thickness_input=NULL;
++	IssmDouble  thickness;
++	IssmDouble  weight;
++	IssmDouble  Jdet;
++	IssmDouble  volume;
++	IssmDouble  rho_ice;
++	IssmDouble* xyz_list=NULL;
++	int         point1;
++	IssmDouble  fraction1,fraction2;
++	bool        mainlynegative=true;
++	
++	/*Output:*/
++	volume=0;
++
++	/* Get node coordinates and dof list: */
++	GetVerticesCoordinates(&xyz_list);
++
++	/*Retrieve inputs required:*/
++	thickness_input=this->GetInput(ThicknessEnum); _assert_(thickness_input);
++	
++	/*Retrieve material parameters: */
++	rho_ice=matpar->GetRhoIce();
++
++	/*Retrieve values of the levelset defining the masscon: */
++	values = xNew<IssmDouble>(NUMVERTICES);
++	for(int i=0;i<NUMVERTICES;i++){
++		values[i]=levelset[this->vertices[i]->Sid()];
++	}
++		
++	/*Ok, use the level set values to figure out where we put our gaussian points:*/
++	this->GetLevelsetPositivePart(&point1,&fraction1,&fraction2,&mainlynegative,values);
++	Gauss* gauss = this->NewGauss(point1,fraction1,fraction2,mainlynegative,4);
++
++	volume=0;
++
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		this->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		thickness_input->GetInputValue(&thickness, gauss);
++
++		volume+=thickness*gauss->weight*Jdet;
++	}
++
++	/* clean up and Return: */
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(values);
++	delete gauss;
++	return rho_ice*volume;
++}
++/*}}}*/
++
+ #ifdef _HAVE_GIA_
+ void       Tria::GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,IssmDouble* x, IssmDouble* y){/*{{{*/
+ 
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18785)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18786)
+@@ -68,6 +68,7 @@
+ 		int         FiniteElement(void);
+ 		Element*    GetUpperElement(void){_error_("not implemented yet");};
+ 		Element*    GetBasalElement(void){_error_("not implemented yet");};
++		void        GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues);
+ 		void        GetGroundedPart(int* point1,IssmDouble* fraction1, IssmDouble* fraction2,bool* mainlyfloating);
+ 		IssmDouble  GetGroundedPortion(IssmDouble* xyz_list);
+ 		int         GetNodeIndex(Node* node);
+@@ -122,6 +123,7 @@
+ 		IssmDouble MassFlux(IssmDouble* segment);
+ 		IssmDouble MassFlux(IssmDouble x1,IssmDouble y1, IssmDouble x2, IssmDouble y2,int segment_id);
+ 		void       ElementResponse(IssmDouble* presponse,int response_enum);
++		IssmDouble Masscon(IssmDouble* levelset);
+ 		IssmDouble Misfit(int modelenum,int observationenum,int weightsenum);
+ 		IssmDouble MisfitArea(int weightsenum);
+ 
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18785)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18786)
+@@ -73,6 +73,7 @@
+ 		Penta* GetBasalPenta(void);
+ 		Element* GetUpperElement(void);
+ 		Element* GetBasalElement(void);
++		void        GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues){_error_("not implemented yet");};
+ 		void   GetGroundedPart(int* point1,IssmDouble* fraction1, IssmDouble* fraction2,bool* mainlyfloating);
+ 		IssmDouble GetGroundedPortion(IssmDouble* xyz_list);
+ 		int    GetNodeIndex(Node* node);
+@@ -131,6 +132,7 @@
+ 		void   InputControlUpdate(IssmDouble scalar,bool save_parameter);
+ 		IssmDouble Misfit(int modelenum,int observationenum,int weightsenum){_error_("not implemented yet");};
+ 		IssmDouble MisfitArea(int weightsenum){_error_("not implemented yet");};
++		IssmDouble Masscon(IssmDouble* levelset){_error_("not implemented yet");};
+ 
+ 		void   MigrateGroundingLine(IssmDouble* sheet_ungrounding);
+ 		void   PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding);
+Index: ../trunk-jpl/src/c/classes/Elements/Seg.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18785)
++++ ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18786)
+@@ -108,6 +108,7 @@
+ 		void        ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
+ 		int         VelocityInterpolation(void){_error_("not implemented yet");};
+ 		int         TensorInterpolation(void){_error_("not implemented yet");};
++		void        GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues){_error_("not implemented yet");};
+ 		void        GetGroundedPart(int* point1,IssmDouble* fraction1, IssmDouble* fraction2,bool* mainlyfloating){_error_("not implemented yet");};
+ 		IssmDouble  GetGroundedPortion(IssmDouble* xyz_list){_error_("not implemented yet");};
+ 		void        GetInputValue(IssmDouble* pvalue,Node* node,int enumtype){_error_("not implemented yet");};
+@@ -156,6 +157,7 @@
+ 		void       ElementResponse(IssmDouble* presponse,int response_enum){_error_("not implemented yet");};
+ 		IssmDouble Misfit(int modelenum,int observationenum,int weightsenum){_error_("not implemented yet");};
+ 		IssmDouble MisfitArea(int weightsenum){_error_("not implemented yet");};
++		IssmDouble Masscon(IssmDouble* levelset){_error_("not implemented yet");};
+ 
+ #ifdef _HAVE_GIA_
+ 		void   GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,IssmDouble* x,IssmDouble* y){_error_("not implemented yet");};
+Index: ../trunk-jpl/src/c/classes/Elements/Tetra.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18785)
++++ ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18786)
+@@ -113,6 +113,7 @@
+ 		void        ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
+ 		int         VelocityInterpolation(void);
+ 		int         TensorInterpolation(void);
++		void        GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues){_error_("not implemented yet");};
+ 		void        GetGroundedPart(int* point1,IssmDouble* fraction1, IssmDouble* fraction2,bool* mainlyfloating){_error_("not implemented yet");};
+ 		IssmDouble  GetGroundedPortion(IssmDouble* xyz_list){_error_("not implemented yet");};
+ 		void        GetInputValue(IssmDouble* pvalue,Node* node,int enumtype);
+@@ -160,6 +161,7 @@
+ 		void       ElementResponse(IssmDouble* presponse,int response_enum){_error_("not implemented yet");};
+ 		IssmDouble Misfit(int modelenum,int observationenum,int weightsenum){_error_("not implemented yet");};
+ 		IssmDouble MisfitArea(int weightsenum){_error_("not implemented yet");};
++		IssmDouble Masscon(IssmDouble* levelset){_error_("not implemented yet");};
+ 
+ #ifdef _HAVE_GIA_
+ 		void   GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,IssmDouble* x,IssmDouble* y){_error_("not implemented yet");};
+Index: ../trunk-jpl/src/m/exp/exp_to_levelset.m
+===================================================================
+--- ../trunk-jpl/src/m/exp/exp_to_levelset.m	(revision 18785)
++++ ../trunk-jpl/src/m/exp/exp_to_levelset.m	(revision 18786)
+@@ -22,8 +22,8 @@
+ 	%cleanup: remove 0 length segments: 
+ 	cleanup=1;
+ 	if cleanup,
+-		flags=zeros(length(segments),1);
+-		for j=1:length(segments),
++		flags=zeros(size(segments,1),1);
++		for j=1:size(segments,1),
+ 			segment=segments(j,:);
+ 			x1=segment(1); x2=segment(3); 
+ 			y1=segment(2); y2=segment(4); 
+@@ -73,8 +73,8 @@
+ 
+ 	%cleanup: remove 0 length segments: 
+ 	if cleanup,
+-		flags=zeros(length(segments),1);
+-		for j=1:length(segments),
++		flags=zeros(size(segments,1),1);
++		for j=1:size(segments,1),
+ 			segment=segments(j,:);
+ 			x1=segment(1); x2=segment(3); 
+ 			y1=segment(2); y2=segment(4); 
+Index: ../trunk-jpl/src/m/plot/applyoptions.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/applyoptions.m	(revision 18785)
++++ ../trunk-jpl/src/m/plot/applyoptions.m	(revision 18786)
+@@ -426,7 +426,7 @@
+ 		y=y*unit;
+ 	end
+ 	hold on,p=plot(x,y,'k.');
+-	markersize=getfieldvalue(options,'markersize',5);
++	markersize=getfieldvalue(options,'markersize',12);
+ 	color=getfieldvalue(options,'cloudcolor','k');
+ 	set(p,'Color',color);
+ 	set(p,'MarkerSize',markersize);
+Index: ../trunk-jpl/src/m/classes/masscon.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/masscon.m	(revision 0)
++++ ../trunk-jpl/src/m/classes/masscon.m	(revision 18786)
+@@ -0,0 +1,59 @@
++%MASSCON class definition
++%
++%   Usage:
++%      masscon=masscon();
++%      masscon=masscon('name','MassCon58',... %name of a North-East Greenland JPL MassCon
++%                    'levelset',level);
++% 
++%   where level is a levelset vectorial field.
++%
++%   See also: MISFIT
++
++classdef masscon
++	properties (SetAccess=public)
++		%masscon
++		name              = '';
++		levelset          = NaN; %levelset vectorial field which identifies the boundaries of the masscon
++	end
++	
++	methods
++		function obj = masscon(varargin) % {{{
++			if nargin==0,
++				obj=setdefaultparameters(obj);
++			else
++				%use provided options to change fields
++				options=pairoptions(varargin{:});
++
++				%get name
++				obj.name=getfieldvalue(options,'name','');
++				obj.levelset=getfieldvalue(options,'levelset');
++
++			end
++		end % }}}
++		function obj = setdefaultparameters(obj) % {{{
++		end % }}}
++		function md = checkconsistency(obj,md,solution,analyses) % {{{
++
++			if ~ischar(obj.name),
++				error('masscon error message: ''name'' field should be a string!');
++			end
++
++			md = checkfield(md,'fieldname','obj.levelset','field',obj.levelset,'forcing',1,'NaN',1);
++
++		end % }}}
++		function md = disp(obj) % {{{
++		
++			disp(sprintf('   Misfit:\n'));
++
++			fielddisplay(obj,'name','identifier for this masscon response');
++			fielddisplay(obj,'levelset','levelset vectorial field which identifies the boundaries of the masscon');
++
++		end % }}}
++		function md = marshall(obj,md,fid) % {{{
++
++		WriteData(fid,'object',obj,'fieldname','name','format','String');
++		WriteData(fid,'object',obj,'fieldname','levelset','format','DoubleMat','mattype',1);
++
++		end % }}}
++	end
++end
+Index: ../trunk-jpl/src/m/enum/MassconNameEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MassconNameEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MassconNameEnum.m	(revision 18786)
+@@ -0,0 +1,11 @@
++function macro=MassconNameEnum()
++%MASSCONNAMEENUM - Enum of MassconName
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MassconNameEnum()
++
++macro=StringToEnum('MassconName');
+Index: ../trunk-jpl/src/m/enum/MassconEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MassconEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MassconEnum.m	(revision 18786)
+@@ -0,0 +1,11 @@
++function macro=MassconEnum()
++%MASSCONENUM - Enum of Masscon
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MassconEnum()
++
++macro=StringToEnum('Masscon');
+Index: ../trunk-jpl/src/m/enum/MassconLevelsetEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MassconLevelsetEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MassconLevelsetEnum.m	(revision 18786)
+@@ -0,0 +1,11 @@
++function macro=MassconLevelsetEnum()
++%MASSCONLEVELSETENUM - Enum of MassconLevelset
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MassconLevelsetEnum()
++
++macro=StringToEnum('MassconLevelset');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18785)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18786)
+@@ -479,6 +479,9 @@
+ def PenpairEnum(): return StringToEnum("Penpair")[0]
+ def ProfilerEnum(): return StringToEnum("Profiler")[0]
+ def MatrixParamEnum(): return StringToEnum("MatrixParam")[0]
++def MassconEnum(): return StringToEnum("Masscon")[0]
++def MassconNameEnum(): return StringToEnum("MassconName")[0]
++def MassconLevelsetEnum(): return StringToEnum("MassconLevelset")[0]
+ def NodeSIdEnum(): return StringToEnum("NodeSId")[0]
+ def VectorParamEnum(): return StringToEnum("VectorParam")[0]
+ def RiftfrontEnum(): return StringToEnum("Riftfront")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18786-18787.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18786-18787.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18786-18787.diff	(revision 19102)
@@ -0,0 +1,42 @@
+Index: ../trunk-jpl/src/m/classes/clusters/pfe.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/pfe.m	(revision 18786)
++++ ../trunk-jpl/src/m/classes/clusters/pfe.m	(revision 18787)
+@@ -214,6 +214,37 @@
+ 				 fclose(fid);
+ 			 end
+ 		 end %}}}
++		 function BuildOceanQueueScript(cluster,modelname,solution,io_gather,isvalgrind,isgprof) % {{{
++
++			 %compute number of processors
++			 cluster.np=cluster.numnodes*cluster.cpuspernode;
++
++			 %write queuing script 
++			 fid=fopen([modelname '.queue'],'w');
++			 fprintf(fid,'#PBS -S /bin/bash\n');
++			 fprintf(fid,'#PBS -l select=%i:ncpus=%i:model=%s\n',cluster.numnodes,cluster.cpuspernode,cluster.processor);
++			 fprintf(fid,'#PBS -l walltime=%i\n',cluster.time*60); %walltime is in seconds.
++			 fprintf(fid,'#PBS -q %s \n',cluster.queue);
++			 fprintf(fid,'#PBS -W group_list=%s\n',cluster.grouplist);
++			 fprintf(fid,'#PBS -m e\n');
++			 fprintf(fid,'#PBS -o %s.outlog \n',modelname);
++			 fprintf(fid,'#PBS -e %s.errlog \n\n',modelname);
++			 fprintf(fid,'. /usr/share/modules/init/bash\n\n');
++			 fprintf(fid,'module load comp-intel/2015.0.090\n');
++			 fprintf(fid,'module load test/mpt.2.11r8\n');
++			 fprintf(fid,'module load netcdf/4.0\n');
++			 fprintf(fid,'module load mpi-mvapich2/1.4.1/gcc\n');
++			 fprintf(fid,'module load gcc/4.4.4\n');
++			 fprintf(fid,'export PATH="$PATH:."\n');
++			 fprintf(fid,'export MPI_GROUP_MAX=64\n\n');
++			 fprintf(fid,'cd %s/%s/\n\n',cluster.executionpath,modelname);
++			 fprintf(fid,'mpiexec -np %i ./mitgcm\n',cluster.np); 
++		%	 if ~io_gather, %concatenate the output files:
++		%		 fprintf(fid,'cat %s.outbin.* > %s.outbin',modelname,modelname);
++		%	 end
++			 fclose(fid);
++
++		 end %}}}
+ 		 function LaunchQueueJob(cluster,modelname,dirname,filelist)% {{{
+ 
+ 			 %compress the files into one zip.
Index: /issm/oecreview/Archive/18296-19100/ISSM-18787-18788.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18787-18788.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18787-18788.diff	(revision 19102)
@@ -0,0 +1,147 @@
+Index: ../trunk-jpl/src/c/modules/MeshProfileIntersectionx/MeshProfileIntersectionx.h
+===================================================================
+--- ../trunk-jpl/src/c/modules/MeshProfileIntersectionx/MeshProfileIntersectionx.h	(revision 18787)
++++ ../trunk-jpl/src/c/modules/MeshProfileIntersectionx/MeshProfileIntersectionx.h	(revision 18788)
+@@ -12,8 +12,9 @@
+ void MeshProfileIntersectionx(double** psegments, int* pnumseg, int* index, double* x, double* y, int nel, int nods,  Contour<IssmPDouble>** contours,int numcontours);
+ void MeshSegmentsIntersection(double** psegments, int* pnumsegs,int* index, double* x, double* y, int nel, int nods, double* xc, double* yc, int numnodes);
+ void ElementSegmentsIntersection(DataSet* segments_dataset,int el, double* xnodes,double* ynodes,double* xc,double* yc,int numnodes);
+-void ElementSegment(DataSet* segments_dataset,int el,double* xnodes,double* ynodes,double* xsegment,double* ysegment);
++void ElementSegment(DataSet* segments_dataset,int el,int contouri, double* xnodes,double* ynodes,double* xsegment,double* ysegment);
+ int  SegmentIntersect(double* palpha, double* pbeta, double* x1, double* y1, double* x2, double* y2);
+ bool NodeInElement(double* xnodes, double* ynodes, double x, double y);
++bool IsIdenticalNode(double x1, double y1, double x2, double y2, double tolerance);
+ 
+ #endif /* _MESHPROFILEINTERSECTIONX_H */
+Index: ../trunk-jpl/src/c/modules/MeshProfileIntersectionx/MeshProfileIntersectionx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/MeshProfileIntersectionx/MeshProfileIntersectionx.cpp	(revision 18787)
++++ ../trunk-jpl/src/c/modules/MeshProfileIntersectionx/MeshProfileIntersectionx.cpp	(revision 18788)
+@@ -128,10 +128,15 @@
+ 		xsegment[1]=xc[i+1];
+ 		ysegment[0]=yc[i];
+ 		ysegment[1]=yc[i+1];
+-		ElementSegment(segments_dataset,el, xnodes,ynodes,xsegment,ysegment);
++		/*if (el==318 && i==9){
++			_printf_("contour: " << i << " " << xsegment[0] << " " << ysegment[0] << " " << xsegment[1] << " " << ysegment[1] 
++				<< " " << xnodes[0] << " " << xnodes[1] << " " << xnodes[2] << " " << ynodes[0] << " " << ynodes[1] << " " << 
++				ynodes[2] << "\n");
++		}*/
++		ElementSegment(segments_dataset,el, i, xnodes,ynodes,xsegment,ysegment);
+ 	}
+ }/*}}}*/
+-void ElementSegment(DataSet* segments_dataset,int el,double* xnodes,double* ynodes,double* xsegment,double* ysegment){/*{{{*/
++void ElementSegment(DataSet* segments_dataset,int el, int contouri, double* xnodes,double* ynodes,double* xsegment,double* ysegment){/*{{{*/
+ 
+ 	/*We have a tria element (xnodes,ynodes) and a segment (xsegment,ysegment). Find whether they intersect. 
+ 	 * If they do, create a Segment object with the intersection, and add to segments_dataset dataset: */
+@@ -158,11 +163,44 @@
+ 	xel[0]=xnodes[2];  yel[0]=ynodes[2]; xel[1]=xnodes[0];  yel[1]=ynodes[0];
+ 	edge3=SegmentIntersect(&gamma1,&gamma2, xel,yel,xsegment,ysegment);
+ 
+-	/*edge can be either IntersectEnum (one iand only one intersection between the edge and the segment), ColinearEnum (edge and segment are collinear) and SeparateEnum (no intersection): */
++	/*edge can be either IntersectEnum (one and only one intersection between the edge and the segment), ColinearEnum (edge and segment are collinear) and SeparateEnum (no intersection): */
++		
++	/*if (el==318 && contouri==9){
++		_printf_(edge1 << " " << edge2 << " " << edge3 << " "  << alpha1 << " " << alpha2 << " " << beta1 << " " << beta2 << " " << gamma1 << " " << gamma2 << " " << xsegment[0] << " "  << xsegment[1] << " " << ysegment[0] << " " << ysegment[1] << " " << xnodes[0] << " " << xnodes[1] << " " << xnodes[2] << " " << ynodes[0] << " " << ynodes[1] << " " << ynodes[2]);
++	
++	_printf_("Bool" << (edge1==IntersectEnum) || (edge2==IntersectEnum) || (edge3==IntersectEnum));
++	}*/
+ 
+ 	if(    (edge1==IntersectEnum) && (edge2==IntersectEnum) && (edge3==IntersectEnum)   ){
+-		/*This case is impossible: */
+-		_error_("error: a line cannot go through 3 different vertices!");
++
++		/*This can only be the case if the segment intersected through one vertex, meaning a pair from alpha1, beta1 or gamma1  is 0:*/
++		if (alpha1!=0 && alpha1!=1){
++			/*The vertex opposite edge 1 was intersected:*/
++			xfinal[0]=xsegment[0]+alpha1*(xsegment[1]-xsegment[0]);
++			yfinal[0]=ysegment[0]+alpha1*(ysegment[1]-ysegment[0]);
++			xfinal[1]=xnodes[2];
++			yfinal[1]=ynodes[2];
++		}
++		else if (beta1!=0 && beta1!=1){
++			/*The vertex opposite edge 2 was intersected:*/
++			xfinal[0]=xsegment[0]+beta1*(xsegment[1]-xsegment[0]);
++			yfinal[0]=ysegment[0]+beta1*(ysegment[1]-ysegment[0]);
++			xfinal[1]=xnodes[0];
++			yfinal[1]=ynodes[0];
++		}
++		else if (gamma1!=0 && gamma1!=1){
++			/*The vertex opposite edge 3 was intersected:*/
++			xfinal[0]=xsegment[0]+gamma1*(xsegment[1]-xsegment[0]);
++			yfinal[0]=ysegment[0]+gamma1*(ysegment[1]-ysegment[0]);
++			xfinal[1]=xnodes[1];
++			yfinal[1]=ynodes[1];
++		}
++		segments_dataset->AddObject(new  Segment<double>(el+1,xfinal[0],yfinal[0],xfinal[1],yfinal[1]));
++
++		
++		/*This case is impossible: not quite! */
++		//_printf_(alpha1 << " " << alpha2 << " " << beta1 << " " << beta2 << " " << gamma1 << " " << gamma2 << " " << xsegment[0] << " "  << xsegment[1] << " " << ysegment[0] << " " << ysegment[1] << " " << xnodes[0] << " " << xnodes[1] << " " << xnodes[2] << " " << ynodes[0] << " " << ynodes[1] << " " << ynodes[2]);
++		/* _error_("error: a line cannot go through 3 different vertices!");*/
+ 	}
+ 	else if(    ((edge1==IntersectEnum) && (edge2==IntersectEnum)) || ((edge2==IntersectEnum) && (edge3==IntersectEnum)) || ((edge3==IntersectEnum) && (edge1==IntersectEnum))   ){
+ 
+@@ -186,6 +224,10 @@
+ 		}
+ 	}
+ 	else if(  (edge1==IntersectEnum) || (edge2==IntersectEnum) || (edge3==IntersectEnum)   ){
++	
++		/*if (el==318 && contouri==9){
++			_printf_("hello" <<  " NodeInElement 0 " << (NodeInElement(xnodes,ynodes,xsegment[0],ysegment[0])) <<  " NodeInElement 1 " << (NodeInElement(xnodes,ynodes,xsegment[1],ysegment[1])));
++		}*/
+ 
+ 		/*segment intersect only 1 edge. Figure out where the first point in the segment is, inside or outside the element, 
+ 		 * this will decide the coordinate: */
+@@ -195,13 +237,39 @@
+ 			if(edge2==IntersectEnum){coord2=beta1;}
+ 			if(edge3==IntersectEnum){coord2=gamma1;}
+ 		}
+-		else{
++		else if (NodeInElement(xnodes,ynodes,xsegment[1],ysegment[1])){
+ 			if(edge1==IntersectEnum){coord1=alpha1;}
+ 			if(edge2==IntersectEnum){coord1=beta1;}
+ 			if(edge3==IntersectEnum){coord1=gamma1;}
+ 			coord2=1.0;
+ 		}
++		else{
++			double tolerance=1e-10;
++			/*Ok, we have an issue here. Probably one of the segments' end is on a vertex, within a certain tolerance!*/
++			if (IsIdenticalNode(xnodes[0],ynodes[0],xsegment[0],ysegment[0],tolerance) ||
++				IsIdenticalNode(xnodes[1],ynodes[1],xsegment[0],ysegment[0],tolerance) ||
++				IsIdenticalNode(xnodes[2],ynodes[2],xsegment[0],ysegment[0],tolerance)){
++				
++				/*ok, segments[0] is common to one of our vertices: */
++				//if (el==318 && contouri==9){ _printf_("ok1" << "\n"); }
++				coord1=0;
++				if(edge1==IntersectEnum){coord2=alpha1;}
++				if(edge2==IntersectEnum){coord2=beta1;}
++				if(edge3==IntersectEnum){coord2=gamma1;}
++			}
++			else if (IsIdenticalNode(xnodes[0],ynodes[0],xsegment[1],ysegment[1],tolerance) ||
++				     IsIdenticalNode(xnodes[1],ynodes[1],xsegment[1],ysegment[1],tolerance) ||
++				     IsIdenticalNode(xnodes[2],ynodes[2],xsegment[1],ysegment[1],tolerance)){
+ 
++				/*ok, segments[1] is common to one of our vertices: */
++				//if (el==318 && contouri==9){ _printf_("ok2" << "\n"); }
++				if(edge1==IntersectEnum){coord1=alpha1;}
++				if(edge2==IntersectEnum){coord1=beta1;}
++				if(edge3==IntersectEnum){coord1=gamma1;}
++				coord2=1.0;
++			}
++		}
++
+ 		xfinal[0]=xsegment[0]+coord1*(xsegment[1]-xsegment[0]);
+ 		xfinal[1]=xsegment[0]+coord2*(xsegment[1]-xsegment[0]);
+ 		yfinal[0]=ysegment[0]+coord1*(ysegment[1]-ysegment[0]);
+@@ -343,3 +411,9 @@
+ 	*palpha=alpha;*pbeta=beta;
+ 	return IntersectEnum;
+ }/*}}}*/
++bool IsIdenticalNode(double x1, double y1, double x2, double y2, double tolerance){ /*{{{*/
++
++	if (sqrt(pow(x1-x2,2.0) + pow(y1-y2,2))<tolerance)return true;
++	else return false;
++
++}/*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18788-18789.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18788-18789.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18788-18789.diff	(revision 19102)
@@ -0,0 +1,8 @@
+Index: ../trunk-jpl/test/Archives/Archive804.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive805.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
Index: /issm/oecreview/Archive/18296-19100/ISSM-18789-18790.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18789-18790.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18789-18790.diff	(revision 19102)
@@ -0,0 +1,35 @@
+Index: ../trunk-jpl/src/m/classes/clusters/pfe.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/pfe.m	(revision 18789)
++++ ../trunk-jpl/src/m/classes/clusters/pfe.m	(revision 18790)
+@@ -214,16 +214,13 @@
+ 				 fclose(fid);
+ 			 end
+ 		 end %}}}
+-		 function BuildOceanQueueScript(cluster,modelname,solution,io_gather,isvalgrind,isgprof) % {{{
++		 function BuildOceanQueueScript(np,cluster,modelname) % {{{
+ 
+-			 %compute number of processors
+-			 cluster.np=cluster.numnodes*cluster.cpuspernode;
+-
+ 			 %write queuing script 
+ 			 fid=fopen([modelname '.queue'],'w');
+ 			 fprintf(fid,'#PBS -S /bin/bash\n');
+-			 fprintf(fid,'#PBS -l select=%i:ncpus=%i:model=%s\n',cluster.numnodes,cluster.cpuspernode,cluster.processor);
+-			 fprintf(fid,'#PBS -l walltime=%i\n',cluster.time*60); %walltime is in seconds.
++			 fprintf(fid,'#PBS -l select=1:ncpus=%i:model=%s\n',np,cluster.processor);
++			 fprintf(fid,'#PBS -l walltime=%i\n',cluster.time); %walltime is in seconds.
+ 			 fprintf(fid,'#PBS -q %s \n',cluster.queue);
+ 			 fprintf(fid,'#PBS -W group_list=%s\n',cluster.grouplist);
+ 			 fprintf(fid,'#PBS -m e\n');
+@@ -237,8 +234,8 @@
+ 			 fprintf(fid,'module load gcc/4.4.4\n');
+ 			 fprintf(fid,'export PATH="$PATH:."\n');
+ 			 fprintf(fid,'export MPI_GROUP_MAX=64\n\n');
+-			 fprintf(fid,'cd %s/%s/\n\n',cluster.executionpath,modelname);
+-			 fprintf(fid,'mpiexec -np %i ./mitgcm\n',cluster.np); 
++			 fprintf(fid,['cd ' pwd() ' \n\n']);
++			 fprintf(fid,'mpiexec -np %i ./mitgcmuv\n',np); 
+ 		%	 if ~io_gather, %concatenate the output files:
+ 		%		 fprintf(fid,'cat %s.outbin.* > %s.outbin',modelname,modelname);
+ 		%	 end
Index: /issm/oecreview/Archive/18296-19100/ISSM-18790-18791.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18790-18791.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18790-18791.diff	(revision 19102)
@@ -0,0 +1,21 @@
+Index: ../trunk-jpl/test/NightlyRun/test806.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test806.py	(revision 18790)
++++ ../trunk-jpl/test/NightlyRun/test806.py	(revision 18791)
+@@ -7,6 +7,7 @@
+ from EnumDefinitions import *
+ from solve import *
+ from MatlabFuncs import *
++from numpy import *
+ 
+ md=triangle(model(),'../Exp/Square.exp',50000.)
+ md=setmask(md,'','')
+@@ -19,7 +20,7 @@
+ xmax = max(x)
+ Lx = (xmax-xmin)
+ alpha = 2./3.
+-md.mask.ice_levelset = ((x - alpha*Lx)>0) - ((x - alpha*Lx)<0)
++md.mask.ice_levelset = numpy.float_((x - alpha*Lx)>0) - numpy.float_((x - alpha*Lx)<0)
+ 
+ md.timestepping.time_step=10
+ md.timestepping.final_time=30
Index: /issm/oecreview/Archive/18296-19100/ISSM-18791-18792.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18791-18792.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18791-18792.diff	(revision 19102)
@@ -0,0 +1,35 @@
+Index: ../trunk-jpl/test/NightlyRun/test806.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test806.py	(revision 18791)
++++ ../trunk-jpl/test/NightlyRun/test806.py	(revision 18792)
+@@ -7,7 +7,7 @@
+ from EnumDefinitions import *
+ from solve import *
+ from MatlabFuncs import *
+-from numpy import *
++import numpy
+ 
+ md=triangle(model(),'../Exp/Square.exp',50000.)
+ md=setmask(md,'','')
+@@ -39,7 +39,7 @@
+ md.calving=calvinglevermann();
+ md.calving.coeff=4.89e13*numpy.ones((md.mesh.numberofvertices,1));
+ 
+-md.transient.requested_outputs={'default','StrainRateparallel','StrainRateperpendicular','Calvingratex','Calvingratey','CalvingCalvingrate'}
++md.transient.requested_outputs=['default','StrainRateparallel','StrainRateperpendicular','Calvingratex','Calvingratey','CalvingCalvingrate']
+ 
+ md=solve(md,TransientSolutionEnum())
+ 
+Index: ../trunk-jpl/src/m/classes/calvinglevermann.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvinglevermann.py	(revision 18791)
++++ ../trunk-jpl/src/m/classes/calvinglevermann.py	(revision 18792)
+@@ -33,7 +33,7 @@
+ 	def checkconsistency(self,md,solution,analyses):    # {{{
+ 
+ 		#Early return
+-		if (solution!=TransientSolutionEnum()) or (not md.transient.iscalvinglevermann):
++		if (solution!=TransientSolutionEnum()) or (not md.transient.iscalving):
+ 			return md
+ 
+ 		md = checkfield(md,'fieldname','calving.coeff','size',[md.mesh.numberofvertices],'>',0)
Index: /issm/oecreview/Archive/18296-19100/ISSM-18792-18793.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18792-18793.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18792-18793.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/test/NightlyRun/test806.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test806.py	(revision 18792)
++++ ../trunk-jpl/test/NightlyRun/test806.py	(revision 18793)
+@@ -10,7 +10,7 @@
+ import numpy
+ 
+ md=triangle(model(),'../Exp/Square.exp',50000.)
+-md=setmask(md,'','')
++md=setmask(md,'all','')
+ md=parameterize(md,'../Par/SquareShelf.py')
+ md=setflowequation(md,'SSA','all')
+ md.cluster=generic('name',oshostname(),'np',3)
Index: /issm/oecreview/Archive/18296-19100/ISSM-18793-18794.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18793-18794.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18793-18794.diff	(revision 19102)
@@ -0,0 +1,14 @@
+Index: ../trunk-jpl/src/c/cores/ad_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/ad_core.cpp	(revision 18793)
++++ ../trunk-jpl/src/c/cores/ad_core.cpp	(revision 18794)
+@@ -58,8 +58,8 @@
+ 			}
+ 			
+ 			/*Print tape statistics so that user can kill this run if something is off already:*/
+-			tapestats(my_rank,tape_stats); //reading of tape statistics
+ 			if(VerboseAutodiff()){
++				tapestats(my_rank,tape_stats); //reading of tape statistics
+ 				int commSize=IssmComm::GetSize();
+ 				int *sstats=new int[7];
+ 				sstats[0]=tape_stats[NUM_OPERATIONS];
Index: /issm/oecreview/Archive/18296-19100/ISSM-18794-18795.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18794-18795.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18794-18795.diff	(revision 19102)
@@ -0,0 +1,15 @@
+Index: ../trunk-jpl/src/m/classes/frictionweertman.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionweertman.m	(revision 18794)
++++ ../trunk-jpl/src/m/classes/frictionweertman.m	(revision 18795)
+@@ -33,8 +33,8 @@
+ 
+ 			%Early return
+ 			if ~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(ThermalAnalysisEnum(),analyses), return; end
+-			md = checkfield(md,'fieldname','frictionweertman.C','forcing',1,'NaN',1);
+-			md = checkfield(md,'fieldname','frictionweertman.m','NaN',1,'size',[md.mesh.numberofelements 1]);
++			md = checkfield(md,'fieldname','friction.C','forcing',1,'NaN',1);
++			md = checkfield(md,'fieldname','friction.m','NaN',1,'size',[md.mesh.numberofelements 1]);
+ 		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('Weertman sliding law parameters: Sigma_b = C^2 * |u_b|^(1/m-1) * u_b'));
Index: /issm/oecreview/Archive/18296-19100/ISSM-18795-18796.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18795-18796.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18795-18796.diff	(revision 19102)
@@ -0,0 +1,292 @@
+Index: ../trunk-jpl/src/m/contrib/paraview/exportVTK.py
+===================================================================
+--- ../trunk-jpl/src/m/contrib/paraview/exportVTK.py	(revision 18795)
++++ ../trunk-jpl/src/m/contrib/paraview/exportVTK.py	(revision 18796)
+@@ -1,139 +1,156 @@
+ import numpy
+-def exportVTK(filename,model,options):
+-    '''
+-    vtk export
+-    function exportVTK(filename,model)
+-    creates a directory with the vtk files for displays in paraview
+-    (only work for triangle and wedges based on their number of nodes)
+-    
+-    Give only the results for nw but could be extended to geometry, mask... 
+-    
+-    input: filename   destination 
+-    (string)
+-    ------------------------------------------------------------------
+-    model      this is md 
+-    ------------------------------------------------------------------
+-    By default only the results are exported, you can add whichever
+-    field you need as a string:
+-    add 'geometry' to export md.geometry
+-    
+-    Basile de Fleurian:
+-    '''
++import os
++import model
++import glob
++def exportVTK(filename,model,*args):
++	'''
++	vtk export
++	function exportVTK(filename,model)
++	creates a directory with the vtk files for displays in paraview
++	(only work for triangle and wedges based on their number of nodes)
++	
++	Give only the results for nw but could be extended to geometry, mask... 
++	
++	input: filename   destination 
++	(string)
++	------------------------------------------------------------------
++model      this is md 
++	------------------------------------------------------------------
++	By default only the results are exported, you can add whichever
++	field you need as a string:
++	add 'geometry' to export md.geometry
+ 
+-[path,name,ext]=fileparts(filename)
+-separator=filesep
+-mkdir(filename)
++	Basile de Fleurian:
++	'''
++	Dir=os.path.basename(filename)
++	Path=filename[:-len(Dir)]
+ 
+-#get the element related variables
+-if model.mesh.shape[0]==2:
+-    points=[model.mesh.x,model.mesh.y,zeros(model.mesh.numberofvertices,1)];
+-else:
+-    points=[model.mesh.x,model.mesh.y,model.mesh.z]
++	if os.path.exists(filename):
++		print ('File {} allready exist'.format(filename))
++		newname=raw_input('Give a new name or "delete" to replace: ')
++		if newname=='delete':
++			filelist = glob.glob(filename+'/*')
++			for oldfile in filelist:
++				os.remove(oldfile)
++		else:
++			print ('New file name is {}'.format(newname))
++			filename=newname
++			os.mkdir(filename)
++	else:
++		os.mkdir(filename)
+ 
+-[num_of_points,dim]=numpy.size(points)
+-[num_of_elt]=numpy.size(model.mesh.elements,1)
+-[point_per_elt]=numpy.size(model.mesh.elements,2)
++	#get the element related variables
++	if 'z' in dict.keys(model.mesh.__dict__):
++		points=numpy.column_stack((model.mesh.x,model.mesh.y,model.mesh.z))
++		dim=3
++	else:
++		points=numpy.column_stack((model.mesh.x,model.mesh.y,numpy.zeros(numpy.shape(model.mesh.x))))
++		dim=2
+ 
+-#Select the type of element function of the number of nodes per elements
+-if point_per_elt==3:
+-    celltype=5 #triangles
+-elif point_per_elt==6:
+-    celltype=13 #wedges
+-else:
+-    error('Your Element definition is not taken into account \n')
+-    
+-#this is the result structure
+-res_struct=model.results
+-if (len(fields(res_struct))>0):
+-    #Getting all the solutions of the model
+-    solnames=fields(res_struct)
+-    num_of_sols=numpy.length(solnames)
+-    num_of_timesteps=1
+-    #%building solutionstructure 
+-    for solution in num_of_sols:
+-        sol_struct[i]=res_struct.(solnames[i]);
+-        #looking for multiple time steps
+-        if(numpy.size(sol_struct[i],2)>num_of_timesteps):
+-            num_of_timesteps=numpy.size(sol_struct[i],2);
++	num_of_points=numpy.size(model.mesh.x)
++	num_of_elt=numpy.shape(model.mesh.elements)[0]
++	point_per_elt=numpy.shape(model.mesh.elements)[1]
++		
++	#Select the type of element function of the number of nodes per elements
++	if point_per_elt==3:
++		celltype=5 #triangles
++	elif point_per_elt==6:
++		celltype=13 #wedges
++	else:
++		error('Your Element definition is not taken into account \n')
+ 
+-else:
+-    num_of_timesteps=1
++	#this is the result structure
++	res_struct=model.results
++	if (len(res_struct.__dict__)>0):
++		#Getting all the solutions of the model
++		solnames=(dict.keys(res_struct.__dict__))
++		num_of_sols=len(solnames)
++		num_of_timesteps=1
++		out_freq=model.settings.output_frequency
++		#%building solutionstructure 
++		for solution in solnames:
++			#looking for multiple time steps
++			if (len(res_struct.__dict__[solution])>num_of_timesteps):
++				num_of_timesteps=len(res_struct.__dict__[solution])
++				num_of_timesteps=int(num_of_timesteps/out_freq)+1
++	else:
++		num_of_timesteps=1
+ 
+-for step in num_of_timesteps:
+-    
+-    timestep=step
+-    
+-    fid = open(strcat(path,filesep,name,filesep,name,'.vtk',int2str(timestep),'.vtk'),'w+')
+-    fid.write('# vtk DataFile Version 2.0 \n')
+-    fid.write('Data for run %s \n' % model.miscellaneous.name)
+-    fid.write('ASCII \n')
+-    fid.write('DATASET UNSTRUCTURED_GRID \n')
++	for step in range(0,num_of_timesteps):
++		timestep=step
++		fid=open((filename +'/Timestep.vtk'+str(timestep)+'.vtk'),'w+')
++		fid.write('# vtk DataFile Version 2.0 \n')
++		fid.write('Data for run %s \n' % model.miscellaneous.name)
++		fid.write('ASCII \n')
++		fid.write('DATASET UNSTRUCTURED_GRID \n')
++		fid.write('POINTS %d float\n' % num_of_points)
++		if(dim==3):
++			for point in points:
++				fid.write('%f %f %f \n'%(point[0], point[1], point[2]))
++		elif(dim==2):
++			for point in points:
++				fid.write('%f %f %f \n'%(point[0], point[1], point[2]))
++			
++		fid.write('CELLS %d %d\n' %(num_of_elt, num_of_elt*(point_per_elt+1)))
++		
++		if point_per_elt==3:
++			for elt in range(0, num_of_elt):
++				fid.write('3 %d %d %d\n' %(model.mesh.elements[elt,0]-1,model.mesh.elements[elt,1]-1,model.mesh.elements[elt,2]-1))
++		elif point_per_elt==6:
++			for elt in range(0, num_of_elt):
++				fid.write('6 %d %d %d %d %d %d\n' %(model.mesh.elements[elt,0]-1,model.mesh.elements[elt,1]-1,model.mesh.elements[elt,2]-1,model.mesh.elements[elt,3]-1,model.mesh.elements[elt,4]-1,model.mesh.elements[elt,5]-1))
++		else:
++			print 'Number of nodes per element not supported'
++
++		fid.write('CELL_TYPES %d\n' %num_of_elt)
++		for elt in range(0, num_of_elt):
++			fid.write('%d\n' %celltype)
++
++		fid.write('POINT_DATA %s \n' %str(num_of_points))
+ 	
+-    fid.write(fid,'POINTS %d float\n',num_of_points)
+-    if(dim==3):
+-        s='%f %f %f \n'
+-    elif(dim==2):
+-        s='%f %f \n'
+-    
+-    P=[points zeros(num_of_points,3-dim)]
+-    fid.write(fid,s,transpose de P)
+-	
+-    fid.write('CELLS %d %d\n' % num_of_elt % num_of_elt*(point_per_elt+1))
+-    s='%d'
+-    for j=1:point_per_elt:
+-        s=horzcat(s,{' %d'})
+-        
+-    s=cell2mat(horzcat(s,{'\n'}))
+-    fid.write(fid,s,[(point_per_elt)*ones(num_of_elt,1) model.mesh.elements-1]transpose)
+-    
+-    fid.write(fid,'CELL_TYPES %d\n',num_of_elt)
+-    s='%d\n'
+-    fid.write(fid,s,celltype*ones(num_of_elt,1))
+-    fid.write(fid,'POINT_DATA %s \n',num2str(num_of_points))
+-    
+-    #loop over the different solution structures
+-    if 'num_of_sols' in locals():
+-        for j=1:num_of_sols:
+-            #dealing with results on different timesteps
+-            if(numpy.size(sol_struct{j},2)>timestep):
+-                timestep = step
+-            else:
+-                timestep = numpy.size(sol_struct{j},2)
+-                
+-            #getting the number of fields in the solution
+-            fieldnames=fields(sol_struct{j}(timestep))
+-            num_of_fields=numpy.length(fieldnames)
+-		
+-            #check which field is a real result and print
+-            for k=1:num_of_fields:
+-                if ((numel(sol_struct{j}(timestep).(fieldnames{k})))==num_of_points):
+-                    #paraview does not like NaN, replacing
+-                    nanval=find(isnan(sol_struct{j}(timestep).(fieldnames{k})))
+-                    sol_struct{j}(timestep).(fieldnames{k})(nanval)=-9999
+-                    #also checking for verry small value that mess up
+-                    smallval=(abs(sol_struct{j}(timestep).(fieldnames{k}))<1.0e-20)
+-                    sol_struct{j}(timestep).(fieldnames{k})(smallval)=0.0
+-                    fid.write('SCALARS %s float 1 \n' % fieldnames{k})
+-                    fid.write('LOOKUP_TABLE default\n')
+-                    s='%e\n'
+-                    fid.write(s % sol_struct{j}(timestep).(fieldnames{k}))
+-                    
+-    #loop on arguments, if something other than result is asked, do
+-    #it now
+-    for j= 1:nargin-2:
+-        res_struct=model.(varargin{j})
+-        fieldnames=fields(res_struct)
+-        num_of_fields=numpy.length(fieldnames)
+-        for k=1:num_of_fields:
+-            if ((numel(res_struct.(fieldnames{k})))==num_of_points):
+-                #paraview does not like NaN, replacing
+-                nanval=find(isnan(res_struct.(fieldnames{k})))
+-                res_struct.(fieldnames{k})(nanval)=-9999
+-                #also checking for verry small value that mess up
+-                smallval=(abs(res_struct.(fieldnames{k}))<1.0e-20)
+-                res_struct.(fieldnames{k})(smallval)=0.0
+-                fid.write(fid,'SCALARS %s float 1 \n',fieldnames{k})
+-                fid.write(fid,'LOOKUP_TABLE default\n')
+-                s='%e\n'
+-                fid.write(fid,s,res_struct.(fieldnames{k}))
+-    fid.close();
++		#loop over the different solution structures
++		if 'solnames' in locals():
++			for sol in solnames:
++				#dealing with results on different timesteps
++				if(len(res_struct.__dict__[sol])>timestep):
++					timestep = step
++				else:
++					timestep = len(res_struct.__dict__[sol])
++				
++				#getting the  fields in the solution
++				fieldnames=dict.keys(res_struct.__dict__[sol].__getitem__(timestep*out_freq-1).__dict__)
++			
++				#check which field is a real result and print
++				for field in fieldnames:
++					if ((numpy.size(res_struct.__dict__[sol].__getitem__(timestep*out_freq-1).__dict__[field]))==num_of_points):
++						fid.write('SCALARS %s float 1 \n' % field)
++						fid.write('LOOKUP_TABLE default\n')
++						for node in range(0,num_of_points):
++							#paraview does not like NaN, replacing
++							if numpy.isnan(res_struct.__dict__[sol].__getitem__(timestep*out_freq-1).__dict__[field][node]):
++								fid.write('%e\n' % -9999.9999)
++							#also checking for verry small value that mess up
++							elif (abs(res_struct.__dict__[sol].__getitem__(timestep*out_freq-1).__dict__[field][node])<1.0e-20):
++								fid.write('%e\n' % 0.0)
++							else:
++								fid.write('%e\n' % res_struct.__dict__[sol].__getitem__(timestep*out_freq-1).__dict__[field][node])
++					
++		#loop on arguments, if something other than result is asked, do
++		#it now
++		for other in args:
++			other_struct=model.__dict__[other]
++			othernames=(dict.keys(other_struct.__dict__))
++			for field in othernames:
++				if ((numpy.size(other_struct.__dict__[field]))==num_of_points):
++					fid.write('SCALARS %s float 1 \n' % field)
++					fid.write('LOOKUP_TABLE default\n')
++					for node in range(0,num_of_points):
++						#paraview does not like NaN, replacing
++						if numpy.isnan(other_struct.__dict__[field][node]):
++							fid.write('%e\n' % -9999.9999)
++						#also checking for verry small value that mess up
++						elif (abs(other_struct.__dict__[field][node])<1.0e-20):
++							fid.write('%e\n' % 0.0)
++						else:
++							fid.write('%e\n' % other_struct.__dict__[field][node])
++	fid.close();
Index: /issm/oecreview/Archive/18296-19100/ISSM-18796-18797.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18796-18797.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18796-18797.diff	(revision 19102)
@@ -0,0 +1,17 @@
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18796)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18797)
+@@ -223,12 +223,9 @@
+ 	else{
+ 		alpha=(pow(q_exp-1,q_exp-1))/pow(q_exp,q_exp);
+ 	}
+-	
+ 	Chi=vmag/(pow(C_param,n)*pow(Neff,n)*As);
+-
+ 	alpha2=pow((pow(vmag,1.-n)/(As*(1+alpha*pow(Chi,q_exp)))),1./n);
+ 	_assert_(!xIsNan<IssmDouble>(alpha2));
+-	
+ 	/*Assign output pointers:*/
+ 	*palpha2=alpha2;
+ }/*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18797-18798.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18797-18798.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18797-18798.diff	(revision 19102)
@@ -0,0 +1,20 @@
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 18797)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 18798)
+@@ -201,6 +201,7 @@
+ 				md.friction.q=project2d(md,md.friction.q,1);
+ 				md.friction.C=project2d(md,md.friction.C,1);
+ 				md.friction.As=project2d(md,md.friction.As,1);
++				md.friction.effective_pressure=project2d(md,md.friction.effective_pressure,1);
+ 			elseif isa(md.friction,'frictionwaterlayer'),
+ 				md.friction.coefficient=project2d(md,md.friction.coefficient,1);
+ 				md.friction.p=project2d(md,md.friction.p,1);
+@@ -761,6 +762,7 @@
+ 				md.friction.q=project3d(md,'vector',md.friction.q,'type','element');
+ 				md.friction.C=project3d(md,'vector',md.friction.C,'type','element');
+ 				md.friction.As=project3d(md,'vector',md.friction.As,'type','element');
++				md.friction.effective_pressure=project3d(md,'vector',md.friction.effective_pressure,'type','node','layer',1);
+ 			elseif isa(md.friction,'frictionwaterlayer'),
+ 				md.friction.coefficient=project3d(md,'vector',md.friction.coefficient,'type','node','layer',1);
+ 				md.friction.p=project3d(md,'vector',md.friction.p,'type','element');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18798-18799.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18798-18799.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18798-18799.diff	(revision 19102)
@@ -0,0 +1,18 @@
+Index: ../trunk-jpl/src/m/classes/frictionweertman.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionweertman.m	(revision 18798)
++++ ../trunk-jpl/src/m/classes/frictionweertman.m	(revision 18799)
+@@ -37,7 +37,12 @@
+ 			md = checkfield(md,'fieldname','friction.m','NaN',1,'size',[md.mesh.numberofelements 1]);
+ 		end % }}}
+ 		function disp(obj) % {{{
+-			disp(sprintf('Weertman sliding law parameters: Sigma_b = C^2 * |u_b|^(1/m-1) * u_b'));
++			disp('Weertman sliding law parameters:');
++			disp('   Weertman''s sliding law reads:');
++			disp('      v_b = C * Sigma_b^m');
++			disp('   In ISSM, this law is rewritten as:');
++			disp('      Sigma_b = C^(1/m) * |u_b|^(1/m-1)  u_b');
++			disp(' ');
+ 			fielddisplay(obj,'C','friction coefficient [SI]');
+ 			fielddisplay(obj,'m','m exponent');
+ 		end % }}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18799-18800.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18799-18800.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18799-18800.diff	(revision 19102)
@@ -0,0 +1,26 @@
+Index: ../trunk-jpl/src/m/classes/frictionweertman.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionweertman.py	(revision 18799)
++++ ../trunk-jpl/src/m/classes/frictionweertman.py	(revision 18800)
+@@ -20,7 +20,7 @@
+ 
+ 		#}}}
+ 	def __repr__(self): # {{{
+-		string="Weertman sliding law parameters: Sigma_b = C^2 * |u_b|^(1/m-1) * u_b"
++		string="Weertman sliding law parameters: Sigma_b = C^(-1/m) * |u_b|^(1/m-1) * u_b"
+ 
+ 		string="%s\n%s"%(string,fielddisplay(self,"C","friction coefficient [SI]"))
+ 		string="%s\n%s"%(string,fielddisplay(self,"m","m exponent"))
+Index: ../trunk-jpl/src/m/classes/frictionweertman.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionweertman.m	(revision 18799)
++++ ../trunk-jpl/src/m/classes/frictionweertman.m	(revision 18800)
+@@ -41,7 +41,7 @@
+ 			disp('   Weertman''s sliding law reads:');
+ 			disp('      v_b = C * Sigma_b^m');
+ 			disp('   In ISSM, this law is rewritten as:');
+-			disp('      Sigma_b = C^(1/m) * |u_b|^(1/m-1)  u_b');
++			disp('      Sigma_b = C^(-1/m) * |u_b|^(1/m-1)  u_b');
+ 			disp(' ');
+ 			fielddisplay(obj,'C','friction coefficient [SI]');
+ 			fielddisplay(obj,'m','m exponent');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18800-18801.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18800-18801.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18800-18801.diff	(revision 19102)
@@ -0,0 +1,426 @@
+Index: ../trunk-jpl/m4/issm_options.m4
+===================================================================
+--- ../trunk-jpl/m4/issm_options.m4	(revision 18800)
++++ ../trunk-jpl/m4/issm_options.m4	(revision 18801)
+@@ -1080,10 +1080,37 @@
+ 	dnl m1qn3 headers and libraries
+ 	if test "x$HAVE_M1QN3" == "xyes"; then
+ 	  M1QN3LIB="$M1QN3_ROOT/libm1qn3.a $M1QN3_ROOT//libddot.a"
+-	  AC_DEFINE([_HAVE_M1QN3_],[1],[with M1QN3I in ISSM src])
++	  AC_DEFINE([_HAVE_M1QN3_],[1],[with M1QN3 in ISSM src])
+ 	  AC_SUBST([M1QN3LIB])
+ 	fi
+ 	dnl }}}
++	dnl proj.4{{{
++	AC_ARG_WITH([proj4-dir],
++		AS_HELP_STRING([--with-proj4-dir=DIR], [proj4 root directory.]),
++		[PROJ4_ROOT=$withval],[PROJ4_ROOT="no"]) 
++
++	dnl Check whether proj4 is enabled
++	AC_MSG_CHECKING([for proj.4])
++	if test "x$PROJ4_ROOT" = "xno" ; then
++		HAVE_PROJ4=no
++	else
++		HAVE_PROJ4=yes
++		if ! test -d "$PROJ4_ROOT"; then
++			AC_MSG_ERROR([proj4 directory provided ($PROJ4_ROOT) does not exist]);
++		fi
++	fi
++	AC_MSG_RESULT($HAVE_PROJ4)
++	
++	dnl proj4 headers and libraries
++	if test "x$HAVE_PROJ4" == "xyes"; then
++	  PROJ4INCL="-I$PROJ4_ROOT/include "
++	  PROJ4LIB="-L$PROJ4_ROOT/lib -lproj"
++	  AC_DEFINE([_HAVE_PROJ4_],[1],[with PROJ4 in ISSM src])
++	  AC_SUBST([PROJ4INCL])
++	  AC_SUBST([PROJ4LIB])
++	fi
++	AM_CONDITIONAL([PROJ4],[test x$HAVE_PROJ4 = xyes])
++	dnl }}}
+ 	dnl slepc{{{
+ 	AC_ARG_WITH([slepc-dir],
+ 	  AS_HELP_STRING([--with-slepc-dir=DIR],[slepc root directory]),
+Index: ../trunk-jpl/src/c/modules/CoordinateSystemTransformx/CoordinateSystemTransformx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/CoordinateSystemTransformx/CoordinateSystemTransformx.cpp	(revision 0)
++++ ../trunk-jpl/src/c/modules/CoordinateSystemTransformx/CoordinateSystemTransformx.cpp	(revision 18801)
+@@ -0,0 +1,40 @@
++/*!\file TriMeshx
++ * \brief: x code for TriMesh mesher
++ */
++
++/*Header files*/
++#include "./CoordinateSystemTransformx.h"
++#include "../../shared/shared.h"
++#include "../../toolkits/toolkits.h"
++#include <proj_api.h>
++
++void CoordinateSystemTransformx(IssmDouble** px_dest,IssmDouble** py_dest,IssmDouble* x_src,IssmDouble* y_src,int size,const char* str_src,const char* str_dst){
++
++#if !defined(_HAVE_PROJ4_)
++	_error_("proj.4 has not been installed");
++#else
++
++	/*Allocate output and initialize values as src*/
++	_assert_(size>0);
++	IssmDouble* x_dest = xNew<IssmDouble>(size);
++	IssmDouble* y_dest = xNew<IssmDouble>(size);
++	for(int i=0;i<size;i++){
++		x_dest[i] = x_src[i];
++		y_dest[i] = y_src[i];
++	}
++
++	/*Create proj.4 projection objects for src and dst*/
++	projPJ pj_src  = pj_init_plus(str_src);
++	projPJ pj_dst  = pj_init_plus(str_dst);
++	if(!pj_src) _error_("Failed to initialize PROJ.4 with source projection \""    <<str_src<<"\"\n");
++	if(!pj_dst) _error_("Failed to initialize PROJ.4 with destination projection\""<<str_dst<<"\"\n");
++
++	/*Perform transformation*/
++	int p = pj_transform(pj_src,pj_dst,size,1,x_dest,y_dest,NULL);
++	if(p!=0) _error_("Reprojection failed, PROJ.4 error code: "<<p<<"\n");
++
++	/*Output : */
++	*px_dest=x_dest;
++	*py_dest=y_dest;
++#endif
++}
+Index: ../trunk-jpl/src/c/modules/CoordinateSystemTransformx/CoordinateSystemTransformx.h
+===================================================================
+--- ../trunk-jpl/src/c/modules/CoordinateSystemTransformx/CoordinateSystemTransformx.h	(revision 0)
++++ ../trunk-jpl/src/c/modules/CoordinateSystemTransformx/CoordinateSystemTransformx.h	(revision 18801)
+@@ -0,0 +1,11 @@
++/*!\file:  CoordinateSystemTransformx.h
++ */ 
++
++#ifndef _CORRDSYSTRANFER_
++#define _CORRDSYSTRANFER_
++
++#include "../../classes/classes.h"
++
++/* local prototypes: */
++void CoordinateSystemTransformx(IssmDouble** px_dest,IssmDouble** py_dest,IssmDouble* x_src,IssmDouble* y_src,int size,const char* str_src,const char* str_dst);
++#endif  
+Index: ../trunk-jpl/src/c/modules/CoordinateSystemTransformx
+===================================================================
+--- ../trunk-jpl/src/c/modules/CoordinateSystemTransformx	(revision 18800)
++++ ../trunk-jpl/src/c/modules/CoordinateSystemTransformx	(revision 18801)
+
+Property changes on: ../trunk-jpl/src/c/modules/CoordinateSystemTransformx
+___________________________________________________________________
+Added: svn:ignore
+## -0,0 +1,2 ##
++.deps
++.dirstamp
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 18800)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 18801)
+@@ -1,4 +1,4 @@
+-AM_CPPFLAGS = @DAKOTAINCL@ @SHAPELIBINCL@ @PETSCINCL@ @SLEPCINCL@ @AMPIINCL@ @MPIINCL@ @METISINCL@ @CHACOINCL@ @SCOTCHINCL@ @PLAPACKINCL@ @BLASLAPACKINCL@ @MKLINCL@ @MUMPSINCL@ @TRIANGLEINCL@ @SPAIINCL@ @HYPREINCL@ @PROMETHEUSINCL@ @SUPERLUINCL@ @SPOOLESINCL@ @PASTIXINCL@ @MLINCL@ @TAOINCL@ @ADIC2INCL@ @ADOLCINCL@ @GSLINCL@ @BOOSTINCL@ @ANDROID_NDKINCL@ @METEOIOINCL@ @SNOWPACKINCL@
++AM_CPPFLAGS = @DAKOTAINCL@ @SHAPELIBINCL@ @PETSCINCL@ @SLEPCINCL@ @AMPIINCL@ @MPIINCL@ @METISINCL@ @CHACOINCL@ @SCOTCHINCL@ @PLAPACKINCL@ @BLASLAPACKINCL@ @MKLINCL@ @MUMPSINCL@ @TRIANGLEINCL@ @SPAIINCL@ @HYPREINCL@ @PROMETHEUSINCL@ @SUPERLUINCL@ @SPOOLESINCL@ @PASTIXINCL@ @MLINCL@ @TAOINCL@ @ADIC2INCL@ @ADOLCINCL@ @GSLINCL@ @BOOSTINCL@ @ANDROID_NDKINCL@ @METEOIOINCL@ @SNOWPACKINCL@ @PROJ4INCL@
+ 
+ AUTOMAKE_OPTIONS = subdir-objects
+ 
+@@ -575,6 +575,11 @@
+ 					./toolkits/gsl/DenseGslSolve.cpp
+ endif
+ #}}}
++#proj.4 sources  {{{
++if PROJ4
++issm_sources += ./modules/CoordinateSystemTransformx/CoordinateSystemTransformx.cpp
++endif
++#}}}
+ #Analyses{{{
+ if ADJOINTBALANCETHICKNESS
+ issm_sources += ./analyses/AdjointBalancethicknessAnalysis.cpp
+@@ -926,7 +931,7 @@
+ endif
+ 
+ #External packages
+-LDADD += $(PETSCLIB) $(TAOLIB) $(M1QN3LIB) $(PLAPACKLIB) $(MUMPSLIB) $(SUPERLULIB) $(SPOOLESLIB) $(SCALAPACKLIB) $(BLACSLIB) $(HYPRELIB) $(SPAILIB) $(PROMETHEUSLIB) $(PASTIXLIB) $(MLLIB) $(DAKOTALIB) $(METISLIB) $(CHACOLIB) $(SCOTCHLIB) $(BLASLAPACKLIB) $(MKLLIB) $(MPILIB)  $(MATHLIB) $(GRAPHICSLIB) $(MULTITHREADINGLIB) $(OSLIBS) $(GSLLIB) $(AMPILIB) $(ADOLCLIB) $(MPILIB) $(METEOIOLIB) $(SNOWPACKLIB)
++LDADD += $(PETSCLIB) $(TAOLIB) $(M1QN3LIB) $(PLAPACKLIB) $(MUMPSLIB) $(SUPERLULIB) $(SPOOLESLIB) $(SCALAPACKLIB) $(BLACSLIB) $(HYPRELIB) $(SPAILIB) $(PROMETHEUSLIB) $(PASTIXLIB) $(MLLIB) $(DAKOTALIB) $(METISLIB) $(CHACOLIB) $(SCOTCHLIB) $(BLASLAPACKLIB) $(MKLLIB) $(MPILIB)  $(MATHLIB) $(GRAPHICSLIB) $(MULTITHREADINGLIB) $(OSLIBS) $(GSLLIB) $(AMPILIB) $(ADOLCLIB) $(MPILIB) $(METEOIOLIB) $(SNOWPACKLIB) $(PROJ4LIB)
+ 
+ if FORTRAN
+ LDADD += $(FLIBS) $(FORTRANLIB)
+Index: ../trunk-jpl/src/wrappers/python/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/wrappers/python/Makefile.am	(revision 18800)
++++ ../trunk-jpl/src/wrappers/python/Makefile.am	(revision 18801)
+@@ -93,43 +93,43 @@
+ #Bin sources {{{
+ BamgConvertMesh_la_SOURCES = ../BamgConvertMesh/BamgConvertMesh.cpp\
+ 									  ../BamgConvertMesh/BamgConvertMesh.h
+-BamgConvertMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++BamgConvertMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ BamgMesher_la_SOURCES = ../BamgMesher/BamgMesher.cpp\
+ 								../BamgMesher/BamgMesher.h
+-BamgMesher_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++BamgMesher_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ ContourToMesh_la_SOURCES = ../ContourToMesh/ContourToMesh.cpp\
+ 									 ../ContourToMesh/ContourToMesh.h
+-ContourToMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++ContourToMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ ContourToNodes_la_SOURCES = ../ContourToNodes/ContourToNodes.cpp\
+ 									 ../ContourToNodes/ContourToNodes.h
+-ContourToNodes_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++ContourToNodes_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ ElementConnectivity_la_SOURCES = ../ElementConnectivity/ElementConnectivity.cpp\
+ 											../ElementConnectivity/ElementConnectivity.h
+-ElementConnectivity_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++ElementConnectivity_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ EnumToString_la_SOURCES = ../EnumToString/EnumToString.cpp\
+ 								  ../EnumToString/EnumToString.h
+-EnumToString_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++EnumToString_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ InterpFromMeshToMesh2d_la_SOURCES = ../InterpFromMeshToMesh2d/InterpFromMeshToMesh2d.cpp\
+ 												../InterpFromMeshToMesh2d/InterpFromMeshToMesh2d.h
+-InterpFromMeshToMesh2d_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB)
++InterpFromMeshToMesh2d_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ InterpFromMeshToMesh3d_la_SOURCES = ../InterpFromMeshToMesh3d/InterpFromMeshToMesh3d.cpp\
+ 												../InterpFromMeshToMesh3d/InterpFromMeshToMesh3d.h
+-InterpFromMeshToMesh3d_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB)
++InterpFromMeshToMesh3d_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ InterpFromGridToMesh_la_SOURCES = ../InterpFromGridToMesh/InterpFromGridToMesh.cpp\
+ 												../InterpFromGridToMesh/InterpFromGridToMesh.h
+-InterpFromGridToMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB)
++InterpFromGridToMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ InterpFromMeshToGrid_la_SOURCES = ../InterpFromMeshToGrid/InterpFromMeshToGrid.cpp\
+ 												../InterpFromMeshToGrid/InterpFromMeshToGrid.h
+-InterpFromMeshToGrid_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB)
++InterpFromMeshToGrid_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ IssmConfig_la_SOURCES = ../IssmConfig/IssmConfig.cpp\
+ 											 ../IssmConfig/IssmConfig.h
+@@ -137,21 +137,21 @@
+ 
+ MeshProfileIntersection_la_SOURCES = ../MeshProfileIntersection/MeshProfileIntersection.cpp\
+ 										../MeshProfileIntersection/MeshProfileIntersection.h
+-MeshProfileIntersection_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++MeshProfileIntersection_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ NodeConnectivity_la_SOURCES = ../NodeConnectivity/NodeConnectivity.cpp\
+ 										../NodeConnectivity/NodeConnectivity.h
+-NodeConnectivity_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++NodeConnectivity_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ StringToEnum_la_SOURCES = ../StringToEnum/StringToEnum.cpp\
+ 								  ../StringToEnum/StringToEnum.h
+-StringToEnum_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++StringToEnum_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ TriMesh_la_SOURCES = ../TriMesh/TriMesh.cpp\
+ 							../TriMesh/TriMesh.h
+-TriMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(TRIANGLELIB) $(GSLLIB)
++TriMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(TRIANGLELIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ TriMeshProcessRifts_la_SOURCES = ../TriMeshProcessRifts/TriMeshProcessRifts.cpp\
+ 											../TriMeshProcessRifts/TriMeshProcessRifts.h
+-TriMeshProcessRifts_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++TriMeshProcessRifts_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ #}}}
+Index: ../trunk-jpl/src/wrappers/matlab/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/wrappers/matlab/Makefile.am	(revision 18800)
++++ ../trunk-jpl/src/wrappers/matlab/Makefile.am	(revision 18801)
+@@ -108,13 +108,13 @@
+ AM_CXXFLAGS += $(CXXOPTFLAGS) 
+ #}}}
+ # Module sources and dependencies {{{
+-libISSMMatlab_la_LIBADD = ./../../c/libISSMCore.la ./../../c/libISSMModules.la $(MPILIB) $(PETSCLIB) $(GSLLIB) $(MATHLIB) $(MEXLIB) 
++libISSMMatlab_la_LIBADD = ./../../c/libISSMCore.la ./../../c/libISSMModules.la $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB) $(MATHLIB) $(MEXLIB) 
+ 
+ if STANDALONE_LIBRARIES
+ libISSMMatlab_la_LDFLAGS = -static 
+ endif
+ 
+-libISSMApi_la_LIBADD = $(MPILIB) $(PETSCLIB) $(GSLLIB) $(MATHLIB) $(MEXLIB)
++libISSMApi_la_LIBADD = $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB) $(MATHLIB) $(MEXLIB)
+ 
+ if STANDALONE_LIBRARIES
+ libISSMApi_la_LDFLAGS = -static 
+@@ -122,59 +122,59 @@
+ 
+ BamgMesher_la_SOURCES = ../BamgMesher/BamgMesher.cpp\
+ 								../BamgMesher/BamgMesher.h
+-BamgMesher_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++BamgMesher_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ BamgConvertMesh_la_SOURCES = ../BamgConvertMesh/BamgConvertMesh.cpp\
+ 									  ../BamgConvertMesh/BamgConvertMesh.h
+-BamgConvertMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++BamgConvertMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ BamgTriangulate_la_SOURCES = ../BamgTriangulate/BamgTriangulate.cpp\
+ 									  ../BamgTriangulate/BamgTriangulate.h
+-BamgTriangulate_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++BamgTriangulate_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ Chaco_la_SOURCES = ../Chaco/Chaco.cpp\
+ 						 ../Chaco/Chaco.h
+-Chaco_la_LIBADD = ${deps} $(MPILIB) $(CHACOLIB) $(GSLLIB) $(PETSCLIB)
++Chaco_la_LIBADD = ${deps} $(MPILIB) $(CHACOLIB) $(GSLLIB) $(PROJ4LIB) $(PETSCLIB)
+ 
+ ContourToMesh_la_SOURCES = ../ContourToMesh/ContourToMesh.cpp\
+ 									../ContourToMesh/ContourToMesh.h
+-ContourToMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB)
++ContourToMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ ContourToNodes_la_SOURCES = ../ContourToNodes/ContourToNodes.cpp\
+ 									 ../ContourToNodes/ContourToNodes.h
+-ContourToNodes_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++ContourToNodes_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ ElementConnectivity_la_SOURCES = ../ElementConnectivity/ElementConnectivity.cpp\
+ 											../ElementConnectivity/ElementConnectivity.h
+-ElementConnectivity_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++ElementConnectivity_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ EnumToString_la_SOURCES = ../EnumToString/EnumToString.cpp\
+ 								  ../EnumToString/EnumToString.h
+-EnumToString_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++EnumToString_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ StringToEnum_la_SOURCES = ../StringToEnum/StringToEnum.cpp\
+ 								  ../StringToEnum/StringToEnum.h
+-StringToEnum_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++StringToEnum_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ InterpFromGridToMesh_la_SOURCES = ../InterpFromGridToMesh/InterpFromGridToMesh.cpp\
+ 											 ../InterpFromGridToMesh/InterpFromGridToMesh.h
+-InterpFromGridToMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB)
++InterpFromGridToMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ InterpFromMeshToMesh2d_la_SOURCES = ../InterpFromMeshToMesh2d/InterpFromMeshToMesh2d.cpp\
+ 												../InterpFromMeshToMesh2d/InterpFromMeshToMesh2d.h
+-InterpFromMeshToMesh2d_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB)
++InterpFromMeshToMesh2d_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ InterpFromMeshToMesh3d_la_SOURCES = ../InterpFromMeshToMesh3d/InterpFromMeshToMesh3d.cpp\
+ 												../InterpFromMeshToMesh3d/InterpFromMeshToMesh3d.h
+-InterpFromMeshToMesh3d_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++InterpFromMeshToMesh3d_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ InterpFromMeshToGrid_la_SOURCES = ../InterpFromMeshToGrid/InterpFromMeshToGrid.cpp\
+ 											 ../InterpFromMeshToGrid/InterpFromMeshToGrid.h
+-InterpFromMeshToGrid_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++InterpFromMeshToGrid_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ InterpFromMesh2d_la_SOURCES = ../InterpFromMesh2d/InterpFromMesh2d.cpp\
+ 										../InterpFromMesh2d/InterpFromMesh2d.h
+-InterpFromMesh2d_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB)
++InterpFromMesh2d_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ IssmConfig_la_SOURCES = ../IssmConfig/IssmConfig.cpp\
+ 										../IssmConfig/IssmConfig.h
+@@ -182,59 +182,59 @@
+ 
+ KMLFileRead_la_SOURCES = ../KMLFileRead/KMLFileRead.cpp\
+ 								 ../KMLFileRead/KMLFileRead.h
+-KMLFileRead_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++KMLFileRead_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ KMLMeshWrite_la_SOURCES = ../KMLMeshWrite/KMLMeshWrite.cpp\
+ 								  ../KMLMeshWrite/KMLMeshWrite.h
+-KMLMeshWrite_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++KMLMeshWrite_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ KMLOverlay_la_SOURCES = ../KMLOverlay/KMLOverlay.cpp\
+ 								../KMLOverlay/KMLOverlay.h
+-KMLOverlay_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++KMLOverlay_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ Xy2ll_la_SOURCES = ../Xy2ll/Xy2ll.cpp\
+ 						 ../Xy2ll/Xy2ll.h
+-Xy2ll_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++Xy2ll_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ Ll2xy_la_SOURCES = ../Ll2xy/Ll2xy.cpp\
+ 						 ../Ll2xy/Ll2xy.h
+-Ll2xy_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++Ll2xy_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ ExpSimplify_la_SOURCES = ../ExpSimplify/ExpSimplify.cpp\
+ 							../ExpSimplify/ExpSimplify.h
+-ExpSimplify_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++ExpSimplify_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ Exp2Kml_la_SOURCES = ../Exp2Kml/Exp2Kml.cpp\
+ 							../Exp2Kml/Exp2Kml.h
+-Exp2Kml_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++Exp2Kml_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ Kml2Exp_la_SOURCES = ../Kml2Exp/Kml2Exp.cpp\
+ 							../Kml2Exp/Kml2Exp.h
+-Kml2Exp_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++Kml2Exp_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ Kriging_la_SOURCES = ../Kriging/Kriging.cpp\
+ 							../Kriging/Kriging.h
+-Kriging_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(MULTITHREADINGLIB) $(GSLLIB)
++Kriging_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ MeshPartition_la_SOURCES = ../MeshPartition/MeshPartition.cpp\
+ 									../MeshPartition/MeshPartition.h
+-MeshPartition_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(METISLIB) $(GSLLIB)
++MeshPartition_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(METISLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ MeshProfileIntersection_la_SOURCES = ../MeshProfileIntersection/MeshProfileIntersection.cpp\
+ 												 ../MeshProfileIntersection/MeshProfileIntersection.h
+-MeshProfileIntersection_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++MeshProfileIntersection_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ NodeConnectivity_la_SOURCES = ../NodeConnectivity/NodeConnectivity.cpp\
+ 										../NodeConnectivity/NodeConnectivity.h
+-NodeConnectivity_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++NodeConnectivity_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ PointCloudFindNeighbors_la_SOURCES = ../PointCloudFindNeighbors/PointCloudFindNeighbors.cpp\
+ 												 ../PointCloudFindNeighbors/PointCloudFindNeighbors.h
+-PointCloudFindNeighbors_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB)
++PointCloudFindNeighbors_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ PropagateFlagsFromConnectivity_la_SOURCES = ../PropagateFlagsFromConnectivity/PropagateFlagsFromConnectivity.cpp\
+ 														  ../PropagateFlagsFromConnectivity/PropagateFlagsFromConnectivity.h
+-PropagateFlagsFromConnectivity_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++PropagateFlagsFromConnectivity_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ Scotch_la_SOURCES = ../Scotch/Scotch.cpp\
+ 						  ../Scotch/Scotch.h
+@@ -242,21 +242,21 @@
+ 
+ ShpRead_la_SOURCES = ../ShpRead/ShpRead.cpp\
+ 							../ShpRead/ShpRead.h
+-ShpRead_la_LIBADD = ${deps} $(SHAPELIBLIB) $(MPILIB) $(PETSCLIB) $(GSLLIB)
++ShpRead_la_LIBADD = ${deps} $(SHAPELIBLIB) $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ Shp2Kml_la_SOURCES = ../Shp2Kml/Shp2Kml.cpp\
+ 							../Shp2Kml/Shp2Kml.h
+-Shp2Kml_la_LIBADD = ${deps} $(SHAPELIBLIB) $(MPILIB) $(PETSCLIB) $(GSLLIB)
++Shp2Kml_la_LIBADD = ${deps} $(SHAPELIBLIB) $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ TriaSearch_la_SOURCES = ../TriaSearch/TriaSearch.cpp\
+ 								../TriaSearch/TriaSearch.h
+-TriaSearch_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++TriaSearch_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ TriMesh_la_SOURCES = ../TriMesh/TriMesh.cpp\
+ 							../TriMesh/TriMesh.h
+-TriMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(TRIANGLELIB) $(GSLLIB)
++TriMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(TRIANGLELIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ TriMeshProcessRifts_la_SOURCES = ../TriMeshProcessRifts/TriMeshProcessRifts.cpp\
+ 											../TriMeshProcessRifts/TriMeshProcessRifts.h
+-TriMeshProcessRifts_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB)
++TriMeshProcessRifts_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ #}}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18801-18802.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18801-18802.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18801-18802.diff	(revision 19102)
@@ -0,0 +1,38 @@
+Index: ../trunk-jpl/scripts/ol
+===================================================================
+--- ../trunk-jpl/scripts/ol	(revision 18801)
++++ ../trunk-jpl/scripts/ol	(revision 18802)
+@@ -1,13 +0,0 @@
+-#!/bin/bash
+-
+-#Get the runme file, read it, and display steps
+-rm -rf orglist_temporary_file
+-LIST=$(cat runme.m | grep perform | sed "s/'/ /g" | awk '{print $3}')
+-
+-COUNT=0;
+-echo "Available steps"
+-for STEP in $LIST
+-do
+-	let COUNT=$COUNT+1
+-	printf '%3i: %s\n' $COUNT $STEP
+-done
+Index: ../trunk-jpl/scripts/ol.m
+===================================================================
+--- ../trunk-jpl/scripts/ol.m	(revision 18801)
++++ ../trunk-jpl/scripts/ol.m	(revision 18802)
+@@ -1 +1,14 @@
+-system('ol');
++
++	fid=fopen('runme.m','r');
++	
++	tline = fgets(fid);
++	count=1;
++	while ischar(tline)
++		tline = fgets(fid);
++		if length(tline)>16,
++			if strcmpi(tline(1:16),'if perform(org,'''),
++				disp(sprintf('%i: %s',count,tline(17:end-5)));
++				count=count+1;
++			end
++		end
++	end
Index: /issm/oecreview/Archive/18296-19100/ISSM-18802-18803.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18802-18803.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18802-18803.diff	(revision 19102)
@@ -0,0 +1,25 @@
+Index: ../trunk-jpl/scripts/ol
+===================================================================
+--- ../trunk-jpl/scripts/ol	(revision 0)
++++ ../trunk-jpl/scripts/ol	(revision 18803)
+@@ -0,0 +1,13 @@
++#!/bin/bash
++
++#Get the runme file, read it, and display steps
++rm -rf orglist_temporary_file
++LIST=$(cat runme.m | grep perform | sed "s/'/ /g" | awk '{print $3}')
++
++COUNT=0;
++echo "Available steps"
++for STEP in $LIST
++do
++	let COUNT=$COUNT+1
++	printf '%3i: %s\n' $COUNT $STEP
++done
+
+Property changes on: ../trunk-jpl/scripts/ol
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18803-18804.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18803-18804.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18803-18804.diff	(revision 19102)
@@ -0,0 +1,213 @@
+Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18803)
++++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18804)
+@@ -132,7 +132,7 @@
+ 	/*Deal with friction parameters*/
+ 	int frictionlaw;
+ 	iomodel->Constant(&frictionlaw,FrictionLawEnum);
+-	if(frictionlaw==4) parameters->AddObject(iomodel->CopyConstantObject(FrictionGammaEnum));
++	if(frictionlaw==4 || frictionlaw==6) parameters->AddObject(iomodel->CopyConstantObject(FrictionGammaEnum));
+ 
+ }/*}}}*/
+ void StressbalanceAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+@@ -285,6 +285,12 @@
+ 			iomodel->FetchDataToInput(elements,FrictionQEnum);
+ 			iomodel->FetchDataToInput(elements,FrictionWaterLayerEnum);
+ 			break;
++		case 6:
++			iomodel->FetchDataToInput(elements,FrictionCEnum);
++			iomodel->FetchDataToInput(elements,FrictionMEnum);
++			iomodel->FetchDataToInput(elements,PressureEnum);
++			iomodel->FetchDataToInput(elements,TemperatureEnum);
++			break;
+ 		default:
+ 			_error_("not supported");
+ 	}
+Index: ../trunk-jpl/src/c/analyses/ThermalAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/ThermalAnalysis.cpp	(revision 18803)
++++ ../trunk-jpl/src/c/analyses/ThermalAnalysis.cpp	(revision 18804)
+@@ -27,6 +27,10 @@
+ 	if(numoutputs)parameters->AddObject(new StringArrayParam(ThermalRequestedOutputsEnum,requestedoutputs,numoutputs));
+ 	iomodel->DeleteData(&requestedoutputs,numoutputs,ThermalRequestedOutputsEnum);
+ 
++	/*Deal with friction parameters*/
++	int frictionlaw;
++	iomodel->Constant(&frictionlaw,FrictionLawEnum);
++	if(frictionlaw==4 || frictionlaw==6) parameters->AddObject(iomodel->CopyConstantObject(FrictionGammaEnum));
+ }/*}}}*/
+ void ThermalAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+@@ -107,6 +111,12 @@
+ 			iomodel->FetchDataToInput(elements,FrictionQEnum);
+ 			iomodel->FetchDataToInput(elements,FrictionWaterLayerEnum);
+ 			break;
++		case 6:
++			iomodel->FetchDataToInput(elements,FrictionCEnum);
++			iomodel->FetchDataToInput(elements,FrictionMEnum);
++			iomodel->FetchDataToInput(elements,PressureEnum);
++			iomodel->FetchDataToInput(elements,TemperatureEnum);
++			break;
+ 		default:
+ 			_error_("not supported");
+ 	}
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18803)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18804)
+@@ -29,7 +29,7 @@
+ 	/*Deal with friction parameters*/
+ 	int frictionlaw;
+ 	iomodel->Constant(&frictionlaw,FrictionLawEnum);
+-	if(frictionlaw==4) parameters->AddObject(iomodel->CopyConstantObject(FrictionGammaEnum));
++	if(frictionlaw==4 || frictionlaw==6) parameters->AddObject(iomodel->CopyConstantObject(FrictionGammaEnum));
+ }/*}}}*/
+ void EnthalpyAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+@@ -119,6 +119,12 @@
+ 			iomodel->FetchDataToInput(elements,FrictionQEnum);
+ 			iomodel->FetchDataToInput(elements,FrictionWaterLayerEnum);
+ 			break;
++		case 6:
++			iomodel->FetchDataToInput(elements,FrictionCEnum);
++			iomodel->FetchDataToInput(elements,FrictionMEnum);
++			iomodel->FetchDataToInput(elements,PressureEnum);
++			iomodel->FetchDataToInput(elements,TemperatureEnum);
++			break;
+ 		default:
+ 			_error_("not supported");
+ 	}
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.h	(revision 18803)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.h	(revision 18804)
+@@ -34,6 +34,7 @@
+ 		void  GetAlpha2Hydro(IssmDouble* palpha2,Gauss* gauss);
+ 		void  GetAlpha2Temp(IssmDouble* palpha2,Gauss* gauss);
+ 		void  GetAlpha2WaterLayer(IssmDouble* palpha2,Gauss* gauss);
++		void  GetAlpha2WeertmanTemp(IssmDouble* palpha2,Gauss* gauss);
+ 		void  GetAlphaComplement(IssmDouble* alpha_complement,Gauss* gauss);
+ };
+ 
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18803)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18804)
+@@ -57,6 +57,9 @@
+ 		case 5:
+ 			GetAlpha2WaterLayer(palpha2,gauss);
+ 			break;
++		case 6:
++			GetAlpha2WeertmanTemp(palpha2,gauss);
++			break;
+ 	  default:
+ 			_error_("not supported");
+ 	}
+@@ -232,7 +235,7 @@
+ void Friction::GetAlpha2Temp(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
+ 	/*Here, we want to parameterize the friction as a function of temperature
+ 	 *
+-	 * alpha2 = alpha2_viscous * f(T)
++	 * alpha2 = alpha2_viscous * 1/f(T)
+ 	 *
+ 	 * where f(T) = exp((T-Tpmp)/gamma)
+ 	 */
+@@ -251,7 +254,7 @@
+ 
+ 	/*Compute scaling parameter*/
+ 	element->parameters->FindParam(&gamma,FrictionGammaEnum);
+-	alpha2 = alpha2*exp((T-Tpmp)/gamma);
++	alpha2 = alpha2 / exp((T-Tpmp)/gamma);
+ 
+ 	/*Assign output pointers:*/
+ 	*palpha2=alpha2;
+@@ -317,6 +320,33 @@
+ 	/*Assign output pointers:*/
+ 	*palpha2=alpha2;
+ }/*}}}*/
++void Friction::GetAlpha2WeertmanTemp(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
++	/*Here, we want to parameterize the friction as a function of temperature
++	 *
++	 * alpha2 = alpha2_weertman * 1/f(T)
++	 *
++	 * where f(T) = exp((T-Tpmp)/gamma)
++	 */
++
++	/*Intermediaries: */
++	IssmDouble  f,T,pressure,Tpmp,gamma;
++	IssmDouble  alpha2;
++
++	/*Get viscous part*/
++	this->GetAlpha2Weertman(&alpha2,gauss);
++
++	/*Get pressure melting point (Tpmp) for local pressure and get current temperature*/
++	element->GetInputValue(&T,gauss,TemperatureEnum);
++	element->GetInputValue(&pressure,gauss,PressureEnum);
++	Tpmp = element->TMeltingPoint(pressure);
++
++	/*Compute scaling parameter*/
++	element->parameters->FindParam(&gamma,FrictionGammaEnum);
++	alpha2 = alpha2 / exp((T-Tpmp)/gamma);
++
++	/*Assign output pointers:*/
++	*palpha2=alpha2;
++}/*}}}*/
+ void Friction::GetAlphaComplement(IssmDouble* palpha_complement, Gauss* gauss){/*{{{*/
+ 
+ 	/* FrictionGetAlpha2 computes alpha2= drag^2 * Neff ^r * vel ^s, with Neff=rho_ice*g*thickness+rho_ice*g*bed, r=q/p and s=1/p. 
+Index: ../trunk-jpl/src/m/classes/frictionweertmantemp.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionweertmantemp.m	(revision 0)
++++ ../trunk-jpl/src/m/classes/frictionweertmantemp.m	(revision 18804)
+@@ -0,0 +1,50 @@
++%FRICTIONWEERTMAN class definition
++%
++%   Usage:
++%      frictionweertmantemp=frictionweertmantemp();
++
++classdef frictionweertmantemp
++	properties (SetAccess=public) 
++		gamma = 0;
++		C = NaN;
++		m = NaN;
++	end
++	methods
++		function obj = frictionweertmantemp(varargin) % {{{
++			switch nargin
++				case 0
++					obj=setdefaultparameters(obj);
++				otherwise
++					error('constructor not supported');
++			end
++		end % }}}
++		function obj = setdefaultparameters(obj) % {{{
++
++		end % }}}
++		function md = checkconsistency(obj,md,solution,analyses) % {{{
++
++			%Early return
++			if ~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(ThermalAnalysisEnum(),analyses), return; end
++			md = checkfield(md,'fieldname','friction.C','forcing',1,'NaN',1);
++			md = checkfield(md,'fieldname','friction.m','NaN',1,'size',[md.mesh.numberofelements 1]);
++		end % }}}
++		function disp(obj) % {{{
++			disp('Weertman sliding law parameters:');
++			disp('      Sigma_b = C^(-1/m) * |u_b|^(1/m-1)  u_b * 1/f(T)');
++			disp(' ');
++			fielddisplay(obj,'gamma','submelt sliding parameter f(T) = exp((T-Tpmp)/gamma)');
++			fielddisplay(obj,'C','friction coefficient [SI]');
++			fielddisplay(obj,'m','m exponent');
++		end % }}}
++		function marshall(obj,md,fid) % {{{
++			yts=365.0*24.0*3600.0;
++
++			WriteData(fid,'enum',FrictionLawEnum,'data',6,'format','Integer');
++			WriteData(fid,'class','friction','object',obj,'fieldname','gamma','format','Double');
++			WriteData(fid,'class','friction','object',obj,'fieldname','C','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'class','friction','object',obj,'fieldname','m','format','DoubleMat','mattype',2);
++			
++
++		end % }}}
++	end
++end
Index: /issm/oecreview/Archive/18296-19100/ISSM-18804-18805.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18804-18805.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18804-18805.diff	(revision 19102)
@@ -0,0 +1,24 @@
+Index: ../trunk-jpl/test/Archives/Archive439.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive438.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18804)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18805)
+@@ -289,8 +289,9 @@
+ 	s=1./drag_p;
+ 
+ 	//From bed and thickness, compute effective pressure when drag is viscous:
+-	Neff=gravity*(rho_ice*thickness+rho_water*(bed+water_layer));
+-	if(Neff<0)Neff=0;
++	if(bed>0) bed=0;
++	Neff=gravity*(rho_ice*thickness+rho_water*(bed-water_layer));
++	if(Neff<0) Neff=0;
+ 
+ 	switch(dim){
+ 		case 1:
Index: /issm/oecreview/Archive/18296-19100/ISSM-18805-18806.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18805-18806.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18805-18806.diff	(revision 19102)
@@ -0,0 +1,64 @@
+Index: ../trunk-jpl/src/c/classes/IoModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/IoModel.cpp	(revision 18805)
++++ ../trunk-jpl/src/c/classes/IoModel.cpp	(revision 18806)
+@@ -1228,6 +1228,59 @@
+ 	*pnum_instances=num_instances;
+ }
+ /*}}}*/
++void  IoModel::FetchMultipleData(IssmDouble** pvector, int* pnum_instances,int data_enum){/*{{{*/
++
++	int     num_instances;
++	fpos_t* file_positions=NULL;
++
++	/*output: */
++	IssmDouble* vector=NULL;
++
++	/*intermediary: */
++	IssmPDouble          scalar;
++	int         *codes   = NULL;
++	int          code;
++
++	/*recover my_rank:*/
++	int my_rank=IssmComm::GetRank();
++	
++	/*Get file pointers to beginning of the data (multiple instances of it): */
++	file_positions=this->SetFilePointersToData(&codes,NULL,&num_instances,data_enum);
++
++	if(num_instances){
++
++		/*Allocate vector :*/
++		vector=xNew<IssmDouble>(num_instances);
++
++		for(int i=0;i<num_instances;i++){
++
++			if(my_rank==0){
++				code=codes[i];
++
++				if(code!=3)_error_("expecting a double for enum " << EnumToStringx(data_enum));
++				
++				/*We have to read a double from disk: */
++				fsetpos(fid,file_positions+i);
++				if(my_rank==0){  
++					if(fread(&scalar,sizeof(IssmPDouble),1,fid)!=1) _error_("could not read scalar ");
++				}
++			}
++			ISSM_MPI_Bcast(&scalar,1,ISSM_MPI_PDOUBLE,0,IssmComm::GetComm()); 
++
++			/*Assign: */
++			vector[i]=scalar;
++		}
++	}
++			
++	/*Free ressources:*/
++	xDelete<fpos_t>(file_positions);
++	xDelete<int>(codes);
++
++	/*Assign output pointers: */
++	*pvector=vector;
++	*pnum_instances=num_instances;
++}
++/*}}}*/
+ void  IoModel::FetchMultipleData(IssmDouble*** pmatrices,int** pmdims,int** pndims, int* pnumrecords,int data_enum){/*{{{*/
+ 
+ 	int     num_instances;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18806-18807.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18806-18807.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18806-18807.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/c/classes/IoModel.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/IoModel.h	(revision 18806)
++++ ../trunk-jpl/src/c/classes/IoModel.h	(revision 18807)
+@@ -81,6 +81,7 @@
+ 		void        FetchData(char***   pstringarray,int* pnumstrings,int data_enum);
+ 		void        FetchData(IssmDouble*** pmatrixarray,int** pmdims,int** pndims, int* pnumrecords,int data_enum);
+ 		void        FetchMultipleData(char***   pstringarray,int* pnumstrings,int data_enum);
++		void        FetchMultipleData(IssmDouble** pvector, int* pnum_instances,int data_enum);
+ 		void        FetchMultipleData(IssmDouble*** pmatrixarray,int** pmdims,int** pndims, int* pnumrecords,int data_enum);
+ 		void        FetchMultipleData(int*** pmatrices,int** pmdims,int** pndims, int* pnumrecords,int data_enum);
+ 		void        FetchMultipleData(int** pvector, int* pnum_instances,int data_enum);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18807-18808.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18807-18808.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18807-18808.diff	(revision 19102)
@@ -0,0 +1,38 @@
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18807)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18808)
+@@ -38,17 +38,22 @@
+ 	iomodel->FetchDataToInput(elements,VyEnum);
+ 
+ 	/*Get calving parameters*/
+-	int calvinglaw;
+-	iomodel->Constant(&calvinglaw,CalvingLawEnum);
+-	switch(calvinglaw){
+-		case DefaultCalvingEnum:
+-			iomodel->FetchDataToInput(elements,CalvingCalvingrateEnum);
+-			break;
+-		case CalvingLevermannEnum:
+-			iomodel->FetchDataToInput(elements,CalvinglevermannCoeffEnum);
+-			break;
+-		default:
+-			_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
++	bool iscalving;
++	int  calvinglaw;
++	iomodel->Constant(&iscalving,TransientIscalvingEnum);
++	if(iscalving){
++		iomodel->Constant(&calvinglaw,CalvingLawEnum);
++		iomodel->Constant(&iscalving,TransientIscalvingEnum);
++		switch(calvinglaw){
++			case DefaultCalvingEnum:
++				iomodel->FetchDataToInput(elements,CalvingCalvingrateEnum);
++				break;
++			case CalvingLevermannEnum:
++				iomodel->FetchDataToInput(elements,CalvinglevermannCoeffEnum);
++				break;
++			default:
++				_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
++		}
+ 	}
+ }
+ /*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18808-18809.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18808-18809.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18808-18809.diff	(revision 19102)
@@ -0,0 +1,29 @@
+Index: ../trunk-jpl/externalpackages/netcdf/install.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/netcdf/install.sh	(revision 18808)
++++ ../trunk-jpl/externalpackages/netcdf/install.sh	(revision 18809)
+@@ -3,19 +3,19 @@
+ #you need hdf5 compiled
+ 
+ #Some cleanup
+-rm -rf src install netcdf-4.2
++rm -rf src install netcdf-4.3.2
+ mkdir install src
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py "http://issm.jpl.nasa.gov/files/externalpackages/netcdf-4.2.tar.gz" "netcdf-4.2.tar.gz"
++$ISSM_DIR/scripts/DownloadExternalPackage.py "http://issm.jpl.nasa.gov/files/externalpackages/netcdf-4.3.2.tar.gz" "netcdf-4.3.2.tar.gz"
+ 
+ #Untar 
+-tar -zxvf  netcdf-4.2.tar.gz
++tar -zxvf  netcdf-4.3.2.tar.gz
+ 
+ #Move netcdf to install directory
+ rm -rf src/*
+-mv netcdf-4.2/* src/
+-rm -rf netcdf-4.2
++mv netcdf-4.3.2/* src/
++rm -rf netcdf-4.3.2
+ 
+ #Configure and compile
+ cd src
Index: /issm/oecreview/Archive/18296-19100/ISSM-18809-18810.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18809-18810.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18809-18810.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/etc/environment.sh
+===================================================================
+--- ../trunk-jpl/etc/environment.sh	(revision 18809)
++++ ../trunk-jpl/etc/environment.sh	(revision 18810)
+@@ -305,3 +305,8 @@
+ #EXPAT
+ libpathprepend   "$ISSM_DIR/externalpackages/expat/install"
+ dylibpathprepend   "$ISSM_DIR/externalpackages/expat/install"
++
++#CURL
++libpathprepend   "$ISSM_DIR/externalpackages/curl/install/lib"
++dylibpathprepend   "$ISSM_DIR/externalpackages/curl/install/lib"
++pathprepend "$ISSM_DIR/externalpackages/curl/install/bin"
Index: /issm/oecreview/Archive/18296-19100/ISSM-18810-18811.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18810-18811.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18810-18811.diff	(revision 19102)
@@ -0,0 +1,44 @@
+Index: ../trunk-jpl/externalpackages/curl/install-macosx64.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/curl/install-macosx64.sh	(revision 0)
++++ ../trunk-jpl/externalpackages/curl/install-macosx64.sh	(revision 18811)
+@@ -0,0 +1,32 @@
++#!/bin/bash
++set -eu
++
++#Some cleanup
++rm -rf src install curl-7.39.0
++mkdir src install
++
++#Download from ISSM server
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/curl-7.39.0.tar.gz' 'curl-7.39.0.tar.gz'
++
++#Untar 
++tar -zxvf  curl-7.39.0.tar.gz
++
++#Move curl into src directory
++mv curl-7.39.0/* src
++rm -rf curl-7.39.0
++
++#Configure curl
++cd src
++
++export CFLAGS=" -arch x86_64"
++
++./configure \
++	--prefix="$ISSM_DIR/externalpackages/curl/install" 
++
++#Compile curl
++if [ $# -eq 0 ]; then
++	make
++else
++	make -j $1
++fi
++make install 
+
+Property changes on: ../trunk-jpl/externalpackages/curl/install-macosx64.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18811-18812.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18811-18812.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18811-18812.diff	(revision 19102)
@@ -0,0 +1,491 @@
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18811)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18812)
+@@ -493,6 +493,12 @@
+ 	MassconEnum,
+ 	MassconNameEnum,
+ 	MassconLevelsetEnum,
++	MassconaxpbyEnum,
++	MassconaxpbyNameEnum,
++	MassconaxpbyNamexEnum,
++	MassconaxpbyNameyEnum,
++	MassconaxpbyAlphaEnum,
++	MassconaxpbyBetaEnum,
+ 	NodeSIdEnum,
+ 	VectorParamEnum,
+ 	RiftfrontEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18811)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18812)
+@@ -490,6 +490,12 @@
+ 		case MassconEnum : return "Masscon";
+ 		case MassconNameEnum : return "MassconName";
+ 		case MassconLevelsetEnum : return "MassconLevelset";
++		case MassconaxpbyEnum : return "Massconaxpby";
++		case MassconaxpbyNameEnum : return "MassconaxpbyName";
++		case MassconaxpbyNamexEnum : return "MassconaxpbyNamex";
++		case MassconaxpbyNameyEnum : return "MassconaxpbyNamey";
++		case MassconaxpbyAlphaEnum : return "MassconaxpbyAlpha";
++		case MassconaxpbyBetaEnum : return "MassconaxpbyBeta";
+ 		case NodeSIdEnum : return "NodeSId";
+ 		case VectorParamEnum : return "VectorParam";
+ 		case RiftfrontEnum : return "Riftfront";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18811)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18812)
+@@ -499,16 +499,22 @@
+ 	      else if (strcmp(name,"Masscon")==0) return MassconEnum;
+ 	      else if (strcmp(name,"MassconName")==0) return MassconNameEnum;
+ 	      else if (strcmp(name,"MassconLevelset")==0) return MassconLevelsetEnum;
+-	      else if (strcmp(name,"NodeSId")==0) return NodeSIdEnum;
++	      else if (strcmp(name,"Massconaxpby")==0) return MassconaxpbyEnum;
++	      else if (strcmp(name,"MassconaxpbyName")==0) return MassconaxpbyNameEnum;
++	      else if (strcmp(name,"MassconaxpbyNamex")==0) return MassconaxpbyNamexEnum;
++	      else if (strcmp(name,"MassconaxpbyNamey")==0) return MassconaxpbyNameyEnum;
++	      else if (strcmp(name,"MassconaxpbyAlpha")==0) return MassconaxpbyAlphaEnum;
++	      else if (strcmp(name,"MassconaxpbyBeta")==0) return MassconaxpbyBetaEnum;
++         else stage=5;
++   }
++   if(stage==5){
++	      if (strcmp(name,"NodeSId")==0) return NodeSIdEnum;
+ 	      else if (strcmp(name,"VectorParam")==0) return VectorParamEnum;
+ 	      else if (strcmp(name,"Riftfront")==0) return RiftfrontEnum;
+ 	      else if (strcmp(name,"RiftfrontType")==0) return RiftfrontTypeEnum;
+ 	      else if (strcmp(name,"Segment")==0) return SegmentEnum;
+ 	      else if (strcmp(name,"SegmentRiftfront")==0) return SegmentRiftfrontEnum;
+-         else stage=5;
+-   }
+-   if(stage==5){
+-	      if (strcmp(name,"SpcDynamic")==0) return SpcDynamicEnum;
++	      else if (strcmp(name,"SpcDynamic")==0) return SpcDynamicEnum;
+ 	      else if (strcmp(name,"SpcStatic")==0) return SpcStaticEnum;
+ 	      else if (strcmp(name,"SpcTransient")==0) return SpcTransientEnum;
+ 	      else if (strcmp(name,"StringArrayParam")==0) return StringArrayParamEnum;
+@@ -622,16 +628,16 @@
+ 	      else if (strcmp(name,"StrainRatezz")==0) return StrainRatezzEnum;
+ 	      else if (strcmp(name,"Divergence")==0) return DivergenceEnum;
+ 	      else if (strcmp(name,"MaxDivergence")==0) return MaxDivergenceEnum;
+-	      else if (strcmp(name,"GiaCrossSectionShape")==0) return GiaCrossSectionShapeEnum;
++         else stage=6;
++   }
++   if(stage==6){
++	      if (strcmp(name,"GiaCrossSectionShape")==0) return GiaCrossSectionShapeEnum;
+ 	      else if (strcmp(name,"GiadWdt")==0) return GiadWdtEnum;
+ 	      else if (strcmp(name,"GiaW")==0) return GiaWEnum;
+ 	      else if (strcmp(name,"P0")==0) return P0Enum;
+ 	      else if (strcmp(name,"P1")==0) return P1Enum;
+ 	      else if (strcmp(name,"P1DG")==0) return P1DGEnum;
+-         else stage=6;
+-   }
+-   if(stage==6){
+-	      if (strcmp(name,"P1bubble")==0) return P1bubbleEnum;
++	      else if (strcmp(name,"P1bubble")==0) return P1bubbleEnum;
+ 	      else if (strcmp(name,"P1bubblecondensed")==0) return P1bubblecondensedEnum;
+ 	      else if (strcmp(name,"P2")==0) return P2Enum;
+ 	      else if (strcmp(name,"P2bubble")==0) return P2bubbleEnum;
+@@ -745,16 +751,16 @@
+ 	      else if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum;
+ 	      else if (strcmp(name,"Seq")==0) return SeqEnum;
+ 	      else if (strcmp(name,"Mpi")==0) return MpiEnum;
+-	      else if (strcmp(name,"Mumps")==0) return MumpsEnum;
++         else stage=7;
++   }
++   if(stage==7){
++	      if (strcmp(name,"Mumps")==0) return MumpsEnum;
+ 	      else if (strcmp(name,"Gsl")==0) return GslEnum;
+ 	      else if (strcmp(name,"Option")==0) return OptionEnum;
+ 	      else if (strcmp(name,"GenericOption")==0) return GenericOptionEnum;
+ 	      else if (strcmp(name,"OptionCell")==0) return OptionCellEnum;
+ 	      else if (strcmp(name,"OptionStruct")==0) return OptionStructEnum;
+-         else stage=7;
+-   }
+-   if(stage==7){
+-	      if (strcmp(name,"Cuffey")==0) return CuffeyEnum;
++	      else if (strcmp(name,"Cuffey")==0) return CuffeyEnum;
+ 	      else if (strcmp(name,"Paterson")==0) return PatersonEnum;
+ 	      else if (strcmp(name,"Arrhenius")==0) return ArrheniusEnum;
+ 	      else if (strcmp(name,"LliboutryDuval")==0) return LliboutryDuvalEnum;
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 18811)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 18812)
+@@ -147,6 +147,44 @@
+ 				xDelete<int>(masscon_levelset_N_s);
+ 				/*}}}*/
+ 			}
++			else if (output_definition_enums[i]==MassconaxpbyEnum){
++				/*Deal with masscon combinations: {{{*/
++				
++				/*masscon variables: */
++				char**       masscon_name_s             = NULL;    
++				char**       masscon_namex_s             = NULL;    
++				char**       masscon_namey_s             = NULL;    
++				IssmDouble*  masscon_alpha_s     = NULL;
++				IssmDouble*  masscon_beta_s     = NULL;
++				int          num;
++
++				/*Fetch names and multiplicators, etc ... (see src/m/classes/masscon_axpby.m): */
++				iomodel->FetchMultipleData(&masscon_name_s,&num,MassconaxpbyNameEnum);
++				iomodel->FetchMultipleData(&masscon_namex_s,&num,MassconaxpbyNamexEnum);
++				iomodel->FetchMultipleData(&masscon_namey_s,&num,MassconaxpbyNameyEnum);
++				iomodel->FetchMultipleData(&masscon_alpha_s,&num,MassconaxpbyAlphaEnum);
++				iomodel->FetchMultipleData(&masscon_beta_s,&num,MassconaxpbyBetaEnum);
++				for(j=0;j<num;j++){
++
++					/*Create a masscon axpyb object: */
++					output_definitions->AddObject(new Massconaxpby(masscon_name_s[j],masscon_namex_s[j],masscon_namey_s[j],masscon_alpha_s[j],masscon_beta_s[j]));
++
++				}
++
++				/*Free ressources:*/
++				for(j=0;j<num;j++){
++					char* string=NULL;
++					string = masscon_name_s[j];    xDelete<char>(string);
++					string = masscon_namex_s[j];    xDelete<char>(string);
++					string = masscon_namey_s[j];    xDelete<char>(string);
++				}
++				xDelete<char*>(masscon_name_s);
++				xDelete<char*>(masscon_namex_s);
++				xDelete<char*>(masscon_namey_s);
++				xDelete<IssmDouble>(masscon_alpha_s);
++				xDelete<IssmDouble>(masscon_beta_s);
++				/*}}}*/
++			}
+ 			else _error_("output definition enum " << output_definition_enums[i] << "not supported yet!");
+ 		}
+ 	}
+Index: ../trunk-jpl/src/c/classes/classes.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/classes.h	(revision 18811)
++++ ../trunk-jpl/src/c/classes/classes.h	(revision 18812)
+@@ -19,6 +19,7 @@
+ #include "./Massfluxatgate.h"
+ #include "./Misfit.h"
+ #include "./Masscon.h"
++#include "./Massconaxpby.h"
+ 
+ /*Constraints: */
+ #include "./Constraints/Constraints.h"
+Index: ../trunk-jpl/src/c/classes/IoModel.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/IoModel.h	(revision 18811)
++++ ../trunk-jpl/src/c/classes/IoModel.h	(revision 18812)
+@@ -85,6 +85,7 @@
+ 		void        FetchMultipleData(IssmDouble*** pmatrixarray,int** pmdims,int** pndims, int* pnumrecords,int data_enum);
+ 		void        FetchMultipleData(int*** pmatrices,int** pmdims,int** pndims, int* pnumrecords,int data_enum);
+ 		void        FetchMultipleData(int** pvector, int* pnum_instances,int data_enum);
++		void        FetchMultipleData(IssmDouble** pvector, int* pnum_instances,int data_enum);
+ 		void        FetchData(Option **poption,int data_enum);
+ 		void        FetchData(int num,...);
+ 		void        FetchDataToInput(Elements* elements,int vector_enum);
+Index: ../trunk-jpl/src/c/classes/Massconaxpby.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Massconaxpby.h	(revision 0)
++++ ../trunk-jpl/src/c/classes/Massconaxpby.h	(revision 18812)
+@@ -0,0 +1,109 @@
++/*!\file Massconaxpby.h
++ * \brief: header file for Massconaxpby object
++ */
++
++#ifndef _MASSCON_AXPBY_H_
++#define _MASSCON_AXPBY_H_
++
++/*Headers:*/
++/*{{{*/
++#include "./Definition.h"
++#include "../datastructures/datastructures.h"
++#include "./Elements/Element.h"
++#include "./Elements/Elements.h"
++#include "./FemModel.h"
++#include "../classes/Params/Parameters.h"
++IssmDouble OutputDefinitionsResponsex(FemModel* femmodel,const char* output_string);
++/*}}}*/
++class Massconaxpby: public Object, public Definition{
++
++	public: 
++
++		char*       name;
++		char*       namex;
++		char*       namey;
++		IssmDouble  alpha;
++		IssmDouble  beta;
++		
++		/*Massconaxpby constructors, destructors :*/
++		Massconaxpby(){/*{{{*/
++
++			this->name = NULL;
++			this->namex = NULL;
++			this->namey = NULL;
++			this->alpha=UNDEF;
++			this->beta=UNDEF;
++
++		}
++		/*}}}*/
++		Massconaxpby(char* in_name,char* in_namex, char* in_namey, IssmDouble in_alpha,IssmDouble in_beta){ /*{{{*/
++
++			this->name   = xNew<char>(strlen(in_name)+1);
++			xMemCpy<char>(this->name,in_name,strlen(in_name)+1);
++
++			this->namex   = xNew<char>(strlen(in_namex)+1);
++			xMemCpy<char>(this->namex,in_namex,strlen(in_namex)+1);
++			
++			this->namey   = xNew<char>(strlen(in_namey)+1);
++			xMemCpy<char>(this->namey,in_namey,strlen(in_namey)+1);
++
++			this->alpha=in_alpha;
++			this->beta=in_beta;
++
++		}
++		/*}}}*/
++		~Massconaxpby(){/*{{{*/
++			if(this->name)xDelete(this->name); 
++			if(this->namex)xDelete(this->namex); 
++			if(this->namey)xDelete(this->namey); 
++		}
++		/*}}}*/
++		/*Object virtual function resolutoin: */
++		void Echo(void){/*{{{*/
++			_printf_(" Massconaxpby: " << this->name << "\n");
++			_printf_("    namex: " << this->namex << "\n");
++			_printf_("    namey: " << this->namey << "\n");
++			_printf_("    alpha: " << this->alpha << "\n");
++			_printf_("    beta: " << this->beta << "\n");
++		}
++		/*}}}*/
++		void DeepEcho(void){/*{{{*/
++			this->Echo();
++		}
++		/*}}}*/
++		int Id(void){/*{{{*/
++			return -1;
++		}
++		/*}}}*/
++		int ObjectEnum(void){/*{{{*/
++			return MassconaxpbyEnum;
++		}
++		/*}}}*/
++		Object* copy() {/*{{{*/
++			Massconaxpby* mf = new Massconaxpby(this->name,this->namex,this->namey, this->alpha, this->beta);
++			return (Object*) mf;
++		}
++		/*}}}*/
++		/*Definition virtual function resolutoin: */
++		char* Name(){/*{{{*/
++
++			char* name2=xNew<char>(strlen(this->name)+1);
++			xMemCpy(name2,this->name,strlen(this->name)+1);
++
++			return name2;
++		}
++		/*}}}*/
++		 IssmDouble Response(FemModel* femmodel){/*{{{*/
++
++			 IssmDouble xresponse,yresponse;
++
++			 /*Get response from both masscons: */
++			 xresponse=OutputDefinitionsResponsex(femmodel,this->namex);
++			 yresponse=OutputDefinitionsResponsex(femmodel,this->namey);
++
++			 return this->alpha*xresponse+this->beta*yresponse;
++		 }
++			/*}}}*/
++};
++
++#endif  /* _MASSCON_H_ */
+Index: ../trunk-jpl/src/m/classes/massconaxpby.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/massconaxpby.m	(revision 0)
++++ ../trunk-jpl/src/m/classes/massconaxpby.m	(revision 18812)
+@@ -0,0 +1,76 @@
++%MASSCONAXPBY class definition
++%
++%   Usage:
++%      massconaxpby=massconaxpby();
++%      massconsumaxpby=massconaxpby('name','MassCon58+35','namex','MassCon58','alpha',.5,'namey','MassCon35','beta',.5); 
++% 
++%   where name is the name of the massconaxpby object, namex is the name of the first masscon, namey the name of the second masscon and alpha,beta the 
++%         multiplicators. The meaning of axpby here is: resulting masscon is the linear combination (alpha *x + beta * y) 
++%         of two masscons.
++%
++%   See also: MASSCON
++
++classdef massconaxpby
++	properties (SetAccess=public)
++		%masscon axpby
++		name              = '';
++		namex              = '';
++		namey              = '';
++		alpha              = NaN;
++		beta              = NaN;
++	end
++	
++	methods
++		function obj = massconaxpby(varargin) % {{{
++			if nargin==0,
++				obj=setdefaultparameters(obj);
++			else
++				%use provided options to change fields
++				options=pairoptions(varargin{:});
++
++				%get names
++				obj.name=getfieldvalue(options,'name','');
++				obj.namex=getfieldvalue(options,'namex');
++				obj.namey=getfieldvalue(options,'namey');
++
++				%get multiplicators: 
++				obj.alpha=getfieldvalue(options,'alpha');
++				obj.beta=getfieldvalue(options,'beta');
++
++
++			end
++		end % }}}
++		function obj = setdefaultparameters(obj) % {{{
++		end % }}}
++		function md = checkconsistency(obj,md,solution,analyses) % {{{
++
++			if ~ischar(obj.name), error('masscon error message: ''name'' field should be a string!'); end
++			if ~ischar(obj.namex), error('masscon error message: ''namex'' field should be a string!'); end
++			if ~ischar(obj.namey), error('masscon error message: ''namey'' field should be a string!'); end
++
++			md = checkfield(md,'fieldname','obj.alpha','field',obj.alpha,'NaN',1,'size',[1 1]);
++			md = checkfield(md,'fieldname','obj.betaa','field',obj.beta,'NaN',1,'size',[1 1]);
++
++		end % }}}
++		function md = disp(obj) % {{{
++		
++			disp(sprintf('   Misfit:\n'));
++
++			fielddisplay(obj,'name','name');
++			fielddisplay(obj,'namex','identifier for the first masscon');
++			fielddisplay(obj,'alpha','first masscon multiplicator');
++			fielddisplay(obj,'namey','identifier for the second masscon');
++			fielddisplay(obj,'beta','second masscon multiplicator');
++
++		end % }}}
++		function md = marshall(obj,md,fid) % {{{
++
++		WriteData(fid,'object',obj,'fieldname','name','format','String');
++		WriteData(fid,'object',obj,'fieldname','namex','format','String');
++		WriteData(fid,'object',obj,'fieldname','namey','format','String');
++		WriteData(fid,'object',obj,'fieldname','alpha','format','Double');
++		WriteData(fid,'object',obj,'fieldname','beta','format','Double');
++
++		end % }}}
++	end
++end
+Index: ../trunk-jpl/src/m/enum/MassconaxpbyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MassconaxpbyEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MassconaxpbyEnum.m	(revision 18812)
+@@ -0,0 +1,11 @@
++function macro=MassconaxpbyEnum()
++%MASSCONAXPBYENUM - Enum of Massconaxpby
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MassconaxpbyEnum()
++
++macro=StringToEnum('Massconaxpby');
+Index: ../trunk-jpl/src/m/enum/MassconaxpbyNameEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MassconaxpbyNameEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MassconaxpbyNameEnum.m	(revision 18812)
+@@ -0,0 +1,11 @@
++function macro=MassconaxpbyNameEnum()
++%MASSCONAXPBYNAMEENUM - Enum of MassconaxpbyName
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MassconaxpbyNameEnum()
++
++macro=StringToEnum('MassconaxpbyName');
+Index: ../trunk-jpl/src/m/enum/MassconaxpbyNamexEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MassconaxpbyNamexEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MassconaxpbyNamexEnum.m	(revision 18812)
+@@ -0,0 +1,11 @@
++function macro=MassconaxpbyNamexEnum()
++%MASSCONAXPBYNAMEXENUM - Enum of MassconaxpbyNamex
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MassconaxpbyNamexEnum()
++
++macro=StringToEnum('MassconaxpbyNamex');
+Index: ../trunk-jpl/src/m/enum/MassconaxpbyBetaEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MassconaxpbyBetaEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MassconaxpbyBetaEnum.m	(revision 18812)
+@@ -0,0 +1,11 @@
++function macro=MassconaxpbyBetaEnum()
++%MASSCONAXPBYBETAENUM - Enum of MassconaxpbyBeta
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MassconaxpbyBetaEnum()
++
++macro=StringToEnum('MassconaxpbyBeta');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18811)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18812)
+@@ -482,6 +482,12 @@
+ def MassconEnum(): return StringToEnum("Masscon")[0]
+ def MassconNameEnum(): return StringToEnum("MassconName")[0]
+ def MassconLevelsetEnum(): return StringToEnum("MassconLevelset")[0]
++def MassconaxpbyEnum(): return StringToEnum("Massconaxpby")[0]
++def MassconaxpbyNameEnum(): return StringToEnum("MassconaxpbyName")[0]
++def MassconaxpbyNamexEnum(): return StringToEnum("MassconaxpbyNamex")[0]
++def MassconaxpbyNameyEnum(): return StringToEnum("MassconaxpbyNamey")[0]
++def MassconaxpbyAlphaEnum(): return StringToEnum("MassconaxpbyAlpha")[0]
++def MassconaxpbyBetaEnum(): return StringToEnum("MassconaxpbyBeta")[0]
+ def NodeSIdEnum(): return StringToEnum("NodeSId")[0]
+ def VectorParamEnum(): return StringToEnum("VectorParam")[0]
+ def RiftfrontEnum(): return StringToEnum("Riftfront")[0]
+Index: ../trunk-jpl/src/m/enum/MassconaxpbyAlphaEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MassconaxpbyAlphaEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MassconaxpbyAlphaEnum.m	(revision 18812)
+@@ -0,0 +1,11 @@
++function macro=MassconaxpbyAlphaEnum()
++%MASSCONAXPBYALPHAENUM - Enum of MassconaxpbyAlpha
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MassconaxpbyAlphaEnum()
++
++macro=StringToEnum('MassconaxpbyAlpha');
+Index: ../trunk-jpl/src/m/enum/MassconaxpbyNameyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MassconaxpbyNameyEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MassconaxpbyNameyEnum.m	(revision 18812)
+@@ -0,0 +1,11 @@
++function macro=MassconaxpbyNameyEnum()
++%MASSCONAXPBYNAMEYENUM - Enum of MassconaxpbyNamey
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MassconaxpbyNameyEnum()
++
++macro=StringToEnum('MassconaxpbyNamey');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18812-18813.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18812-18813.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18812-18813.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/c/classes/IoModel.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/IoModel.h	(revision 18812)
++++ ../trunk-jpl/src/c/classes/IoModel.h	(revision 18813)
+@@ -81,7 +81,6 @@
+ 		void        FetchData(char***   pstringarray,int* pnumstrings,int data_enum);
+ 		void        FetchData(IssmDouble*** pmatrixarray,int** pmdims,int** pndims, int* pnumrecords,int data_enum);
+ 		void        FetchMultipleData(char***   pstringarray,int* pnumstrings,int data_enum);
+-		void        FetchMultipleData(IssmDouble** pvector, int* pnum_instances,int data_enum);
+ 		void        FetchMultipleData(IssmDouble*** pmatrixarray,int** pmdims,int** pndims, int* pnumrecords,int data_enum);
+ 		void        FetchMultipleData(int*** pmatrices,int** pmdims,int** pndims, int* pnumrecords,int data_enum);
+ 		void        FetchMultipleData(int** pvector, int* pnum_instances,int data_enum);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18813-18814.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18813-18814.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18813-18814.diff	(revision 19102)
@@ -0,0 +1,26 @@
+Index: ../trunk-jpl/test/NightlyRun/test322.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test322.m	(revision 18813)
++++ ../trunk-jpl/test/NightlyRun/test322.m	(revision 18814)
+@@ -22,7 +22,7 @@
+ 
+ %Fields and tolerances to track changes
+ field_names     ={'Gradient','Misfits','FrictionCoefficient','Pressure','Vel','Vx','Vy'};
+-field_tolerances={5e-05,1e-08,1e-08,1e-09,1e-09,1e-09,1e-09,5e-08,5e-08,5e-08};
++field_tolerances={5e-05,1e-08,7e-08,5e-09,5e-09,5e-09,5e-09,5e-08,5e-08,5e-08};
+ field_values={...
+ 	(md.results.StressbalanceSolution.Gradient1),...
+ 	(md.results.StressbalanceSolution.J),...
+Index: ../trunk-jpl/test/NightlyRun/test322.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test322.py	(revision 18813)
++++ ../trunk-jpl/test/NightlyRun/test322.py	(revision 18814)
+@@ -34,7 +34,7 @@
+ 
+ #Fields and tolerances to track changes
+ field_names     =['Gradient','Misfits','FrictionCoefficient','Pressure','Vel','Vx','Vy']
+-field_tolerances=[5e-05,1e-08,1e-08,1e-09,5e-08,5e-08,5e-08]
++field_tolerances=[5e-05,1e-08,7e-08,5e-09,5e-09,5e-09,5e-09,5e-08,5e-08,5e-08]
+ field_values=[\
+ 	md.results.StressbalanceSolution.Gradient1,\
+ 	md.results.StressbalanceSolution.J,\
Index: /issm/oecreview/Archive/18296-19100/ISSM-18814-18815.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18814-18815.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18814-18815.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/wrappers/ExpSimplify/ExpSimplify.cpp
+===================================================================
+--- ../trunk-jpl/src/wrappers/ExpSimplify/ExpSimplify.cpp	(revision 18814)
++++ ../trunk-jpl/src/wrappers/ExpSimplify/ExpSimplify.cpp	(revision 18815)
+@@ -17,7 +17,7 @@
+ 	_printf_("\n");
+ 	_printf_("   Example:\n");
+ 	_printf_("      ExpSimplify('file.exp',100);\n");
+-	_printf_("      ExpSimplify('file.exp',100,'remove1',false);\n");
++	_printf_("      ExpSimplify('file.exp',100,'min',4);\n");
+ }/*}}}*/
+ void simplify(Contour<double>* contour,bool* flags,int ind0,int ind1,double tolerance){/*{{{*/
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18815-18816.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18815-18816.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18815-18816.diff	(revision 19102)
@@ -0,0 +1,473 @@
+Index: ../trunk-jpl/test/NightlyRun/test804.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test804.py	(revision 18815)
++++ ../trunk-jpl/test/NightlyRun/test804.py	(revision 18816)
+@@ -24,6 +24,7 @@
+ md.transient.iscalving=True;
+ 
+ md.calving.calvingrate=1000.*numpy.ones((md.mesh.numberofvertices,1))
++md.calving.meltingrate=numpy.zeros((md.mesh.numberofvertices,1))
+ 
+ md=solve(md,TransientSolutionEnum())
+ 
+Index: ../trunk-jpl/test/NightlyRun/test804.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test804.m	(revision 18815)
++++ ../trunk-jpl/test/NightlyRun/test804.m	(revision 18816)
+@@ -14,6 +14,7 @@
+ md.transient.iscalving=1;
+ 
+ md.calving.calvingrate=1000.*ones(md.mesh.numberofvertices,1);
++md.calving.meltingrate=zeros(md.mesh.numberofvertices,1);
+ 
+ md=solve(md,TransientSolutionEnum());
+ 
+Index: ../trunk-jpl/test/NightlyRun/test805.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test805.py	(revision 18815)
++++ ../trunk-jpl/test/NightlyRun/test805.py	(revision 18816)
+@@ -31,6 +31,7 @@
+ md.transient.iscalving=True;
+ 
+ md.calving.calvingrate=1000.*numpy.ones((md.mesh.numberofvertices,1))
++md.calving.meltingrate=numpy.zeros((md.mesh.numberofvertices,1))
+ 
+ md=solve(md,TransientSolutionEnum())
+ 
+Index: ../trunk-jpl/test/NightlyRun/test805.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test805.m	(revision 18815)
++++ ../trunk-jpl/test/NightlyRun/test805.m	(revision 18816)
+@@ -21,6 +21,7 @@
+ md.transient.iscalving=1;
+ 
+ md.calving.calvingrate=1000.*ones(md.mesh.numberofvertices,1);
++md.calving.meltingrate=zeros(md.mesh.numberofvertices,1);
+ 
+ md=solve(md,TransientSolutionEnum());
+ 
+Index: ../trunk-jpl/test/NightlyRun/test806.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test806.py	(revision 18815)
++++ ../trunk-jpl/test/NightlyRun/test806.py	(revision 18816)
+@@ -36,8 +36,9 @@
+ md.transient.isgia=False
+ md.transient.iscalving=True;
+ 
+-md.calving=calvinglevermann();
+-md.calving.coeff=4.89e13*numpy.ones((md.mesh.numberofvertices,1));
++md.calving=calvinglevermann()
++md.calving.coeff=4.89e13*numpy.ones((md.mesh.numberofvertices,1))
++md.calving.meltingrate=numpy.zeros((md.mesh.numberofvertices,1))
+ 
+ md.transient.requested_outputs=['default','StrainRateparallel','StrainRateperpendicular','Calvingratex','Calvingratey','CalvingCalvingrate']
+ 
+Index: ../trunk-jpl/test/NightlyRun/test806.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test806.m	(revision 18815)
++++ ../trunk-jpl/test/NightlyRun/test806.m	(revision 18816)
+@@ -25,6 +25,7 @@
+ 
+ md.calving=calvinglevermann();
+ md.calving.coeff=4.89e13*ones(md.mesh.numberofvertices,1);
++md.calving.meltingrate=zeros(md.mesh.numberofvertices,1);
+ 
+ md.transient.requested_outputs={'default','StrainRateparallel','StrainRateperpendicular','Calvingratex','Calvingratey','CalvingCalvingrate'};
+ 
+Index: ../trunk-jpl/test/NightlyRun/IdToName.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/IdToName.m	(revision 18815)
++++ ../trunk-jpl/test/NightlyRun/IdToName.m	(revision 18816)
+@@ -194,7 +194,8 @@
+ 	case 803, name='ValleyGlacierLevelsetEnthalpyHO3d';
+ 	case 804, name='ValleyGlacierLevelsetCalvingSIA2d';
+ 	case 805, name='ValleyGlacierLevelsetEnthCalvingHO3d';
+-	case 806, name='SquareShelfLevelsetCalvingSIA2dLevermann';
++	case 806, name='SquareShelfLevelsetCalvingSSA2dLevermann';
++	case 807, name='SquareShelfLevelsetMeltingSSA2d';
+ 	case 1101, name='ISMIPAHO';
+ 	case 1102, name='ISMIPAFS';
+ 	case 1103, name='ISMIPBHO';
+Index: ../trunk-jpl/test/NightlyRun/IdToName.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/IdToName.py	(revision 18815)
++++ ../trunk-jpl/test/NightlyRun/IdToName.py	(revision 18816)
+@@ -179,7 +179,8 @@
+ 	803  : 'ValleyGlacierLevelsetEnthalpyHO3d',	
+ 	804  : 'ValleyGlacierLevelsetCalvingSIA2d',	
+ 	805  : 'ValleyGlacierLevelsetEnthCalvingHO3d',	
+-	806  : 'SquareShelfLevelsetCalvingSIA2dLevermann',	
++	806  : 'SquareShelfLevelsetCalvingSSA2dLevermann',	
++	807  : 'SquareShelfLevelsetMeltingSSA2d',
+ 	1101 : 'ISMIPAHO',
+ 	1102 : 'ISMIPAFS',
+ 	1103 : 'ISMIPBHO',
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18815)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18816)
+@@ -47,9 +47,11 @@
+ 		switch(calvinglaw){
+ 			case DefaultCalvingEnum:
+ 				iomodel->FetchDataToInput(elements,CalvingCalvingrateEnum);
++				iomodel->FetchDataToInput(elements,CalvingMeltingrateEnum);
+ 				break;
+ 			case CalvingLevermannEnum:
+ 				iomodel->FetchDataToInput(elements,CalvinglevermannCoeffEnum);
++				iomodel->FetchDataToInput(elements,CalvinglevermannMeltingrateEnum);
+ 				break;
+ 			default:
+ 				_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
+@@ -124,7 +126,7 @@
+ 	IssmDouble Jdet, dt, D_scalar;
+ 	IssmDouble h,hx,hy,hz;
+ 	IssmDouble vel;
+-	IssmDouble norm_dlsf, calvingrate;
++	IssmDouble norm_dlsf, norm_calving, calvingrate, meltingrate;
+ 	IssmDouble* xyz_list = NULL;
+ 
+ 	/*Get problem dimension and whether there is calving or not*/
+@@ -150,6 +152,7 @@
+ 	IssmDouble*    v        = xNew<IssmDouble>(dim);
+ 	IssmDouble*    w        = xNew<IssmDouble>(dim);
+ 	IssmDouble*    c        = xNewZeroInit<IssmDouble>(dim);
++	IssmDouble*    m        = xNewZeroInit<IssmDouble>(dim);
+ 	IssmDouble*    dlsf     = xNew<IssmDouble>(dim);
+ 
+ 	/*Retrieve all inputs and parameters*/
+@@ -162,6 +165,7 @@
+ 	Input* lsf_slopex_input   = NULL;
+ 	Input* lsf_slopey_input   = NULL;
+ 	Input* calvingrate_input  = NULL;
++	Input* meltingrate_input  = NULL;
+ 
+ 	/*Load velocities*/
+ 	if(domaintype==Domain2DhorizontalEnum){
+@@ -185,6 +189,7 @@
+ 				lsf_slopex_input  = basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
+ 				if(dim==2) lsf_slopey_input  = basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
+ 				calvingrate_input = basalelement->GetInput(CalvingCalvingrateEnum);     _assert_(calvingrate_input);
++				meltingrate_input = basalelement->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
+ 				break;
+ 			case CalvingLevermannEnum:
+ 				if(domaintype==Domain2DhorizontalEnum){
+@@ -200,6 +205,7 @@
+ 						calvingratey_input=basalelement->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
+ 					}
+ 				}
++				meltingrate_input = basalelement->GetInput(CalvinglevermannMeltingrateEnum);     _assert_(meltingrate_input);
+ 				break;
+ 			default:
+ 				_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
+@@ -237,19 +243,35 @@
+ 					lsf_slopex_input->GetInputValue(&dlsf[0],gauss);
+ 					if(dim==2) lsf_slopey_input->GetInputValue(&dlsf[1],gauss);
+ 					calvingrate_input->GetInputValue(&calvingrate,gauss);
++					meltingrate_input->GetInputValue(&meltingrate,gauss);
+ 
+ 					norm_dlsf=0.;
+ 					for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
+ 					norm_dlsf=sqrt(norm_dlsf);
+ 
+ 					if(norm_dlsf>1.e-10)
+-					 for(i=0;i<dim;i++) c[i]=calvingrate*dlsf[i]/norm_dlsf;
++					 for(i=0;i<dim;i++){ 
++					  c[i]=calvingrate*dlsf[i]/norm_dlsf;
++					  m[i]=meltingrate*dlsf[i]/norm_dlsf;
++					 }
+ 					else
+-					 for(i=0;i<dim;i++) c[i]=0.;
++					 for(i=0;i<dim;i++){
++						 c[i]=0.;
++						 m[i]=0.;
++					 }
++
+ 					break;
+ 				case CalvingLevermannEnum:
+ 					calvingratex_input->GetInputValue(&c[0],gauss); // in 3D case, add mesh velocity 
+ 					if(dim==2) calvingratey_input->GetInputValue(&c[1],gauss);
++					meltingrate_input->GetInputValue(&meltingrate,gauss);
++
++					norm_calving=0.;
++					for(i=0;i<dim;i++) norm_calving+=pow(c[i],2);
++					norm_calving=sqrt(norm_calving)+1.e-14;
++
++					for(i=0;i<dim;i++) m[i]=meltingrate*c[i]/norm_calving;
++					
+ 					break;
+ 				default:
+ 					_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
+@@ -257,7 +279,7 @@
+ 		}
+ 
+ 		/*Levelset speed is ice velocity - calving rate*/
+-		for(i=0;i<dim;i++) w[i]=v[i]-c[i];
++		for(i=0;i<dim;i++) w[i]=v[i]-c[i]-m[i];
+ 
+ 		/*Compute D*/
+ 		for(row=0;row<dim;row++){
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18815)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18816)
+@@ -212,10 +212,12 @@
+ 	StressIntensityFactorEnum,
+ 	CalvingLawEnum,
+ 	CalvingCalvingrateEnum,
++	CalvingMeltingrateEnum,
+ 	CalvingLevermannEnum,
+ 	DefaultCalvingEnum,
+ 	CalvingRequestedOutputsEnum,
+ 	CalvinglevermannCoeffEnum,
++	CalvinglevermannMeltingrateEnum,
+ 	CalvingratexEnum,
+ 	CalvingrateyEnum,
+ 	CalvingratexAverageEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18815)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18816)
+@@ -220,10 +220,12 @@
+ 		case StressIntensityFactorEnum : return "StressIntensityFactor";
+ 		case CalvingLawEnum : return "CalvingLaw";
+ 		case CalvingCalvingrateEnum : return "CalvingCalvingrate";
++		case CalvingMeltingrateEnum : return "CalvingMeltingrate";
+ 		case CalvingLevermannEnum : return "CalvingLevermann";
+ 		case DefaultCalvingEnum : return "DefaultCalving";
+ 		case CalvingRequestedOutputsEnum : return "CalvingRequestedOutputs";
+ 		case CalvinglevermannCoeffEnum : return "CalvinglevermannCoeff";
++		case CalvinglevermannMeltingrateEnum : return "CalvinglevermannMeltingrate";
+ 		case CalvingratexEnum : return "Calvingratex";
+ 		case CalvingrateyEnum : return "Calvingratey";
+ 		case CalvingratexAverageEnum : return "CalvingratexAverage";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18815)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18816)
+@@ -223,10 +223,12 @@
+ 	      else if (strcmp(name,"StressIntensityFactor")==0) return StressIntensityFactorEnum;
+ 	      else if (strcmp(name,"CalvingLaw")==0) return CalvingLawEnum;
+ 	      else if (strcmp(name,"CalvingCalvingrate")==0) return CalvingCalvingrateEnum;
++	      else if (strcmp(name,"CalvingMeltingrate")==0) return CalvingMeltingrateEnum;
+ 	      else if (strcmp(name,"CalvingLevermann")==0) return CalvingLevermannEnum;
+ 	      else if (strcmp(name,"DefaultCalving")==0) return DefaultCalvingEnum;
+ 	      else if (strcmp(name,"CalvingRequestedOutputs")==0) return CalvingRequestedOutputsEnum;
+ 	      else if (strcmp(name,"CalvinglevermannCoeff")==0) return CalvinglevermannCoeffEnum;
++	      else if (strcmp(name,"CalvinglevermannMeltingrate")==0) return CalvinglevermannMeltingrateEnum;
+ 	      else if (strcmp(name,"Calvingratex")==0) return CalvingratexEnum;
+ 	      else if (strcmp(name,"Calvingratey")==0) return CalvingrateyEnum;
+ 	      else if (strcmp(name,"CalvingratexAverage")==0) return CalvingratexAverageEnum;
+@@ -257,12 +259,12 @@
+ 	      else if (strcmp(name,"MeshVertexonbase")==0) return MeshVertexonbaseEnum;
+ 	      else if (strcmp(name,"MeshVertexonsurface")==0) return MeshVertexonsurfaceEnum;
+ 	      else if (strcmp(name,"MeshVertexonboundary")==0) return MeshVertexonboundaryEnum;
+-	      else if (strcmp(name,"MeshX")==0) return MeshXEnum;
+-	      else if (strcmp(name,"MeshY")==0) return MeshYEnum;
+          else stage=3;
+    }
+    if(stage==3){
+-	      if (strcmp(name,"MeshZ")==0) return MeshZEnum;
++	      if (strcmp(name,"MeshX")==0) return MeshXEnum;
++	      else if (strcmp(name,"MeshY")==0) return MeshYEnum;
++	      else if (strcmp(name,"MeshZ")==0) return MeshZEnum;
+ 	      else if (strcmp(name,"MeshElementtype")==0) return MeshElementtypeEnum;
+ 	      else if (strcmp(name,"DomainType")==0) return DomainTypeEnum;
+ 	      else if (strcmp(name,"DomainDimension")==0) return DomainDimensionEnum;
+@@ -380,12 +382,12 @@
+ 	      else if (strcmp(name,"SurfaceforcingsIssmbgradients")==0) return SurfaceforcingsIssmbgradientsEnum;
+ 	      else if (strcmp(name,"SolutionType")==0) return SolutionTypeEnum;
+ 	      else if (strcmp(name,"AnalysisType")==0) return AnalysisTypeEnum;
+-	      else if (strcmp(name,"ConfigurationType")==0) return ConfigurationTypeEnum;
+-	      else if (strcmp(name,"AdjointBalancethicknessAnalysis")==0) return AdjointBalancethicknessAnalysisEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"AdjointBalancethickness2Analysis")==0) return AdjointBalancethickness2AnalysisEnum;
++	      if (strcmp(name,"ConfigurationType")==0) return ConfigurationTypeEnum;
++	      else if (strcmp(name,"AdjointBalancethicknessAnalysis")==0) return AdjointBalancethicknessAnalysisEnum;
++	      else if (strcmp(name,"AdjointBalancethickness2Analysis")==0) return AdjointBalancethickness2AnalysisEnum;
+ 	      else if (strcmp(name,"AdjointHorizAnalysis")==0) return AdjointHorizAnalysisEnum;
+ 	      else if (strcmp(name,"AnalysisCounter")==0) return AnalysisCounterEnum;
+ 	      else if (strcmp(name,"DefaultAnalysis")==0) return DefaultAnalysisEnum;
+@@ -503,12 +505,12 @@
+ 	      else if (strcmp(name,"MassconaxpbyName")==0) return MassconaxpbyNameEnum;
+ 	      else if (strcmp(name,"MassconaxpbyNamex")==0) return MassconaxpbyNamexEnum;
+ 	      else if (strcmp(name,"MassconaxpbyNamey")==0) return MassconaxpbyNameyEnum;
+-	      else if (strcmp(name,"MassconaxpbyAlpha")==0) return MassconaxpbyAlphaEnum;
+-	      else if (strcmp(name,"MassconaxpbyBeta")==0) return MassconaxpbyBetaEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"NodeSId")==0) return NodeSIdEnum;
++	      if (strcmp(name,"MassconaxpbyAlpha")==0) return MassconaxpbyAlphaEnum;
++	      else if (strcmp(name,"MassconaxpbyBeta")==0) return MassconaxpbyBetaEnum;
++	      else if (strcmp(name,"NodeSId")==0) return NodeSIdEnum;
+ 	      else if (strcmp(name,"VectorParam")==0) return VectorParamEnum;
+ 	      else if (strcmp(name,"Riftfront")==0) return RiftfrontEnum;
+ 	      else if (strcmp(name,"RiftfrontType")==0) return RiftfrontTypeEnum;
+@@ -626,12 +628,12 @@
+ 	      else if (strcmp(name,"StrainRateyy")==0) return StrainRateyyEnum;
+ 	      else if (strcmp(name,"StrainRateyz")==0) return StrainRateyzEnum;
+ 	      else if (strcmp(name,"StrainRatezz")==0) return StrainRatezzEnum;
+-	      else if (strcmp(name,"Divergence")==0) return DivergenceEnum;
+-	      else if (strcmp(name,"MaxDivergence")==0) return MaxDivergenceEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"GiaCrossSectionShape")==0) return GiaCrossSectionShapeEnum;
++	      if (strcmp(name,"Divergence")==0) return DivergenceEnum;
++	      else if (strcmp(name,"MaxDivergence")==0) return MaxDivergenceEnum;
++	      else if (strcmp(name,"GiaCrossSectionShape")==0) return GiaCrossSectionShapeEnum;
+ 	      else if (strcmp(name,"GiadWdt")==0) return GiadWdtEnum;
+ 	      else if (strcmp(name,"GiaW")==0) return GiaWEnum;
+ 	      else if (strcmp(name,"P0")==0) return P0Enum;
+@@ -749,12 +751,12 @@
+ 	      else if (strcmp(name,"Dense")==0) return DenseEnum;
+ 	      else if (strcmp(name,"MpiDense")==0) return MpiDenseEnum;
+ 	      else if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum;
+-	      else if (strcmp(name,"Seq")==0) return SeqEnum;
+-	      else if (strcmp(name,"Mpi")==0) return MpiEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"Mumps")==0) return MumpsEnum;
++	      if (strcmp(name,"Seq")==0) return SeqEnum;
++	      else if (strcmp(name,"Mpi")==0) return MpiEnum;
++	      else if (strcmp(name,"Mumps")==0) return MumpsEnum;
+ 	      else if (strcmp(name,"Gsl")==0) return GslEnum;
+ 	      else if (strcmp(name,"Option")==0) return OptionEnum;
+ 	      else if (strcmp(name,"GenericOption")==0) return GenericOptionEnum;
+Index: ../trunk-jpl/src/m/classes/calving.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/calving.py	(revision 18815)
++++ ../trunk-jpl/src/m/classes/calving.py	(revision 18816)
+@@ -14,6 +14,7 @@
+ 
+ 	def __init__(self): # {{{
+ 		self.calvingrate            = float('NaN')
++		self.meltingrate            = float('NaN')
+ 
+ 		#set defaults
+ 		self.setdefaultparameters()
+@@ -22,6 +23,7 @@
+ 	def __repr__(self): # {{{
+ 		string='   Calving parameters:'
+ 		string="%s\n%s"%(string,fielddisplay(self,'calvingrate','calving rate at given location [m/a]'))
++		string="%s\n%s"%(string,fielddisplay(self,'meltingrate','melting rate at given location [m/a]'))
+ 
+ 		return string
+ 		#}}}
+@@ -36,6 +38,7 @@
+ 			return md
+ 
+ 		md = checkfield(md,'fieldname','calving.calvingrate','NaN',1,'size',[md.mesh.numberofvertices],'>=',0)
++		md = checkfield(md,'fieldname','calving.meltingrate','NaN',1,'size',[md.mesh.numberofvertices],'>=',0)
+ 		return md
+ 	# }}}
+ 	def marshall(self,md,fid):    # {{{
+@@ -44,4 +47,5 @@
+ 
+ 		WriteData(fid,'enum',CalvingLawEnum(),'data',DefaultCalvingEnum(),'format','Integer');
+ 		WriteData(fid,'object',self,'fieldname','calvingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts)
++		WriteData(fid,'object',self,'fieldname','meltingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts)
+ 	# }}}
+Index: ../trunk-jpl/src/m/classes/calvinglevermann.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvinglevermann.py	(revision 18815)
++++ ../trunk-jpl/src/m/classes/calvinglevermann.py	(revision 18816)
+@@ -13,7 +13,8 @@
+ 	"""
+ 
+ 	def __init__(self): # {{{
+-		self.coeff = float('NaN')
++		self.coeff       = float('NaN')
++		self.meltingrate = float('NaN')
+ 
+ 		#set defaults
+ 		self.setdefaultparameters()
+@@ -22,6 +23,7 @@
+ 	def __repr__(self): # {{{
+ 		string='   Calving Levermann parameters:'
+ 		string="%s\n%s"%(string,fielddisplay(self,'coeff','proportionality coefficient in Levermann model'))
++		string="%s\n%s"%(string,fielddisplay(self,'meltingrate','melting rate at given location [m/a]'))
+ 
+ 		return string
+ 		#}}}
+@@ -37,9 +39,12 @@
+ 			return md
+ 
+ 		md = checkfield(md,'fieldname','calving.coeff','size',[md.mesh.numberofvertices],'>',0)
++		md = checkfield(md,'fieldname','calving.meltingrate','NaN',1,'size',[md.mesh.numberofvertices],'>=',0)
+ 		return md
+ 	# }}}
+ 	def marshall(self,md,fid):    # {{{
++		yts=365.*24.*3600.
+ 		WriteData(fid,'enum',CalvingLawEnum(),'data',CalvingLevermannEnum(),'format','Integer');
+ 		WriteData(fid,'enum',CalvinglevermannCoeffEnum(),'data',self.coeff,'format','DoubleMat','mattype',1)
++		WriteData(fid,'object',self,'fieldname','meltingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts)
+ 	# }}}
+Index: ../trunk-jpl/src/m/classes/calving.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calving.m	(revision 18815)
++++ ../trunk-jpl/src/m/classes/calving.m	(revision 18816)
+@@ -6,6 +6,7 @@
+ classdef calving
+ 	properties (SetAccess=public) 
+ 		 calvingrate            = NaN;
++		 meltingrate            = NaN;
+ 	end
+ 	methods (Static)
+ 		function obj = loadobj(obj) % {{{
+@@ -59,15 +60,18 @@
+ 			%Early return
+ 			if (solution~=TransientSolutionEnum() | md.transient.iscalving==0), return; end
+ 			md = checkfield(md,'fieldname','calving.calvingrate','NaN',1,'size',[md.mesh.numberofvertices 1],'>=',0);
++			md = checkfield(md,'fieldname','calving.meltingrate','NaN',1,'size',[md.mesh.numberofvertices 1],'>=',0);
+ 		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   Calving parameters:'));
+ 			fielddisplay(obj,'calvingrate','calving rate at given location [m/a]');
++			fielddisplay(obj,'meltingrate','melting rate at given location [m/a]');
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+ 			yts=365.0*24.0*3600.0;
+ 			WriteData(fid,'enum',CalvingLawEnum(),'data',DefaultCalvingEnum(),'format','Integer');
+ 			WriteData(fid,'object',obj,'fieldname','calvingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts);
++			WriteData(fid,'object',obj,'fieldname','meltingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/calvinglevermann.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvinglevermann.m	(revision 18815)
++++ ../trunk-jpl/src/m/classes/calvinglevermann.m	(revision 18816)
+@@ -5,7 +5,8 @@
+ 
+ classdef calvinglevermann
+ 	properties (SetAccess=public) 
+-		 coeff = NaN;
++		 coeff       = NaN;
++		 meltingrate = NaN;
+ 	end
+ 	methods
+ 		function obj = calvinglevermann(varargin) % {{{
+@@ -34,15 +35,19 @@
+ 			%Early return
+ 			if (solution~=TransientSolutionEnum() | md.transient.iscalving==0), return; end
+ 			md = checkfield(md,'fieldname','calving.coeff','>',0,'size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','calving.meltingrate','NaN',1,'size',[md.mesh.numberofvertices 1],'>=',0);
+ 		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   Calving Levermann parameters:'));
+ 			fielddisplay(obj,'coeff','proportionality coefficient in Levermann model');
++			fielddisplay(obj,'meltingrate','melting rate at given location [m/a]');
+ 
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
++			yts=365.0*24.0*3600.0;
+ 			WriteData(fid,'enum',CalvingLawEnum(),'data',CalvingLevermannEnum(),'format','Integer');
+ 			WriteData(fid,'enum',CalvinglevermannCoeffEnum(),'data',obj.coeff,'format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'fieldname','meltingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts);
+ 		end % }}}
+ 	end
+ end
Index: /issm/oecreview/Archive/18296-19100/ISSM-18816-18817.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18816-18817.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18816-18817.diff	(revision 19102)
@@ -0,0 +1,450 @@
+Index: ../trunk-jpl/test/NightlyRun/test275.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test275.m	(revision 18816)
++++ ../trunk-jpl/test/NightlyRun/test275.m	(revision 18817)
+@@ -15,14 +15,16 @@
+ md.damage.stabilization=1;
+ 
+ md.damage.requested_outputs={'default','DamageF'};
++md.transient.isdamageevolution=1;
+ 
+ md=setflowequation(md,'SSA','all');
+ md.cluster=generic('name',oshostname(),'np',3);
+-md=solve(md,DamageEvolutionSolutionEnum());
++%md=solve(md,DamageEvolutionSolutionEnum());
+ 
+-field_names={'D','F'};
+-field_tolerances={1e-13,1e-13};
+-field_values={...
+-		(md.results.DamageEvolutionSolution.DamageDbar),...
+-		(md.results.DamageEvolutionSolution.DamageF),...
+-	};
++%field_names={'D','F'};
++%field_tolerances={1e-13,1e-13};
++%field_values={...
++%		(md.results.DamageEvolutionSolution.DamageDbar),...
++%		(md.results.DamageEvolutionSolution.DamageF),...
++%	};
++md=solve(md,TransientSolutionEnum());
+Index: ../trunk-jpl/test/NightlyRun/test807.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test807.m	(revision 0)
++++ ../trunk-jpl/test/NightlyRun/test807.m	(revision 18817)
+@@ -0,0 +1,60 @@
++md=triangle(model(),'../Exp/Square.exp',50000.);
++md=setmask(md,'all','');
++md=parameterize(md,'../Par/SquareShelf.par');
++md=setflowequation(md,'SSA','all');
++md.cluster=generic('name',oshostname(),'np',3);
++
++x = md.mesh.x;
++xmin = min(x);
++xmax = max(x);
++Lx = (xmax-xmin);
++alpha = 2./3.;
++md.mask.ice_levelset = ((x - alpha*Lx)>0) - ((x - alpha*Lx)<0);
++
++md.timestepping.time_step=10;
++md.timestepping.final_time=30;
++
++%Transient
++md.transient.isstressbalance=1;
++md.transient.islevelset=1;
++md.transient.ismasstransport=1;
++md.transient.isthermal=0;
++md.transient.isgroundingline=0;
++md.transient.isgia=0;
++md.transient.iscalving=1;
++
++md.calving.calvingrate=zeros(md.mesh.numberofvertices,1);
++md.calving.meltingrate=10000*ones(md.mesh.numberofvertices,1);
++
++md=solve(md,TransientSolutionEnum());
++
++%Fields and tolerances to track changes
++field_names     ={'Vx1','Vy1','Vel1','Pressure1','Thickness1','Surface1','MaskIceLevelset1'...
++		'Vx2','Vy2','Vel2','Pressure2','Thickness2','Surface2','MaskIceLevelset2'...
++		'Vx3','Vy3','Vel3','Pressure3','Thickness3','Surface3','MaskIceLevelset3'};
++field_tolerances={1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,...
++		2e-13,2e-13,2e-13,1e-13,1e-13,1e-13,1e-13,...
++		2e-13,2e-13,2e-13,1e-13,1e-13,1e-13,1e-11};
++field_values={...
++	md.results.TransientSolution(1).Vx,...
++	md.results.TransientSolution(1).Vy,...
++	md.results.TransientSolution(1).Vel,...
++	md.results.TransientSolution(1).Pressure,...
++	md.results.TransientSolution(1).Thickness,...
++	md.results.TransientSolution(1).Surface,...
++	md.results.TransientSolution(1).MaskIceLevelset,...
++	md.results.TransientSolution(2).Vx,...
++	md.results.TransientSolution(2).Vy,...
++	md.results.TransientSolution(2).Vel,...
++	md.results.TransientSolution(2).Pressure,...
++	md.results.TransientSolution(2).Thickness,...
++	md.results.TransientSolution(2).Surface,...
++	md.results.TransientSolution(2).MaskIceLevelset,...
++	md.results.TransientSolution(3).Vx,...
++	md.results.TransientSolution(3).Vy,...
++	md.results.TransientSolution(3).Vel,...
++	md.results.TransientSolution(3).Pressure,...
++	md.results.TransientSolution(3).Thickness,...
++	md.results.TransientSolution(3).Surface,...
++	md.results.TransientSolution(3).MaskIceLevelset,...
++	};
+Index: ../trunk-jpl/test/NightlyRun/test807.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test807.py	(revision 0)
++++ ../trunk-jpl/test/NightlyRun/test807.py	(revision 18817)
+@@ -0,0 +1,74 @@
++from model import *
++from triangle import *
++from squaremesh import *
++from setmask import *
++from parameterize import *
++from setflowequation import *
++from EnumDefinitions import *
++from solve import *
++from MatlabFuncs import *
++import numpy
++
++md=triangle(model(),'../Exp/Square.exp',50000.)
++md=setmask(md,'all','')
++md=parameterize(md,'../Par/SquareShelf.py')
++md=setflowequation(md,'SSA','all')
++md.cluster=generic('name',oshostname(),'np',3)
++
++x = md.mesh.x
++xmin = min(x)
++xmax = max(x)
++Lx = (xmax-xmin)
++alpha = 2./3.
++md.mask.ice_levelset = numpy.float_((x - alpha*Lx)>0) - numpy.float_((x - alpha*Lx)<0)
++
++md.timestepping.time_step=10
++md.timestepping.final_time=30
++
++
++
++#Transient
++md.transient.isstressbalance=True
++md.transient.islevelset=True
++md.transient.ismasstransport=True
++md.transient.isthermal=False
++md.transient.isgroundingline=False
++md.transient.isgia=False
++md.transient.iscalving=True;
++
++md.calving.calvingrate=numpy.zeros((md.mesh.numberofvertices,1))
++md.calving.meltingrate=10000*numpy.ones((md.mesh.numberofvertices,1))
++
++md=solve(md,TransientSolutionEnum())
++
++#Fields and tolerances to track changes
++field_names     =['Vx1','Vy1','Vel1','Pressure1','Thickness1','Surface1','MaskIceLevelset1',\
++		'Vx2','Vy2','Vel2','Pressure2','Thickness2','Surface2','MaskIceLevelset2',\
++		'Vx3','Vy3','Vel3','Pressure3','Thickness3','Surface3','MaskIceLevelset3']
++field_tolerances=[1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,\
++		2e-13,2e-13,2e-13,1e-13,1e-13,1e-13,1e-13,\
++		2e-13,2e-13,2e-13,1e-13,1e-13,1e-13,1e-11]
++field_values=[\
++	md.results.TransientSolution[0].Vx,\
++	md.results.TransientSolution[0].Vy,\
++	md.results.TransientSolution[0].Vel,\
++	md.results.TransientSolution[0].Pressure,\
++	md.results.TransientSolution[0].Thickness,\
++	md.results.TransientSolution[0].Surface,\
++	md.results.TransientSolution[0].MaskIceLevelset,\
++	md.results.TransientSolution[1].Vx,\
++	md.results.TransientSolution[1].Vy,\
++	md.results.TransientSolution[1].Vel,\
++	md.results.TransientSolution[1].Pressure,\
++	md.results.TransientSolution[1].Thickness,\
++	md.results.TransientSolution[1].Surface,\
++	md.results.TransientSolution[1].MaskIceLevelset,\
++	md.results.TransientSolution[2].Vx,\
++	md.results.TransientSolution[2].Vy,\
++	md.results.TransientSolution[2].Vel,\
++	md.results.TransientSolution[2].Pressure,\
++	md.results.TransientSolution[2].Thickness,\
++	md.results.TransientSolution[2].Surface,\
++	md.results.TransientSolution[2].MaskIceLevelset,\
++
++	]
+Index: ../trunk-jpl/test/Archives/Archive807.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive807.nc
+===================================================================
+--- ../trunk-jpl/test/Archives/Archive807.nc	(revision 18816)
++++ ../trunk-jpl/test/Archives/Archive807.nc	(revision 18817)
+
+Property changes on: ../trunk-jpl/test/Archives/Archive807.nc
+___________________________________________________________________
+Added: svn:mime-type
+## -0,0 +1 ##
++application/octet-stream
+\ No newline at end of property
+Index: ../trunk-jpl/src/m/enum/CalvingLawEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingLawEnum.m	(revision 18816)
++++ ../trunk-jpl/src/m/enum/CalvingLawEnum.m	(revision 18817)
+@@ -1,11 +0,0 @@
+-function macro=CalvingLawEnum()
+-%CALVINGLAWENUM - Enum of CalvingLaw
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=CalvingLawEnum()
+-
+-macro=StringToEnum('CalvingLaw');
+Index: ../trunk-jpl/src/m/enum/HydrologydcEplflipLockEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/HydrologydcEplflipLockEnum.m	(revision 18816)
++++ ../trunk-jpl/src/m/enum/HydrologydcEplflipLockEnum.m	(revision 18817)
+@@ -1,11 +0,0 @@
+-function macro=HydrologydcEplflipLockEnum()
+-%HYDROLOGYDCEPLFLIPLOCKENUM - Enum of HydrologydcEplflipLock
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=HydrologydcEplflipLockEnum()
+-
+-macro=StringToEnum('HydrologydcEplflipLock');
+Index: ../trunk-jpl/src/m/enum/TransientIscalvingEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/TransientIscalvingEnum.m	(revision 18816)
++++ ../trunk-jpl/src/m/enum/TransientIscalvingEnum.m	(revision 18817)
+@@ -1,11 +0,0 @@
+-function macro=TransientIscalvingEnum()
+-%TRANSIENTISCALVINGENUM - Enum of TransientIscalving
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=TransientIscalvingEnum()
+-
+-macro=StringToEnum('TransientIscalving');
+Index: ../trunk-jpl/src/m/enum/CalvingLevermannEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingLevermannEnum.m	(revision 18816)
++++ ../trunk-jpl/src/m/enum/CalvingLevermannEnum.m	(revision 18817)
+@@ -1,11 +0,0 @@
+-function macro=CalvingLevermannEnum()
+-%CALVINGLEVERMANNENUM - Enum of CalvingLevermann
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=CalvingLevermannEnum()
+-
+-macro=StringToEnum('CalvingLevermann');
+Index: ../trunk-jpl/src/m/enum/FrictionWaterLayerEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/FrictionWaterLayerEnum.m	(revision 18816)
++++ ../trunk-jpl/src/m/enum/FrictionWaterLayerEnum.m	(revision 18817)
+@@ -1,11 +0,0 @@
+-function macro=FrictionWaterLayerEnum()
+-%FRICTIONWATERLAYERENUM - Enum of FrictionWaterLayer
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=FrictionWaterLayerEnum()
+-
+-macro=StringToEnum('FrictionWaterLayer');
+Index: ../trunk-jpl/src/m/enum/CalvingCalvingrateEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingCalvingrateEnum.m	(revision 18816)
++++ ../trunk-jpl/src/m/enum/CalvingCalvingrateEnum.m	(revision 18817)
+@@ -1,11 +0,0 @@
+-function macro=CalvingCalvingrateEnum()
+-%CALVINGCALVINGRATEENUM - Enum of CalvingCalvingrate
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=CalvingCalvingrateEnum()
+-
+-macro=StringToEnum('CalvingCalvingrate');
+Index: ../trunk-jpl/src/m/enum/CalvingRequestedOutputsEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingRequestedOutputsEnum.m	(revision 18816)
++++ ../trunk-jpl/src/m/enum/CalvingRequestedOutputsEnum.m	(revision 18817)
+@@ -1,11 +0,0 @@
+-function macro=CalvingRequestedOutputsEnum()
+-%CALVINGREQUESTEDOUTPUTSENUM - Enum of CalvingRequestedOutputs
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=CalvingRequestedOutputsEnum()
+-
+-macro=StringToEnum('CalvingRequestedOutputs');
+Index: ../trunk-jpl/src/m/enum/CalvinglevermannCoeffEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvinglevermannCoeffEnum.m	(revision 18816)
++++ ../trunk-jpl/src/m/enum/CalvinglevermannCoeffEnum.m	(revision 18817)
+@@ -1,11 +0,0 @@
+-function macro=CalvinglevermannCoeffEnum()
+-%CALVINGLEVERMANNCOEFFENUM - Enum of CalvinglevermannCoeff
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=CalvinglevermannCoeffEnum()
+-
+-macro=StringToEnum('CalvinglevermannCoeff');
+Index: ../trunk-jpl/src/m/enum/DefaultCalvingEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/DefaultCalvingEnum.m	(revision 18816)
++++ ../trunk-jpl/src/m/enum/DefaultCalvingEnum.m	(revision 18817)
+@@ -1,11 +0,0 @@
+-function macro=DefaultCalvingEnum()
+-%DEFAULTCALVINGENUM - Enum of DefaultCalving
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=DefaultCalvingEnum()
+-
+-macro=StringToEnum('DefaultCalving');
+Index: ../trunk-jpl/src/m/enum/CalvinglevermannMeltingrateEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvinglevermannMeltingrateEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvinglevermannMeltingrateEnum.m	(revision 18817)
+@@ -0,0 +1,11 @@
++function macro=CalvinglevermannMeltingrateEnum()
++%CALVINGLEVERMANNMELTINGRATEENUM - Enum of CalvinglevermannMeltingrate
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvinglevermannMeltingrateEnum()
++
++macro=StringToEnum('CalvinglevermannMeltingrate');
+Index: ../trunk-jpl/src/m/enum/CalvingMeltingrateEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingMeltingrateEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvingMeltingrateEnum.m	(revision 18817)
+@@ -0,0 +1,11 @@
++function macro=CalvingMeltingrateEnum()
++%CALVINGMELTINGRATEENUM - Enum of CalvingMeltingrate
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvingMeltingrateEnum()
++
++macro=StringToEnum('CalvingMeltingrate');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18816)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18817)
+@@ -212,10 +212,12 @@
+ def StressIntensityFactorEnum(): return StringToEnum("StressIntensityFactor")[0]
+ def CalvingLawEnum(): return StringToEnum("CalvingLaw")[0]
+ def CalvingCalvingrateEnum(): return StringToEnum("CalvingCalvingrate")[0]
++def CalvingMeltingrateEnum(): return StringToEnum("CalvingMeltingrate")[0]
+ def CalvingLevermannEnum(): return StringToEnum("CalvingLevermann")[0]
+ def DefaultCalvingEnum(): return StringToEnum("DefaultCalving")[0]
+ def CalvingRequestedOutputsEnum(): return StringToEnum("CalvingRequestedOutputs")[0]
+ def CalvinglevermannCoeffEnum(): return StringToEnum("CalvinglevermannCoeff")[0]
++def CalvinglevermannMeltingrateEnum(): return StringToEnum("CalvinglevermannMeltingrate")[0]
+ def CalvingratexEnum(): return StringToEnum("Calvingratex")[0]
+ def CalvingrateyEnum(): return StringToEnum("Calvingratey")[0]
+ def CalvingratexAverageEnum(): return StringToEnum("CalvingratexAverage")[0]
+Index: ../trunk-jpl/examples/ISMIP/CheatyRunme.m
+===================================================================
+--- ../trunk-jpl/examples/ISMIP/CheatyRunme.m	(revision 18816)
++++ ../trunk-jpl/examples/ISMIP/CheatyRunme.m	(revision 18817)
+@@ -2,7 +2,7 @@
+ %step 7 is specific to ISMIPA
+ %step 8 is specific to ISMIPF
+ 
+-steps=[1:7];
++steps=[1:4];
+ 
+ % parameter file to be used, choose between CheatyIsmipA.par or CheatyIsmipF.par
+ ParamFile='CheatyIsmipF.par'
+Index: ../trunk-jpl/examples/SquareIceShelf/Square.par
+===================================================================
+--- ../trunk-jpl/examples/SquareIceShelf/Square.par	(revision 18816)
++++ ../trunk-jpl/examples/SquareIceShelf/Square.par	(revision 18817)
+@@ -24,7 +24,7 @@
+ disp('      creating flow law parameter');
+ md.materials.rheology_B=paterson((273-20)*ones(md.mesh.numberofvertices,1));
+ md.materials.rheology_n=3*ones(md.mesh.numberofelements,1);
+-md.damage.D=zeros(md.mesh.numberofvertices,1);
++md.damage.D=0.9*ones(md.mesh.numberofvertices,1);
+ 
+ disp('      creating boundary conditions');
+ md=SetIceShelfBC(md,'Front.exp');
+Index: ../trunk-jpl/examples/SquareIceShelf/runme.m
+===================================================================
+--- ../trunk-jpl/examples/SquareIceShelf/runme.m	(revision 18816)
++++ ../trunk-jpl/examples/SquareIceShelf/runme.m	(revision 18817)
+@@ -1,7 +1,38 @@
+ md=model;
++
+ md=triangle(md,'DomainOutline.exp',100000);
+ md=setmask(md,'all','');
++
++md.materials=matdamageice();
+ md=parameterize(md,'Square.par');
++md.initialization.vx = ones(md.mesh.numberofvertices,1);
++md.initialization.vy = 0*ones(md.mesh.numberofvertices,1);
++md.initialization.pressure = 0*ones(md.mesh.numberofvertices,1);
++md.damage.isdamage=1;
++md.damage.law=1;
++md.damage.max_damage=0.8;
++md.damage.D=0.5*ones(md.mesh.numberofvertices,1);
++%md.damage.spcdamage=NaN*ones(md.mesh.numberofvertices,1);
++md.damage.c1=1;
++md.damage.c2=1;
++md.damage.equiv_stress=0;
++md.damage.stabilization=2;
++
++%md=extrude(md,7,3);
++md.surfaceforcings.mass_balance = zeros(md.mesh.numberofvertices,1);
++md.basalforcings.groundedice_melting_rate = zeros(md.mesh.numberofvertices,1);
++md.basalforcings.floatingice_melting_rate = zeros(md.mesh.numberofvertices,1);
+ md=setflowequation(md,'SSA','all');
++
++md.timestepping.start_time = 0;
++md.timestepping.final_time = 1.;
++md.timestepping.time_step  = 0.1;
++
++md.transient.isdamageevolution=1;
++md.transient.isthermal=0;
++
+ md.cluster=generic('name',oshostname,'np',2);
+-md=solve(md,StressbalanceSolutionEnum);
++md.stressbalance.requested_outputs={'default','DeviatoricStressxx','DeviatoricStressyy','DeviatoricStressxy'};
++%md=solve(md,StressbalanceSolutionEnum());
++md.verbose.solution = 1;
++md=solve(md,TransientSolutionEnum());
Index: /issm/oecreview/Archive/18296-19100/ISSM-18817-18818.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18817-18818.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18817-18818.diff	(revision 19102)
@@ -0,0 +1,144 @@
+Index: ../trunk-jpl/src/m/enum/CalvingLawEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingLawEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvingLawEnum.m	(revision 18818)
+@@ -0,0 +1,11 @@
++function macro=CalvingLawEnum()
++%CALVINGLAWENUM - Enum of CalvingLaw
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvingLawEnum()
++
++macro=StringToEnum('CalvingLaw');
+Index: ../trunk-jpl/src/m/enum/HydrologydcEplflipLockEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/HydrologydcEplflipLockEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/HydrologydcEplflipLockEnum.m	(revision 18818)
+@@ -0,0 +1,11 @@
++function macro=HydrologydcEplflipLockEnum()
++%HYDROLOGYDCEPLFLIPLOCKENUM - Enum of HydrologydcEplflipLock
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=HydrologydcEplflipLockEnum()
++
++macro=StringToEnum('HydrologydcEplflipLock');
+Index: ../trunk-jpl/src/m/enum/TransientIscalvingEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/TransientIscalvingEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/TransientIscalvingEnum.m	(revision 18818)
+@@ -0,0 +1,11 @@
++function macro=TransientIscalvingEnum()
++%TRANSIENTISCALVINGENUM - Enum of TransientIscalving
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=TransientIscalvingEnum()
++
++macro=StringToEnum('TransientIscalving');
+Index: ../trunk-jpl/src/m/enum/CalvingLevermannEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingLevermannEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvingLevermannEnum.m	(revision 18818)
+@@ -0,0 +1,11 @@
++function macro=CalvingLevermannEnum()
++%CALVINGLEVERMANNENUM - Enum of CalvingLevermann
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvingLevermannEnum()
++
++macro=StringToEnum('CalvingLevermann');
+Index: ../trunk-jpl/src/m/enum/FrictionWaterLayerEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/FrictionWaterLayerEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/FrictionWaterLayerEnum.m	(revision 18818)
+@@ -0,0 +1,11 @@
++function macro=FrictionWaterLayerEnum()
++%FRICTIONWATERLAYERENUM - Enum of FrictionWaterLayer
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=FrictionWaterLayerEnum()
++
++macro=StringToEnum('FrictionWaterLayer');
+Index: ../trunk-jpl/src/m/enum/CalvingCalvingrateEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingCalvingrateEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvingCalvingrateEnum.m	(revision 18818)
+@@ -0,0 +1,11 @@
++function macro=CalvingCalvingrateEnum()
++%CALVINGCALVINGRATEENUM - Enum of CalvingCalvingrate
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvingCalvingrateEnum()
++
++macro=StringToEnum('CalvingCalvingrate');
+Index: ../trunk-jpl/src/m/enum/CalvingRequestedOutputsEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingRequestedOutputsEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvingRequestedOutputsEnum.m	(revision 18818)
+@@ -0,0 +1,11 @@
++function macro=CalvingRequestedOutputsEnum()
++%CALVINGREQUESTEDOUTPUTSENUM - Enum of CalvingRequestedOutputs
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvingRequestedOutputsEnum()
++
++macro=StringToEnum('CalvingRequestedOutputs');
+Index: ../trunk-jpl/src/m/enum/CalvinglevermannCoeffEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvinglevermannCoeffEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvinglevermannCoeffEnum.m	(revision 18818)
+@@ -0,0 +1,11 @@
++function macro=CalvinglevermannCoeffEnum()
++%CALVINGLEVERMANNCOEFFENUM - Enum of CalvinglevermannCoeff
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvinglevermannCoeffEnum()
++
++macro=StringToEnum('CalvinglevermannCoeff');
+Index: ../trunk-jpl/src/m/enum/DefaultCalvingEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/DefaultCalvingEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/DefaultCalvingEnum.m	(revision 18818)
+@@ -0,0 +1,11 @@
++function macro=DefaultCalvingEnum()
++%DEFAULTCALVINGENUM - Enum of DefaultCalving
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=DefaultCalvingEnum()
++
++macro=StringToEnum('DefaultCalving');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18818-18819.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18818-18819.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18818-18819.diff	(revision 19102)
@@ -0,0 +1,29 @@
+Index: ../trunk-jpl/scripts/ol.m
+===================================================================
+--- ../trunk-jpl/scripts/ol.m	(revision 18818)
++++ ../trunk-jpl/scripts/ol.m	(revision 18819)
+@@ -1,14 +1,14 @@
+ 
+-	fid=fopen('runme.m','r');
+-	
++fid=fopen('runme.m','r');
++
++tline = fgets(fid);
++count=1;
++while ischar(tline)
+ 	tline = fgets(fid);
+-	count=1;
+-	while ischar(tline)
+-		tline = fgets(fid);
+-		if length(tline)>16,
+-			if strcmpi(tline(1:16),'if perform(org,'''),
+-				disp(sprintf('%i: %s',count,tline(17:end-5)));
+-				count=count+1;
+-			end
++	if length(tline)>16,
++		if strcmpi(tline(1:16),'if perform(org,'''),
++			disp(sprintf('%i: %s',count,tline(17:end-8)));
++			count=count+1;
+ 		end
+ 	end
++end
Index: /issm/oecreview/Archive/18296-19100/ISSM-18819-18820.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18819-18820.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18819-18820.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/externalpackages/curl
+===================================================================
+--- ../trunk-jpl/externalpackages/curl	(revision 18819)
++++ ../trunk-jpl/externalpackages/curl	(revision 18820)
+
+Property changes on: ../trunk-jpl/externalpackages/curl
+___________________________________________________________________
+Added: svn:ignore
+## -0,0 +1,3 ##
++install
++src
++*.gz
Index: /issm/oecreview/Archive/18296-19100/ISSM-18820-18821.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18820-18821.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18820-18821.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/externalpackages/m1qn3
+===================================================================
+--- ../trunk-jpl/externalpackages/m1qn3	(revision 18820)
++++ ../trunk-jpl/externalpackages/m1qn3	(revision 18821)
+
+Property changes on: ../trunk-jpl/externalpackages/m1qn3
+___________________________________________________________________
+Added: svn:ignore
+## -0,0 +1,3 ##
++src
++install
++*.tgz
Index: /issm/oecreview/Archive/18296-19100/ISSM-18821-18822.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18821-18822.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18821-18822.diff	(revision 19102)
@@ -0,0 +1,31 @@
+Index: ../trunk-jpl/src/c/bamg/Mesh.cpp
+===================================================================
+--- ../trunk-jpl/src/c/bamg/Mesh.cpp	(revision 18821)
++++ ../trunk-jpl/src/c/bamg/Mesh.cpp	(revision 18822)
+@@ -2908,14 +2908,14 @@
+ 
+ 		// for all the new point
+ 		long iv=nbvold;
+-		for (i=nbvold;i<nbv;i++){
++		for(i=nbvold;i<nbv;i++){
+ 			BamgVertex &vi=*orderedvertices[i];
+ 			vi.i=R2ToI2(vi.r);
+ 			vi.r=I2ToR2(vi.i);
+ 			double hx,hy;
+ 			vi.m.Box(hx,hy);
+ 			Icoor1 hi=(Icoor1) (hx*coefIcoor),hj=(Icoor1) (hy*coefIcoor);
+-			if (!quadtree->ToClose(vi,seuil,hi,hj)){
++			if(!quadtree->ToClose(vi,seuil,hi,hj)){
+ 				// a good new point 
+ 				BamgVertex &vj = vertices[iv];
+ 				long  j=vj.ReferenceNumber; 
+@@ -2940,6 +2940,9 @@
+ 				NbSwap += vj.Optim(1);          
+ 				iv++;
+ 			}
++			else{
++				vi.PreviousNumber = 0;
++			}
+ 		} 
+ 		if (verbose>3) {
+ 			_printf_("         number of new points: " << iv << "\n");
Index: /issm/oecreview/Archive/18296-19100/ISSM-18822-18823.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18822-18823.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18822-18823.diff	(revision 19102)
@@ -0,0 +1,98 @@
+Index: ../trunk-jpl/test/NightlyRun/test275.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test275.m	(revision 18822)
++++ ../trunk-jpl/test/NightlyRun/test275.m	(revision 18823)
+@@ -15,16 +15,14 @@
+ md.damage.stabilization=1;
+ 
+ md.damage.requested_outputs={'default','DamageF'};
+-md.transient.isdamageevolution=1;
+ 
+ md=setflowequation(md,'SSA','all');
+ md.cluster=generic('name',oshostname(),'np',3);
+-%md=solve(md,DamageEvolutionSolutionEnum());
++md=solve(md,DamageEvolutionSolutionEnum());
+ 
+-%field_names={'D','F'};
+-%field_tolerances={1e-13,1e-13};
+-%field_values={...
+-%		(md.results.DamageEvolutionSolution.DamageDbar),...
+-%		(md.results.DamageEvolutionSolution.DamageF),...
+-%	};
+-md=solve(md,TransientSolutionEnum());
++field_names={'D','F'};
++field_tolerances={1e-13,1e-13};
++field_values={...
++		(md.results.DamageEvolutionSolution.DamageDbar),...
++		(md.results.DamageEvolutionSolution.DamageF),...
++	};
+Index: ../trunk-jpl/examples/ISMIP/CheatyRunme.m
+===================================================================
+--- ../trunk-jpl/examples/ISMIP/CheatyRunme.m	(revision 18822)
++++ ../trunk-jpl/examples/ISMIP/CheatyRunme.m	(revision 18823)
+@@ -2,7 +2,7 @@
+ %step 7 is specific to ISMIPA
+ %step 8 is specific to ISMIPF
+ 
+-steps=[1:4];
++steps=[1:7];
+ 
+ % parameter file to be used, choose between CheatyIsmipA.par or CheatyIsmipF.par
+ ParamFile='CheatyIsmipF.par'
+Index: ../trunk-jpl/examples/SquareIceShelf/Square.par
+===================================================================
+--- ../trunk-jpl/examples/SquareIceShelf/Square.par	(revision 18822)
++++ ../trunk-jpl/examples/SquareIceShelf/Square.par	(revision 18823)
+@@ -24,7 +24,7 @@
+ disp('      creating flow law parameter');
+ md.materials.rheology_B=paterson((273-20)*ones(md.mesh.numberofvertices,1));
+ md.materials.rheology_n=3*ones(md.mesh.numberofelements,1);
+-md.damage.D=0.9*ones(md.mesh.numberofvertices,1);
++md.damage.D=zeros(md.mesh.numberofvertices,1);
+ 
+ disp('      creating boundary conditions');
+ md=SetIceShelfBC(md,'Front.exp');
+Index: ../trunk-jpl/examples/SquareIceShelf/runme.m
+===================================================================
+--- ../trunk-jpl/examples/SquareIceShelf/runme.m	(revision 18822)
++++ ../trunk-jpl/examples/SquareIceShelf/runme.m	(revision 18823)
+@@ -1,38 +1,7 @@
+ md=model;
+-
+ md=triangle(md,'DomainOutline.exp',100000);
+ md=setmask(md,'all','');
+-
+-md.materials=matdamageice();
+ md=parameterize(md,'Square.par');
+-md.initialization.vx = ones(md.mesh.numberofvertices,1);
+-md.initialization.vy = 0*ones(md.mesh.numberofvertices,1);
+-md.initialization.pressure = 0*ones(md.mesh.numberofvertices,1);
+-md.damage.isdamage=1;
+-md.damage.law=1;
+-md.damage.max_damage=0.8;
+-md.damage.D=0.5*ones(md.mesh.numberofvertices,1);
+-%md.damage.spcdamage=NaN*ones(md.mesh.numberofvertices,1);
+-md.damage.c1=1;
+-md.damage.c2=1;
+-md.damage.equiv_stress=0;
+-md.damage.stabilization=2;
+-
+-%md=extrude(md,7,3);
+-md.surfaceforcings.mass_balance = zeros(md.mesh.numberofvertices,1);
+-md.basalforcings.groundedice_melting_rate = zeros(md.mesh.numberofvertices,1);
+-md.basalforcings.floatingice_melting_rate = zeros(md.mesh.numberofvertices,1);
+ md=setflowequation(md,'SSA','all');
+-
+-md.timestepping.start_time = 0;
+-md.timestepping.final_time = 1.;
+-md.timestepping.time_step  = 0.1;
+-
+-md.transient.isdamageevolution=1;
+-md.transient.isthermal=0;
+-
+ md.cluster=generic('name',oshostname,'np',2);
+-md.stressbalance.requested_outputs={'default','DeviatoricStressxx','DeviatoricStressyy','DeviatoricStressxy'};
+-%md=solve(md,StressbalanceSolutionEnum());
+-md.verbose.solution = 1;
+-md=solve(md,TransientSolutionEnum());
++md=solve(md,StressbalanceSolutionEnum());
Index: /issm/oecreview/Archive/18296-19100/ISSM-18823-18824.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18823-18824.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18823-18824.diff	(revision 19102)
@@ -0,0 +1,119 @@
+Index: ../trunk-jpl/src/m/classes/m1qn3inversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 18823)
++++ ../trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 18824)
+@@ -68,7 +68,6 @@
+ 			if ~IssmConfig('_HAVE_M1QN3_'),
+ 				md = checkmessage(md,['M1QN3 has not been installed, ISSM needs to be reconfigured and recompiled with M1QN3']);
+ 			end
+-
+ 			num_controls=numel(md.inversion.control_parameters);
+ 			num_costfunc=size(md.inversion.cost_functions,2);
+ 
+@@ -76,13 +75,13 @@
+ 			md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0 1]);
+ 			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',...
+ 				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'DamageDbar',...
+-				'Vx' 'Vy' 'Thickness' 'BalancethicknessOmega' 'BalancethicknessApparentMassbalance'});
++				'Vx' 'Vy' 'Thickness' 'BalancethicknessOmega' 'BalancethicknessApparentMassbalance','MaterialsRheologyB'});
+ 			md = checkfield(md,'fieldname','inversion.control_scaling_factors','size',[1 num_controls],'>',0,'NaN',1);
+ 			md = checkfield(md,'fieldname','inversion.maxsteps','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.maxiter','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.dxmin','numel',1,'>',0);
+ 			md = checkfield(md,'fieldname','inversion.gttol','numel',1,'>',0);
+-			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:506 601:604]);
++			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:507 601:604]);
+ 			md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);
+ 			md = checkfield(md,'fieldname','inversion.max_parameters','size',[md.mesh.numberofvertices num_controls]);
+@@ -180,6 +179,7 @@
+ 			pos=find(obj.cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
+ 			pos=find(obj.cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
+ 			pos=find(obj.cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
++			pos=find(obj.cost_functions==507); data(pos)=RheologyBAbsGradientEnum();
+ 			pos=find(obj.cost_functions==601); data(pos)=SurfaceAbsMisfitEnum();
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+Index: ../trunk-jpl/src/m/classes/inversionvalidation.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 18823)
++++ ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 18824)
+@@ -58,9 +58,9 @@
+ 			md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0 1]);
+ 			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',...
+ 				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'DamageDbar' 'Vx' 'Vy' 'Thickness',...
+-				'BalancethicknessOmega' 'BalancethicknessApparentMassbalance'});
++				'BalancethicknessOmega' 'BalancethicknessApparentMassbalance','MaterialsRheologyB'});
+ 			md = checkfield(md,'fieldname','inversion.control_scaling_factors','size',[1 num_controls],'>',0,'NaN',1);
+-			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:506 601:604]);
++			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:507 601:604]);
+ 			md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);
+ 			md = checkfield(md,'fieldname','inversion.max_parameters','size',[md.mesh.numberofvertices num_controls]);
+@@ -149,6 +149,7 @@
+ 			pos=find(obj.cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
+ 			pos=find(obj.cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
+ 			pos=find(obj.cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
++			pos=find(obj.cost_functions==507); data(pos)=RheologyBAbsGradientEnum();
+ 			pos=find(obj.cost_functions==601); data(pos)=SurfaceAbsMisfitEnum();
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+Index: ../trunk-jpl/src/m/classes/inversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversion.m	(revision 18823)
++++ ../trunk-jpl/src/m/classes/inversion.m	(revision 18824)
+@@ -133,11 +133,11 @@
+ 			md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0 1]);
+ 			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',...
+ 				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'DamageDbar' 'Vx' 'Vy' 'Thickness',...
+-				'BalancethicknessOmega' 'BalancethicknessApparentMassbalance'});
++				'BalancethicknessOmega' 'BalancethicknessApparentMassbalance','MaterialsRheologyB'});
+ 			md = checkfield(md,'fieldname','inversion.nsteps','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.maxiter_per_step','size',[md.inversion.nsteps 1],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.step_threshold','size',[md.inversion.nsteps 1]);
+-			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:506 601:604]);
++			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:507 601:604]);
+ 			md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.gradient_scaling','size',[md.inversion.nsteps num_controls]);
+ 			md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);
+@@ -241,6 +241,7 @@
+ 			pos=find(obj.cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
+ 			pos=find(obj.cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
+ 			pos=find(obj.cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
++			pos=find(obj.cost_functions==507); data(pos)=RheologyBAbsGradientEnum();
+ 			pos=find(obj.cost_functions==601); data(pos)=SurfaceAbsMisfitEnum();
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+Index: ../trunk-jpl/src/m/classes/clusters/greenplanet.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/greenplanet.m	(revision 18823)
++++ ../trunk-jpl/src/m/classes/clusters/greenplanet.m	(revision 18824)
+@@ -8,17 +8,17 @@
+ classdef greenplanet
+     properties (SetAccess=public)  
+ 		 % {{{
+-		 name='greenplanet'
+-		 login='';
+-		 numnodes=20;
+-		 cpuspernode=8; 
+-		 port=8000;
+-		 queue='c6145';
+-		 codepath='';
+-		 executionpath='';
+-		 interactive=0;
+-		 time=24*60;
+-		 memory=2;
++		 name          = 'greenplanet'
++		 login         = '';
++		 numnodes      = 20;
++		 cpuspernode   = 8;
++		 port          = 8000;
++		 queue         = 'c6145';
++		 codepath      = '';
++		 executionpath = '';
++		 interactive   = 0;
++		 time          = 24*60;
++		 memory        = 2;
+ 	 end
+ 	 properties (SetAccess=private) 
+ 		 np=20*8;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18824-18825.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18824-18825.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18824-18825.diff	(revision 19102)
@@ -0,0 +1,139 @@
+Index: ../trunk-jpl/src/c/modules/RheologyBAbsGradientx/RheologyBAbsGradientx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/RheologyBAbsGradientx/RheologyBAbsGradientx.cpp	(revision 0)
++++ ../trunk-jpl/src/c/modules/RheologyBAbsGradientx/RheologyBAbsGradientx.cpp	(revision 18825)
+@@ -0,0 +1,79 @@
++/*!\file RheologyBAbsGradientx
++ * \brief: compute misfit between observations and model
++ */
++
++#include "./RheologyBAbsGradientx.h"
++
++#include "../../shared/shared.h"
++#include "../../toolkits/toolkits.h"
++
++void RheologyBAbsGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){
++
++	/*output: */
++	IssmDouble J=0.;
++	IssmDouble J_sum;
++
++	/*Compute Misfit: */
++	for(int i=0;i<elements->Size();i++){
++		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
++		J+=RheologyBAbsGradient(element);
++	}
++
++	/*Sum all J from all cpus of the cluster:*/
++	ISSM_MPI_Reduce (&J,&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
++	ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
++	J=J_sum;
++
++	/*Assign output pointers: */
++	*pJ=J;
++}
++
++IssmDouble RheologyBAbsGradient(Element* element){
++
++	int         domaintype,numcomponents;
++	IssmDouble  Jelem=0.;
++	IssmDouble  misfit,Jdet;
++	IssmDouble  dp[3],weight;
++	IssmDouble* xyz_list      = NULL;
++
++	/*If on water, return 0: */
++	if(!element->IsIceInElement()) return 0.;
++
++	/*Get problem dimension*/
++	element->FindParam(&domaintype,DomainTypeEnum);
++	switch(domaintype){
++		case Domain2DverticalEnum:   numcomponents   = 1; break;
++		case Domain3DEnum:           numcomponents   = 2; break;
++		case Domain2DhorizontalEnum: numcomponents   = 2; break;
++		default: _error_("not supported yet");
++	}
++
++	/* Get node coordinates*/
++	element->GetVerticesCoordinates(&xyz_list);
++
++	/*Retrieve all inputs we will be needing: */
++	Input* weights_input=element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
++	Input* rheologyb_input=element->GetInput(MaterialsRheologyBEnum);                  _assert_(rheologyb_input);
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGauss(2);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++
++		gauss->GaussPoint(ig);
++
++		/* Get Jacobian determinant: */
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++
++		/*Get all parameters at gaussian point*/
++		weights_input->GetInputValue(&weight,gauss,RheologyBAbsGradientEnum);
++		rheologyb_input->GetInputDerivativeValue(&dp[0],xyz_list,gauss);
++
++		/*Tikhonov regularization: J = 1/2 ((dp/dx)^2 + (dp/dy)^2) */ 
++		Jelem+=weight*1/2*(dp[0]*dp[0] + dp[1]*dp[1])*Jdet*gauss->weight;
++	}
++
++	/*clean up and Return: */
++	xDelete<IssmDouble>(xyz_list);
++	delete gauss;
++	return Jelem;
++}
+Index: ../trunk-jpl/src/c/modules/RheologyBAbsGradientx/RheologyBAbsGradientx.h
+===================================================================
+--- ../trunk-jpl/src/c/modules/RheologyBAbsGradientx/RheologyBAbsGradientx.h	(revision 0)
++++ ../trunk-jpl/src/c/modules/RheologyBAbsGradientx/RheologyBAbsGradientx.h	(revision 18825)
+@@ -0,0 +1,14 @@
++/*!\file:  RheologyBAbsGradientx.h
++ * \brief header file for inverse methods misfit computation
++ */ 
++
++#ifndef _RHEOLOGYBGRADIENTX_H
++#define _RHEOLOGYBGRADIENTX_H
++
++#include "../../classes/classes.h"
++
++/* local prototypes: */
++void RheologyBAbsGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters);
++IssmDouble RheologyBAbsGradient(Element* element);
++
++#endif
+Index: ../trunk-jpl/src/c/modules/RheologyBAbsGradientx
+===================================================================
+--- ../trunk-jpl/src/c/modules/RheologyBAbsGradientx	(revision 18824)
++++ ../trunk-jpl/src/c/modules/RheologyBAbsGradientx	(revision 18825)
+
+Property changes on: ../trunk-jpl/src/c/modules/RheologyBAbsGradientx
+___________________________________________________________________
+Added: svn:ignore
+## -0,0 +1,2 ##
++.deps
++.dirstamp
+Index: ../trunk-jpl/src/c/modules/modules.h
+===================================================================
+--- ../trunk-jpl/src/c/modules/modules.h	(revision 18824)
++++ ../trunk-jpl/src/c/modules/modules.h	(revision 18825)
+@@ -75,6 +75,7 @@
+ #include "./ResetConstraintsx/ResetConstraintsx.h"
+ #include "./ResetFSBasalBoundaryConditionx/ResetFSBasalBoundaryConditionx.h"
+ #include "./RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.h"
++#include "./RheologyBAbsGradientx/RheologyBAbsGradientx.h"
+ #include "./Scotchx/Scotchx.h"
+ #include "./Shp2Kmlx/Shp2Kmlx.h"
+ #include "./SurfaceMassBalancex/SurfaceMassBalancex.h"
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 18824)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 18825)
+@@ -406,6 +406,8 @@
+ 					./modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.h\
+ 					./modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.cpp\
+ 					./modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.h\
++					./modules/RheologyBAbsGradientx/RheologyBAbsGradientx.cpp\
++					./modules/RheologyBAbsGradientx/RheologyBAbsGradientx.h\
+ 					./classes/Inputs/ControlInput.h\
+ 					./classes/Inputs/ControlInput.cpp\
+ 					./shared/Numerics/BrentSearch.cpp\
Index: /issm/oecreview/Archive/18296-19100/ISSM-18825-18826.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18825-18826.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18825-18826.diff	(revision 19102)
@@ -0,0 +1,36 @@
+Index: ../trunk-jpl/src/c/cores/extrudefromtop_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/extrudefromtop_core.cpp	(revision 18825)
++++ ../trunk-jpl/src/c/cores/extrudefromtop_core.cpp	(revision 18826)
+@@ -11,11 +11,27 @@
+ 
+ void extrudefromtop_core(FemModel* femmodel){
+ 
++	/*Intermediaries*/
++	int elementtype,domaintype;
++
+ 	if(VerboseSolution()) _printf0_("extruding solution from top...\n");
+ 
+-	/*Call on core computations: */
+-	femmodel->SetCurrentConfiguration(ExtrudeFromTopAnalysisEnum);
+-	femmodel->UpdateConstraintsExtrudeFromTopx();
+-	solutionsequence_linear(femmodel);
++	/*Get parameters*/
++	femmodel->parameters->FindParam(&domaintype,DomainTypeEnum);
++	femmodel->parameters->FindParam(&elementtype,MeshElementtypeEnum);
+ 
++	/*If this is a 2D horizontal domain, return (no need to extrude)*/
++	if(domaintype==Domain2DhorizontalEnum) return;
++
++	/*Special method for Penta, otherwise call solution sequence*/
++	if(elementtype==PentaEnum){
++		int inputenum; femmodel->parameters->FindParam(&inputenum,InputToExtrudeEnum);
++		InputExtrudex(femmodel,inputenum,+1);
++	}
++	else{
++		/*Call on core computations: */
++		femmodel->SetCurrentConfiguration(ExtrudeFromTopAnalysisEnum);
++		femmodel->UpdateConstraintsExtrudeFromTopx();
++		solutionsequence_linear(femmodel);
++	}
+ }
Index: /issm/oecreview/Archive/18296-19100/ISSM-18826-18827.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18826-18827.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18826-18827.diff	(revision 19102)
@@ -0,0 +1,56 @@
+Index: ../trunk-jpl/src/c/cores/adjointstressbalance_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/adjointstressbalance_core.cpp	(revision 18826)
++++ ../trunk-jpl/src/c/cores/adjointstressbalance_core.cpp	(revision 18827)
+@@ -15,16 +15,29 @@
+ 	bool isFS;
+ 	bool save_results;
+ 	bool conserve_loads   = true;
++	int fe_FS;
+ 
+ 	/*retrieve parameters:*/
+ 	femmodel->parameters->FindParam(&isFS,FlowequationIsFSEnum);
+ 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
++	femmodel->parameters->FindParam(&fe_FS,FlowequationFeFSEnum);
+ 
+ 	/*Compute velocities*/
+ 	if(VerboseSolution()) _printf0_("   computing velocities\n");
+ 	femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum);
+-	solutionsequence_nonlinear(femmodel,conserve_loads); 
+ 
++	if(VerboseSolution()) _printf0_("   computing velocities\n");
++	femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum);
++	if(isFS){
++		if (fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum)
++		 solutionsequence_la(femmodel);
++		else
++		 solutionsequence_nonlinear(femmodel,conserve_loads); 
++	}
++	else{
++		solutionsequence_nonlinear(femmodel,conserve_loads); 
++	}
++
+ 	/*Call SurfaceAreax, because some it might be needed by PVector*/
+ 	SurfaceAreax(NULL,femmodel);
+ 
+@@ -36,11 +49,15 @@
+ 	/*Save results*/
+ 	if(save_results || true){
+ 		if(VerboseSolution()) _printf0_("   saving results\n");
+-		if (isFS){
+-			//int outputs[4] = {AdjointxEnum,AdjointyEnum,AdjointzEnum,AdjointpEnum};
+-			//femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],4);
+-			int outputs[3] = {AdjointxEnum,AdjointyEnum,AdjointpEnum};
+-			femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],3);
++		if(isFS){
++			if(fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum){
++				int outputs[2] = {AdjointxEnum,AdjointyEnum};
++				femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],2);
++			}
++			else{
++				int outputs[3] = {AdjointxEnum,AdjointyEnum,AdjointpEnum};
++				femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],3);
++			}
+ 		}
+ 		else{
+ 			int outputs[2] = {AdjointxEnum,AdjointyEnum};
Index: /issm/oecreview/Archive/18296-19100/ISSM-18827-18828.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18827-18828.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18827-18828.diff	(revision 19102)
@@ -0,0 +1,64 @@
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18827)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18828)
+@@ -592,6 +592,7 @@
+ 	ThicknessAcrossGradientEnum,
+ 	IntMatParamEnum,
+ 	RheologyBbarAbsGradientEnum,
++	RheologyBAbsGradientEnum,
+ 	DragCoefficientAbsGradientEnum,
+ 	TransientInputEnum,
+ 	WaterfractionEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18827)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18828)
+@@ -583,6 +583,7 @@
+ 		case ThicknessAcrossGradientEnum : return "ThicknessAcrossGradient";
+ 		case IntMatParamEnum : return "IntMatParam";
+ 		case RheologyBbarAbsGradientEnum : return "RheologyBbarAbsGradient";
++		case RheologyBAbsGradientEnum : return "RheologyBAbsGradient";
+ 		case DragCoefficientAbsGradientEnum : return "DragCoefficientAbsGradient";
+ 		case TransientInputEnum : return "TransientInput";
+ 		case WaterfractionEnum : return "Waterfraction";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18827)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18828)
+@@ -595,6 +595,7 @@
+ 	      else if (strcmp(name,"ThicknessAcrossGradient")==0) return ThicknessAcrossGradientEnum;
+ 	      else if (strcmp(name,"IntMatParam")==0) return IntMatParamEnum;
+ 	      else if (strcmp(name,"RheologyBbarAbsGradient")==0) return RheologyBbarAbsGradientEnum;
++	      else if (strcmp(name,"RheologyBAbsGradient")==0) return RheologyBAbsGradientEnum;
+ 	      else if (strcmp(name,"DragCoefficientAbsGradient")==0) return DragCoefficientAbsGradientEnum;
+ 	      else if (strcmp(name,"TransientInput")==0) return TransientInputEnum;
+ 	      else if (strcmp(name,"Waterfraction")==0) return WaterfractionEnum;
+Index: ../trunk-jpl/src/m/enum/RheologyBAbsGradientEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/RheologyBAbsGradientEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/RheologyBAbsGradientEnum.m	(revision 18828)
+@@ -0,0 +1,11 @@
++function macro=RheologyBAbsGradientEnum()
++%RHEOLOGYBABSGRADIENTENUM - Enum of RheologyBAbsGradient
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=RheologyBAbsGradientEnum()
++
++macro=StringToEnum('RheologyBAbsGradient');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18827)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18828)
+@@ -575,6 +575,7 @@
+ def ThicknessAcrossGradientEnum(): return StringToEnum("ThicknessAcrossGradient")[0]
+ def IntMatParamEnum(): return StringToEnum("IntMatParam")[0]
+ def RheologyBbarAbsGradientEnum(): return StringToEnum("RheologyBbarAbsGradient")[0]
++def RheologyBAbsGradientEnum(): return StringToEnum("RheologyBAbsGradient")[0]
+ def DragCoefficientAbsGradientEnum(): return StringToEnum("DragCoefficientAbsGradient")[0]
+ def TransientInputEnum(): return StringToEnum("TransientInput")[0]
+ def WaterfractionEnum(): return StringToEnum("Waterfraction")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18828-18829.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18828-18829.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18828-18829.diff	(revision 19102)
@@ -0,0 +1,43 @@
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18828)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18829)
+@@ -513,8 +513,9 @@
+ 			break;
+ 
+ 		case TransientSolutionEnum:{
+-			bool isSIA,isthermal,isenthalpy,ismasstransport,isgroundingline,isstressbalance,islevelset,ishydrology,isdamage;
++			bool isSIA,isFS,isthermal,isenthalpy,ismasstransport,isgroundingline,isstressbalance,islevelset,ishydrology,isdamage;
+ 			iomodel->Constant(&isSIA,FlowequationIsSIAEnum);
++			iomodel->Constant(&isFS,FlowequationIsFSEnum);
+ 			iomodel->Constant(&isthermal,TransientIsthermalEnum);
+ 			iomodel->Constant(&isenthalpy,ThermalIsenthalpyEnum);
+ 			iomodel->Constant(&islevelset,TransientIslevelsetEnum);
+@@ -524,11 +525,19 @@
+ 			iomodel->Constant(&isdamage,TransientIsdamageevolutionEnum);
+ 			iomodel->Constant(&ishydrology,TransientIshydrologyEnum);
+ 			if(isstressbalance){
++				int  fe_FS;
++				iomodel->Constant(&fe_FS,FlowequationFeFSEnum);
+ 				analyses_temp[numanalyses++]=StressbalanceAnalysisEnum;
+ 				analyses_temp[numanalyses++]=StressbalanceVerticalAnalysisEnum;
+ 				if(isSIA){
+ 					analyses_temp[numanalyses++]=StressbalanceSIAAnalysisEnum;
+ 				}
++				analyses_temp[numanalyses++]=L2ProjectionBaseAnalysisEnum;
++				analyses_temp[numanalyses++]=ExtrudeFromBaseAnalysisEnum;
++				analyses_temp[numanalyses++]=DepthAverageAnalysisEnum;
++				if(fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum){
++					analyses_temp[numanalyses++]=UzawaPressureAnalysisEnum;
++				}
+ 			}
+ 			if(isthermal && iomodel->domaintype==Domain3DEnum){
+ 				if(isenthalpy){
+@@ -765,6 +774,7 @@
+ 				case ThicknessAlongGradientEnum:    ThicknessAlongGradientx(&double_result,elements,nodes,vertices,loads,materials,parameters);     break;
+ 				case ThicknessAcrossGradientEnum:   ThicknessAcrossGradientx(&double_result,elements,nodes,vertices,loads,materials,parameters);    break;
+ 				case RheologyBbarAbsGradientEnum:   RheologyBbarAbsGradientx(&double_result,elements,nodes,vertices,loads,materials,parameters);    break;
++				case RheologyBAbsGradientEnum:      RheologyBAbsGradientx(&double_result,elements,nodes,vertices,loads,materials,parameters);  break;
+ 				case DragCoefficientAbsGradientEnum:DragCoefficientAbsGradientx(&double_result,elements,nodes,vertices,loads,materials,parameters); break;
+ 				case BalancethicknessMisfitEnum:    BalancethicknessMisfitx(&double_result);                                                        break;
+ 				case SurfaceAbsMisfitEnum:          SurfaceAbsMisfitx(&double_result); break;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18829-18830.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18829-18830.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18829-18830.diff	(revision 19102)
@@ -0,0 +1,38 @@
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 18829)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 18830)
+@@ -11,7 +11,7 @@
+ void	UpdateElementsAndMaterialsControl(Elements* elements,Materials* materials, IoModel* iomodel){
+ 
+ 	/*Intermediary*/
+-	int       control,cost_function;
++	int       control,cost_function,domaintype;
+ 	Element  *element = NULL;
+ 	Material *material = NULL;
+ 	int       num_control_type,num_cost_functions;
+@@ -28,6 +28,7 @@
+ 
+ 	/*Fetch Observations */
+ 	iomodel->Constant(&num_cost_functions,InversionNumCostFunctionsEnum);
++	iomodel->Constant(&domaintype,DomainTypeEnum);
+ 	for(int i=0;i<num_cost_functions;i++){
+ 		cost_function= reCast<int,IssmDouble>(iomodel->Data(InversionCostFunctionsEnum)[i]);
+ 		if(     cost_function==ThicknessAbsMisfitEnum) iomodel->FetchDataToInput(elements,InversionThicknessObsEnum);
+@@ -38,7 +39,7 @@
+ 			  || cost_function==SurfaceLogVxVyMisfitEnum
+ 			  || cost_function==SurfaceAverageVelMisfitEnum){
+ 			iomodel->FetchDataToInput(elements,InversionVxObsEnum);
+-			iomodel->FetchDataToInput(elements,InversionVyObsEnum); 
++			if (domaintype!=Domain2DverticalEnum) iomodel->FetchDataToInput(elements,InversionVyObsEnum); 
+ 		}
+ 	}
+ 
+@@ -53,6 +54,7 @@
+ 			case FrictionCoefficientEnum:
+ 			case BalancethicknessApparentMassbalanceEnum:
+ 			case BalancethicknessOmegaEnum:
++			case MaterialsRheologyBEnum: 
+ 				iomodel->FetchData(1,control); 
+ 				break;
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18830-18831.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18830-18831.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18830-18831.diff	(revision 19102)
@@ -0,0 +1,14 @@
+Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18830)
++++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18831)
+@@ -1480,9 +1480,6 @@
+ 					D,bsize,bsize,0,
+ 					Bprime,bsize,numdof,0,
+ 					&Ke->values[0],1);
+-
+-		for(int i=0;i<bsize*numdof;i++) if(B[i]==1.) _error_("STREAM");
+-		for(int i=0;i<bsize*numdof;i++) if(Bprime[i]==1.) _error_("STREAM");
+ 	}
+ 
+ 	/*Transform Coordinate System*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18831-18832.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18831-18832.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18831-18832.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18831)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18832)
+@@ -532,8 +532,6 @@
+ 				if(isSIA){
+ 					analyses_temp[numanalyses++]=StressbalanceSIAAnalysisEnum;
+ 				}
+-				analyses_temp[numanalyses++]=L2ProjectionBaseAnalysisEnum;
+-				analyses_temp[numanalyses++]=ExtrudeFromBaseAnalysisEnum;
+ 				analyses_temp[numanalyses++]=DepthAverageAnalysisEnum;
+ 				if(fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum){
+ 					analyses_temp[numanalyses++]=UzawaPressureAnalysisEnum;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18832-18833.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18832-18833.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18832-18833.diff	(revision 19102)
@@ -0,0 +1,78 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Element.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18832)
++++ ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18833)
+@@ -65,6 +65,8 @@
+ 		void       DeepEcho();
+ 		void       DeleteMaterials(void);
+ 		void       dViscositydBSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
++		void       dViscositydBHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
++		void       dViscositydBFS(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
+ 		void       dViscositydDSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
+ 		IssmDouble Divergence(void);
+ 		void       ThermalToEnthalpy(IssmDouble* penthalpy,IssmDouble temperature,IssmDouble waterfraction,IssmDouble pressure);
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18832)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18833)
+@@ -445,6 +445,60 @@
+ 
+ }
+ /*}}}*/
++void       Element::dViscositydBHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/
++
++	/*Intermediaries*/
++	IssmDouble dmudB;
++	IssmDouble epsilon3d[5];/* epsilon=[exx,eyy,exy,exy,exz,eyz];    */
++	IssmDouble epsilon2d[2];/* epsilon=[exx,eyy,exy];    */
++	IssmDouble eps_eff;
++	IssmDouble eps0=1.e-27;
++
++	if(dim==3){
++		/* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
++		this->StrainRateHO(&epsilon3d[0],xyz_list,gauss,vx_input,vy_input);
++		eps_eff = sqrt(epsilon3d[0]*epsilon3d[0] + epsilon3d[1]*epsilon3d[1] + epsilon3d[2]*epsilon3d[2] + epsilon3d[3]*epsilon3d[3] +  epsilon3d[4]*epsilon3d[4] + epsilon3d[0]*epsilon3d[1]+eps0*eps0);
++	}
++	else{
++		/* eps_eff^2 = 1/2 ( exx^2 + eyy^2 + 2*exy^2 )*/
++		this->StrainRateHO2dvertical(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
++		eps_eff = 1./sqrt(2.)*sqrt(epsilon2d[0]*epsilon2d[0] + 2.*epsilon2d[1]*epsilon2d[1] + eps0*eps0);
++	}
++	/*Get viscosity*/
++	material->GetViscosity_B(&dmudB,eps_eff);
++
++	/*Assign output pointer*/
++	*pdmudB=dmudB;
++
++}
++/*}}}*/
++void       Element::dViscositydBFS(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){/*{{{*/
++
++	/*Intermediaries*/
++	IssmDouble dmudB;
++	IssmDouble epsilon3d[6];/* epsilon=[exx,eyy,exy,exy,exz,eyz];    */
++	IssmDouble epsilon2d[3];/* epsilon=[exx,eyy,exy];    */
++	IssmDouble eps_eff;
++	IssmDouble eps0=1.e-27;
++
++	if(dim==3){
++		/* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
++		this->StrainRateFS(&epsilon3d[0],xyz_list,gauss,vx_input,vy_input,vz_input);
++		eps_eff = sqrt(epsilon3d[0]*epsilon3d[0] + epsilon3d[1]*epsilon3d[1] + epsilon3d[3]*epsilon3d[3] +  epsilon3d[4]*epsilon3d[4] + epsilon3d[5]*epsilon3d[5] + epsilon3d[0]*epsilon3d[1]+eps0*eps0);
++	}
++	else{
++		/* eps_eff^2 = 1/2 ( exx^2 + eyy^2 + 2*exy^2 )*/
++		this->StrainRateSSA(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
++		eps_eff = 1./sqrt(2.)*sqrt(epsilon2d[0]*epsilon2d[0] + epsilon2d[1]*epsilon2d[1] + 2.*epsilon2d[2]*epsilon2d[2]);
++	}
++	/*Get viscosity*/
++	material->GetViscosity_B(&dmudB,eps_eff);
++
++	/*Assign output pointer*/
++	*pdmudB=dmudB;
++
++}
++/*}}}*/
+ void       Element::dViscositydDSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/
+ 
+ 	/*Intermediaries*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18833-18834.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18833-18834.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18833-18834.diff	(revision 19102)
@@ -0,0 +1,1126 @@
+Index: ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 18833)
++++ ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 18834)
+@@ -336,15 +336,15 @@
+ 	if(!element->IsOnSurface()) return NULL;
+ 
+ 	/*Intermediaries */
+-	int        num_responses,i,dim;
++	int        num_responses,i,domaintype;
+ 	IssmDouble Jdet,obs_velocity_mag,velocity_mag;
+ 	IssmDouble vx,vy,vxobs,vyobs,dux,duy,weight;
+ 	IssmDouble scalex,scaley,scale,S;
+ 	int        *responses    = NULL;
+ 	IssmDouble *xyz_list_top = NULL;
+ 
+-	/*Get problem dimension*/
+-	element->FindParam(&dim,DomainDimensionEnum);
++	/* Get domaintype*/
++	element->FindParam(&domaintype,DomainTypeEnum);
+ 
+ 	/*Fetch number of nodes and dof for this finite element*/
+ 	int vnumnodes = element->NumberofNodesVelocity();
+@@ -352,7 +352,7 @@
+ 
+ 	/*Prepare coordinate system list*/
+ 	int* cs_list = xNew<int>(vnumnodes+pnumnodes);
+-	if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum;
++	if(domaintype==Domain2DverticalEnum) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum;
+ 	else       for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum;
+ 	for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum;
+ 
+@@ -366,9 +366,13 @@
+ 	element->FindParam(&responses,NULL,InversionCostFunctionsEnum);
+ 	Input* weights_input = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+ 	Input* vx_input      = element->GetInput(VxEnum);                                 _assert_(vx_input);
+-	Input* vy_input      = element->GetInput(VyEnum);                                 _assert_(vy_input);
+ 	Input* vxobs_input   = element->GetInput(InversionVxObsEnum);                     _assert_(vxobs_input);
+-	Input* vyobs_input   = element->GetInput(InversionVyObsEnum);                     _assert_(vyobs_input);
++	Input* vy_input=NULL;
++	Input* vyobs_input=NULL;
++	if (domaintype!=Domain2DverticalEnum) {
++		Input* vy_input      = element->GetInput(VyEnum);                                 _assert_(vy_input);
++		Input* vyobs_input   = element->GetInput(InversionVyObsEnum);                     _assert_(vyobs_input);
++	}
+ 	IssmDouble epsvel  = 2.220446049250313e-16;
+ 	IssmDouble meanvel = 3.170979198376458e-05; /*1000 m/yr*/
+ 
+@@ -388,9 +392,11 @@
+ 		element->NodalFunctionsVelocity(vbasis,gauss);
+ 
+ 		vx_input->GetInputValue(&vx,gauss);
+-		vy_input->GetInputValue(&vy,gauss);
+ 		vxobs_input->GetInputValue(&vxobs,gauss);
+-		vyobs_input->GetInputValue(&vyobs,gauss);
++		if (domaintype!=Domain2DverticalEnum) {
++			vy_input->GetInputValue(&vy,gauss);
++			vyobs_input->GetInputValue(&vyobs,gauss);
++		}
+ 
+ 		/*Loop over all requested responses*/
+ 		for(int resp=0;resp<num_responses;resp++){
+@@ -408,12 +414,16 @@
+ 					 *        du     obs
+ 					 */
+ 					for(i=0;i<vnumnodes;i++){
+-						dux=vxobs-vx;
+-						pe->values[i*dim+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 
+-						if(dim==3){
++						if(domaintype!=Domain2DverticalEnum){
++							dux=vxobs-vx;
++							pe->values[i*3+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 
+ 							duy=vyobs-vy;
+-							pe->values[i*dim+1]+=duy*weight*Jdet*gauss->weight*vbasis[i]; 
++							pe->values[i*3+1]+=duy*weight*Jdet*gauss->weight*vbasis[i]; 
+ 						}
++						else{
++							dux=vxobs-vx;
++							pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 
++						}
+ 					}
+ 					break;
+ 				case SurfaceRelVelMisfitEnum:
+@@ -429,12 +439,20 @@
+ 					 *               obs
+ 					 */
+ 					for(i=0;i<vnumnodes;i++){
+-						scalex=pow(meanvel/(vxobs+epsvel),2); if(vxobs==0)scalex=0;
+-						scaley=pow(meanvel/(vyobs+epsvel),2); if(vyobs==0)scaley=0;
+-						dux=scalex*(vxobs-vx);
+-						duy=scaley*(vyobs-vy);
+-						pe->values[i*dim+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 
+-						pe->values[i*dim+1]+=duy*weight*Jdet*gauss->weight*vbasis[i]; 
++						if(domaintype!=Domain2DverticalEnum){
++							scalex=pow(meanvel/(vxobs+epsvel),2); if(vxobs==0)scalex=0;
++							scaley=pow(meanvel/(vyobs+epsvel),2); if(vyobs==0)scaley=0;
++							dux=scalex*(vxobs-vx);
++							duy=scaley*(vyobs-vy);
++							pe->values[i*3+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 
++							pe->values[i*3+1]+=duy*weight*Jdet*gauss->weight*vbasis[i]; 
++						}
++						else{
++							scalex=pow(meanvel/(vxobs+epsvel),2); if(vxobs==0)scalex=0;
++							dux=scalex*(vxobs-vx);
++							pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 
++							pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*vbasis[i]; 
++						}
+ 					}
+ 					break;
+ 				case SurfaceLogVelMisfitEnum:
+@@ -450,21 +468,21 @@
+ 					 *            
+ 					 */
+ 					for(i=0;i<vnumnodes;i++){
+-						if(dim==3){
++						if(domaintype!=Domain2DverticalEnum){
+ 							velocity_mag    =sqrt(vx*vx+vy*vy)+epsvel;
+ 							obs_velocity_mag=sqrt(vxobs*vxobs+vyobs*vyobs)+epsvel;
+ 							scale=-8.*meanvel*meanvel/(velocity_mag*velocity_mag)*log(velocity_mag/obs_velocity_mag);
+ 							dux=scale*vx;
+ 							duy=scale*vy;
+-							pe->values[i*dim+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 
+-							pe->values[i*dim+1]+=duy*weight*Jdet*gauss->weight*vbasis[i]; 
++							pe->values[i*3+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 
++							pe->values[i*3+1]+=duy*weight*Jdet*gauss->weight*vbasis[i]; 
+ 						}
+ 						else{
+ 							velocity_mag    =fabs(vx)+epsvel;
+ 							obs_velocity_mag=fabs(vxobs)+epsvel;
+ 							scale=-8.*meanvel*meanvel/(velocity_mag*velocity_mag)*log(velocity_mag/obs_velocity_mag);
+ 							dux=scale*vx;
+-							pe->values[i*dim+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 
++							pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 
+ 						}
+ 					}
+ 					break;
+@@ -479,11 +497,18 @@
+ 					 *        du      S  2 sqrt(...)           obs
+ 					 */
+ 					for(i=0;i<vnumnodes;i++){
+-						scale=1./(S*2*sqrt(pow(vx-vxobs,2)+pow(vy-vyobs,2))+epsvel);
+-						dux=scale*(vxobs-vx);
+-						duy=scale*(vyobs-vy);
+-						pe->values[i*dim+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 
+-						pe->values[i*dim+1]+=duy*weight*Jdet*gauss->weight*vbasis[i]; 
++						if (domaintype!=Domain2DverticalEnum){
++							scale=1./(S*2*sqrt(pow(vx-vxobs,2)+pow(vy-vyobs,2))+epsvel);
++							dux=scale*(vxobs-vx);
++							duy=scale*(vyobs-vy);
++							pe->values[i*3+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 
++							pe->values[i*3+1]+=duy*weight*Jdet*gauss->weight*vbasis[i]; 
++						}
++						else{
++							scale=1./(S*2*fabs(vx-vxobs)+epsvel);
++							dux=scale*(vxobs-vx);
++							pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 
++						}
+ 					}
+ 					break;
+ 				case SurfaceLogVxVyMisfitEnum:
+@@ -497,10 +522,16 @@
+ 					 *        du                         |u| + eps  |u|                           u + eps
+ 					 */
+ 					for(i=0;i<vnumnodes;i++){
+-						dux = - meanvel*meanvel * log((fabs(vx)+epsvel)/(fabs(vxobs)+epsvel)) / (vx+epsvel);
+-						duy = - meanvel*meanvel * log((fabs(vy)+epsvel)/(fabs(vyobs)+epsvel)) / (vy+epsvel);
+-						pe->values[i*dim+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 
+-						pe->values[i*dim+1]+=duy*weight*Jdet*gauss->weight*vbasis[i]; 
++						if(domaintype!=Domain2DverticalEnum){
++							dux = - meanvel*meanvel * log((fabs(vx)+epsvel)/(fabs(vxobs)+epsvel)) / (vx+epsvel);
++							duy = - meanvel*meanvel * log((fabs(vy)+epsvel)/(fabs(vyobs)+epsvel)) / (vy+epsvel);
++							pe->values[i*3+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 
++							pe->values[i*3+1]+=duy*weight*Jdet*gauss->weight*vbasis[i]; 
++						}
++						else{
++							dux = - meanvel*meanvel * log((fabs(vx)+epsvel)/(fabs(vxobs)+epsvel)) / (vx+epsvel);
++							pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 
++						}
+ 					}
+ 					break;
+ 				case DragCoefficientAbsGradientEnum:
+@@ -541,13 +572,16 @@
+ 	if(!element->IsOnSurface()) return NULL;
+ 
+ 	/*Intermediaries */
+-	int        num_responses,i;
++	int        num_responses,i,domaintype;
+ 	IssmDouble Jdet,obs_velocity_mag,velocity_mag;
+ 	IssmDouble vx,vy,vxobs,vyobs,dux,duy,weight;
+ 	IssmDouble scalex,scaley,scale,S;
+ 	int        *responses    = NULL;
+ 	IssmDouble *xyz_list_top = NULL;
+ 
++	/* Get domaintype*/
++	element->FindParam(&domaintype,DomainTypeEnum);
++
+ 	/*Fetch number of nodes and dof for this finite element*/
+ 	int numnodes = element->GetNumberOfNodes();
+ 
+@@ -561,9 +595,13 @@
+ 	element->FindParam(&responses,NULL,InversionCostFunctionsEnum);
+ 	Input* weights_input = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+ 	Input* vx_input      = element->GetInput(VxEnum);                                 _assert_(vx_input);
+-	Input* vy_input      = element->GetInput(VyEnum);                                 _assert_(vy_input);
+ 	Input* vxobs_input   = element->GetInput(InversionVxObsEnum);                     _assert_(vxobs_input);
+-	Input* vyobs_input   = element->GetInput(InversionVyObsEnum);                     _assert_(vyobs_input);
++	Input* vy_input=NULL;
++	Input* vyobs_input=NULL;
++	if(domaintype!=Domain2DverticalEnum){
++		vy_input      = element->GetInput(VyEnum);                                 _assert_(vy_input);
++		vyobs_input   = element->GetInput(InversionVyObsEnum);                     _assert_(vyobs_input);
++	}
+ 	IssmDouble epsvel  = 2.220446049250313e-16;
+ 	IssmDouble meanvel = 3.170979198376458e-05; /*1000 m/yr*/
+ 
+@@ -583,10 +621,11 @@
+ 		element->NodalFunctions(basis, gauss);
+ 
+ 		vx_input->GetInputValue(&vx,gauss);
+-		vy_input->GetInputValue(&vy,gauss);
+ 		vxobs_input->GetInputValue(&vxobs,gauss);
+-		vyobs_input->GetInputValue(&vyobs,gauss);
+-
++		if(domaintype!=Domain2DverticalEnum){
++			vy_input->GetInputValue(&vy,gauss);
++			vyobs_input->GetInputValue(&vyobs,gauss);
++		}
+ 		/*Loop over all requested responses*/
+ 		for(int resp=0;resp<num_responses;resp++){
+ 			weights_input->GetInputValue(&weight,gauss,responses[resp]);
+@@ -603,10 +642,16 @@
+ 					 *        du     obs
+ 					 */
+ 					for(i=0;i<numnodes;i++){
+-						dux=vxobs-vx;
+-						duy=vyobs-vy;
+-						pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
+-						pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						if(domaintype!=Domain2DverticalEnum){
++							dux=vxobs-vx;
++							duy=vyobs-vy;
++							pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++							pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						}
++						else{ 
++							dux=vxobs-vx;
++							pe->values[i]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++						}
+ 					}
+ 					break;
+ 				case SurfaceRelVelMisfitEnum:
+@@ -622,12 +667,19 @@
+ 					 *               obs
+ 					 */
+ 					for(i=0;i<numnodes;i++){
+-						scalex=pow(meanvel/(vxobs+epsvel),2); if(vxobs==0)scalex=0;
+-						scaley=pow(meanvel/(vyobs+epsvel),2); if(vyobs==0)scaley=0;
+-						dux=scalex*(vxobs-vx);
+-						duy=scaley*(vyobs-vy);
+-						pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
+-						pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						if(domaintype!=Domain2DverticalEnum){
++							scalex=pow(meanvel/(vxobs+epsvel),2); if(vxobs==0)scalex=0;
++							scaley=pow(meanvel/(vyobs+epsvel),2); if(vyobs==0)scaley=0;
++							dux=scalex*(vxobs-vx);
++							duy=scaley*(vyobs-vy);
++							pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++							pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						}
++						else{
++							scalex=pow(meanvel/(vxobs+epsvel),2); if(vxobs==0)scalex=0;
++							dux=scalex*(vxobs-vx);
++							pe->values[i]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++						}
+ 					}
+ 					break;
+ 				case SurfaceLogVelMisfitEnum:
+@@ -643,13 +695,22 @@
+ 					 *            
+ 					 */
+ 					for(i=0;i<numnodes;i++){
+-						velocity_mag    =sqrt(pow(vx,   2)+pow(vy,   2))+epsvel;
+-						obs_velocity_mag=sqrt(pow(vxobs,2)+pow(vyobs,2))+epsvel;
+-						scale=-8*pow(meanvel,2)/pow(velocity_mag,2)*log(velocity_mag/obs_velocity_mag);
+-						dux=scale*vx;
+-						duy=scale*vy;
+-						pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
+-						pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						if(domaintype!=Domain2DverticalEnum){
++							velocity_mag    =sqrt(pow(vx,   2)+pow(vy,   2))+epsvel;
++							obs_velocity_mag=sqrt(pow(vxobs,2)+pow(vyobs,2))+epsvel;
++							scale=-8*pow(meanvel,2)/pow(velocity_mag,2)*log(velocity_mag/obs_velocity_mag);
++							dux=scale*vx;
++							duy=scale*vy;
++							pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++							pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						}
++						else{
++							velocity_mag    =fabs(vx)+epsvel;
++							obs_velocity_mag=fabs(vxobs)+epsvel;
++							scale=-8*pow(meanvel,2)/pow(velocity_mag,2)*log(velocity_mag/obs_velocity_mag);
++							dux=scale*vx;
++							pe->values[i]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++						}
+ 					}
+ 					break;
+ 				case SurfaceAverageVelMisfitEnum:
+@@ -663,11 +724,18 @@
+ 					 *        du      S  2 sqrt(...)           obs
+ 					 */
+ 					for(i=0;i<numnodes;i++){
+-						scale=1./(S*2*sqrt(pow(vx-vxobs,2)+pow(vy-vyobs,2))+epsvel);
+-						dux=scale*(vxobs-vx);
+-						duy=scale*(vyobs-vy);
+-						pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
+-						pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						if(domaintype!=Domain2DverticalEnum){
++							scale=1./(S*2*sqrt(pow(vx-vxobs,2)+pow(vy-vyobs,2))+epsvel);
++							dux=scale*(vxobs-vx);
++							duy=scale*(vyobs-vy);
++							pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++							pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						}
++						else{
++							scale=1./(S*2*fabs(vx-vxobs)+epsvel);
++							dux=scale*(vxobs-vx);
++							pe->values[i]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++						}
+ 					}
+ 					break;
+ 				case SurfaceLogVxVyMisfitEnum:
+@@ -681,10 +749,16 @@
+ 					 *        du                         |u| + eps  |u|                           u + eps
+ 					 */
+ 					for(i=0;i<numnodes;i++){
+-						dux = - meanvel*meanvel * log((fabs(vx)+epsvel)/(fabs(vxobs)+epsvel)) / (vx+epsvel);
+-						duy = - meanvel*meanvel * log((fabs(vy)+epsvel)/(fabs(vyobs)+epsvel)) / (vy+epsvel);
+-						pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
+-						pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						if(domaintype!=Domain2DverticalEnum){
++							dux = - meanvel*meanvel * log((fabs(vx)+epsvel)/(fabs(vxobs)+epsvel)) / (vx+epsvel);
++							duy = - meanvel*meanvel * log((fabs(vy)+epsvel)/(fabs(vyobs)+epsvel)) / (vy+epsvel);
++							pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++							pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						}
++						else{
++							dux = - meanvel*meanvel * log((fabs(vx)+epsvel)/(fabs(vxobs)+epsvel)) / (vx+epsvel);
++							pe->values[i]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++						}
+ 					}
+ 					break;
+ 				case DragCoefficientAbsGradientEnum:
+@@ -702,6 +776,9 @@
+ 				case RheologyBbarAbsGradientEnum:
+ 					/*Nothing in P vector*/
+ 					break;
++				case RheologyBAbsGradientEnum:
++					/*Nothing in P vector*/
++					break;
+ 				default:
+ 					_error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
+ 			}
+@@ -709,7 +786,7 @@
+ 	}
+ 
+ 	/*Transform coordinate system*/
+-	element->TransformLoadVectorCoord(pe,XYEnum);
++	if(domaintype!=Domain2DverticalEnum) element->TransformLoadVectorCoord(pe,XYEnum);
+ 
+ 	/*Clean up and return*/
+ 	xDelete<int>(responses);
+@@ -731,6 +808,10 @@
+ 		case Domain2DhorizontalEnum:
+ 			basalelement = element;
+ 			break;
++		case Domain2DverticalEnum:
++			if(!element->IsOnBase()) return NULL;
++			basalelement = element->SpawnBasalElement();
++			break;
+ 		case Domain3DEnum:
+ 			if(!element->IsOnBase()) return NULL;
+ 			basalelement = element->SpawnBasalElement();
+@@ -759,9 +840,13 @@
+ 	basalelement->FindParam(&responses,NULL,InversionCostFunctionsEnum);
+ 	Input* weights_input = basalelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+ 	Input* vx_input      = basalelement->GetInput(VxEnum);                                 _assert_(vx_input);
+-	Input* vy_input      = basalelement->GetInput(VyEnum);                                 _assert_(vy_input);
+ 	Input* vxobs_input   = basalelement->GetInput(InversionVxObsEnum);                     _assert_(vxobs_input);
+-	Input* vyobs_input   = basalelement->GetInput(InversionVyObsEnum);                     _assert_(vyobs_input);
++	Input* vy_input=NULL;
++	Input* vyobs_input=NULL;
++	if(domaintype!=Domain2DverticalEnum){
++		vy_input      = basalelement->GetInput(VyEnum);                                 _assert_(vy_input);
++		vyobs_input   = basalelement->GetInput(InversionVyObsEnum);                     _assert_(vyobs_input);
++	}
+ 	IssmDouble epsvel  = 2.220446049250313e-16;
+ 	IssmDouble meanvel = 3.170979198376458e-05; /*1000 m/yr*/
+ 
+@@ -781,10 +866,11 @@
+ 		basalelement->NodalFunctions(basis, gauss);
+ 
+ 		vx_input->GetInputValue(&vx,gauss);
+-		vy_input->GetInputValue(&vy,gauss);
+ 		vxobs_input->GetInputValue(&vxobs,gauss);
+-		vyobs_input->GetInputValue(&vyobs,gauss);
+-
++		if(domaintype!=Domain2DverticalEnum){
++			vy_input->GetInputValue(&vy,gauss);
++			vyobs_input->GetInputValue(&vyobs,gauss);
++		}
+ 		/*Loop over all requested responses*/
+ 		for(int resp=0;resp<num_responses;resp++){
+ 			weights_input->GetInputValue(&weight,gauss,responses[resp]);
+@@ -801,10 +887,16 @@
+ 					 *        du     obs
+ 					 */
+ 					for(i=0;i<numnodes;i++){
+-						dux=vxobs-vx;
+-						duy=vyobs-vy;
+-						pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
+-						pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						if(domaintype!=Domain2DverticalEnum){
++							dux=vxobs-vx;
++							duy=vyobs-vy;
++							pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++							pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						}
++						else {
++							dux=vxobs-vx;
++							pe->values[i]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++						}
+ 					}
+ 					break;
+ 				case SurfaceRelVelMisfitEnum:
+@@ -820,12 +912,19 @@
+ 					 *               obs
+ 					 */
+ 					for(i=0;i<numnodes;i++){
+-						scalex=pow(meanvel/(vxobs+epsvel),2); if(vxobs==0)scalex=0;
+-						scaley=pow(meanvel/(vyobs+epsvel),2); if(vyobs==0)scaley=0;
+-						dux=scalex*(vxobs-vx);
+-						duy=scaley*(vyobs-vy);
+-						pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
+-						pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						if(domaintype!=Domain2DverticalEnum){
++							scalex=pow(meanvel/(vxobs+epsvel),2); if(vxobs==0)scalex=0;
++							scaley=pow(meanvel/(vyobs+epsvel),2); if(vyobs==0)scaley=0;
++							dux=scalex*(vxobs-vx);
++							duy=scaley*(vyobs-vy);
++							pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++							pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						}
++						else{
++							scalex=pow(meanvel/(vxobs+epsvel),2); if(vxobs==0)scalex=0;
++							dux=scalex*(vxobs-vx);
++							pe->values[i]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++						}
+ 					}
+ 					break;
+ 				case SurfaceLogVelMisfitEnum:
+@@ -841,13 +940,22 @@
+ 					 *            
+ 					 */
+ 					for(i=0;i<numnodes;i++){
+-						velocity_mag    =sqrt(pow(vx,   2)+pow(vy,   2))+epsvel;
+-						obs_velocity_mag=sqrt(pow(vxobs,2)+pow(vyobs,2))+epsvel;
+-						scale=-8*pow(meanvel,2)/pow(velocity_mag,2)*log(velocity_mag/obs_velocity_mag);
+-						dux=scale*vx;
+-						duy=scale*vy;
+-						pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
+-						pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						if(domaintype!=Domain2DverticalEnum){
++							velocity_mag    =sqrt(pow(vx,   2)+pow(vy,   2))+epsvel;
++							obs_velocity_mag=sqrt(pow(vxobs,2)+pow(vyobs,2))+epsvel;
++							scale=-8*pow(meanvel,2)/pow(velocity_mag,2)*log(velocity_mag/obs_velocity_mag);
++							dux=scale*vx;
++							duy=scale*vy;
++							pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++							pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						}
++						else{
++							velocity_mag    =fabs(vx)+epsvel;
++							obs_velocity_mag=fabs(vxobs)+epsvel;
++							scale=-8*pow(meanvel,2)/pow(velocity_mag,2)*log(velocity_mag/obs_velocity_mag);
++							dux=scale*vx;
++							pe->values[i]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++						}
+ 					}
+ 					break;
+ 				case SurfaceAverageVelMisfitEnum:
+@@ -861,11 +969,18 @@
+ 					 *        du      S  2 sqrt(...)           obs
+ 					 */
+ 					for(i=0;i<numnodes;i++){
+-						scale=1./(S*2*sqrt(pow(vx-vxobs,2)+pow(vy-vyobs,2))+epsvel);
+-						dux=scale*(vxobs-vx);
+-						duy=scale*(vyobs-vy);
+-						pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
+-						pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						if(domaintype!=Domain2DverticalEnum){
++							scale=1./(S*2*sqrt(pow(vx-vxobs,2)+pow(vy-vyobs,2))+epsvel);
++							dux=scale*(vxobs-vx);
++							duy=scale*(vyobs-vy);
++							pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++							pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						}
++						else{
++							scale=1./(S*2*fabs(vx-vxobs)+epsvel);
++							dux=scale*(vxobs-vx);
++							pe->values[i]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++						}
+ 					}
+ 					break;
+ 				case SurfaceLogVxVyMisfitEnum:
+@@ -879,10 +994,16 @@
+ 					 *        du                         |u| + eps  |u|                           u + eps
+ 					 */
+ 					for(i=0;i<numnodes;i++){
+-						dux = - meanvel*meanvel * log((fabs(vx)+epsvel)/(fabs(vxobs)+epsvel)) / (vx+epsvel);
+-						duy = - meanvel*meanvel * log((fabs(vy)+epsvel)/(fabs(vyobs)+epsvel)) / (vy+epsvel);
+-						pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
+-						pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						if(domaintype!=Domain2DverticalEnum){
++							dux = - meanvel*meanvel * log((fabs(vx)+epsvel)/(fabs(vxobs)+epsvel)) / (vx+epsvel);
++							duy = - meanvel*meanvel * log((fabs(vy)+epsvel)/(fabs(vyobs)+epsvel)) / (vy+epsvel);
++							pe->values[i*2+0]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++							pe->values[i*2+1]+=duy*weight*Jdet*gauss->weight*basis[i]; 
++						}
++						else{
++							dux = - meanvel*meanvel * log((fabs(vx)+epsvel)/(fabs(vxobs)+epsvel)) / (vx+epsvel);
++							pe->values[i]+=dux*weight*Jdet*gauss->weight*basis[i]; 
++						}
+ 					}
+ 					break;
+ 				case DragCoefficientAbsGradientEnum:
+@@ -900,6 +1021,9 @@
+ 				case RheologyBbarAbsGradientEnum:
+ 					/*Nothing in P vector*/
+ 					break;
++				case RheologyBAbsGradientEnum:
++					/*Nothing in P vector*/
++					break;
+ 				default:
+ 					_error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
+ 			}
+@@ -907,7 +1031,7 @@
+ 	}
+ 
+ 	/*Transform coordinate system*/
+-	basalelement->TransformLoadVectorCoord(pe,XYEnum);
++	if(domaintype!=Domain2DverticalEnum)	basalelement->TransformLoadVectorCoord(pe,XYEnum);
+ 
+ 	/*Clean up and return*/
+ 	xDelete<int>(responses);
+@@ -950,7 +1074,8 @@
+ 	/*Check that control_type is supported*/
+ 	if(control_type!=MaterialsRheologyBbarEnum && 
+ 		control_type!=FrictionCoefficientEnum   && 
+-		control_type!=DamageDbarEnum){
++		control_type!=DamageDbarEnum            &&
++		control_type!=MaterialsRheologyBEnum){
+ 		_error_("Control "<<EnumToStringx(control_type)<<" not supported");
+ 	}
+ 
+@@ -962,7 +1087,8 @@
+ 		case SurfaceLogVxVyMisfitEnum:    /*Nothing, \partial J/\partial k = 0*/ break;
+ 		case SurfaceAverageVelMisfitEnum: /*Nothing, \partial J/\partial k = 0*/ break;
+ 		case DragCoefficientAbsGradientEnum: GradientJDragGradient(element,gradient,control_index); break;
+-		case RheologyBbarAbsGradientEnum:    GradientJBGradient(element,gradient,control_index);    break;
++		case RheologyBbarAbsGradientEnum:    GradientJBbarGradient(element,gradient,control_index); break;
++		case RheologyBAbsGradientEnum:       GradientJBGradient(element,gradient,control_index);    break;
+ 		default: _error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
+ 	}
+ 
+@@ -988,6 +1114,15 @@
+ 				default: _error_("approximation " << EnumToStringx(approximation) << " not supported yet");
+ 			}
+ 			break;
++		case MaterialsRheologyBEnum:
++			switch(approximation){
++				case SSAApproximationEnum: GradientJBSSA(element,gradient,control_index); break;
++				case HOApproximationEnum:  GradientJBHO( element,gradient,control_index); break;
++				case FSApproximationEnum:  GradientJBFS( element,gradient,control_index); break;
++				case NoneApproximationEnum: /*Gradient is 0*/                    break;
++				default: _error_("approximation " << EnumToStringx(approximation) << " not supported yet");
++			}
++			break;
+ 		case DamageDbarEnum:
+ 			switch(approximation){
+ 				case SSAApproximationEnum: GradientJDSSA(element,gradient,control_index); break;
+@@ -1084,10 +1219,10 @@
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 
+ }/*}}}*/
+-void AdjointHorizAnalysis::GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++void AdjointHorizAnalysis::GradientJBbarGradient(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+ 	/*Intermediaries*/
+-	int      domaintype,dim;
++	int      domaintype;
+ 	Element* basalelement;
+ 
+ 	/*Get basal element*/
+@@ -1095,17 +1230,14 @@
+ 	switch(domaintype){
+ 		case Domain2DhorizontalEnum:
+ 			basalelement = element;
+-			dim          = 2;
+ 			break;
+ 		case Domain2DverticalEnum:
+ 			if(!element->IsOnBase()) return;
+ 			basalelement = element->SpawnBasalElement();
+-			dim          = 1;
+ 			break;
+ 		case Domain3DEnum:
+ 			if(!element->IsOnBase()) return;
+ 			basalelement = element->SpawnBasalElement();
+-			dim          = 2;
+ 			break;
+ 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+ 	}
+@@ -1143,7 +1275,7 @@
+ 
+ 		/*Build gradje_g_gaussian vector (actually -dJ/ddrag): */
+ 		for(int i=0;i<numvertices;i++){
+-			if(dim==2){
++			if(domaintype!=Domain2DverticalEnum){
+ 				ge[i]+=-weight*Jdet*gauss->weight*(dbasis[0*numvertices+i]*dk[0]+dbasis[1*numvertices+i]*dk[1]);
+ 			}
+ 			else{
+@@ -1162,6 +1294,72 @@
+ 	delete gauss;
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ }/*}}}*/
++void AdjointHorizAnalysis::GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++
++	/*Intermediaries*/
++	int      domaintype;
++
++	/*Get basal element*/
++	element->FindParam(&domaintype,DomainTypeEnum);
++	switch(domaintype){
++		case Domain2DhorizontalEnum:
++			break;
++		case Domain2DverticalEnum:
++			break;
++		case Domain3DEnum:
++			break;
++		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
++	}
++
++	/*Intermediaries*/
++	IssmDouble Jdet,weight;
++	IssmDouble dk[3]; 
++	IssmDouble *xyz_list= NULL;
++
++	/*Fetch number of vertices for this finite element*/
++	int numvertices = element->GetNumberOfVertices();
++
++	/*Initialize some vectors*/
++	IssmDouble* dbasis        = xNew<IssmDouble>(3*numvertices);
++	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
++	int*        vertexpidlist = xNew<int>(numvertices);
++
++	/*Retrieve all inputs we will be needing: */
++	element->GetVerticesCoordinates(&xyz_list);
++	element->GradientIndexing(&vertexpidlist[0],control_index);
++	Input* rheology_input = element->GetInput(MaterialsRheologyBEnum);              _assert_(rheology_input);
++	Input* weights_input   = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGauss(2);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		element->NodalFunctionsP1Derivatives(dbasis,xyz_list,gauss);
++		weights_input->GetInputValue(&weight,gauss,RheologyBAbsGradientEnum);
++
++		/*Build alpha_complement_list: */
++		rheology_input->GetInputDerivativeValue(&dk[0],xyz_list,gauss);
++
++		/*Build gradje_g_gaussian vector (actually -dJ/ddrag): */
++		for(int i=0;i<numvertices;i++){
++			if(domaintype!=Domain2DverticalEnum){
++				ge[i]+=-weight*Jdet*gauss->weight*(dbasis[0*numvertices+i]*dk[0]+dbasis[1*numvertices+i]*dk[1]);
++			}
++			else{
++				ge[i]+=-weight*Jdet*gauss->weight*(dbasis[0*numvertices+i]*dk[0]+dbasis[1*numvertices+i]*dk[1]+dbasis[2*numvertices+i]*dk[2]);
++			}
++			_assert_(!xIsNan<IssmDouble>(ge[i]));
++		}
++	}
++	gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(dbasis);
++	xDelete<IssmDouble>(ge);
++	xDelete<int>(vertexpidlist);
++	delete gauss;
++}/*}}}*/
+ void AdjointHorizAnalysis::GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+ 	/*return if floating (gradient is 0)*/
+@@ -1262,12 +1460,13 @@
+ 	if(!element->IsOnBase()) return;
+ 
+ 	/*Intermediaries*/
+-	int        dim=3;
+ 	IssmDouble Jdet,weight;
+ 	IssmDouble drag,dalpha2dk;
+ 	IssmDouble vx,vy,lambda,mu;
+ 	IssmDouble *xyz_list_base= NULL;
+ 
++	int      domaintype,dim;
++	element->FindParam(&domaintype,DomainTypeEnum);
+ 	/*Fetch number of vertices for this finite element*/
+ 	int numvertices = element->GetNumberOfVertices();
+ 
+@@ -1277,26 +1476,33 @@
+ 	int*        vertexpidlist = xNew<int>(numvertices);
+ 
+ 	/*Build friction element, needed later: */
++	if(domaintype!=Domain2DverticalEnum) dim=3;
++	else dim=2;
+ 	Friction* friction=new Friction(element,dim);
+ 
+ 	/*Retrieve all inputs we will be needing: */
+ 	element->GetVerticesCoordinatesBase(&xyz_list_base);
+ 	element->GradientIndexing(&vertexpidlist[0],control_index);
+ 	Input* vx_input        = element->GetInput(VxEnum);                   _assert_(vx_input);
+-	Input* vy_input        = element->GetInput(VyEnum);                   _assert_(vy_input);
++	Input* vy_input        = NULL;
+ 	Input* adjointx_input  = element->GetInput(AdjointxEnum);             _assert_(adjointx_input);
+-	Input* adjointy_input  = element->GetInput(AdjointyEnum);             _assert_(adjointy_input);
++	Input* adjointy_input  = NULL;
+ 	Input* dragcoeff_input = element->GetInput(FrictionCoefficientEnum);  _assert_(dragcoeff_input);
+-
++	if(domaintype!=Domain2DverticalEnum){
++		vy_input        = element->GetInput(VyEnum);                   _assert_(vy_input);
++		adjointy_input  = element->GetInput(AdjointyEnum);             _assert_(adjointy_input);
++	}
+ 	/* Start  looping on the number of gaussian points: */
+ 	Gauss* gauss=element->NewGaussBase(4);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 		gauss->GaussPoint(ig);
+ 
+ 		adjointx_input->GetInputValue(&lambda, gauss);
+-		adjointy_input->GetInputValue(&mu, gauss);
+ 		vx_input->GetInputValue(&vx,gauss);
+-		vy_input->GetInputValue(&vy,gauss);
++		if(domaintype!=Domain2DverticalEnum){
++			adjointy_input->GetInputValue(&mu, gauss);
++			vy_input->GetInputValue(&vy,gauss);
++		}
+ 		dragcoeff_input->GetInputValue(&drag, gauss);
+ 
+ 		friction->GetAlphaComplement(&dalpha2dk,gauss);
+@@ -1306,7 +1512,8 @@
+ 
+ 		/*Build gradient vector (actually -dJ/dD): */
+ 		for(int i=0;i<numvertices;i++){
+-			ge[i]+=-2.*drag*dalpha2dk*((lambda*vx+mu*vy))*Jdet*gauss->weight*basis[i];
++			if(domaintype!=Domain2DverticalEnum) ge[i]+=-2.*drag*dalpha2dk*((lambda*vx+mu*vy))*Jdet*gauss->weight*basis[i];
++			else ge[i]+=-2.*drag*dalpha2dk*(lambda*vx)*Jdet*gauss->weight*basis[i];
+ 			_assert_(!xIsNan<IssmDouble>(ge[i]));
+ 		}
+ 	}
+@@ -1327,7 +1534,7 @@
+ 	if(!element->IsOnBase()) return;
+ 
+ 	/*Intermediaries*/
+-	int        dim=3;
++	int        domaintype,dim;
+ 	IssmDouble Jdet,weight;
+ 	IssmDouble drag,dalpha2dk,normal[3];
+ 	IssmDouble vx,vy,vz,lambda,mu,xi;
+@@ -1341,7 +1548,12 @@
+ 	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
+ 	int*        vertexpidlist = xNew<int>(numvertices);
+ 
++	/* get domaintype */
++	element->FindParam(&domaintype,DomainTypeEnum);
++
+ 	/*Build friction element, needed later: */
++	if(domaintype!=Domain2DverticalEnum) dim=3;
++	else dim=2;
+ 	Friction* friction=new Friction(element,dim);
+ 
+ 	/*Retrieve all inputs we will be needing: */
+@@ -1349,10 +1561,14 @@
+ 	element->GradientIndexing(&vertexpidlist[0],control_index);
+ 	Input* vx_input        = element->GetInput(VxEnum);                   _assert_(vx_input);
+ 	Input* vy_input        = element->GetInput(VyEnum);                   _assert_(vy_input);
+-	Input* vz_input        = element->GetInput(VzEnum);                   _assert_(vy_input);
+ 	Input* adjointx_input  = element->GetInput(AdjointxEnum);             _assert_(adjointx_input);
+ 	Input* adjointy_input  = element->GetInput(AdjointyEnum);             _assert_(adjointy_input);
+-	Input* adjointz_input  = element->GetInput(AdjointzEnum);             _assert_(adjointz_input);
++	Input* vz_input        = NULL;
++	Input* adjointz_input  = NULL;
++	if(domaintype!=Domain2DverticalEnum){
++		Input* vz_input        = element->GetInput(VzEnum);                   _assert_(vy_input);
++		Input* adjointz_input  = element->GetInput(AdjointzEnum);             _assert_(adjointz_input);
++	}
+ 	Input* dragcoeff_input = element->GetInput(FrictionCoefficientEnum);  _assert_(dragcoeff_input);
+ 
+ 	/* Start  looping on the number of gaussian points: */
+@@ -1362,10 +1578,12 @@
+ 
+ 		adjointx_input->GetInputValue(&lambda, gauss);
+ 		adjointy_input->GetInputValue(&mu, gauss);
+-		adjointz_input->GetInputValue(&xi    ,gauss);
+ 		vx_input->GetInputValue(&vx,gauss);
+ 		vy_input->GetInputValue(&vy,gauss);
+-		vz_input->GetInputValue(&vz,gauss);
++		if(domaintype!=Domain2DverticalEnum){
++			adjointz_input->GetInputValue(&xi    ,gauss);
++			vz_input->GetInputValue(&vz,gauss);
++		}
+ 		dragcoeff_input->GetInputValue(&drag, gauss);
+ 
+ 		friction->GetAlphaComplement(&dalpha2dk,gauss);
+@@ -1375,14 +1593,25 @@
+ 		element->NodalFunctionsP1(basis,gauss);
+ 
+ 		/*Build gradient vector (actually -dJ/dk): */
+-		for(int i=0;i<numvertices;i++){
+-			ge[i]+=(
+-						-lambda*(2*drag*dalpha2dk*(vx - vz*normal[0]*normal[2]))
+-						-mu    *(2*drag*dalpha2dk*(vy - vz*normal[1]*normal[2]))
+-						-xi    *(2*drag*dalpha2dk*(-vx*normal[0]*normal[2]-vy*normal[1]*normal[2]))
+-						)*Jdet*gauss->weight*basis[i];
+-			_assert_(!xIsNan<IssmDouble>(ge[i]));
++		if(domaintype!=Domain2DverticalEnum){
++			for(int i=0;i<numvertices;i++){
++				ge[i]+=(
++							-lambda*(2*drag*dalpha2dk*(vx - vz*normal[0]*normal[2]))
++							-mu    *(2*drag*dalpha2dk*(vy - vz*normal[1]*normal[2]))
++							-xi    *(2*drag*dalpha2dk*(-vx*normal[0]*normal[2]-vy*normal[1]*normal[2]))
++						 )*Jdet*gauss->weight*basis[i];
++				_assert_(!xIsNan<IssmDouble>(ge[i]));
++			}
+ 		}
++		else{
++			for(int i=0;i<numvertices;i++){
++				ge[i]+=(
++							-lambda*2*drag*dalpha2dk*vx
++							-mu    *2*drag*dalpha2dk*vy
++						 )*Jdet*gauss->weight*basis[i];
++				_assert_(!xIsNan<IssmDouble>(ge[i]));
++			}
++		}
+ 	}
+ 	gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
+ 
+@@ -1492,6 +1721,170 @@
+ 	/*WARNING: We use SSA as an estimate for now*/
+ 	this->GradientJBbarSSA(element,gradient,control_index);
+ }/*}}}*/
++void AdjointHorizAnalysis::GradientJBSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++
++	/*Intermediaries*/
++	int      domaintype,dim;
++	Element* basalelement;
++
++	/*Get basal element*/
++	element->FindParam(&domaintype,DomainTypeEnum);
++	switch(domaintype){
++		case Domain2DhorizontalEnum:
++			basalelement = element;
++			dim          = 2;
++			break;
++		case Domain2DverticalEnum:
++			if(!element->IsOnBase()) return;
++			basalelement = element->SpawnBasalElement();
++			dim          = 1;
++			break;
++		case Domain3DEnum:
++			if(!element->IsOnBase()) return;
++			basalelement = element->SpawnBasalElement();
++			dim          = 2;
++			break;
++		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
++	}
++
++	/*Intermediaries*/
++	IssmDouble Jdet,weight;
++	IssmDouble thickness,dmudB;
++	IssmDouble dvx[3],dvy[3],dadjx[3],dadjy[3]; 
++	IssmDouble *xyz_list= NULL;
++
++	/*Fetch number of vertices for this finite element*/
++	int numvertices = basalelement->GetNumberOfVertices();
++
++	/*Initialize some vectors*/
++	IssmDouble* basis         = xNew<IssmDouble>(numvertices);
++	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
++	int*        vertexpidlist = xNew<int>(numvertices);
++
++	/*Retrieve all inputs we will be needing: */
++	basalelement->GetVerticesCoordinates(&xyz_list);
++	basalelement->GradientIndexing(&vertexpidlist[0],control_index);
++	Input* thickness_input = basalelement->GetInput(ThicknessEnum);             _assert_(thickness_input);
++	Input* vx_input        = basalelement->GetInput(VxEnum);                    _assert_(vx_input);
++	Input* vy_input        = basalelement->GetInput(VyEnum);                    _assert_(vy_input);
++	Input* adjointx_input  = basalelement->GetInput(AdjointxEnum);              _assert_(adjointx_input);
++	Input* adjointy_input  = basalelement->GetInput(AdjointyEnum);              _assert_(adjointy_input);
++	Input* rheologyb_input = basalelement->GetInput(MaterialsRheologyBEnum); _assert_(rheologyb_input);
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=basalelement->NewGauss(4);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		thickness_input->GetInputValue(&thickness,gauss);
++		vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
++		vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
++		adjointx_input->GetInputDerivativeValue(&dadjx[0],xyz_list,gauss);
++		adjointy_input->GetInputDerivativeValue(&dadjy[0],xyz_list,gauss);
++
++		basalelement->dViscositydBSSA(&dmudB,dim,xyz_list,gauss,vx_input,vy_input);
++
++		basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		basalelement->NodalFunctionsP1(basis,gauss);
++
++		/*Build gradient vector (actually -dJ/dB): */
++		for(int i=0;i<numvertices;i++){
++			ge[i]+=-dmudB*thickness*(
++						(2*dvx[0]+dvy[1])*2*dadjx[0]+(dvx[1]+dvy[0])*(dadjx[1]+dadjy[0])+(2*dvy[1]+dvx[0])*2*dadjy[1]
++						)*Jdet*gauss->weight*basis[i];
++			_assert_(!xIsNan<IssmDouble>(ge[i]));
++		}
++	}
++	gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(basis);
++	xDelete<IssmDouble>(ge);
++	xDelete<int>(vertexpidlist);
++	delete gauss;
++	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
++}/*}}}*/
++void AdjointHorizAnalysis::GradientJBHO(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++	/*Intermediaries*/
++	int      domaintype,dim;
++
++	/*Get domaintype*/
++	element->FindParam(&domaintype,DomainTypeEnum);
++
++	/*Intermediaries*/
++	IssmDouble Jdet,weight;
++	IssmDouble thickness,dmudB;
++	IssmDouble dvx[3],dvy[3],dadjx[3],dadjy[3]; 
++	IssmDouble *xyz_list= NULL;
++
++	/*Fetch number of vertices for this finite element*/
++	int numvertices = element->GetNumberOfVertices();
++
++	/*Initialize some vectors*/
++	IssmDouble* basis         = xNew<IssmDouble>(numvertices);
++	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
++	int*        vertexpidlist = xNew<int>(numvertices);
++
++	/*Retrieve all inputs we will be needing: */
++	element->GetVerticesCoordinates(&xyz_list);
++	element->GradientIndexing(&vertexpidlist[0],control_index);
++	Input* thickness_input = element->GetInput(ThicknessEnum);             _assert_(thickness_input);
++	Input* vx_input        = element->GetInput(VxEnum);                    _assert_(vx_input);
++	Input* vy_input        = NULL;
++	Input* adjointx_input  = element->GetInput(AdjointxEnum);              _assert_(adjointx_input);
++	Input* adjointy_input  = NULL;
++	Input* rheologyb_input = element->GetInput(MaterialsRheologyBEnum); _assert_(rheologyb_input);
++	if(domaintype!=Domain2DverticalEnum){
++		vy_input        = element->GetInput(VyEnum);                   _assert_(vy_input);
++		adjointy_input  = element->GetInput(AdjointyEnum);             _assert_(adjointy_input);
++	}
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGauss(4);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		thickness_input->GetInputValue(&thickness,gauss);
++		vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
++		adjointx_input->GetInputDerivativeValue(&dadjx[0],xyz_list,gauss);
++		dim=2;
++		if(domaintype!=Domain2DverticalEnum){
++			adjointy_input->GetInputDerivativeValue(&dadjy[0],xyz_list, gauss);
++			vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
++			dim=3;
++		}
++
++		element->dViscositydBHO(&dmudB,dim,xyz_list,gauss,vx_input,vy_input);
++
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		element->NodalFunctionsP1(basis,gauss);
++
++		/*Build gradient vector (actually -dJ/dB): */
++		for(int i=0;i<numvertices;i++){
++			if(domaintype!=Domain2DverticalEnum){
++				ge[i]+=-dmudB*thickness*(
++							(2*dvx[0]+dvy[1])*2*dadjx[0]+(dvx[1]+dvy[0])*(dadjx[1]+dadjy[0])+(2*dvy[1]+dvx[0])*2*dadjy[1]
++							)*Jdet*gauss->weight*basis[i];
++			}
++			else{
++				ge[i]+=-dmudB*thickness*4*dvx[0]*dadjx[0]*Jdet*gauss->weight*basis[i];
++			}
++			_assert_(!xIsNan<IssmDouble>(ge[i]));
++		}
++	}
++	gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(basis);
++	xDelete<IssmDouble>(ge);
++	xDelete<int>(vertexpidlist);
++	delete gauss;
++}/*}}}*/
++void AdjointHorizAnalysis::GradientJBFS(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++	/*WARNING: We use HO as an estimate for now*/
++	this->GradientJBHO(element,gradient,control_index);
++}/*}}}*/
+ void AdjointHorizAnalysis::GradientJDSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+ 	/*Intermediaries*/
+@@ -1589,10 +1982,14 @@
+ 	int  i;
+ 	int* doflist=NULL;
+ 
++	int    domaintype;
++	element->FindParam(&domaintype,DomainTypeEnum);
++
+ 	/*Fetch number of nodes and dof for this finite element*/
+ 	int numnodes = element->GetNumberOfNodes();
+-	int numdof   = numnodes*2;
+-
++	int numdof;
++	if(domaintype!=Domain2DverticalEnum)  numdof   = numnodes*2;
++	else			                          numdof   = numnodes*1;
+ 	/*Fetch dof list and allocate solution vectors*/
+ 	element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
+ 	IssmDouble* values  = xNew<IssmDouble>(numdof);
+@@ -1603,16 +2000,18 @@
+ 	for(i=0;i<numdof;i++) values[i]=solution[doflist[i]];
+ 
+ 	/*Transform solution in Cartesian Space*/
+-	element->TransformSolutionCoord(&values[0],XYEnum);
++	if(domaintype!=Domain2DverticalEnum)	element->TransformSolutionCoord(&values[0],XYEnum);
+ 
+ 	/*Ok, we have vx and vy in values, fill in vx and vy arrays: */
+ 	for(i=0;i<numnodes;i++){
+-		lambdax[i]=values[i*NDOF2+0];
+-		lambday[i]=values[i*NDOF2+1];
+-
++		if(domaintype!=Domain2DverticalEnum){
++			lambdax[i]=values[i*NDOF2+0];
++			lambday[i]=values[i*NDOF2+1];
++		}
++		else {lambdax[i]=values[i];lambday[i]=0;}
+ 		/*Check solution*/
+ 		if(xIsNan<IssmDouble>(lambdax[i])) _error_("NaN found in solution vector");
+-		if(xIsNan<IssmDouble>(lambday[i])) _error_("NaN found in solution vector");
++		if(domaintype!=Domain2DverticalEnum && xIsNan<IssmDouble>(lambday[i])) _error_("NaN found in solution vector");
+ 	}
+ 
+ 	/*Add vx and vy as inputs to the tria element: */
+@@ -1626,13 +2025,27 @@
+ 	xDelete<int>(doflist);
+ }/*}}}*/
+ void AdjointHorizAnalysis::InputUpdateFromSolutionFS(IssmDouble* solution,Element* element){/*{{{*/
+-	int          i,dim;
++	int          i,fe_FS;
+ 	int*         vdoflist=NULL;
+ 	int*         pdoflist=NULL;
+ 	IssmDouble   FSreconditioning;
+ 
+-	element->FindParam(&dim,DomainDimensionEnum);
++	int      domaintype,dim;
++	element->FindParam(&domaintype,DomainTypeEnum);
++	switch(domaintype){
++		case Domain2DhorizontalEnum:
++			dim          = 3;
++			break;
++		case Domain2DverticalEnum:
++			dim          = 2;
++			break;
++		case Domain3DEnum:
++			dim          = 3;
++			break;
++		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
++	}
+ 
++
+ 	/*Fetch number of nodes and dof for this finite element*/
+ 	int vnumnodes = element->NumberofNodesVelocity();
+ 	int pnumnodes = element->NumberofNodesPressure();
+@@ -1664,9 +2077,11 @@
+ 
+ 	/*fill in all arrays: */
+ 	for(i=0;i<vnumnodes;i++){
+-		lambdax[i] = values[i*NDOF3+0]; if(xIsNan<IssmDouble>(lambdax[i])) _error_("NaN found in solution vector");
+-		lambday[i] = values[i*NDOF3+1]; if(xIsNan<IssmDouble>(lambday[i])) _error_("NaN found in solution vector");
+-		lambdaz[i] = values[i*NDOF3+2]; if(xIsNan<IssmDouble>(lambdaz[i])) _error_("NaN found in solution vector");
++		lambdax[i] = values[i*dim+0]; if(xIsNan<IssmDouble>(lambdax[i])) _error_("NaN found in solution vector");
++		lambday[i] = values[i*dim+1]; if(xIsNan<IssmDouble>(lambday[i])) _error_("NaN found in solution vector");
++		if(dim==3){
++			lambdaz[i] = values[i*dim+2]; if(xIsNan<IssmDouble>(lambdaz[i])) _error_("NaN found in solution vector");
++		}
+ 	}
+ 	for(i=0;i<pnumnodes;i++){
+ 		lambdap[i] = values[vnumdof+i]; if(xIsNan<IssmDouble>(lambdap[i])) _error_("NaN found in solution vector");
+@@ -1679,9 +2094,12 @@
+ 	/*Add vx and vy as inputs to the tria element: */
+ 	element->AddInput(AdjointxEnum,lambdax,element->VelocityInterpolation());
+ 	element->AddInput(AdjointyEnum,lambday,element->VelocityInterpolation());
+-	element->AddInput(AdjointzEnum,lambdaz,element->VelocityInterpolation());
+-	element->AddInput(AdjointpEnum,lambdap,element->PressureInterpolation());
++	if(domaintype!=Domain2DverticalEnum) element->AddInput(AdjointzEnum,lambdaz,element->VelocityInterpolation());
+ 
++	element->FindParam(&fe_FS,FlowequationFeFSEnum);
++	if(fe_FS!=LATaylorHoodEnum && fe_FS!=LACrouzeixRaviartEnum)	
++	 element->AddInput(AdjointpEnum,lambdap,element->PressureInterpolation());	
++
+ 	/*Free ressources:*/
+ 	xDelete<int>(vdoflist);
+ 	xDelete<int>(pdoflist);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18834-18835.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18834-18835.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18834-18835.diff	(revision 19102)
@@ -0,0 +1,22 @@
+Index: ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h	(revision 18834)
++++ ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h	(revision 18835)
+@@ -36,6 +36,7 @@
+ 		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+ 		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+ 		void GradientJDragGradient(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void GradientJBbarGradient(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void GradientJDragL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index);
+@@ -45,6 +46,9 @@
+ 		void GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void GradientJBbarFS(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void GradientJBSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void GradientJBHO(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void GradientJBFS(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void GradientJDSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+ 		void UpdateConstraints(FemModel* femmodel);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18835-18836.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18835-18836.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18835-18836.diff	(revision 19102)
@@ -0,0 +1,24 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18835)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18836)
+@@ -1232,6 +1232,7 @@
+ 				case ThicknessEnum:
+ 				case BalancethicknessOmegaEnum:
+ 				case FrictionCoefficientEnum:
++				case MaterialsRheologyBEnum:
+ 					if(iomodel->Data(control)){
+ 						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data(control)[tria_vertex_ids[j]-1];
+ 						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i];
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18835)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18836)
+@@ -1508,6 +1508,7 @@
+ 				/*No yts conversion*/
+ 				case ThicknessEnum:
+ 				case FrictionCoefficientEnum:
++				case MaterialsRheologyBEnum:
+ 					if(iomodel->Data(control)){
+ 						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data(control)[penta_vertex_ids[j]-1];
+ 						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i];
Index: /issm/oecreview/Archive/18296-19100/ISSM-18836-18837.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18836-18837.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18836-18837.diff	(revision 19102)
@@ -0,0 +1,30 @@
+Index: ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 18836)
++++ ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 18837)
+@@ -367,11 +367,11 @@
+ 	Input* weights_input = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+ 	Input* vx_input      = element->GetInput(VxEnum);                                 _assert_(vx_input);
+ 	Input* vxobs_input   = element->GetInput(InversionVxObsEnum);                     _assert_(vxobs_input);
+-	Input* vy_input=NULL;
+-	Input* vyobs_input=NULL;
+-	if (domaintype!=Domain2DverticalEnum) {
+-		Input* vy_input      = element->GetInput(VyEnum);                                 _assert_(vy_input);
+-		Input* vyobs_input   = element->GetInput(InversionVyObsEnum);                     _assert_(vyobs_input);
++	Input* vy_input    = NULL;
++	Input* vyobs_input = NULL;
++	if(domaintype!=Domain2DverticalEnum){
++		vy_input      = element->GetInput(VyEnum);                                 _assert_(vy_input);
++		vyobs_input   = element->GetInput(InversionVyObsEnum);                     _assert_(vyobs_input);
+ 	}
+ 	IssmDouble epsvel  = 2.220446049250313e-16;
+ 	IssmDouble meanvel = 3.170979198376458e-05; /*1000 m/yr*/
+@@ -393,7 +393,7 @@
+ 
+ 		vx_input->GetInputValue(&vx,gauss);
+ 		vxobs_input->GetInputValue(&vxobs,gauss);
+-		if (domaintype!=Domain2DverticalEnum) {
++		if(domaintype!=Domain2DverticalEnum) {
+ 			vy_input->GetInputValue(&vy,gauss);
+ 			vyobs_input->GetInputValue(&vyobs,gauss);
+ 		}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18837-18838.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18837-18838.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18837-18838.diff	(revision 19102)
@@ -0,0 +1,15 @@
+Index: ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 18837)
++++ ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 18838)
+@@ -1566,8 +1566,8 @@
+ 	Input* vz_input        = NULL;
+ 	Input* adjointz_input  = NULL;
+ 	if(domaintype!=Domain2DverticalEnum){
+-		Input* vz_input        = element->GetInput(VzEnum);                   _assert_(vy_input);
+-		Input* adjointz_input  = element->GetInput(AdjointzEnum);             _assert_(adjointz_input);
++		vz_input        = element->GetInput(VzEnum);                   _assert_(vy_input);
++		adjointz_input  = element->GetInput(AdjointzEnum);             _assert_(adjointz_input);
+ 	}
+ 	Input* dragcoeff_input = element->GetInput(FrictionCoefficientEnum);  _assert_(dragcoeff_input);
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18838-18839.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18838-18839.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18838-18839.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/jenkins/windows
+===================================================================
+--- ../trunk-jpl/jenkins/windows	(revision 18838)
++++ ../trunk-jpl/jenkins/windows	(revision 18839)
+@@ -46,7 +46,7 @@
+ #List of external pakages to be installed and their installation scripts
+ EXTERNALPACKAGES="cccl        install-win7.sh
+ 						cmake       install.sh                
+-						petsc       install-3.1-win7.sh
++						petsc       install-3.5-win7.sh
+ 						triangle    install-win7.sh        
+ 						matlab      install.sh
+ 						shell2junit install.sh"
Index: /issm/oecreview/Archive/18296-19100/ISSM-18839-18840.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18839-18840.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18839-18840.diff	(revision 19102)
@@ -0,0 +1,59 @@
+Index: ../trunk-jpl/src/m/contrib/paraview/exportVTK.py
+===================================================================
+--- ../trunk-jpl/src/m/contrib/paraview/exportVTK.py	(revision 18839)
++++ ../trunk-jpl/src/m/contrib/paraview/exportVTK.py	(revision 18840)
+@@ -70,8 +70,8 @@
+ 		#%building solutionstructure 
+ 		for solution in solnames:
+ 			#looking for multiple time steps
+-			if (len(res_struct.__dict__[solution])>num_of_timesteps):
+-				num_of_timesteps=len(res_struct.__dict__[solution])
++			if (numpy.size(res_struct.__dict__[solution])>num_of_timesteps):
++				num_of_timesteps=numpy.size(res_struct.__dict__[solution])
+ 				num_of_timesteps=int(num_of_timesteps/out_freq)+1
+ 	else:
+ 		num_of_timesteps=1
+@@ -112,28 +112,35 @@
+ 		if 'solnames' in locals():
+ 			for sol in solnames:
+ 				#dealing with results on different timesteps
+-				if(len(res_struct.__dict__[sol])>timestep):
++				if(numpy.size(res_struct.__dict__[sol])>timestep):
+ 					timestep = step
+ 				else:
+-					timestep = len(res_struct.__dict__[sol])
++					timestep = numpy.size(res_struct.__dict__[sol])
+ 				
+ 				#getting the  fields in the solution
+-				fieldnames=dict.keys(res_struct.__dict__[sol].__getitem__(timestep*out_freq-1).__dict__)
+-			
++				if(numpy.size(res_struct.__dict__[sol])>1):
++					fieldnames=dict.keys(res_struct.__dict__[sol].__getitem__(timestep*out_freq-1).__dict__)
++				else:
++					fieldnames=dict.keys(res_struct.__dict__[sol].__dict__)
+ 				#check which field is a real result and print
+ 				for field in fieldnames:
+-					if ((numpy.size(res_struct.__dict__[sol].__getitem__(timestep*out_freq-1).__dict__[field]))==num_of_points):
++					if(numpy.size(res_struct.__dict__[sol])>1):
++						fieldstruct=res_struct.__dict__[sol].__getitem__(timestep*out_freq-1).__dict__[field]
++					else:
++						fieldstruct=res_struct.__dict__[sol].__dict__[field]
++
++					if ((numpy.size(fieldstruct))==num_of_points):
+ 						fid.write('SCALARS %s float 1 \n' % field)
+ 						fid.write('LOOKUP_TABLE default\n')
+ 						for node in range(0,num_of_points):
+ 							#paraview does not like NaN, replacing
+-							if numpy.isnan(res_struct.__dict__[sol].__getitem__(timestep*out_freq-1).__dict__[field][node]):
++							if numpy.isnan(fieldstruct[node]):
+ 								fid.write('%e\n' % -9999.9999)
+ 							#also checking for verry small value that mess up
+-							elif (abs(res_struct.__dict__[sol].__getitem__(timestep*out_freq-1).__dict__[field][node])<1.0e-20):
++							elif (abs(fieldstruct[node])<1.0e-20):
+ 								fid.write('%e\n' % 0.0)
+ 							else:
+-								fid.write('%e\n' % res_struct.__dict__[sol].__getitem__(timestep*out_freq-1).__dict__[field][node])
++								fid.write('%e\n' % fieldstruct[node])
+ 					
+ 		#loop on arguments, if something other than result is asked, do
+ 		#it now
Index: /issm/oecreview/Archive/18296-19100/ISSM-18840-18841.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18840-18841.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18840-18841.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/contrib/paraview/exportVTK.m
+===================================================================
+--- ../trunk-jpl/src/m/contrib/paraview/exportVTK.m	(revision 18840)
++++ ../trunk-jpl/src/m/contrib/paraview/exportVTK.m	(revision 18841)
+@@ -67,7 +67,7 @@
+ 	
+ 	timestep=step;
+ 
+-	fid = fopen(strcat(path,filesep,name,filesep,name,'.vtk',int2str(timestep),'.vtk'),'w+');
++	fid = fopen(strcat(path,filesep,name,filesep,'timestep.vtk',int2str(timestep),'.vtk'),'w+');
+ 	fprintf(fid,'# vtk DataFile Version 2.0 \n');
+ 	fprintf(fid,'Data for run %s \n',model.miscellaneous.name);
+ 	fprintf(fid,'ASCII \n');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18841-18842.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18841-18842.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18841-18842.diff	(revision 19102)
@@ -0,0 +1,66 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18841)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18842)
+@@ -1315,6 +1315,48 @@
+ 	*pxyz_zero= xyz_zero;
+ }
+ /*}}}*/
++void       Penta::GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){/*{{{*/
++	
++	/* Intermediaries */
++	const int dim=3;
++	int i, dir,nrfrontnodes;
++	IssmDouble  levelset[NUMVERTICES];
++
++	/*Recover parameters and values*/
++	GetInputListOnVertices(&levelset[0],levelsetenum);
++
++	int* indicesfront = xNew<int>(NUMVERTICES);
++	/* Get basal nodes where there is no ice */
++	nrfrontnodes=0;
++	for(i=0;i<NUMVERTICES2D;i++){
++		if(levelset[i]>=0.){
++			indicesfront[nrfrontnodes]=i;
++			nrfrontnodes++;
++		}
++	}
++	_assert_(nrfrontnodes==2);
++
++	/* arrange order of basal frontnodes such that they are oriented counterclockwise */
++	if((NUMVERTICES2D+indicesfront[0]-indicesfront[1])%NUMVERTICES2D!=NUMVERTICES2D-1){
++		int index=indicesfront[0];
++		indicesfront[0]=indicesfront[1];
++		indicesfront[1]=index;
++	}	
++
++	IssmDouble* xyz_front = xNew<IssmDouble>(2*dim*nrfrontnodes);
++	/* Return basal and top front nodes */
++	for(i=0;i<nrfrontnodes;i++){
++		for(dir=0;dir<dim;dir++){
++			int ind1=i*dim+dir, ind2=(2*nrfrontnodes-1-i)*dim+dir; // vertex structure front segment: base0, base1, top1, top0
++			xyz_front[ind1]=xyz_list[dim*indicesfront[i]+dir];
++			xyz_front[ind2]=xyz_list[dim*(indicesfront[i]+NUMVERTICES2D)+dir];
++		}
++	}
++
++	*pxyz_front=xyz_front;
++
++	xDelete<int>(indicesfront);
++}/*}}}*/
+ void       Penta::InputDepthAverageAtBase(int enum_type,int average_enum_type){/*{{{*/
+ 
+ 	int  step,i;
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18841)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18842)
+@@ -95,7 +95,7 @@
+ 		bool   IsIcefront(void);
+ 		bool   IsFaceOnBoundary(void){_error_("not implemented yet");};
+ 		void   ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum);
+-		void   GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){_error_("not implemented yet");};
++		void   GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum);
+ 		void   GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level){_error_("not implemented yet");};
+ 		void   PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm);
+ 		void   ReduceMatrices(ElementMatrix* Ke,ElementVector* pe);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18842-18843.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18842-18843.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18842-18843.diff	(revision 19102)
@@ -0,0 +1,39 @@
+Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18842)
++++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18843)
+@@ -1624,7 +1624,6 @@
+ 	IssmDouble rho_ice     = element->GetMaterialParameter(MaterialsRhoIceEnum);
+ 	IssmDouble gravity     = element->GetMaterialParameter(ConstantsGEnum);
+ 	element->GetVerticesCoordinates(&xyz_list);
+-	//element->ZeroLevelsetCoordinates(&xyz_list_front,xyz_list,MaskIceLevelsetEnum);
+ 	element->GetIcefrontCoordinates(&xyz_list_front,xyz_list,MaskIceLevelsetEnum);
+ 	element->NormalSection(&normal[0],xyz_list_front);
+ 
+@@ -2076,7 +2075,7 @@
+ 	IssmDouble rho_ice     = element->GetMaterialParameter(MaterialsRhoIceEnum);
+ 	IssmDouble gravity     = element->GetMaterialParameter(ConstantsGEnum);
+ 	element->GetVerticesCoordinates(&xyz_list);
+-	element->ZeroLevelsetCoordinates(&xyz_list_front,xyz_list,MaskIceLevelsetEnum);
++	element->GetIcefrontCoordinates(&xyz_list_front,xyz_list,MaskIceLevelsetEnum);
+ 	element->NormalSection(&normal[0],xyz_list_front);
+ 
+ 	/*Start looping on Gaussian points*/
+@@ -2594,7 +2593,7 @@
+ 	IssmDouble rho_ice   = element->GetMaterialParameter(MaterialsRhoIceEnum);
+ 	IssmDouble gravity   = element->GetMaterialParameter(ConstantsGEnum);
+ 	element->GetVerticesCoordinates(&xyz_list);
+-	element->ZeroLevelsetCoordinates(&xyz_list_front,xyz_list,MaskIceLevelsetEnum);
++	element->GetIcefrontCoordinates(&xyz_list_front,xyz_list,MaskIceLevelsetEnum);
+ 	element->NormalSection(&normal[0],xyz_list_front);
+ 
+ 	/*Initialize gauss points*/
+@@ -4166,7 +4165,7 @@
+ 
+ 	/*Retrieve all inputs and parameters*/
+ 	element->GetVerticesCoordinates(&xyz_list);
+-	element->ZeroLevelsetCoordinates(&xyz_list_front,xyz_list,MaskIceLevelsetEnum);
++	element->GetIcefrontCoordinates(&xyz_list_front,xyz_list,MaskIceLevelsetEnum);
+ 	element->NormalSection(&normal[0],xyz_list_front);
+ 	Input* surface_input  = element->GetInput(SurfaceEnum); _assert_(surface_input);
+ 	IssmDouble  rho_water = element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18843-18844.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18843-18844.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18843-18844.diff	(revision 19102)
@@ -0,0 +1,8 @@
+Index: ../trunk-jpl/test/Archives/Archive803.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive805.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
Index: /issm/oecreview/Archive/18296-19100/ISSM-18844-18845.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18844-18845.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18844-18845.diff	(revision 19102)
@@ -0,0 +1,196 @@
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 18844)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 18845)
+@@ -855,6 +855,8 @@
+ 					./classes/kriging/PowerVariogram.cpp\
+ 					./classes/kriging/Quadtree.h\
+ 					./classes/kriging/Quadtree.cpp\
++					./classes/kriging/Covertree.h\
++					./classes/kriging/Covertree.cpp\
+ 					./classes/kriging/Observation.h\
+ 					./classes/kriging/Observation.cpp\
+ 					./modules/Krigingx/pKrigingx.cpp
+Index: ../trunk-jpl/src/c/classes/kriging/Covertree.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/Covertree.cpp	(revision 0)
++++ ../trunk-jpl/src/c/classes/kriging/Covertree.cpp	(revision 18845)
+@@ -0,0 +1,12 @@
++#include "../classes.h"
++
++	/*Constructors/Destructors*/
++Covertree::Covertree(){/*{{{*/
++	_error_("Constructor not supported");
++}
++/*}}}*/
++Covertree::~Covertree(){/*{{{*/
++}
++/*}}}*/
++
++	/*Methods*/
+Index: ../trunk-jpl/src/c/classes/kriging/Covertree.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/Covertree.h	(revision 0)
++++ ../trunk-jpl/src/c/classes/kriging/Covertree.h	(revision 18845)
+@@ -0,0 +1,14 @@
++
++#ifndef _COVERTREE_H
++#define _COVERTREE_H
++
++class Observation;
++
++class Covertree{
++
++	public:
++		Covertree();
++		~Covertree();
++
++};
++#endif //_COVERTREE_H
+Index: ../trunk-jpl/src/c/classes/kriging/krigingobjects.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/krigingobjects.h	(revision 18844)
++++ ../trunk-jpl/src/c/classes/kriging/krigingobjects.h	(revision 18845)
+@@ -12,6 +12,7 @@
+ #include "./SphericalVariogram.h"
+ #include "./PowerVariogram.h"
+ #include "./Quadtree.h"
++#include "./Covertree.h"
+ #include "./Observation.h"
+ #include "./Observations.h"
+ 
+Index: ../trunk-jpl/src/c/classes/kriging/Observations.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/Observations.cpp	(revision 18844)
++++ ../trunk-jpl/src/c/classes/kriging/Observations.cpp	(revision 18845)
+@@ -22,6 +22,7 @@
+ #include "../../shared/shared.h"
+ 
+ #include "./Quadtree.h"
++#include "./Covertree.h"
+ #include "./Variogram.h"
+ #include "../../toolkits/toolkits.h"
+ 
+@@ -30,12 +31,54 @@
+ 
+ /*Object constructors and destructor*/
+ Observations::Observations(){/*{{{*/
+-	this->quadtree = NULL;
++	this->treetype  = 0;
++	this->quadtree  = NULL;
++	this->covertree = NULL;
+ 	return;
+ }
+ /*}}}*/
+ Observations::Observations(IssmPDouble* observations_list,IssmPDouble* x,IssmPDouble* y,int n,Options* options){/*{{{*/
+ 
++	/*Check that there are observations*/
++	if(n<=0) _error_("No observation found");
++
++	/*Get tree type*/
++	options->Get(&this->treetype,"treetype",1);
++	switch(this->treetype){
++		case 1:
++			this->covertree = NULL;
++			this->InitQuadtree(observations_list,x,y,n,options);
++			break;
++		case 2:
++			this->quadtree = NULL;
++			this->InitCovertree(observations_list,x,y,n,options);
++			break;
++		default:
++			_error_("Tree type "<<this->treetype<<" not supported yet (1: quadtree, 2: covertree)");
++	}
++
++
++
++}
++/*}}}*/
++Observations::~Observations(){/*{{{*/
++	switch(this->treetype){
++		case 1:
++			delete this->quadtree;
++			break;
++		case 2:
++			delete this->covertree;
++			break;
++		default:
++			_error_("Tree type "<<this->treetype<<" not supported yet (1: quadtree, 2: covertree)");
++	}
++	return;
++}
++/*}}}*/
++
++/*Initialize data structures*/
++void Observations::InitQuadtree(IssmPDouble* observations_list,IssmPDouble* x,IssmPDouble* y,int n,Options* options){/*{{{*/
++
+ 	/*Intermediaries*/
+ 	int          i,maxdepth,level,counter,index;
+ 	int          xi,yi;
+@@ -43,8 +86,8 @@
+ 	IssmPDouble  offset,minlength,minspacing,mintrimming,maxtrimming;
+ 	Observation *observation = NULL;
+ 
+-	/*Check that observations is not empty*/
+-	if(n==0) _error_("No observation found");
++	/*Checks*/
++	_assert_(n);
+ 
+ 	/*Get extrema*/
+ 	xmin=x[0]; ymin=y[0];
+@@ -109,9 +152,10 @@
+ 	_printf0_("  Final number of observations: " << this->quadtree->NbObs << "\n");
+ }
+ /*}}}*/
+-Observations::~Observations(){/*{{{*/
+-	delete quadtree;
+-	return;
++void Observations::InitCovertree(IssmPDouble* observations_list,IssmPDouble* x,IssmPDouble* y,int n,Options* options){/*{{{*/
++
++	_error_("Not supported yet");
++
+ }
+ /*}}}*/
+ 
+@@ -509,6 +553,7 @@
+ }/*}}}*/
+ void Observations::QuadtreeColoring(IssmPDouble* A,IssmPDouble *x,IssmPDouble *y,int n){/*{{{*/
+ 
++	if(this->treetype!=1) _error_("Tree type is not quadtree");
+ 	int xi,yi,level;
+ 
+ 	for(int i=0;i<n;i++){
+Index: ../trunk-jpl/src/c/classes/kriging/Observations.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/Observations.h	(revision 18844)
++++ ../trunk-jpl/src/c/classes/kriging/Observations.h	(revision 18845)
+@@ -2,6 +2,7 @@
+ #define  _CONTAINER_OBSERVATIONS_H_
+ 
+ class Quadtree;
++class Covertree;
+ class Variogram;
+ class Options;
+ #include "../../datastructures/datastructures.h"
+@@ -15,7 +16,9 @@
+ class Observations: public DataSet{
+ 
+ 	private:
+-		Quadtree* quadtree;
++		int        treetype;
++		Quadtree*  quadtree;
++		Covertree* covertree;
+ 
+ 	public:
+ 
+@@ -24,6 +27,10 @@
+ 		Observations(IssmDouble* observations_list,IssmDouble* x,IssmDouble* y,int n,Options* options);
+ 		~Observations();
+ 
++		/*Initialize data structures*/
++		void InitQuadtree(IssmDouble* observations_list,IssmDouble* x,IssmDouble* y,int n,Options* options);
++		void InitCovertree(IssmDouble* observations_list,IssmDouble* x,IssmDouble* y,int n,Options* options);
++
+ 		/*Methods*/
+ 		void ClosestObservation(IssmDouble *px,IssmDouble *py,IssmDouble *pobs,IssmDouble x_interp,IssmDouble y_interp,IssmDouble radius);
+ 		void Distances(IssmPDouble* distances,IssmPDouble *x,IssmPDouble *y,int n,IssmPDouble radius);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18845-18846.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18845-18846.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18845-18846.diff	(revision 19102)
@@ -0,0 +1,25 @@
+Index: ../trunk-jpl/externalpackages/valgrind/issm.supp
+===================================================================
+--- ../trunk-jpl/externalpackages/valgrind/issm.supp	(revision 18845)
++++ ../trunk-jpl/externalpackages/valgrind/issm.supp	(revision 18846)
+@@ -210,4 +210,20 @@
+ 	  fun:__dmumps_parallel_analysis_MOD_dmumps_720
+ 	  fun:__dmumps_parallel_analysis_MOD_dmumps_715
+ }
++{
++	<mump14>
++	  Memcheck:Leak
++	  fun:malloc
++	  fun:mumps_754_
++	  fun:__dmumps_parallel_analysis_MOD_dmumps_781
++	  fun:__dmumps_parallel_analysis_MOD_dmumps_720
++	  fun:__dmumps_parallel_analysis_MOD_dmumps_715
++	  fun:dmumps_26_
++	  fun:dmumps_
++	  fun:dmumps_f77_
++	  fun:dmumps_c
++	  fun:MatLUFactorSymbolic_AIJMUMPS
++	  fun:MatLUFactorSymbolic
++	  fun:PCSetUp_LU
++}
+ #}}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18846-18847.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18846-18847.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18846-18847.diff	(revision 19102)
@@ -0,0 +1,16 @@
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp	(revision 18846)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp	(revision 18847)
+@@ -67,7 +67,10 @@
+ 		if(isenthalpy){ 
+ 			SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel);
+ 			/*Update old solution, such that sizes of tf_old and tf are comparable*/
+-			if(isdynamicbasalspc)	Reducevectorgtofx(&tf_old, tg, femmodel->nodes,femmodel->parameters);
++			if(isdynamicbasalspc){
++				delete tf_old;
++				Reducevectorgtofx(&tf_old, tg, femmodel->nodes,femmodel->parameters);
++			}
+ 		}
+ 		else SystemMatricesx(&Kff, &Kfs, &pf,&df, &melting_offset,femmodel);
+ 		delete tg;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18847-18848.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18847-18848.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18847-18848.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18847)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18848)
+@@ -1192,6 +1192,8 @@
+ 	}
+ 
+ 	this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum);
++	xDelete<IssmDouble>(base);
++	xDelete<IssmDouble>(values);
+ 
+ }/*}}}*/
+ ElementVector* Element::NewElementVector(int approximation_enum){/*{{{*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18848-18849.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18848-18849.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18848-18849.diff	(revision 19102)
@@ -0,0 +1,20 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18848)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18849)
+@@ -1089,10 +1089,14 @@
+ 	int  migration_style;
+ 	parameters->FindParam(&migration_style,GroundinglineMigrationEnum);
+ 
+-	if(migration_style==SubelementMigrationEnum || migration_style==SubelementMigration2Enum || migration_style==ContactEnum){ //Floating if all nodes are floating
++	if(migration_style==SubelementMigrationEnum || migration_style==SubelementMigration2Enum){ //Floating if all nodes are floating
+ 		if(this->inputs->Max(MaskGroundediceLevelsetEnum) <= 0.) shelf=true;
+ 		else shelf=false;
+ 	}
++	else if(migration_style==ContactEnum){
++		if(this->inputs->Max(MaskGroundediceLevelsetEnum) > 0.) shelf=false;
++		else shelf=true;
++	}
+ 	else if(migration_style==NoneEnum || migration_style==AggressiveMigrationEnum || migration_style==SoftMigrationEnum){ //Floating if all nodes are floating
+ 		if(this->inputs->Min(MaskGroundediceLevelsetEnum) > 0.) shelf=false;
+ 		else shelf=true;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18849-18850.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18849-18850.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18849-18850.diff	(revision 19102)
@@ -0,0 +1,24 @@
+Index: ../trunk-jpl/src/c/cores/transient_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/transient_core.cpp	(revision 18849)
++++ ../trunk-jpl/src/c/cores/transient_core.cpp	(revision 18850)
+@@ -146,12 +146,13 @@
+ 			if(VerboseSolution()) _printf0_("   computing new grounding line position\n");
+ 			GroundinglineMigrationx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
+ 
+-			if(groundingline_migration==ContactEnum){
+-				femmodel->parameters->SetParam(MaskGroundediceLevelsetEnum,InputToExtrudeEnum);
+-				extrudefrombase_core(femmodel);
+-				femmodel->parameters->SetParam(BaseEnum,InputToExtrudeEnum);
+-				extrudefrombase_core(femmodel);
+-			}
++			femmodel->parameters->SetParam(MaskGroundediceLevelsetEnum,InputToExtrudeEnum);
++			extrudefrombase_core(femmodel);
++			femmodel->parameters->SetParam(BaseEnum,InputToExtrudeEnum);
++			extrudefrombase_core(femmodel);
++			femmodel->parameters->SetParam(SurfaceEnum,InputToExtrudeEnum);
++			extrudefrombase_core(femmodel);
++				
+ 			if(save_results){
+ 				int outputs[3] = {SurfaceEnum,BaseEnum,MaskGroundediceLevelsetEnum};
+ 				femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],3);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18850-18851.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18850-18851.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18850-18851.diff	(revision 19102)
@@ -0,0 +1,20 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18850)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18851)
+@@ -3490,15 +3490,10 @@
+ 		else phi[i]=h[i]+r[i]/density;
+ 	}
+ 	this->inputs->AddInput(new PentaInput(MaskGroundediceLevelsetEnum,&phi[0],P1Enum));
+-	this->InputExtrude(MaskGroundediceLevelsetEnum,-1);
+ 
+ 	/*Update inputs*/
+ 	this->inputs->AddInput(new PentaInput(SurfaceEnum,&s[0],P1Enum));
+ 	this->inputs->AddInput(new PentaInput(BaseEnum,&b[0],P1Enum));
+-
+-	/*Extrude inputs*/
+-	this->InputExtrude(SurfaceEnum,-1);
+-	this->InputExtrude(BaseEnum,-1);
+ }
+ /*}}}*/
+ void       Penta::PotentialUngrounding(Vector<IssmDouble>* potential_ungrounding){/*{{{*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18851-18852.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18851-18852.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18851-18852.diff	(revision 19102)
@@ -0,0 +1,20 @@
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18851)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18852)
+@@ -1874,7 +1874,6 @@
+ 		effanalysis->HydrologyEPLGetActive(active,element);
+ 	}
+ 
+-
+ 	/*Assemble and serialize*/
+ 	active->Assemble();
+ 	serial_active=active->ToMPISerial();
+@@ -1896,6 +1895,7 @@
+ 	}
+ 	xDelete<IssmDouble>(serial_active);
+ 	delete effanalysis;
++	delete inefanalysis;
+ 	int sum_counter;
+ 	ISSM_MPI_Reduce(&counter,&sum_counter,1,ISSM_MPI_INT,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+ 	ISSM_MPI_Bcast(&sum_counter,1,ISSM_MPI_INT,0,IssmComm::GetComm());                
Index: /issm/oecreview/Archive/18296-19100/ISSM-18852-18853.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18852-18853.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18852-18853.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/cores/controltao_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/controltao_core.cpp	(revision 18852)
++++ ../trunk-jpl/src/c/cores/controltao_core.cpp	(revision 18853)
+@@ -128,6 +128,8 @@
+ 	#if defined (_HAVE_PETSC_) && (_PETSC_MAJOR_ == 3 && _PETSC_MINOR_ < 5)
+ 	TaoFinalize();
+ 	#endif
++	G->pvector->vector = NULL;
++	delete G;
+ }
+ 
+ #if defined (_HAVE_PETSC_) && (_PETSC_MAJOR_ == 3 && _PETSC_MINOR_ < 5)
Index: /issm/oecreview/Archive/18296-19100/ISSM-18853-18854.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18853-18854.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18853-18854.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 18853)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 18854)
+@@ -88,6 +88,7 @@
+ 		xDelete<int>(control_type);
+ 		xDelete<int>(cm_responses);
+ 		xDelete<int>(maxiter);
++		xDelete<IssmDouble>(control_scaling_factors);
+ 		iomodel->DeleteData(cm_jump,InversionStepThresholdEnum);
+ 		iomodel->DeleteData(optscal,InversionGradientScalingEnum);
+ 	}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18854-18855.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18854-18855.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18854-18855.diff	(revision 19102)
@@ -0,0 +1,358 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Element.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18854)
++++ ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18855)
+@@ -119,6 +119,7 @@
+ 		bool	     IsInput(int name);
+ 		bool       IsFloating(); 
+ 		void       LinearFloatingiceMeltingRate(); 
++		void       MigrateGroundingLine(IssmDouble* sheet_ungrounding);
+ 		ElementVector*  NewElementVector(int approximation_enum=NoneApproximationEnum);
+ 		ElementMatrix*  NewElementMatrix(int approximation_enum=NoneApproximationEnum);
+ 		ElementMatrix*  NewElementMatrixCoupling(int number_nodes,int approximation_enum=NoneApproximationEnum);
+@@ -293,7 +294,6 @@
+ 		virtual void UpdateConstraintsExtrudeFromBase(void)=0;
+ 		virtual void UpdateConstraintsExtrudeFromTop(void)=0;
+ 
+-		virtual void   MigrateGroundingLine(IssmDouble* sheet_ungrounding)=0;
+ 		virtual void   FSContactMigration(Vector<IssmDouble>* vertexgrounded,Vector<IssmDouble>* vertexfloating)=0;
+ 		virtual void   PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding)=0;
+ 		virtual int    UpdatePotentialUngrounding(IssmDouble* potential_sheet_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf)=0;
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18854)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18855)
+@@ -3255,94 +3255,6 @@
+ /*}}}*/
+ #endif
+ 
+-void       Tria::MigrateGroundingLine(IssmDouble* phi_ungrounding){/*{{{*/
+-
+-	int        i,migration_style;
+-	bool       groundedelement = false;
+-	IssmDouble bed_hydro,yts;
+-	IssmDouble rho_water,rho_ice,density;
+-	IssmDouble melting[NUMVERTICES],phi[NUMVERTICES];;
+-	IssmDouble h[NUMVERTICES],s[NUMVERTICES],b[NUMVERTICES],r[NUMVERTICES];
+-
+-	/*Recover info at the vertices: */
+-	parameters->FindParam(&migration_style,GroundinglineMigrationEnum);
+-	parameters->FindParam(&yts,ConstantsYtsEnum);
+-	GetInputListOnVertices(&h[0],ThicknessEnum);
+-	GetInputListOnVertices(&s[0],SurfaceEnum);
+-	GetInputListOnVertices(&b[0],BaseEnum);
+-	GetInputListOnVertices(&r[0],BedEnum);
+-	GetInputListOnVertices(&phi[0],MaskGroundediceLevelsetEnum);
+-	rho_water   = matpar->GetRhoWater();
+-	rho_ice     = matpar->GetRhoIce();
+-	density     = rho_ice/rho_water;
+-
+-	if(migration_style == ContactEnum){
+-		for(i = 0;i < NUMVERTICES;i++) phi[i] = phi_ungrounding[vertices[i]->Pid()];
+-		this->inputs->AddInput(new TriaInput(MaskGroundediceLevelsetEnum,&phi[0],P1Enum));
+-
+-		/*go through vertices, and update inputs, considering them to be TriaVertex type: */
+-		for(i = 0;i < NUMVERTICES;i++){
+-			/*Ice shelf: if bed below bathymetry, impose it at the bathymetry and update surface, elso do nothing */
+-			if(phi[i] >= 0.){
+-					b[i]  = r[i];
+-			}
+-		}
+-
+-		/*Update inputs*/
+-		this->inputs->AddInput(new TriaInput(BaseEnum,&b[0],P1Enum));
+-		return;
+-	}
+-
+-	this->inputs->AddInput(new TriaInput(MaskGroundediceLevelsetEnum,&phi[0],P1Enum));
+-
+-	/*go through vertices, and update inputs, considering them to be TriaVertex type: */
+-	for(i=0;i<NUMVERTICES;i++){
+-		/*Ice shelf: if bed below bathymetry, impose it at the bathymetry and update surface, elso do nothing */
+-		if(phi[i]<=0.){
+-			if(b[i]<=r[i]){ 
+-				b[i]        = r[i];
+-				s[i]        = b[i]+h[i];
+-			}
+-		}
+-		/*Ice sheet: if hydrostatic bed above bathymetry, ice sheet starts to unground, elso do nothing */
+-		/*Change only if AggressiveMigration or if the ice sheet is in contact with the ocean*/
+-		else{ // phi>0
+-			bed_hydro=-density*h[i];
+-			if (bed_hydro>r[i]){
+-				/*Unground only if the element is connected to the ice shelf*/
+-				if(migration_style==AggressiveMigrationEnum || migration_style==SubelementMigrationEnum || migration_style==SubelementMigration2Enum){
+-					s[i]        = (1-density)*h[i];
+-					b[i]        = -density*h[i];
+-				}
+-				else if(migration_style==SoftMigrationEnum && phi_ungrounding[vertices[i]->Pid()]<0.){
+-					s[i]        = (1-density)*h[i];
+-					b[i]        = -density*h[i];
+-				}
+-				else{
+-					if(migration_style!=SoftMigrationEnum) _error_("Error: migration should be Aggressive, Soft or Subelement");
+-				}
+-			}
+-		}
+-	}
+-
+-	/*Recalculate phi*/
+-	for(i=0;i<NUMVERTICES;i++){
+-		if(migration_style==SoftMigrationEnum){
+-			bed_hydro=-density*h[i];
+-			if(phi[i]<0. || bed_hydro<=r[i] || phi_ungrounding[vertices[i]->Pid()]<0.){
+-				phi[i]=h[i]+r[i]/density;
+-			}
+-		}
+-		else phi[i]=h[i]+r[i]/density;
+-	}
+-	this->inputs->AddInput(new TriaInput(MaskGroundediceLevelsetEnum,&phi[0],P1Enum));
+-
+-	/*Update inputs*/
+-	this->inputs->AddInput(new TriaInput(SurfaceEnum,&s[0],P1Enum));
+-	this->inputs->AddInput(new TriaInput(BaseEnum,&b[0],P1Enum));
+-
+-}
+-/*}}}*/
+ void       Tria::PotentialUngrounding(Vector<IssmDouble>* potential_ungrounding){/*{{{*/
+ 
+ 	IssmDouble  h[NUMVERTICES],r[NUMVERTICES],gl[NUMVERTICES];
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18854)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18855)
+@@ -138,7 +138,6 @@
+ 		void       InputControlUpdate(IssmDouble scalar,bool save_parameter);
+ 
+ 		void   PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding);
+-		void   MigrateGroundingLine(IssmDouble* sheet_ungrounding);
+ 		int    UpdatePotentialUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf);
+ 
+ 		/*}}}*/
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18854)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18855)
+@@ -3427,75 +3427,6 @@
+ 	xDelete<int>(doflist);
+ }
+ /*}}}*/
+-void       Penta::MigrateGroundingLine(IssmDouble* phi_ungrounding){/*{{{*/
+-
+-	int        i,migration_style;
+-	IssmDouble bed_hydro,yts;
+-	IssmDouble rho_water,rho_ice,density;
+-	IssmDouble h[NUMVERTICES],s[NUMVERTICES],b[NUMVERTICES],r[NUMVERTICES];
+-	IssmDouble melting[NUMVERTICES],phi[NUMVERTICES];
+-
+-	if(!IsOnBase()) return;
+-
+-	/*Recover info at the vertices: */
+-	parameters->FindParam(&migration_style,GroundinglineMigrationEnum);
+-	parameters->FindParam(&yts,ConstantsYtsEnum);
+-	GetInputListOnVertices(&h[0],ThicknessEnum);
+-	GetInputListOnVertices(&s[0],SurfaceEnum);
+-	GetInputListOnVertices(&b[0],BaseEnum);
+-	GetInputListOnVertices(&r[0],BedEnum);
+-	GetInputListOnVertices(&phi[0],MaskGroundediceLevelsetEnum);
+-	rho_water   = matpar->GetRhoWater();
+-	rho_ice     = matpar->GetRhoIce();
+-	density     = rho_ice/rho_water;
+-
+-	/*go through vertices, and update inputs, considering them to be PentaVertex type: */
+-	for(i=0;i<NUMVERTICES;i++){
+-		/*Ice shelf: if bed below bathymetry, impose it at the bathymetry and update surface, elso do nothing */
+-		if(phi[i]<=0){
+-			if(b[i]<=r[i]){ 
+-				b[i]        = r[i];
+-				s[i]        = b[i]+h[i];
+-			}
+-		}
+-		/*Ice sheet: if hydrostatic bed above bathymetry, ice sheet starts to unground, elso do nothing */
+-		/*Change only if AggressiveMigration or if the ice sheet is in contact with the ocean*/
+-		else{
+-			bed_hydro=-density*h[i];
+-			if(bed_hydro>r[i]){
+-				/*Unground only if the element is connected to the ice shelf*/
+-				if(migration_style==AggressiveMigrationEnum || migration_style==SubelementMigrationEnum || migration_style==SubelementMigration2Enum){
+-					s[i]        = (1-density)*h[i];
+-					b[i]        = -density*h[i];
+-				}
+-				else if(migration_style==SoftMigrationEnum && phi_ungrounding[vertices[i]->Pid()]<0.){
+-					s[i]        = (1-density)*h[i];
+-					b[i]        = -density*h[i];
+-				}
+-				else{
+-					if(migration_style!=SoftMigrationEnum) _error_("Error: migration should be Aggressive, Soft or Subelement");
+-				}
+-			}
+-		}
+-	}
+-
+-	/*Recalculate phi*/
+-	for(i=0;i<NUMVERTICES;i++){
+-		if(migration_style==SoftMigrationEnum){
+-			bed_hydro=-density*h[i];
+-			if(phi[i]<0. || bed_hydro<=r[i] || phi_ungrounding[vertices[i]->Pid()]<0.){
+-				phi[i]=h[i]+r[i]/density;
+-			}
+-		}
+-		else phi[i]=h[i]+r[i]/density;
+-	}
+-	this->inputs->AddInput(new PentaInput(MaskGroundediceLevelsetEnum,&phi[0],P1Enum));
+-
+-	/*Update inputs*/
+-	this->inputs->AddInput(new PentaInput(SurfaceEnum,&s[0],P1Enum));
+-	this->inputs->AddInput(new PentaInput(BaseEnum,&b[0],P1Enum));
+-}
+-/*}}}*/
+ void       Penta::PotentialUngrounding(Vector<IssmDouble>* potential_ungrounding){/*{{{*/
+ 
+ 	IssmDouble  h[NUMVERTICES],r[NUMVERTICES],gl[NUMVERTICES];
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18854)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18855)
+@@ -134,7 +134,6 @@
+ 		IssmDouble MisfitArea(int weightsenum){_error_("not implemented yet");};
+ 		IssmDouble Masscon(IssmDouble* levelset){_error_("not implemented yet");};
+ 
+-		void   MigrateGroundingLine(IssmDouble* sheet_ungrounding);
+ 		void   PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding);
+ 		int    UpdatePotentialUngrounding(IssmDouble* potential_sheet_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf);
+ 		/*}}}*/
+Index: ../trunk-jpl/src/c/classes/Elements/Seg.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18854)
++++ ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18855)
+@@ -170,7 +170,6 @@
+ 		void       InputControlUpdate(IssmDouble scalar,bool save_parameter){_error_("not implemented yet");};
+ 
+ 		void   PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding){_error_("not implemented yet");};
+-		void   MigrateGroundingLine(IssmDouble* sheet_ungrounding){_error_("not implemented yet");};
+ 		int    UpdatePotentialUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf){_error_("not implemented yet");};
+ 		/*}}}*/
+ };
+Index: ../trunk-jpl/src/c/classes/Elements/Tetra.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18854)
++++ ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18855)
+@@ -176,7 +176,6 @@
+ 		void       InputControlUpdate(IssmDouble scalar,bool save_parameter){_error_("not implemented yet");};
+ 
+ 		void   PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding){_error_("not implemented yet");};
+-		void   MigrateGroundingLine(IssmDouble* sheet_ungrounding){_error_("not implemented yet");};
+ 		int    UpdatePotentialUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf){_error_("not implemented yet");};
+ 		/*}}}*/
+ };
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18854)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18855)
+@@ -1200,6 +1200,106 @@
+ 	xDelete<IssmDouble>(values);
+ 
+ }/*}}}*/
++void       Element::MigrateGroundingLine(IssmDouble* phi_ungrounding){/*{{{*/
++
++	int         numvertices = this->GetNumberOfVertices();
++	int        i,migration_style;
++	IssmDouble bed_hydro,yts;
++	IssmDouble rho_water,rho_ice,density;
++	IssmDouble* melting = xNew<IssmDouble>(numvertices);
++	IssmDouble* phi     = xNew<IssmDouble>(numvertices);
++	IssmDouble* h       = xNew<IssmDouble>(numvertices);
++	IssmDouble* s       = xNew<IssmDouble>(numvertices);
++	IssmDouble* b       = xNew<IssmDouble>(numvertices);
++	IssmDouble* r       = xNew<IssmDouble>(numvertices);
++
++	/*Recover info at the vertices: */
++	parameters->FindParam(&migration_style,GroundinglineMigrationEnum);
++	parameters->FindParam(&yts,ConstantsYtsEnum);
++	GetInputListOnVertices(&h[0],ThicknessEnum);
++	GetInputListOnVertices(&s[0],SurfaceEnum);
++	GetInputListOnVertices(&b[0],BaseEnum);
++	GetInputListOnVertices(&r[0],BedEnum);
++	GetInputListOnVertices(&phi[0],MaskGroundediceLevelsetEnum);
++	rho_water   = matpar->GetRhoWater();
++	rho_ice     = matpar->GetRhoIce();
++	density     = rho_ice/rho_water;
++
++	if(migration_style == ContactEnum){
++		for(i = 0;i < numvertices;i++) phi[i] = phi_ungrounding[vertices[i]->Pid()];
++		this->AddInput(MaskGroundediceLevelsetEnum,&phi[0],P1Enum);
++
++		/*go through vertices, and update inputs, considering them to be TriaVertex type: */
++		for(i = 0;i < numvertices;i++){
++			/*Ice shelf: if bed below bathymetry, impose it at the bathymetry and update surface, elso do nothing */
++			if(phi[i] >= 0.){
++					b[i]  = r[i];
++			}
++		}
++
++		/*Update inputs*/
++		this->AddInput(BaseEnum,&b[0],P1Enum);
++		return;
++	}
++
++	this->AddInput(MaskGroundediceLevelsetEnum,&phi[0],P1Enum);
++
++	/*go through vertices, and update inputs, considering them to be TriaVertex type: */
++	for(i=0;i<numvertices;i++){
++		/*Ice shelf: if bed below bathymetry, impose it at the bathymetry and update surface, elso do nothing */
++		if(phi[i]<=0.){
++			if(b[i]<=r[i]){ 
++				b[i]        = r[i];
++				s[i]        = b[i]+h[i];
++			}
++		}
++		/*Ice sheet: if hydrostatic bed above bathymetry, ice sheet starts to unground, elso do nothing */
++		/*Change only if AggressiveMigration or if the ice sheet is in contact with the ocean*/
++		else{ // phi>0
++			bed_hydro=-density*h[i];
++			if (bed_hydro>r[i]){
++				/*Unground only if the element is connected to the ice shelf*/
++				if(migration_style==AggressiveMigrationEnum || migration_style==SubelementMigrationEnum || migration_style==SubelementMigration2Enum){
++					s[i]        = (1-density)*h[i];
++					b[i]        = -density*h[i];
++				}
++				else if(migration_style==SoftMigrationEnum && phi_ungrounding[vertices[i]->Pid()]<0.){
++					s[i]        = (1-density)*h[i];
++					b[i]        = -density*h[i];
++				}
++				else{
++					if(migration_style!=SoftMigrationEnum) _error_("Error: migration should be Aggressive, Soft or Subelement");
++				}
++			}
++		}
++	}
++
++	/*Recalculate phi*/
++	for(i=0;i<numvertices;i++){
++		if(migration_style==SoftMigrationEnum){
++			bed_hydro=-density*h[i];
++			if(phi[i]<0. || bed_hydro<=r[i] || phi_ungrounding[vertices[i]->Pid()]<0.){
++				phi[i]=h[i]+r[i]/density;
++			}
++		}
++		else phi[i]=h[i]+r[i]/density;
++	}
++	this->AddInput(MaskGroundediceLevelsetEnum,&phi[0],P1Enum);
++
++	/*Update inputs*/
++	this->AddInput(SurfaceEnum,&s[0],P1Enum);
++	this->AddInput(BaseEnum,&b[0],P1Enum);
++
++	/*Delete*/
++	xDelete<IssmDouble>(melting);
++	xDelete<IssmDouble>(phi);
++	xDelete<IssmDouble>(r);
++	xDelete<IssmDouble>(b);
++	xDelete<IssmDouble>(s);
++	xDelete<IssmDouble>(h);
++
++}
++/*}}}*/
+ ElementVector* Element::NewElementVector(int approximation_enum){/*{{{*/
+ 	return new ElementVector(nodes,this->GetNumberOfNodes(),this->parameters,approximation_enum);
+ }
Index: /issm/oecreview/Archive/18296-19100/ISSM-18855-18856.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18855-18856.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18855-18856.diff	(revision 19102)
@@ -0,0 +1,20 @@
+Index: ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18855)
++++ ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18856)
+@@ -147,6 +147,7 @@
+ 	xDelete<double>(dz);
+ 	xDelete<double>(XU);
+ 	xDelete<double>(XL);
++	xDelete<double>(scaling_factors);
+ }
+ 
+ /*Cost function definition*/
+@@ -242,6 +243,7 @@
+ 	xDelete<IssmDouble>(Jlist);
+ 	xDelete<IssmDouble>(XU);
+ 	xDelete<IssmDouble>(XL);
++	xDelete<IssmDouble>(scaling_factors);
+ }
+ 
+ #else
Index: /issm/oecreview/Archive/18296-19100/ISSM-18856-18857.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18856-18857.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18856-18857.diff	(revision 19102)
@@ -0,0 +1,40 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18856)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18857)
+@@ -1225,29 +1225,15 @@
+ 	rho_ice     = matpar->GetRhoIce();
+ 	density     = rho_ice/rho_water;
+ 
+-	if(migration_style == ContactEnum){
+-		for(i = 0;i < numvertices;i++) phi[i] = phi_ungrounding[vertices[i]->Pid()];
+-		this->AddInput(MaskGroundediceLevelsetEnum,&phi[0],P1Enum);
+-
+-		/*go through vertices, and update inputs, considering them to be TriaVertex type: */
+-		for(i = 0;i < numvertices;i++){
+-			/*Ice shelf: if bed below bathymetry, impose it at the bathymetry and update surface, elso do nothing */
+-			if(phi[i] >= 0.){
+-					b[i]  = r[i];
+-			}
+-		}
+-
+-		/*Update inputs*/
+-		this->AddInput(BaseEnum,&b[0],P1Enum);
+-		return;
+-	}
+-
+-	this->AddInput(MaskGroundediceLevelsetEnum,&phi[0],P1Enum);
+-
+ 	/*go through vertices, and update inputs, considering them to be TriaVertex type: */
+ 	for(i=0;i<numvertices;i++){
++		/* Contact FS*/
++		if(migration_style == ContactEnum && phi_ungrounding[vertices[i]->Pid()]<10){
++			phi[i]=phi_ungrounding[vertices[i]->Pid()]; 
++			if(phi[i]>=0.) b[i]=r[i];
++		}
+ 		/*Ice shelf: if bed below bathymetry, impose it at the bathymetry and update surface, elso do nothing */
+-		if(phi[i]<=0.){
++		else if(phi[i]<=0.){
+ 			if(b[i]<=r[i]){ 
+ 				b[i]        = r[i];
+ 				s[i]        = b[i]+h[i];
Index: /issm/oecreview/Archive/18296-19100/ISSM-18857-18858.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18857-18858.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18857-18858.diff	(revision 19102)
@@ -0,0 +1,10 @@
+Index: ../trunk-jpl/test/NightlyRun/test437.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test437.m	(revision 18857)
++++ ../trunk-jpl/test/NightlyRun/test437.m	(revision 18858)
+@@ -1,4 +1,4 @@
+-md=triangle(model(),'../Exp/Square.exp',500000.);
++md=triangle(model(),'../Exp/Square.exp',300000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareThermal.par');
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18858-18859.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18858-18859.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18858-18859.diff	(revision 19102)
@@ -0,0 +1,4 @@
+Index: ../trunk-jpl/test/Archives/Archive437.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
Index: /issm/oecreview/Archive/18296-19100/ISSM-18859-18860.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18859-18860.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18859-18860.diff	(revision 19102)
@@ -0,0 +1,221 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18859)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18860)
+@@ -1546,37 +1546,47 @@
+ 
+ 	if(!IsOnBase()) return;
+ 
+-	/*Intermediaries*/
+-	IssmDouble* xyz_list = NULL;
+-	IssmDouble* xyz_list_base = NULL;
+-	IssmDouble  pressure,water_pressure,sigma_nn,viscosity,bed,base;
+-	IssmDouble  bed_normal[2];
+-	IssmDouble  epsilon[3]; /* epsilon=[exx,eyy,exy];*/
+-	IssmDouble  surface=0,value=0;
+-	bool grounded;
++	int approximation;
++	inputs->GetInputValue(&approximation,ApproximationEnum);
+ 
+-	/* Get node coordinates and dof list: */
+-	GetVerticesCoordinates(&xyz_list);
+-	GetVerticesCoordinatesBase(&xyz_list_base);
++	if(approximation==HOApproximationEnum || approximation==SSAApproximationEnum || approximation==SSAHOApproximationEnum){
++		for(int i=0;i<NUMVERTICES;i++){
++			vertexgrounded->SetValue(vertices[i]->Pid(),+9999.,INS_VAL);
++			vertexfloating->SetValue(vertices[i]->Pid(),+9999.,INS_VAL);
++		}
++	}
++	else{
++		/*Intermediaries*/
++		IssmDouble* xyz_list = NULL;
++		IssmDouble* xyz_list_base = NULL;
++		IssmDouble  pressure,water_pressure,sigma_nn,viscosity,bed,base;
++		IssmDouble  bed_normal[2];
++		IssmDouble  epsilon[3]; /* epsilon=[exx,eyy,exy];*/
++		IssmDouble  surface=0,value=0;
++		bool grounded;
+ 
+-	/*Retrieve all inputs we will be needing: */
+-	Input* pressure_input = inputs->GetInput(PressureEnum); _assert_(pressure_input);
+-	Input* base_input     = inputs->GetInput(BaseEnum);     _assert_(base_input);
+-	Input* bed_input      = inputs->GetInput(BedEnum);      _assert_(bed_input);
+-	Input* vx_input       = inputs->GetInput(VxEnum);       _assert_(vx_input);
+-	Input* vy_input       = inputs->GetInput(VyEnum);       _assert_(vy_input);
++		/* Get node coordinates and dof list: */
++		GetVerticesCoordinates(&xyz_list);
++		GetVerticesCoordinatesBase(&xyz_list_base);
+ 
+-	/*Create gauss point in the middle of the basal edge*/
+-	Gauss* gauss=NewGaussBase(1);
+-	gauss->GaussPoint(0);
++		/*Retrieve all inputs we will be needing: */
++		Input* pressure_input = inputs->GetInput(PressureEnum); _assert_(pressure_input);
++		Input* base_input     = inputs->GetInput(BaseEnum);     _assert_(base_input);
++		Input* bed_input      = inputs->GetInput(BedEnum);      _assert_(bed_input);
++		Input* vx_input       = inputs->GetInput(VxEnum);       _assert_(vx_input);
++		Input* vy_input       = inputs->GetInput(VyEnum);       _assert_(vy_input);
+ 
+-	if(!IsFloating()){ 
+-		/*Check for basal force only if grounded and touching GL*/
+-		if(this->inputs->Min(MaskGroundediceLevelsetEnum)==0.){
++		/*Create gauss point in the middle of the basal edge*/
++		Gauss* gauss=NewGaussBase(1);
++		gauss->GaussPoint(0);
++
++		if(!IsFloating()){ 
++			/*Check for basal force only if grounded and touching GL*/
++			//		if(this->inputs->Min(MaskGroundediceLevelsetEnum)==0.){
+ 			this->StrainRateSSA(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
+ 			this->ViscosityFS(&viscosity,2,xyz_list,gauss,vx_input,vy_input,NULL);
+ 			pressure_input->GetInputValue(&pressure, gauss);
+-			base_input->GetInputValue(&base, gauss); _assert_(base<0.);
++			base_input->GetInputValue(&base, gauss); 
+ 
+ 			/*Compute Stress*/
+ 			IssmDouble sigma_xx=2.*viscosity*epsilon[0]-pressure;
+@@ -1600,25 +1610,22 @@
+ 			else                         grounded=false;
+ 		}
+ 		else{
+-			grounded=true;
++			/*Check for basal elevation if floating*/
++			base_input->GetInputValue(&base, gauss);
++			bed_input->GetInputValue(&bed, gauss);
++			if(base<bed) grounded=true;
++			else         grounded=false;
+ 		}
++		for(int i=0;i<NUMVERTICES;i++){
++			if(grounded) vertexgrounded->SetValue(vertices[i]->Pid(),+1.,INS_VAL);
++			else         vertexfloating->SetValue(vertices[i]->Pid(),+1.,INS_VAL);
++		}
++
++		/*clean up*/
++		delete gauss;
++		xDelete<IssmDouble>(xyz_list);
++		xDelete<IssmDouble>(xyz_list_base);
+ 	}
+-	else{
+-		/*Check for basal elevation if floating*/
+-		base_input->GetInputValue(&base, gauss);
+-		bed_input->GetInputValue(&bed, gauss);
+-		if (base<bed) grounded=true;
+-		else          grounded=false;
+-	}
+-	for(int i=0;i<NUMVERTICES;i++){
+-		if(grounded) vertexgrounded->SetValue(vertices[i]->Pid(),+1.,INS_VAL);
+-		else         vertexfloating->SetValue(vertices[i]->Pid(),+1.,INS_VAL);
+-	}
+-
+-	/*clean up*/
+-	delete gauss;
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(xyz_list_base);
+ }
+ /*}}}*/
+ bool       Tria::IsNodeOnShelfFromFlags(IssmDouble* flags){/*{{{*/
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18859)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18860)
+@@ -687,32 +687,40 @@
+ 
+ 	if(!IsOnBase()) return;
+ 
+-	/*Intermediaries*/
+-	IssmDouble* xyz_list = NULL;
+-	IssmDouble  pressure,water_pressure,sigma_nn,viscosity,bed,base;
+-	IssmDouble  bed_normal[3];
+-	IssmDouble  epsilon[6]; /* epsilon=[exx eyy ezz exy exz eyz];*/
+-	IssmDouble  surface=0,value=0;
+-	bool grounded;
++	int approximation;
++	inputs->GetInputValue(&approximation,ApproximationEnum);
++	if(approximation==HOApproximationEnum || approximation==SSAApproximationEnum || approximation==SSAHOApproximationEnum){
++		for(int i=0;i<NUMVERTICES;i++){
++			vertexgrounded->SetValue(vertices[i]->Pid(),+9999.,INS_VAL);
++			vertexfloating->SetValue(vertices[i]->Pid(),+9999.,INS_VAL);
++		}
++	}
++	else {
++		/*Intermediaries*/
++		IssmDouble* xyz_list = NULL;
++		IssmDouble  pressure,water_pressure,sigma_nn,viscosity,bed,base;
++		IssmDouble  bed_normal[3];
++		IssmDouble  epsilon[6]; /* epsilon=[exx eyy ezz exy exz eyz];*/
++		IssmDouble  surface=0,value=0;
++		bool grounded;
+ 
+-	/* Get node coordinates and dof list: */
+-	GetVerticesCoordinates(&xyz_list);
++		/* Get node coordinates and dof list: */
++		GetVerticesCoordinates(&xyz_list);
+ 
+-	/*Retrieve all inputs we will be needing: */
+-	Input* pressure_input = inputs->GetInput(PressureEnum); _assert_(pressure_input);
+-	Input* base_input     = inputs->GetInput(BaseEnum);     _assert_(base_input);
+-	Input* bed_input      = inputs->GetInput(BedEnum);      _assert_(bed_input);
+-	Input* vx_input       = inputs->GetInput(VxEnum);       _assert_(vx_input);
+-	Input* vy_input       = inputs->GetInput(VyEnum);       _assert_(vy_input);
+-	Input* vz_input       = inputs->GetInput(VzEnum);       _assert_(vz_input);
++		/*Retrieve all inputs we will be needing: */
++		Input* pressure_input = inputs->GetInput(PressureEnum); _assert_(pressure_input);
++		Input* base_input     = inputs->GetInput(BaseEnum);     _assert_(base_input);
++		Input* bed_input      = inputs->GetInput(BedEnum);      _assert_(bed_input);
++		Input* vx_input       = inputs->GetInput(VxEnum);       _assert_(vx_input);
++		Input* vy_input       = inputs->GetInput(VyEnum);       _assert_(vy_input);
++		Input* vz_input       = inputs->GetInput(VzEnum);       _assert_(vz_input);
+ 
+-	/*Create gauss point in the middle of the basal edge*/
+-	Gauss* gauss=NewGaussBase(1);
+-	gauss->GaussPoint(0);
++		/*Create gauss point in the middle of the basal edge*/
++		Gauss* gauss=NewGaussBase(1);
++		gauss->GaussPoint(0);
+ 
+-	if(!IsFloating()){ 
+-		/*Check for basal force only if grounded and touching GL*/
+-		if(this->inputs->Min(MaskGroundediceLevelsetEnum)==0.){
++		if(!IsFloating()){ 
++			/*Check for basal force only if grounded and touching GL*/
+ 			this->StrainRateFS(&epsilon[0],xyz_list,gauss,vx_input,vy_input,vz_input);
+ 			this->ViscosityFS(&viscosity,3,xyz_list,gauss,vx_input,vy_input,vz_input);
+ 			pressure_input->GetInputValue(&pressure, gauss);
+@@ -744,24 +752,21 @@
+ 			else                         grounded=false;
+ 		}
+ 		else{
+-			grounded=true;
++			/*Check for basal elevation if floating*/
++			base_input->GetInputValue(&base, gauss);
++			bed_input->GetInputValue(&bed, gauss);
++			if(base<bed) grounded=true;
++			else          grounded=false;
+ 		}
++		for(int i=0;i<NUMVERTICES;i++){
++			if(grounded) vertexgrounded->SetValue(vertices[i]->Pid(),+1.,INS_VAL);
++			else         vertexfloating->SetValue(vertices[i]->Pid(),+1.,INS_VAL);
++		}
++
++		/*clean up*/
++		delete gauss;
++		xDelete<IssmDouble>(xyz_list);
+ 	}
+-	else{
+-		/*Check for basal elevation if floating*/
+-		base_input->GetInputValue(&base, gauss);
+-		bed_input->GetInputValue(&bed, gauss);
+-		if (base<bed) grounded=true;
+-		else          grounded=false;
+-	}
+-	for(int i=0;i<NUMVERTICES;i++){
+-		if(grounded) vertexgrounded->SetValue(vertices[i]->Pid(),+1.,INS_VAL);
+-		else         vertexfloating->SetValue(vertices[i]->Pid(),+1.,INS_VAL);
+-	}
+-
+-	/*clean up*/
+-	delete gauss;
+-	xDelete<IssmDouble>(xyz_list);
+ }
+ /*}}}*/
+ int        Penta::ObjectEnum(void){/*{{{*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18860-18861.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18860-18861.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18860-18861.diff	(revision 19102)
@@ -0,0 +1,107 @@
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18860)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18861)
+@@ -716,6 +716,7 @@
+ 	SubelementMigrationEnum,
+ 	SubelementMigration2Enum,
+ 	ContactEnum,
++	GroundingOnlyEnum,
+ 	MaskGroundediceLevelsetEnum,
+ 	/*}}}*/
+ 	/*Gauss{{{*/
+Index: ../trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp	(revision 18860)
++++ ../trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp	(revision 18861)
+@@ -38,6 +38,7 @@
+ 		case AggressiveMigrationEnum:
+ 		case SubelementMigrationEnum:
+ 		case SubelementMigration2Enum:
++		case GroundingOnlyEnum:
+ 			/*Nothing additional to do here, MigrateGroundingLine takes care of everything*/
+ 			break;
+ 		default:
+@@ -80,21 +81,12 @@
+ 	vertexfloating->Assemble();
+ 	serial_vertexgrounded=vertexgrounded->ToMPISerial();
+ 	serial_vertexfloating=vertexfloating->ToMPISerial();
+-
+-	/*find vertices on GL */
+ 	for(int i=0;i<numberofvertices;i++){
+-		if(serial_vertexgrounded[i]==1. && serial_vertexfloating[i]==1.){
+-			phi[i]=0.;
+-		}
+-		else if(serial_vertexgrounded[i]==1.){
+-			phi[i]=1.;
+-		}
+-		else if(serial_vertexfloating[i]==1.){
+-			phi[i]=-1.;
+-		}
+-		else{
+-			phi[i]=9999.;
+-		}
++			if (serial_vertexgrounded[i]==1. && serial_vertexfloating[i]==1.) phi[i]=0.;
++			else if (serial_vertexgrounded[i]==1) phi[i]=1;
++			else if (serial_vertexfloating[i]==1) phi[i]=-1;
++			else if (serial_vertexgrounded[i]>10) phi[i]=9999;
++			else phi[i]=-9999;
+ 	}
+ 
+ 	/*free ressouces and return: */
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18860)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18861)
+@@ -1097,7 +1097,7 @@
+ 		if(this->inputs->Max(MaskGroundediceLevelsetEnum) > 0.) shelf=false;
+ 		else shelf=true;
+ 	}
+-	else if(migration_style==NoneEnum || migration_style==AggressiveMigrationEnum || migration_style==SoftMigrationEnum){ //Floating if all nodes are floating
++	else if(migration_style==NoneEnum || migration_style==AggressiveMigrationEnum || migration_style==SoftMigrationEnum || migration_style==GroundingOnlyEnum){ //Floating if all nodes are floating
+ 		if(this->inputs->Min(MaskGroundediceLevelsetEnum) > 0.) shelf=false;
+ 		else shelf=true;
+ 	}
+@@ -1232,6 +1232,7 @@
+ 			phi[i]=phi_ungrounding[vertices[i]->Pid()]; 
+ 			if(phi[i]>=0.) b[i]=r[i];
+ 		}
++		else if(migration_style == GroundingOnlyEnum && b[i]<r[i]) b[i]=r[i];
+ 		/*Ice shelf: if bed below bathymetry, impose it at the bathymetry and update surface, elso do nothing */
+ 		else if(phi[i]<=0.){
+ 			if(b[i]<=r[i]){ 
+@@ -1254,7 +1255,7 @@
+ 					b[i]        = -density*h[i];
+ 				}
+ 				else{
+-					if(migration_style!=SoftMigrationEnum) _error_("Error: migration should be Aggressive, Soft or Subelement");
++					if(migration_style!=SoftMigrationEnum && migration_style!=ContactEnum && migration_style!=GroundingOnlyEnum) _error_("Error: migration should be Aggressive, Soft, Subelement, Contact or GroundingOnly");
+ 				}
+ 			}
+ 		}
+Index: ../trunk-jpl/src/m/classes/groundingline.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/groundingline.py	(revision 18860)
++++ ../trunk-jpl/src/m/classes/groundingline.py	(revision 18861)
+@@ -36,7 +36,7 @@
+ 	#}}}
+ 	def checkconsistency(self,md,solution,analyses):    # {{{
+ 
+-		md = checkfield(md,'fieldname','groundingline.migration','values',['None','AggressiveMigration','SoftMigration','SubelementMigration','SubelementMigration2','Contact'])
++		md = checkfield(md,'fieldname','groundingline.migration','values',['None','AggressiveMigration','SoftMigration','SubelementMigration','SubelementMigration2','Contact','GroundingOnly'])
+ 
+ 		if not m.strcmp(self.migration,'None'):
+ 			if numpy.any(numpy.isnan(md.geometry.bed)):
+Index: ../trunk-jpl/src/m/classes/groundingline.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/groundingline.m	(revision 18860)
++++ ../trunk-jpl/src/m/classes/groundingline.m	(revision 18861)
+@@ -39,7 +39,7 @@
+ 		end % }}}
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+ 
+-			md = checkfield(md,'fieldname','groundingline.migration','values',{'None' 'AggressiveMigration' 'SoftMigration' 'SubelementMigration' 'SubelementMigration2' 'Contact' 'None'});
++			md = checkfield(md,'fieldname','groundingline.migration','values',{'None' 'AggressiveMigration' 'SoftMigration' 'SubelementMigration' 'SubelementMigration2' 'Contact' 'None' 'GroundingOnly'});
+ 
+ 			if ~strcmp(obj.migration,'None'),
+ 				if isnan(md.geometry.bed),
Index: /issm/oecreview/Archive/18296-19100/ISSM-18861-18862.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18861-18862.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18861-18862.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18861)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18862)
+@@ -348,6 +348,7 @@
+ 	xDelete<IssmDouble>(v);
+ 	xDelete<IssmDouble>(w);
+ 	xDelete<IssmDouble>(c);
++	xDelete<IssmDouble>(m);
+ 	xDelete<IssmDouble>(dlsf);
+ 	delete gauss;
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
Index: /issm/oecreview/Archive/18296-19100/ISSM-18862-18863.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18862-18863.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18862-18863.diff	(revision 19102)
@@ -0,0 +1,14 @@
+Index: ../trunk-jpl/test/NightlyRun/test437.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test437.m	(revision 18862)
++++ ../trunk-jpl/test/NightlyRun/test437.m	(revision 18863)
+@@ -50,8 +50,8 @@
+ 						'Enthalpy3','Temperature3','Waterfraction3','BasalMeltingRate3','Watercolumn3',...
+ 						'Enthalpy4','Temperature4','Waterfraction4','BasalMeltingRate4','Watercolumn4'};
+ field_tolerances={1.e-10,1.e-10,1.e-10,1.e-9,1.e-10,...
++						1.e-10,1.e-10,1.e-10,1.e-9,2.e-10,...
+ 						1.e-10,1.e-10,1.e-10,1.e-9,1.e-10,...
+-						1.e-10,1.e-10,1.e-10,1.e-9,1.e-10,...
+ 						1.e-10,1.e-10,1.e-10,1.e-9,1.e-10};
+ i1=1;	i2=ceil(t2/md.timestepping.time_step)+2;	i3=ceil(md.timestepping.final_time/(2.*md.timestepping.time_step));	i4=size(md.results.TransientSolution,2);
+ field_values={...
Index: /issm/oecreview/Archive/18296-19100/ISSM-18863-18864.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18863-18864.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18863-18864.diff	(revision 19102)
@@ -0,0 +1,206 @@
+Index: ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py
+===================================================================
+--- ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py	(revision 0)
++++ ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py	(revision 18864)
+@@ -0,0 +1,194 @@
++from netCDF4 import Dataset
++import numpy
++import time
++import collections
++from mesh2d import *
++from mesh3dprisms import *
++from results import *
++from os import path, remove
++
++def netCDFExp(md,filename):
++
++	#defining some sub-functions
++	#retriev the dimension tuple from a dictionnary
++	def GetDim(var,shape,i,istime):
++		output=[]
++		for dim in range(0,i):
++			if type(shape[0])==int:
++				try:
++					output=output+[str(DimDict[shape[dim]])]
++				except KeyError:
++					if (shape[dim])>1:
++						NewDim=NCData.createDimension(str(field),(shape[dim]))
++						DimDict[len(NewDim)]=str(field)
++						output=output+[str(DimDict[shape[dim]])]
++						print 'Defining dimension ' +str(shape[dim]) +' for '+str(field)
++			elif type(shape[0])==str:#dealling with a dictionnary
++				try:
++					output=[str(DimDict[numpy.shape(shape)[0]])]+['DictDim']
++				except KeyError:
++					NewDim=NCData.createDimension(str(field),numpy.shape(shape)[0])
++					DimDict[len(NewDim)]=str(field)
++					output=[str(DimDict[numpy.shape(dict.keys(var))[0]])]+['DictDim']
++					print 'Defining dimension ' +str(numpy.shape(shape)[0]) +' for '+str(field)
++				break
++		if istime:
++			output=output+['Time']
++		return tuple(output)
++	#============================================================================
++
++  #Define the variables
++	def CreateVar(var,istime,*step_args):
++		#grab type
++		try:
++			val_type=str(var.dtype)
++		except AttributeError:
++			val_type=type(var)
++		#grab dimension
++		try:
++			val_shape=dict.keys(var)
++		except TypeError:
++			val_shape=numpy.shape(var)
++
++		val_dim=numpy.shape(val_shape)[0]
++		#Now define and fill up variable
++
++		#treating scalar string or bool as atribute
++		if val_type==str or val_type==bool:
++			NCgroup.__setattr__(str(field), str(var))
++
++		#treating list as string table
++		elif val_type==list:
++			ncvar = NCgroup.createVariable(str(field),str,GetDim(var,val_shape,val_dim,istime))
++			for elt in range(0,val_dim):
++				try:
++					ncvar[elt] = var[elt]
++				except IndexError:
++					ncvar[0]= " "
++		#treating bool tables as string tables
++		elif val_type=='bool':
++			ncvar = NCgroup.createVariable(str(field),str,GetDim(var,val_shape,val_dim,istime))
++			for elt in range(0,val_shape[0]):
++				ncvar[elt] = str(var[elt])
++		#treating dictionaries as string tables of dim 2
++		elif val_type==collections.OrderedDict:
++			ncvar = NCgroup.createVariable(str(field),str,GetDim(var,val_shape,val_dim,istime))
++			for elt in range(0,val_dim):
++				ncvar[elt,0]=dict.keys(var)[elt]
++				ncvar[elt,1]=str(dict.values(var)[elt]) #converting to str to avoid potential problems
++		#Now dealing with numeric variables
++		else:
++			ncvar = NCgroup.createVariable(str(field),TypeDict[val_type],GetDim(var,val_shape,val_dim,istime))
++			
++			if istime:
++				last=step_args[0]
++				freq=step_args[1]
++				vartab=var
++				for time in range(freq-1,last,freq):
++					timevar=md.results.__dict__[supfield].__getitem__(time).__dict__[field]
++					#print 'Treating '+str(group)+'.'+str(supfield)+'.'+str(field)+' for time '+str(time)
++					vartab=numpy.column_stack((vartab,timevar))
++				print numpy.shape(ncvar)
++				ncvar[:,:]=vartab
++			else:
++				try:
++					nan_val=numpy.isnan(var)
++					if nan_val.all():
++						ncvar [:] = 'NaN'
++					else:
++						ncvar[:] = var
++				except TypeError: #type does not accept nan, get vallue of the variable
++					ncvar[:] = var
++	#============================================================================
++	
++	#Now going on Real treatment
++	if path.exists(filename):
++		print ('File {} allready exist'.format(filename))
++		newname=raw_input('Give a new name or "delete" to replace: ')
++		if newname=='delete':
++			remove(filename)
++		else:
++			print ('New file name is {}'.format(newname))
++			filename=newname
++			
++	NCData=Dataset(filename, 'w', format='NETCDF4')
++	NCData.description = 'Results for run' + md.miscellaneous.name
++	NCData.history = 'Created ' + time.ctime(time.time())
++
++	#gather geometry and timestepping as dimensions
++	Duration=md.timestepping.final_time-md.timestepping.start_time
++	if Duration>0 and md.timestepping.time_step*md.settings.output_frequency>0:
++		StepNum=Duration/(md.timestepping.time_step*md.settings.output_frequency)
++	else:
++		StepNum=1
++		
++	EltNum=NCData.createDimension('EltNum',md.mesh.numberofelements)
++	VertNum=NCData.createDimension('VertNum',md.mesh.numberofvertices)
++	VertperElt=NCData.createDimension('VertperElt',numpy.shape(md.mesh.elements)[1])
++	if type(md.mesh) is mesh2d:
++		DimNum=NCData.createDimension('DimNum',2)
++	elif type(md.mesh) is mesh3dprisms:
++		DimNum=NCData.createDimension('DimNum',3)
++	else:
++		print 'I can not get the Dimension of the problem'
++	EdgeNum=NCData.createDimension('EdgeNum',md.mesh.numberofedges)
++	Time=NCData.createDimension('Time',StepNum)
++	SegNum=NCData.createDimension('SegNum',numpy.shape(md.mesh.segmentmarkers)[0])
++	InvSteps=NCData.createDimension('InvSteps',md.inversion.nsteps)
++	DictDim=NCData.createDimension('DictDim',2)
++
++	DimDict = {len(EltNum):'EltNum',
++						 len(VertNum):'VertNum',
++						 len(VertperElt):'VertperElt',
++						 len(DimNum):'DimNum',
++						 len(EdgeNum):'EdgeNum',
++						 len(Time):'Time',
++						 len(SegNum):'SegNum',
++						 len(InvSteps):'InvSteps'}
++
++	TypeDict = {float:'f8',
++							'float64':'f8',
++							int:'i8',
++							'int64':'i8'}
++	
++	#get all model classes and create respective groups
++	groups=dict.keys(md.__dict__)
++	for group in groups:
++		NCgroup=NCData.createGroup(str(group))
++		#In each group gather the fields of the class
++		fields=dict.keys(md.__dict__[group].__dict__)
++
++		#Special treatment for the results
++		if str(group)=='results':
++			for supfield in fields:#looping on the different solutions
++				if type(md.results.__dict__[supfield])==list:#the solution have several timestep
++					#get last timesteps and output frequency
++					last_step = numpy.size(md.results.__dict__[supfield])
++					step_freq = md.settings.output_frequency
++					#grab first time step
++					subfields=dict.keys(md.results.__dict__[supfield].__getitem__(0).__dict__)
++					for field in subfields:
++#						print 'Treating '+str(group)+'.'+str(supfield)+'.'+str(field)+' for time '+str(0)
++						if str(field)!='errlog' and str(field)!='outlog' and str(field)!='SolutionType':
++							Var=md.results.__dict__[supfield].__getitem__(0).__dict__[field]
++							CreateVar(Var,True,last_step,step_freq)
++#							print 'Treating '+str(group)+'.'+str(supfield)+'.'+str(field)+' for time '+str(0)
++					
++				elif type(md.results.__dict__[supfield])==results:#only one timestep
++					subfields=dict.keys(md.results.__dict__[supfield].__dict__)
++					for field in subfields:
++						if str(field)!='errlog' and str(field)!='outlog' and str(field)!='SolutionType':
++							Var=md.results.__dict__[supfield].__dict__[field]
++							CreateVar(Var,False)
++#							print 'Treating '+str(group)+'.'+str(supfield)+'.'+str(field)
++				else:
++					print 'Result format not suported'
++		else:
++			
++			for field in fields:
++#				print 'Treating ' +str(group)+'.'+str(field)
++				Var=md.__dict__[group].__dict__[field]
++				CreateVar(Var,False)
++	NCData.close()
++
++
+
+Property changes on: ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18864-18865.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18864-18865.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18864-18865.diff	(revision 19102)
@@ -0,0 +1,45 @@
+Index: ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py
+===================================================================
+--- ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py	(revision 18864)
++++ ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py	(revision 18865)
+@@ -85,11 +85,14 @@
+ 				freq=step_args[1]
+ 				vartab=var
+ 				for time in range(freq-1,last,freq):
+-					timevar=md.results.__dict__[supfield].__getitem__(time).__dict__[field]
+-					#print 'Treating '+str(group)+'.'+str(supfield)+'.'+str(field)+' for time '+str(time)
+-					vartab=numpy.column_stack((vartab,timevar))
+-				print numpy.shape(ncvar)
+-				ncvar[:,:]=vartab
++					if time!=0:
++						timevar=md.results.__dict__[supfield].__getitem__(time).__dict__[field]
++#						print 'Treating '+str(group)+'.'+str(supfield)+'.'+str(field)+' for time '+str(time)
++						vartab=numpy.column_stack((vartab,timevar))
++				try:
++					ncvar[:,:]=vartab[:,:]
++				except ValueError:
++					ncvar[:]=vartab.T[:]
+ 			else:
+ 				try:
+ 					nan_val=numpy.isnan(var)
+@@ -168,19 +171,17 @@
+ 					#grab first time step
+ 					subfields=dict.keys(md.results.__dict__[supfield].__getitem__(0).__dict__)
+ 					for field in subfields:
+-#						print 'Treating '+str(group)+'.'+str(supfield)+'.'+str(field)+' for time '+str(0)
+ 						if str(field)!='errlog' and str(field)!='outlog' and str(field)!='SolutionType':
+ 							Var=md.results.__dict__[supfield].__getitem__(0).__dict__[field]
+ 							CreateVar(Var,True,last_step,step_freq)
+-#							print 'Treating '+str(group)+'.'+str(supfield)+'.'+str(field)+' for time '+str(0)
+ 					
+ 				elif type(md.results.__dict__[supfield])==results:#only one timestep
+ 					subfields=dict.keys(md.results.__dict__[supfield].__dict__)
+ 					for field in subfields:
+ 						if str(field)!='errlog' and str(field)!='outlog' and str(field)!='SolutionType':
++#							print 'Treating '+str(group)+'.'+str(supfield)+'.'+str(field)
+ 							Var=md.results.__dict__[supfield].__dict__[field]
+ 							CreateVar(Var,False)
+-#							print 'Treating '+str(group)+'.'+str(supfield)+'.'+str(field)
+ 				else:
+ 					print 'Result format not suported'
+ 		else:
Index: /issm/oecreview/Archive/18296-19100/ISSM-18865-18866.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18865-18866.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18865-18866.diff	(revision 19102)
@@ -0,0 +1,82 @@
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18865)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18866)
+@@ -695,6 +695,7 @@
+ 		case SubelementMigrationEnum : return "SubelementMigration";
+ 		case SubelementMigration2Enum : return "SubelementMigration2";
+ 		case ContactEnum : return "Contact";
++		case GroundingOnlyEnum : return "GroundingOnly";
+ 		case MaskGroundediceLevelsetEnum : return "MaskGroundediceLevelset";
+ 		case GaussSegEnum : return "GaussSeg";
+ 		case GaussTriaEnum : return "GaussTria";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18865)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18866)
+@@ -628,11 +628,11 @@
+ 	      else if (strcmp(name,"StrainRatexz")==0) return StrainRatexzEnum;
+ 	      else if (strcmp(name,"StrainRateyy")==0) return StrainRateyyEnum;
+ 	      else if (strcmp(name,"StrainRateyz")==0) return StrainRateyzEnum;
+-	      else if (strcmp(name,"StrainRatezz")==0) return StrainRatezzEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"Divergence")==0) return DivergenceEnum;
++	      if (strcmp(name,"StrainRatezz")==0) return StrainRatezzEnum;
++	      else if (strcmp(name,"Divergence")==0) return DivergenceEnum;
+ 	      else if (strcmp(name,"MaxDivergence")==0) return MaxDivergenceEnum;
+ 	      else if (strcmp(name,"GiaCrossSectionShape")==0) return GiaCrossSectionShapeEnum;
+ 	      else if (strcmp(name,"GiadWdt")==0) return GiadWdtEnum;
+@@ -710,6 +710,7 @@
+ 	      else if (strcmp(name,"SubelementMigration")==0) return SubelementMigrationEnum;
+ 	      else if (strcmp(name,"SubelementMigration2")==0) return SubelementMigration2Enum;
+ 	      else if (strcmp(name,"Contact")==0) return ContactEnum;
++	      else if (strcmp(name,"GroundingOnly")==0) return GroundingOnlyEnum;
+ 	      else if (strcmp(name,"MaskGroundediceLevelset")==0) return MaskGroundediceLevelsetEnum;
+ 	      else if (strcmp(name,"GaussSeg")==0) return GaussSegEnum;
+ 	      else if (strcmp(name,"GaussTria")==0) return GaussTriaEnum;
+@@ -750,12 +751,12 @@
+ 	      else if (strcmp(name,"XY")==0) return XYEnum;
+ 	      else if (strcmp(name,"XYZ")==0) return XYZEnum;
+ 	      else if (strcmp(name,"Dense")==0) return DenseEnum;
+-	      else if (strcmp(name,"MpiDense")==0) return MpiDenseEnum;
+-	      else if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"Seq")==0) return SeqEnum;
++	      if (strcmp(name,"MpiDense")==0) return MpiDenseEnum;
++	      else if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum;
++	      else if (strcmp(name,"Seq")==0) return SeqEnum;
+ 	      else if (strcmp(name,"Mpi")==0) return MpiEnum;
+ 	      else if (strcmp(name,"Mumps")==0) return MumpsEnum;
+ 	      else if (strcmp(name,"Gsl")==0) return GslEnum;
+Index: ../trunk-jpl/src/m/enum/GroundingOnlyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/GroundingOnlyEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/GroundingOnlyEnum.m	(revision 18866)
+@@ -0,0 +1,11 @@
++function macro=GroundingOnlyEnum()
++%GROUNDINGONLYENUM - Enum of GroundingOnly
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=GroundingOnlyEnum()
++
++macro=StringToEnum('GroundingOnly');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18865)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18866)
+@@ -687,6 +687,7 @@
+ def SubelementMigrationEnum(): return StringToEnum("SubelementMigration")[0]
+ def SubelementMigration2Enum(): return StringToEnum("SubelementMigration2")[0]
+ def ContactEnum(): return StringToEnum("Contact")[0]
++def GroundingOnlyEnum(): return StringToEnum("GroundingOnly")[0]
+ def MaskGroundediceLevelsetEnum(): return StringToEnum("MaskGroundediceLevelset")[0]
+ def GaussSegEnum(): return StringToEnum("GaussSeg")[0]
+ def GaussTriaEnum(): return StringToEnum("GaussTria")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18866-18867.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18866-18867.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18866-18867.diff	(revision 19102)
@@ -0,0 +1,35 @@
+Index: ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py
+===================================================================
+--- ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py	(revision 18866)
++++ ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py	(revision 18867)
+@@ -59,7 +59,7 @@
+ 
+ 		#treating list as string table
+ 		elif val_type==list:
+-			ncvar = NCgroup.createVariable(str(field),str,GetDim(var,val_shape,val_dim,istime))
++			ncvar = NCgroup.createVariable(str(field),str,GetDim(var,val_shape,val_dim,istime),zlib=True)
+ 			for elt in range(0,val_dim):
+ 				try:
+ 					ncvar[elt] = var[elt]
+@@ -67,18 +67,18 @@
+ 					ncvar[0]= " "
+ 		#treating bool tables as string tables
+ 		elif val_type=='bool':
+-			ncvar = NCgroup.createVariable(str(field),str,GetDim(var,val_shape,val_dim,istime))
++			ncvar = NCgroup.createVariable(str(field),str,GetDim(var,val_shape,val_dim,istime),zlib=True)
+ 			for elt in range(0,val_shape[0]):
+ 				ncvar[elt] = str(var[elt])
+ 		#treating dictionaries as string tables of dim 2
+ 		elif val_type==collections.OrderedDict:
+-			ncvar = NCgroup.createVariable(str(field),str,GetDim(var,val_shape,val_dim,istime))
++			ncvar = NCgroup.createVariable(str(field),str,GetDim(var,val_shape,val_dim,istime),zlib=True)
+ 			for elt in range(0,val_dim):
+ 				ncvar[elt,0]=dict.keys(var)[elt]
+ 				ncvar[elt,1]=str(dict.values(var)[elt]) #converting to str to avoid potential problems
+ 		#Now dealing with numeric variables
+ 		else:
+-			ncvar = NCgroup.createVariable(str(field),TypeDict[val_type],GetDim(var,val_shape,val_dim,istime))
++			ncvar = NCgroup.createVariable(str(field),TypeDict[val_type],GetDim(var,val_shape,val_dim,istime),zlib=True)
+ 			
+ 			if istime:
+ 				last=step_args[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18867-18868.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18867-18868.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18867-18868.diff	(revision 19102)
@@ -0,0 +1,35 @@
+Index: ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18867)
++++ ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18868)
+@@ -94,13 +94,17 @@
+ 	_printf0_("\n");
+ 	_printf0_("Cost function f(x)   | Gradient norm |g(x)| |  List of contributions\n");
+ 	_printf0_("____________________________________________________________________\n");
+-	indic = 0; //no adjoint required
++
++	/*Initialize Gradient and cost function of M1QN3*/
++	indic = 4; //adjoint and gradient required
+ 	simul(&indic,&n,X,&f,G,izs,rzs,(void*)femmodel);
+-	double f1=f;
+ 
+-	indic = 4; //adjoint and gradient required
++	/*Estimation of the expected decrease in f during the first iteration*/
++	double df1=f;
++
++	/*Call M1QN3 solver*/
+ 	m1qn3_(costfuncion,prosca,&ctonbe_,&ctcabe_,
+-				&n,X,&f,G,&dxmin,&f1,
++				&n,X,&f,G,&dxmin,&df1,
+ 				&gttol,normtype,&impres,&io,imode,&omode,&niter,&nsim,iz,dz,&ndz,
+ 				&reverse,&indic,izs,rzs,(void*)femmodel);
+ 
+@@ -196,7 +200,7 @@
+ 	femmodel->CostFunctionx(pf,&Jlist,NULL);
+ 	_printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<"  |  ");
+ 
+-	if(indic==0){
++	if(*indic==0){
+ 		/*dry run, no gradient required*/
+ 
+ 		/*Retrieve objective functions independently*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18868-18869.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18868-18869.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18868-18869.diff	(revision 19102)
@@ -0,0 +1,28 @@
+Index: ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py
+===================================================================
+--- ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py	(revision 18868)
++++ ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py	(revision 18869)
+@@ -171,6 +171,7 @@
+ 					#grab first time step
+ 					subfields=dict.keys(md.results.__dict__[supfield].__getitem__(0).__dict__)
+ 					for field in subfields:
++						NCgroup.__setattr__('classtype', md.results.__dict__[supfield].__class__.__name__)
+ 						if str(field)!='errlog' and str(field)!='outlog' and str(field)!='SolutionType':
+ 							Var=md.results.__dict__[supfield].__getitem__(0).__dict__[field]
+ 							CreateVar(Var,True,last_step,step_freq)
+@@ -178,6 +179,7 @@
+ 				elif type(md.results.__dict__[supfield])==results:#only one timestep
+ 					subfields=dict.keys(md.results.__dict__[supfield].__dict__)
+ 					for field in subfields:
++						NCgroup.__setattr__('classtype', md.results.__dict__[supfield].__class__.__name__)
+ 						if str(field)!='errlog' and str(field)!='outlog' and str(field)!='SolutionType':
+ #							print 'Treating '+str(group)+'.'+str(supfield)+'.'+str(field)
+ 							Var=md.results.__dict__[supfield].__dict__[field]
+@@ -188,6 +190,7 @@
+ 			
+ 			for field in fields:
+ #				print 'Treating ' +str(group)+'.'+str(field)
++				NCgroup.__setattr__('classtype', md.__dict__[group].__class__.__name__)
+ 				Var=md.__dict__[group].__dict__[field]
+ 				CreateVar(Var,False)
+ 	NCData.close()
Index: /issm/oecreview/Archive/18296-19100/ISSM-18869-18870.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18869-18870.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18869-18870.diff	(revision 19102)
@@ -0,0 +1,54 @@
+Index: ../trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp	(revision 18869)
++++ ../trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp	(revision 18870)
+@@ -6,7 +6,7 @@
+ #include "../../shared/shared.h"
+ #include "../../toolkits/toolkits.h"
+ 
+-void GetVectorFromControlInputsx(Vector<IssmDouble>** pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,const char* data){
++void GetVectorFromControlInputsx(Vector<IssmDouble>** pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,const char* data,bool onsid){
+ 
+ 	int  num_controls;
+ 	int *control_type = NULL;
+@@ -22,7 +22,7 @@
+ 	for(int i=0;i<num_controls;i++){
+ 		for(int j=0;j<elements->Size();j++){
+ 			Element* element=(Element*)elements->GetObjectByOffset(j);
+-			element->GetVectorFromControlInputs(vector,control_type[i],i,data);
++			element->GetVectorFromControlInputs(vector,control_type[i],i,data,onsid);
+ 		}
+ 	}
+ 
+@@ -33,7 +33,7 @@
+ 	*pvector=vector;
+ }
+ 
+-void GetVectorFromControlInputsx( IssmDouble** pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, const char* data){
++void GetVectorFromControlInputsx( IssmDouble** pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, const char* data,bool onsid){
+ 
+ 	/*output: */
+ 	IssmDouble* vector=NULL;
+@@ -41,7 +41,7 @@
+ 	/*intermediary: */
+ 	Vector<IssmDouble>* vec_vector=NULL;
+ 
+-	GetVectorFromControlInputsx( &vec_vector, elements,nodes, vertices, loads, materials, parameters,data);
++	GetVectorFromControlInputsx( &vec_vector, elements,nodes, vertices, loads, materials, parameters,data,onsid);
+ 	vector=vec_vector->ToMPISerial();
+ 
+ 	/*Free ressources:*/
+Index: ../trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.h
+===================================================================
+--- ../trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.h	(revision 18869)
++++ ../trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.h	(revision 18870)
+@@ -7,7 +7,7 @@
+ #include "../../classes/classes.h"
+ 
+ /* local prototypes: */
+-void	GetVectorFromControlInputsx( Vector<IssmDouble>** pvector, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,const char* data="value");
+-void	GetVectorFromControlInputsx( IssmDouble** pvector, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,const char* data="value");
++void	GetVectorFromControlInputsx( Vector<IssmDouble>** pvector, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,const char* data="value",bool onsid=false);
++void	GetVectorFromControlInputsx( IssmDouble** pvector, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,const char* data="value",bool onsid=false);
+ 
+ #endif  /* _GETVECTORFROMCONTROLINPUTSXX_H */
Index: /issm/oecreview/Archive/18296-19100/ISSM-18870-18871.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18870-18871.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18870-18871.diff	(revision 19102)
@@ -0,0 +1,79 @@
+Index: ../trunk-jpl/src/c/classes/IndependentObject.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/IndependentObject.cpp	(revision 18870)
++++ ../trunk-jpl/src/c/classes/IndependentObject.cpp	(revision 18871)
+@@ -69,14 +69,18 @@
+ } /*}}}*/
+ 
+ /*IndependentObject methods: */
+-void IndependentObject::FetchIndependent(IoModel* iomodel){/*{{{*/
++void IndependentObject::FetchIndependent(IoModel* iomodel,int* pXcount,IssmPDouble* X){ /*{{{*/
+ 
+ 	int my_rank;
+ 	FILE* fid=NULL;
++	int Xcount;
+ 
+ 	/*recover my_rank:*/
+ 	my_rank=IssmComm::GetRank();
+ 
++	/*recover Xcount if X is not NULL:*/
++	if(X)Xcount=*pXcount;
++
+ 	#ifdef _HAVE_ADOLC_ //cannot come here unless you are running AD mode, from DeclaredIndependents:
+ 
+ 	/*Branch according to the type of variable: */
+@@ -97,8 +101,14 @@
+ 		if(my_rank==0){
+ 			if(fread(&pscalar,sizeof(IssmPDouble),1,fid)!=1)_error_("could not read scalar ");
+ 
+-			/*Now, before we even broadcast this to other nodes, declare the scalar  as an independent variable!: */
+-			scalar<<=pscalar;
++			/*Now, before we even broadcast this to other nodes, declare the scalar  as an independent variable!. If we 
++			 *have been supplied an X vector, use it instead of what we just read: */
++			if(X){
++				scalar<<=X[Xcount];
++			}
++			else{
++				scalar<<=pscalar;
++			}
+ 		}
+ 
+ 		ISSM_MPI_Bcast(&scalar,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 
+@@ -112,6 +122,9 @@
+ 		iomodel->data[name]=scalar_slot;
+ 		iomodel->independents[name]=true;
+ 
++		/*increment offset into X vector, now that we have read 1 value:*/
++		Xcount++; *pXcount=Xcount;
++
+ 		//finally, record the number of independents:
+ 		this->numberofindependents=1;
+ 
+@@ -149,8 +162,14 @@
+ 			if(my_rank==0){  
+ 				if(fread(buffer,M*N*sizeof(IssmPDouble),1,fid)!=1) _error_("could not read matrix ");
+ 
+-				/*Now, before we even broadcast this to other nodes, declare the whole matrix as a independent variable!: */
+-				for (int i=0;i<M*N;++i) matrix[i]<<=buffer[i];  /*we use the <<= ADOLC overloaded operator to declare the independency*/
++				/*Now, before we even broadcast this to other nodes, declare the whole matrix as a independent variable!
++				 If we have been supplied an X vector, use it instead of what we just read: */
++				if(X){
++					for (int i=0;i<M*N;++i) matrix[i]<<=X[Xcount+i];  /*we use the <<= ADOLC overloaded operator to declare the independency*/
++				}
++				else{
++					for (int i=0;i<M*N;++i) matrix[i]<<=buffer[i];  /*we use the <<= ADOLC overloaded operator to declare the independency*/
++				}
+ 			}
+ 			ISSM_MPI_Bcast(matrix,M*N,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 
+ 
+@@ -164,6 +183,10 @@
+ 		iomodel->data[name]=matrix;
+ 		iomodel->independents[name]=true;
+ 
++			
++		/*increment offset into X vector, now that we have read M*N values:*/
++		Xcount+=M*N; *pXcount=Xcount;
++		
+ 		//Finally, record the number of independents created: 
+ 		this->numberofindependents=M*N;
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18871-18872.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18871-18872.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18871-18872.diff	(revision 19102)
@@ -0,0 +1,289 @@
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18871)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18872)
+@@ -42,11 +42,9 @@
+ /*}}}*/
+ 
+ /*Object constructors and destructor*/
+-FemModel::FemModel(int argc,char** argv,ISSM_MPI_Comm incomm){/*{{{*/
++FemModel::FemModel(int argc,char** argv,ISSM_MPI_Comm incomm,bool trace){/*{{{*/
+ 
+ 	/*configuration: */
+-	int* analyses=NULL;
+-	int  numanalyses;
+ 	int  solution_type;
+ 	int  ierr;
+ 
+@@ -76,11 +74,10 @@
+ 
+ 	/*Create femmodel from input files: */
+ 	profiler->Tag(StartInit);
+-	this->InitFromFiles(rootpath,binfilename,outbinfilename,petscfilename,lockfilename,solution_type);
++	this->InitFromFiles(rootpath,binfilename,outbinfilename,petscfilename,lockfilename,solution_type,trace,NULL);
+ 	profiler->Tag(FinishInit);
+ 
+ 	/*Free resources */
+-	xDelete<int>(analyses);
+ 	xDelete<char>(lockfilename);
+ 	xDelete<char>(binfilename);
+ 	xDelete<char>(outbinfilename);
+@@ -89,6 +86,20 @@
+ 
+ }
+ /*}}}*/
++FemModel::FemModel(char* rootpath, char* inputfilename, char* outputfilename, char* toolkitsfilename, char* lockfilename, ISSM_MPI_Comm incomm, int solution_type,IssmPDouble* X){ /*{{{*/
++
++	bool traceon=true;
++	
++	/*Store the communicator, but do not set it as a global variable, as this has already 
++	 * been done by the FemModel that called this copy constructor: */
++	this->comm=incomm;
++	this->SetStaticComm();
++
++	/*Create femmodel from input files, with trace activated: */
++	this->InitFromFiles(rootpath,inputfilename,outputfilename,toolkitsfilename,lockfilename,solution_type,traceon,X);
++
++}
++/*}}}*/
+ FemModel::~FemModel(){/*{{{*/
+ 
+ 	/*Intermediary*/
+@@ -130,7 +141,7 @@
+ 
+ }
+ /*}}}*/
+-void FemModel::InitFromFiles(char* rootpath, char* inputfilename, char* outputfilename, char* toolkitsfilename, char* lockfilename, const int in_solution_type){/*{{{*/
++void FemModel::InitFromFiles(char* rootpath, char* inputfilename, char* outputfilename, char* toolkitsfilename, char* lockfilename, const int in_solution_type,bool trace,IssmPDouble* X){/*{{{*/
+ 
+ 	/*intermediary*/
+ 	int         i;
+@@ -147,10 +158,9 @@
+ 	this->solution_type    = in_solution_type;
+ 	this->analysis_counter = nummodels-1;   //point to last analysis_type carried out.
+ 	this->results          = new Results(); //not initialized by CreateDataSets
+-
+ 	/*Open input file on cpu 0 and create IoModel */
+ 	if(my_rank==0) IOMODEL = pfopen0(inputfilename ,"rb");
+-	IoModel* iomodel = new IoModel(IOMODEL);
++	IoModel* iomodel = new IoModel(IOMODEL,trace,X);
+ 
+ 	/*Figure out what analyses are activated for this solution*/
+ 	SolutionAnalysesList(&this->analysis_type_list,&this->nummodels,iomodel,this->solution_type);
+@@ -187,12 +197,15 @@
+ 	if(my_rank==0) pfclose(IOMODEL,inputfilename);
+ 	pfclose(toolkitsoptionsfid,toolkitsfilename);
+ 
+-	/*Open output file once for all and add output file name and file descriptor to parameters*/
++	/*Open output file once for all and add output file descriptor to parameters*/
+ 	output_fid=pfopen(outputfilename,"wb");
++	this->parameters->SetParam(output_fid,OutputFilePointerEnum);
++	
++	/*Now save all of these file names into parameters, you never know when you might need them: */
++	this->parameters->AddObject(new StringParam(ToolkitsFileNameEnum,toolkitsfilename));
++	this->parameters->AddObject(new StringParam(RootPathEnum,rootpath));
++	this->parameters->AddObject(new StringParam(InputFileNameEnum,inputfilename));
+ 	this->parameters->AddObject(new StringParam(OutputFileNameEnum,outputfilename));
+-	this->parameters->SetParam(output_fid,OutputFilePointerEnum);
+-
+-	/*Save lock file name for later: */
+ 	this->parameters->AddObject(new StringParam(LockFileNameEnum,lockfilename));
+ 
+ 	/*Clean up*/
+@@ -740,26 +753,35 @@
+ 			}
+ 		}
+ 		else{
+-			switch(output_enum){
++			/*last chance for the output definition, if the enum is one of Outputdefinition[1-10]Enum:*/
++			if(output_enum>=Outputdefinition1Enum && output_enum <=Outputdefinition10Enum){
++				double_result = OutputDefinitionsResponsex(this,output_enum);
++				if(save_results){
++					results->AddResult(new GenericExternalResult<IssmPDouble>(results->Size()+1,output_string,reCast<IssmPDouble>(double_result),step,time));
++					continue;
++				}
++			}
++			else{
++				switch(output_enum){
+ 
+-				/*Scalar output*/
+-				case DivergenceEnum:               this->Divergencex(&double_result);               break;
+-				case MaxDivergenceEnum:            this->MaxDivergencex(&double_result);            break;
+-				case IceVolumeEnum:                this->IceVolumex(&double_result);                break;
+-				case IceVolumeAboveFloatationEnum: this->IceVolumeAboveFloatationx(&double_result); break;
+-				case MinVelEnum:                   this->MinVelx(&double_result);                   break;
+-				case MaxVelEnum:                   this->MaxVelx(&double_result);                   break;
+-				case MinVxEnum:                    this->MinVxx(&double_result);                    break;
+-				case MaxVxEnum:                    this->MaxVxx(&double_result);                    break;
+-				case MaxAbsVxEnum:                 this->MaxAbsVxx(&double_result);                 break;
+-				case MinVyEnum:                    this->MinVyx(&double_result);                    break;
+-				case MaxVyEnum:                    this->MaxVyx(&double_result);                    break;
+-				case MaxAbsVyEnum:                 this->MaxAbsVyx(&double_result);                 break;
+-				case MinVzEnum:                    this->MinVzx(&double_result);                    break;
+-				case MaxVzEnum:                    this->MaxVzx(&double_result);                    break;
+-				case MaxAbsVzEnum:                 this->MaxAbsVzx(&double_result);                 break;
+-				case MassFluxEnum:                 this->MassFluxx(&double_result);                 break;
+-				case TotalSmbEnum:                 this->TotalSmbx(&double_result);                 break;
++					/*Scalar output*/
++					case DivergenceEnum:               this->Divergencex(&double_result);               break;
++					case MaxDivergenceEnum:            this->MaxDivergencex(&double_result);            break;
++					case IceVolumeEnum:                this->IceVolumex(&double_result);                break;
++					case IceVolumeAboveFloatationEnum: this->IceVolumeAboveFloatationx(&double_result); break;
++					case MinVelEnum:                   this->MinVelx(&double_result);                   break;
++					case MaxVelEnum:                   this->MaxVelx(&double_result);                   break;
++					case MinVxEnum:                    this->MinVxx(&double_result);                    break;
++					case MaxVxEnum:                    this->MaxVxx(&double_result);                    break;
++					case MaxAbsVxEnum:                 this->MaxAbsVxx(&double_result);                 break;
++					case MinVyEnum:                    this->MinVyx(&double_result);                    break;
++					case MaxVyEnum:                    this->MaxVyx(&double_result);                    break;
++					case MaxAbsVyEnum:                 this->MaxAbsVyx(&double_result);                 break;
++					case MinVzEnum:                    this->MinVzx(&double_result);                    break;
++					case MaxVzEnum:                    this->MaxVzx(&double_result);                    break;
++					case MaxAbsVzEnum:                 this->MaxAbsVzx(&double_result);                 break;
++					case MassFluxEnum:                 this->MassFluxx(&double_result);                 break;
++					case TotalSmbEnum:                 this->TotalSmbx(&double_result);                 break;
+ 
+ 			   /*Scalar control output*/
+ 				case SurfaceAbsVelMisfitEnum:       SurfaceAbsVelMisfitx(&double_result,elements,nodes,vertices,loads,materials,parameters);        break;
+@@ -777,69 +799,71 @@
+ 				case BalancethicknessMisfitEnum:    BalancethicknessMisfitx(&double_result);                                                        break;
+ 				case SurfaceAbsMisfitEnum:          SurfaceAbsMisfitx(&double_result); break;
+ 
+-			   /*Vector */
+-				default:
++				   /*Vector */
++					default:
+ 
+-					/*Vector layout*/
+-					int interpolation,nodesperelement,size;
+-					int rank_interpolation=-1,rank_nodesperelement=-1;
++						/*Vector layout*/
++						int interpolation,nodesperelement,size;
++						int rank_interpolation=-1,rank_nodesperelement=-1;
+ 
+-					/*Get interpolation (and compute input if necessary)*/
+-					for(int j=0;j<elements->Size();j++){
+-						Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(j));
+-						element->ResultInterpolation(&rank_interpolation,&rank_nodesperelement,output_enum);
+-					}
+-
+-					/*Broadcast for cpus that do not have any elements*/
+-					ISSM_MPI_Reduce(&rank_interpolation,&interpolation,1,ISSM_MPI_INT,ISSM_MPI_MAX,0,IssmComm::GetComm());
+-					ISSM_MPI_Reduce(&rank_nodesperelement,&nodesperelement,1,ISSM_MPI_INT,ISSM_MPI_MAX,0,IssmComm::GetComm());
+-					ISSM_MPI_Bcast(&interpolation,1,ISSM_MPI_INT,0,IssmComm::GetComm());
+-					ISSM_MPI_Bcast(&nodesperelement,1,ISSM_MPI_INT,0,IssmComm::GetComm());
+-
+-					if(results_on_nodes){
+-
+-						/*Allocate matrices*/
+-						int         nbe       = this->elements->NumberOfElements();
+-						IssmDouble* values    = xNewZeroInit<IssmDouble>(nbe*nodesperelement);
+-						IssmDouble* allvalues = xNew<IssmDouble>(nbe*nodesperelement);
+-
+-						/*Fill-in matrix*/
++						/*Get interpolation (and compute input if necessary)*/
+ 						for(int j=0;j<elements->Size();j++){
+ 							Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(j));
+-							element->ResultToPatch(values,nodesperelement,output_enum);
++							element->ResultInterpolation(&rank_interpolation,&rank_nodesperelement,output_enum);
+ 						}
+ 
+-						/*Gather from all cpus*/
+-						ISSM_MPI_Allreduce((void*)values,(void*)allvalues,nbe*nodesperelement,ISSM_MPI_PDOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
+-						xDelete<IssmDouble>(values);
++						/*Broadcast for cpus that do not have any elements*/
++						ISSM_MPI_Reduce(&rank_interpolation,&interpolation,1,ISSM_MPI_INT,ISSM_MPI_MAX,0,IssmComm::GetComm());
++						ISSM_MPI_Reduce(&rank_nodesperelement,&nodesperelement,1,ISSM_MPI_INT,ISSM_MPI_MAX,0,IssmComm::GetComm());
++						ISSM_MPI_Bcast(&interpolation,1,ISSM_MPI_INT,0,IssmComm::GetComm());
++						ISSM_MPI_Bcast(&nodesperelement,1,ISSM_MPI_INT,0,IssmComm::GetComm());
+ 
+-						if(save_results)results->AddResult(new GenericExternalResult<IssmDouble*>(results->Size()+1,output_enum,allvalues,nbe,nodesperelement,step,time));
+-						xDelete<IssmDouble>(allvalues);
++						if(results_on_nodes){
+ 
+-					}
+-					else{
++							/*Allocate matrices*/
++							int         nbe       = this->elements->NumberOfElements();
++							IssmDouble* values    = xNewZeroInit<IssmDouble>(nbe*nodesperelement);
++							IssmDouble* allvalues = xNew<IssmDouble>(nbe*nodesperelement);
+ 
+-						/*Allocate vector depending on interpolation*/
+-						switch(interpolation){
+-							case P0Enum: size = this->elements->NumberOfElements(); break;
+-							case P1Enum: size = this->vertices->NumberOfVertices(); break;
+-							default:     _error_("Interpolation "<<EnumToStringx(interpolation)<<" not supported yet");
++							/*Fill-in matrix*/
++							for(int j=0;j<elements->Size();j++){
++								Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(j));
++								element->ResultToPatch(values,nodesperelement,output_enum);
++							}
+ 
++							/*Gather from all cpus*/
++							ISSM_MPI_Allreduce((void*)values,(void*)allvalues,nbe*nodesperelement,ISSM_MPI_PDOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
++							xDelete<IssmDouble>(values);
++
++							if(save_results)results->AddResult(new GenericExternalResult<IssmDouble*>(results->Size()+1,output_enum,allvalues,nbe,nodesperelement,step,time));
++							xDelete<IssmDouble>(allvalues);
++
+ 						}
+-						Vector<IssmDouble> *vector_result = new Vector<IssmDouble>(size);
++						else{
+ 
+-						/*Fill in vector*/
+-						for(int j=0;j<elements->Size();j++){
+-							Element* element=(Element*)elements->GetObjectByOffset(j);
+-							element->ResultToVector(vector_result,output_enum);
++							/*Allocate vector depending on interpolation*/
++							switch(interpolation){
++								case P0Enum: size = this->elements->NumberOfElements(); break;
++								case P1Enum: size = this->vertices->NumberOfVertices(); break;
++								default:     _error_("Interpolation "<<EnumToStringx(interpolation)<<" not supported yet");
++
++							}
++							Vector<IssmDouble> *vector_result = new Vector<IssmDouble>(size);
++
++							/*Fill in vector*/
++							for(int j=0;j<elements->Size();j++){
++								Element* element=(Element*)elements->GetObjectByOffset(j);
++								element->ResultToVector(vector_result,output_enum);
++							}
++							vector_result->Assemble();
++
++							if(save_results)results->AddResult(new GenericExternalResult<Vector<IssmDouble>*>(results->Size()+1,output_enum,vector_result,step,time));
+ 						}
+-						vector_result->Assemble();
++						isvec = true;
++						break;
++				}
++			}
+ 
+-						if(save_results)results->AddResult(new GenericExternalResult<Vector<IssmDouble>*>(results->Size()+1,output_enum,vector_result,step,time));
+-					}
+-					isvec = true;
+-					break;
+-			}
+ 		}
+ 
+ 		/*Add result to Results*/
+Index: ../trunk-jpl/src/c/classes/FemModel.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.h	(revision 18871)
++++ ../trunk-jpl/src/c/classes/FemModel.h	(revision 18872)
+@@ -45,13 +45,14 @@
+ 		ISSM_MPI_Comm        comm;                  //communicator for this particular model
+ 
+ 		/*constructors, destructors: */
+-		FemModel(int argc,char** argv,ISSM_MPI_Comm comm_init);
++		FemModel(int argc,char** argv,ISSM_MPI_Comm comm_init,bool trace=false);
++		FemModel(char* rootpath, char* inputfilename, char* outputfilename, char* toolkitsfilename, char* lockfilename, ISSM_MPI_Comm incomm, int solution_type,IssmPDouble* X);
+ 		~FemModel();
+ 
+ 		/*Methods:*/
+ 		void Echo();
+ 		FemModel* copy();
+-		void InitFromFiles(char* rootpath, char* inputfilename, char* outputfilename, char* petscfilename, char* lockfilename, const int solution_type);
++		void InitFromFiles(char* rootpath, char* inputfilename, char* outputfilename, char* petscfilename, char* lockfilename, const int solution_type,bool trace,IssmPDouble* X=NULL);
+ 		void SolutionAnalysesList(int** panalyses,int* pnumanalyses,IoModel* iomodel,int solutiontype);
+ 		void CleanUp(void);
+ 		void Solve(void);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18872-18873.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18872-18873.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18872-18873.diff	(revision 19102)
@@ -0,0 +1,131 @@
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 18872)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 18873)
+@@ -29,16 +29,18 @@
+ 				/*massfluxatgate variables: */
+ 				int          numgates;
+ 				char       **gatenames               = NULL;
++				int        *gatedefinitionenums      = NULL;
+ 				IssmDouble **gatesegments            = NULL;
+ 				int         *gatesegments_M          = NULL;
+ 
+ 
+ 				/*Fetch segments and names: */
+ 				iomodel->FetchMultipleData(&gatenames,&numgates,MassfluxatgateNameEnum);
++				iomodel->FetchMultipleData(&gatedefinitionenums,&numgates,MassfluxatgateDefinitionenumEnum);
+ 				iomodel->FetchMultipleData(&gatesegments,&gatesegments_M,NULL,&numgates,MassfluxatgateSegmentsEnum);
+ 
+ 				for(j=0;j<numgates;j++){
+-					output_definitions->AddObject(new Massfluxatgate<IssmDouble>(gatenames[j],gatesegments_M[j],gatesegments[j]));
++					output_definitions->AddObject(new Massfluxatgate<IssmDouble>(gatenames[j],gatedefinitionenums[j],gatesegments_M[j],gatesegments[j]));
+ 				}
+ 				/*Free ressources:*/
+ 				for(j=0;j<numgates;j++){
+@@ -48,6 +50,7 @@
+ 				xDelete<char*>(gatenames);
+ 				xDelete<IssmDouble*>(gatesegments);
+ 				xDelete<int>(gatesegments_M);
++				xDelete<int>(gatedefinitionenums);
+ 				/*}}}*/
+ 			}
+ 			else if (output_definition_enums[i]==MisfitEnum){
+@@ -56,6 +59,7 @@
+ 				/*misfit variables: */
+ 				int          nummisfits;
+ 				char**       misfit_name_s             = NULL;    
++				int*         misfit_definitionenums_s             = NULL;    
+ 				int*         misfit_model_enum_s        = NULL;
+ 				IssmDouble** misfit_observation_s      = NULL;
+ 				int*         misfit_observation_enum_s  = NULL;
+@@ -69,6 +73,7 @@
+ 
+ 				/*Fetch name, model_enum, observation, observation_enum, etc ... (see src/m/classes/misfit.m): */
+ 				iomodel->FetchMultipleData(&misfit_name_s,&nummisfits,MisfitNameEnum);
++				iomodel->FetchMultipleData(&misfit_definitionenums_s,&nummisfits,MisfitDefinitionenumEnum);
+ 				iomodel->FetchMultipleData(&misfit_model_enum_s,&nummisfits,MisfitModelEnumEnum);
+ 				iomodel->FetchMultipleData(&misfit_observation_s,&misfit_observation_M_s,&misfit_observation_N_s,&nummisfits,MisfitObservationEnum);
+ 				iomodel->FetchMultipleData(&misfit_observation_enum_s,&nummisfits,MisfitObservationEnumEnum);
+@@ -79,7 +84,7 @@
+ 				for(j=0;j<nummisfits;j++){
+ 
+ 					/*First create a misfit object for that specific enum (misfit_model_enum_s[j]):*/
+-					output_definitions->AddObject(new Misfit(misfit_name_s[j],misfit_model_enum_s[j],misfit_observation_enum_s[j],misfit_timeinterpolation_s[j],misfit_weights_enum_s[j]));
++					output_definitions->AddObject(new Misfit(misfit_name_s[j],misfit_definitionenums_s[j],misfit_model_enum_s[j],misfit_observation_enum_s[j],misfit_timeinterpolation_s[j],misfit_weights_enum_s[j]));
+ 
+ 					/*Now, for this particular misfit object, make sure we plug into the elements: the observation, and the weights.*/
+ 					for(i=0;i<elements->Size();i++){
+@@ -119,17 +124,19 @@
+ 				/*masscon variables: */
+ 				int          nummasscons;
+ 				char**       masscon_name_s             = NULL;    
++				int*         masscon_definitionenum_s   = NULL;    
+ 				IssmDouble** masscon_levelset_s           = NULL;
+ 				int*         masscon_levelset_M_s    = NULL;
+ 				int*         masscon_levelset_N_s    = NULL;
+ 
+ 				/*Fetch name and levelset, etc ... (see src/m/classes/masscon.m): */
+ 				iomodel->FetchMultipleData(&masscon_name_s,&nummasscons,MassconNameEnum);
++				iomodel->FetchMultipleData(&masscon_definitionenum_s,&nummasscons,MassconDefinitionenumEnum);
+ 				iomodel->FetchMultipleData(&masscon_levelset_s,&masscon_levelset_M_s,&masscon_levelset_N_s,&nummasscons,MassconLevelsetEnum);
+ 				for(j=0;j<nummasscons;j++){
+ 
+ 					/*Create a masscon object: */
+-					output_definitions->AddObject(new Masscon(masscon_name_s[j],masscon_levelset_s[j],masscon_levelset_M_s[j]));
++					output_definitions->AddObject(new Masscon(masscon_name_s[j],masscon_definitionenum_s[j],masscon_levelset_s[j],masscon_levelset_M_s[j]));
+ 
+ 				}
+ 
+@@ -145,6 +152,7 @@
+ 				xDelete<IssmDouble*>(masscon_levelset_s);
+ 				xDelete<int>(masscon_levelset_M_s);
+ 				xDelete<int>(masscon_levelset_N_s);
++				xDelete<int>(masscon_definitionenum_s);
+ 				/*}}}*/
+ 			}
+ 			else if (output_definition_enums[i]==MassconaxpbyEnum){
+@@ -152,6 +160,7 @@
+ 				
+ 				/*masscon variables: */
+ 				char**       masscon_name_s             = NULL;    
++				int*         masscon_definitionenum_s             = NULL;    
+ 				char**       masscon_namex_s             = NULL;    
+ 				char**       masscon_namey_s             = NULL;    
+ 				IssmDouble*  masscon_alpha_s     = NULL;
+@@ -160,6 +169,7 @@
+ 
+ 				/*Fetch names and multiplicators, etc ... (see src/m/classes/masscon_axpby.m): */
+ 				iomodel->FetchMultipleData(&masscon_name_s,&num,MassconaxpbyNameEnum);
++				iomodel->FetchMultipleData(&masscon_definitionenum_s,&num,MassconaxpbyDefinitionenumEnum);
+ 				iomodel->FetchMultipleData(&masscon_namex_s,&num,MassconaxpbyNamexEnum);
+ 				iomodel->FetchMultipleData(&masscon_namey_s,&num,MassconaxpbyNameyEnum);
+ 				iomodel->FetchMultipleData(&masscon_alpha_s,&num,MassconaxpbyAlphaEnum);
+@@ -167,7 +177,7 @@
+ 				for(j=0;j<num;j++){
+ 
+ 					/*Create a masscon axpyb object: */
+-					output_definitions->AddObject(new Massconaxpby(masscon_name_s[j],masscon_namex_s[j],masscon_namey_s[j],masscon_alpha_s[j],masscon_beta_s[j]));
++					output_definitions->AddObject(new Massconaxpby(masscon_name_s[j],masscon_definitionenum_s[j],masscon_namex_s[j],masscon_namey_s[j],masscon_alpha_s[j],masscon_beta_s[j]));
+ 
+ 				}
+ 
+@@ -181,6 +191,7 @@
+ 				xDelete<char*>(masscon_name_s);
+ 				xDelete<char*>(masscon_namex_s);
+ 				xDelete<char*>(masscon_namey_s);
++				xDelete<int>(masscon_definitionenum_s);
+ 				xDelete<IssmDouble>(masscon_alpha_s);
+ 				xDelete<IssmDouble>(masscon_beta_s);
+ 				/*}}}*/
+Index: ../trunk-jpl/src/c/classes/Definition.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Definition.h	(revision 18872)
++++ ../trunk-jpl/src/c/classes/Definition.h	(revision 18873)
+@@ -12,6 +12,7 @@
+ 	public:
+ 		virtual       ~Definition(){};
+ 		virtual char*  Name()=0;
++		virtual int    DefinitionEnum()=0;
+ 		virtual IssmDouble  Response(FemModel*)=0;
+ 
+ };
Index: /issm/oecreview/Archive/18296-19100/ISSM-18873-18874.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18873-18874.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18873-18874.diff	(revision 19102)
@@ -0,0 +1,323 @@
+Index: ../trunk-jpl/src/m/enum/MassfluxatgateDefinitionenumEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MassfluxatgateDefinitionenumEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MassfluxatgateDefinitionenumEnum.m	(revision 18874)
+@@ -0,0 +1,11 @@
++function macro=MassfluxatgateDefinitionenumEnum()
++%MASSFLUXATGATEDEFINITIONENUMENUM - Enum of MassfluxatgateDefinitionenum
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MassfluxatgateDefinitionenumEnum()
++
++macro=StringToEnum('MassfluxatgateDefinitionenum');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition5Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition5Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition5Enum.m	(revision 18874)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition5Enum()
++%OUTPUTDEFINITION5ENUM - Enum of Outputdefinition5
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition5Enum()
++
++macro=StringToEnum('Outputdefinition5');
+Index: ../trunk-jpl/src/m/enum/RootPathEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/RootPathEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/RootPathEnum.m	(revision 18874)
+@@ -0,0 +1,11 @@
++function macro=RootPathEnum()
++%ROOTPATHENUM - Enum of RootPath
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=RootPathEnum()
++
++macro=StringToEnum('RootPath');
+Index: ../trunk-jpl/src/m/enum/InputFileNameEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/InputFileNameEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/InputFileNameEnum.m	(revision 18874)
+@@ -0,0 +1,11 @@
++function macro=InputFileNameEnum()
++%INPUTFILENAMEENUM - Enum of InputFileName
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=InputFileNameEnum()
++
++macro=StringToEnum('InputFileName');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition6Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition6Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition6Enum.m	(revision 18874)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition6Enum()
++%OUTPUTDEFINITION6ENUM - Enum of Outputdefinition6
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition6Enum()
++
++macro=StringToEnum('Outputdefinition6');
+Index: ../trunk-jpl/src/m/enum/MassconaxpbyDefinitionenumEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MassconaxpbyDefinitionenumEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MassconaxpbyDefinitionenumEnum.m	(revision 18874)
+@@ -0,0 +1,11 @@
++function macro=MassconaxpbyDefinitionenumEnum()
++%MASSCONAXPBYDEFINITIONENUMENUM - Enum of MassconaxpbyDefinitionenum
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MassconaxpbyDefinitionenumEnum()
++
++macro=StringToEnum('MassconaxpbyDefinitionenum');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition1Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition1Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition1Enum.m	(revision 18874)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition1Enum()
++%OUTPUTDEFINITION1ENUM - Enum of Outputdefinition1
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition1Enum()
++
++macro=StringToEnum('Outputdefinition1');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition7Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition7Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition7Enum.m	(revision 18874)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition7Enum()
++%OUTPUTDEFINITION7ENUM - Enum of Outputdefinition7
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition7Enum()
++
++macro=StringToEnum('Outputdefinition7');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition2Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition2Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition2Enum.m	(revision 18874)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition2Enum()
++%OUTPUTDEFINITION2ENUM - Enum of Outputdefinition2
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition2Enum()
++
++macro=StringToEnum('Outputdefinition2');
+Index: ../trunk-jpl/src/m/enum/ToolkitsFileNameEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/ToolkitsFileNameEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/ToolkitsFileNameEnum.m	(revision 18874)
+@@ -0,0 +1,11 @@
++function macro=ToolkitsFileNameEnum()
++%TOOLKITSFILENAMEENUM - Enum of ToolkitsFileName
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=ToolkitsFileNameEnum()
++
++macro=StringToEnum('ToolkitsFileName');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition8Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition8Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition8Enum.m	(revision 18874)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition8Enum()
++%OUTPUTDEFINITION8ENUM - Enum of Outputdefinition8
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition8Enum()
++
++macro=StringToEnum('Outputdefinition8');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition3Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition3Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition3Enum.m	(revision 18874)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition3Enum()
++%OUTPUTDEFINITION3ENUM - Enum of Outputdefinition3
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition3Enum()
++
++macro=StringToEnum('Outputdefinition3');
+Index: ../trunk-jpl/src/m/enum/MassconDefinitionenumEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MassconDefinitionenumEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MassconDefinitionenumEnum.m	(revision 18874)
+@@ -0,0 +1,11 @@
++function macro=MassconDefinitionenumEnum()
++%MASSCONDEFINITIONENUMENUM - Enum of MassconDefinitionenum
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MassconDefinitionenumEnum()
++
++macro=StringToEnum('MassconDefinitionenum');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition10Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition10Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition10Enum.m	(revision 18874)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition10Enum()
++%OUTPUTDEFINITION10ENUM - Enum of Outputdefinition10
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition10Enum()
++
++macro=StringToEnum('Outputdefinition10');
+Index: ../trunk-jpl/src/m/enum/MisfitDefinitionenumEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MisfitDefinitionenumEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MisfitDefinitionenumEnum.m	(revision 18874)
+@@ -0,0 +1,11 @@
++function macro=MisfitDefinitionenumEnum()
++%MISFITDEFINITIONENUMENUM - Enum of MisfitDefinitionenum
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MisfitDefinitionenumEnum()
++
++macro=StringToEnum('MisfitDefinitionenum');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition9Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition9Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition9Enum.m	(revision 18874)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition9Enum()
++%OUTPUTDEFINITION9ENUM - Enum of Outputdefinition9
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition9Enum()
++
++macro=StringToEnum('Outputdefinition9');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18873)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18874)
+@@ -483,9 +483,11 @@
+ def MatrixParamEnum(): return StringToEnum("MatrixParam")[0]
+ def MassconEnum(): return StringToEnum("Masscon")[0]
+ def MassconNameEnum(): return StringToEnum("MassconName")[0]
++def MassconDefinitionenumEnum(): return StringToEnum("MassconDefinitionenum")[0]
+ def MassconLevelsetEnum(): return StringToEnum("MassconLevelset")[0]
+ def MassconaxpbyEnum(): return StringToEnum("Massconaxpby")[0]
+ def MassconaxpbyNameEnum(): return StringToEnum("MassconaxpbyName")[0]
++def MassconaxpbyDefinitionenumEnum(): return StringToEnum("MassconaxpbyDefinitionenum")[0]
+ def MassconaxpbyNamexEnum(): return StringToEnum("MassconaxpbyNamex")[0]
+ def MassconaxpbyNameyEnum(): return StringToEnum("MassconaxpbyNamey")[0]
+ def MassconaxpbyAlphaEnum(): return StringToEnum("MassconaxpbyAlpha")[0]
+@@ -647,11 +649,23 @@
+ def TimeEnum(): return StringToEnum("Time")[0]
+ def WaterColumnOldEnum(): return StringToEnum("WaterColumnOld")[0]
+ def OutputdefinitionEnum(): return StringToEnum("Outputdefinition")[0]
++def Outputdefinition1Enum(): return StringToEnum("Outputdefinition1")[0]
++def Outputdefinition2Enum(): return StringToEnum("Outputdefinition2")[0]
++def Outputdefinition3Enum(): return StringToEnum("Outputdefinition3")[0]
++def Outputdefinition4Enum(): return StringToEnum("Outputdefinition4")[0]
++def Outputdefinition5Enum(): return StringToEnum("Outputdefinition5")[0]
++def Outputdefinition6Enum(): return StringToEnum("Outputdefinition6")[0]
++def Outputdefinition7Enum(): return StringToEnum("Outputdefinition7")[0]
++def Outputdefinition8Enum(): return StringToEnum("Outputdefinition8")[0]
++def Outputdefinition9Enum(): return StringToEnum("Outputdefinition9")[0]
++def Outputdefinition10Enum(): return StringToEnum("Outputdefinition10")[0]
+ def OutputdefinitionListEnum(): return StringToEnum("OutputdefinitionList")[0]
+ def MassfluxatgateEnum(): return StringToEnum("Massfluxatgate")[0]
+ def MassfluxatgateNameEnum(): return StringToEnum("MassfluxatgateName")[0]
++def MassfluxatgateDefinitionenumEnum(): return StringToEnum("MassfluxatgateDefinitionenum")[0]
+ def MassfluxatgateSegmentsEnum(): return StringToEnum("MassfluxatgateSegments")[0]
+ def MisfitNameEnum(): return StringToEnum("MisfitName")[0]
++def MisfitDefinitionenumEnum(): return StringToEnum("MisfitDefinitionenum")[0]
+ def MisfitModelEnumEnum(): return StringToEnum("MisfitModelEnum")[0]
+ def MisfitObservationEnum(): return StringToEnum("MisfitObservation")[0]
+ def MisfitObservationEnumEnum(): return StringToEnum("MisfitObservationEnum")[0]
+@@ -710,7 +724,10 @@
+ def NodalEnum(): return StringToEnum("Nodal")[0]
+ def OldGradientEnum(): return StringToEnum("OldGradient")[0]
+ def OutputFilePointerEnum(): return StringToEnum("OutputFilePointer")[0]
++def ToolkitsFileNameEnum(): return StringToEnum("ToolkitsFileName")[0]
++def RootPathEnum(): return StringToEnum("RootPath")[0]
+ def OutputFileNameEnum(): return StringToEnum("OutputFileName")[0]
++def InputFileNameEnum(): return StringToEnum("InputFileName")[0]
+ def LockFileNameEnum(): return StringToEnum("LockFileName")[0]
+ def ToolkitsOptionsAnalysesEnum(): return StringToEnum("ToolkitsOptionsAnalyses")[0]
+ def ToolkitsOptionsStringsEnum(): return StringToEnum("ToolkitsOptionsStrings")[0]
+Index: ../trunk-jpl/src/m/enum/Outputdefinition4Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition4Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition4Enum.m	(revision 18874)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition4Enum()
++%OUTPUTDEFINITION4ENUM - Enum of Outputdefinition4
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition4Enum()
++
++macro=StringToEnum('Outputdefinition4');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18874-18875.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18874-18875.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18874-18875.diff	(revision 19102)
@@ -0,0 +1,197 @@
+Index: ../trunk-jpl/src/m/classes/adinversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/adinversion.m	(revision 0)
++++ ../trunk-jpl/src/m/classes/adinversion.m	(revision 18875)
+@@ -0,0 +1,192 @@
++%ADINVERSION class definition
++%
++%   Usage:
++%      adinversion=adinversion();
++
++classdef adinversion
++	properties (SetAccess=public) 
++		iscontrol                   = 0
++		control_parameters          = NaN
++		control_scaling_factors     = NaN
++		maxsteps                    = 0
++		maxiter                     = 0
++		dxmin                       = 0
++		gttol                       = 0
++		cost_functions              = NaN
++		cost_functions_coefficients = NaN
++		min_parameters              = NaN
++		max_parameters              = NaN
++		vx_obs                      = NaN
++		vy_obs                      = NaN
++		vz_obs                      = NaN
++		vel_obs                     = NaN
++		thickness_obs               = NaN
++		surface_obs                 = NaN
++
++	end
++	methods
++		function obj = adinversion(varargin) % {{{
++			switch nargin
++				case 0
++					obj=setdefaultparameters(obj);
++				case 1
++					obj=structtoobj(adinversion(),varargin{1});
++				otherwise
++					error('constructor not supported');
++			end
++		end % }}}
++		function self = setdefaultparameters(self) % {{{
++
++			%parameter to be inferred by control methods (only
++			%drag and B are supported yet)
++			self.control_parameters={'FrictionCoefficient'};
++
++			%Scaling factor for each control
++			self.control_scaling_factors=1;
++
++			%number of iterations
++			self.maxsteps=20;
++			self.maxiter=40;
++
++			%several responses can be used:
++			self.cost_functions={'FrictionCoefficient'};
++
++			%m1qn3 parameters
++			self.dxmin  = 0.1;
++			self.gttol = 1e-4;
++
++		end % }}}
++		function md = checkconsistency(obj,md,solution,analyses) % {{{
++
++			%Early return
++			if ~obj.iscontrol, return; end
++
++			if ~IssmConfig('_HAVE_M1QN3_'),
++				md = checkmessage(md,['M1QN3 has not been installed, ISSM needs to be reconfigured and recompiled with AD']);
++			end
++
++			num_controls=numel(md.inversion.control_parameters);
++			num_costfunc=size(md.inversion.cost_functions,2);
++
++			md = checkfield(md,'fieldname','inversion.iscontrol','values',[0 1]);
++			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',...
++				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'DamageDbar',...
++				'Vx' 'Vy' 'Thickness' 'BalancethicknessOmega' 'BalancethicknessApparentMassbalance'});
++			md = checkfield(md,'fieldname','inversion.control_scaling_factors','size',[1 num_controls],'>',0,'NaN',1);
++			md = checkfield(md,'fieldname','inversion.maxsteps','numel',1,'>=',0);
++			md = checkfield(md,'fieldname','inversion.maxiter','numel',1,'>=',0);
++			md = checkfield(md,'fieldname','inversion.dxmin','numel',1,'>',0);
++			md = checkfield(md,'fieldname','inversion.gttol','numel',1,'>',0);
++			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:506 601:604 1001:1010]);
++			md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0);
++			md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);
++			md = checkfield(md,'fieldname','inversion.max_parameters','size',[md.mesh.numberofvertices num_controls]);
++
++			if solution==BalancethicknessSolutionEnum()
++				md = checkfield(md,'fieldname','inversion.thickness_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
++				md = checkfield(md,'fieldname','inversion.surface_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
++			elseif solution==BalancethicknessSoftSolutionEnum()
++				md = checkfield(md,'fieldname','inversion.thickness_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
++			else
++				md = checkfield(md,'fieldname','inversion.vx_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
++				if ~strcmp(domaintype(md.mesh),'2Dvertical'),
++					md = checkfield(md,'fieldname','inversion.vy_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
++				end
++			end
++		end % }}}
++		function disp(obj) % {{{
++			disp(sprintf('   adinversion parameters:'));
++			fielddisplay(obj,'iscontrol','is inversion activated?');
++			fielddisplay(obj,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}');
++			fielddisplay(obj,'control_scaling_factors','order of magnitude of each control (useful for multi-parameter optimization)');
++			fielddisplay(obj,'maxsteps','maximum number of iterations (gradient computation)');
++			fielddisplay(obj,'maxiter','maximum number of Function evaluation (forward run)');
++			fielddisplay(obj,'dxmin','convergence criterion: two points less than dxmin from eachother (sup-norm) are considered identical');
++			fielddisplay(obj,'gttol','convergence criterion: ||g(X)||/||g(X0)|| (g(X0): gradient at initial guess X0)');
++			fielddisplay(obj,'cost_functions','indicate the type of response for each optimization step');
++			fielddisplay(obj,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter');
++			fielddisplay(obj,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex');
++			fielddisplay(obj,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex');
++			fielddisplay(obj,'vx_obs','observed velocity x component [m/yr]');
++			fielddisplay(obj,'vy_obs','observed velocity y component [m/yr]');
++			fielddisplay(obj,'vel_obs','observed velocity magnitude [m/yr]');
++			fielddisplay(obj,'thickness_obs','observed thickness [m]');
++			fielddisplay(obj,'surface_obs','observed surface elevation [m]');
++			
++			disp('Available cost functions:');
++			disp('   101: SurfaceAbsVelMisfit');
++			disp('   102: SurfaceRelVelMisfit');
++			disp('   103: SurfaceLogVelMisfit');
++			disp('   104: SurfaceLogVxVyMisfit');
++			disp('   105: SurfaceAverageVelMisfit');
++			disp('   201: ThicknessAbsMisfit');
++			disp('   501: DragCoefficientAbsGradient');
++			disp('   502: RheologyBbarAbsGradient');
++			disp('   503: ThicknessAbsGradient');
++		end % }}}
++		function marshall(obj,md,fid) % {{{
++
++			yts=365.0*24.0*3600.0;
++
++			WriteData(fid,'object',obj,'class','inversion','fieldname','iscontrol','format','Boolean');
++			WriteData(fid,'enum',InversionTypeEnum(),'data',4,'format','Integer');
++			if ~obj.iscontrol, return; end
++			WriteData(fid,'object',obj,'class','inversion','fieldname','control_scaling_factors','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',obj,'class','inversion','fieldname','maxsteps','format','Integer');
++			WriteData(fid,'object',obj,'class','inversion','fieldname','maxiter','format','Integer');
++			WriteData(fid,'object',obj,'class','inversion','fieldname','dxmin','format','Double');
++			WriteData(fid,'object',obj,'class','inversion','fieldname','gttol','format','Double');
++			WriteData(fid,'object',obj,'class','inversion','fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'class','inversion','fieldname','min_parameters','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',obj,'class','inversion','fieldname','max_parameters','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',obj,'class','inversion','fieldname','vx_obs','format','DoubleMat','mattype',1,'scale',1./yts);
++			WriteData(fid,'object',obj,'class','inversion','fieldname','vy_obs','format','DoubleMat','mattype',1,'scale',1./yts);
++			WriteData(fid,'object',obj,'class','inversion','fieldname','vz_obs','format','DoubleMat','mattype',1,'scale',1./yts);
++			if(numel(obj.thickness_obs)==md.mesh.numberofelements),
++				mattype=2;
++			else
++				mattype=1;
++			end
++			WriteData(fid,'object',obj,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',mattype);
++			WriteData(fid,'object',obj,'class','inversion','fieldname','surface_obs','format','DoubleMat','mattype',mattype);
++
++			%process control parameters
++			num_control_parameters=numel(obj.control_parameters);
++			data=zeros(1,num_control_parameters);
++			for i=1:num_control_parameters,
++				data(i)=StringToEnum(obj.control_parameters{i});
++			end
++			WriteData(fid,'data',data,'enum',InversionControlParametersEnum(),'format','DoubleMat','mattype',3);
++			WriteData(fid,'data',num_control_parameters,'enum',InversionNumControlParametersEnum(),'format','Integer');
++
++			%process cost functions
++			num_cost_functions=size(obj.cost_functions,2);
++			data=obj.cost_functions;
++			pos=find(obj.cost_functions==101); data(pos)=SurfaceAbsVelMisfitEnum();
++			pos=find(obj.cost_functions==102); data(pos)=SurfaceRelVelMisfitEnum();
++			pos=find(obj.cost_functions==103); data(pos)=SurfaceLogVelMisfitEnum();
++			pos=find(obj.cost_functions==104); data(pos)=SurfaceLogVxVyMisfitEnum();
++			pos=find(obj.cost_functions==105); data(pos)=SurfaceAverageVelMisfitEnum();
++			pos=find(obj.cost_functions==201); data(pos)=ThicknessAbsMisfitEnum();
++			pos=find(obj.cost_functions==501); data(pos)=DragCoefficientAbsGradientEnum();
++			pos=find(obj.cost_functions==502); data(pos)=RheologyBbarAbsGradientEnum();
++			pos=find(obj.cost_functions==503); data(pos)=ThicknessAbsGradientEnum();
++			pos=find(obj.cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
++			pos=find(obj.cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
++			pos=find(obj.cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
++			pos=find(obj.cost_functions==601); data(pos)=SurfaceAbsMisfitEnum();
++			pos=find(obj.cost_functions==1001); data(pos)=Outputdefinition1Enum();
++			pos=find(obj.cost_functions==1002); data(pos)=Outputdefinition2Enum();
++			pos=find(obj.cost_functions==1003); data(pos)=Outputdefinition3Enum();
++			pos=find(obj.cost_functions==1004); data(pos)=Outputdefinition4Enum();
++			pos=find(obj.cost_functions==1005); data(pos)=Outputdefinition5Enum();
++			pos=find(obj.cost_functions==1006); data(pos)=Outputdefinition6Enum();
++			pos=find(obj.cost_functions==1007); data(pos)=Outputdefinition7Enum();
++			pos=find(obj.cost_functions==1008); data(pos)=Outputdefinition8Enum();
++			pos=find(obj.cost_functions==1009); data(pos)=Outputdefinition8Enum();
++			pos=find(obj.cost_functions==1010); data(pos)=Outputdefinition10Enum();
++			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
++			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
++		end % }}}
++	end
++end
Index: /issm/oecreview/Archive/18296-19100/ISSM-18875-18876.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18875-18876.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18875-18876.diff	(revision 19102)
@@ -0,0 +1,62 @@
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 18875)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 18876)
+@@ -30,7 +30,6 @@
+ 		/*How many controls and how many responses?*/
+ 		parameters->AddObject(iomodel->CopyConstantObject(InversionNumControlParametersEnum));
+ 		parameters->AddObject(iomodel->CopyConstantObject(InversionNumCostFunctionsEnum));
+-		parameters->AddObject(iomodel->CopyConstantObject(InversionIncompleteAdjointEnum));
+ 
+ 		/*What solution type?*/
+ 		if(solution_type==SteadystateSolutionEnum){
+@@ -49,6 +48,7 @@
+ 		/*Inversion type specifics*/
+ 		switch(inversiontype){
+ 			case 0:/*Brent Search*/
++				parameters->AddObject(iomodel->CopyConstantObject(InversionIncompleteAdjointEnum));
+ 				parameters->AddObject(iomodel->CopyConstantObject(InversionNstepsEnum));
+ 				parameters->AddObject(iomodel->CopyConstantObject(InversionCostFunctionThresholdEnum));
+ 				iomodel->FetchData(&cm_jump,&nsteps,NULL,InversionStepThresholdEnum);
+@@ -59,6 +59,7 @@
+ 				parameters->AddObject(new IntVecParam(InversionMaxiterPerStepEnum,maxiter,nsteps));
+ 				break;
+ 			case 1:/*TAO*/
++				parameters->AddObject(iomodel->CopyConstantObject(InversionIncompleteAdjointEnum));
+ 				parameters->AddObject(iomodel->CopyConstantObject(InversionFatolEnum));
+ 				parameters->AddObject(iomodel->CopyConstantObject(InversionFrtolEnum));
+ 				parameters->AddObject(iomodel->CopyConstantObject(InversionGatolEnum));
+@@ -69,6 +70,7 @@
+ 				parameters->AddObject(iomodel->CopyConstantObject(InversionAlgorithmEnum));
+ 				break;
+ 			case 2:/*M1QN3*/
++				parameters->AddObject(iomodel->CopyConstantObject(InversionIncompleteAdjointEnum));
+ 				parameters->AddObject(iomodel->CopyConstantObject(InversionDxminEnum));
+ 				parameters->AddObject(iomodel->CopyConstantObject(InversionGttolEnum));
+ 				parameters->AddObject(iomodel->CopyConstantObject(InversionMaxstepsEnum));
+@@ -77,16 +79,24 @@
+ 				parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_controls));
+ 				break;
+ 			case 3:/*Validation*/
++				parameters->AddObject(iomodel->CopyConstantObject(InversionIncompleteAdjointEnum));
+ 				iomodel->FetchData(&control_scaling_factors,NULL,NULL,InversionControlScalingFactorsEnum);
+ 				parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_controls));
+ 				break;
++			case 4:/*M1QN3 AD*/
++				parameters->AddObject(iomodel->CopyConstantObject(InversionDxminEnum));
++				parameters->AddObject(iomodel->CopyConstantObject(InversionGttolEnum));
++				parameters->AddObject(iomodel->CopyConstantObject(InversionMaxstepsEnum));
++				parameters->AddObject(iomodel->CopyConstantObject(InversionMaxiterEnum));
++				iomodel->FetchData(&control_scaling_factors,NULL,NULL,InversionControlScalingFactorsEnum);
++				parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_controls));
++				break;
+ 			default:
+ 				_error_("not supported");
+ 
+ 		}
+ 
+ 		xDelete<int>(control_type);
+-		xDelete<int>(cm_responses);
+ 		xDelete<int>(maxiter);
+ 		xDelete<IssmDouble>(control_scaling_factors);
+ 		iomodel->DeleteData(cm_jump,InversionStepThresholdEnum);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18876-18877.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18876-18877.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18876-18877.diff	(revision 19102)
@@ -0,0 +1,35 @@
+Index: ../trunk-jpl/src/c/modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.cpp	(revision 18876)
++++ ../trunk-jpl/src/c/modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.cpp	(revision 18877)
+@@ -37,3 +37,30 @@
+ 	_error_("Could not find the response for output definition " << output_string << " because could not find the definition itself!");
+ 
+ }
++
++IssmDouble OutputDefinitionsResponsex(FemModel* femmodel,int output_enum){
++
++	/*Ok, go find the output definitions dataset in the parameters, where our responses are hiding: */
++	DataSet* output_definitions=((DataSetParam*)femmodel->parameters->FindParamObject(OutputdefinitionEnum))->value;
++
++	/*Now, go through the output definitions, and retrieve the object which corresponds to our requested response, output_enum: */
++	for(int i=0;i<output_definitions->Size();i++){
++		
++		//Definition* definition=xDynamicCast<Definition*>(output_definitions->GetObjectByOffset(i));
++		Definition* definition=dynamic_cast<Definition*>(output_definitions->GetObjectByOffset(i));
++
++		int en = definition->DefinitionEnum();
++		if(en==output_enum){
++
++			/*This is the object that we have been chasing for. compute the response and return: */
++			IssmDouble return_value=definition->Response(femmodel);
++		
++			/*return:*/
++			return return_value;
++		}
++	}
++	
++	/*If we are here, did not find the definition for this response, not good!: */
++	_error_("Could not find the response for output definition " << output_enum << " because could not find the definition itself!");
++
++}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18877-18878.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18877-18878.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18877-18878.diff	(revision 19102)
@@ -0,0 +1,11 @@
+Index: ../trunk-jpl/src/c/modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.h
+===================================================================
+--- ../trunk-jpl/src/c/modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.h	(revision 18877)
++++ ../trunk-jpl/src/c/modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.h	(revision 18878)
+@@ -8,5 +8,6 @@
+ 
+ /* local prototypes: */
+ IssmDouble OutputDefinitionsResponsex(FemModel* femmodel,const char* output_string);
++IssmDouble OutputDefinitionsResponsex(FemModel* femmodel,int output_enum);
+ 
+ #endif  /* _OUTPUTDEFINITIONSRESPONSEXX_H */
Index: /issm/oecreview/Archive/18296-19100/ISSM-18878-18879.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18878-18879.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18878-18879.diff	(revision 19102)
@@ -0,0 +1,139 @@
+Index: ../trunk-jpl/src/c/classes/IoModel.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/IoModel.h	(revision 18878)
++++ ../trunk-jpl/src/c/classes/IoModel.h	(revision 18879)
+@@ -58,7 +58,7 @@
+ 		/*Methods*/
+ 		~IoModel();
+ 		IoModel();
+-		IoModel(FILE* iomodel_handle);
++		IoModel(FILE* iomodel_handle,bool trace,IssmPDouble* X);
+ 
+ 		/*Input/Output*/
+ 		void        CheckEnumSync(void);
+@@ -92,8 +92,8 @@
+ 		void        LastIndex(int *pindex);
+ 		FILE*       SetFilePointerToData(int* pcode,int* pvector_type, int data_enum);
+ 		fpos_t*     SetFilePointersToData(int** pcodes,int** pvector_types, int* pnum_instances, int data_enum);
+-		void        DeclareIndependents(void);
+-		void        StartTrace(void);
++		void        DeclareIndependents(bool trace,IssmPDouble* X);
++		void        StartTrace(bool trace);
+ 		void        FetchIndependent(int dependent_enum);
+ };
+ 
+Index: ../trunk-jpl/src/c/classes/IoModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/IoModel.cpp	(revision 18878)
++++ ../trunk-jpl/src/c/classes/IoModel.cpp	(revision 18879)
+@@ -49,8 +49,11 @@
+ 	this->constraintcounter=0;
+ }
+ /*}}}*/
+-IoModel::IoModel(FILE* iomodel_handle){/*{{{*/
++IoModel::IoModel(FILE* iomodel_handle,bool trace,IssmPDouble* X){/*{{{*/
+ 
++	bool autodiff=false;
++	bool iscontrol=false;
++	
+ 	/*First, keep track of the file handle: */
+ 	this->fid=iomodel_handle;
+ 
+@@ -64,13 +67,28 @@
+ 	/*If we are running in AD mode, we need to start the trace and declare our independent variables now, 
+ 	 *and prevent them from being erased during successive calls to iomodel->FetchConstants, iomodel->FetchData and 
+ 	 iomodel->DeleteData:*/
+-	this->StartTrace();
+-	this->DeclareIndependents();
++	this->StartTrace(trace);
++	this->DeclareIndependents(trace,X);
+ 
+ 	/*Initialize and read constants:*/
+ 	this->constants=new Parameters();
+ 	this->FetchConstants(); /*this routine goes through the input file, and fetches bools, ints, IssmDoubles and strings only, nothing memory intensive*/
+ 
++	/*Now some very specific piece of logic. We want to know whether we are going to carry out an autodiff run. There are 
++	 *several cases: either trace is true (which bypasses the isautodiff choice), or trace is false but isautodiff is on, in which 
++	 *case two cases are possible: are we running a control method or not? To make things simpler, we are going to pin down everyting 
++	 *on isautodiff. By the way, we could not do this before we had the constants dataset initialized! {{{*/
++	this->constants->FindParam(&autodiff,AutodiffIsautodiffEnum);
++	this->constants->FindParam(&iscontrol,InversionIscontrolEnum);
++
++	if(trace)autodiff=true;
++	else{
++		if(autodiff && !iscontrol) autodiff=true;
++		else autodiff=false;
++	}
++	this->constants->SetParam(autodiff,AutodiffIsautodiffEnum);
++	/*}}}*/
++
+ 	/*Initialize permanent data: */
+ 	this->my_elements = NULL;
+ 	this->my_vertices = NULL;
+@@ -107,7 +125,7 @@
+ 	}
+ 
+ 	/*checks in debugging mode*/
+-	#ifdef _ISSM_DEBUG_
++	#if defined(_ISSM_DEBUG_) && !defined(_HAVE_ADOLC_)
+ 	if(this->data){
+ 		for(int i=0;i<MaximumNumberOfDefinitionsEnum;i++){
+ 			if(this->data[i]){
+@@ -272,9 +290,10 @@
+ 	return this->data[data_enum];
+ }
+ /*}}}*/
+-void IoModel::StartTrace(void){/*{{{*/
++void IoModel::StartTrace(bool trace){/*{{{*/
+ 
+ 	bool autodiff = false;
++	bool iscontrol = false;
+ 	bool keep=false;
+ 	IssmDouble gcTriggerRatio;
+ 	IssmDouble gcTriggerMaxSize;
+@@ -286,8 +305,9 @@
+ 	int my_rank=IssmComm::GetRank();
+ 
+ 	this->FetchData(&autodiff,AutodiffIsautodiffEnum);
+-	if(autodiff){
++	this->FetchData(&iscontrol,InversionIscontrolEnum);
+ 
++	if(trace || (autodiff && !iscontrol)){
+ 		#ifdef _HAVE_ADOLC_
+ 		/*Retrieve parameters: */
+ 		this->FetchData(&keep,AutodiffKeepEnum);
+@@ -310,11 +330,13 @@
+ 
+ }
+ /*}}}*/
+-void IoModel::DeclareIndependents(void){/*{{{*/
++void IoModel::DeclareIndependents(bool trace,IssmPDouble* X){/*{{{*/
+ 
+ 	int  i;
+ 	bool autodiff = false;
++	bool iscontrol = false;
+ 	int  num_independent_objects;
++	int  Xcount=0;
+ 
+ 	int *names = NULL;
+ 	int *types = NULL;
+@@ -326,7 +348,9 @@
+ 	for(i=0;i<MaximumNumberOfDefinitionsEnum;i++) this->independents[i]=false;
+ 
+ 	this->FetchData(&autodiff,AutodiffIsautodiffEnum);
+-	if(autodiff){
++	this->FetchData(&iscontrol,InversionIscontrolEnum);
++	
++	if(trace || (autodiff && !iscontrol)){
+ 
+ 		#ifdef _HAVE_ADOLC_
+ 		/*build dataset made of independent objects:*/
+@@ -347,7 +371,7 @@
+ 				this->independent_objects->AddObject(independent_object);
+ 
+ 				/*now go fetch the independent variable: */
+-				independent_object->FetchIndependent(this); //supply the pointer to iomodel.
++				independent_object->FetchIndependent(this,&Xcount,X); //supply the pointer to iomodel.
+ 			}
+ 			xDelete<int>(names);
+ 			xDelete<int>(types);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18879-18880.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18879-18880.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18879-18880.diff	(revision 19102)
@@ -0,0 +1,195 @@
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18879)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18880)
+@@ -494,9 +494,11 @@
+ 	MatrixParamEnum,
+ 	MassconEnum,
+ 	MassconNameEnum,
++	MassconDefinitionenumEnum,
+ 	MassconLevelsetEnum,
+ 	MassconaxpbyEnum,
+ 	MassconaxpbyNameEnum,
++	MassconaxpbyDefinitionenumEnum,
+ 	MassconaxpbyNamexEnum,
+ 	MassconaxpbyNameyEnum,
+ 	MassconaxpbyAlphaEnum,
+@@ -670,11 +672,23 @@
+ 	/*}}}*/
+ 	/*Output Definitions{{{*/
+ 	OutputdefinitionEnum,
++	Outputdefinition1Enum,
++	Outputdefinition2Enum,
++	Outputdefinition3Enum,
++	Outputdefinition4Enum,
++	Outputdefinition5Enum,
++	Outputdefinition6Enum,
++	Outputdefinition7Enum,
++	Outputdefinition8Enum,
++	Outputdefinition9Enum,
++	Outputdefinition10Enum,
+ 	OutputdefinitionListEnum,
+ 	MassfluxatgateEnum,
+ 	MassfluxatgateNameEnum,
++	MassfluxatgateDefinitionenumEnum,
+ 	MassfluxatgateSegmentsEnum,
+ 	MisfitNameEnum,
++	MisfitDefinitionenumEnum,
+ 	MisfitModelEnumEnum,
+ 	MisfitObservationEnum,
+ 	MisfitObservationEnumEnum,
+@@ -745,7 +759,10 @@
+ 	NodalEnum,
+ 	OldGradientEnum,
+ 	OutputFilePointerEnum,
++	ToolkitsFileNameEnum,
++	RootPathEnum,
+ 	OutputFileNameEnum,
++	InputFileNameEnum,
+ 	LockFileNameEnum,
+ 	ToolkitsOptionsAnalysesEnum,
+ 	ToolkitsOptionsStringsEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18879)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18880)
+@@ -491,9 +491,11 @@
+ 		case MatrixParamEnum : return "MatrixParam";
+ 		case MassconEnum : return "Masscon";
+ 		case MassconNameEnum : return "MassconName";
++		case MassconDefinitionenumEnum : return "MassconDefinitionenum";
+ 		case MassconLevelsetEnum : return "MassconLevelset";
+ 		case MassconaxpbyEnum : return "Massconaxpby";
+ 		case MassconaxpbyNameEnum : return "MassconaxpbyName";
++		case MassconaxpbyDefinitionenumEnum : return "MassconaxpbyDefinitionenum";
+ 		case MassconaxpbyNamexEnum : return "MassconaxpbyNamex";
+ 		case MassconaxpbyNameyEnum : return "MassconaxpbyNamey";
+ 		case MassconaxpbyAlphaEnum : return "MassconaxpbyAlpha";
+@@ -655,11 +657,23 @@
+ 		case TimeEnum : return "Time";
+ 		case WaterColumnOldEnum : return "WaterColumnOld";
+ 		case OutputdefinitionEnum : return "Outputdefinition";
++		case Outputdefinition1Enum : return "Outputdefinition1";
++		case Outputdefinition2Enum : return "Outputdefinition2";
++		case Outputdefinition3Enum : return "Outputdefinition3";
++		case Outputdefinition4Enum : return "Outputdefinition4";
++		case Outputdefinition5Enum : return "Outputdefinition5";
++		case Outputdefinition6Enum : return "Outputdefinition6";
++		case Outputdefinition7Enum : return "Outputdefinition7";
++		case Outputdefinition8Enum : return "Outputdefinition8";
++		case Outputdefinition9Enum : return "Outputdefinition9";
++		case Outputdefinition10Enum : return "Outputdefinition10";
+ 		case OutputdefinitionListEnum : return "OutputdefinitionList";
+ 		case MassfluxatgateEnum : return "Massfluxatgate";
+ 		case MassfluxatgateNameEnum : return "MassfluxatgateName";
++		case MassfluxatgateDefinitionenumEnum : return "MassfluxatgateDefinitionenum";
+ 		case MassfluxatgateSegmentsEnum : return "MassfluxatgateSegments";
+ 		case MisfitNameEnum : return "MisfitName";
++		case MisfitDefinitionenumEnum : return "MisfitDefinitionenum";
+ 		case MisfitModelEnumEnum : return "MisfitModelEnum";
+ 		case MisfitObservationEnum : return "MisfitObservation";
+ 		case MisfitObservationEnumEnum : return "MisfitObservationEnum";
+@@ -718,7 +732,10 @@
+ 		case NodalEnum : return "Nodal";
+ 		case OldGradientEnum : return "OldGradient";
+ 		case OutputFilePointerEnum : return "OutputFilePointer";
++		case ToolkitsFileNameEnum : return "ToolkitsFileName";
++		case RootPathEnum : return "RootPath";
+ 		case OutputFileNameEnum : return "OutputFileName";
++		case InputFileNameEnum : return "InputFileName";
+ 		case LockFileNameEnum : return "LockFileName";
+ 		case ToolkitsOptionsAnalysesEnum : return "ToolkitsOptionsAnalyses";
+ 		case ToolkitsOptionsStringsEnum : return "ToolkitsOptionsStrings";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18879)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18880)
+@@ -500,15 +500,17 @@
+ 	      else if (strcmp(name,"MatrixParam")==0) return MatrixParamEnum;
+ 	      else if (strcmp(name,"Masscon")==0) return MassconEnum;
+ 	      else if (strcmp(name,"MassconName")==0) return MassconNameEnum;
++	      else if (strcmp(name,"MassconDefinitionenum")==0) return MassconDefinitionenumEnum;
+ 	      else if (strcmp(name,"MassconLevelset")==0) return MassconLevelsetEnum;
+ 	      else if (strcmp(name,"Massconaxpby")==0) return MassconaxpbyEnum;
+ 	      else if (strcmp(name,"MassconaxpbyName")==0) return MassconaxpbyNameEnum;
+-	      else if (strcmp(name,"MassconaxpbyNamex")==0) return MassconaxpbyNamexEnum;
+-	      else if (strcmp(name,"MassconaxpbyNamey")==0) return MassconaxpbyNameyEnum;
++	      else if (strcmp(name,"MassconaxpbyDefinitionenum")==0) return MassconaxpbyDefinitionenumEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"MassconaxpbyAlpha")==0) return MassconaxpbyAlphaEnum;
++	      if (strcmp(name,"MassconaxpbyNamex")==0) return MassconaxpbyNamexEnum;
++	      else if (strcmp(name,"MassconaxpbyNamey")==0) return MassconaxpbyNameyEnum;
++	      else if (strcmp(name,"MassconaxpbyAlpha")==0) return MassconaxpbyAlphaEnum;
+ 	      else if (strcmp(name,"MassconaxpbyBeta")==0) return MassconaxpbyBetaEnum;
+ 	      else if (strcmp(name,"NodeSId")==0) return NodeSIdEnum;
+ 	      else if (strcmp(name,"VectorParam")==0) return VectorParamEnum;
+@@ -626,12 +628,12 @@
+ 	      else if (strcmp(name,"StrainRatexx")==0) return StrainRatexxEnum;
+ 	      else if (strcmp(name,"StrainRatexy")==0) return StrainRatexyEnum;
+ 	      else if (strcmp(name,"StrainRatexz")==0) return StrainRatexzEnum;
+-	      else if (strcmp(name,"StrainRateyy")==0) return StrainRateyyEnum;
+-	      else if (strcmp(name,"StrainRateyz")==0) return StrainRateyzEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"StrainRatezz")==0) return StrainRatezzEnum;
++	      if (strcmp(name,"StrainRateyy")==0) return StrainRateyyEnum;
++	      else if (strcmp(name,"StrainRateyz")==0) return StrainRateyzEnum;
++	      else if (strcmp(name,"StrainRatezz")==0) return StrainRatezzEnum;
+ 	      else if (strcmp(name,"Divergence")==0) return DivergenceEnum;
+ 	      else if (strcmp(name,"MaxDivergence")==0) return MaxDivergenceEnum;
+ 	      else if (strcmp(name,"GiaCrossSectionShape")==0) return GiaCrossSectionShapeEnum;
+@@ -670,11 +672,23 @@
+ 	      else if (strcmp(name,"Time")==0) return TimeEnum;
+ 	      else if (strcmp(name,"WaterColumnOld")==0) return WaterColumnOldEnum;
+ 	      else if (strcmp(name,"Outputdefinition")==0) return OutputdefinitionEnum;
++	      else if (strcmp(name,"Outputdefinition1")==0) return Outputdefinition1Enum;
++	      else if (strcmp(name,"Outputdefinition2")==0) return Outputdefinition2Enum;
++	      else if (strcmp(name,"Outputdefinition3")==0) return Outputdefinition3Enum;
++	      else if (strcmp(name,"Outputdefinition4")==0) return Outputdefinition4Enum;
++	      else if (strcmp(name,"Outputdefinition5")==0) return Outputdefinition5Enum;
++	      else if (strcmp(name,"Outputdefinition6")==0) return Outputdefinition6Enum;
++	      else if (strcmp(name,"Outputdefinition7")==0) return Outputdefinition7Enum;
++	      else if (strcmp(name,"Outputdefinition8")==0) return Outputdefinition8Enum;
++	      else if (strcmp(name,"Outputdefinition9")==0) return Outputdefinition9Enum;
++	      else if (strcmp(name,"Outputdefinition10")==0) return Outputdefinition10Enum;
+ 	      else if (strcmp(name,"OutputdefinitionList")==0) return OutputdefinitionListEnum;
+ 	      else if (strcmp(name,"Massfluxatgate")==0) return MassfluxatgateEnum;
+ 	      else if (strcmp(name,"MassfluxatgateName")==0) return MassfluxatgateNameEnum;
++	      else if (strcmp(name,"MassfluxatgateDefinitionenum")==0) return MassfluxatgateDefinitionenumEnum;
+ 	      else if (strcmp(name,"MassfluxatgateSegments")==0) return MassfluxatgateSegmentsEnum;
+ 	      else if (strcmp(name,"MisfitName")==0) return MisfitNameEnum;
++	      else if (strcmp(name,"MisfitDefinitionenum")==0) return MisfitDefinitionenumEnum;
+ 	      else if (strcmp(name,"MisfitModelEnum")==0) return MisfitModelEnumEnum;
+ 	      else if (strcmp(name,"MisfitObservation")==0) return MisfitObservationEnum;
+ 	      else if (strcmp(name,"MisfitObservationEnum")==0) return MisfitObservationEnumEnum;
+@@ -733,8 +747,14 @@
+ 	      else if (strcmp(name,"Nodal")==0) return NodalEnum;
+ 	      else if (strcmp(name,"OldGradient")==0) return OldGradientEnum;
+ 	      else if (strcmp(name,"OutputFilePointer")==0) return OutputFilePointerEnum;
++	      else if (strcmp(name,"ToolkitsFileName")==0) return ToolkitsFileNameEnum;
++	      else if (strcmp(name,"RootPath")==0) return RootPathEnum;
+ 	      else if (strcmp(name,"OutputFileName")==0) return OutputFileNameEnum;
+-	      else if (strcmp(name,"LockFileName")==0) return LockFileNameEnum;
++	      else if (strcmp(name,"InputFileName")==0) return InputFileNameEnum;
++         else stage=7;
++   }
++   if(stage==7){
++	      if (strcmp(name,"LockFileName")==0) return LockFileNameEnum;
+ 	      else if (strcmp(name,"ToolkitsOptionsAnalyses")==0) return ToolkitsOptionsAnalysesEnum;
+ 	      else if (strcmp(name,"ToolkitsOptionsStrings")==0) return ToolkitsOptionsStringsEnum;
+ 	      else if (strcmp(name,"QmuErrName")==0) return QmuErrNameEnum;
+@@ -751,10 +771,7 @@
+ 	      else if (strcmp(name,"XY")==0) return XYEnum;
+ 	      else if (strcmp(name,"XYZ")==0) return XYZEnum;
+ 	      else if (strcmp(name,"Dense")==0) return DenseEnum;
+-         else stage=7;
+-   }
+-   if(stage==7){
+-	      if (strcmp(name,"MpiDense")==0) return MpiDenseEnum;
++	      else if (strcmp(name,"MpiDense")==0) return MpiDenseEnum;
+ 	      else if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum;
+ 	      else if (strcmp(name,"Seq")==0) return SeqEnum;
+ 	      else if (strcmp(name,"Mpi")==0) return MpiEnum;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18880-18881.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18880-18881.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18880-18881.diff	(revision 19102)
@@ -0,0 +1,197 @@
+Index: ../trunk-jpl/src/m/classes/massfluxatgate.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/massfluxatgate.m	(revision 18880)
++++ ../trunk-jpl/src/m/classes/massfluxatgate.m	(revision 18881)
+@@ -2,12 +2,13 @@
+ %
+ %   Usage:
+ %      massfluxatgate=massfluxatgate();
+-%      massfluxatgate=massfluxatgate('GateName','PathToExpFile');
++%      massfluxatgate=massfluxatgate('name','GateName','definitionname',Outputdefinition1Enum,'profilename','PathToExpFile');
+ 
+ classdef massfluxatgate
+ 	properties (SetAccess=public)  
+ 		%massfluxatgate 
+ 		name                = '';
++		definitionenum     = NaN; %enum that identifies this output definition uniquely, from Outputdefinition[1-10]Enum
+ 		profilename            = ''; 
+ 	end
+ 	properties (SetAccess=private)  
+@@ -15,16 +16,16 @@
+ 	end
+ 	methods
+ 		function obj = massfluxatgate(varargin) % {{{
+-			switch nargin
+-				case 0
+-					obj=setdefaultparameters(obj);
+-				case 1
+-					obj.name=varargin{1};
+-				case 2
+-					obj.name=varargin{1};
+-					obj.profilename=varargin{2};
+-				otherwise
+-					error('constructor not supported');
++			if nargin==0,
++				obj=setdefaultparameters(obj);
++			else
++				%use provided options to change fields
++				options=pairoptions(varargin{:});
++
++				%get name
++				obj.name=getfieldvalue(options,'name','');
++				obj.definitionenum=getfieldvalue(options,'definitionenum');
++				obj.profilename=getfieldvalue(options,'profilename');
+ 			end
+ 		end % }}}
+ 		function obj = setdefaultparameters(obj) % {{{
+@@ -37,6 +38,8 @@
+ 			if ~ischar(obj.profilename),
+ 				error('massfluxatgate error message: ''profilename'' field should be a string!');
+ 			end
++			
++			md = checkfield(md,'fieldname','obj.definitionenum','field',obj.definitionenum,'values',[Outputdefinition1Enum,Outputdefinition2Enum,Outputdefinition3Enum,Outputdefinition4Enum,Outputdefinition5Enum,Outputdefinition6Enum,Outputdefinition7Enum,Outputdefinition8Enum,Outputdefinition9Enum,Outputdefinition10Enum]);
+ 
+ 			%check the profilename points to a file!: 
+ 			if exist(obj.profilename,'file')~=2,
+Index: ../trunk-jpl/src/m/classes/misfit.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/misfit.m	(revision 18880)
++++ ../trunk-jpl/src/m/classes/misfit.m	(revision 18881)
+@@ -3,7 +3,7 @@
+ %   Usage:
+ %      misfit=misfit();
+ %      misfit=misfit('name','SurfaceAltimetry',...
+-%                    'model_enum',SurfaceEnum,...
++%                    'definitionenum',Outputdefinition1Enum, 'model_enum',SurfaceEnum,...
+ %                    'observation_enum',SurfaceObservationsEnum,...
+ %                    'observation',md.geometry.surface,...
+ %                    'timeinterpolation','nearestneighbor',...
+@@ -16,6 +16,7 @@
+ 	properties (SetAccess=public)
+ 		%misfit
+ 		name              = '';
++		definitionenum   = NaN; %enum that identifies this output definition uniquely, from Outputdefinition[1-10]Enum
+ 		model_enum        = NaN; %enum for field that is modeled
+ 		observation       = NaN; %observed field that we compare the model against
+ 		observation_enum  = NaN; %enum for observed field.
+@@ -35,6 +36,7 @@
+ 
+ 				%get name
+ 				obj.name=getfieldvalue(options,'name','');
++				obj.definitionenum=getfieldvalue(options,'definitionenum');
+ 				obj.model_enum=getfieldvalue(options,'model_enum');
+ 				obj.observation=getfieldvalue(options,'observation',NaN);
+ 				obj.observation_enum=getfieldvalue(options,'observation_enum');
+@@ -52,6 +54,7 @@
+ 			if ~ischar(obj.name),
+ 				error('misfit error message: ''name'' field should be a string!');
+ 			end
++			md = checkfield(md,'fieldname','obj.definitionenum','field',obj.definitionenum,'values',[Outputdefinition1Enum,Outputdefinition2Enum,Outputdefinition3Enum,Outputdefinition4Enum,Outputdefinition5Enum,Outputdefinition6Enum,Outputdefinition7Enum,Outputdefinition8Enum,Outputdefinition9Enum,Outputdefinition10Enum]);
+ 
+ 			if ~ischar(obj.timeinterpolation),
+ 				error('misfit error message: ''timeinterpolation'' field should be a string!');
+@@ -66,6 +69,7 @@
+ 			disp(sprintf('   Misfit:\n'));
+ 
+ 			fielddisplay(obj,'name','identifier for this misfit response');
++			fielddisplay(obj,'definitionenum','enum that identifies this output definition uniquely, from Outputdefinition[1-10]Enum');
+ 			fielddisplay(obj,'model_enum','enum for field that is modeled');
+ 			fielddisplay(obj,'observation','observed field that we compare the model against');
+ 			fielddisplay(obj,'observation_enum','observation enum');
+@@ -77,6 +81,7 @@
+ 		function md = marshall(obj,md,fid) % {{{
+ 
+ 		WriteData(fid,'object',obj,'fieldname','name','format','String');
++		WriteData(fid,'object',obj,'fieldname','definitionenum','format','Integer');
+ 		WriteData(fid,'object',obj,'fieldname','model_enum','format','Integer');
+ 		WriteData(fid,'object',obj,'fieldname','observation','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
+ 		WriteData(fid,'object',obj,'fieldname','observation_enum','format','Integer');
+Index: ../trunk-jpl/src/m/classes/massconaxpby.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/massconaxpby.m	(revision 18880)
++++ ../trunk-jpl/src/m/classes/massconaxpby.m	(revision 18881)
+@@ -14,6 +14,7 @@
+ 	properties (SetAccess=public)
+ 		%masscon axpby
+ 		name              = '';
++		definitionenum   = NaN; %enum that identifies this output definition uniquely, from Outputdefinition[1-10]Enum
+ 		namex              = '';
+ 		namey              = '';
+ 		alpha              = NaN;
+@@ -30,6 +31,7 @@
+ 
+ 				%get names
+ 				obj.name=getfieldvalue(options,'name','');
++				obj.definitionenum=getfieldvalue(options,'definitionenum');
+ 				obj.namex=getfieldvalue(options,'namex');
+ 				obj.namey=getfieldvalue(options,'namey');
+ 
+@@ -47,6 +49,8 @@
+ 			if ~ischar(obj.name), error('masscon error message: ''name'' field should be a string!'); end
+ 			if ~ischar(obj.namex), error('masscon error message: ''namex'' field should be a string!'); end
+ 			if ~ischar(obj.namey), error('masscon error message: ''namey'' field should be a string!'); end
++			
++			md = checkfield(md,'fieldname','obj.definitionenum','field',obj.definitionenum,'values',[Outputdefinition1Enum,Outputdefinition2Enum,Outputdefinition3Enum,Outputdefinition4Enum,Outputdefinition5Enum,Outputdefinition6Enum,Outputdefinition7Enum,Outputdefinition8Enum,Outputdefinition9Enum,Outputdefinition10Enum]);
+ 
+ 			md = checkfield(md,'fieldname','obj.alpha','field',obj.alpha,'NaN',1,'size',[1 1]);
+ 			md = checkfield(md,'fieldname','obj.betaa','field',obj.beta,'NaN',1,'size',[1 1]);
+@@ -57,6 +61,7 @@
+ 			disp(sprintf('   Misfit:\n'));
+ 
+ 			fielddisplay(obj,'name','name');
++			fielddisplay(obj,'definitionenum','enum that identifies this output definition uniquely, from Outputdefinition[1-10]Enum');
+ 			fielddisplay(obj,'namex','identifier for the first masscon');
+ 			fielddisplay(obj,'alpha','first masscon multiplicator');
+ 			fielddisplay(obj,'namey','identifier for the second masscon');
+@@ -66,6 +71,7 @@
+ 		function md = marshall(obj,md,fid) % {{{
+ 
+ 		WriteData(fid,'object',obj,'fieldname','name','format','String');
++		WriteData(fid,'object',obj,'fieldname','definitionenum','format','Integer');
+ 		WriteData(fid,'object',obj,'fieldname','namex','format','String');
+ 		WriteData(fid,'object',obj,'fieldname','namey','format','String');
+ 		WriteData(fid,'object',obj,'fieldname','alpha','format','Double');
+Index: ../trunk-jpl/src/m/classes/masscon.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/masscon.m	(revision 18880)
++++ ../trunk-jpl/src/m/classes/masscon.m	(revision 18881)
+@@ -13,6 +13,7 @@
+ 	properties (SetAccess=public)
+ 		%masscon
+ 		name              = '';
++		definitionenum   = NaN; %enum that identifies this output definition uniquely, from Outputdefinition[1-10]Enum
+ 		levelset          = NaN; %levelset vectorial field which identifies the boundaries of the masscon
+ 	end
+ 	
+@@ -27,6 +28,7 @@
+ 				%get name
+ 				obj.name=getfieldvalue(options,'name','');
+ 				obj.levelset=getfieldvalue(options,'levelset');
++				obj.definitionenum=getfieldvalue(options,'definitionenum');
+ 
+ 			end
+ 		end % }}}
+@@ -37,6 +39,8 @@
+ 			if ~ischar(obj.name),
+ 				error('masscon error message: ''name'' field should be a string!');
+ 			end
++			
++			md = checkfield(md,'fieldname','obj.definitionenum','field',obj.definitionenum,'values',[Outputdefinition1Enum,Outputdefinition2Enum,Outputdefinition3Enum,Outputdefinition4Enum,Outputdefinition5Enum,Outputdefinition6Enum,Outputdefinition7Enum,Outputdefinition8Enum,Outputdefinition9Enum,Outputdefinition10Enum]);
+ 
+ 			md = checkfield(md,'fieldname','obj.levelset','field',obj.levelset,'forcing',1,'NaN',1);
+ 
+@@ -46,12 +50,14 @@
+ 			disp(sprintf('   Misfit:\n'));
+ 
+ 			fielddisplay(obj,'name','identifier for this masscon response');
++			fielddisplay(obj,'definitionenum','enum that identifies this output definition uniquely, from Outputdefinition[1-10]Enum');
+ 			fielddisplay(obj,'levelset','levelset vectorial field which identifies the boundaries of the masscon');
+ 
+ 		end % }}}
+ 		function md = marshall(obj,md,fid) % {{{
+ 
+ 		WriteData(fid,'object',obj,'fieldname','name','format','String');
++		WriteData(fid,'object',obj,'fieldname','definitionenum','format','Integer');
+ 		WriteData(fid,'object',obj,'fieldname','levelset','format','DoubleMat','mattype',1);
+ 
+ 		end % }}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18881-18882.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18881-18882.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18881-18882.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/c/cores/cores.h
+===================================================================
+--- ../trunk-jpl/src/c/cores/cores.h	(revision 18881)
++++ ../trunk-jpl/src/c/cores/cores.h	(revision 18882)
+@@ -28,6 +28,7 @@
+ void control_core(FemModel* femmodel);
+ void controltao_core(FemModel* femmodel);
+ void controlm1qn3_core(FemModel* femmodel);
++void controlad_core(FemModel* femmodel);
+ void controlvalidation_core(FemModel* femmodel);
+ void masstransport_core(FemModel* femmodel);
+ void depthaverage_core(FemModel* femmodel);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18882-18883.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18882-18883.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18882-18883.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 18882)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 18883)
+@@ -413,6 +413,7 @@
+ 					./shared/Numerics/BrentSearch.cpp\
+ 					./cores/control_core.cpp\
+ 					./cores/controltao_core.cpp\
++					./cores/controlad_core.cpp\
+ 					./cores/controlm1qn3_core.cpp\
+ 					./cores/controlvalidation_core.cpp\
+ 					./cores/adjointstressbalance_core.cpp\
Index: /issm/oecreview/Archive/18296-19100/ISSM-18883-18884.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18883-18884.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18883-18884.diff	(revision 19102)
@@ -0,0 +1,171 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Element.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18883)
++++ ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18884)
+@@ -103,7 +103,7 @@
+ 		IssmDouble GetXcoord(IssmDouble* xyz_list,Gauss* gauss);
+ 		IssmDouble GetYcoord(IssmDouble* xyz_list,Gauss* gauss);
+ 		IssmDouble GetZcoord(IssmDouble* xyz_list,Gauss* gauss);
+-		void       GradientIndexing(int* indexing,int control_index);
++		void       GradientIndexing(int* indexing,int control_index,bool onsid=false);
+ 		bool       HasNodeOnBase();
+ 		bool       HasNodeOnSurface();
+ 		int        Id();
+@@ -287,7 +287,7 @@
+ 
+ 		virtual void   ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index)=0;
+ 		virtual void   ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum)=0;
+-		virtual void   GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data)=0;
++		virtual void   GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid)=0;
+ 		virtual void   SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index)=0;
+ 		virtual void   InputControlUpdate(IssmDouble scalar,bool save_parameter)=0;
+ 
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18883)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18884)
+@@ -3033,16 +3033,16 @@
+ 	vector_gradient->SetValues(NUMVERTICES,&sidlist[0],&gradients[0],ADD_VAL);
+ 
+ }/*}}}*/
+-void       Tria::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data){/*{{{*/
++void       Tria::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data,bool onsid){/*{{{*/
+ 
+-	int vertexpidlist[NUMVERTICES];
++	int vertexidlist[NUMVERTICES];
+ 	Input *input=NULL;
+ 
+ 	/*Get out if this is not an element input*/
+ 	if(!IsInput(control_enum)) return;
+ 
+ 	/*Prepare index list*/
+-	GradientIndexing(&vertexpidlist[0],control_index);
++	GradientIndexing(&vertexidlist[0],control_index,onsid);
+ 
+ 	/*Get input (either in element or material)*/
+ 	input=(Input*)this->inputs->GetInput(control_enum);   _assert_(input);
+@@ -3052,7 +3052,7 @@
+ 		_error_("input " << EnumToStringx(control_enum) << " is not a ControlInput");
+ 	}
+ 
+-	((ControlInput*)input)->GetVectorFromInputs(vector,&vertexpidlist[0],data);
++	((ControlInput*)input)->GetVectorFromInputs(vector,&vertexidlist[0],data);
+ }
+ /*}}}*/
+ void       Tria::SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){/*{{{*/
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18883)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18884)
+@@ -131,7 +131,7 @@
+ 		void   GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,IssmDouble* x,IssmDouble* y);
+ 		#endif
+ 
+-		void       GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data);
++		void       GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid);
+ 		void       SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index);
+ 		void       ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index);
+ 		void       ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum);
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18883)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18884)
+@@ -3196,15 +3196,15 @@
+ 	xDelete<int>(control_type);
+ }
+ /*}}}*/
+-void       Penta::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data){/*{{{*/
++void       Penta::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data,bool onsid){/*{{{*/
+ 
+-	int vertexpidlist[NUMVERTICES];
++	int vertexidlist[NUMVERTICES];
+ 
+ 	/*Get out if this is not an element input*/
+ 	if(!IsInput(control_enum)) return;
+ 
+ 	/*Prepare index list*/
+-	GradientIndexing(&vertexpidlist[0],control_index);
++	GradientIndexing(&vertexidlist[0],control_index,onsid);
+ 
+ 	/*Get input (either in element or material)*/
+ 	if(control_enum==MaterialsRheologyBbarEnum) control_enum=MaterialsRheologyBEnum;
+@@ -3216,7 +3216,7 @@
+ 		_error_("input " << EnumToStringx(control_enum) << " is not a ControlInput");
+ 	}
+ 
+-	((ControlInput*)input)->GetVectorFromInputs(vector,&vertexpidlist[0],data);
++	((ControlInput*)input)->GetVectorFromInputs(vector,&vertexidlist[0],data);
+ }
+ /*}}}*/
+ void       Penta::SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){/*{{{*/
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18883)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18884)
+@@ -125,7 +125,7 @@
+ 		void   GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,IssmDouble* x,IssmDouble* y);
+ 		#endif
+ 
+-		void   GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data);
++		void   GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid);
+ 		void   SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index);
+ 		void   ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index);
+ 		void   ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum);
+Index: ../trunk-jpl/src/c/classes/Elements/Seg.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18883)
++++ ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18884)
+@@ -163,7 +163,7 @@
+ 		void   GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,IssmDouble* x,IssmDouble* y){_error_("not implemented yet");};
+ #endif
+ 
+-		void       GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data){_error_("not implemented yet");};
++		void       GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid){_error_("not implemented yet");};
+ 		void       SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){_error_("not implemented yet");};
+ 		void       ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){_error_("not implemented yet");};
+ 		void       ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum){_error_("not implemented yet");};
+Index: ../trunk-jpl/src/c/classes/Elements/Tetra.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18883)
++++ ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18884)
+@@ -169,7 +169,7 @@
+ 
+ 		IssmDouble DragCoefficientAbsGradient(void){_error_("not implemented yet");};
+ 		void       GradientIndexing(int* indexing,int control_index){_error_("not implemented yet");};
+-		void       GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data){_error_("not implemented yet");};
++		void       GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid){_error_("not implemented yet");};
+ 		void       SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){_error_("not implemented yet");};
+ 		void       ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){_error_("not implemented yet");};
+ 		void       ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum){_error_("not implemented yet");};
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18883)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18884)
+@@ -943,7 +943,7 @@
+ 	xDelete<IssmDouble>(z_list);
+ 	return z;
+ }/*}}}*/
+-void       Element::GradientIndexing(int* indexing,int control_index){/*{{{*/
++void       Element::GradientIndexing(int* indexing,int control_index,bool onsid){/*{{{*/
+ 
+ 	/*Get number of controls*/
+ 	int num_controls;
+@@ -953,9 +953,16 @@
+ 	int numvertices = this->GetNumberOfVertices();
+ 
+ 	/*get gradient indices*/
+-	for(int i=0;i<numvertices;i++){
+-		indexing[i]=num_controls*this->vertices[i]->Pid() + control_index;
++	if(onsid){
++		for(int i=0;i<numvertices;i++){
++			indexing[i]=num_controls*this->vertices[i]->Sid() + control_index;
++		}
+ 	}
++	else{
++		for(int i=0;i<numvertices;i++){
++			indexing[i]=num_controls*this->vertices[i]->Pid() + control_index;
++		}
++	}
+ 
+ }
+ /*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18884-18885.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18884-18885.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18884-18885.diff	(revision 19102)
@@ -0,0 +1,255 @@
+Index: ../trunk-jpl/src/c/classes/Masscon.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Masscon.h	(revision 18884)
++++ ../trunk-jpl/src/c/classes/Masscon.h	(revision 18885)
+@@ -19,6 +19,7 @@
+ 
+ 	public: 
+ 
++		int         definitionenum;
+ 		char*       name;
+ 		IssmDouble* levelset;
+ 		int         M;
+@@ -26,14 +27,16 @@
+ 		/*Masscon constructors, destructors :*/
+ 		Masscon(){/*{{{*/
+ 
++			this->definitionenum = -1;
+ 			this->name = NULL;
+ 			this->levelset=NULL;
+ 			this->M=0;
+ 
+ 		}
+ 		/*}}}*/
+-		Masscon(char* in_name, IssmDouble* levelsetin, int Min){ /*{{{*/
++		Masscon(char* in_name, int in_definitionenum, IssmDouble* levelsetin, int Min){ /*{{{*/
+ 
++			this->definitionenum=in_definitionenum;
+ 			this->name   = xNew<char>(strlen(in_name)+1);
+ 			xMemCpy<char>(this->name,in_name,strlen(in_name)+1);
+ 
+@@ -51,7 +54,7 @@
+ 		/*}}}*/
+ 		/*Object virtual function resolutoin: */
+ 		void Echo(void){/*{{{*/
+-			_printf_(" Masscon: " << name << "\n");
++			_printf_(" Masscon: " << this->name << " " << this->definitionenum << "\n");
+ 			_printf_("    levelset: " << this->levelset << "\n");
+ 			_printf_("    M: " << this->M << "\n");
+ 		}
+@@ -69,7 +72,7 @@
+ 		}
+ 		/*}}}*/
+ 		Object* copy() {/*{{{*/
+-			Masscon* mf = new Masscon(this->name,this->levelset,this->M);
++			Masscon* mf = new Masscon(this->name,this->definitionenum,this->levelset,this->M);
+ 			return (Object*) mf;
+ 		}
+ 		/*}}}*/
+@@ -82,6 +85,11 @@
+ 			return name2;
+ 		}
+ 		/*}}}*/
++		int DefinitionEnum(){/*{{{*/
++
++			return this->definitionenum;
++		}
++		/*}}}*/
+ 		 IssmDouble Response(FemModel* femmodel){/*{{{*/
+ 
+ 			 int i;
+Index: ../trunk-jpl/src/c/classes/Misfit.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Misfit.h	(revision 18884)
++++ ../trunk-jpl/src/c/classes/Misfit.h	(revision 18885)
+@@ -20,6 +20,7 @@
+ 
+ 	public: 
+ 
++		int         definitionenum;
+ 		char*       name;
+ 		int         model_enum;
+ 		int         observation_enum;
+@@ -32,6 +33,7 @@
+ 		/*Misfit constructors, destructors :*/
+ 		Misfit(){/*{{{*/
+ 
++			this->definitionenum = -1;
+ 			this->name = NULL;
+ 			this->model_enum = UNDEF;
+ 			this->observation_enum = UNDEF;
+@@ -42,8 +44,9 @@
+ 
+ 		}
+ 		/*}}}*/
+-		Misfit(char* in_name, int in_model_enum, int in_observation_enum, char* in_timeinterpolation, int in_weights_enum){/*{{{*/
++		Misfit(char* in_name, int in_definitionenum, int in_model_enum, int in_observation_enum, char* in_timeinterpolation, int in_weights_enum){/*{{{*/
+ 
++			this->definitionenum=in_definitionenum;
+ 			this->name   = xNew<char>(strlen(in_name)+1);
+ 			xMemCpy<char>(this->name,in_name,strlen(in_name)+1);
+ 
+@@ -67,7 +70,7 @@
+ 		/*}}}*/
+ 		/*Object virtual function resolutoin: */
+ 		void Echo(void){/*{{{*/
+-			_printf_(" Misfit: " << name << "\n");
++			_printf_(" Misfit: " << name << " " << this->definitionenum << "\n");
+ 			_printf_("    model_enum: " << model_enum << " " << EnumToStringx(model_enum) << "\n");
+ 			_printf_("    observation_enum: " << observation_enum << " " << EnumToStringx(observation_enum) << "\n");
+ 			_printf_("    weights_enum: " << weights_enum << " " << EnumToStringx(weights_enum) << "\n");
+@@ -87,7 +90,7 @@
+ 		}
+ 		/*}}}*/
+ 		Object* copy() {/*{{{*/
+-			Misfit* mf = new Misfit(this->name,this->model_enum,this->observation_enum,this->timeinterpolation,this->weights_enum);
++			Misfit* mf = new Misfit(this->name,this->definitionenum, this->model_enum,this->observation_enum,this->timeinterpolation,this->weights_enum);
+ 			mf->misfit=this->misfit;
+ 			mf->lock=this->lock;
+ 			return (Object*) mf;
+@@ -102,6 +105,11 @@
+ 			return name2;
+ 		}
+ 		/*}}}*/
++		int DefinitionEnum(){/*{{{*/
++
++			return this->definitionenum;
++		}
++		/*}}}*/
+ 		 IssmDouble Response(FemModel* femmodel){/*{{{*/
+ 
+ 			 int i;
+Index: ../trunk-jpl/src/c/classes/Massconaxpby.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Massconaxpby.h	(revision 18884)
++++ ../trunk-jpl/src/c/classes/Massconaxpby.h	(revision 18885)
+@@ -19,6 +19,7 @@
+ 
+ 	public: 
+ 
++		int         definitionenum;
+ 		char*       name;
+ 		char*       namex;
+ 		char*       namey;
+@@ -28,6 +29,7 @@
+ 		/*Massconaxpby constructors, destructors :*/
+ 		Massconaxpby(){/*{{{*/
+ 
++			this->definitionenum = -1;
+ 			this->name = NULL;
+ 			this->namex = NULL;
+ 			this->namey = NULL;
+@@ -36,8 +38,9 @@
+ 
+ 		}
+ 		/*}}}*/
+-		Massconaxpby(char* in_name,char* in_namex, char* in_namey, IssmDouble in_alpha,IssmDouble in_beta){ /*{{{*/
++		Massconaxpby(char* in_name,int in_definitionenum, char* in_namex, char* in_namey, IssmDouble in_alpha,IssmDouble in_beta){ /*{{{*/
+ 
++			this->definitionenum = in_definitionenum;
+ 			this->name   = xNew<char>(strlen(in_name)+1);
+ 			xMemCpy<char>(this->name,in_name,strlen(in_name)+1);
+ 
+@@ -60,7 +63,7 @@
+ 		/*}}}*/
+ 		/*Object virtual function resolutoin: */
+ 		void Echo(void){/*{{{*/
+-			_printf_(" Massconaxpby: " << this->name << "\n");
++			_printf_(" Massconaxpby: " << this->name << " " << this->definitionenum << "\n");
+ 			_printf_("    namex: " << this->namex << "\n");
+ 			_printf_("    namey: " << this->namey << "\n");
+ 			_printf_("    alpha: " << this->alpha << "\n");
+@@ -80,7 +83,7 @@
+ 		}
+ 		/*}}}*/
+ 		Object* copy() {/*{{{*/
+-			Massconaxpby* mf = new Massconaxpby(this->name,this->namex,this->namey, this->alpha, this->beta);
++			Massconaxpby* mf = new Massconaxpby(this->name,this->definitionenum,this->namex,this->namey, this->alpha, this->beta);
+ 			return (Object*) mf;
+ 		}
+ 		/*}}}*/
+@@ -93,6 +96,11 @@
+ 			return name2;
+ 		}
+ 		/*}}}*/
++		int DefinitionEnum(){/*{{{*/
++
++			return this->definitionenum;
++		}
++		/*}}}*/
+ 		 IssmDouble Response(FemModel* femmodel){/*{{{*/
+ 
+ 			 IssmDouble xresponse,yresponse;
+Index: ../trunk-jpl/src/c/classes/Massfluxatgate.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Massfluxatgate.h	(revision 18884)
++++ ../trunk-jpl/src/c/classes/Massfluxatgate.h	(revision 18885)
+@@ -19,6 +19,7 @@
+ 
+ 	public: 
+ 
++		int         definitionenum;
+ 		char*       name;
+ 		int         numsegments;
+ 		doubletype *x1;
+@@ -29,15 +30,18 @@
+ 
+ 		/*Massfluxatgate constructors, destructors :*/
+ 		Massfluxatgate(){/*{{{*/
++			this->definitionenum        = -1;
+ 			this->name        = 0;
+ 			this->numsegments = 0;
+ 			this->segments    = 0;
+ 		}
+ 		/*}}}*/
+-		Massfluxatgate(char* in_name, int in_numsegments, doubletype* in_segments) {/*{{{*/
++		Massfluxatgate(char* in_name, int in_definitionenum, int in_numsegments, doubletype* in_segments) {/*{{{*/
+ 			
+ 			int i;
+ 
++			this->definitionenum=in_definitionenum;
++
+ 			this->name   = xNew<char>(strlen(in_name)+1);
+ 			xMemCpy<char>(this->name,in_name,strlen(in_name)+1);
+ 
+@@ -60,8 +64,9 @@
+ 			}
+ 		}
+ 		/*}}}*/
+-		Massfluxatgate(char* in_name, int in_numsegments, doubletype* in_x1, doubletype* in_y1, doubletype* in_x2, doubletype* in_y2,int* in_elements){/*{{{*/
++		Massfluxatgate(char* in_name, int in_definitionenum, int in_numsegments, doubletype* in_x1, doubletype* in_y1, doubletype* in_x2, doubletype* in_y2,int* in_elements){/*{{{*/
+ 
++			this->definitionenum=in_definitionenum;
+ 			this->name   = xNew<char>(strlen(in_name)+1);
+ 			xMemCpy<char>(this->name,in_name,strlen(in_name)+1);
+ 
+@@ -89,7 +94,7 @@
+ 
+ 		/*Object virtual function resolutoin: */
+ 		void Echo(void){/*{{{*/
+-			_printf_(" Massfluxatgate: " << name << "\n");
++			_printf_(" Massfluxatgate: " << name << " " << this->definitionenum << "\n");
+ 			_printf_("    numsegments: " << numsegments << "\n");
+ 			if(numsegments){
+ 				_printf_("   element: x1, y1, x2, y2:\n");
+@@ -112,7 +117,7 @@
+ 		}
+ 		/*}}}*/
+ 		Object* copy() {/*{{{*/
+-			return new Massfluxatgate(this->name,this->numsegments,this->x1,this->y1,this->x2,this->y2,this->elements); 
++			return new Massfluxatgate(this->name,this->definitionenum,this->numsegments,this->x1,this->y1,this->x2,this->y2,this->elements); 
+ 		}
+ 		/*}}}*/
+ 		/*Definition virtual function resolutoin: */
+@@ -124,6 +129,11 @@
+ 			return name2;
+ 		}
+ 		/*}}}*/
++		int DefinitionEnum(){/*{{{*/
++
++			return this->definitionenum;
++		}
++		/*}}}*/
+ 		 IssmDouble Response(FemModel* femmodel){/*{{{*/
+ 
+ 			int          i,j;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18885-18886.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18885-18886.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18885-18886.diff	(revision 19102)
@@ -0,0 +1,80 @@
+Index: ../trunk-jpl/src/c/classes/ExternalResults/Results.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/ExternalResults/Results.cpp	(revision 18885)
++++ ../trunk-jpl/src/c/classes/ExternalResults/Results.cpp	(revision 18886)
+@@ -93,3 +93,15 @@
+ 	return 1;
+ }
+ /*}}}*/
++ExternalResult* Results::FindResult(int result_enum){/*{{{*/
++
++	for(int i=0;i<this->Size();i++){
++		ExternalResult* result=xDynamicCast<ExternalResult*>(this->GetObjectByOffset(i));
++
++		if(result->GetResultEnum()==result_enum){
++			return result;
++		}
++	}
++	return NULL;
++}
++/*}}}*/
+Index: ../trunk-jpl/src/c/classes/ExternalResults/GenericExternalResult.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/ExternalResults/GenericExternalResult.h	(revision 18885)
++++ ../trunk-jpl/src/c/classes/ExternalResults/GenericExternalResult.h	(revision 18886)
+@@ -159,14 +159,20 @@
+ 		xMemCpy<char>(name,this->result_name,strlen(this->result_name)+1);
+ 		return name;
+ } /*}}}*/
++int GetResultEnum(void){ /*{{{*/
++		return StringToEnumx(this->result_name,false);
++} /*}}}*/
+ int   GetStep(void){ /*{{{*/
+ 	return this->step;
+ } /*}}}*/
+-IssmPDouble GetValue(void){ /*{{{*/
++double GetValue(void){ /*{{{*/
+ 	/*Only supported by IssmPDouble result, error out by default*/
+ 	_error_("not supported for this type of result");
+-	return 0.;
+ } /*}}}*/
++double* GetValues(void){ /*{{{*/
++	/*Only supported by IssmPDouble* result, error out by default*/
++	_error_("not supported for this type of result");
++} /*}}}*/
+ };
+ 
+ /*Specific instantiations for bool: */
+@@ -366,6 +372,9 @@
+ template <> inline int GenericExternalResult<IssmPDouble*>::ObjectEnum(void){ /*{{{*/
+ 	return DoubleMatExternalResultEnum;
+ } /*}}}*/
++template <> inline double* GenericExternalResult<IssmPDouble*>::GetValues(void){ /*{{{*/
++	return value;
++} /*}}}*/
+ 
+ /*Specific instantiations for IssmDouble*: */
+ #if defined(_HAVE_ADOLC_) && !defined(_WRAPPERS_)  //We hook off this specific specialization when not running ADOLC, otherwise we get a redeclaration with the next specialization. 
+Index: ../trunk-jpl/src/c/classes/ExternalResults/ExternalResult.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/ExternalResults/ExternalResult.h	(revision 18885)
++++ ../trunk-jpl/src/c/classes/ExternalResults/ExternalResult.h	(revision 18886)
+@@ -27,5 +27,6 @@
+ 		virtual char*  GetResultName(void)=0;
+ 		virtual int    GetStep(void)=0;
+ 		virtual double GetValue(void)=0;
++		virtual int    GetResultEnum(void)=0;
+ };
+ #endif
+Index: ../trunk-jpl/src/c/classes/ExternalResults/Results.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/ExternalResults/Results.h	(revision 18885)
++++ ../trunk-jpl/src/c/classes/ExternalResults/Results.h	(revision 18886)
+@@ -21,6 +21,7 @@
+ 
+ 		/*Mehthos*/
+ 		int AddResult(ExternalResult* result);
++		ExternalResult* FindResult(int result_enum);
+ 		int DeleteResult(int result_enum,int result_step);
+ 		void Write(Parameters* parameters);
+ };
Index: /issm/oecreview/Archive/18296-19100/ISSM-18886-18887.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18886-18887.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18886-18887.diff	(revision 19102)
@@ -0,0 +1,30 @@
+Index: ../trunk-jpl/src/c/cores/ad_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/ad_core.cpp	(revision 18886)
++++ ../trunk-jpl/src/c/cores/ad_core.cpp	(revision 18887)
+@@ -58,7 +58,7 @@
+ 			}
+ 			
+ 			/*Print tape statistics so that user can kill this run if something is off already:*/
+-			if(VerboseAutodiff()){
++			if(VerboseAutodiff()){ /*{{{*/
+ 				tapestats(my_rank,tape_stats); //reading of tape statistics
+ 				int commSize=IssmComm::GetSize();
+ 				int *sstats=new int[7];
+@@ -98,7 +98,7 @@
+ 					delete []rstats;
+ 				}
+ 				delete [] sstats;
+-			}
++			} /*}}}*/
+ 
+ 			/*retrieve state variable: */
+ 			femmodel->parameters->FindParam(&axp,&dummy,AutodiffXpEnum);
+@@ -257,7 +257,6 @@
+ 
+ 				/*call driver: */
+ 				fos_reverse(my_rank,num_dependents,num_independents, aWeightVector, weightVectorTimesJac );
+-				if(VerboseAutodiff())_printf0_("   done with fos_reverse\n");
+ 
+ 				/*add to results*/
+ 				femmodel->results->AddObject(new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,AutodiffJacobianEnum,weightVectorTimesJac,num_independents,1,1,0.0));
Index: /issm/oecreview/Archive/18296-19100/ISSM-18887-18888.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18887-18888.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18887-18888.diff	(revision 19102)
@@ -0,0 +1,277 @@
+Index: ../trunk-jpl/src/c/cores/WrapperCorePointerFromSolutionEnum.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/WrapperCorePointerFromSolutionEnum.cpp	(revision 18887)
++++ ../trunk-jpl/src/c/cores/WrapperCorePointerFromSolutionEnum.cpp	(revision 18888)
+@@ -46,6 +46,7 @@
+ 			case 1: solutioncore=controltao_core; break;
+ 			case 2: solutioncore=controlm1qn3_core; break;
+ 			case 3: solutioncore=controlvalidation_core; break;
++			case 4: solutioncore=controlad_core; break;
+ 			default: _error_("control type not supported");
+ 		}
+ 	}
+Index: ../trunk-jpl/src/c/cores/controlad_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/controlad_core.cpp	(revision 0)
++++ ../trunk-jpl/src/c/cores/controlad_core.cpp	(revision 18888)
+@@ -0,0 +1,260 @@
++/*!\file: controlad_core.cpp
++ * \brief: core of the ad control solution 
++ */ 
++
++#include <config.h>
++#include "./cores.h"
++#include "../toolkits/toolkits.h"
++#include "../classes/classes.h"
++#include "../shared/shared.h"
++#include "../modules/modules.h"
++#include "../solutionsequences/solutionsequences.h"
++
++#if defined (_HAVE_M1QN3_)  & defined (_HAVE_ADOLC_)
++/*m1qn3 prototypes {{{*/
++extern "C" void *ctonbe_; // DIS mode : Conversion
++extern "C" void *ctcabe_; // DIS mode : Conversion
++extern "C" void *euclid_; // Scalar product
++typedef void (*SimulFunc) (long* indic,long* n, double* x, double* pf,double* g,long [],float [],void* dzs);
++extern "C" void m1qn3_ (void f(long* indic,long* n, double* x, double* pf,double* g,long [],float [],void* dzs),
++			void **, void **, void **,
++			long *, double [], double *, double [], double*, double *,
++			double *, char [], long *, long *, long *, long *, long *, long *, long [], double [], long *,
++			long *, long *, long [], float [],void* );
++
++/*Cost function prototype*/
++void simulad(long* indic,long* n,double* X,double* pf,double* G,long izs[1],float rzs[1],void* dzs);
++/*}}}*/
++void controlad_core(FemModel* femmodel){ /*{{{*/
++
++	/*Intermediaries*/
++	int          i;
++	long         omode;
++	IssmPDouble  f,dxmin,gttol;
++	IssmDouble   dxmind,gttold; 
++	int          maxsteps,maxiter;
++	int          intn,numberofvertices,num_controls,solution_type;
++	IssmDouble  *scaling_factors = NULL;
++	IssmPDouble  *X  = NULL;
++	IssmDouble   *Xd  = NULL;
++	IssmDouble   *Gd  = NULL;
++	IssmPDouble  *G  = NULL;
++	bool onsid=true;
++
++	/*Recover some parameters*/
++	femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
++	femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
++	femmodel->parameters->FindParam(&maxsteps,InversionMaxstepsEnum);
++	femmodel->parameters->FindParam(&maxiter,InversionMaxiterEnum);
++	femmodel->parameters->FindParam(&dxmind,InversionDxminEnum); dxmin=reCast<IssmPDouble>(dxmind);
++	femmodel->parameters->FindParam(&gttold,InversionGttolEnum); gttol=reCast<IssmPDouble>(gttold);
++	femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
++	femmodel->parameters->SetParam(false,SaveResultsEnum);
++	numberofvertices=femmodel->vertices->NumberOfVertices();
++
++	/*Initialize M1QN3 parameters*/
++	if(VerboseControl())_printf0_("   Initialize M1QN3 parameters\n");
++	SimulFunc costfuncion  = &simulad;  /*Cost function address*/
++	void**    prosca       = &euclid_;  /*Dot product function (euclid is the default)*/
++	char      normtype[]   = "dfn";     /*Norm type: dfn = scalar product defined by prosca*/
++	long      izs[5];                   /*Arrays used by m1qn3 subroutines*/
++	long      iz[5];                    /*Integer m1qn3 working array of size 5*/
++	float     rzs[1];                   /*Arrays used by m1qn3 subroutines*/
++	long      impres       = 0;         /*verbosity level*/
++	long      imode[3]     = {0};       /*scaling and starting mode, 0 by default*/
++	long      indic        = 4;         /*compute f and g*/
++	long      reverse      = 0;         /*reverse or direct mode*/
++	long      io           = 6;         /*Channel number for the output*/
++
++	/*Optimization criterions*/
++	long niter = long(maxsteps); /*Maximum number of iterations*/
++	long nsim  = long(maxiter);/*Maximum number of function calls*/
++
++	/*Get initial guess*/
++	Vector<IssmDouble> *Xad = NULL;
++	GetVectorFromControlInputsx(&Xad,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value",onsid);
++	Xd = Xad->ToMPISerial();
++	Xad->GetSize(&intn);
++	X=xNew<IssmPDouble>(intn);
++	for(i=0;i<intn;i++) X[i]=reCast<IssmPDouble>(Xd[i]);
++	delete Xad;
++	_assert_(intn==numberofvertices*num_controls);
++	
++	/*Get problem dimension and initialize gradient and initial guess*/
++	long n = long(intn);
++	G = xNew<IssmPDouble>(n);
++	Gd = xNew<IssmDouble>(n);
++
++	/*Scale control for M1QN3*/
++	for(int i=0;i<numberofvertices;i++){
++		for(int c=0;c<num_controls;c++){
++			int index = num_controls*i+c;
++			X[index] = X[index]/reCast<IssmPDouble>(scaling_factors[c]);
++		}
++	}
++
++	/*Allocate m1qn3 working arrays (see doc)*/
++	long      m   = 100;
++	long      ndz = 4*n+m*(2*n+1);
++	double*   dz  = xNew<double>(ndz);
++
++	if(VerboseControl())_printf0_("   Computing initial solution\n");
++	_printf0_("\n");
++	_printf0_("Cost function f(x)   | Gradient norm |g(x)| |  List of contributions\n");
++	_printf0_("____________________________________________________________________\n");
++
++	//first run before firing up the control optimization
++	simulad(&indic,&n,X,&f,G,izs,rzs,(void*)femmodel);
++	double f1=f;
++
++	m1qn3_(costfuncion,prosca,&ctonbe_,&ctcabe_,
++				&n,X,&f,G,&dxmin,&f1,
++				&gttol,normtype,&impres,&io,imode,&omode,&niter,&nsim,iz,dz,&ndz,
++				&reverse,&indic,izs,rzs,(void*)femmodel);
++
++	switch(int(omode)){
++		case 0:  _printf0_("   Stop requested (indic = 0)\n"); break;
++		case 1:  _printf0_("   Convergence reached (gradient satisfies stopping criterion)\n"); break;
++		case 2:  _printf0_("   Bad initialization\n"); break;
++		case 3:  _printf0_("   Line search failure\n"); break;
++		case 4:  _printf0_("   Maximum number of iterations exceeded\n");break;
++		case 5:  _printf0_("   Maximum number of function calls exceeded\n"); break;
++		case 6:  _printf0_("   stopped on dxmin during line search\n"); break;
++		case 7:  _printf0_("   <g,d> > 0  or  <y,s> <0\n"); break;
++		default: _printf0_("   Unknown end condition\n");
++	}
++	
++	/*Constrain solution vector*/
++	IssmDouble  *XL = NULL;
++	IssmDouble  *XU = NULL;
++	GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound",onsid);
++	GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound",onsid);
++	for(int i=0;i<numberofvertices;i++){
++		for(int c=0;c<num_controls;c++){
++			int index = num_controls*i+c;
++			X[index] = X[index]*reCast<IssmPDouble>(scaling_factors[c]);
++			if(X[index]>XU[index]) X[index]=reCast<IssmPDouble>(XU[index]);
++			if(X[index]<XL[index]) X[index]=reCast<IssmPDouble>(XL[index]);
++		}
++	}
++
++	/*Save results:*/
++	femmodel->results->AddObject(new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,AutodiffJacobianEnum,G,n,1,1,0.0));
++	femmodel->results->AddObject(new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,AutodiffXpEnum,X,intn,1,1,0.0));
++
++	/*Clean-up and return*/
++	xDelete<double>(G);
++	xDelete<double>(X);
++	xDelete<double>(dz);
++}/*}}}*/
++void simulad(long* indic,long* n,double* X,double* pf,double* G,long izs[1],float rzs[1],void* dzs){ /*{{{*/
++
++	/*Intermediaries:*/
++	char* rootpath=NULL;
++	char* inputfilename=NULL;
++	char* outputfilename=NULL;
++	char* toolkitsfilename=NULL;
++	char* lockfilename=NULL;
++	IssmPDouble* G2=NULL;
++	bool onsid=true;
++
++	/*Recover Femmodel*/
++	int         solution_type;
++	FemModel   *femmodel  = (FemModel*)dzs;
++	FemModel   *femmodelad  = NULL;
++	IssmDouble    pfd;
++	int            i;
++
++	/*Recover number of cost functions responses*/
++	int num_responses,num_controls,numberofvertices;
++	IssmDouble* scaling_factors = NULL;
++	femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum);
++	femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
++	femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
++	numberofvertices=femmodel->vertices->NumberOfVertices();
++
++	/*Constrain input vector*/
++	IssmDouble  *XL = NULL;
++	IssmDouble  *XU = NULL;
++	GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound",onsid);
++	GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound",onsid);
++	for(int i=0;i<numberofvertices;i++){
++		for(int c=0;c<num_controls;c++){
++			int index = num_controls*i+c;
++			X[index] = X[index]*reCast<IssmPDouble>(scaling_factors[c]);
++			if(X[index]>reCast<IssmPDouble>(XU[index])) X[index]=reCast<IssmPDouble>(XU[index]);
++			if(X[index]<reCast<IssmPDouble>(XL[index])) X[index]=reCast<IssmPDouble>(XL[index]);
++		}
++	}
++
++	/*Now things get complicated. The femmodel we recovered did not initialize an AD trace, so we can't compute gradients with it. We are going to recreate 
++	 *a new femmodel, identical in all aspects to the first one, with trace on though, which will allow us to run the forward mode and get the gradient 
++	 in one run of the solution core. So first recover the filenames required for the FemModel constructor, then call a new ad tailored constructor:*/
++	femmodel->parameters->FindParam(&rootpath,RootPathEnum);
++	femmodel->parameters->FindParam(&inputfilename,InputFileNameEnum);
++	femmodel->parameters->FindParam(&outputfilename,OutputFileNameEnum);
++	femmodel->parameters->FindParam(&toolkitsfilename,ToolkitsFileNameEnum);
++	femmodel->parameters->FindParam(&lockfilename,LockFileNameEnum);
++
++	femmodelad=new FemModel(rootpath, inputfilename, outputfilename, toolkitsfilename, lockfilename, femmodel->comm, femmodel->solution_type,X);
++	femmodel=femmodelad; //We can do this, because femmodel is being called from outside, not by reference, so we won't erase it
++	
++	/*Recover some parameters*/
++	femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
++
++	/*Compute solution:*/
++	void (*solutioncore)(FemModel*)=NULL;
++	CorePointerFromSolutionEnum(&solutioncore,femmodel->parameters,solution_type);
++	solutioncore(femmodel);
++
++	/*Compute objective function*/
++	IssmDouble* Jlist = NULL;
++	femmodel->CostFunctionx(&pfd,&Jlist,NULL); *pf=reCast<IssmPDouble>(pfd);
++	_printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<"  |  ");
++	
++	/*Compute gradient using AD. Gradient is in the results after the ad_core is called*/
++	ad_core(femmodel); 
++
++	if(IssmComm::GetRank()==0){
++		GenericExternalResult<IssmPDouble*>* gradient=(GenericExternalResult<IssmPDouble*>*)femmodel->results->FindResult(AutodiffJacobianEnum); _assert_(gradient);
++		G2=gradient->GetValues();
++	}
++	else G2=xNew<IssmPDouble>(*n);
++
++	/*MPI broadcast results:*/
++	ISSM_MPI_Bcast(G2,*n,ISSM_MPI_PDOUBLE,0,IssmComm::GetComm());
++	
++	/*Send gradient to m1qn3 core: */
++	for(long i=0;i<*n;i++) G[i] = G2[i];
++	
++	/*Constrain X and G*/
++	IssmDouble  Gnorm = 0.;
++	for(int i=0;i<numberofvertices;i++){
++		for(int c=0;c<num_controls;c++){
++			int index = num_controls*i+c;
++			if(X[index]>=XU[index]) G[index]=0.;
++			if(X[index]<=XL[index]) G[index]=0.;
++			G[index] = G[index]*reCast<IssmPDouble>(scaling_factors[c]);
++			X[index] = X[index]/reCast<IssmPDouble>(scaling_factors[c]);
++			Gnorm += G[index]*G[index];
++		}
++	}
++	Gnorm = sqrt(Gnorm);
++
++	/*Print info*/
++	_printf0_("       "<<setw(12)<<setprecision(7)<<Gnorm<<" |");
++	for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(12)<<setprecision(7)<<Jlist[i]);
++	_printf0_("\n");
++
++	/*Clean-up and return*/
++	xDelete<IssmDouble>(Jlist);
++	xDelete<IssmDouble>(XU);
++	xDelete<IssmDouble>(XL);
++	xDelete<IssmPDouble>(G2);
++	//if(femmodelad)delete femmodelad;
++} /*}}}*/
++#else
++void controlad_core(FemModel* femmodel){ /*{{{*/
++	_error_("AD and/or M1QN3 not installed");
++}/*}}}*/
++#endif //_HAVE_M1QN3_
Index: /issm/oecreview/Archive/18296-19100/ISSM-18888-18889.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18888-18889.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18888-18889.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/classes/IndependentObject.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/IndependentObject.h	(revision 18888)
++++ ../trunk-jpl/src/c/classes/IndependentObject.h	(revision 18889)
+@@ -32,7 +32,7 @@
+ 		Object* copy(void);
+ 		/*}}}*/
+ 		/*IndependentObject methods: {{{*/
+-		void FetchIndependent(IoModel* iomodel);
++		void FetchIndependent(IoModel* iomodel,int* pXcount,IssmPDouble* X);
+ 		int  NumIndependents(void);
+ 		void FillIndependents(IssmDouble** data, IssmDouble* xp);
+ 		/*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18889-18890.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18889-18890.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18889-18890.diff	(revision 19102)
@@ -0,0 +1,46 @@
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18889)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18890)
+@@ -89,6 +89,7 @@
+ FemModel::FemModel(char* rootpath, char* inputfilename, char* outputfilename, char* toolkitsfilename, char* lockfilename, ISSM_MPI_Comm incomm, int solution_type,IssmPDouble* X){ /*{{{*/
+ 
+ 	bool traceon=true;
++	this->profiler=NULL; /*avoid leak, as we are not using the profiler ever in ad control run. */
+ 	
+ 	/*Store the communicator, but do not set it as a global variable, as this has already 
+ 	 * been done by the FemModel that called this copy constructor: */
+@@ -111,21 +112,20 @@
+ 	this->parameters->FindParam(&lockfilename,LockFileNameEnum);
+ 
+ 	/*Delete all the datasets: */
+-	xDelete<int>(analysis_type_list);
+-	xDelete<char>(outbinfilename);
+-	xDelete<char>(lockfilename);
+-	delete elements;
+-	delete nodes;
+-	delete vertices;
+-	delete constraints;
+-	delete loads;
+-	delete materials;
+-	delete parameters;
+-	delete results;
++	if(analysis_type_list)xDelete<int>(analysis_type_list);
++	if(outbinfilename)xDelete<char>(outbinfilename);
++	if(lockfilename)xDelete<char>(lockfilename);
++	if(elements)delete elements;
++	if(nodes)delete nodes;
++	if(vertices)delete vertices;
++	if(constraints)delete constraints;
++	if(loads)delete loads;
++	if(materials)delete materials;
++	if(parameters)delete parameters;
++	if(results)delete results;
+ 
+ 	/*Now delete: */
+-	delete profiler;
+-
++	if(profiler)delete profiler;
+ }
+ /*}}}*/
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18890-18891.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18890-18891.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18890-18891.diff	(revision 19102)
@@ -0,0 +1,76 @@
+Index: ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18890)
++++ ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp	(revision 18891)
+@@ -10,7 +10,7 @@
+ #include "../modules/modules.h"
+ #include "../solutionsequences/solutionsequences.h"
+ 
+-#if defined (_HAVE_M1QN3_)
++#if defined (_HAVE_M1QN3_) & !defined(_HAVE_ADOLC_)
+ /*m1qn3 prototypes*/
+ extern "C" void *ctonbe_; // DIS mode : Conversion
+ extern "C" void *ctcabe_; // DIS mode : Conversion
+Index: ../trunk-jpl/src/c/cores/controlad_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/controlad_core.cpp	(revision 18890)
++++ ../trunk-jpl/src/c/cores/controlad_core.cpp	(revision 18891)
+@@ -157,13 +157,16 @@
+ 	char* lockfilename=NULL;
+ 	IssmPDouble* G2=NULL;
+ 	bool onsid=true;
+-
+-	/*Recover Femmodel*/
++	IssmDouble  *XL = NULL;
++	IssmDouble  *XU = NULL;
+ 	int         solution_type;
+-	FemModel   *femmodel  = (FemModel*)dzs;
++	FemModel   *femmodel  =  NULL;
+ 	FemModel   *femmodelad  = NULL;
+ 	IssmDouble    pfd;
+ 	int            i;
++	
++	/*Recover Femmodel*/
++	femmodel  = (FemModel*)dzs;
+ 
+ 	/*Recover number of cost functions responses*/
+ 	int num_responses,num_controls,numberofvertices;
+@@ -174,8 +177,6 @@
+ 	numberofvertices=femmodel->vertices->NumberOfVertices();
+ 
+ 	/*Constrain input vector*/
+-	IssmDouble  *XL = NULL;
+-	IssmDouble  *XU = NULL;
+ 	GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound",onsid);
+ 	GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound",onsid);
+ 	for(int i=0;i<numberofvertices;i++){
+@@ -216,8 +217,12 @@
+ 	ad_core(femmodel); 
+ 
+ 	if(IssmComm::GetRank()==0){
++		IssmPDouble* G_temp=NULL;
+ 		GenericExternalResult<IssmPDouble*>* gradient=(GenericExternalResult<IssmPDouble*>*)femmodel->results->FindResult(AutodiffJacobianEnum); _assert_(gradient);
+-		G2=gradient->GetValues();
++		G_temp=gradient->GetValues();
++		/*copy onto G2, to avoid a leak: */
++		G2=xNew<IssmPDouble>(*n); 
++		xMemCpy<IssmPDouble>(G2,G_temp,*n);
+ 	}
+ 	else G2=xNew<IssmPDouble>(*n);
+ 
+@@ -251,7 +256,14 @@
+ 	xDelete<IssmDouble>(XU);
+ 	xDelete<IssmDouble>(XL);
+ 	xDelete<IssmPDouble>(G2);
+-	//if(femmodelad)delete femmodelad;
++	
++	xDelete<char>(rootpath);
++	xDelete<char>(inputfilename
++	xDelete<char>(outputfilename);
++	xDelete<char>(toolkitsfilename);
++	xDelete<char>(lockfilename);
++	if(femmodelad)delete femmodelad;
++
+ } /*}}}*/
+ #else
+ void controlad_core(FemModel* femmodel){ /*{{{*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18891-18892.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18891-18892.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18891-18892.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/cores/controlad_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/controlad_core.cpp	(revision 18891)
++++ ../trunk-jpl/src/c/cores/controlad_core.cpp	(revision 18892)
+@@ -258,7 +258,7 @@
+ 	xDelete<IssmPDouble>(G2);
+ 	
+ 	xDelete<char>(rootpath);
+-	xDelete<char>(inputfilename
++	xDelete<char>(inputfilename);
+ 	xDelete<char>(outputfilename);
+ 	xDelete<char>(toolkitsfilename);
+ 	xDelete<char>(lockfilename);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18892-18893.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18892-18893.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18892-18893.diff	(revision 19102)
@@ -0,0 +1,20 @@
+Index: ../trunk-jpl/src/c/cores/controlad_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/controlad_core.cpp	(revision 18892)
++++ ../trunk-jpl/src/c/cores/controlad_core.cpp	(revision 18893)
+@@ -146,6 +146,7 @@
+ 	xDelete<double>(G);
+ 	xDelete<double>(X);
+ 	xDelete<double>(dz);
++	xDelete<IssmDouble>(scaling_factors);
+ }/*}}}*/
+ void simulad(long* indic,long* n,double* X,double* pf,double* G,long izs[1],float rzs[1],void* dzs){ /*{{{*/
+ 
+@@ -256,6 +257,7 @@
+ 	xDelete<IssmDouble>(XU);
+ 	xDelete<IssmDouble>(XL);
+ 	xDelete<IssmPDouble>(G2);
++	xDelete<IssmDouble>(scaling_factors);
+ 	
+ 	xDelete<char>(rootpath);
+ 	xDelete<char>(inputfilename);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18893-18894.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18893-18894.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18893-18894.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/m/classes/massfluxatgate.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/massfluxatgate.m	(revision 18893)
++++ ../trunk-jpl/src/m/classes/massfluxatgate.m	(revision 18894)
+@@ -60,6 +60,7 @@
+ 
+ 		%ok, marshall name and segments: 
+ 		WriteData(fid,'object',obj,'fieldname','name','format','String');
++		WriteData(fid,'object',obj,'fieldname','definitionenum','format','Integer');
+ 		WriteData(fid,'object',obj,'fieldname','segments','format','DoubleMat','mattype',1);
+ 
+ 		end % }}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18894-18895.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18894-18895.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18894-18895.diff	(revision 19102)
@@ -0,0 +1,23 @@
+Index: ../trunk-jpl/test/NightlyRun/test101.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test101.m	(revision 18894)
++++ ../trunk-jpl/test/NightlyRun/test101.m	(revision 18895)
+@@ -7,12 +7,12 @@
+ %output
+ md.stressbalance.requested_outputs={'default','DeviatoricStressxx','DeviatoricStressyy','DeviatoricStressxy','MassFlux1','MassFlux2','MassFlux3','MassFlux4','MassFlux5','MassFlux6'};
+ md.outputdefinition.definitions={...
+-	massfluxatgate('MassFlux1',['../Exp/MassFlux1.exp']),...
+-	massfluxatgate('MassFlux2',['../Exp/MassFlux2.exp']),...
+-	massfluxatgate('MassFlux3',['../Exp/MassFlux3.exp']),...
+-	massfluxatgate('MassFlux4',['../Exp/MassFlux4.exp']),...
+-	massfluxatgate('MassFlux5',['../Exp/MassFlux5.exp']),...
+-	massfluxatgate('MassFlux6',['../Exp/MassFlux6.exp'])...
++	massfluxatgate('name','MassFlux1','profilename',['../Exp/MassFlux1.exp'],'definitionenum',Outputdefinition1Enum),...
++	massfluxatgate('name','MassFlux2','profilename',['../Exp/MassFlux2.exp'],'definitionenum',Outputdefinition2Enum),...
++	massfluxatgate('name','MassFlux3','profilename',['../Exp/MassFlux3.exp'],'definitionenum',Outputdefinition3Enum),...
++	massfluxatgate('name','MassFlux4','profilename',['../Exp/MassFlux4.exp'],'definitionenum',Outputdefinition4Enum),...
++	massfluxatgate('name','MassFlux5','profilename',['../Exp/MassFlux5.exp'],'definitionenum',Outputdefinition5Enum),...
++	massfluxatgate('name','MassFlux6','profilename',['../Exp/MassFlux6.exp'],'definitionenum',Outputdefinition6Enum)...
+ 	};
+ 
+ md=solve(md,StressbalanceSolutionEnum());
Index: /issm/oecreview/Archive/18296-19100/ISSM-18895-18896.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18895-18896.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18895-18896.diff	(revision 19102)
@@ -0,0 +1,187 @@
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 18895)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 18896)
+@@ -345,6 +345,7 @@
+ 					./cores/WrapperCorePointerFromSolutionEnum.cpp\
+ 					./cores/CorePointerFromSolutionEnum.cpp\
+ 					./cores/ad_core.cpp\
++					./cores/adgradient_core.cpp\
+ 					./main/EnvironmentInit.cpp\
+ 					./main/EnvironmentFinalize.cpp\
+ 					./analyses/EnumToAnalysis.h\
+Index: ../trunk-jpl/src/c/cores/adgradient_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/adgradient_core.cpp	(revision 0)
++++ ../trunk-jpl/src/c/cores/adgradient_core.cpp	(revision 18896)
+@@ -0,0 +1,145 @@
++/*!\file adgradient_core
++ * \brief: compute gradient for all scalar depenendents, then sum them up as output. This relies mainly on the fos_reverse 
++ * driver, hence the incapacity to merge this with ad_core.cpp.
++ */
++
++/*Includes: {{{*/
++#ifdef HAVE_CONFIG_H
++	#include <config.h>
++#else
++#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
++#endif
++
++#include <set>
++#include "./cores.h"
++#include "../toolkits/toolkits.h"
++#include "../classes/classes.h"
++#include "../shared/shared.h"
++#include "../modules/modules.h"
++#include "../solutionsequences/solutionsequences.h"
++/*}}}*/
++
++void adgradient_core(FemModel* femmodel){
++
++	/*diverse: */
++	int     i;
++	int     dummy;
++	int     num_dependents=0;
++	int     num_dependents_old=0;
++	int     num_independents=0;
++	bool    isautodiff       = false;
++	int     aDepIndex=0;
++	int     my_rank=IssmComm::GetRank();
++
++	/*state variables: */
++	IssmDouble *axp = NULL;
++	IssmPDouble     *xp  = NULL;
++
++	/*intermediary: */
++	IssmPDouble *aWeightVector=NULL;
++	IssmPDouble *weightVectorTimesJac=NULL;
++	
++	/*output: */
++	IssmPDouble *totalgradient=NULL;
++
++	/*AD mode on?: */
++	femmodel->parameters->FindParam(&isautodiff,AutodiffIsautodiffEnum);
++
++	if(isautodiff){
++
++		#ifdef _HAVE_ADOLC_
++			if(VerboseAutodiff())_printf0_("   start ad core\n"); 
++
++			/*First, stop tracing: */
++			trace_off();
++		
++			/*retrieve parameters: */
++			femmodel->parameters->FindParam(&num_dependents,AutodiffNumDependentsEnum);
++			femmodel->parameters->FindParam(&num_independents,AutodiffNumIndependentsEnum);
++			
++			/*if no dependents, no point in running a driver: */
++			if(!(num_dependents*num_independents)) return;
++
++			/*for adolc to run in parallel, we 0 out on rank~=0. But we still keep track of num_dependents:*/
++			num_dependents_old=num_dependents;
++			if (my_rank!=0){
++				num_dependents=0; num_independents=0;
++			}
++			
++			/*retrieve state variable: */
++			femmodel->parameters->FindParam(&axp,&dummy,AutodiffXpEnum);
++			
++			/* driver argument */
++			xp=xNew<double>(num_independents);
++			for(i=0;i<num_independents;i++){
++				xp[i]=reCast<double,IssmDouble>(axp[i]);
++			}
++
++			/*get the EDF pointer:*/
++			ext_diff_fct *anEDF_for_solverx_p=xDynamicCast<GenericParam<Adolc_edf> * >(femmodel->parameters->FindParamObject(AdolcParamEnum))->GetParameterValue().myEDF_for_solverx_p;
++
++			/* these are always needed regardless of the interpreter */
++			anEDF_for_solverx_p->dp_x=xNew<double>(anEDF_for_solverx_p->max_n);
++			anEDF_for_solverx_p->dp_y=xNew<double>(anEDF_for_solverx_p->max_m);
++
++			/* Ok, now we are going to call the fos_reverse in a loop on the index, from 0 to num_dependents, so 
++			 * as to generate num_dependents gradients: */
++
++			/*Initialize outputs: */
++			totalgradient=xNewZeroInit<IssmPDouble>(num_independents);
++			
++			for(aDepIndex=0;aDepIndex<num_dependents_old;aDepIndex++){
++
++				/*initialize direction index in the weights vector: */
++				aWeightVector=xNewZeroInit<IssmPDouble>(num_dependents);
++				if (my_rank==0) aWeightVector[aDepIndex]=1.0;
++				
++				/*initialize output gradient: */
++				weightVectorTimesJac=xNew<IssmPDouble>(num_independents);
++
++				/*set the forward method function pointer: */
++				#ifdef _HAVE_GSL_
++				anEDF_for_solverx_p->fos_reverse=EDF_fos_reverse_for_solverx;
++				#endif
++				#ifdef _HAVE_MUMPS_
++				anEDF_for_solverx_p->fos_reverse_iArr=fos_reverse_mumpsSolveEDF;
++				#endif
++
++				anEDF_for_solverx_p->dp_U=xNew<IssmPDouble>(anEDF_for_solverx_p->max_m);
++				anEDF_for_solverx_p->dp_Z=xNew<IssmPDouble>(anEDF_for_solverx_p->max_n);
++
++				/*call driver: */
++				fos_reverse(my_rank,num_dependents,num_independents, aWeightVector, weightVectorTimesJac );
++
++				/*Add to totalgradient: */
++				if(my_rank==0)for(i=0;i<num_independents;i++)totalgradient[i]+=weightVectorTimesJac[i];
++
++				/*free resources :*/
++				xDelete(weightVectorTimesJac);
++				xDelete(aWeightVector);
++			}
++		
++			/*add totalgradient to results*/
++			femmodel->results->AddObject(new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,AutodiffJacobianEnum,totalgradient,num_independents,1,1,0.0));
++
++			if(VerboseAutodiff())_printf0_("   end ad core\n");
++			
++			/* delete the allocated space for the parameters and free ressources:{{{*/
++			xDelete(anEDF_for_solverx_p->dp_x);
++			xDelete(anEDF_for_solverx_p->dp_X);
++			xDelete(anEDF_for_solverx_p->dpp_X);
++			xDelete(anEDF_for_solverx_p->dp_y);
++			xDelete(anEDF_for_solverx_p->dp_Y);
++			xDelete(anEDF_for_solverx_p->dpp_Y);
++			xDelete(anEDF_for_solverx_p->dp_U);
++			xDelete(anEDF_for_solverx_p->dpp_U);
++			xDelete(anEDF_for_solverx_p->dp_Z);
++			xDelete(anEDF_for_solverx_p->dpp_Z);
++			xDelete(xp);
++			xDelete(totalgradient);
++			xDelete(axp); /*}}}*/
++		#else
++			_error_("Should not be requesting AD drivers when an AD library is not available!");
++		#endif
++	}
++}
+Index: ../trunk-jpl/src/c/cores/cores.h
+===================================================================
+--- ../trunk-jpl/src/c/cores/cores.h	(revision 18895)
++++ ../trunk-jpl/src/c/cores/cores.h	(revision 18896)
+@@ -42,6 +42,7 @@
+ void transient_core(FemModel* femmodel);
+ void dakota_core(FemModel* femmodel);
+ void ad_core(FemModel* femmodel);
++void adgradient_core(FemModel* femmodel);
+ void dummy_core(FemModel* femmodel);
+ void gia_core(FemModel* femmodel);
+ void damage_core(FemModel* femmodel);
+Index: ../trunk-jpl/src/c/cores/controlad_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/controlad_core.cpp	(revision 18895)
++++ ../trunk-jpl/src/c/cores/controlad_core.cpp	(revision 18896)
+@@ -215,7 +215,7 @@
+ 	_printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<"  |  ");
+ 	
+ 	/*Compute gradient using AD. Gradient is in the results after the ad_core is called*/
+-	ad_core(femmodel); 
++	adgradient_core(femmodel); 
+ 
+ 	if(IssmComm::GetRank()==0){
+ 		IssmPDouble* G_temp=NULL;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18896-18897.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18896-18897.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18896-18897.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/test/NightlyRun/test123.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test123.m	(revision 18896)
++++ ../trunk-jpl/test/NightlyRun/test123.m	(revision 18897)
+@@ -9,7 +9,7 @@
+ [md.geometry.surface+300;2.5]];
+ 
+ md.transient.requested_outputs={'default','SurfaceMisfit'};
+-md.outputdefinition.definitions={misfit('name','SurfaceMisfit', 'model_enum',SurfaceEnum,'observation_enum',SurfaceObservationEnum,'observation',fake_surface,'timeinterpolation','nearestneighbor','weights',ones(md.mesh.numberofvertices,1),'weights_enum',WeightsSurfaceObservationEnum)};
++md.outputdefinition.definitions={misfit('name','SurfaceMisfit', 'definitionenum',Outputdefinition1Enum,'model_enum',SurfaceEnum,'observation_enum',SurfaceObservationEnum,'observation',fake_surface,'timeinterpolation','nearestneighbor','weights',ones(md.mesh.numberofvertices,1),'weights_enum',WeightsSurfaceObservationEnum)};
+ 
+ md=solve(md,TransientSolutionEnum());
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18897-18898.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18897-18898.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18897-18898.diff	(revision 19102)
@@ -0,0 +1,289 @@
+Index: ../trunk-jpl/externalpackages/gmt/install.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/gmt/install.sh	(revision 0)
++++ ../trunk-jpl/externalpackages/gmt/install.sh	(revision 18898)
+@@ -0,0 +1,32 @@
++#!/bin/bash
++set -eu
++
++#Erase install
++rm -rf install  src gmt
++
++#Download from ISSM server
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/gmt-5.1.1.tar.gz' 'gmt-5.1.1.tar.gz'
++
++#install directory
++mkdir src
++tar -zxvf gmt-5.1.1.tar.gz 
++mv gmt-5.1.1/* src
++rm -rf gmt-5.1.1
++
++#configure: 
++cp configs/ConfigUser.cmake ./src/cmake
++
++cd src
++mkdir build
++cd build
++cmake ../
++
++#compile
++if [ $# -eq 0 ]; then
++	make install
++else
++	make -j $1 install
++fi
++
++#come back: 
++cd ../../
+
+Property changes on: ../trunk-jpl/externalpackages/gmt/install.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/externalpackages/gmt/configs/ConfigUser.cmake
+===================================================================
+--- ../trunk-jpl/externalpackages/gmt/configs/ConfigUser.cmake	(revision 0)
++++ ../trunk-jpl/externalpackages/gmt/configs/ConfigUser.cmake	(revision 18898)
+@@ -0,0 +1,240 @@
++#
++# $Id: ConfigUserTemplate.cmake 12904 2014-02-17 20:52:35Z fwobbe $
++#
++# Copyright (c) 1991-2014 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis and F. Wobbe
++# See LICENSE.TXT file for copying and redistribution conditions.
++#
++# This program is free software; you can redistribute it and/or modify it
++# under the terms of the GNU Lesser General Public License as published by the
++# Free Software Foundation; version 3 or 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 Lesser General Public License
++# for more details.
++#
++# Contact info: gmt.soest.hawaii.edu
++# ----------------------------------------------------------------------------
++
++# Use this file to override variables in 'ConfigDefault.cmake' on a per-user
++# basis.  First copy 'ConfigUserTemplate.cmake' to 'ConfigUser.cmake', then
++# edit 'ConfigUser.cmake'.  'ConfigUser.cmake' is not version controlled
++# (currently listed in svn:ignore property)
++#
++# Note: CMake considers an empty string, "FALSE", "OFF", "NO", or any string
++# ending in "-NOTFOUND" to be false (this happens to be case-insensitive, so
++# "False", "off", "no", and "something-NotFound" are all false).  Other values
++# are true.  Thus it does not matter whether you use TRUE and FALSE, ON and
++# OFF, or YES and NO for your booleans.
++
++##
++## Section 1: Installation paths
++##
++
++# ============================================================================
++# Basic setup begins here.  All settings are optional.  In most cases, setting
++# CMAKE_INSTALL_PREFIX should be all you need to do in order to build GMT with
++# reasonable defaults enabled.
++# ============================================================================
++
++# Installation path (usually defaults to /usr/local) [auto]:
++set (CMAKE_INSTALL_PREFIX "$ENV{ISSM_DIR}/externalpackages/gmt/install")
++
++# Set install name suffix used for directories and gmt executables
++# [undefined]:
++#set (GMT_INSTALL_NAME_SUFFIX "suffix")
++
++# Install into traditional directory structure. Disable to install a
++# distribution type directory structure (doc and share separated) [on]:
++#set (GMT_INSTALL_TRADITIONAL_FOLDERNAMES OFF)
++
++# Install convenience links for GMT modules. Disable to install only the main
++# gmt program and access modules as "gmt modulename options" [TRUE]:
++#set (GMT_INSTALL_MODULE_LINKS FALSE)
++
++# Make executables relocatable on supported platforms (relative RPATH) [TRUE]:
++#set (GMT_INSTALL_RELOCATABLE FALSE)
++
++# ============================================================================
++# Advanced configuration begins here.  Usually it is not necessary to edit any
++# settings below.  You should know what you are doing if you do though.  Note:
++# installation paths are relative to ${CMAKE_INSTALL_PREFIX} unless absolute
++# path is given.
++# ============================================================================
++
++# Set binary installation path [bin]:
++#set (GMT_BINDIR "bin")
++
++# Set library installation path [lib or lib64]:
++#set (GMT_LIBDIR "lib")
++
++# Set include installation path [include/gmt${GMT_INSTALL_NAME_SUFFIX}]:
++#set (GMT_INCLUDEDIR "include/gmt")
++
++# Set share installation path [share or share/gmt${GMT_INSTALL_NAME_SUFFIX}]:
++#set (GMT_DATADIR "share/gmt")
++
++# Set doc installation path [share/doc or
++# share/doc/gmt${GMT_INSTALL_NAME_SUFFIX}]:
++#set (GMT_DOCDIR "share/doc/gmt")
++
++# Set manpage installation path [share/man or
++# share/doc/gmt${GMT_INSTALL_NAME_SUFFIX}/man]:
++#set (GMT_MANDIR "share/doc/gmt/man")
++
++# Install documentation files from this external location instead of creating
++# new PDF and HTML documents from scratch [${GMT_SOURCE_DIR}/doc_release]:
++#set (GMT_INSTALL_EXTERNAL_DOC OFF)
++
++# Install manual pages from this external location instead of creating the
++# manpages from scratch [${GMT_SOURCE_DIR}/man_release]:
++#set (GMT_INSTALL_EXTERNAL_MAN OFF)
++
++##
++## Section 2: Build dependencies (should only be needed if CMake cannot
++## automatically detect the rights version or path.)
++##
++
++# Set path to GSHHG Shoreline Database [auto]:
++#set (GSHHG_ROOT "gshhg_path")
++
++# Copy GSHHG files to $/coast [FALSE]:
++#set (COPY_GSHHG TRUE)
++
++# Set path to DCW Digital Chart of the World for GMT [auto]:
++#set (DCW_ROOT "dcw-gmt_path")
++
++# Copy DCW files to $/dcw [FALSE]:
++#set (COPY_DCW TRUE)
++
++# Set location of NetCDF (can be root directory, path to header file or path
++# to nc-config) [auto]:
++set (NETCDF_ROOT "$ENV{ISSM_DIR}/externalpackages/netcdf/install")
++
++# Set location of GDAL (can be root directory, path to header file or path to
++# gdal-config) [auto]:
++set (GDAL_ROOT "$ENV{ISSM_DIR}/externalpackages/gdal/install")
++
++# Set location of PCRE (can be root directory, path to header file or path to
++# pcre-config) [auto]:
++#set (PCRE_ROOT "pcre_install_prefix")
++
++# Set location of single precision FFTW (can be root directory or path to
++# header file) [auto]:
++#set (FFTW3_ROOT "fftw_install_prefix")
++
++# Set location of ZLIB (can be root directory or path to header file) [auto]:
++#set (ZLIB_ROOT "zlib_install_prefix")
++
++##
++## Section 3: GMT features
++##
++
++# Enforce GPL or LGPL conformity. Use this to disable routines that cannot be
++# redistributed under the terms of the GPL or LGPL such as Shewchuk's
++# triangulation (valid values are GPL, LGPL and off) [off]:
++#set (LICENSE_RESTRICTED GPL)
++
++# Configure default units (possible values are SI and US) [SI]:
++#set (UNITS "US")
++
++# Enable building of shared libraries [TRUE] (disable to use static libraries;
++# not recommended):
++#set (BUILD_SHARED_LIBS FALSE)
++
++# Build GMT shared lib with supplemental modules [TRUE]:
++#set (BUILD_SUPPLEMENTS FALSE)
++
++##
++## Section 4: Advanced tweaking
++##
++
++#
++# Testing and development
++#
++
++# Enable running examples/tests with "ctest" or "make check" (out-of-source).
++# Need to set either DO_EXAMPLES, DO_TESTS or both and uncomment the following
++# line.
++#enable_testing()
++#set (DO_EXAMPLES TRUE)
++#set (DO_TESTS TRUE)
++# Number of parallel test jobs with "make check":
++#set (N_TEST_JOBS 4)
++
++# Enable this option to run GMT programs from within ${GMT_BINARY_DIR} without
++# installing or setting GMT_SHAREDIR and GMT_USERDIR first. This is required
++# for testing [OFF]:
++#set (SUPPORT_EXEC_IN_BINARY_DIR ON)
++
++# List extra sub-dirs of 'src' with a CMakeList.txt to build non-module codes
++# that link against the full gmt libs (not just the API; for building codes
++# that only need the GMT API, see the gmtextension project).
++#set (EXTRA_BUILD_DIRS apidemo)
++
++# Directory in which to install the release sources per default
++# [${GMT_BINARY_DIR}/gmt-${GMT_PACKAGE_VERSION}]:
++#set (GMT_RELEASE_PREFIX "release-src-prefix")
++
++# If set to false, image conversion from PS images to PNG and PDF does
++# not depend on the gmt binary target. Note: "make gmt" is then required
++# before docs_depends [TRUE].
++#set (GMT_DOCS_DEPEND_ON_GMT FALSE)
++
++#
++# Debugging
++#
++
++# Set build type can be: empty, Debug, Release, RelWithDebInfo or MinSizeRel
++# [Release]:
++#set (CMAKE_BUILD_TYPE Debug)
++
++# Extra debugging for developers:
++#add_definitions(-DDEBUG)
++#add_definitions(-DMEMDEBUG) # Turn on memory tracking see gmt_support.c for extra info
++#set (CMAKE_C_FLAGS "-Wall -Wdeclaration-after-statement") # recommended even for release build
++#set (CMAKE_C_FLAGS "-Wextra ${CMAKE_C_FLAGS}")            # extra warnings
++#set (CMAKE_C_FLAGS_DEBUG -ggdb3)                          # gdb debugging symbols
++#set (CMAKE_C_FLAGS_RELEASE "-ggdb3 -O2 -Wuninitialized")  # check uninitialized variables
++#set (CMAKE_LINK_DEPENDS_DEBUG_MODE TRUE)                  # debug link dependencies
++
++#
++# System specific tweaks
++#
++
++# This is for GCC on Solaris to avoid "relocations remain against allocatable
++# but non-writable sections" problems:
++#set (USER_GMTLIB_LINK_FLAGS -mimpure-text)
++
++# This may be needed to enable strdup and extended math functions with GCC and
++# Suncc on Solaris:
++#set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D__EXTENSIONS__")
++
++# Do not warn when building with Windows SDK or Visual Studio Express:
++#set (CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS ON)
++
++# Manually select runtime library when compiling with Windows SDK or Visual
++# Studio Express:
++#set (CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS c:/Windows/System32/msvcr100.dll)
++
++# If your NetCDF library is static (not recommended, applies to Windows only)
++#set (NETCDF_STATIC TRUE)
++
++# If want to rename the DLLs to something else than the default (e.g. to
++# append the bitness - Windows only)
++#if (WIN32)
++# set (BITAGE 32)
++# # Detect if we are building a 32 or 64 bits version
++# if (CMAKE_SIZEOF_VOID_P EQUAL 8)
++#   set (BITAGE 64)
++# endif ()
++# set (GMT_DLL_RENAME gmt_w${BITAGE})
++# set (PSL_DLL_RENAME psl_w${BITAGE})
++#endif(WIN32)
++
++# On Windows Visual C 2012 needs _ALLOW_KEYWORD_MACROS to build
++#if(MSVC11)
++#  add_definitions(/D_ALLOW_KEYWORD_MACROS)
++#endif(MSVC11)
++
++# vim: textwidth=78 noexpandtab tabstop=2 softtabstop=2 shiftwidth=2
Index: /issm/oecreview/Archive/18296-19100/ISSM-18898-18899.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18898-18899.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18898-18899.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/externalpackages/gmt
+===================================================================
+--- ../trunk-jpl/externalpackages/gmt	(revision 18898)
++++ ../trunk-jpl/externalpackages/gmt	(revision 18899)
+
+Property changes on: ../trunk-jpl/externalpackages/gmt
+___________________________________________________________________
+Added: svn:ignore
+## -0,0 +1,3 ##
++install
++src
++*.tar.gz
Index: /issm/oecreview/Archive/18296-19100/ISSM-18899-18900.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18899-18900.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18899-18900.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/externalpackages/gmt/configs/ConfigUser.cmake
+===================================================================
+--- ../trunk-jpl/externalpackages/gmt/configs/ConfigUser.cmake	(revision 18899)
++++ ../trunk-jpl/externalpackages/gmt/configs/ConfigUser.cmake	(revision 18900)
+@@ -96,7 +96,7 @@
+ ##
+ 
+ # Set path to GSHHG Shoreline Database [auto]:
+-#set (GSHHG_ROOT "gshhg_path")
++set (GSHHG_ROOT "$ENV{ISSM_DIR}/externalpackages/gshhg/install")
+ 
+ # Copy GSHHG files to $/coast [FALSE]:
+ #set (COPY_GSHHG TRUE)
Index: /issm/oecreview/Archive/18296-19100/ISSM-18900-18901.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18900-18901.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18900-18901.diff	(revision 19102)
@@ -0,0 +1,35 @@
+Index: ../trunk-jpl/externalpackages/gshhg/install.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/gshhg/install.sh	(revision 0)
++++ ../trunk-jpl/externalpackages/gshhg/install.sh	(revision 18901)
+@@ -0,0 +1,13 @@
++#!/bin/bash
++set -eu
++
++rm -rf gssh-gmt-2.3.3.tar.gz  src install
++
++#get gssh database from noaa's website:  http://www.ngdc.noaa.gov/mgg/shorelines/gshhs.html
++curl http://www.ngdc.noaa.gov/mgg/shorelines/data/gshhg/latest/gshhg-gmt-2.3.3.tar.gz > gssh-gmt-2.3.3.tar.gz
++
++#untar: 
++tar -zxvf gshhg-gmt-2.3.3.tar.gz 
++
++#move: 
++mv gshhg-gmt-2.3.3 install
+
+Property changes on: ../trunk-jpl/externalpackages/gshhg/install.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/externalpackages/gshhg
+===================================================================
+--- ../trunk-jpl/externalpackages/gshhg	(revision 18900)
++++ ../trunk-jpl/externalpackages/gshhg	(revision 18901)
+
+Property changes on: ../trunk-jpl/externalpackages/gshhg
+___________________________________________________________________
+Added: svn:ignore
+## -0,0 +1 ##
++install
Index: /issm/oecreview/Archive/18296-19100/ISSM-18901-18902.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18901-18902.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18901-18902.diff	(revision 19102)
@@ -0,0 +1,28 @@
+Index: ../trunk-jpl/externalpackages/gshhg/install.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/gshhg/install.sh	(revision 18901)
++++ ../trunk-jpl/externalpackages/gshhg/install.sh	(revision 18902)
+@@ -4,8 +4,11 @@
+ rm -rf gssh-gmt-2.3.3.tar.gz  src install
+ 
+ #get gssh database from noaa's website:  http://www.ngdc.noaa.gov/mgg/shorelines/gshhs.html
+-curl http://www.ngdc.noaa.gov/mgg/shorelines/data/gshhg/latest/gshhg-gmt-2.3.3.tar.gz > gssh-gmt-2.3.3.tar.gz
++curl http://www.ngdc.noaa.gov/mgg/shorelines/data/gshhg/latest/gshhg-gmt-2.3.3.tar.gz > gsshh-gmt-2.3.3.tar.gz
+ 
++#Download from ISSM server
++#$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/gshhg-gmt-2.3.3.tar.gz' 'gshhg-gmt-2.3.3.tar.gz'
++
+ #untar: 
+ tar -zxvf gshhg-gmt-2.3.3.tar.gz 
+ 
+Index: ../trunk-jpl/externalpackages/gshhg
+===================================================================
+--- ../trunk-jpl/externalpackages/gshhg	(revision 18901)
++++ ../trunk-jpl/externalpackages/gshhg	(revision 18902)
+
+Property changes on: ../trunk-jpl/externalpackages/gshhg
+___________________________________________________________________
+Modified: svn:ignore
+## -1 +1,2 ##
+ install
++*.tar.gz
Index: /issm/oecreview/Archive/18296-19100/ISSM-18902-18903.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18902-18903.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18902-18903.diff	(revision 19102)
@@ -0,0 +1,44 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18902)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18903)
+@@ -456,7 +456,7 @@
+ 		//Computing continuum function to apply to transfer term, transfer is null only if
+ 		// epl_head>sediment_head AND sediment_head>h_max
+ 		continuum=((1.0/(1.0+exp(-20.0*(sediment_head-epl_head)))))+(1.0/(1.0+exp(-20.0*(hmax-sediment_head))));
+-		factor=max(continuum,1.0);
++		factor=min(continuum,1.0);
+ 		transfer=leakage*factor;
+ 		break;
+ 	default:
+@@ -498,7 +498,7 @@
+ 		//Computing continuum function to apply to transfer term, transfer is null only if
+ 		// epl_head>sediment_head AND sediment_head>h_max
+ 		continuum=((1.0/(1.0+exp(-20.0*(sediment_head-epl_head)))))+(1.0/(1.0+exp(-20.0*(hmax-sediment_head))));
+-		factor=max(continuum,1.0);
++		factor=min(continuum,1.0);
+ 		transfer=sediment_head*leakage*factor;
+ 
+ 		break;
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18902)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18903)
+@@ -615,7 +615,7 @@
+ 		//Computing continuum function to apply to transfer term, transfer is null only if
+ 		//epl_head>sediment_head AND sediment_head>h_max
+ 		continuum=((1.0/(1.0+exp(-20.0*(sediment_head-epl_head)))))+(1.0/(1.0+exp(-20.0*(hmax-sediment_head))));
+-		factor=max(continuum,1.0);
++		factor=min(continuum,1.0);
+ 		transfer=leakage*factor;
+ 
+ 		break;
+@@ -654,7 +654,7 @@
+ 		//Computing continuum function to apply to transfer term, transfer is null only if
+ 		//epl_head>sediment_head AND sediment_head>h_max
+ 		continuum=((1.0/(1.0+exp(-20.0*(sediment_head-epl_head)))))+(1.0/(1.0+exp(-20.0*(hmax-sediment_head))));
+-		factor=max(continuum,1.0);
++		factor=min(continuum,1.0);
+ 		transfer=epl_head*leakage*factor;
+ 		break;
+ 	default:
Index: /issm/oecreview/Archive/18296-19100/ISSM-18903-18904.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18903-18904.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18903-18904.diff	(revision 19102)
@@ -0,0 +1,1745 @@
+Index: ../trunk-jpl/externalpackages/export_fig/using_hg2.m
+===================================================================
+--- ../trunk-jpl/externalpackages/export_fig/using_hg2.m	(revision 0)
++++ ../trunk-jpl/externalpackages/export_fig/using_hg2.m	(revision 18904)
+@@ -0,0 +1,18 @@
++%USING_HG2 Determine if the HG2 graphics pipeline is used
++%
++%   tf = using_hg2(fig)
++%
++%IN:
++%   fig - handle to the figure in question.
++%
++%OUT:
++%   tf - boolean indicating whether the HG2 graphics pipeline is being used
++%        (true) or not (false).
++
++function tf = using_hg2(fig)
++try
++    tf = ~graphicsversion(fig, 'handlegraphics');
++catch
++    tf = false;
++end
++end
+
+Property changes on: ../trunk-jpl/externalpackages/export_fig/using_hg2.m
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/externalpackages/export_fig/print2eps.m
+===================================================================
+--- ../trunk-jpl/externalpackages/export_fig/print2eps.m	(revision 18903)
++++ ../trunk-jpl/externalpackages/export_fig/print2eps.m	(revision 18904)
+@@ -3,7 +3,8 @@
+ % Examples:
+ %   print2eps filename
+ %   print2eps(filename, fig_handle)
+-%   print2eps(filename, fig_handle, options)
++%   print2eps(filename, fig_handle, bb_padding)
++%   print2eps(filename, fig_handle, bb_padding, options)
+ %
+ % This function saves a figure as an eps file, with two improvements over
+ % MATLAB's print command. First, it improves the line style, making dashed
+@@ -17,10 +18,13 @@
+ %              relative path) of the file the figure is to be saved as. A
+ %              ".eps" extension is added if not there already. If a path is
+ %              not specified, the figure is saved in the current directory.
+-%   fig_handle - The handle of the figure to be saved. Default: gcf.
++%   fig_handle - The handle of the figure to be saved. Default: gcf().
++%   bb_padding - Scalar value of amount of padding to add to border around
++%                the figure, in points. Can be negative as well as
++%                positive. Default: 0.
+ %   options - Additional parameter strings to be passed to print.
+ 
+-% Copyright (C) Oliver Woodford 2008-2013
++% Copyright (C) Oliver Woodford 2008-2014
+ 
+ % The idea of editing the EPS file to change line styles comes from Jiro
+ % Doke's FIXPSLINESTYLE (fex id: 17928)
+@@ -49,18 +53,29 @@
+ %           for reporting the issue.
+ % 22/03/13: Extend font swapping to axes labels. Thanks to Rasmus Ischebeck
+ %           for reporting the issue.
++% 23/07/13: Bug fix to font swapping. Thanks to George for reporting the
++%           issue.
++% 13/08/13: Fix MATLAB feature of not exporting white lines correctly.
++%           Thanks to Sebastian Heßlinger for reporting it.
+ 
+-function print2eps(name, fig, varargin)
++function print2eps(name, fig, bb_padding, varargin)
+ options = {'-depsc2'};
+-if nargin < 2
+-    fig = gcf;
+-elseif nargin > 2
++if nargin > 3
+     options = [options varargin];
++elseif nargin < 3
++    bb_padding = 0;
++    if nargin < 2
++        fig = gcf();
++    end
+ end
+ % Construct the filename
+ if numel(name) < 5 || ~strcmpi(name(end-3:end), '.eps')
+     name = [name '.eps']; % Add the missing extension
+ end
++% Set paper size
++old_pos_mode = get(fig, 'PaperPositionMode');
++old_orientation = get(fig, 'PaperOrientation');
++set(fig, 'PaperPositionMode', 'auto', 'PaperOrientation', 'portrait');
+ % Find all the used fonts in the figure
+ font_handles = findall(fig, '-property', 'FontName');
+ fonts = get(font_handles, 'FontName');
+@@ -94,7 +109,7 @@
+ for a = 1:size(font_swap, 2)
+     font_swap{1,a} = find(strcmp(fontslu{require_swap(a)}, fontsl));
+     font_swap{2,a} = matlab_fonts{unused_fonts(a)};
+-    font_swap{3,a} = fonts{font_swap{1,end}(1)};
++    font_swap{3,a} = fonts{font_swap{1,a}(1)};
+     fonts_new(font_swap{1,a}) = {font_swap{2,a}};
+ end
+ % Swap the fonts
+@@ -125,10 +140,6 @@
+     [M, M] = sort(M);
+     update = reshape(update(M), 1, []);
+ end
+-% Set paper size
+-old_pos_mode = get(fig, 'PaperPositionMode');
+-old_orientation = get(fig, 'PaperOrientation');
+-set(fig, 'PaperPositionMode', 'auto', 'PaperOrientation', 'portrait');
+ % MATLAB bug fix - black and white text can come out inverted sometimes
+ % Find the white and black text
+ white_text_handles = findobj(fig, 'Type', 'text');
+@@ -142,65 +153,61 @@
+ % Set the font colors slightly off their correct values
+ set(black_text_handles, 'Color', [0 0 0] + eps);
+ set(white_text_handles, 'Color', [1 1 1] - eps);
++% MATLAB bug fix - white lines can come out funny sometimes
++% Find the white lines
++white_line_handles = findobj(fig, 'Type', 'line');
++M = get(white_line_handles, 'Color');
++if iscell(M)
++    M = cell2mat(M);
++end
++white_line_handles = white_line_handles(sum(M, 2) == 3);
++% Set the line color slightly off white
++set(white_line_handles, 'Color', [1 1 1] - 0.00001);
+ % Print to eps file
+ print(fig, options{:}, name);
+-% Reset the font colors
++% Reset the font and line colors
+ set(black_text_handles, 'Color', [0 0 0]);
+ set(white_text_handles, 'Color', [1 1 1]);
++set(white_line_handles, 'Color', [1 1 1]);
+ % Reset paper size
+ set(fig, 'PaperPositionMode', old_pos_mode, 'PaperOrientation', old_orientation);
+-% Correct the fonts
++% Reset the font names in the figure
+ if ~isempty(font_swap)
+-    % Reset the font names in the figure
+     for a = update
+         set(font_handles(a), 'FontName', fonts{a}, 'FontSize', fonts_size(a));
+     end
+-    % Replace the font names in the eps file
+-    font_swap = font_swap(2:3,:);
+-    try
+-        swap_fonts(name, font_swap{:});
+-    catch
+-        warning('swap_fonts() failed. This is usually because the figure contains a large number of patch objects. Consider exporting to a bitmap format in this case.');
+-        return
+-    end
+ end
+-% Fix the line styles
++% Do post-processing on the eps file
+ try
+-    fix_lines(name);
++    fstrm = read_write_entire_textfile(name);
+ catch
+-    warning('fix_lines() failed. This is usually because the figure contains a large number of patch objects. Consider exporting to a bitmap format in this case.');
++    warning('Loading EPS file failed, so unable to perform post-processing. This is usually because the figure contains a large number of patch objects. Consider exporting to a bitmap format in this case.');
++    return
+ end
+-return
+-
+-function swap_fonts(fname, varargin)
+-% Read in the file
+-fh = fopen(fname, 'r');
+-if fh == -1
+-    error('File %s not found.', fname);
++% Replace the font names
++if ~isempty(font_swap)
++    for a = 1:size(font_swap, 2)
++        %fstrm = regexprep(fstrm, [font_swap{1,a} '-?[a-zA-Z]*\>'], font_swap{3,a}(~isspace(font_swap{3,a})));
++        fstrm = regexprep(fstrm, font_swap{2,a}, font_swap{3,a}(~isspace(font_swap{3,a})));
++    end
+ end
+-try
+-    fstrm = fread(fh, '*char')';
+-catch ex
+-    fclose(fh);
+-    rethrow(ex);
++if using_hg2(fig)
++    % Convert miter joins to line joins
++    fstrm = regexprep(fstrm, '10.0 ML\n', '1 LJ\n');
++    % Move the bounding box to the top of the file
++    [s, e] = regexp(fstrm, '%%BoundingBox: [\w\s()]*%%');
++    if numel(s) == 2
++        fstrm = fstrm([1:s(1)-1 s(2):e(2)-2 e(1)-1:s(2)-1 e(2)-1:end]);
++    end
++else
++    % Fix the line styles
++    fstrm = fix_lines(fstrm);
+ end
+-fclose(fh);
+-
+-% Replace the font names
+-for a = 1:2:numel(varargin)
+-    fstrm = regexprep(fstrm, [varargin{a} '-?[a-zA-Z]*\>'], varargin{a+1}(~isspace(varargin{a+1})));
++% Apply the bounding box padding
++if bb_padding
++    add_padding = @(n1, n2, n3, n4) sprintf(' %d', str2double({n1, n2, n3, n4}) + [-bb_padding -bb_padding bb_padding bb_padding]);
++    fstrm = regexprep(fstrm, '%%BoundingBox:[ ]+([-]?\d+)[ ]+([-]?\d+)[ ]+([-]?\d+)[ ]+([-]?\d+)', '%%BoundingBox:${add_padding($1, $2, $3, $4)}');
+ end
+-
+-% Write out the updated file
+-fh = fopen(fname, 'w');
+-if fh == -1
+-    error('Unable to open %s for writing.', fname2);
++% Write out the fixed eps file
++read_write_entire_textfile(name, fstrm);
+ end
+-try
+-    fwrite(fh, fstrm, 'char*1');
+-catch ex
+-    fclose(fh);
+-    rethrow(ex);
+-end
+-fclose(fh);
+-return
+Index: ../trunk-jpl/externalpackages/export_fig/LICENSE
+===================================================================
+--- ../trunk-jpl/externalpackages/export_fig/LICENSE	(revision 0)
++++ ../trunk-jpl/externalpackages/export_fig/LICENSE	(revision 18904)
+@@ -0,0 +1,27 @@
++Copyright (c) 2014, Oliver J. Woodford
++All rights reserved.
++
++Redistribution and use in source and binary forms, with or without
++modification, are permitted provided that the following conditions are met:
++
++* Redistributions of source code must retain the above copyright notice, this
++  list of conditions and the following disclaimer.
++
++* Redistributions in binary form must reproduce the above copyright notice,
++  this list of conditions and the following disclaimer in the documentation
++  and/or other materials provided with the distribution.
++
++* Neither the name of the {organization} nor the names of its
++  contributors may be used to endorse or promote products derived from
++  this software without specific prior written permission.
++
++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
++AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
++FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
++SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
++CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
++OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
++OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Property changes on: ../trunk-jpl/externalpackages/export_fig/LICENSE
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/externalpackages/export_fig/read_write_entire_textfile.m
+===================================================================
+--- ../trunk-jpl/externalpackages/export_fig/read_write_entire_textfile.m	(revision 0)
++++ ../trunk-jpl/externalpackages/export_fig/read_write_entire_textfile.m	(revision 18904)
+@@ -0,0 +1,37 @@
++%READ_WRITE_ENTIRE_TEXTFILE Read or write a whole text file to/from memory
++%
++% Read or write an entire text file to/from memory, without leaving the
++% file open if an error occurs.
++%
++% Reading:
++%   fstrm = read_write_entire_textfile(fname)
++% Writing:
++%   read_write_entire_textfile(fname, fstrm)
++%
++%IN:
++%   fname - Pathname of text file to be read in.
++%   fstrm - String to be written to the file, including carriage returns.
++%
++%OUT:
++%   fstrm - String read from the file. If an fstrm input is given the
++%           output is the same as that input. 
++
++function fstrm = read_write_entire_textfile(fname, fstrm)
++modes = {'rt', 'wt'};
++writing = nargin > 1;
++fh = fopen(fname, modes{1+writing});
++if fh == -1
++    error('Unable to open file %s.', fname);
++end
++try
++    if writing
++        fwrite(fh, fstrm, 'char*1');
++    else
++        fstrm = fread(fh, '*char')';
++    end
++catch ex
++    fclose(fh);
++    rethrow(ex);
++end
++fclose(fh);
++end
+
+Property changes on: ../trunk-jpl/externalpackages/export_fig/read_write_entire_textfile.m
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/externalpackages/export_fig/copyfig.m
+===================================================================
+--- ../trunk-jpl/externalpackages/export_fig/copyfig.m	(revision 18903)
++++ ../trunk-jpl/externalpackages/export_fig/copyfig.m	(revision 18904)
+@@ -20,7 +20,7 @@
+     fh = gcf;
+ end
+ % Is there a legend?
+-if isempty(findobj(fh, 'Type', 'axes', 'Tag', 'legend'))
++if isempty(findall(fh, 'Type', 'axes', 'Tag', 'legend'))
+     % Safe to copy using copyobj
+     fh = copyobj(fh, 0);
+ else
+@@ -30,4 +30,4 @@
+     fh = hgload(tmp_nam);
+     delete(tmp_nam);
+ end
+-return
+\ No newline at end of file
++end
+Index: ../trunk-jpl/externalpackages/export_fig/README.md
+===================================================================
+--- ../trunk-jpl/externalpackages/export_fig/README.md	(revision 0)
++++ ../trunk-jpl/externalpackages/export_fig/README.md	(revision 18904)
+@@ -0,0 +1,259 @@
++export_fig
++==========
++
++A toolbox for exporting figures from MATLAB to standard image and document formats nicely.
++
++### Overview
++Exporting a figure from MATLAB the way you want it (hopefully the way it looks on screen), can be a real headache for the unitiated, thanks to all the settings that are required, and also due to some eccentricities (a.k.a. features and bugs) of functions such as `print`. The first goal of export_fig is to make transferring a plot from screen to document, just the way you expect (again, assuming that's as it appears on screen), a doddle.
++  
++The second goal is to make the output media suitable for publication, allowing you to publish your results in the full glory that you originally intended. This includes embedding fonts, setting image compression levels (including lossless), anti-aliasing, cropping, setting the colourspace, alpha-blending and getting the right resolution.
++
++Perhaps the best way to demonstrate what export_fig can do is with some examples.
++  
++### Examples
++**Visual accuracy** - MATLAB's exporting functions, namely `saveas` and `print`, change many visual properties of a figure, such as size, axes limits and ticks, and background colour, in unexpected and unintended ways. Export_fig aims to faithfully reproduce the figure as it appears on screen. For example:  
++```Matlab
++plot(cos(linspace(0, 7, 1000)));
++set(gcf, 'Position', [100 100 150 150]);
++saveas(gcf, 'test.png');
++export_fig test2.png
++```
++generates the following:
++
++| Figure: | test.png: | test2.png: |
++|:-------:|:---------:|:----------:|
++|![](https://farm6.staticflickr.com/5616/15589249291_16e485c29a_o_d.png)|![](https://farm4.staticflickr.com/3944/15406302850_4d2e1c7afa_o_d.png)|![](https://farm6.staticflickr.com/5607/15568225476_8ce9bd5f6b_o_d.png)|
++
++Note that the size and background colour of test2.png (the output of export_fig) are the same as those of the on screen figure, in contrast to test.png. Of course, if you want want the figure background to be white (or any other colour) in the exported file then you can set this prior to exporting using:
++```Matlab
++set(gcf, 'Color', 'w');
++```
++  
++Notice also that export_fig crops and anti-aliases (smooths, for bitmaps only) the output by default. However, these options can be disabled; see the Tips section below for details.
++  
++**Resolution** - by default, export_fig exports bitmaps at screen resolution. However, you may wish to save them at a different resolution. You can do this using either of two options: `-m<val>`, where <val> is a positive real number, magnifies the figure by the factor <val> for export, e.g. `-m2` produces an image double the size (in pixels) of the on screen figure; `-r<val>`, again where <val> is a positive real number, specifies the output bitmap to have <val> pixels per inch, the dimensions of the figure (in inches) being those of the on screen figure. For example, using:  
++```Matlab
++export_fig test.png -m2.5
++```
++on the figure from the example above generates:
++
++![](https://farm4.staticflickr.com/3937/15591910915_dc7040c477_o_d.png)
++
++Sometimes you might have a figure with an image in. For example:
++```Matlab
++imshow(imread('cameraman.tif'))
++hold on
++plot(0:255, sin(linspace(0, 10, 256))*127+128);
++set(gcf, 'Position', [100 100 150 150]);
++```
++generates this figure:
++
++![](https://farm4.staticflickr.com/3942/15589249581_ff87a56a3f_o_d.png)
++  
++Here the image is displayed in the figure at resolution lower than its native resolution. However, you might want to export the figure at a resolution such that the image is output at its native (i.e. original) size (in pixels). Ordinarily this would require some non-trivial computation to work out what that resolution should be, but export_fig has an option to do this for you. Using:
++```Matlab
++export_fig test.png -native
++```
++produces:
++
++![](https://farm6.staticflickr.com/5604/15589249591_da2b2652e4_o_d.png)
++
++with the image being the size (in pixels) of the original image. Note that if you want an image to be a particular size, in pixels, in the output (other than its original size) then you can resize it to this size and use the `-native` option to achieve this.
++
++All resolution options (`-m<val>`, `-q<val>` and `-native`) correctly set the resolution information in PNG and TIFF files, as if the image were the dimensions of the on screen figure.
++
++**Shrinking dots & dashes** - when exporting figures with dashed or dotted lines using either the ZBuffer or OpenGL (default for bitmaps) renderers, the dots and dashes can appear much shorter, even non-existent, in the output file, especially if the lines are thick and/or the resolution is high. For example:  
++```Matlab
++plot(sin(linspace(0, 10, 1000)), 'b:', 'LineWidth', 4);
++hold on
++plot(cos(linspace(0, 7, 1000)), 'r--', 'LineWidth', 3);
++grid on
++export_fig test.png
++```
++generates:
++
++![](https://farm4.staticflickr.com/3956/15592747732_f943d4aa0a_o_d.png)
++
++This problem can be overcome by using the painters renderer. For example:
++```Matlab
++export_fig test.png -painters
++```
++used on the same figure generates:
++
++![](https://farm4.staticflickr.com/3945/14971168504_77692f11f5_o_d.png)
++
++Note that not only are the plot lines correct, but the grid lines are too.
++
++**Transparency** - sometimes you might want a figure and axes' backgrounds to be transparent, so that you can see through them to a document (for example a presentation slide, with coloured or textured background) that the exported figure is placed in. To achieve this, first (optionally) set the axes' colour to 'none' prior to exporting, using:  
++```Matlab
++set(gca, 'Color', 'none'); % Sets axes background
++```
++    
++then use export_fig's `-transparent` option when exporting:
++```Matlab
++export_fig test.png -transparent
++```
++
++This will make the background transparent in PDF, EPS and PNG outputs. You can additionally save fully alpha-blended semi-transparent patch objects to the PNG format. For example:
++
++```Matlab
++logo;
++alpha(0.5);
++```
++
++generates a figure like this:
++
++![](https://farm4.staticflickr.com/3933/15405290339_b08de33528_o_d.png)
++
++If you then export this to PNG using the `-transparent` option you can then put the resulting image into, for example, a presentation slide with fancy, textured background, like so:
++
++![](https://farm6.staticflickr.com/5599/15406302920_59beaefff1_o_d.png)
++
++and the image blends seamlessly with the background.
++
++**Image quality** - when publishing images of your results, you want them to look as good as possible. By default, when outputting to lossy file formats (PDF, EPS and JPEG), export_fig uses a high quality setting, i.e. low compression, for images, so little information is lost. This is in contrast to MATLAB's print and saveas functions, whose default quality settings are poor. For example:
++```Matlab
++A = im2double(imread('peppers.png'));
++B = randn(ceil(size(A, 1)/6), ceil(size(A, 2)/6), 3) * 0.1;
++B = cat(3, kron(B(:,:,1), ones(6)), kron(B(:,:,2), ones(6)), kron(B(:,:,3), ones(6)));
++B = A + B(1:size(A, 1),1:size(A, 2),:);
++imshow(B);
++print -dpdf test.pdf
++```
++generates a PDF file, a sub-window of which looks (when zoomed in) like this:
++
++![](https://farm6.staticflickr.com/5613/15405290309_881b2774d6_o_d.png)
++
++while the command
++
++```Matlab
++export_fig test.pdf
++```
++on the same figure produces this:
++
++![](https://farm4.staticflickr.com/3947/14971168174_687473133f_o_d.png)
++
++While much better, the image still contains some compression artifacts (see the low level noise around the edge of the pepper). You may prefer to export with no artifacts at all, i.e. lossless compression. Alternatively, you might need a smaller file, and be willing to accept more compression. Either way, export_fig has an option that can suit your needs: `-q<val>`, where <val> is a number from 0-100, will set the level of lossy image compression (again in PDF, EPS and JPEG outputs only; other formats are lossless), from high compression (0) to low compression/high quality (100). If you want lossless compression in any of those formats then specify a <val> greater than 100. For example:
++```Matlab
++export_fig test.pdf -q101
++```
++again on the same figure, produces this:
++
++![](https://farm6.staticflickr.com/5608/15405803908_934512c1fe_o_d.png)
++
++Notice that all the noise has gone.
++
++### Tips
++**Anti-aliasing** - the anti-aliasing which export_fig applies to bitmap outputs by default makes the images look nice, but it can also blur images and increase exporting time and memory requirements, so you might not always want it. You can set the level of anti-aliasing by using the `-a<val>` option, where <val> is 1 (no anti-aliasing), 2, 3 (default) or 4 (maximum anti-aliasing).  
++  
++**Cropping** - by default, export_fig crops its output to minimize the amount of empty space around the figure. If you'd prefer the figure to be uncropped, and instead have the same appearance (in terms of border width) as the on screen figure, then use the `-nocrop` option.  
++  
++**Colourspace** - by default, export_fig generates files in the RGB [colourspace](http://en.wikipedia.org/wiki/Color_space). However, you can also export in greyscale or the CMYK colourspace, using the `-grey` (or `-gray`) and `-cmyk` options respectively. The CMYK option is useful for publishers who require documents in this colourspace, but the option is only supported for PDF, EPS and TIFF files.
++
++**Specifying a target directory** - you can get export_fig to save output files to any directory (for which you have write permission), simply by specifying the full or relative path in the filename. For example:
++```Matlab
++export_fig ../subdir/fig.png;
++export_fig('C:/Users/Me/Documents/figures/myfig', '-pdf', '-png');
++```
++
++**Variable file names** - often you might want to save a series of figures in a for loop, each with a different name. For this you can use the functional form of input arguments, i.e. `export_fig(arg1, arg2)`,  and construct the filename string in a variable. Here's an example of this:  
++```Matlab
++for a = 1:5
++    plot(rand(5, 2));
++    export_fig(sprintf('plot%d.png', a));
++end
++```
++When using the functional form like this, be sure to put string variables in quotes:
++```Matlab
++export_fig(sprintf('plot%d', a), '-a1', '-pdf', '-png');
++```
++
++**Specifying the figure/axes** - if you have mutiple figures open you can specify which figure to export using its handle:  
++```Matlab
++export_fig(figure_handle, 'filename.fmt');
++```
++Equally, if your figure contains several subplots then you can export just one of them by giving export_fig the handle to the relevant axes:
++```Matlab
++export_fig(axes_handle, 'filename.fmt');
++```
++
++**Multiple formats** - save time by exporting to multiple formats simultaneously. E.g.: 
++```Matlab
++export_fig filename -pdf -eps -png -jpg -tiff
++```
++
++**Other file formats** - if you'd like to save your figure to a bitmap format that is not supported by export_fig, e.g. animated GIF, PPM file or a frame in a movie, then you can use export_fig to output the image, and optionally an alpha-matte, to the workspace. E.g.:  
++```Matlab
++frame = export_fig;
++```
++or
++```Matlab
++[frame, alpha] = export_fig;
++```
++These variables can then be saved to other image formats using other functions, such as imwrite.
++
++**Appending to a file** - you can use the `-append` option to append the figure to the end of an image/document, if it already exists. This is supported for PDF and TIFF files only. Note that if you wish to append a lot of figures consecutively to a PDF, it can be more efficient to save all the figures to PDF separately then append them all in one go at the end (e.g. using [append_pdfs](http://www.mathworks.com/matlabcentral/fileexchange/31215-appendpdfs)).  
++  
++**Font size** - if you want to place an exported figure in a document with the font a particular size then you need to set the font to that size in the figure, and not resize the output of export_fig in the document. To avoid resizing, simply make sure that the on screen figure is the size you want the output to be in the document before exporting.  
++  
++**Renderers** - MATLAB has three renderers for displaying and exporting figures: painters, OpenGL and ZBuffer. The different renderers have different [features](http://www.mathworks.com/access/helpdesk/help/techdoc/creating_plots/f3-84337.html#f3-102410), so if you aren't happy with the result from one renderer try another. By default, vector formats (i.e. PDF and EPS outputs) use the painters renderer, while other formats use the OpenGL renderer. Non-default renderers can be selected by using one of these three export_fig input options: `-painters`, `-opengl`, `-zbuffer`.  
++  
++**Artifacts** - sometimes the output that you get from export_fig is not what you expected. If an output file contains artifacts that aren't in the on screen figure then make sure that the renderer used for rendering the figure on screen is the same as that used for exporting. To set the renderer used to display the figure, use:  
++```Matlab
++set(figure_handle, 'Renderer', 'opengl');
++```
++After matching the two renderers, if the artifact appears in the on screen figure then you'll need to fix that before exporting. Alternatively you can try changing the renderer used by export_fig. Finally check that it isn't one of the known issues mentioned in the section below.
++
++**Smoothed/interpolated images in output PDF** - if you produce a PDF using export_fig and images in the PDF look overly smoothed or interpolated, this is because the software you are using to view the PDF is smoothing or interpolating the image data. The image is not smoothed in the PDF file itself. If the software has an option to disable this feature, you should select it. Alternatively, use another PDF viewer that doesn't exhibit this problem.  
++  
++**Locating Ghostscript/pdftops** - You may find a dialogue box appears when using export_fig, asking you to locate either [Ghostscript](http://www.ghostscript.com) or [pdftops](http://www.foolabs.com/xpdf). These are separate applications which export_fig requires to perform certain functions. If such a dialogue appears it is because export_fig can't find the application automatically. This is because you either haven't installed it, or it isn't in the normal place. Make sure you install the applications correctly first. They can be downloaded from the following places:  
++ 1. Ghostscript:     [www.ghostscript.com](http://www.ghostscript.com)
++ 2. pdftops (install the Xpdf package): [www.foolabs.com/xpdf](http://www.foolabs.com/xpdf)
++
++If you choose to install them in a non-default location then point export_fig
++to this location using the dialogue box.
++
++**Undefined function errors** - If you download and run export_fig and get an error similar to this:  
++```Matlab
++??? Undefined function or method 'print2array' for input arguments of type 'double'.
++```
++then you are missing one or more of the files that come in the export_fig package. Make sure that you click the "Get from GitHub" button at the top-right of the download [page](http://www.mathworks.co.uk/matlabcentral/fileexchange/23629-exportfig), then extract all the files in the zip file to the same directory. You should then have all the necessary files.
++  
++### Known issues
++There are lots of problems with MATLAB's exporting functions, and unfortunately export_fig, which is simply a glorified wrapper for MATLAB's print function, doesn't solve all of them (yet?). Some of the problems I know about are:
++  
++**Fonts** - when using the painters renderer, MATLAB can only export a small number of fonts, details of which can be found [here](http://www.mathworks.com/access/helpdesk/help/techdoc/creating_plots/f3-103191.html#f3-96545). Export_fig attempts to correct font names in the resulting EPS file (for upto a maximum of 11 different fonts in one figure), but this is not always guaranteed to work. In particular, the text positions will be affected. It also does not work for text blocks where the 'Interpreter' property is set to 'latex'.
++
++Also, when using the painters renderer, ghostscript will sometimes throw an error such as `Error: /undefined in /findfont`. This suggests that ghostscript could not find a definition file for one of your fonts. One possible fix for this is to make sure the file `EXPORT_FIG_PATH/.ignore/gs_font_path.txt` exists and contains a list of paths to the folder(s) containing the necessary font definitions (make sure they're TrueType definitions), separated by a semicolon.
++
++**RGB color data not yet supported in Painter's mode** - you will see this as a warning if you try to export a figure which contains patch objects whose face or vertex colors are specified as a an RGB colour, rather than an index into the colormap, using the painters renderer (the default renderer for vector output). This problem can arise if you use `pcolor`, for example. This is a problem with MATLAB's painters renderer, which also affects `print`; there is currently no fix available in export_fig (other than to export to bitmap). The suggested workaround is to avoid colouring patches using RGB. First, try to use colours in the figure's colourmap (instructions [here](http://www.mathworks.co.uk/support/solutions/en/data/1-6OTPQE/)) - change the colourmap, if necessary. If you are using `pcolor`, try using [uimagesc](http://www.mathworks.com/matlabcentral/fileexchange/11368) (on the file exchange) instead.  
++
++**Dashed contour lines appear solid** - when using the painters renderer, MATLAB cannot generate dashed lines using the `contour` function (either on screen or in exported PDF and EPS files). Details can be found [here](http://www.mathworks.com/support/solutions/en/data/1-14PPHB/?solution=1-14PPHB).  
++  
++**Text size** - when using the OpenGL or ZBuffer renderers, large text can be resized relative to the figure when exporting at non-screen-resolution (including using anti-alising at screen resolution). This is a feature of MATLAB's `print `function. In this case, try using the `-painters` option.  
++  
++**Lighting and transparency** - when using the painters renderer, transparency and lighting effects are not supported. Sorry, but this is a feature of the renderer. To find out more about the capabilities of each rendering method, see [here](http://www.mathworks.com/access/helpdesk/help/techdoc/creating_plots/f3-84337.html#f3-102410). You can still export transparent objects to vector format (SVG) using the excellent [plot2svg](http://www.mathworks.com/matlabcentral/fileexchange/7401) package, then convert this to PDF, for example using [Inkscape](http://inkscape.org/). However, it can't handle lighting.  
++  
++**Lines in patch objects** - when exporting patch objects to PDF using the painters renderer (default), sometimes the output can appear to have lines across the middle of rectangular patches; these lines are the colour of the background, as if there is a crack in the patch, allowing you to see through. This issue is a feature of the software used to display the PDF, rather than the PDF itself. Sometimes disabling anti-aliasing in this software can get rid of the lines.  
++  
++**Out of memory** - if you run into memory issues when using export_fig, some ways to get round this are:  
++ 1. Reduce the level of anti-aliasing.
++ 2. Reduce the size of the on screen figure.
++ 3. Reduce the resolution (dpi) the figure is exported at.  
++  
++**Errors** - the other common type of errors people get with export_fig are OpenGL errors. This isn't a fault of export_fig, but either a bug in MATLAB's `print`, or your graphics driver getting itself into a state. Always make sure your graphics driver is up-to-date. If it still doesn't work, try using the ZBuffer renderer.  
++  
++### Raising issues
++If you think you have found a genuine error or issue with export_fig **that is not listed above**, first ensure that the figure looks correct on screen when rendered using the renderer that export_fig is set to use (e.g. if exporting to PDF or EPS, does the figure look correct on screen using the painters renderer, or if exporting to bitmap, does the figure look correct on screen using the OpenGL renderer?). If it looks wrong then the problem is there, and I cannot help (other than to suggest you try exporting using a different renderer).
++
++Secondly, if exporting to bitmap, do try all the renderers (i.e. try the options `-opengl`, `-zbuffer` and `-painters` separately), to see if one of them does produce an acceptable output, and if so, use that.
++
++If the figure looks correct on screen, but an error exists in the exported output (which cannot be solved using a different renderer) then please feel free to raise an [issue](https://github.com/ojwoodford/export_fig/issues). Please be sure to include the .fig file, the export_fig command you use, the output you get, and a description of what you expected. I can't promise anything, but if it's easy to fix I probably will do it. Often I will find that the error is due to a bug in MATLAB's print function, in which case I will suggest you submit it as a bug to TheMathWorks, and inform me of any fix they suggest. Also, if there's a feature you'd like that isn't supported please tell me what it is and I'll consider implementing it.
++
++### And finally...
++
++![](https://farm4.staticflickr.com/3956/15591911455_b9008bd77e_o_d.jpg)
++
++If you've ever wondered what's going on in the icon on the export_fig download page (reproduced on the left), then this explanantion is for you. The icon is designed to demonstrate as many of export_fig's features as possible. Given a
++figure containing a translucent mesh (top right), export_fig can export to pdf (bottom centre), which allows the figure to be zoomed in without losing quality (because it's a vector graphic), but isn't able to reproduce the translucency, and also, depending on the viewer, creates small gaps between the patches, which are seen here as thin white lines. By contrast, when exporting to png (top left), translucency is preserved (see how the graphic below shows through), the figure is anti-aliased, but zooming in does not reveal more detail.
++
+
+Property changes on: ../trunk-jpl/externalpackages/export_fig/README.md
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/externalpackages/export_fig/eps2pdf.m
+===================================================================
+--- ../trunk-jpl/externalpackages/export_fig/eps2pdf.m	(revision 18903)
++++ ../trunk-jpl/externalpackages/export_fig/eps2pdf.m	(revision 18904)
+@@ -83,11 +83,11 @@
+     options = [options ' -f "' tmp_nam '" "' source '"'];
+     try
+         % Convert to pdf using ghostscript
+-        [status message] = ghostscript(options);
+-    catch
++        [status, message] = ghostscript(options);
++    catch me
+         % Delete the intermediate file
+         delete(tmp_nam);
+-        rethrow(lasterror);
++        rethrow(me);
+     end
+     % Delete the intermediate file
+     delete(tmp_nam);
+@@ -96,7 +96,7 @@
+     % Add the output file names
+     options = [options ' -f "' source '"'];
+     % Convert to pdf using ghostscript
+-    [status message] = ghostscript(options);
++    [status, message] = ghostscript(options);
+ end
+ % Check for error
+ if status
+@@ -107,7 +107,7 @@
+         error(message);
+     end
+ end
+-return
++end
+ 
+ % Function to return (and create, where necessary) the font path
+ function fp = font_path()
+@@ -131,4 +131,4 @@
+     fp = [fp '/usr/share/fonts:/usr/local/share/fonts:/usr/share/fonts/X11:/usr/local/share/fonts/X11:/usr/share/fonts/truetype:/usr/local/share/fonts/truetype'];
+ end
+ user_string('gs_font_path', fp);
+-return
++end
+Index: ../trunk-jpl/externalpackages/export_fig/pdf2eps.m
+===================================================================
+--- ../trunk-jpl/externalpackages/export_fig/pdf2eps.m	(revision 18903)
++++ ../trunk-jpl/externalpackages/export_fig/pdf2eps.m	(revision 18904)
+@@ -24,7 +24,7 @@
+ % Construct the options string for pdftops
+ options = ['-q -paper match -eps -level2 "' source '" "' dest '"'];
+ % Convert to eps using pdftops
+-[status message] = pdftops(options);
++[status, message] = pdftops(options);
+ % Check for error
+ if status
+     % Report error
+@@ -47,5 +47,5 @@
+     fwrite(fid, '%'); % Turn ' ' into '%'
+ end
+ fclose(fid);
+-return
++end
+ 
+Index: ../trunk-jpl/externalpackages/export_fig/user_string.m
+===================================================================
+--- ../trunk-jpl/externalpackages/export_fig/user_string.m	(revision 18903)
++++ ../trunk-jpl/externalpackages/export_fig/user_string.m	(revision 18904)
+@@ -84,4 +84,4 @@
+     string = fgetl(fid);
+     fclose(fid);
+ end
+-return
+\ No newline at end of file
++end
+Index: ../trunk-jpl/externalpackages/export_fig/export_fig.m
+===================================================================
+--- ../trunk-jpl/externalpackages/export_fig/export_fig.m	(revision 18903)
++++ ../trunk-jpl/externalpackages/export_fig/export_fig.m	(revision 18904)
+@@ -12,6 +12,7 @@
+ %   export_fig ... -r<val>
+ %   export_fig ... -a<val>
+ %   export_fig ... -q<val>
++%   export_fig ... -p<val>
+ %   export_fig ... -<renderer>
+ %   export_fig ... -<colorspace>
+ %   export_fig ... -append
+@@ -84,13 +85,13 @@
+ %   -transparent - option indicating that the figure background is to be
+ %                  made transparent (png, pdf and eps output only).
+ %   -m<val> - option where val indicates the factor to magnify the
+-%             on-screen figure dimensions by when generating bitmap
++%             on-screen figure pixel dimensions by when generating bitmap
+ %             outputs. Default: '-m1'.
+ %   -r<val> - option val indicates the resolution (in pixels per inch) to
+-%             export bitmap outputs at, keeping the dimensions of the
+-%             on-screen figure. Default: sprintf('-r%g', get(0,
+-%             'ScreenPixelsPerInch')). Note that the -m and -r options
+-%             change the same property.
++%             export bitmap and vector outputs at, keeping the dimensions
++%             of the on-screen figure. Default: '-r864' (for vector output
++%             only). Note that the -m option overides the -r option for
++%             bitmap outputs only.
+ %   -native - option indicating that the output resolution (when outputting
+ %             a bitmap format) should be such that the vertical resolution
+ %             of the first suitable image found in the figure is at the
+@@ -117,6 +118,9 @@
+ %             default for pdf & eps. Note: lossless compression can
+ %             sometimes give a smaller file size than the default lossy
+ %             compression, depending on the type of images.
++%   -p<val> - option to add a border of width val to eps and pdf files,
++%             where val is in units of the intermediate eps file. Default:
++%             0 (i.e. no padding).
+ %   -append - option indicating that if the file (pdfs only) already
+ %             exists, the figure is to be appended as a new page, instead
+ %             of being overwritten (default).
+@@ -132,11 +136,11 @@
+ %           case when the background is transparent.
+ %
+ %   Some helpful examples and tips can be found at:
+-%      http://sites.google.com/site/oliverwoodford/software/export_fig
++%      https://github.com/ojwoodford/export_fig
+ %
+ %   See also PRINT, SAVEAS.
+ 
+-% Copyright (C) Oliver Woodford 2008-2012
++% Copyright (C) Oliver Woodford 2008-2014
+ 
+ % The idea of using ghostscript is inspired by Peder Axensten's SAVEFIG
+ % (fex id: 10889) which is itself inspired by EPS2PDF (fex id: 5782).
+@@ -167,6 +171,10 @@
+ %           tick marks fixed.
+ % 12/12/12: Add support for isolating uipanels. Thanks to michael for
+ %           suggesting it.
++% 25/09/13: Add support for changing resolution in vector formats. Thanks
++%           to Jan Jaap Meijer for suggesting it.
++% 07/05/14: Add support for '~' at start of path. Thanks to Sally Warner
++%           for suggesting it.
+ 
+ function [im, alpha] = export_fig(varargin)
+ % Make sure the figure is rendered correctly _now_ so that properties like
+@@ -216,7 +224,10 @@
+     Ztick = make_cell(get(Hlims, 'ZTickMode'));
+ end
+ % Set all axes limit and tick modes to manual, so the limits and ticks can't change
+-set(Hlims, 'XLimMode', 'manual', 'YLimMode', 'manual', 'ZLimMode', 'manual', 'XTickMode', 'manual', 'YTickMode', 'manual', 'ZTickMode', 'manual');
++set(Hlims, 'XLimMode', 'manual', 'YLimMode', 'manual', 'ZLimMode', 'manual');
++set_tick_mode(Hlims, 'X');
++set_tick_mode(Hlims, 'Y');
++set_tick_mode(Hlims, 'Z');
+ % Set to print exactly what is there
+ set(fig, 'InvertHardcopy', 'off');
+ % Set the renderer
+@@ -288,7 +299,7 @@
+         A = uint8(A);
+         % Crop the background
+         if options.crop
+-            [alpha, v] = crop_background(alpha, 0);
++            [alpha, v] = crop_borders(alpha, 0, 1);
+             A = A(v(1):v(2),v(3):v(4),:);
+         end
+         if options.png
+@@ -335,7 +346,7 @@
+         end
+         % Crop the background
+         if options.crop
+-            A = crop_background(A, tcol);
++            A = crop_borders(A, tcol, 1);
+         end
+         % Downscale the image
+         A = downsize(A, options.aa_factor);
+@@ -405,7 +416,7 @@
+         pdf_nam = [tempname '.pdf'];
+     end
+     % Generate the options for print
+-    p2eArgs = {renderer};
++    p2eArgs = {renderer, sprintf('-r%d', options.resolution)};
+     if options.colourspace == 1
+         p2eArgs = [p2eArgs {'-cmyk'}];
+     end
+@@ -414,10 +425,10 @@
+     end
+     try
+         % Generate an eps
+-        print2eps(tmp_nam, fig, p2eArgs{:});
++        print2eps(tmp_nam, fig, options.bb_padding, p2eArgs{:});
+         % Remove the background, if desired
+         if options.transparent && ~isequal(get(fig, 'Color'), 'none')
+-            eps_remove_background(tmp_nam);
++            eps_remove_background(tmp_nam, 1 + using_hg2(fig));
+         end
+         % Add a bookmark to the PDF if desired
+         if options.bookmark
+@@ -464,7 +475,7 @@
+         set(Hlims(a), 'XLimMode', Xlims{a}, 'YLimMode', Ylims{a}, 'ZLimMode', Zlims{a}, 'XTickMode', Xtick{a}, 'YTickMode', Ytick{a}, 'ZTickMode', Ztick{a});
+     end
+ end
+-return
++end
+ 
+ function [fig, options] = parse_args(nout, varargin)
+ % Parse the input arguments
+@@ -484,8 +495,10 @@
+                  'append', false, ...
+                  'im', nout == 1, ...
+                  'alpha', nout == 2, ...
+-                 'aa_factor', 3, ...
+-                 'magnify', 1, ...
++                 'aa_factor', 0, ...
++                 'bb_padding', 0, ...
++                 'magnify', [], ...
++                 'resolution', [], ...
+                  'bookmark', false, ...
+                  'quality', []);
+ native = false; % Set resolution to native of an image
+@@ -534,7 +547,7 @@
+                 case 'native'
+                     native = true;
+                 otherwise
+-                    val = str2double(regexp(varargin{a}, '(?<=-(m|M|r|R|q|Q))(\d*\.)?\d+(e-?\d+)?', 'match'));
++                    val = str2double(regexp(varargin{a}, '(?<=-(m|M|r|R|q|Q|p|P))-?\d*.?\d+', 'match'));
+                     if ~isscalar(val)
+                         error('option %s not recognised', varargin{a});
+                     end
+@@ -542,9 +555,11 @@
+                         case 'm'
+                             options.magnify = val;
+                         case 'r'
+-                            options.magnify = val ./ get(0, 'ScreenPixelsPerInch');
++                            options.resolution = val;
+                         case 'q'
+                             options.quality = max(val, 0);
++                        case 'p'
++                            options.bb_padding = val;
+                     end
+             end
+         else
+@@ -572,6 +587,28 @@
+     end
+ end
+ 
++% Set default anti-aliasing now we know the renderer
++if options.aa_factor == 0
++    options.aa_factor = 1 + 2 * (~(using_hg2(fig) && strcmp(get(ancestor(fig, 'figure'), 'GraphicsSmoothing'), 'on')) | (options.renderer == 3));
++end
++
++% Convert user dir '~' to full path
++if numel(options.name) > 2 && options.name(1) == '~' && (options.name(2) == '/' || options.name(2) == '\')
++    options.name = fullfile(char(java.lang.System.getProperty('user.home')), options.name(2:end));
++end
++
++% Compute the magnification and resolution
++if isempty(options.magnify)
++    if isempty(options.resolution)
++        options.magnify = 1;
++        options.resolution = 864;
++    else
++        options.magnify = options.resolution ./ get(0, 'ScreenPixelsPerInch');
++    end
++elseif isempty(options.resolution)
++    options.resolution = 864;
++end  
++
+ % Check we have a figure handle
+ if isempty(fig)
+     error('No figure found');
+@@ -583,7 +620,7 @@
+ end
+ 
+ % Check whether transparent background is wanted (old way)
+-if isequal(get(ancestor(fig, 'figure'), 'Color'), 'none')
++if isequal(get(ancestor(fig(1), 'figure'), 'Color'), 'none')
+     options.transparent = true;
+ end
+ 
+@@ -631,7 +668,7 @@
+         break
+     end
+ end
+-return
++end
+ 
+ function A = downsize(A, factor)
+ % Downsample an image
+@@ -658,11 +695,11 @@
+     % Subsample
+     A = A(1+floor(mod(end-1, factor)/2):factor:end,1+floor(mod(end-1, factor)/2):factor:end,:);
+ end
+-return
++end
+ 
+ function A = rgb2grey(A)
+ A = cast(reshape(reshape(single(A), [], 3) * single([0.299; 0.587; 0.114]), size(A, 1), size(A, 2)), class(A));
+-return
++end
+ 
+ function A = check_greyscale(A)
+ % Check if the image is greyscale
+@@ -671,69 +708,9 @@
+         all(reshape(A(:,:,2) == A(:,:,3), [], 1))
+     A = A(:,:,1); % Save only one channel for 8-bit output
+ end
+-return
+-
+-function [A, v] = crop_background(A, bcol)
+-% Map the foreground pixels
+-[h, w, c] = size(A);
+-if isscalar(bcol) && c > 1
+-    bcol = bcol(ones(1, c));
+ end
+-bail = false;
+-for l = 1:w
+-    for a = 1:c
+-        if ~all(A(:,l,a) == bcol(a))
+-            bail = true;
+-            break;
+-        end
+-    end
+-    if bail
+-        break;
+-    end
+-end
+-bail = false;
+-for r = w:-1:l
+-    for a = 1:c
+-        if ~all(A(:,r,a) == bcol(a))
+-            bail = true;
+-            break;
+-        end
+-    end
+-    if bail
+-        break;
+-    end
+-end
+-bail = false;
+-for t = 1:h
+-    for a = 1:c
+-        if ~all(A(t,:,a) == bcol(a))
+-            bail = true;
+-            break;
+-        end
+-    end
+-    if bail
+-        break;
+-    end
+-end
+-bail = false;
+-for b = h:-1:t
+-    for a = 1:c
+-        if ~all(A(b,:,a) == bcol(a))
+-            bail = true;
+-            break;
+-        end
+-    end
+-    if bail
+-        break;
+-    end
+-end
+-% Crop the background, leaving one boundary pixel to avoid bleeding on
+-% resize
+-v = [max(t-1, 1) min(b+1, h) max(l-1, 1) min(r+1, w)];
+-A = A(v(1):v(2),v(3):v(4),:);
+-return
+ 
+-function eps_remove_background(fname)
++function eps_remove_background(fname, count)
+ % Remove the background of an eps file
+ % Open the file
+ fh = fopen(fname, 'r+');
+@@ -741,39 +718,40 @@
+     error('Not able to open file %s.', fname);
+ end
+ % Read the file line by line
+-while true
++while count
+     % Get the next line
+     l = fgets(fh);
+     if isequal(l, -1)
+         break; % Quit, no rectangle found
+     end
+     % Check if the line contains the background rectangle
+-    if isequal(regexp(l, ' *0 +0 +\d+ +\d+ +rf *[\n\r]+', 'start'), 1)
++    if isequal(regexp(l, ' *0 +0 +\d+ +\d+ +r[fe] *[\n\r]+', 'start'), 1)
+         % Set the line to whitespace and quit
+         l(1:regexp(l, '[\n\r]', 'start', 'once')-1) = ' ';
+         fseek(fh, -numel(l), 0);
+         fprintf(fh, l);
+-        break;
++        % Reduce the count
++        count = count - 1;
+     end
+ end
+ % Close the file
+ fclose(fh);
+-return
++end
+ 
+ function b = isvector(options)
+ b = options.pdf || options.eps;
+-return
++end
+ 
+ function b = isbitmap(options)
+ b = options.png || options.tif || options.jpg || options.bmp || options.im || options.alpha;
+-return
++end
+ 
+ % Helper function
+ function A = make_cell(A)
+ if ~iscell(A)
+     A = {A};
+ end
+-return
++end
+ 
+ function add_bookmark(fname, bookmark_text)
+ % Adds a bookmark to the temporary EPS file after %%EndPageSetup
+@@ -807,4 +785,15 @@
+     rethrow(ex);
+ end
+ fclose(fh);
+-return
+\ No newline at end of file
++end
++
++function set_tick_mode(Hlims, ax)
++% Set the tick mode of linear axes to manual
++% Leave log axes alone as these are tricky
++M = get(Hlims, [ax 'Scale']);
++if ~iscell(M)
++    M = {M};
++end
++M = cellfun(@(c) strcmp(c, 'linear'), M);
++set(Hlims(M), [ax 'TickMode'], 'manual');
++end
+Index: ../trunk-jpl/externalpackages/export_fig/ghostscript.m
+===================================================================
+--- ../trunk-jpl/externalpackages/export_fig/ghostscript.m	(revision 18903)
++++ ../trunk-jpl/externalpackages/export_fig/ghostscript.m	(revision 18904)
+@@ -19,7 +19,7 @@
+ %   status - 0 iff command ran without problem.
+ %   result - Output from ghostscript.
+ 
+-% Copyright: Oliver Woodford, 2009-2010
++% Copyright: Oliver Woodford, 2009-2013
+ 
+ % Thanks to Jonas Dorn for the fix for the title of the uigetdir window on
+ % Mac OS.
+@@ -31,11 +31,25 @@
+ % location for gs on linux.
+ % 12/12/12 - Add extra executable name on Windows. Thanks to Ratish
+ % Punnoose for highlighting the issue.
++% 28/6/13 - Fix error using GS 9.07 in Linux. Many thanks to Jannick
++% Steinbring for proposing the fix.
++% 24/10/13 - Fix error using GS 9.07 in Linux. Many thanks to Johannes
++% for the fix.
++% 23/01/2014 - Add full path to ghostscript.txt in warning. Thanks to Koen
++% Vermeer for raising the issue.
+ 
+ function varargout = ghostscript(cmd)
++% Initialize any required system calls before calling ghostscript
++shell_cmd = '';
++if isunix
++    shell_cmd = 'export LD_LIBRARY_PATH=""; '; % Avoids an error on Linux with GS 9.07
++end
++if ismac
++    shell_cmd = 'export DYLD_LIBRARY_PATH=""; ';  % Avoids an error on Mac with GS 9.07
++end
+ % Call ghostscript
+-[varargout{1:nargout}] = system(sprintf('"%s" %s', gs_path, cmd));
+-return
++[varargout{1:nargout}] = system(sprintf('%s"%s" %s', shell_cmd, gs_path, cmd));
++end
+ 
+ function path_ = gs_path
+ % Return a valid path
+@@ -84,9 +98,9 @@
+         return
+     end
+ else
+-    bin = {'/usr/bin/gs', '/usr/local/bin/gs'};
+-    for a = 1:numel(bin)
+-        path_ = bin{a};
++    executable = {'/usr/bin/gs', '/usr/local/bin/gs'};
++    for a = 1:numel(executable)
++        path_ = executable{a};
+         if check_store_gs_path(path_)
+             return
+         end
+@@ -118,6 +132,7 @@
+     end
+ end
+ error('Ghostscript not found. Have you installed it from www.ghostscript.com?');
++end
+ 
+ function good = check_store_gs_path(path_)
+ % Check the path is valid
+@@ -127,13 +142,17 @@
+ end
+ % Update the current default path to the path found
+ if ~user_string('ghostscript', path_)
+-    warning('Path to ghostscript installation could not be saved. Enter it manually in ghostscript.txt.');
++    warning('Path to ghostscript installation could not be saved. Enter it manually in %s.', fullfile(fileparts(which('user_string.m')), '.ignore', 'ghostscript.txt'));
+     return
+ end
+-return
++end
+ 
+ function good = check_gs_path(path_)
+ % Check the path is valid
+-[good, message] = system(sprintf('"%s" -h', path_));
++shell_cmd = '';
++if ismac
++    shell_cmd = 'export DYLD_LIBRARY_PATH=""; ';  % Avoids an error on Mac with GS 9.07
++end
++[good, message] = system(sprintf('%s"%s" -h', shell_cmd, path_));
+ good = good == 0;
+-return
+\ No newline at end of file
++end
+Index: ../trunk-jpl/externalpackages/export_fig/im2gif.m
+===================================================================
+--- ../trunk-jpl/externalpackages/export_fig/im2gif.m	(revision 0)
++++ ../trunk-jpl/externalpackages/export_fig/im2gif.m	(revision 18904)
+@@ -0,0 +1,186 @@
++%IM2GIF Convert a multiframe image to an animated GIF file
++%
++% Examples:
++%   im2gif infile
++%   im2gif infile outfile
++%   im2gif(A, outfile)
++%   im2gif(..., '-nocrop')
++%   im2gif(..., '-nodither')
++%   im2gif(..., '-ncolors', n)
++%   im2gif(..., '-loops', n)
++%   im2gif(..., '-delay', n) 
++%   
++% This function converts a multiframe image to an animated GIF.
++%
++% To create an animation from a series of figures, export to a multiframe
++% TIFF file using export_fig, then convert to a GIF, as follows:
++%
++%    for a = 2 .^ (3:6)
++%       peaks(a);
++%       export_fig test.tif -nocrop -append
++%    end
++%    im2gif('test.tif', '-delay', 0.5);
++%
++%IN:
++%   infile - string containing the name of the input image.
++%   outfile - string containing the name of the output image (must have the
++%             .gif extension). Default: infile, with .gif extension.
++%   A - HxWxCxN array of input images, stacked along fourth dimension, to
++%       be converted to gif.
++%   -nocrop - option indicating that the borders of the output are not to
++%             be cropped.
++%   -nodither - option indicating that dithering is not to be used when
++%               converting the image.
++%   -ncolors - option pair, the value of which indicates the maximum number
++%              of colors the GIF can have. This can also be a quantization
++%              tolerance, between 0 and 1. Default/maximum: 256.
++%   -loops - option pair, the value of which gives the number of times the
++%            animation is to be looped. Default: 65535.
++%   -delay - option pair, the value of which gives the time, in seconds,
++%            between frames. Default: 1/15.
++
++% Copyright (C) Oliver Woodford 2011
++
++function im2gif(A, varargin)
++
++% Parse the input arguments
++[A, options] = parse_args(A, varargin{:});
++
++if options.crop ~= 0
++    % Crop
++    A = crop_borders(A, A(ceil(end/2),1,:,1));
++end
++
++% Convert to indexed image
++[h, w, c, n] = size(A);
++A = reshape(permute(A, [1 2 4 3]), h, w*n, c);
++map = unique(reshape(A, h*w*n, c), 'rows');
++if size(map, 1) > 256
++    dither_str = {'dither', 'nodither'};
++    dither_str = dither_str{1+(options.dither==0)};
++    if options.ncolors <= 1
++        [B, map] = rgb2ind(A, options.ncolors, dither_str);
++        if size(map, 1) > 256
++            [B, map] = rgb2ind(A, 256, dither_str);
++        end
++    else
++        [B, map] = rgb2ind(A, min(round(options.ncolors), 256), dither_str);
++    end
++else
++    if max(map(:)) > 1
++        map = double(map) / 255;
++        A = double(A) / 255;
++    end
++    B = rgb2ind(im2double(A), map);
++end
++B = reshape(B, h, w, 1, n);
++
++% Bug fix to rgb2ind
++map(B(1)+1,:) = im2double(A(1,1,:));
++
++% Save as a gif
++imwrite(B, map, options.outfile, 'LoopCount', round(options.loops(1)), 'DelayTime', options.delay);
++end
++
++%% Parse the input arguments
++function [A, options] = parse_args(A, varargin)
++% Set the defaults
++options = struct('outfile', '', ...
++                 'dither', true, ...
++                 'crop', true, ...
++                 'ncolors', 256, ...
++                 'loops', 65535, ...
++                 'delay', 1/15);
++
++% Go through the arguments
++a = 0;
++n = numel(varargin);
++while a < n
++    a = a + 1;
++    if ischar(varargin{a}) && ~isempty(varargin{a})
++        if varargin{a}(1) == '-'
++            opt = lower(varargin{a}(2:end));
++            switch opt
++                case 'nocrop'
++                    options.crop = false;
++                case 'nodither'
++                    options.dither = false;
++                otherwise
++                    if ~isfield(options, opt)
++                        error('Option %s not recognized', varargin{a});
++                    end
++                    a = a + 1;
++                    if ischar(varargin{a}) && ~ischar(options.(opt))
++                        options.(opt) = str2double(varargin{a});
++                    else
++                        options.(opt) = varargin{a};
++                    end
++            end
++        else
++            options.outfile = varargin{a};
++        end
++    end
++end
++
++if isempty(options.outfile)
++    if ~ischar(A)
++        error('No output filename given.');
++    end
++    % Generate the output filename from the input filename
++    [path, outfile] = fileparts(A);
++    options.outfile = fullfile(path, [outfile '.gif']);
++end
++
++if ischar(A)
++    % Read in the image
++    A = imread_rgb(A);
++end
++end
++
++%% Read image to uint8 rgb array
++function [A, alpha] = imread_rgb(name)
++% Get file info
++info = imfinfo(name);
++% Special case formats
++switch lower(info(1).Format)
++    case 'gif'
++        [A, map] = imread(name, 'frames', 'all');
++        if ~isempty(map)
++            map = uint8(map * 256 - 0.5); % Convert to uint8 for storage
++            A = reshape(map(uint32(A)+1,:), [size(A) size(map, 2)]); % Assume indexed from 0
++            A = permute(A, [1 2 5 4 3]);
++        end
++    case {'tif', 'tiff'}
++        A = cell(numel(info), 1);
++        for a = 1:numel(A)
++            [A{a}, map] = imread(name, 'Index', a, 'Info', info);
++            if ~isempty(map)
++                map = uint8(map * 256 - 0.5); % Convert to uint8 for storage
++                A{a} = reshape(map(uint32(A{a})+1,:), [size(A) size(map, 2)]); % Assume indexed from 0
++            end
++            if size(A{a}, 3) == 4
++                % TIFF in CMYK colourspace - convert to RGB
++                if isfloat(A{a})
++                    A{a} = A{a} * 255;
++                else
++                    A{a} = single(A{a});
++                end
++                A{a} = 255 - A{a};
++                A{a}(:,:,4) = A{a}(:,:,4) / 255;
++                A{a} = uint8(A(:,:,1:3) .* A{a}(:,:,[4 4 4]));
++            end
++        end
++        A = cat(4, A{:});
++    otherwise
++        [A, map, alpha] = imread(name);
++        A = A(:,:,:,1); % Keep only first frame of multi-frame files
++        if ~isempty(map)
++            map = uint8(map * 256 - 0.5); % Convert to uint8 for storage
++            A = reshape(map(uint32(A)+1,:), [size(A) size(map, 2)]); % Assume indexed from 0
++        elseif size(A, 3) == 4
++            % Assume 4th channel is an alpha matte
++            alpha = A(:,:,4);
++            A = A(:,:,1:3);
++        end
++end
++end
+
+Property changes on: ../trunk-jpl/externalpackages/export_fig/im2gif.m
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/externalpackages/export_fig/print2array.m
+===================================================================
+--- ../trunk-jpl/externalpackages/export_fig/print2array.m	(revision 18903)
++++ ../trunk-jpl/externalpackages/export_fig/print2array.m	(revision 18904)
+@@ -70,7 +70,7 @@
+ if nargin > 2 && strcmp(renderer, '-painters')
+     % Print to eps file
+     tmp_eps = [tempname '.eps'];
+-    print2eps(tmp_eps, fig, renderer, '-loose');
++    print2eps(tmp_eps, fig, 0, renderer, '-loose');
+     try
+         % Initialize the command to export to tiff using ghostscript
+         cmd_str = ['-dEPSCrop -q -dNOPAUSE -dBATCH ' res_str ' -sDEVICE=tiff24nc'];
+@@ -171,7 +171,7 @@
+         A = A(1:min(end,px(1)),1:min(end,px(2)),:);
+     end
+ end
+-return
++end
+ 
+ % Function to return (and create, where necessary) the font path
+ function fp = font_path()
+@@ -195,4 +195,4 @@
+     fp = [fp '/usr/share/fonts:/usr/local/share/fonts:/usr/share/fonts/X11:/usr/local/share/fonts/X11:/usr/share/fonts/truetype:/usr/local/share/fonts/truetype'];
+ end
+ user_string('gs_font_path', fp);
+-return
++end
+Index: ../trunk-jpl/externalpackages/export_fig/pdftops.m
+===================================================================
+--- ../trunk-jpl/externalpackages/export_fig/pdftops.m	(revision 18903)
++++ ../trunk-jpl/externalpackages/export_fig/pdftops.m	(revision 18904)
+@@ -27,10 +27,11 @@
+ % Mac OS.
+ % Thanks to Christoph Hertel for pointing out a bug in check_xpdf_path
+ % under linux.
++% 23/01/2014 - Add full path to pdftops.txt in warning.
+ 
+ % Call pdftops
+ [varargout{1:nargout}] = system(sprintf('"%s" %s', xpdf_path, cmd));
+-return
++end
+ 
+ function path_ = xpdf_path
+ % Return a valid path
+@@ -84,6 +85,7 @@
+     end
+ end
+ error('pdftops executable not found.');
++end
+ 
+ function good = check_store_xpdf_path(path_)
+ % Check the path is valid
+@@ -93,15 +95,15 @@
+ end
+ % Update the current default path to the path found
+ if ~user_string('pdftops', path_)
+-    warning('Path to pdftops executable could not be saved. Enter it manually in pdftops.txt.');
++    warning('Path to pdftops executable could not be saved. Enter it manually in %s.', fullfile(fileparts(which('user_string.m')), '.ignore', 'pdftops.txt'));
+     return
+ end
+-return
++end
+ 
+ function good = check_xpdf_path(path_)
+ % Check the path is valid
+-[good message] = system(sprintf('"%s" -h', path_));
++[good, message] = system(sprintf('"%s" -h', path_));
+ % system returns good = 1 even when the command runs
+ % Look for something distinct in the help text
+ good = ~isempty(strfind(message, 'PostScript'));
+-return
+\ No newline at end of file
++end
+Index: ../trunk-jpl/externalpackages/export_fig/isolate_axes.m
+===================================================================
+--- ../trunk-jpl/externalpackages/export_fig/isolate_axes.m	(revision 18903)
++++ ../trunk-jpl/externalpackages/export_fig/isolate_axes.m	(revision 18904)
+@@ -18,13 +18,16 @@
+ % OUT:
+ %    fh - The handle of the created figure.
+ 
+-% Copyright (C) Oliver Woodford 2011-2012
++% Copyright (C) Oliver Woodford 2011-2013
+ 
+ % Thank you to Rosella Blatt for reporting a bug to do with axes in GUIs
+ % 16/3/2012 Moved copyfig to its own function. Thanks to Bob Fratantonio
+ % for pointing out that the function is also used in export_fig.m.
+ % 12/12/12 - Add support for isolating uipanels. Thanks to michael for
+ % suggesting it.
++% 08/10/13 - Bug fix to allchildren suggested by Will Grant (many thanks!).
++% 05/12/13 - Bug fix to axes having different units. Thanks to Remington
++% Reid for reporting the issue.
+ 
+ function fh = isolate_axes(ah, vis)
+ % Make sure we have an array of handles
+@@ -71,6 +74,7 @@
+ lh = findall(fh, 'Type', 'axes', '-and', {'Tag', 'legend', '-or', 'Tag', 'Colorbar'});
+ nLeg = numel(lh);
+ if nLeg > 0
++    set([ah(:); lh(:)], 'Units', 'normalized');
+     ax_pos = get(ah, 'OuterPosition');
+     if nAx > 1
+         ax_pos = cell2mat(ax_pos(:));
+@@ -81,25 +85,27 @@
+         leg_pos = cell2mat(leg_pos);
+     end
+     leg_pos(:,3:4) = leg_pos(:,3:4) + leg_pos(:,1:2);
+-    for a = 1:nAx
+-            % Overlap test
+-            ah = [ah; lh(leg_pos(:,1) < ax_pos(a,3) & leg_pos(:,2) < ax_pos(a,4) &...
+-                         leg_pos(:,3) > ax_pos(a,1) & leg_pos(:,4) > ax_pos(a,2))];
+-    end
++    ax_pos = shiftdim(ax_pos, -1);
++    % Overlap test
++    M = bsxfun(@lt, leg_pos(:,1), ax_pos(:,:,3)) & ...
++        bsxfun(@lt, leg_pos(:,2), ax_pos(:,:,4)) & ...
++        bsxfun(@gt, leg_pos(:,3), ax_pos(:,:,1)) & ...
++        bsxfun(@gt, leg_pos(:,4), ax_pos(:,:,2));
++    ah = [ah; lh(any(M, 2))];
+ end
+ % Get all the objects in the figure
+ axs = findall(fh);
+ % Delete everything except for the input objects and associated items
+ delete(axs(~ismember(axs, [ah; allchildren(ah); allancestors(ah)])));
+-return
++end
+ 
+ function ah = allchildren(ah)
+-ah = allchild(ah);
++ah = findall(ah);
+ if iscell(ah)
+     ah = cell2mat(ah);
+ end
+ ah = ah(:);
+-return
++end
+ 
+ function ph = allancestors(ah)
+ ph = [];
+@@ -110,4 +116,4 @@
+         h = get(h, 'parent');
+     end
+ end
+-return
+\ No newline at end of file
++end
+Index: ../trunk-jpl/externalpackages/export_fig/fix_lines.m
+===================================================================
+--- ../trunk-jpl/externalpackages/export_fig/fix_lines.m	(revision 18903)
++++ ../trunk-jpl/externalpackages/export_fig/fix_lines.m	(revision 18904)
+@@ -1,9 +1,9 @@
+-function fix_lines(fname, fname2)
+ %FIX_LINES  Improves the line style of eps files generated by print
+ %
+ % Examples:
+ %   fix_lines fname
+ %   fix_lines fname fname2
++%   fstrm_out = fixlines(fstrm_in)
+ %
+ % This function improves the style of lines in eps files generated by
+ % MATLAB's print function, making them more similar to those seen on
+@@ -15,11 +15,15 @@
+ % order to allow programs such as Ghostscript to find the bounding box
+ % information.
+ %
+-% IN:
++%IN:
+ %   fname - Name or path of source eps file.
+ %   fname2 - Name or path of destination eps file. Default: same as fname.
++%   fstrm_in - File contents of a MATLAB-generated eps file.
++%
++%OUT:
++%   fstrm_out - Contents of the eps file with line styles fixed.
+ 
+-% Copyright: (C) Oliver Woodford, 2008-2010
++% Copyright: (C) Oliver Woodford, 2008-2014
+ 
+ % The idea of editing the EPS file to change line styles comes from Jiro
+ % Doke's FIXPSLINESTYLE (fex id: 17928)
+@@ -33,24 +37,22 @@
+ % Thank you to Laurence K for suggesting the check to see if the file was
+ % opened.
+ 
+-% Read in the file
+-fh = fopen(fname, 'r');
+-if fh == -1
+-    error('File %s not found.', fname);
++function fstrm = fix_lines(fstrm, fname2)
++
++if nargout == 0 || nargin > 1
++    if nargin < 2
++        % Overwrite the input file
++        fname2 = fstrm;
++    end
++    % Read in the file
++    fstrm = read_write_entire_textfile(fstrm);
+ end
+-try
+-    fstrm = fread(fh, '*char')';
+-catch ex
+-    fclose(fh);
+-    rethrow(ex);
+-end
+-fclose(fh);
+ 
+ % Move any embedded fonts after the postscript header
+ if strcmp(fstrm(1:15), '%!PS-AdobeFont-')
+     % Find the start and end of the header
+     ind = regexp(fstrm, '[\n\r]%!PS-Adobe-');
+-    [ind2 ind2] = regexp(fstrm, '[\n\r]%%EndComments[\n\r]+');
++    [ind2, ind2] = regexp(fstrm, '[\n\r]%%EndComments[\n\r]+');
+     % Put the header first
+     if ~isempty(ind) && ~isempty(ind2) && ind(1) < ind2(1)
+         fstrm = fstrm([ind(1)+1:ind2(1) 1:ind(1) ind2(1)+1:end]);
+@@ -66,7 +68,7 @@
+        regexp(fstrm, '[\n\r]DD[\n\r]')];
+ ind = sort(ind);
+ % Find line width commands
+-[ind2 ind3] = regexp(fstrm, '[\n\r]\d* w[\n\r]');
++[ind2, ind3] = regexp(fstrm, '[\n\r]\d* w[\n\r]');
+ % Go through each line style section and swap with any line width commands
+ % near by
+ b = 1;
+@@ -113,8 +115,8 @@
+ 
+ % Isolate line style definition section
+ first_sec = strfind(fstrm, '% line types:');
+-[second_sec remaining] = strtok(fstrm(first_sec+1:end), '/');
+-[remaining remaining] = strtok(remaining, '%');
++[second_sec, remaining] = strtok(fstrm(first_sec+1:end), '/');
++[remaining, remaining] = strtok(remaining, '%');
+ 
+ % Define the new styles, including the new GR format
+ % Dot and dash lengths have two parts: a constant amount plus a line width
+@@ -131,24 +133,11 @@
+              '/DD { [1 dom 1.2 dom 4 dam 1.2 dom] 0 setdash 0 setlinecap } bdef',... % Dot dash lines
+              '/GR { [0 dpi2point mul 4 dpi2point mul] 0 setdash 1 setlinecap } bdef'}; % Grid lines - dot spacing remains constant
+ 
+-if nargin < 2
+-    % Overwrite the input file
+-    fname2 = fname;
+-end
++% Construct the output
++fstrm = [fstrm(1:first_sec) second_sec sprintf('%s\r', new_style{:}) remaining];
+ 
+-% Save the file with the section replaced
+-fh = fopen(fname2, 'w');
+-if fh == -1
+-    error('Unable to open %s for writing.', fname2);
++% Write the output file
++if nargout == 0 || nargin > 1
++    read_write_entire_textfile(fname2, fstrm);
+ end
+-try
+-    fwrite(fh, fstrm(1:first_sec), 'char*1');
+-    fwrite(fh, second_sec, 'char*1');
+-    fprintf(fh, '%s\r', new_style{:});
+-    fwrite(fh, remaining, 'char*1');
+-catch ex
+-    fclose(fh);
+-    rethrow(ex);
+ end
+-fclose(fh);
+-return
+\ No newline at end of file
+Index: ../trunk-jpl/externalpackages/export_fig/crop_borders.m
+===================================================================
+--- ../trunk-jpl/externalpackages/export_fig/crop_borders.m	(revision 0)
++++ ../trunk-jpl/externalpackages/export_fig/crop_borders.m	(revision 18904)
+@@ -0,0 +1,81 @@
++%CROP_BORDERS Crop the borders of an image or stack of images
++%
++%   [B, v] = crop_borders(A, bcol, [padding])
++%
++%IN:
++%   A - HxWxCxN stack of images.
++%   bcol - Cx1 background colour vector.
++%   padding - scalar indicating how many pixels padding to have. Default: 0.
++%
++%OUT:
++%   B - JxKxCxN cropped stack of images.
++%   v - 1x4 vector of start and end indices for first two dimensions, s.t.
++%       B = A(v(1):v(2),v(3):v(4),:,:).
++
++function [A, v] = crop_borders(A, bcol, padding)
++if nargin < 3
++    padding = 0;
++end
++[h, w, c, n] = size(A);
++if isscalar(bcol)
++    bcol = bcol(ones(c, 1));
++end
++bail = false;
++for l = 1:w
++    for a = 1:c
++        if ~all(col(A(:,l,a,:)) == bcol(a))
++            bail = true;
++            break;
++        end
++    end
++    if bail
++        break;
++    end
++end
++bcol = A(ceil(end/2),w,:,1);
++bail = false;
++for r = w:-1:l
++    for a = 1:c
++        if ~all(col(A(:,r,a,:)) == bcol(a))
++            bail = true;
++            break;
++        end
++    end
++    if bail
++        break;
++    end
++end
++bcol = A(1,ceil(end/2),:,1);
++bail = false;
++for t = 1:h
++    for a = 1:c
++        if ~all(col(A(t,:,a,:)) == bcol(a))
++            bail = true;
++            break;
++        end
++    end
++    if bail
++        break;
++    end
++end
++bcol = A(h,ceil(end/2),:,1);
++bail = false;
++for b = h:-1:t
++    for a = 1:c
++        if ~all(col(A(b,:,a,:)) == bcol(a))
++            bail = true;
++            break;
++        end
++    end
++    if bail
++        break;
++    end
++end
++% Crop the background, leaving one boundary pixel to avoid bleeding on resize
++v = [max(t-padding, 1) min(b+padding, h) max(l-padding, 1) min(r+padding, w)];
++A = A(v(1):v(2),v(3):v(4),:,:);
++end
++
++function A = col(A)
++A = A(:);
++end
+
+Property changes on: ../trunk-jpl/externalpackages/export_fig/crop_borders.m
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/externalpackages/export_fig/append_pdfs.m
+===================================================================
+--- ../trunk-jpl/externalpackages/export_fig/append_pdfs.m	(revision 0)
++++ ../trunk-jpl/externalpackages/export_fig/append_pdfs.m	(revision 18904)
+@@ -0,0 +1,58 @@
++%APPEND_PDFS Appends/concatenates multiple PDF files
++%
++% Example:
++%   append_pdfs(output, input1, input2, ...)
++%   append_pdfs(output, input_list{:})
++%   append_pdfs test.pdf temp1.pdf temp2.pdf
++%
++% This function appends multiple PDF files to an existing PDF file, or
++% concatenates them into a PDF file if the output file doesn't yet exist.
++%
++% This function requires that you have ghostscript installed on your
++% system. Ghostscript can be downloaded from: http://www.ghostscript.com
++%
++% IN:
++%    output - string of output file name (including the extension, .pdf).
++%             If it exists it is appended to; if not, it is created.
++%    input1 - string of an input file name (including the extension, .pdf).
++%             All input files are appended in order.
++%    input_list - cell array list of input file name strings. All input
++%                 files are appended in order.
++
++% Copyright: Oliver Woodford, 2011
++
++% Thanks to Reinhard Knoll for pointing out that appending multiple pdfs in
++% one go is much faster than appending them one at a time.
++
++% Thanks to Michael Teo for reporting the issue of a too long command line.
++% Issue resolved on 5/5/2011, by passing gs a command file.
++
++% Thanks to Martin Wittmann for pointing out the quality issue when
++% appending multiple bitmaps.
++% Issue resolved (to best of my ability) 1/6/2011, using the prepress
++% setting
++
++function append_pdfs(varargin)
++% Are we appending or creating a new file
++append = exist(varargin{1}, 'file') == 2;
++if append
++    output = [tempname '.pdf'];
++else
++    output = varargin{1};
++    varargin = varargin(2:end);
++end
++% Create the command file
++cmdfile = [tempname '.txt'];
++fh = fopen(cmdfile, 'w');
++fprintf(fh, '-q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile="%s" -f', output);
++fprintf(fh, ' "%s"', varargin{:});
++fclose(fh);
++% Call ghostscript
++ghostscript(['@"' cmdfile '"']);
++% Delete the command file
++delete(cmdfile);
++% Rename the file if needed
++if append
++    movefile(output, varargin{1});
++end
++end
+
+Property changes on: ../trunk-jpl/externalpackages/export_fig/append_pdfs.m
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18904-18905.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18904-18905.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18904-18905.diff	(revision 19102)
@@ -0,0 +1,17 @@
+Index: ../trunk-jpl/etc/environment.sh
+===================================================================
+--- ../trunk-jpl/etc/environment.sh	(revision 18904)
++++ ../trunk-jpl/etc/environment.sh	(revision 18905)
+@@ -71,6 +71,12 @@
+ pathprepend   "$MATLAB_DIR/bin" #take precedence over /usr/local/bin/matlab
+ libpathappend "$MATLAB_DIR/lib"
+ 
++#GMT 
++GMT_DIR="$ISSM_DIR/externalpackages/gmt/install"
++export GMT_DIR
++pathprepend   "$GMT_DIR/bin" 
++libpathappend "$GMT_DIR/lib"
++
+ #legacy mpich2 (To be removed)
+ MPI_DIR="$ISSM_DIR/externalpackages/mpich2/install"
+ if [ -d "$MPI_DIR" ]; then
Index: /issm/oecreview/Archive/18296-19100/ISSM-18905-18906.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18905-18906.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18905-18906.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18905)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18906)
+@@ -1276,7 +1276,7 @@
+ 				phi[i]=h[i]+r[i]/density;
+ 			}
+ 		}
+-		else phi[i]=h[i]+r[i]/density;
++		else if(migration_style!=ContactEnum) phi[i]=h[i]+r[i]/density;
+ 	}
+ 	this->AddInput(MaskGroundediceLevelsetEnum,&phi[0],P1Enum);
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18906-18907.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18906-18907.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18906-18907.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/externalpackages/gshhg/install.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/gshhg/install.sh	(revision 18906)
++++ ../trunk-jpl/externalpackages/gshhg/install.sh	(revision 18907)
+@@ -4,7 +4,7 @@
+ rm -rf gssh-gmt-2.3.3.tar.gz  src install
+ 
+ #get gssh database from noaa's website:  http://www.ngdc.noaa.gov/mgg/shorelines/gshhs.html
+-curl http://www.ngdc.noaa.gov/mgg/shorelines/data/gshhg/latest/gshhg-gmt-2.3.3.tar.gz > gsshh-gmt-2.3.3.tar.gz
++curl http://www.ngdc.noaa.gov/mgg/shorelines/data/gshhg/latest/gshhg-gmt-2.3.3.tar.gz > gshhg-gmt-2.3.3.tar.gz
+ 
+ #Download from ISSM server
+ #$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/gshhg-gmt-2.3.3.tar.gz' 'gshhg-gmt-2.3.3.tar.gz'
Index: /issm/oecreview/Archive/18296-19100/ISSM-18907-18908.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18907-18908.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18907-18908.diff	(revision 19102)
@@ -0,0 +1,14 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18907)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18908)
+@@ -1277,6 +1277,9 @@
+ 			}
+ 		}
+ 		else if(migration_style!=ContactEnum) phi[i]=h[i]+r[i]/density;
++		else{
++			/*do nothing*/
++		}
+ 	}
+ 	this->AddInput(MaskGroundediceLevelsetEnum,&phi[0],P1Enum);
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18908-18909.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18908-18909.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18908-18909.diff	(revision 19102)
@@ -0,0 +1,20 @@
+Index: ../trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp	(revision 18908)
++++ ../trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp	(revision 18909)
+@@ -14,13 +14,14 @@
+ 	IssmDouble         *phi_ungrounding                  = NULL;
+ 	Element            *element                          = NULL;
+ 
+-	if(VerboseModule()) _printf0_("   Migrating grounding line\n");
+ 
+ 	/*retrieve parameters: */
+ 	parameters->FindParam(&migration_style,GroundinglineMigrationEnum);
+ 	parameters->FindParam(&analysis_type,AnalysisTypeEnum);
+ 
+ 	if(migration_style==NoneEnum) return;
++	
++	if(VerboseModule()) _printf0_("   Migrating grounding line\n");
+ 
+ 	/*Set toolkit to default*/
+ 	ToolkitsOptionsFromAnalysis(parameters,DefaultAnalysisEnum);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18909-18910.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18909-18910.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18909-18910.diff	(revision 19102)
@@ -0,0 +1,26 @@
+Index: ../trunk-jpl/src/m/mesh/MeshToShp.m
+===================================================================
+--- ../trunk-jpl/src/m/mesh/MeshToShp.m	(revision 0)
++++ ../trunk-jpl/src/m/mesh/MeshToShp.m	(revision 18910)
+@@ -0,0 +1,14 @@
++function MeshToShp(md,shapefilename)
++%MESHTOSHP - export mesh to shp file
++%
++%   Usage:
++%      MeshToShp(md,'Greenland.shp');
++
++	contours= struct([]);
++	for i=1:md.mesh.numberofvertices,
++		contours(i).x = md.mesh.x(i);
++		contours(i).y = md.mesh.y(i);
++		contours(i).id = i;
++		contours(i).Geometry = 'Point';
++	end
++	shpwrite(contours,shapefilename);
+
+Property changes on: ../trunk-jpl/src/m/mesh/MeshToShp.m
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18910-18911.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18910-18911.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18910-18911.diff	(revision 19102)
@@ -0,0 +1,3174 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18910)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18911)
+@@ -154,6 +154,99 @@
+ 	this->inputs->AddInput(new TriaInput(input_enum,values,interpolation_enum));
+ }
+ /*}}}*/
++void       Tria::AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part){/*{{{*/
++
++	bool       already = false;
++	int        i,j;
++	int        partition[NUMVERTICES];
++	int        offsetsid[NUMVERTICES];
++	int        offsetdof[NUMVERTICES];
++	IssmDouble area;
++	IssmDouble mean;
++
++	/*First, get the area: */
++	area=this->GetArea();
++
++	/*Figure out the average for this element: */
++	this->GetVerticesSidList(&offsetsid[0]);
++	this->GetVertexPidList(&offsetdof[0]);
++	mean=0;
++	for(i=0;i<NUMVERTICES;i++){
++		partition[i]=reCast<int>(qmu_part[offsetsid[i]]);
++		mean=mean+1.0/NUMVERTICES*vertex_response[offsetdof[i]];
++	}
++
++	/*Add contribution: */
++	for(i=0;i<NUMVERTICES;i++){
++		already=false;
++		for(j=0;j<i;j++){
++			if (partition[i]==partition[j]){
++				already=true;
++				break;
++			}
++		}
++		if(!already){
++			partition_contributions->SetValue(partition[i],mean*area,ADD_VAL);
++			partition_areas->SetValue(partition[i],area,ADD_VAL);
++		};
++	}
++}
++/*}}}*/
++void       Tria::CalvingRateLevermann(){/*{{{*/
++
++	IssmDouble  xyz_list[NUMVERTICES][3];
++	GaussTria* gauss=NULL;
++	IssmDouble  vx,vy,vel;
++	IssmDouble  strainparallel;
++	IssmDouble  propcoeff;
++	IssmDouble  strainperpendicular;
++	IssmDouble  calvingratex[NUMVERTICES];
++	IssmDouble  calvingratey[NUMVERTICES];
++	IssmDouble  calvingrate[NUMVERTICES];
++
++
++	/* Get node coordinates and dof list: */
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++
++	/*Retrieve all inputs and parameters we will need*/
++	Input* vx_input=inputs->GetInput(VxEnum);																		_assert_(vx_input);
++	Input* vy_input=inputs->GetInput(VyEnum);																		_assert_(vy_input);
++	Input* strainparallel_input=inputs->GetInput(StrainRateparallelEnum);								_assert_(strainparallel_input);
++	Input* strainperpendicular_input=inputs->GetInput(StrainRateperpendicularEnum);					_assert_(strainperpendicular_input);
++	Input* levermanncoeff_input=inputs->GetInput(CalvinglevermannCoeffEnum);                     _assert_(levermanncoeff_input);
++
++	/* Start looping on the number of vertices: */
++	gauss=new GaussTria();
++	for (int iv=0;iv<NUMVERTICES;iv++){
++		gauss->GaussVertex(iv);
++
++		/* Get the value we need*/
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		vel=vx*vx+vy*vy;
++		strainparallel_input->GetInputValue(&strainparallel,gauss);
++		strainperpendicular_input->GetInputValue(&strainperpendicular,gauss);
++		levermanncoeff_input->GetInputValue(&propcoeff,gauss);
++
++		/*Calving rate proportionnal to the positive product of the strain rate along the ice flow direction and the strain rate perpendicular to the ice flow */
++		calvingrate[iv]=propcoeff*strainparallel*strainperpendicular;
++		if(calvingrate[iv]<0){
++			calvingrate[iv]=0;
++		}
++		calvingratex[iv]=calvingrate[iv]*vx/(vel+1.e-6);
++		calvingratey[iv]=calvingrate[iv]*vy/(vel+1.e-6);
++	}
++
++	/*Add input*/
++	this->inputs->AddInput(new TriaInput(CalvingratexEnum,&calvingratex[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(CalvingrateyEnum,&calvingratey[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(CalvingCalvingrateEnum,&calvingrate[0],P1Enum));
++
++	/*Clean up and return*/
++	delete gauss;
++
++}
++/*}}}*/
+ IssmDouble Tria::CharacteristicLength(void){/*{{{*/
+ 
+ 	return sqrt(2*this->GetArea());
+@@ -163,6 +256,56 @@
+ 	_error_("Not Implemented yet");
+ }
+ /*}}}*/
++void       Tria::ComputeDeviatoricStressTensor(){/*{{{*/
++
++	IssmDouble  xyz_list[NUMVERTICES][3];
++	IssmDouble  viscosity;
++	IssmDouble  epsilon[3]; /* epsilon=[exx,eyy,exy];*/
++	IssmDouble  tau_xx[NUMVERTICES];
++	IssmDouble	tau_yy[NUMVERTICES];
++	IssmDouble	tau_zz[NUMVERTICES]={0,0,0};
++	IssmDouble  tau_xy[NUMVERTICES];
++	IssmDouble	tau_xz[NUMVERTICES]={0,0,0};
++	IssmDouble	tau_yz[NUMVERTICES]={0,0,0};
++	GaussTria*  gauss=NULL;
++	int domaintype,dim=2;
++
++	/* Get node coordinates and dof list: */
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++
++	/*Retrieve all inputs we will be needing: */
++	this->FindParam(&domaintype,DomainTypeEnum);
++	if(domaintype!=Domain2DhorizontalEnum) _error_("deviatoric stress tensor calculation not implemented for mesh of type " <<EnumToStringx(domaintype));
++	Input* vx_input=inputs->GetInput(VxEnum);             _assert_(vx_input);
++	Input* vy_input=inputs->GetInput(VyEnum);             _assert_(vy_input);
++
++	/* Start looping on the number of vertices: */
++	gauss=new GaussTria();
++	for (int iv=0;iv<NUMVERTICES;iv++){
++		gauss->GaussVertex(iv);
++
++		/*Compute strain rate and viscosity: */
++		this->StrainRateSSA(&epsilon[0],&xyz_list[0][0],gauss,vx_input,vy_input);
++		this->ViscositySSA(&viscosity,dim,&xyz_list[0][0],gauss,vx_input,vy_input);
++
++		/*Compute Stress*/
++		tau_xx[iv]=2*viscosity*epsilon[0]; // tau = nu eps
++		tau_yy[iv]=2*viscosity*epsilon[1];
++		tau_xy[iv]=2*viscosity*epsilon[2];
++	}
++
++	/*Add Stress tensor components into inputs*/
++	this->inputs->AddInput(new TriaInput(DeviatoricStressxxEnum,&tau_xx[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(DeviatoricStressxyEnum,&tau_xy[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(DeviatoricStressxzEnum,&tau_xz[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(DeviatoricStressyyEnum,&tau_yy[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(DeviatoricStressyzEnum,&tau_yz[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(DeviatoricStresszzEnum,&tau_zz[0],P1Enum));
++
++	/*Clean up and return*/
++	delete gauss;
++}
++/*}}}*/
+ void       Tria::ComputeSigmaNN(){/*{{{*/
+ 
+ 	if(!IsOnBase()){
+@@ -275,203 +418,6 @@
+ 	delete gauss;
+ }
+ /*}}}*/
+-void       Tria::ComputeDeviatoricStressTensor(){/*{{{*/
+-
+-	IssmDouble  xyz_list[NUMVERTICES][3];
+-	IssmDouble  viscosity;
+-	IssmDouble  epsilon[3]; /* epsilon=[exx,eyy,exy];*/
+-	IssmDouble  tau_xx[NUMVERTICES];
+-	IssmDouble	tau_yy[NUMVERTICES];
+-	IssmDouble	tau_zz[NUMVERTICES]={0,0,0};
+-	IssmDouble  tau_xy[NUMVERTICES];
+-	IssmDouble	tau_xz[NUMVERTICES]={0,0,0};
+-	IssmDouble	tau_yz[NUMVERTICES]={0,0,0};
+-	GaussTria*  gauss=NULL;
+-	int domaintype,dim=2;
+-
+-	/* Get node coordinates and dof list: */
+-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-
+-	/*Retrieve all inputs we will be needing: */
+-	this->FindParam(&domaintype,DomainTypeEnum);
+-	if(domaintype!=Domain2DhorizontalEnum) _error_("deviatoric stress tensor calculation not implemented for mesh of type " <<EnumToStringx(domaintype));
+-	Input* vx_input=inputs->GetInput(VxEnum);             _assert_(vx_input);
+-	Input* vy_input=inputs->GetInput(VyEnum);             _assert_(vy_input);
+-
+-	/* Start looping on the number of vertices: */
+-	gauss=new GaussTria();
+-	for (int iv=0;iv<NUMVERTICES;iv++){
+-		gauss->GaussVertex(iv);
+-
+-		/*Compute strain rate and viscosity: */
+-		this->StrainRateSSA(&epsilon[0],&xyz_list[0][0],gauss,vx_input,vy_input);
+-		this->ViscositySSA(&viscosity,dim,&xyz_list[0][0],gauss,vx_input,vy_input);
+-
+-		/*Compute Stress*/
+-		tau_xx[iv]=2*viscosity*epsilon[0]; // tau = nu eps
+-		tau_yy[iv]=2*viscosity*epsilon[1];
+-		tau_xy[iv]=2*viscosity*epsilon[2];
+-	}
+-
+-	/*Add Stress tensor components into inputs*/
+-	this->inputs->AddInput(new TriaInput(DeviatoricStressxxEnum,&tau_xx[0],P1Enum));
+-	this->inputs->AddInput(new TriaInput(DeviatoricStressxyEnum,&tau_xy[0],P1Enum));
+-	this->inputs->AddInput(new TriaInput(DeviatoricStressxzEnum,&tau_xz[0],P1Enum));
+-	this->inputs->AddInput(new TriaInput(DeviatoricStressyyEnum,&tau_yy[0],P1Enum));
+-	this->inputs->AddInput(new TriaInput(DeviatoricStressyzEnum,&tau_yz[0],P1Enum));
+-	this->inputs->AddInput(new TriaInput(DeviatoricStresszzEnum,&tau_zz[0],P1Enum));
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-}
+-/*}}}*/
+-void       Tria::StrainRateparallel(){/*{{{*/
+-
+-	IssmDouble *xyz_list = NULL;
+-	IssmDouble  epsilon[3];
+-	GaussTria* gauss=NULL;
+-	IssmDouble  vx,vy,vel;
+-	IssmDouble  strainxx;
+-	IssmDouble  strainxy;
+-	IssmDouble  strainyy;
+-	IssmDouble  strainparallel[NUMVERTICES];
+-
+-	/* Get node coordinates and dof list: */
+-	this->GetVerticesCoordinates(&xyz_list);
+-
+-	/*Retrieve all inputs we will need*/
+-	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
+-	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
+-
+-	/* Start looping on the number of vertices: */
+-	gauss=new GaussTria();
+-	for (int iv=0;iv<NUMVERTICES;iv++){
+-		gauss->GaussVertex(iv);
+-
+-		/* Get the value we need*/
+-		vx_input->GetInputValue(&vx,gauss);
+-		vy_input->GetInputValue(&vy,gauss);
+-		vel=vx*vx+vy*vy;
+-
+-		/*Compute strain rate viscosity and pressure: */
+-		this->StrainRateSSA(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
+-		strainxx=epsilon[0];
+-		strainyy=epsilon[1];
+-		strainxy=epsilon[2];
+-
+-		/*strainparallel= Strain rate along the ice flow direction */
+-		strainparallel[iv]=(vx*vx*(strainxx)+vy*vy*(strainyy)+2*vy*vx*strainxy)/(vel+1.e-6);
+-	}
+-
+-	/*Add input*/
+-	this->inputs->AddInput(new TriaInput(StrainRateparallelEnum,&strainparallel[0],P1Enum));
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-	xDelete<IssmDouble>(xyz_list);
+-}
+-/*}}}*/
+-void       Tria::StrainRateperpendicular(){/*{{{*/
+-
+-	IssmDouble *xyz_list = NULL;
+-	GaussTria* gauss=NULL;
+-	IssmDouble  epsilon[3];
+-	IssmDouble  vx,vy,vel;
+-	IssmDouble  strainxx;
+-	IssmDouble  strainxy;
+-	IssmDouble  strainyy;
+-	IssmDouble  strainperpendicular[NUMVERTICES];
+-
+-	/* Get node coordinates and dof list: */
+-	this->GetVerticesCoordinates(&xyz_list);
+-
+-	/*Retrieve all inputs we will need*/
+-	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
+-	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
+-
+-	/* Start looping on the number of vertices: */
+-	gauss=new GaussTria();
+-	for (int iv=0;iv<NUMVERTICES;iv++){
+-		gauss->GaussVertex(iv);
+-
+-		/* Get the value we need*/
+-		vx_input->GetInputValue(&vx,gauss);
+-		vy_input->GetInputValue(&vy,gauss);
+-		vel=vx*vx+vy*vy;
+-
+-		/*Compute strain rate viscosity and pressure: */
+-		this->StrainRateSSA(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
+-		strainxx=epsilon[0];
+-		strainyy=epsilon[1];
+-		strainxy=epsilon[2];
+-
+-		/*strainperpendicular= Strain rate perpendicular to the ice flow direction */
+-		strainperpendicular[iv]=(vx*vx*(strainyy)+vy*vy*(strainxx)-2*vy*vx*strainxy)/(vel+1.e-6);
+-	}
+-
+-	/*Add input*/
+-	this->inputs->AddInput(new TriaInput(StrainRateperpendicularEnum,&strainperpendicular[0],P1Enum));
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-	xDelete<IssmDouble>(xyz_list);
+-}
+-/*}}}*/
+-void       Tria::CalvingRateLevermann(){/*{{{*/
+-
+-	IssmDouble  xyz_list[NUMVERTICES][3];
+-	GaussTria* gauss=NULL;
+-	IssmDouble  vx,vy,vel;
+-	IssmDouble  strainparallel;
+-	IssmDouble  propcoeff;
+-	IssmDouble  strainperpendicular;
+-	IssmDouble  calvingratex[NUMVERTICES];
+-	IssmDouble  calvingratey[NUMVERTICES];
+-	IssmDouble  calvingrate[NUMVERTICES];
+-
+-
+-	/* Get node coordinates and dof list: */
+-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-
+-	/*Retrieve all inputs and parameters we will need*/
+-	Input* vx_input=inputs->GetInput(VxEnum);																		_assert_(vx_input);
+-	Input* vy_input=inputs->GetInput(VyEnum);																		_assert_(vy_input);
+-	Input* strainparallel_input=inputs->GetInput(StrainRateparallelEnum);								_assert_(strainparallel_input);
+-	Input* strainperpendicular_input=inputs->GetInput(StrainRateperpendicularEnum);					_assert_(strainperpendicular_input);
+-	Input* levermanncoeff_input=inputs->GetInput(CalvinglevermannCoeffEnum);                     _assert_(levermanncoeff_input);
+-
+-	/* Start looping on the number of vertices: */
+-	gauss=new GaussTria();
+-	for (int iv=0;iv<NUMVERTICES;iv++){
+-		gauss->GaussVertex(iv);
+-
+-		/* Get the value we need*/
+-		vx_input->GetInputValue(&vx,gauss);
+-		vy_input->GetInputValue(&vy,gauss);
+-		vel=vx*vx+vy*vy;
+-		strainparallel_input->GetInputValue(&strainparallel,gauss);
+-		strainperpendicular_input->GetInputValue(&strainperpendicular,gauss);
+-		levermanncoeff_input->GetInputValue(&propcoeff,gauss);
+-
+-		/*Calving rate proportionnal to the positive product of the strain rate along the ice flow direction and the strain rate perpendicular to the ice flow */
+-		calvingrate[iv]=propcoeff*strainparallel*strainperpendicular;
+-		if(calvingrate[iv]<0){
+-			calvingrate[iv]=0;
+-		}
+-		calvingratex[iv]=calvingrate[iv]*vx/(vel+1.e-6);
+-		calvingratey[iv]=calvingrate[iv]*vy/(vel+1.e-6);
+-	}
+-
+-	/*Add input*/
+-	this->inputs->AddInput(new TriaInput(CalvingratexEnum,&calvingratex[0],P1Enum));
+-	this->inputs->AddInput(new TriaInput(CalvingrateyEnum,&calvingratey[0],P1Enum));
+-	this->inputs->AddInput(new TriaInput(CalvingCalvingrateEnum,&calvingrate[0],P1Enum));
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-
+-}
+-/*}}}*/
+ void       Tria::Configure(Elements* elementsin, Loads* loadsin,Nodes* nodesin,Vertices *verticesin,Materials* materialsin, Parameters* parametersin){/*{{{*/
+ 
+ 	/*go into parameters and get the analysis_counter: */
+@@ -507,6 +453,54 @@
+ 
+ }
+ /*}}}*/
++void       Tria::ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){/*{{{*/
++
++	int    vertexpidlist[NUMVERTICES];
++	IssmDouble grad_list[NUMVERTICES];
++	Input* grad_input=NULL;
++
++	Input* input=inputs->GetInput(enum_type);
++	if (!input) _error_("Input " << EnumToStringx(enum_type) << " not found");
++	if (input->ObjectEnum()!=ControlInputEnum) _error_("Input " << EnumToStringx(enum_type) << " is not a ControlInput");
++
++	GradientIndexing(&vertexpidlist[0],control_index);
++	for(int i=0;i<NUMVERTICES;i++) grad_list[i]=gradient[vertexpidlist[i]];
++	grad_input=new TriaInput(GradientEnum,grad_list,P1Enum);
++
++	((ControlInput*)input)->SetGradient(grad_input);
++
++}/*}}}*/
++void       Tria::ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum){/*{{{*/
++
++	Input* input=inputs->GetInput(control_enum);
++	if (!input) _error_("Input " << EnumToStringx(control_enum) << " not found");
++	if (input->ObjectEnum()!=ControlInputEnum) _error_("Input " << EnumToStringx(control_enum) << " is not a ControlInput");
++
++	int         sidlist[NUMVERTICES];
++	int         connectivity[NUMVERTICES];
++	IssmPDouble values[NUMVERTICES];
++	IssmPDouble gradients[NUMVERTICES]; 
++	IssmDouble  value,gradient;
++
++	this->GetVerticesConnectivityList(&connectivity[0]);
++	this->GetVerticesSidList(&sidlist[0]);
++
++	GaussTria* gauss=new GaussTria();
++	for (int iv=0;iv<NUMVERTICES;iv++){
++		gauss->GaussVertex(iv);
++
++		((ControlInput*)input)->GetInputValue(&value,gauss);
++		((ControlInput*)input)->GetGradientValue(&gradient,gauss);
++
++		values[iv]    = reCast<IssmPDouble>(value)/reCast<IssmPDouble>(connectivity[iv]);
++		gradients[iv] = reCast<IssmPDouble>(gradient)/reCast<IssmPDouble>(connectivity[iv]);
++	}
++	delete gauss;
++
++	vector_control->SetValues(NUMVERTICES,&sidlist[0],&values[0],ADD_VAL);
++	vector_gradient->SetValues(NUMVERTICES,&sidlist[0],&gradients[0],ADD_VAL);
++
++}/*}}}*/
+ void       Tria::Delta18oParameterization(void){/*{{{*/
+ 
+ 	int        i;
+@@ -577,6 +571,107 @@
+ 	delete gauss;
+ }
+ /*}}}*/
++int        Tria::EdgeOnBaseIndex(void){/*{{{*/
++
++	IssmDouble values[NUMVERTICES];
++	int        indices[3][2] = {{1,2},{2,0},{0,1}};
++
++	/*Retrieve all inputs and parameters*/
++	GetInputListOnVertices(&values[0],MeshVertexonbaseEnum);
++
++	for(int i=0;i<3;i++){
++		if(values[indices[i][0]] == 1. && values[indices[i][1]] == 1.){
++			return i;
++		}
++	}
++
++	_printf_("list of vertices on bed: "<<values[0]<<" "<<values[1]<<" "<<values[2]);
++	_error_("Could not find 2 vertices on bed");
++}
++/*}}}*/
++void       Tria::EdgeOnBaseIndices(int* pindex1,int* pindex2){/*{{{*/
++
++	IssmDouble values[NUMVERTICES];
++	int        indices[3][2] = {{1,2},{2,0},{0,1}};
++
++	/*Retrieve all inputs and parameters*/
++	GetInputListOnVertices(&values[0],MeshVertexonbaseEnum);
++
++	for(int i=0;i<3;i++){
++		if(values[indices[i][0]] == 1. && values[indices[i][1]] == 1.){
++			*pindex1 = indices[i][0];
++			*pindex2 = indices[i][1];
++			return;
++		}
++	}
++
++	_printf_("list of vertices on bed: "<<values[0]<<" "<<values[1]<<" "<<values[2]);
++	_error_("Could not find 2 vertices on bed");
++}
++/*}}}*/
++int        Tria::EdgeOnSurfaceIndex(void){/*{{{*/
++
++	IssmDouble values[NUMVERTICES];
++	int        indices[3][2] = {{1,2},{2,0},{0,1}};
++
++	/*Retrieve all inputs and parameters*/
++	GetInputListOnVertices(&values[0],MeshVertexonsurfaceEnum);
++
++	for(int i=0;i<3;i++){
++		if(values[indices[i][0]] == 1. && values[indices[i][1]] == 1.){
++			return i;
++		}
++	}
++
++	_printf_("list of vertices on surface: "<<values[0]<<" "<<values[1]<<" "<<values[2]);
++	_error_("Could not find 2 vertices on surface");
++}
++/*}}}*/
++void       Tria::EdgeOnSurfaceIndices(int* pindex1,int* pindex2){/*{{{*/
++
++	IssmDouble values[NUMVERTICES];
++	int        indices[3][2] = {{1,2},{2,0},{0,1}};
++
++	/*Retrieve all inputs and parameters*/
++	GetInputListOnVertices(&values[0],MeshVertexonsurfaceEnum);
++
++	for(int i=0;i<3;i++){
++		if(values[indices[i][0]] == 1. && values[indices[i][1]] == 1.){
++			*pindex1 = indices[i][0];
++			*pindex2 = indices[i][1];
++			return;
++		}
++	}
++
++	_printf_("list of vertices on surface: "<<values[0]<<" "<<values[1]<<" "<<values[2]);
++	_error_("Could not find 2 vertices on surface");
++}
++/*}}}*/
++void       Tria::ElementResponse(IssmDouble* presponse,int response_enum){/*{{{*/
++
++	switch(response_enum){
++		case MaterialsRheologyBbarEnum:
++			*presponse=this->material->GetBbar();
++			break;
++
++		case VelEnum:{
++
++			/*Get input:*/
++			IssmDouble vel;
++			Input* vel_input;
++
++			vel_input=this->inputs->GetInput(VelEnum); _assert_(vel_input);
++			vel_input->GetInputAverage(&vel);
++
++			/*Assign output pointers:*/
++			*presponse=vel;}
++			break;
++		default:  
++			_error_("Response type " << EnumToStringx(response_enum) << " not supported yet!");
++	}
++
++}
++/*}}}*/
+ void       Tria::ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz){/*{{{*/
+ 
+ 	IssmDouble xyz_list[NUMVERTICES][3];
+@@ -604,10 +699,90 @@
+ 	return this->element_type;
+ }
+ /*}}}*/
+-int        Tria::ObjectEnum(void){/*{{{*/
++void       Tria::FSContactMigration(Vector<IssmDouble>* vertexgrounded,Vector<IssmDouble>* vertexfloating){/*{{{*/
+ 
+-	return TriaEnum;
++	if(!IsOnBase()) return;
+ 
++	int approximation;
++	inputs->GetInputValue(&approximation,ApproximationEnum);
++
++	if(approximation==HOApproximationEnum || approximation==SSAApproximationEnum || approximation==SSAHOApproximationEnum){
++		for(int i=0;i<NUMVERTICES;i++){
++			vertexgrounded->SetValue(vertices[i]->Pid(),+9999.,INS_VAL);
++			vertexfloating->SetValue(vertices[i]->Pid(),+9999.,INS_VAL);
++		}
++	}
++	else{
++		/*Intermediaries*/
++		IssmDouble* xyz_list = NULL;
++		IssmDouble* xyz_list_base = NULL;
++		IssmDouble  pressure,water_pressure,sigma_nn,viscosity,bed,base;
++		IssmDouble  bed_normal[2];
++		IssmDouble  epsilon[3]; /* epsilon=[exx,eyy,exy];*/
++		IssmDouble  surface=0,value=0;
++		bool grounded;
++
++		/* Get node coordinates and dof list: */
++		GetVerticesCoordinates(&xyz_list);
++		GetVerticesCoordinatesBase(&xyz_list_base);
++
++		/*Retrieve all inputs we will be needing: */
++		Input* pressure_input = inputs->GetInput(PressureEnum); _assert_(pressure_input);
++		Input* base_input     = inputs->GetInput(BaseEnum);     _assert_(base_input);
++		Input* bed_input      = inputs->GetInput(BedEnum);      _assert_(bed_input);
++		Input* vx_input       = inputs->GetInput(VxEnum);       _assert_(vx_input);
++		Input* vy_input       = inputs->GetInput(VyEnum);       _assert_(vy_input);
++
++		/*Create gauss point in the middle of the basal edge*/
++		Gauss* gauss=NewGaussBase(1);
++		gauss->GaussPoint(0);
++
++		if(!IsFloating()){ 
++			/*Check for basal force only if grounded and touching GL*/
++			//		if(this->inputs->Min(MaskGroundediceLevelsetEnum)==0.){
++			this->StrainRateSSA(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
++			this->ViscosityFS(&viscosity,2,xyz_list,gauss,vx_input,vy_input,NULL);
++			pressure_input->GetInputValue(&pressure, gauss);
++			base_input->GetInputValue(&base, gauss); 
++
++			/*Compute Stress*/
++			IssmDouble sigma_xx=2.*viscosity*epsilon[0]-pressure;
++			IssmDouble sigma_yy=2.*viscosity*epsilon[1]-pressure;
++			IssmDouble sigma_xy=2.*viscosity*epsilon[2];
++
++			/*Get normal vector to the bed */
++			NormalBase(&bed_normal[0],xyz_list_base);
++
++			/*basalforce*/
++			sigma_nn = sigma_xx*bed_normal[0]*bed_normal[0] + sigma_yy*bed_normal[1]*bed_normal[1] + 2.*sigma_xy*bed_normal[0]*bed_normal[1];
++
++			/*Compute water pressure*/
++			IssmDouble rho_ice   = matpar->GetRhoIce();
++			IssmDouble rho_water = matpar->GetRhoWater();
++			IssmDouble gravity   = matpar->GetG();
++			water_pressure=gravity*rho_water*base;
++
++			/*Compare basal stress to water pressure and determine whether it should ground*/
++			if (sigma_nn<water_pressure) grounded=true;
++			else                         grounded=false;
++		}
++		else{
++			/*Check for basal elevation if floating*/
++			base_input->GetInputValue(&base, gauss);
++			bed_input->GetInputValue(&bed, gauss);
++			if(base<bed) grounded=true;
++			else         grounded=false;
++		}
++		for(int i=0;i<NUMVERTICES;i++){
++			if(grounded) vertexgrounded->SetValue(vertices[i]->Pid(),+1.,INS_VAL);
++			else         vertexfloating->SetValue(vertices[i]->Pid(),+1.,INS_VAL);
++		}
++
++		/*clean up*/
++		delete gauss;
++		xDelete<IssmDouble>(xyz_list);
++		xDelete<IssmDouble>(xyz_list_base);
++	}
+ }
+ /*}}}*/
+ IssmDouble Tria::GetArea(void){/*{{{*/
+@@ -667,56 +842,6 @@
+ 
+ }
+ /*}}}*/
+-void        Tria::GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* gl){/*{{{*/
+-	
+-	/*Computeportion of the element that has a positive levelset*/ 
+-
+-	bool               negative=true;
+-	int                point;
+-	const IssmPDouble  epsilon= 1.e-15;
+-	IssmDouble         f1,f2;
+-
+-	/*Be sure that values are not zero*/
+-	if(gl[0]==0.) gl[0]=gl[0]+epsilon;
+-	if(gl[1]==0.) gl[1]=gl[1]+epsilon;
+-	if(gl[2]==0.) gl[2]=gl[2]+epsilon;
+-
+-	/*Check that not all nodes are positive or negative*/
+-	if(gl[0]>0 && gl[1]>0 && gl[2]>0){ // All positive
+-		point=0;
+-		f1=1.;
+-		f2=1.;
+-	}
+-	else if(gl[0]<0 && gl[1]<0 && gl[2]<0){ //All negative
+-		point=0;
+-		f1=0.;
+-		f2=0.;
+-	}
+-	else{
+-		if(gl[0]*gl[1]*gl[2]<0) negative=false;
+-
+-		if(gl[0]*gl[1]>0){ //Nodes 0 and 1 are similar, so points must be found on segment 0-2 and 1-2
+-			point=2;
+-			f1=gl[2]/(gl[2]-gl[0]);
+-			f2=gl[2]/(gl[2]-gl[1]);
+-		}
+-		else if(gl[1]*gl[2]>0){ //Nodes 1 and 2 are similar, so points must be found on segment 0-1 and 0-2
+-			point=0;
+-			f1=gl[0]/(gl[0]-gl[1]);
+-			f2=gl[0]/(gl[0]-gl[2]);
+-		}
+-		else if(gl[0]*gl[2]>0){ //Nodes 0 and 2 are similar, so points must be found on segment 1-0 and 1-2
+-			point=1;
+-			f1=gl[1]/(gl[1]-gl[2]);
+-			f2=gl[1]/(gl[1]-gl[0]);
+-		}
+-	}
+-	*point1=point;
+-	*fraction1=f1;
+-	*fraction2=f2;
+-	*mainlynegative=negative;
+-}
+-/*}}}*/
+ void       Tria::GetGroundedPart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlyfloating){/*{{{*/
+ 	/*Computeportion of the element that is grounded*/ 
+ 
+@@ -888,149 +1013,6 @@
+ 	return phi;
+ }
+ /*}}}*/
+-void       Tria::GetVerticesCoordinatesBase(IssmDouble** pxyz_list){/*{{{*/
+-
+-	int        indices[2];
+-	IssmDouble xyz_list[NUMVERTICES][3];
+-
+-	/*Element XYZ list*/
+-	::GetVerticesCoordinates(&xyz_list[0][0],this->vertices,NUMVERTICES);
+-
+-	/*Allocate Output*/
+-	IssmDouble* xyz_list_edge = xNew<IssmDouble>(2*3);
+-	this->EdgeOnBaseIndices(&indices[0],&indices[1]);
+-	for(int i=0;i<2;i++) for(int j=0;j<2;j++) xyz_list_edge[i*3+j]=xyz_list[indices[i]][j];
+-
+-	/*Assign output pointer*/
+-	*pxyz_list = xyz_list_edge;
+-
+-}/*}}}*/
+-void       Tria::GetVerticesCoordinatesTop(IssmDouble** pxyz_list){/*{{{*/
+-
+-	int        indices[2];
+-	IssmDouble xyz_list[NUMVERTICES][3];
+-
+-	/*Element XYZ list*/
+-	::GetVerticesCoordinates(&xyz_list[0][0],this->vertices,NUMVERTICES);
+-
+-	/*Allocate Output*/
+-	IssmDouble* xyz_list_edge = xNew<IssmDouble>(2*3);
+-	this->EdgeOnSurfaceIndices(&indices[0],&indices[1]);
+-	for(int i=0;i<2;i++) for(int j=0;j<2;j++) xyz_list_edge[i*3+j]=xyz_list[indices[i]][j];
+-
+-	/*Assign output pointer*/
+-	*pxyz_list = xyz_list_edge;
+-
+-}/*}}}*/
+-void       Tria::NormalSection(IssmDouble* normal,IssmDouble* xyz_list){/*{{{*/
+-
+-	/*Build unit outward pointing vector*/
+-	IssmDouble vector[2];
+-	IssmDouble norm;
+-
+-	vector[0]=xyz_list[1*3+0] - xyz_list[0*3+0];
+-	vector[1]=xyz_list[1*3+1] - xyz_list[0*3+1];
+-
+-	norm=sqrt(vector[0]*vector[0] + vector[1]*vector[1]);
+-
+-	normal[0]= + vector[1]/norm;
+-	normal[1]= - vector[0]/norm;
+-}
+-/*}}}*/
+-void       Tria::ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum){/*{{{*/
+-
+-	int         normal_orientation=0;
+-	IssmDouble  s1,s2;
+-	IssmDouble  levelset[NUMVERTICES];
+-
+-	/*Recover parameters and values*/
+-	IssmDouble* xyz_zero = xNew<IssmDouble>(2*3);
+-	GetInputListOnVertices(&levelset[0],levelsetenum);
+-
+-	if(levelset[0]*levelset[1]>0.){ //Nodes 0 and 1 are similar, so points must be found on segment 0-2 and 1-2
+-		/*Portion of the segments*/
+-		s1=levelset[2]/(levelset[2]-levelset[1]);
+-		s2=levelset[2]/(levelset[2]-levelset[0]);
+-
+-		if(levelset[2]<0.) normal_orientation=1; //orientation of quadrangle depending on distribution of levelsetfunction
+-		/*New point 1*/
+-		xyz_zero[3*normal_orientation+0]=xyz_list[2*3+0]+s1*(xyz_list[1*3+0]-xyz_list[2*3+0]);
+-		xyz_zero[3*normal_orientation+1]=xyz_list[2*3+1]+s1*(xyz_list[1*3+1]-xyz_list[2*3+1]);
+-		xyz_zero[3*normal_orientation+2]=xyz_list[2*3+2]+s1*(xyz_list[1*3+2]-xyz_list[2*3+2]);
+-
+-		/*New point 0*/
+-		xyz_zero[3*(1-normal_orientation)+0]=xyz_list[2*3+0]+s2*(xyz_list[0*3+0]-xyz_list[2*3+0]);
+-		xyz_zero[3*(1-normal_orientation)+1]=xyz_list[2*3+1]+s2*(xyz_list[0*3+1]-xyz_list[2*3+1]);
+-		xyz_zero[3*(1-normal_orientation)+2]=xyz_list[2*3+2]+s2*(xyz_list[0*3+2]-xyz_list[2*3+2]);
+-	}
+-	else if(levelset[1]*levelset[2]>0.){ //Nodes 1 and 2 are similar, so points must be found on segment 0-1 and 0-2
+-		/*Portion of the segments*/
+-		s1=levelset[0]/(levelset[0]-levelset[2]);
+-		s2=levelset[0]/(levelset[0]-levelset[1]);
+-
+-		if(levelset[0]<0.) normal_orientation=1;
+-		/*New point 1*/
+-		xyz_zero[3*normal_orientation+0]=xyz_list[0*3+0]+s1*(xyz_list[2*3+0]-xyz_list[0*3+0]);
+-		xyz_zero[3*normal_orientation+1]=xyz_list[0*3+1]+s1*(xyz_list[2*3+1]-xyz_list[0*3+1]);
+-		xyz_zero[3*normal_orientation+2]=xyz_list[0*3+2]+s1*(xyz_list[2*3+2]-xyz_list[0*3+2]);
+-
+-		/*New point 2*/
+-		xyz_zero[3*(1-normal_orientation)+0]=xyz_list[0*3+0]+s2*(xyz_list[1*3+0]-xyz_list[0*3+0]);
+-		xyz_zero[3*(1-normal_orientation)+1]=xyz_list[0*3+1]+s2*(xyz_list[1*3+1]-xyz_list[0*3+1]);
+-		xyz_zero[3*(1-normal_orientation)+2]=xyz_list[0*3+2]+s2*(xyz_list[1*3+2]-xyz_list[0*3+2]);
+-	}
+-	else if(levelset[0]*levelset[2]>0.){ //Nodes 0 and 2 are similar, so points must be found on segment 1-0 and 1-2
+-		/*Portion of the segments*/
+-		s1=levelset[1]/(levelset[1]-levelset[0]);
+-		s2=levelset[1]/(levelset[1]-levelset[2]);
+-
+-		if(levelset[1]<0.) normal_orientation=1;
+-		/*New point 0*/
+-		xyz_zero[3*normal_orientation+0]=xyz_list[1*3+0]+s1*(xyz_list[0*3+0]-xyz_list[1*3+0]);
+-		xyz_zero[3*normal_orientation+1]=xyz_list[1*3+1]+s1*(xyz_list[0*3+1]-xyz_list[1*3+1]);
+-		xyz_zero[3*normal_orientation+2]=xyz_list[1*3+2]+s1*(xyz_list[0*3+2]-xyz_list[1*3+2]);
+-
+-		/*New point 2*/
+-		xyz_zero[3*(1-normal_orientation)+0]=xyz_list[1*3+0]+s2*(xyz_list[2*3+0]-xyz_list[1*3+0]);
+-		xyz_zero[3*(1-normal_orientation)+1]=xyz_list[1*3+1]+s2*(xyz_list[2*3+1]-xyz_list[1*3+1]);
+-		xyz_zero[3*(1-normal_orientation)+2]=xyz_list[1*3+2]+s2*(xyz_list[2*3+2]-xyz_list[1*3+2]);
+-	}
+-	else if(levelset[0]==0. && levelset[1]==0.){ //front is on point 0 and 1
+-		xyz_zero[3*0+0]=xyz_list[0*3+0];
+-		xyz_zero[3*0+1]=xyz_list[0*3+1];
+-		xyz_zero[3*0+2]=xyz_list[0*3+2];
+-
+-		/*New point 2*/
+-		xyz_zero[3*1+0]=xyz_list[1*3+0];
+-		xyz_zero[3*1+1]=xyz_list[1*3+1];
+-		xyz_zero[3*1+2]=xyz_list[1*3+2];
+-	}
+-	else if(levelset[0]==0. && levelset[2]==0.){ //front is on point 0 and 1
+-		xyz_zero[3*0+0]=xyz_list[2*3+0];
+-		xyz_zero[3*0+1]=xyz_list[2*3+1];
+-		xyz_zero[3*0+2]=xyz_list[2*3+2];
+-
+-		/*New point 2*/
+-		xyz_zero[3*1+0]=xyz_list[0*3+0];
+-		xyz_zero[3*1+1]=xyz_list[0*3+1];
+-		xyz_zero[3*1+2]=xyz_list[0*3+2];
+-	}
+-	else if(levelset[1]==0. && levelset[2]==0.){ //front is on point 0 and 1
+-		xyz_zero[3*0+0]=xyz_list[1*3+0];
+-		xyz_zero[3*0+1]=xyz_list[1*3+1];
+-		xyz_zero[3*0+2]=xyz_list[1*3+2];
+-
+-		/*New point 2*/
+-		xyz_zero[3*1+0]=xyz_list[2*3+0];
+-		xyz_zero[3*1+1]=xyz_list[2*3+1];
+-		xyz_zero[3*1+2]=xyz_list[2*3+2];
+-	}
+-	else _error_("Case not covered");
+-
+-	/*Assign output pointer*/
+-	*pxyz_zero= xyz_zero;
+-}
+-/*}}}*/
+ void       Tria::GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){/*{{{*/
+ 	
+ 	/* Intermediaries */
+@@ -1071,6 +1053,18 @@
+ 
+ 	xDelete<int>(indicesfront);
+ }/*}}}*/
++void       Tria::GetInputValue(IssmDouble* pvalue,Node* node,int enumtype){/*{{{*/
++
++	Input* input=inputs->GetInput(enumtype);
++	if(!input) _error_("No input of type " << EnumToStringx(enumtype) << " found in tria");
++
++	GaussTria* gauss=new GaussTria();
++	gauss->GaussVertex(this->GetNodeIndex(node));
++
++	input->GetInputValue(pvalue,gauss);
++	delete gauss;
++}
++/*}}}*/
+ void       Tria::GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level){/*{{{*/
+ 
+ 	/* Intermediaries */
+@@ -1111,6 +1105,62 @@
+ 
+ 	xDelete<int>(indicesfront);
+ }/*}}}*/
++void       Tria::GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* gl){/*{{{*/
++	
++	/*Computeportion of the element that has a positive levelset*/ 
++
++	bool               negative=true;
++	int                point;
++	const IssmPDouble  epsilon= 1.e-15;
++	IssmDouble         f1,f2;
++
++	/*Be sure that values are not zero*/
++	if(gl[0]==0.) gl[0]=gl[0]+epsilon;
++	if(gl[1]==0.) gl[1]=gl[1]+epsilon;
++	if(gl[2]==0.) gl[2]=gl[2]+epsilon;
++
++	/*Check that not all nodes are positive or negative*/
++	if(gl[0]>0 && gl[1]>0 && gl[2]>0){ // All positive
++		point=0;
++		f1=1.;
++		f2=1.;
++	}
++	else if(gl[0]<0 && gl[1]<0 && gl[2]<0){ //All negative
++		point=0;
++		f1=0.;
++		f2=0.;
++	}
++	else{
++		if(gl[0]*gl[1]*gl[2]<0) negative=false;
++
++		if(gl[0]*gl[1]>0){ //Nodes 0 and 1 are similar, so points must be found on segment 0-2 and 1-2
++			point=2;
++			f1=gl[2]/(gl[2]-gl[0]);
++			f2=gl[2]/(gl[2]-gl[1]);
++		}
++		else if(gl[1]*gl[2]>0){ //Nodes 1 and 2 are similar, so points must be found on segment 0-1 and 0-2
++			point=0;
++			f1=gl[0]/(gl[0]-gl[1]);
++			f2=gl[0]/(gl[0]-gl[2]);
++		}
++		else if(gl[0]*gl[2]>0){ //Nodes 0 and 2 are similar, so points must be found on segment 1-0 and 1-2
++			point=1;
++			f1=gl[1]/(gl[1]-gl[2]);
++			f2=gl[1]/(gl[1]-gl[0]);
++		}
++	}
++	*point1=point;
++	*fraction1=f1;
++	*fraction2=f2;
++	*mainlynegative=negative;
++}
++/*}}}*/
++Node*      Tria::GetNode(int node_number){/*{{{*/
++	_assert_(node_number>=0); 
++	_assert_(node_number<this->NumberofNodes(this->element_type)); 
++	return this->nodes[node_number];
++
++}/*}}}*/
+ int        Tria::GetNodeIndex(Node* node){/*{{{*/
+ 
+ 	_assert_(nodes);
+@@ -1134,24 +1184,221 @@
+ 	return NUMVERTICES;
+ }
+ /*}}}*/
+-void       Tria::GetInputValue(IssmDouble* pvalue,Node* node,int enumtype){/*{{{*/
++void       Tria::GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution, int enum_type){/*{{{*/
+ 
+-	Input* input=inputs->GetInput(enumtype);
+-	if(!input) _error_("No input of type " << EnumToStringx(enumtype) << " found in tria");
++	int        *doflist = NULL;
++	IssmDouble  value;
+ 
++	/*Fetch number of nodes for this finite element*/
++	int numnodes = this->NumberofNodes(this->element_type);
++
++	/*Fetch dof list and allocate solution vector*/
++	GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
++	IssmDouble* values = xNew<IssmDouble>(numnodes);
++
++	/*Get inputs*/
++	Input* enum_input=inputs->GetInput(enum_type); _assert_(enum_input);
++
++	/*Ok, we have the values, fill in the array: */
+ 	GaussTria* gauss=new GaussTria();
+-	gauss->GaussVertex(this->GetNodeIndex(node));
++	for(int i=0;i<numnodes;i++){
++		gauss->GaussNode(this->element_type,i);
+ 
+-	input->GetInputValue(pvalue,gauss);
++		enum_input->GetInputValue(&value,gauss);
++		values[i]=value;
++	}
++
++	solution->SetValues(numnodes,doflist,values,INS_VAL);
++
++	/*Free ressources:*/
++	xDelete<int>(doflist);
++	xDelete<IssmDouble>(values);
+ 	delete gauss;
+ }
+ /*}}}*/
+-Node*      Tria::GetNode(int node_number){/*{{{*/
+-	_assert_(node_number>=0); 
+-	_assert_(node_number<this->NumberofNodes(this->element_type)); 
+-	return this->nodes[node_number];
++void       Tria::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data,bool onsid){/*{{{*/
+ 
++	int vertexidlist[NUMVERTICES];
++	Input *input=NULL;
++
++	/*Get out if this is not an element input*/
++	if(!IsInput(control_enum)) return;
++
++	/*Prepare index list*/
++	GradientIndexing(&vertexidlist[0],control_index,onsid);
++
++	/*Get input (either in element or material)*/
++	input=(Input*)this->inputs->GetInput(control_enum);   _assert_(input);
++
++	/*Check that it is a ControlInput*/
++	if (input->ObjectEnum()!=ControlInputEnum){
++		_error_("input " << EnumToStringx(control_enum) << " is not a ControlInput");
++	}
++
++	((ControlInput*)input)->GetVectorFromInputs(vector,&vertexidlist[0],data);
++}
++/*}}}*/
++void       Tria::GetVerticesCoordinatesBase(IssmDouble** pxyz_list){/*{{{*/
++
++	int        indices[2];
++	IssmDouble xyz_list[NUMVERTICES][3];
++
++	/*Element XYZ list*/
++	::GetVerticesCoordinates(&xyz_list[0][0],this->vertices,NUMVERTICES);
++
++	/*Allocate Output*/
++	IssmDouble* xyz_list_edge = xNew<IssmDouble>(2*3);
++	this->EdgeOnBaseIndices(&indices[0],&indices[1]);
++	for(int i=0;i<2;i++) for(int j=0;j<2;j++) xyz_list_edge[i*3+j]=xyz_list[indices[i]][j];
++
++	/*Assign output pointer*/
++	*pxyz_list = xyz_list_edge;
++
+ }/*}}}*/
++void       Tria::GetVerticesCoordinatesTop(IssmDouble** pxyz_list){/*{{{*/
++
++	int        indices[2];
++	IssmDouble xyz_list[NUMVERTICES][3];
++
++	/*Element XYZ list*/
++	::GetVerticesCoordinates(&xyz_list[0][0],this->vertices,NUMVERTICES);
++
++	/*Allocate Output*/
++	IssmDouble* xyz_list_edge = xNew<IssmDouble>(2*3);
++	this->EdgeOnSurfaceIndices(&indices[0],&indices[1]);
++	for(int i=0;i<2;i++) for(int j=0;j<2;j++) xyz_list_edge[i*3+j]=xyz_list[indices[i]][j];
++
++	/*Assign output pointer*/
++	*pxyz_list = xyz_list_edge;
++
++}/*}}}*/
++bool       Tria::HasEdgeOnBase(){/*{{{*/
++
++	IssmDouble values[NUMVERTICES];
++	IssmDouble sum;
++
++	/*Retrieve all inputs and parameters*/
++	GetInputListOnVertices(&values[0],MeshVertexonbaseEnum);
++	sum = values[0]+values[1]+values[2];
++
++	_assert_(sum==0. || sum==1. || sum==2.);
++
++	if(sum==3.)  _error_("Two edges on bed not supported yet...");
++
++	if(sum>1.){
++		return true;
++	}
++	else{
++		return false;
++	}
++}
++/*}}}*/
++bool       Tria::HasEdgeOnSurface(){/*{{{*/
++
++	IssmDouble values[NUMVERTICES];
++	IssmDouble sum;
++
++	/*Retrieve all inputs and parameters*/
++	GetInputListOnVertices(&values[0],MeshVertexonsurfaceEnum);
++	sum = values[0]+values[1]+values[2];
++
++	_assert_(sum==0. || sum==1. || sum==2.);
++
++	if(sum==3.)  _error_("Two edges on surface not supported yet...");
++
++	if(sum>1.){
++		return true;
++	}
++	else{
++		return false;
++	}
++}
++/*}}}*/
++IssmDouble Tria::IceVolume(void){/*{{{*/
++
++	/*The volume of a troncated prism is base * 1/3 sum(length of edges)*/
++	IssmDouble base,surface,bed;
++	IssmDouble xyz_list[NUMVERTICES][3];
++
++	if(!IsIceInElement())return 0;
++
++	/*First get back the area of the base*/
++	base=this->GetArea();
++
++	/*Now get the average height*/
++	Input* surface_input = inputs->GetInput(SurfaceEnum); _assert_(surface_input);
++	Input* base_input     = inputs->GetInput(BaseEnum);     _assert_(base_input);
++	surface_input->GetInputAverage(&surface);
++	base_input->GetInputAverage(&bed);
++
++	/*Return: */
++	int domaintype;
++	parameters->FindParam(&domaintype,DomainTypeEnum);
++	if(domaintype==Domain2DverticalEnum){
++	  return base;
++	}
++	else{
++	  return base*(surface-bed);
++	}
++}
++/*}}}*/
++IssmDouble Tria::IceVolumeAboveFloatation(void){/*{{{*/
++
++	/*The volume above floatation: H + rho_water/rho_ice * bathymetry */
++	IssmDouble rho_ice,rho_water;
++	IssmDouble base,surface,bed,bathymetry;
++	IssmDouble xyz_list[NUMVERTICES][3];
++
++	if(!IsIceInElement() || IsFloating())return 0;
++
++	rho_ice=matpar->GetRhoIce();
++	rho_water=matpar->GetRhoWater();
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++
++	/*First calculate the area of the base (cross section triangle)
++	 * http://en.wikipedia.org/wiki/Triangle
++	 * base = 1/2 abs((xA-xC)(yB-yA)-(xA-xB)(yC-yA))*/
++	base = 1./2. * fabs((xyz_list[0][0]-xyz_list[2][0])*(xyz_list[1][1]-xyz_list[0][1]) - (xyz_list[0][0]-xyz_list[1][0])*(xyz_list[2][1]-xyz_list[0][1]));
++
++	/*Now get the average height and bathymetry*/
++	Input* surface_input    = inputs->GetInput(SurfaceEnum);    _assert_(surface_input);
++	Input* base_input        = inputs->GetInput(BaseEnum);        _assert_(base_input);
++	Input* bed_input = inputs->GetInput(BedEnum); _assert_(bed_input);
++	surface_input->GetInputAverage(&surface);
++	base_input->GetInputAverage(&bed);
++	bed_input->GetInputAverage(&bathymetry);
++	
++	/*Return: */
++	return base*(surface-bed+min(rho_water/rho_ice*bathymetry,0.));
++}
++/*}}}*/
++void       Tria::InputControlUpdate(IssmDouble scalar,bool save_parameter){/*{{{*/
++
++	/*Intermediary*/
++	int    num_controls;
++	int*   control_type=NULL;
++	Input* input=NULL;
++
++	/*retrieve some parameters: */
++	this->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
++	this->parameters->FindParam(&control_type,NULL,InversionControlParametersEnum);
++
++	for(int i=0;i<num_controls;i++){
++		input=(Input*)this->inputs->GetInput(control_type[i]);   _assert_(input);
++		if (input->ObjectEnum()!=ControlInputEnum){
++			_error_("input " << EnumToStringx(control_type[i]) << " is not a ControlInput");
++		}
++
++		((ControlInput*)input)->UpdateValue(scalar);
++		((ControlInput*)input)->Constrain();
++		if (save_parameter) ((ControlInput*)input)->SaveValue();
++
++	}
++
++	/*Clean up and return*/
++	xDelete<int>(control_type);
++}
++/*}}}*/
+ void       Tria::InputDepthAverageAtBase(int enum_type,int average_enum_type){/*{{{*/
+ 
+ 	/*New input*/
+@@ -1370,6 +1617,59 @@
+ 
+ }
+ /*}}}*/
++bool       Tria::IsFaceOnBoundary(void){/*{{{*/
++
++	IssmDouble values[NUMVERTICES];
++	IssmDouble sum;
++
++	/*Retrieve all inputs and parameters*/
++	GetInputListOnVertices(&values[0],MeshVertexonboundaryEnum);
++	sum = values[0]+values[1]+values[2];
++
++	_assert_(sum==0. || sum==1. || sum==2.);
++
++	if(sum==3.)  _error_("Two edges on boundary not supported yet...");
++
++	if(sum>1.){
++		return true;
++	}
++	else{
++		return false;
++	}
++}/*}}}*/
++bool       Tria::IsIcefront(void){/*{{{*/
++
++	bool isicefront;
++	int i,nrice;
++   IssmDouble ls[NUMVERTICES];
++
++	/*Retrieve all inputs and parameters*/
++	GetInputListOnVertices(&ls[0],MaskIceLevelsetEnum);
++
++	/* If only one vertex has ice, there is an ice front here */
++	isicefront=false;
++	if(IsIceInElement()){
++		nrice=0;       
++		for(i=0;i<NUMVERTICES;i++)
++			if(ls[i]<0.) nrice++;
++		if(nrice==1) isicefront= true;
++	}
++	return isicefront;
++}/*}}}*/
++bool       Tria::IsNodeOnShelfFromFlags(IssmDouble* flags){/*{{{*/
++
++	int  i;
++	bool shelf=false;
++
++	for(i=0;i<NUMVERTICES;i++){
++		if (flags[vertices[i]->Pid()]<0.){
++			shelf=true;
++			break;
++		}
++	}
++	return shelf;
++}
++/*}}}*/
+ bool       Tria::IsOnBase(){/*{{{*/
+ 
+ 	int domaintype;
+@@ -1396,6 +1696,25 @@
+ 	}
+ }
+ /*}}}*/
++bool       Tria::IsZeroLevelset(int levelset_enum){/*{{{*/
++
++	bool iszerols;
++	IssmDouble ls[NUMVERTICES];
++
++	/*Retrieve all inputs and parameters*/
++	GetInputListOnVertices(&ls[0],levelset_enum);
++
++	/*If the level set is awlays <0, there is no ice front here*/
++	iszerols= false;
++	if(IsIceInElement()){
++		if(ls[0]*ls[1]<0. || ls[0]*ls[2]<0. || (ls[0]*ls[1]*ls[2]==0. && ls[0]*ls[1]+ls[0]*ls[2]+ls[1]*ls[2]<=0.)){
++			iszerols = true;
++		}
++	}
++
++	return iszerols;
++}
++/*}}}*/
+ void       Tria::JacobianDeterminant(IssmDouble* pJdet,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussTriaEnum);
+@@ -1424,222 +1743,267 @@
+ 
+ }
+ /*}}}*/
+-bool       Tria::HasEdgeOnBase(){/*{{{*/
++IssmDouble Tria::Masscon(IssmDouble* levelset){ /*{{{*/
+ 
+-	IssmDouble values[NUMVERTICES];
+-	IssmDouble sum;
+ 
+-	/*Retrieve all inputs and parameters*/
+-	GetInputListOnVertices(&values[0],MeshVertexonbaseEnum);
+-	sum = values[0]+values[1]+values[2];
++	/*intermediary: */
++	IssmDouble* values=NULL;
++	Input*      thickness_input=NULL;
++	IssmDouble  thickness;
++	IssmDouble  weight;
++	IssmDouble  Jdet;
++	IssmDouble  volume;
++	IssmDouble  rho_ice;
++	IssmDouble* xyz_list=NULL;
++	int         point1;
++	IssmDouble  fraction1,fraction2;
++	bool        mainlynegative=true;
++	
++	/*Output:*/
++	volume=0;
+ 
+-	_assert_(sum==0. || sum==1. || sum==2.);
++	/* Get node coordinates and dof list: */
++	GetVerticesCoordinates(&xyz_list);
+ 
+-	if(sum==3.)  _error_("Two edges on bed not supported yet...");
++	/*Retrieve inputs required:*/
++	thickness_input=this->GetInput(ThicknessEnum); _assert_(thickness_input);
++	
++	/*Retrieve material parameters: */
++	rho_ice=matpar->GetRhoIce();
+ 
+-	if(sum>1.){
+-		return true;
++	/*Retrieve values of the levelset defining the masscon: */
++	values = xNew<IssmDouble>(NUMVERTICES);
++	for(int i=0;i<NUMVERTICES;i++){
++		values[i]=levelset[this->vertices[i]->Sid()];
+ 	}
+-	else{
+-		return false;
++		
++	/*Ok, use the level set values to figure out where we put our gaussian points:*/
++	this->GetLevelsetPositivePart(&point1,&fraction1,&fraction2,&mainlynegative,values);
++	Gauss* gauss = this->NewGauss(point1,fraction1,fraction2,mainlynegative,4);
++
++	volume=0;
++
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		this->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		thickness_input->GetInputValue(&thickness, gauss);
++
++		volume+=thickness*gauss->weight*Jdet;
+ 	}
++
++	/* clean up and Return: */
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(values);
++	delete gauss;
++	return rho_ice*volume;
+ }
+ /*}}}*/
+-bool       Tria::HasEdgeOnSurface(){/*{{{*/
++IssmDouble Tria::MassFlux(IssmDouble x1, IssmDouble y1, IssmDouble x2, IssmDouble y2,int segment_id){/*{{{*/
+ 
+-	IssmDouble values[NUMVERTICES];
+-	IssmDouble sum;
++	int        domaintype;
++	IssmDouble mass_flux=0.;
++	IssmDouble xyz_list[NUMVERTICES][3];
++	IssmDouble normal[2];
++	IssmDouble length,rho_ice;
++	IssmDouble h1,h2;
++	IssmDouble vx1,vx2,vy1,vy2;
++	GaussTria* gauss_1=NULL;
++	GaussTria* gauss_2=NULL;
+ 
+-	/*Retrieve all inputs and parameters*/
+-	GetInputListOnVertices(&values[0],MeshVertexonsurfaceEnum);
+-	sum = values[0]+values[1]+values[2];
++	/*Get material parameters :*/
++	rho_ice=matpar->GetRhoIce();
+ 
+-	_assert_(sum==0. || sum==1. || sum==2.);
++	/*First off, check that this segment belongs to this element: */
++	if (segment_id!=this->id)_error_("error message: segment with id " << segment_id << " does not belong to element with id:" << this->id);
+ 
+-	if(sum==3.)  _error_("Two edges on surface not supported yet...");
++	/*Get xyz list: */
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+ 
+-	if(sum>1.){
+-		return true;
++	/*get area coordinates of 0 and 1 locations: */
++	gauss_1=new GaussTria();
++	gauss_1->GaussFromCoords(x1,y1,&xyz_list[0][0]);
++	gauss_2=new GaussTria();
++	gauss_2->GaussFromCoords(x2,y2,&xyz_list[0][0]);
++
++	normal[0]=cos(atan2(x1-x2,y2-y1));
++	normal[1]=sin(atan2(x1-x2,y2-y1));
++
++	length=sqrt(pow(x2-x1,2)+pow(y2-y1,2));
++
++	Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
++	this->parameters->FindParam(&domaintype,DomainTypeEnum);
++	Input* vx_input=NULL;
++	Input* vy_input=NULL;
++	if(domaintype==Domain2DhorizontalEnum){
++		vx_input=inputs->GetInput(VxEnum); _assert_(vx_input);
++		vy_input=inputs->GetInput(VyEnum); _assert_(vy_input);
+ 	}
+ 	else{
+-		return false;
++		vx_input=inputs->GetInput(VxAverageEnum); _assert_(vx_input);
++		vy_input=inputs->GetInput(VyAverageEnum); _assert_(vy_input);
+ 	}
+-}
+-/*}}}*/
+-void       Tria::EdgeOnBaseIndices(int* pindex1,int* pindex2){/*{{{*/
+ 
+-	IssmDouble values[NUMVERTICES];
+-	int        indices[3][2] = {{1,2},{2,0},{0,1}};
++	thickness_input->GetInputValue(&h1, gauss_1);
++	thickness_input->GetInputValue(&h2, gauss_2);
++	vx_input->GetInputValue(&vx1,gauss_1);
++	vx_input->GetInputValue(&vx2,gauss_2);
++	vy_input->GetInputValue(&vy1,gauss_1);
++	vy_input->GetInputValue(&vy2,gauss_2);
+ 
+-	/*Retrieve all inputs and parameters*/
+-	GetInputListOnVertices(&values[0],MeshVertexonbaseEnum);
++	mass_flux= rho_ice*length*(  
++				(ONETHIRD*(h1-h2)*(vx1-vx2)+0.5*h2*(vx1-vx2)+0.5*(h1-h2)*vx2+h2*vx2)*normal[0]+
++				(ONETHIRD*(h1-h2)*(vy1-vy2)+0.5*h2*(vy1-vy2)+0.5*(h1-h2)*vy2+h2*vy2)*normal[1]
++				);
+ 
+-	for(int i=0;i<3;i++){
+-		if(values[indices[i][0]] == 1. && values[indices[i][1]] == 1.){
+-			*pindex1 = indices[i][0];
+-			*pindex2 = indices[i][1];
+-			return;
+-		}
+-	}
+-
+-	_printf_("list of vertices on bed: "<<values[0]<<" "<<values[1]<<" "<<values[2]);
+-	_error_("Could not find 2 vertices on bed");
++	/*clean up and return:*/
++	delete gauss_1;
++	delete gauss_2;
++	return mass_flux;
+ }
+ /*}}}*/
+-void       Tria::EdgeOnSurfaceIndices(int* pindex1,int* pindex2){/*{{{*/
++IssmDouble Tria::MassFlux(IssmDouble* segment){/*{{{*/
+ 
+-	IssmDouble values[NUMVERTICES];
+-	int        indices[3][2] = {{1,2},{2,0},{0,1}};
++	int        domaintype;
++	IssmDouble mass_flux=0.;
++	IssmDouble xyz_list[NUMVERTICES][3];
++	IssmDouble normal[2];
++	IssmDouble length,rho_ice;
++	IssmDouble x1,y1,x2,y2,h1,h2;
++	IssmDouble vx1,vx2,vy1,vy2;
++	GaussTria* gauss_1=NULL;
++	GaussTria* gauss_2=NULL;
+ 
+-	/*Retrieve all inputs and parameters*/
+-	GetInputListOnVertices(&values[0],MeshVertexonsurfaceEnum);
++	/*Get material parameters :*/
++	rho_ice=matpar->GetRhoIce();
+ 
+-	for(int i=0;i<3;i++){
+-		if(values[indices[i][0]] == 1. && values[indices[i][1]] == 1.){
+-			*pindex1 = indices[i][0];
+-			*pindex2 = indices[i][1];
+-			return;
+-		}
+-	}
++	/*First off, check that this segment belongs to this element: */
++	if (reCast<int>(*(segment+4))!=this->id)_error_("error message: segment with id " << reCast<int>(*(segment+4)) << " does not belong to element with id:" << this->id);
+ 
+-	_printf_("list of vertices on surface: "<<values[0]<<" "<<values[1]<<" "<<values[2]);
+-	_error_("Could not find 2 vertices on surface");
+-}
+-/*}}}*/
+-int        Tria::EdgeOnBaseIndex(void){/*{{{*/
++	/*Recover segment node locations: */
++	x1=*(segment+0); y1=*(segment+1); x2=*(segment+2); y2=*(segment+3);
+ 
+-	IssmDouble values[NUMVERTICES];
+-	int        indices[3][2] = {{1,2},{2,0},{0,1}};
++	/*Get xyz list: */
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+ 
+-	/*Retrieve all inputs and parameters*/
+-	GetInputListOnVertices(&values[0],MeshVertexonbaseEnum);
++	/*get area coordinates of 0 and 1 locations: */
++	gauss_1=new GaussTria();
++	gauss_1->GaussFromCoords(x1,y1,&xyz_list[0][0]);
++	gauss_2=new GaussTria();
++	gauss_2->GaussFromCoords(x2,y2,&xyz_list[0][0]);
+ 
+-	for(int i=0;i<3;i++){
+-		if(values[indices[i][0]] == 1. && values[indices[i][1]] == 1.){
+-			return i;
+-		}
++	normal[0]=cos(atan2(x1-x2,y2-y1));
++	normal[1]=sin(atan2(x1-x2,y2-y1));
++
++	length=sqrt(pow(x2-x1,2)+pow(y2-y1,2));
++
++	Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
++	this->parameters->FindParam(&domaintype,DomainTypeEnum);
++	Input* vx_input=NULL;
++	Input* vy_input=NULL;
++	if(domaintype==Domain2DhorizontalEnum){
++		vx_input=inputs->GetInput(VxEnum); _assert_(vx_input);
++		vy_input=inputs->GetInput(VyEnum); _assert_(vy_input);
+ 	}
++	else{
++		vx_input=inputs->GetInput(VxAverageEnum); _assert_(vx_input);
++		vy_input=inputs->GetInput(VyAverageEnum); _assert_(vy_input);
++	}
+ 
+-	_printf_("list of vertices on bed: "<<values[0]<<" "<<values[1]<<" "<<values[2]);
+-	_error_("Could not find 2 vertices on bed");
++	thickness_input->GetInputValue(&h1, gauss_1);
++	thickness_input->GetInputValue(&h2, gauss_2);
++	vx_input->GetInputValue(&vx1,gauss_1);
++	vx_input->GetInputValue(&vx2,gauss_2);
++	vy_input->GetInputValue(&vy1,gauss_1);
++	vy_input->GetInputValue(&vy2,gauss_2);
++
++	mass_flux= rho_ice*length*(  
++				(ONETHIRD*(h1-h2)*(vx1-vx2)+0.5*h2*(vx1-vx2)+0.5*(h1-h2)*vx2+h2*vx2)*normal[0]+
++				(ONETHIRD*(h1-h2)*(vy1-vy2)+0.5*h2*(vy1-vy2)+0.5*(h1-h2)*vy2+h2*vy2)*normal[1]
++				);
++
++	/*clean up and return:*/
++	delete gauss_1;
++	delete gauss_2;
++	return mass_flux;
+ }
+ /*}}}*/
+-int        Tria::EdgeOnSurfaceIndex(void){/*{{{*/
++IssmDouble Tria::Misfit(int modelenum,int observationenum,int weightsenum){/*{{{*/
+ 
+-	IssmDouble values[NUMVERTICES];
+-	int        indices[3][2] = {{1,2},{2,0},{0,1}};
++	/*Intermediaries*/
++	IssmDouble model,observation,weight;
++	IssmDouble Jdet;
++	IssmDouble Jelem = 0;
++	IssmDouble xyz_list[NUMVERTICES][3];
++	GaussTria *gauss = NULL;
+ 
+-	/*Retrieve all inputs and parameters*/
+-	GetInputListOnVertices(&values[0],MeshVertexonsurfaceEnum);
++	/*If on water, return 0: */
++	if(!IsIceInElement())return 0;
+ 
+-	for(int i=0;i<3;i++){
+-		if(values[indices[i][0]] == 1. && values[indices[i][1]] == 1.){
+-			return i;
+-		}
+-	}
++	/*Retrieve all inputs we will be needing: */
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++	Input* model_input=inputs->GetInput(modelenum);   _assert_(model_input);
++	Input* observation_input=inputs->GetInput(observationenum);_assert_(observation_input);
++	Input* weights_input     =inputs->GetInput(weightsenum);     _assert_(weights_input);
+ 
+-	_printf_("list of vertices on surface: "<<values[0]<<" "<<values[1]<<" "<<values[2]);
+-	_error_("Could not find 2 vertices on surface");
+-}
+-/*}}}*/
+-void       Tria::FSContactMigration(Vector<IssmDouble>* vertexgrounded,Vector<IssmDouble>* vertexfloating){/*{{{*/
++	/* Start  looping on the number of gaussian points: */
++	gauss=new GaussTria(2);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 
+-	if(!IsOnBase()) return;
++		gauss->GaussPoint(ig);
+ 
+-	int approximation;
+-	inputs->GetInputValue(&approximation,ApproximationEnum);
++		/* Get Jacobian determinant: */
++		GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);
+ 
+-	if(approximation==HOApproximationEnum || approximation==SSAApproximationEnum || approximation==SSAHOApproximationEnum){
+-		for(int i=0;i<NUMVERTICES;i++){
+-			vertexgrounded->SetValue(vertices[i]->Pid(),+9999.,INS_VAL);
+-			vertexfloating->SetValue(vertices[i]->Pid(),+9999.,INS_VAL);
+-		}
++		/*Get parameters at gauss point*/
++		model_input->GetInputValue(&model,gauss);
++		observation_input->GetInputValue(&observation,gauss);
++		weights_input->GetInputValue(&weight,gauss);
++
++		/*compute misfit between model and observation */
++		Jelem+=0.5*(model-observation)*(model-observation)*Jdet*weight*gauss->weight;
+ 	}
+-	else{
+-		/*Intermediaries*/
+-		IssmDouble* xyz_list = NULL;
+-		IssmDouble* xyz_list_base = NULL;
+-		IssmDouble  pressure,water_pressure,sigma_nn,viscosity,bed,base;
+-		IssmDouble  bed_normal[2];
+-		IssmDouble  epsilon[3]; /* epsilon=[exx,eyy,exy];*/
+-		IssmDouble  surface=0,value=0;
+-		bool grounded;
+ 
+-		/* Get node coordinates and dof list: */
+-		GetVerticesCoordinates(&xyz_list);
+-		GetVerticesCoordinatesBase(&xyz_list_base);
++	/* clean up and Return: */
++	delete gauss;
++	return Jelem;
++}
++/*}}}*/
++IssmDouble Tria::MisfitArea(int weightsenum){/*{{{*/
+ 
+-		/*Retrieve all inputs we will be needing: */
+-		Input* pressure_input = inputs->GetInput(PressureEnum); _assert_(pressure_input);
+-		Input* base_input     = inputs->GetInput(BaseEnum);     _assert_(base_input);
+-		Input* bed_input      = inputs->GetInput(BedEnum);      _assert_(bed_input);
+-		Input* vx_input       = inputs->GetInput(VxEnum);       _assert_(vx_input);
+-		Input* vy_input       = inputs->GetInput(VyEnum);       _assert_(vy_input);
++	/*Intermediaries*/
++	IssmDouble weight;
++	IssmDouble Jdet;
++	IssmDouble Jelem = 0;
++	IssmDouble xyz_list[NUMVERTICES][3];
++	GaussTria *gauss = NULL;
+ 
+-		/*Create gauss point in the middle of the basal edge*/
+-		Gauss* gauss=NewGaussBase(1);
+-		gauss->GaussPoint(0);
++	/*If on water, return 0: */
++	if(!IsIceInElement())return 0;
+ 
+-		if(!IsFloating()){ 
+-			/*Check for basal force only if grounded and touching GL*/
+-			//		if(this->inputs->Min(MaskGroundediceLevelsetEnum)==0.){
+-			this->StrainRateSSA(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
+-			this->ViscosityFS(&viscosity,2,xyz_list,gauss,vx_input,vy_input,NULL);
+-			pressure_input->GetInputValue(&pressure, gauss);
+-			base_input->GetInputValue(&base, gauss); 
++	/*Retrieve all inputs we will be needing: */
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++	Input* weights_input     =inputs->GetInput(weightsenum);     _assert_(weights_input);
+ 
+-			/*Compute Stress*/
+-			IssmDouble sigma_xx=2.*viscosity*epsilon[0]-pressure;
+-			IssmDouble sigma_yy=2.*viscosity*epsilon[1]-pressure;
+-			IssmDouble sigma_xy=2.*viscosity*epsilon[2];
++	/* Start  looping on the number of gaussian points: */
++	gauss=new GaussTria(2);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 
+-			/*Get normal vector to the bed */
+-			NormalBase(&bed_normal[0],xyz_list_base);
++		gauss->GaussPoint(ig);
+ 
+-			/*basalforce*/
+-			sigma_nn = sigma_xx*bed_normal[0]*bed_normal[0] + sigma_yy*bed_normal[1]*bed_normal[1] + 2.*sigma_xy*bed_normal[0]*bed_normal[1];
++		/* Get Jacobian determinant: */
++		GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);
+ 
+-			/*Compute water pressure*/
+-			IssmDouble rho_ice   = matpar->GetRhoIce();
+-			IssmDouble rho_water = matpar->GetRhoWater();
+-			IssmDouble gravity   = matpar->GetG();
+-			water_pressure=gravity*rho_water*base;
++		/*Get parameters at gauss point*/
++		weights_input->GetInputValue(&weight,gauss);
+ 
+-			/*Compare basal stress to water pressure and determine whether it should ground*/
+-			if (sigma_nn<water_pressure) grounded=true;
+-			else                         grounded=false;
+-		}
+-		else{
+-			/*Check for basal elevation if floating*/
+-			base_input->GetInputValue(&base, gauss);
+-			bed_input->GetInputValue(&bed, gauss);
+-			if(base<bed) grounded=true;
+-			else         grounded=false;
+-		}
+-		for(int i=0;i<NUMVERTICES;i++){
+-			if(grounded) vertexgrounded->SetValue(vertices[i]->Pid(),+1.,INS_VAL);
+-			else         vertexfloating->SetValue(vertices[i]->Pid(),+1.,INS_VAL);
+-		}
+-
+-		/*clean up*/
+-		delete gauss;
+-		xDelete<IssmDouble>(xyz_list);
+-		xDelete<IssmDouble>(xyz_list_base);
++		/*compute misfit between model and observation */
++		Jelem+=Jdet*weight*gauss->weight;
+ 	}
+-}
+-/*}}}*/
+-bool       Tria::IsNodeOnShelfFromFlags(IssmDouble* flags){/*{{{*/
+ 
+-	int  i;
+-	bool shelf=false;
+-
+-	for(i=0;i<NUMVERTICES;i++){
+-		if (flags[vertices[i]->Pid()]<0.){
+-			shelf=true;
+-			break;
+-		}
+-	}
+-	return shelf;
++	/* clean up and Return: */
++	delete gauss;
++	return Jelem;
+ }
+ /*}}}*/
+ Gauss*     Tria::NewGauss(void){/*{{{*/
+@@ -1690,59 +2054,59 @@
+ 
+ }
+ /*}}}*/
+-void       Tria::NodalFunctionsP1(IssmDouble* basis, Gauss* gauss){/*{{{*/
++void       Tria::NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussTriaEnum);
+-	this->GetNodalFunctions(basis,(GaussTria*)gauss,P1Enum);
++	this->GetNodalFunctionsDerivatives(dbasis,xyz_list,(GaussTria*)gauss,this->element_type);
+ 
+ }
+ /*}}}*/
+-void       Tria::NodalFunctionsP2(IssmDouble* basis, Gauss* gauss){/*{{{*/
++void       Tria::NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussTriaEnum);
+-	this->GetNodalFunctions(basis,(GaussTria*)gauss,P2Enum);
++	this->GetNodalFunctionsDerivatives(dbasis,xyz_list,(GaussTria*)gauss,this->VelocityInterpolation());
+ 
+ }
+ /*}}}*/
+-void       Tria::NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void       Tria::NodalFunctionsPressure(IssmDouble* basis, Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussTriaEnum);
+-	this->GetNodalFunctionsDerivatives(dbasis,xyz_list,(GaussTria*)gauss,this->element_type);
++	this->GetNodalFunctions(basis,(GaussTria*)gauss,this->PressureInterpolation());
+ 
+ }
+ /*}}}*/
+-void       Tria::NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void       Tria::NodalFunctionsP1(IssmDouble* basis, Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussTriaEnum);
+-	this->GetNodalFunctionsDerivatives(dbasis,xyz_list,(GaussTria*)gauss,P1Enum);
++	this->GetNodalFunctions(basis,(GaussTria*)gauss,P1Enum);
+ 
+ }
+ /*}}}*/
+-void       Tria::NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void       Tria::NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussTriaEnum);
+-	this->GetNodalFunctionsDerivatives(dbasis,xyz_list,(GaussTria*)gauss,this->VelocityInterpolation());
++	this->GetNodalFunctionsDerivatives(dbasis,xyz_list,(GaussTria*)gauss,P1Enum);
+ 
+ }
+ /*}}}*/
+-void       Tria::NodalFunctionsVelocity(IssmDouble* basis, Gauss* gauss){/*{{{*/
++void       Tria::NodalFunctionsP2(IssmDouble* basis, Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussTriaEnum);
+-	this->GetNodalFunctions(basis,(GaussTria*)gauss,this->VelocityInterpolation());
++	this->GetNodalFunctions(basis,(GaussTria*)gauss,P2Enum);
+ 
+ }
+ /*}}}*/
+-void       Tria::NodalFunctionsPressure(IssmDouble* basis, Gauss* gauss){/*{{{*/
++void       Tria::NodalFunctionsTensor(IssmDouble* basis, Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussTriaEnum);
+-	this->GetNodalFunctions(basis,(GaussTria*)gauss,this->PressureInterpolation());
++	this->GetNodalFunctions(basis,(GaussTria*)gauss,this->TensorInterpolation());
+ 
+ }
+ /*}}}*/
+-void       Tria::NodalFunctionsTensor(IssmDouble* basis, Gauss* gauss){/*{{{*/
++void       Tria::NodalFunctionsVelocity(IssmDouble* basis, Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussTriaEnum);
+-	this->GetNodalFunctions(basis,(GaussTria*)gauss,this->TensorInterpolation());
++	this->GetNodalFunctions(basis,(GaussTria*)gauss,this->VelocityInterpolation());
+ 
+ }
+ /*}}}*/
+@@ -1794,6 +2158,21 @@
+ 	_assert_(bed_normal[1]<0); 
+ }
+ /*}}}*/
++void       Tria::NormalSection(IssmDouble* normal,IssmDouble* xyz_list){/*{{{*/
++
++	/*Build unit outward pointing vector*/
++	IssmDouble vector[2];
++	IssmDouble norm;
++
++	vector[0]=xyz_list[1*3+0] - xyz_list[0*3+0];
++	vector[1]=xyz_list[1*3+1] - xyz_list[0*3+1];
++
++	norm=sqrt(vector[0]*vector[0] + vector[1]*vector[1]);
++
++	normal[0]= + vector[1]/norm;
++	normal[1]= - vector[0]/norm;
++}
++/*}}}*/
+ void       Tria::NormalTop(IssmDouble* top_normal,IssmDouble* xyz_list){/*{{{*/
+ 
+ 	/*Build unit outward pointing vector*/
+@@ -1812,18 +2191,16 @@
+ 	_assert_(top_normal[1]>0); 
+ }
+ /*}}}*/
+-int        Tria::VelocityInterpolation(void){/*{{{*/
+-	return TriaRef::VelocityInterpolation(this->element_type);
++int        Tria::ObjectEnum(void){/*{{{*/
++
++	return TriaEnum;
++
+ }
+ /*}}}*/
+ int        Tria::PressureInterpolation(void){/*{{{*/
+ 	return TriaRef::PressureInterpolation(this->element_type);
+ }
+ /*}}}*/
+-int        Tria::TensorInterpolation(void){/*{{{*/
+-	return TriaRef::TensorInterpolation(this->element_type);
+-}
+-/*}}}*/
+ int        Tria::NumberofNodesPressure(void){/*{{{*/
+ 	return TriaRef::NumberofNodes(this->PressureInterpolation());
+ }
+@@ -1900,6 +2277,33 @@
+ 	delete gauss;
+ }
+ /*}}}*/
++void       Tria::PotentialUngrounding(Vector<IssmDouble>* potential_ungrounding){/*{{{*/
++
++	IssmDouble  h[NUMVERTICES],r[NUMVERTICES],gl[NUMVERTICES];
++	IssmDouble  bed_hydro;
++	IssmDouble  rho_water,rho_ice,density;
++
++	/*material parameters: */
++	rho_water=matpar->GetRhoWater();
++	rho_ice=matpar->GetRhoIce();
++	density=rho_ice/rho_water;
++	GetInputListOnVertices(&h[0],ThicknessEnum);
++	GetInputListOnVertices(&r[0],BedEnum);
++	GetInputListOnVertices(&gl[0],MaskGroundediceLevelsetEnum);
++
++	/*go through vertices, and figure out which ones are grounded and want to unground: */
++	for(int i=0;i<NUMVERTICES;i++){
++		/*Find if grounded vertices want to start floating*/
++		if (gl[i]>0.){
++			bed_hydro=-density*h[i];
++			if(bed_hydro>r[i]){
++				/*Vertex that could potentially unground, flag it*/
++				potential_ungrounding->SetValue(vertices[i]->Pid(),1,INS_VAL);
++			}
++		}
++	}
++}
++/*}}}*/
+ void       Tria::ReduceMatrices(ElementMatrix* Ke,ElementVector* pe){/*{{{*/
+ 
+ 	/*Static condensation if requested*/
+@@ -2010,6 +2414,82 @@
+ 	_error_("not implemented yet");
+ }
+ /*}}}*/
++void       Tria::SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){/*{{{*/
++
++	IssmDouble  values[NUMVERTICES];
++	int         vertexpidlist[NUMVERTICES],control_init;
++
++
++	/*Get Domain type*/
++	int domaintype;
++	parameters->FindParam(&domaintype,DomainTypeEnum);
++
++	/*Specific case for depth averaged quantities*/
++	control_init=control_enum;
++	if(domaintype==Domain2DverticalEnum){
++		if(control_enum==MaterialsRheologyBbarEnum){
++			control_enum=MaterialsRheologyBEnum;
++			if(!IsOnBase()) return;
++		}
++		if(control_enum==DamageDbarEnum){
++			control_enum=DamageDEnum;
++			if(!IsOnBase()) return;
++		}
++	}
++
++	/*Get out if this is not an element input*/
++	if(!IsInput(control_enum)) return;
++
++	/*Prepare index list*/
++	GradientIndexing(&vertexpidlist[0],control_index);
++
++	/*Get values on vertices*/
++	for(int i=0;i<NUMVERTICES;i++){
++		values[i]=vector[vertexpidlist[i]];
++	}
++	Input* new_input = new TriaInput(control_enum,values,P1Enum);
++	Input* input     = (Input*)this->inputs->GetInput(control_enum);   _assert_(input);
++	if(input->ObjectEnum()!=ControlInputEnum){
++		_error_("input " << EnumToStringx(control_enum) << " is not a ControlInput");
++	}
++
++	((ControlInput*)input)->SetInput(new_input);
++}
++/*}}}*/
++void       Tria::SetCurrentConfiguration(Elements* elementsin, Loads* loadsin, Nodes* nodesin, Materials* materialsin, Parameters* parametersin){/*{{{*/
++
++	/*go into parameters and get the analysis_counter: */
++	int analysis_counter;
++	parametersin->FindParam(&analysis_counter,AnalysisCounterEnum);
++
++	/*Get Element type*/
++	if(this->element_type_list) this->element_type=this->element_type_list[analysis_counter];
++
++	/*Pick up nodes*/
++	if(this->hnodes && this->hnodes[analysis_counter]){
++		this->nodes=(Node**)this->hnodes[analysis_counter]->deliverp();
++	}
++
++}
++/*}}}*/
++Element*   Tria::SpawnBasalElement(void){/*{{{*/
++
++	int index1,index2;
++	int domaintype;
++
++	this->parameters->FindParam(&domaintype,DomainTypeEnum);
++	switch(domaintype){
++		case Domain2DhorizontalEnum:
++			return this;
++		case Domain2DverticalEnum:
++			_assert_(HasEdgeOnBase());
++			this->EdgeOnBaseIndices(&index1,&index2);
++			return SpawnSeg(index1,index2);
++		default:
++			_error_("not implemented yet");
++	}
++}
++/*}}}*/
+ Seg*       Tria::SpawnSeg(int index1,int index2){/*{{{*/
+ 
+ 	int analysis_counter;
+@@ -2037,7 +2517,7 @@
+ 	return seg;
+ }
+ /*}}}*/
+-Element*   Tria::SpawnBasalElement(void){/*{{{*/
++Element*   Tria::SpawnTopElement(void){/*{{{*/
+ 
+ 	int index1,index2;
+ 	int domaintype;
+@@ -2047,46 +2527,104 @@
+ 		case Domain2DhorizontalEnum:
+ 			return this;
+ 		case Domain2DverticalEnum:
+-			_assert_(HasEdgeOnBase());
+-			this->EdgeOnBaseIndices(&index1,&index2);
+-			return SpawnSeg(index1,index2);
++			_assert_(HasEdgeOnSurface());
++			this->EdgeOnSurfaceIndices(&index1,&index2);
++			return SpawnSeg(index2,index1); //reverse order
+ 		default:
+ 			_error_("not implemented yet");
+ 	}
+ }
+ /*}}}*/
+-Element*   Tria::SpawnTopElement(void){/*{{{*/
++void       Tria::StrainRateparallel(){/*{{{*/
+ 
+-	int index1,index2;
+-	int domaintype;
++	IssmDouble *xyz_list = NULL;
++	IssmDouble  epsilon[3];
++	GaussTria* gauss=NULL;
++	IssmDouble  vx,vy,vel;
++	IssmDouble  strainxx;
++	IssmDouble  strainxy;
++	IssmDouble  strainyy;
++	IssmDouble  strainparallel[NUMVERTICES];
+ 
+-	this->parameters->FindParam(&domaintype,DomainTypeEnum);
+-	switch(domaintype){
+-		case Domain2DhorizontalEnum:
+-			return this;
+-		case Domain2DverticalEnum:
+-			_assert_(HasEdgeOnSurface());
+-			this->EdgeOnSurfaceIndices(&index1,&index2);
+-			return SpawnSeg(index2,index1); //reverse order
+-		default:
+-			_error_("not implemented yet");
++	/* Get node coordinates and dof list: */
++	this->GetVerticesCoordinates(&xyz_list);
++
++	/*Retrieve all inputs we will need*/
++	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
++	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
++
++	/* Start looping on the number of vertices: */
++	gauss=new GaussTria();
++	for (int iv=0;iv<NUMVERTICES;iv++){
++		gauss->GaussVertex(iv);
++
++		/* Get the value we need*/
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		vel=vx*vx+vy*vy;
++
++		/*Compute strain rate viscosity and pressure: */
++		this->StrainRateSSA(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
++		strainxx=epsilon[0];
++		strainyy=epsilon[1];
++		strainxy=epsilon[2];
++
++		/*strainparallel= Strain rate along the ice flow direction */
++		strainparallel[iv]=(vx*vx*(strainxx)+vy*vy*(strainyy)+2*vy*vx*strainxy)/(vel+1.e-6);
+ 	}
++
++	/*Add input*/
++	this->inputs->AddInput(new TriaInput(StrainRateparallelEnum,&strainparallel[0],P1Enum));
++
++	/*Clean up and return*/
++	delete gauss;
++	xDelete<IssmDouble>(xyz_list);
+ }
+ /*}}}*/
+-void       Tria::SetCurrentConfiguration(Elements* elementsin, Loads* loadsin, Nodes* nodesin, Materials* materialsin, Parameters* parametersin){/*{{{*/
++void       Tria::StrainRateperpendicular(){/*{{{*/
+ 
+-	/*go into parameters and get the analysis_counter: */
+-	int analysis_counter;
+-	parametersin->FindParam(&analysis_counter,AnalysisCounterEnum);
++	IssmDouble *xyz_list = NULL;
++	GaussTria* gauss=NULL;
++	IssmDouble  epsilon[3];
++	IssmDouble  vx,vy,vel;
++	IssmDouble  strainxx;
++	IssmDouble  strainxy;
++	IssmDouble  strainyy;
++	IssmDouble  strainperpendicular[NUMVERTICES];
+ 
+-	/*Get Element type*/
+-	if(this->element_type_list) this->element_type=this->element_type_list[analysis_counter];
++	/* Get node coordinates and dof list: */
++	this->GetVerticesCoordinates(&xyz_list);
+ 
+-	/*Pick up nodes*/
+-	if(this->hnodes && this->hnodes[analysis_counter]){
+-		this->nodes=(Node**)this->hnodes[analysis_counter]->deliverp();
++	/*Retrieve all inputs we will need*/
++	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
++	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
++
++	/* Start looping on the number of vertices: */
++	gauss=new GaussTria();
++	for (int iv=0;iv<NUMVERTICES;iv++){
++		gauss->GaussVertex(iv);
++
++		/* Get the value we need*/
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		vel=vx*vx+vy*vy;
++
++		/*Compute strain rate viscosity and pressure: */
++		this->StrainRateSSA(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
++		strainxx=epsilon[0];
++		strainyy=epsilon[1];
++		strainxy=epsilon[2];
++
++		/*strainperpendicular= Strain rate perpendicular to the ice flow direction */
++		strainperpendicular[iv]=(vx*vx*(strainyy)+vy*vy*(strainxx)-2*vy*vx*strainxy)/(vel+1.e-6);
+ 	}
+ 
++	/*Add input*/
++	this->inputs->AddInput(new TriaInput(StrainRateperpendicularEnum,&strainperpendicular[0],P1Enum));
++
++	/*Clean up and return*/
++	delete gauss;
++	xDelete<IssmDouble>(xyz_list);
+ }
+ /*}}}*/
+ IssmDouble Tria::SurfaceArea(void){/*{{{*/
+@@ -2116,6 +2654,10 @@
+ 	return S;
+ }
+ /*}}}*/
++int        Tria::TensorInterpolation(void){/*{{{*/
++	return TriaRef::TensorInterpolation(this->element_type);
++}
++/*}}}*/
+ IssmDouble Tria::TimeAdapt(void){/*{{{*/
+ 
+ 	/*intermediary: */
+@@ -2157,6 +2699,34 @@
+ 	return dt;
+ }
+ /*}}}*/
++IssmDouble Tria::TotalSmb(void){/*{{{*/
++
++	/*The smb[kg yr-1] of one element is area[m2] * smb [kg m^-2 yr^-1]*/
++	IssmDouble base,smb,rho_ice;
++	IssmDouble Total_Smb=0;
++	IssmDouble xyz_list[NUMVERTICES][3];
++
++	/*Get material parameters :*/
++	rho_ice=matpar->GetRhoIce();
++
++   if(!IsIceInElement())return 0;
++
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++
++	/*First calculate the area of the base (cross section triangle)
++	 * http://en.wikipedia.org/wiki/Triangle
++	 * base = 1/2 abs((xA-xC)(yB-yA)-(xA-xB)(yC-yA))*/
++	base = 1./2. * fabs((xyz_list[0][0]-xyz_list[2][0])*(xyz_list[1][1]-xyz_list[0][1]) - (xyz_list[0][0]-xyz_list[1][0])*(xyz_list[2][1]-xyz_list[0][1]));	// area of element in m2
++
++	/*Now get the average SMB over the element*/
++	Input* smb_input = inputs->GetInput(SurfaceforcingsMassBalanceEnum); _assert_(smb_input);
++	smb_input->GetInputAverage(&smb);																								// average smb on element in m ice s-1
++   Total_Smb=rho_ice*base*smb;																											// smb on element in kg s-1
++
++	/*Return: */
++	return Total_Smb;
++}
++/*}}}*/
+ void       Tria::Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finiteelement_type){/*{{{*/
+ 
+ 	/*Intermediaries*/
+@@ -2346,487 +2916,134 @@
+ 
+ }
+ /*}}}*/
+-void       Tria::ValueP1OnGauss(IssmDouble* pvalue,IssmDouble* values,Gauss* gauss){/*{{{*/
+-	TriaRef::GetInputValue(pvalue,values,gauss,P1Enum);
+-}
+-/*}}}*/
+-void       Tria::ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+-	TriaRef::GetInputDerivativeValue(dvalue,values,xyz_list,gauss,P1Enum);
+-}
+-/*}}}*/
+-int        Tria::VertexConnectivity(int vertexindex){/*{{{*/
+-	_assert_(this->vertices);
+-	return this->vertices[vertexindex]->Connectivity();
+-}
+-/*}}}*/
+-bool       Tria::IsZeroLevelset(int levelset_enum){/*{{{*/
++int        Tria::UpdatePotentialUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf){/*{{{*/
+ 
+-	bool iszerols;
+-	IssmDouble ls[NUMVERTICES];
++	int i;
++	int nflipped=0;
+ 
+-	/*Retrieve all inputs and parameters*/
+-	GetInputListOnVertices(&ls[0],levelset_enum);
++	/*Go through nodes, and whoever is on the potential_ungrounding, ends up in nodes_on_iceshelf: */
++	for(i=0;i<3;i++){
++		if (reCast<bool>(vertices_potentially_ungrounding[vertices[i]->Pid()])){
++			vec_nodes_on_iceshelf->SetValue(vertices[i]->Pid(),-1.,INS_VAL);
+ 
+-	/*If the level set is awlays <0, there is no ice front here*/
+-	iszerols= false;
+-	if(IsIceInElement()){
+-		if(ls[0]*ls[1]<0. || ls[0]*ls[2]<0. || (ls[0]*ls[1]*ls[2]==0. && ls[0]*ls[1]+ls[0]*ls[2]+ls[1]*ls[2]<=0.)){
+-			iszerols = true;
++			/*If node was not on ice shelf, we flipped*/
++			if(nodes_on_iceshelf[vertices[i]->Pid()]>=0.){
++				nflipped++;
++			}
+ 		}
+ 	}
+-
+-	return iszerols;
++	return nflipped;
+ }
+ /*}}}*/
+-bool       Tria::IsIcefront(void){/*{{{*/
+-
+-	bool isicefront;
+-	int i,nrice;
+-   IssmDouble ls[NUMVERTICES];
+-
+-	/*Retrieve all inputs and parameters*/
+-	GetInputListOnVertices(&ls[0],MaskIceLevelsetEnum);
+-
+-	/* If only one vertex has ice, there is an ice front here */
+-	isicefront=false;
+-	if(IsIceInElement()){
+-		nrice=0;       
+-		for(i=0;i<NUMVERTICES;i++)
+-			if(ls[i]<0.) nrice++;
+-		if(nrice==1) isicefront= true;
+-	}
+-	return isicefront;
+-}/*}}}*/
+-bool       Tria::IsFaceOnBoundary(void){/*{{{*/
+-
+-	IssmDouble values[NUMVERTICES];
+-	IssmDouble sum;
+-
+-	/*Retrieve all inputs and parameters*/
+-	GetInputListOnVertices(&values[0],MeshVertexonboundaryEnum);
+-	sum = values[0]+values[1]+values[2];
+-
+-	_assert_(sum==0. || sum==1. || sum==2.);
+-
+-	if(sum==3.)  _error_("Two edges on boundary not supported yet...");
+-
+-	if(sum>1.){
+-		return true;
+-	}
+-	else{
+-		return false;
+-	}
+-}/*}}}*/
+-void       Tria::AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part){/*{{{*/
+-
+-	bool       already = false;
+-	int        i,j;
+-	int        partition[NUMVERTICES];
+-	int        offsetsid[NUMVERTICES];
+-	int        offsetdof[NUMVERTICES];
+-	IssmDouble area;
+-	IssmDouble mean;
+-
+-	/*First, get the area: */
+-	area=this->GetArea();
+-
+-	/*Figure out the average for this element: */
+-	this->GetVerticesSidList(&offsetsid[0]);
+-	this->GetVertexPidList(&offsetdof[0]);
+-	mean=0;
+-	for(i=0;i<NUMVERTICES;i++){
+-		partition[i]=reCast<int>(qmu_part[offsetsid[i]]);
+-		mean=mean+1.0/NUMVERTICES*vertex_response[offsetdof[i]];
+-	}
+-
+-	/*Add contribution: */
+-	for(i=0;i<NUMVERTICES;i++){
+-		already=false;
+-		for(j=0;j<i;j++){
+-			if (partition[i]==partition[j]){
+-				already=true;
+-				break;
+-			}
+-		}
+-		if(!already){
+-			partition_contributions->SetValue(partition[i],mean*area,ADD_VAL);
+-			partition_areas->SetValue(partition[i],area,ADD_VAL);
+-		};
+-	}
++void       Tria::ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++	TriaRef::GetInputDerivativeValue(dvalue,values,xyz_list,gauss,P1Enum);
+ }
+ /*}}}*/
+-IssmDouble Tria::IceVolume(void){/*{{{*/
+-
+-	/*The volume of a troncated prism is base * 1/3 sum(length of edges)*/
+-	IssmDouble base,surface,bed;
+-	IssmDouble xyz_list[NUMVERTICES][3];
+-
+-	if(!IsIceInElement())return 0;
+-
+-	/*First get back the area of the base*/
+-	base=this->GetArea();
+-
+-	/*Now get the average height*/
+-	Input* surface_input = inputs->GetInput(SurfaceEnum); _assert_(surface_input);
+-	Input* base_input     = inputs->GetInput(BaseEnum);     _assert_(base_input);
+-	surface_input->GetInputAverage(&surface);
+-	base_input->GetInputAverage(&bed);
+-
+-	/*Return: */
+-	int domaintype;
+-	parameters->FindParam(&domaintype,DomainTypeEnum);
+-	if(domaintype==Domain2DverticalEnum){
+-	  return base;
+-	}
+-	else{
+-	  return base*(surface-bed);
+-	}
++void       Tria::ValueP1OnGauss(IssmDouble* pvalue,IssmDouble* values,Gauss* gauss){/*{{{*/
++	TriaRef::GetInputValue(pvalue,values,gauss,P1Enum);
+ }
+ /*}}}*/
+-IssmDouble Tria::IceVolumeAboveFloatation(void){/*{{{*/
+-
+-	/*The volume above floatation: H + rho_water/rho_ice * bathymetry */
+-	IssmDouble rho_ice,rho_water;
+-	IssmDouble base,surface,bed,bathymetry;
+-	IssmDouble xyz_list[NUMVERTICES][3];
+-
+-	if(!IsIceInElement() || IsFloating())return 0;
+-
+-	rho_ice=matpar->GetRhoIce();
+-	rho_water=matpar->GetRhoWater();
+-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-
+-	/*First calculate the area of the base (cross section triangle)
+-	 * http://en.wikipedia.org/wiki/Triangle
+-	 * base = 1/2 abs((xA-xC)(yB-yA)-(xA-xB)(yC-yA))*/
+-	base = 1./2. * fabs((xyz_list[0][0]-xyz_list[2][0])*(xyz_list[1][1]-xyz_list[0][1]) - (xyz_list[0][0]-xyz_list[1][0])*(xyz_list[2][1]-xyz_list[0][1]));
+-
+-	/*Now get the average height and bathymetry*/
+-	Input* surface_input    = inputs->GetInput(SurfaceEnum);    _assert_(surface_input);
+-	Input* base_input        = inputs->GetInput(BaseEnum);        _assert_(base_input);
+-	Input* bed_input = inputs->GetInput(BedEnum); _assert_(bed_input);
+-	surface_input->GetInputAverage(&surface);
+-	base_input->GetInputAverage(&bed);
+-	bed_input->GetInputAverage(&bathymetry);
+-	
+-	/*Return: */
+-	return base*(surface-bed+min(rho_water/rho_ice*bathymetry,0.));
++int        Tria::VelocityInterpolation(void){/*{{{*/
++	return TriaRef::VelocityInterpolation(this->element_type);
+ }
+ /*}}}*/
+-IssmDouble Tria::MassFlux( IssmDouble x1, IssmDouble y1, IssmDouble x2, IssmDouble y2,int segment_id){/*{{{*/
+-
+-	int        domaintype;
+-	IssmDouble mass_flux=0.;
+-	IssmDouble xyz_list[NUMVERTICES][3];
+-	IssmDouble normal[2];
+-	IssmDouble length,rho_ice;
+-	IssmDouble h1,h2;
+-	IssmDouble vx1,vx2,vy1,vy2;
+-	GaussTria* gauss_1=NULL;
+-	GaussTria* gauss_2=NULL;
+-
+-	/*Get material parameters :*/
+-	rho_ice=matpar->GetRhoIce();
+-
+-	/*First off, check that this segment belongs to this element: */
+-	if (segment_id!=this->id)_error_("error message: segment with id " << segment_id << " does not belong to element with id:" << this->id);
+-
+-	/*Get xyz list: */
+-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-
+-	/*get area coordinates of 0 and 1 locations: */
+-	gauss_1=new GaussTria();
+-	gauss_1->GaussFromCoords(x1,y1,&xyz_list[0][0]);
+-	gauss_2=new GaussTria();
+-	gauss_2->GaussFromCoords(x2,y2,&xyz_list[0][0]);
+-
+-	normal[0]=cos(atan2(x1-x2,y2-y1));
+-	normal[1]=sin(atan2(x1-x2,y2-y1));
+-
+-	length=sqrt(pow(x2-x1,2)+pow(y2-y1,2));
+-
+-	Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
+-	this->parameters->FindParam(&domaintype,DomainTypeEnum);
+-	Input* vx_input=NULL;
+-	Input* vy_input=NULL;
+-	if(domaintype==Domain2DhorizontalEnum){
+-		vx_input=inputs->GetInput(VxEnum); _assert_(vx_input);
+-		vy_input=inputs->GetInput(VyEnum); _assert_(vy_input);
+-	}
+-	else{
+-		vx_input=inputs->GetInput(VxAverageEnum); _assert_(vx_input);
+-		vy_input=inputs->GetInput(VyAverageEnum); _assert_(vy_input);
+-	}
+-
+-	thickness_input->GetInputValue(&h1, gauss_1);
+-	thickness_input->GetInputValue(&h2, gauss_2);
+-	vx_input->GetInputValue(&vx1,gauss_1);
+-	vx_input->GetInputValue(&vx2,gauss_2);
+-	vy_input->GetInputValue(&vy1,gauss_1);
+-	vy_input->GetInputValue(&vy2,gauss_2);
+-
+-	mass_flux= rho_ice*length*(  
+-				(ONETHIRD*(h1-h2)*(vx1-vx2)+0.5*h2*(vx1-vx2)+0.5*(h1-h2)*vx2+h2*vx2)*normal[0]+
+-				(ONETHIRD*(h1-h2)*(vy1-vy2)+0.5*h2*(vy1-vy2)+0.5*(h1-h2)*vy2+h2*vy2)*normal[1]
+-				);
+-
+-	/*clean up and return:*/
+-	delete gauss_1;
+-	delete gauss_2;
+-	return mass_flux;
++int        Tria::VertexConnectivity(int vertexindex){/*{{{*/
++	_assert_(this->vertices);
++	return this->vertices[vertexindex]->Connectivity();
+ }
+ /*}}}*/
+-IssmDouble Tria::MassFlux( IssmDouble* segment){/*{{{*/
++void       Tria::ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum){/*{{{*/
+ 
+-	int        domaintype;
+-	IssmDouble mass_flux=0.;
+-	IssmDouble xyz_list[NUMVERTICES][3];
+-	IssmDouble normal[2];
+-	IssmDouble length,rho_ice;
+-	IssmDouble x1,y1,x2,y2,h1,h2;
+-	IssmDouble vx1,vx2,vy1,vy2;
+-	GaussTria* gauss_1=NULL;
+-	GaussTria* gauss_2=NULL;
++	int         normal_orientation=0;
++	IssmDouble  s1,s2;
++	IssmDouble  levelset[NUMVERTICES];
+ 
+-	/*Get material parameters :*/
+-	rho_ice=matpar->GetRhoIce();
++	/*Recover parameters and values*/
++	IssmDouble* xyz_zero = xNew<IssmDouble>(2*3);
++	GetInputListOnVertices(&levelset[0],levelsetenum);
+ 
+-	/*First off, check that this segment belongs to this element: */
+-	if (reCast<int>(*(segment+4))!=this->id)_error_("error message: segment with id " << reCast<int>(*(segment+4)) << " does not belong to element with id:" << this->id);
++	if(levelset[0]*levelset[1]>0.){ //Nodes 0 and 1 are similar, so points must be found on segment 0-2 and 1-2
++		/*Portion of the segments*/
++		s1=levelset[2]/(levelset[2]-levelset[1]);
++		s2=levelset[2]/(levelset[2]-levelset[0]);
+ 
+-	/*Recover segment node locations: */
+-	x1=*(segment+0); y1=*(segment+1); x2=*(segment+2); y2=*(segment+3);
++		if(levelset[2]<0.) normal_orientation=1; //orientation of quadrangle depending on distribution of levelsetfunction
++		/*New point 1*/
++		xyz_zero[3*normal_orientation+0]=xyz_list[2*3+0]+s1*(xyz_list[1*3+0]-xyz_list[2*3+0]);
++		xyz_zero[3*normal_orientation+1]=xyz_list[2*3+1]+s1*(xyz_list[1*3+1]-xyz_list[2*3+1]);
++		xyz_zero[3*normal_orientation+2]=xyz_list[2*3+2]+s1*(xyz_list[1*3+2]-xyz_list[2*3+2]);
+ 
+-	/*Get xyz list: */
+-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-
+-	/*get area coordinates of 0 and 1 locations: */
+-	gauss_1=new GaussTria();
+-	gauss_1->GaussFromCoords(x1,y1,&xyz_list[0][0]);
+-	gauss_2=new GaussTria();
+-	gauss_2->GaussFromCoords(x2,y2,&xyz_list[0][0]);
+-
+-	normal[0]=cos(atan2(x1-x2,y2-y1));
+-	normal[1]=sin(atan2(x1-x2,y2-y1));
+-
+-	length=sqrt(pow(x2-x1,2)+pow(y2-y1,2));
+-
+-	Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
+-	this->parameters->FindParam(&domaintype,DomainTypeEnum);
+-	Input* vx_input=NULL;
+-	Input* vy_input=NULL;
+-	if(domaintype==Domain2DhorizontalEnum){
+-		vx_input=inputs->GetInput(VxEnum); _assert_(vx_input);
+-		vy_input=inputs->GetInput(VyEnum); _assert_(vy_input);
++		/*New point 0*/
++		xyz_zero[3*(1-normal_orientation)+0]=xyz_list[2*3+0]+s2*(xyz_list[0*3+0]-xyz_list[2*3+0]);
++		xyz_zero[3*(1-normal_orientation)+1]=xyz_list[2*3+1]+s2*(xyz_list[0*3+1]-xyz_list[2*3+1]);
++		xyz_zero[3*(1-normal_orientation)+2]=xyz_list[2*3+2]+s2*(xyz_list[0*3+2]-xyz_list[2*3+2]);
+ 	}
+-	else{
+-		vx_input=inputs->GetInput(VxAverageEnum); _assert_(vx_input);
+-		vy_input=inputs->GetInput(VyAverageEnum); _assert_(vy_input);
+-	}
++	else if(levelset[1]*levelset[2]>0.){ //Nodes 1 and 2 are similar, so points must be found on segment 0-1 and 0-2
++		/*Portion of the segments*/
++		s1=levelset[0]/(levelset[0]-levelset[2]);
++		s2=levelset[0]/(levelset[0]-levelset[1]);
+ 
+-	thickness_input->GetInputValue(&h1, gauss_1);
+-	thickness_input->GetInputValue(&h2, gauss_2);
+-	vx_input->GetInputValue(&vx1,gauss_1);
+-	vx_input->GetInputValue(&vx2,gauss_2);
+-	vy_input->GetInputValue(&vy1,gauss_1);
+-	vy_input->GetInputValue(&vy2,gauss_2);
++		if(levelset[0]<0.) normal_orientation=1;
++		/*New point 1*/
++		xyz_zero[3*normal_orientation+0]=xyz_list[0*3+0]+s1*(xyz_list[2*3+0]-xyz_list[0*3+0]);
++		xyz_zero[3*normal_orientation+1]=xyz_list[0*3+1]+s1*(xyz_list[2*3+1]-xyz_list[0*3+1]);
++		xyz_zero[3*normal_orientation+2]=xyz_list[0*3+2]+s1*(xyz_list[2*3+2]-xyz_list[0*3+2]);
+ 
+-	mass_flux= rho_ice*length*(  
+-				(ONETHIRD*(h1-h2)*(vx1-vx2)+0.5*h2*(vx1-vx2)+0.5*(h1-h2)*vx2+h2*vx2)*normal[0]+
+-				(ONETHIRD*(h1-h2)*(vy1-vy2)+0.5*h2*(vy1-vy2)+0.5*(h1-h2)*vy2+h2*vy2)*normal[1]
+-				);
+-
+-	/*clean up and return:*/
+-	delete gauss_1;
+-	delete gauss_2;
+-	return mass_flux;
+-}
+-/*}}}*/
+-void       Tria::ElementResponse(IssmDouble* presponse,int response_enum){/*{{{*/
+-
+-	switch(response_enum){
+-		case MaterialsRheologyBbarEnum:
+-			*presponse=this->material->GetBbar();
+-			break;
+-
+-		case VelEnum:{
+-
+-			/*Get input:*/
+-			IssmDouble vel;
+-			Input* vel_input;
+-
+-			vel_input=this->inputs->GetInput(VelEnum); _assert_(vel_input);
+-			vel_input->GetInputAverage(&vel);
+-
+-			/*Assign output pointers:*/
+-			*presponse=vel;}
+-			break;
+-		default:  
+-			_error_("Response type " << EnumToStringx(response_enum) << " not supported yet!");
++		/*New point 2*/
++		xyz_zero[3*(1-normal_orientation)+0]=xyz_list[0*3+0]+s2*(xyz_list[1*3+0]-xyz_list[0*3+0]);
++		xyz_zero[3*(1-normal_orientation)+1]=xyz_list[0*3+1]+s2*(xyz_list[1*3+1]-xyz_list[0*3+1]);
++		xyz_zero[3*(1-normal_orientation)+2]=xyz_list[0*3+2]+s2*(xyz_list[1*3+2]-xyz_list[0*3+2]);
+ 	}
++	else if(levelset[0]*levelset[2]>0.){ //Nodes 0 and 2 are similar, so points must be found on segment 1-0 and 1-2
++		/*Portion of the segments*/
++		s1=levelset[1]/(levelset[1]-levelset[0]);
++		s2=levelset[1]/(levelset[1]-levelset[2]);
+ 
+-}
+-/*}}}*/
+-IssmDouble Tria::TotalSmb(void){/*{{{*/
++		if(levelset[1]<0.) normal_orientation=1;
++		/*New point 0*/
++		xyz_zero[3*normal_orientation+0]=xyz_list[1*3+0]+s1*(xyz_list[0*3+0]-xyz_list[1*3+0]);
++		xyz_zero[3*normal_orientation+1]=xyz_list[1*3+1]+s1*(xyz_list[0*3+1]-xyz_list[1*3+1]);
++		xyz_zero[3*normal_orientation+2]=xyz_list[1*3+2]+s1*(xyz_list[0*3+2]-xyz_list[1*3+2]);
+ 
+-	/*The smb[kg yr-1] of one element is area[m2] * smb [kg m^-2 yr^-1]*/
+-	IssmDouble base,smb,rho_ice;
+-	IssmDouble Total_Smb=0;
+-	IssmDouble xyz_list[NUMVERTICES][3];
+-
+-	/*Get material parameters :*/
+-	rho_ice=matpar->GetRhoIce();
+-
+-   if(!IsIceInElement())return 0;
+-
+-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-
+-	/*First calculate the area of the base (cross section triangle)
+-	 * http://en.wikipedia.org/wiki/Triangle
+-	 * base = 1/2 abs((xA-xC)(yB-yA)-(xA-xB)(yC-yA))*/
+-	base = 1./2. * fabs((xyz_list[0][0]-xyz_list[2][0])*(xyz_list[1][1]-xyz_list[0][1]) - (xyz_list[0][0]-xyz_list[1][0])*(xyz_list[2][1]-xyz_list[0][1]));	// area of element in m2
+-
+-	/*Now get the average SMB over the element*/
+-	Input* smb_input = inputs->GetInput(SurfaceforcingsMassBalanceEnum); _assert_(smb_input);
+-	smb_input->GetInputAverage(&smb);																								// average smb on element in m ice s-1
+-   Total_Smb=rho_ice*base*smb;																											// smb on element in kg s-1
+-
+-	/*Return: */
+-	return Total_Smb;
+-}
+-/*}}}*/
+-IssmDouble Tria::MisfitArea(int weightsenum){/*{{{*/
+-
+-	/*Intermediaries*/
+-	IssmDouble weight;
+-	IssmDouble Jdet;
+-	IssmDouble Jelem = 0;
+-	IssmDouble xyz_list[NUMVERTICES][3];
+-	GaussTria *gauss = NULL;
+-
+-	/*If on water, return 0: */
+-	if(!IsIceInElement())return 0;
+-
+-	/*Retrieve all inputs we will be needing: */
+-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-	Input* weights_input     =inputs->GetInput(weightsenum);     _assert_(weights_input);
+-
+-	/* Start  looping on the number of gaussian points: */
+-	gauss=new GaussTria(2);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-
+-		gauss->GaussPoint(ig);
+-
+-		/* Get Jacobian determinant: */
+-		GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);
+-
+-		/*Get parameters at gauss point*/
+-		weights_input->GetInputValue(&weight,gauss);
+-
+-		/*compute misfit between model and observation */
+-		Jelem+=Jdet*weight*gauss->weight;
++		/*New point 2*/
++		xyz_zero[3*(1-normal_orientation)+0]=xyz_list[1*3+0]+s2*(xyz_list[2*3+0]-xyz_list[1*3+0]);
++		xyz_zero[3*(1-normal_orientation)+1]=xyz_list[1*3+1]+s2*(xyz_list[2*3+1]-xyz_list[1*3+1]);
++		xyz_zero[3*(1-normal_orientation)+2]=xyz_list[1*3+2]+s2*(xyz_list[2*3+2]-xyz_list[1*3+2]);
+ 	}
++	else if(levelset[0]==0. && levelset[1]==0.){ //front is on point 0 and 1
++		xyz_zero[3*0+0]=xyz_list[0*3+0];
++		xyz_zero[3*0+1]=xyz_list[0*3+1];
++		xyz_zero[3*0+2]=xyz_list[0*3+2];
+ 
+-	/* clean up and Return: */
+-	delete gauss;
+-	return Jelem;
+-}
+-/*}}}*/
+-IssmDouble Tria::Misfit(int modelenum,int observationenum,int weightsenum){/*{{{*/
+-
+-	/*Intermediaries*/
+-	IssmDouble model,observation,weight;
+-	IssmDouble Jdet;
+-	IssmDouble Jelem = 0;
+-	IssmDouble xyz_list[NUMVERTICES][3];
+-	GaussTria *gauss = NULL;
+-
+-	/*If on water, return 0: */
+-	if(!IsIceInElement())return 0;
+-
+-	/*Retrieve all inputs we will be needing: */
+-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-	Input* model_input=inputs->GetInput(modelenum);   _assert_(model_input);
+-	Input* observation_input=inputs->GetInput(observationenum);_assert_(observation_input);
+-	Input* weights_input     =inputs->GetInput(weightsenum);     _assert_(weights_input);
+-
+-	/* Start  looping on the number of gaussian points: */
+-	gauss=new GaussTria(2);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-
+-		gauss->GaussPoint(ig);
+-
+-		/* Get Jacobian determinant: */
+-		GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);
+-
+-		/*Get parameters at gauss point*/
+-		model_input->GetInputValue(&model,gauss);
+-		observation_input->GetInputValue(&observation,gauss);
+-		weights_input->GetInputValue(&weight,gauss);
+-
+-		/*compute misfit between model and observation */
+-		Jelem+=0.5*(model-observation)*(model-observation)*Jdet*weight*gauss->weight;
++		/*New point 2*/
++		xyz_zero[3*1+0]=xyz_list[1*3+0];
++		xyz_zero[3*1+1]=xyz_list[1*3+1];
++		xyz_zero[3*1+2]=xyz_list[1*3+2];
+ 	}
++	else if(levelset[0]==0. && levelset[2]==0.){ //front is on point 0 and 1
++		xyz_zero[3*0+0]=xyz_list[2*3+0];
++		xyz_zero[3*0+1]=xyz_list[2*3+1];
++		xyz_zero[3*0+2]=xyz_list[2*3+2];
+ 
+-	/* clean up and Return: */
+-	delete gauss;
+-	return Jelem;
+-}
+-/*}}}*/
+-IssmDouble Tria::Masscon(IssmDouble* levelset){ /*{{{*/
+-
+-
+-	/*intermediary: */
+-	IssmDouble* values=NULL;
+-	Input*      thickness_input=NULL;
+-	IssmDouble  thickness;
+-	IssmDouble  weight;
+-	IssmDouble  Jdet;
+-	IssmDouble  volume;
+-	IssmDouble  rho_ice;
+-	IssmDouble* xyz_list=NULL;
+-	int         point1;
+-	IssmDouble  fraction1,fraction2;
+-	bool        mainlynegative=true;
+-	
+-	/*Output:*/
+-	volume=0;
+-
+-	/* Get node coordinates and dof list: */
+-	GetVerticesCoordinates(&xyz_list);
+-
+-	/*Retrieve inputs required:*/
+-	thickness_input=this->GetInput(ThicknessEnum); _assert_(thickness_input);
+-	
+-	/*Retrieve material parameters: */
+-	rho_ice=matpar->GetRhoIce();
+-
+-	/*Retrieve values of the levelset defining the masscon: */
+-	values = xNew<IssmDouble>(NUMVERTICES);
+-	for(int i=0;i<NUMVERTICES;i++){
+-		values[i]=levelset[this->vertices[i]->Sid()];
++		/*New point 2*/
++		xyz_zero[3*1+0]=xyz_list[0*3+0];
++		xyz_zero[3*1+1]=xyz_list[0*3+1];
++		xyz_zero[3*1+2]=xyz_list[0*3+2];
+ 	}
+-		
+-	/*Ok, use the level set values to figure out where we put our gaussian points:*/
+-	this->GetLevelsetPositivePart(&point1,&fraction1,&fraction2,&mainlynegative,values);
+-	Gauss* gauss = this->NewGauss(point1,fraction1,fraction2,mainlynegative,4);
++	else if(levelset[1]==0. && levelset[2]==0.){ //front is on point 0 and 1
++		xyz_zero[3*0+0]=xyz_list[1*3+0];
++		xyz_zero[3*0+1]=xyz_list[1*3+1];
++		xyz_zero[3*0+2]=xyz_list[1*3+2];
+ 
+-	volume=0;
+-
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		this->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		thickness_input->GetInputValue(&thickness, gauss);
+-
+-		volume+=thickness*gauss->weight*Jdet;
++		/*New point 2*/
++		xyz_zero[3*1+0]=xyz_list[2*3+0];
++		xyz_zero[3*1+1]=xyz_list[2*3+1];
++		xyz_zero[3*1+2]=xyz_list[2*3+2];
+ 	}
++	else _error_("Case not covered");
+ 
+-	/* clean up and Return: */
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(values);
+-	delete gauss;
+-	return rho_ice*volume;
++	/*Assign output pointer*/
++	*pxyz_zero= xyz_zero;
+ }
+ /*}}}*/
+ 
+@@ -2958,179 +3175,45 @@
+ /*}}}*/
+ #endif
+ 
+-void       Tria::InputControlUpdate(IssmDouble scalar,bool save_parameter){/*{{{*/
++#ifdef _HAVE_DAKOTA_
++void       Tria::InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols, int name, int type){/*{{{*/
+ 
+-	/*Intermediary*/
+-	int    num_controls;
+-	int*   control_type=NULL;
+-	Input* input=NULL;
++	int             i,t,row;
++	IssmDouble      time;
++	TransientInput *transientinput = NULL;
++	IssmDouble      values[3];
+ 
+-	/*retrieve some parameters: */
+-	this->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
+-	this->parameters->FindParam(&control_type,NULL,InversionControlParametersEnum);
++	/*Check that name is an element input*/
++	if (!IsInput(name)) return;
+ 
+-	for(int i=0;i<num_controls;i++){
+-		input=(Input*)this->inputs->GetInput(control_type[i]);   _assert_(input);
+-		if (input->ObjectEnum()!=ControlInputEnum){
+-			_error_("input " << EnumToStringx(control_type[i]) << " is not a ControlInput");
+-		}
++	switch(type){
+ 
+-		((ControlInput*)input)->UpdateValue(scalar);
+-		((ControlInput*)input)->Constrain();
+-		if (save_parameter) ((ControlInput*)input)->SaveValue();
++		case VertexEnum:
++			/*Create transient input: */
++			for(t=0;t<ncols;t++){ //ncols is the number of times
+ 
+-	}
++				/*create input values: */
++				for(i=0;i<3;i++){
++					row=this->vertices[i]->Sid();
++					values[i]=matrix[ncols*row+t];
++				}
+ 
+-	/*Clean up and return*/
+-	xDelete<int>(control_type);
+-}
+-/*}}}*/
+-void       Tria::ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){/*{{{*/
++				/*time:*/
++				time=matrix[(nrows-1)*ncols+t];
+ 
+-	int    vertexpidlist[NUMVERTICES];
+-	IssmDouble grad_list[NUMVERTICES];
+-	Input* grad_input=NULL;
++				if(t==0) transientinput=new TransientInput(name);
++				transientinput->AddTimeInput(new TriaInput(name,values,P1Enum),time);
++				transientinput->Configure(parameters);
++			}
++			this->inputs->AddInput(transientinput);
++			break;
+ 
+-	Input* input=inputs->GetInput(enum_type);
+-	if (!input) _error_("Input " << EnumToStringx(enum_type) << " not found");
+-	if (input->ObjectEnum()!=ControlInputEnum) _error_("Input " << EnumToStringx(enum_type) << " is not a ControlInput");
+-
+-	GradientIndexing(&vertexpidlist[0],control_index);
+-	for(int i=0;i<NUMVERTICES;i++) grad_list[i]=gradient[vertexpidlist[i]];
+-	grad_input=new TriaInput(GradientEnum,grad_list,P1Enum);
+-
+-	((ControlInput*)input)->SetGradient(grad_input);
+-
+-}/*}}}*/
+-void       Tria::ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum){/*{{{*/
+-
+-	Input* input=inputs->GetInput(control_enum);
+-	if (!input) _error_("Input " << EnumToStringx(control_enum) << " not found");
+-	if (input->ObjectEnum()!=ControlInputEnum) _error_("Input " << EnumToStringx(control_enum) << " is not a ControlInput");
+-
+-	int         sidlist[NUMVERTICES];
+-	int         connectivity[NUMVERTICES];
+-	IssmPDouble values[NUMVERTICES];
+-	IssmPDouble gradients[NUMVERTICES]; 
+-	IssmDouble  value,gradient;
+-
+-	this->GetVerticesConnectivityList(&connectivity[0]);
+-	this->GetVerticesSidList(&sidlist[0]);
+-
+-	GaussTria* gauss=new GaussTria();
+-	for (int iv=0;iv<NUMVERTICES;iv++){
+-		gauss->GaussVertex(iv);
+-
+-		((ControlInput*)input)->GetInputValue(&value,gauss);
+-		((ControlInput*)input)->GetGradientValue(&gradient,gauss);
+-
+-		values[iv]    = reCast<IssmPDouble>(value)/reCast<IssmPDouble>(connectivity[iv]);
+-		gradients[iv] = reCast<IssmPDouble>(gradient)/reCast<IssmPDouble>(connectivity[iv]);
++		default:
++			_error_("type " << type << " (" << EnumToStringx(type) << ") not implemented yet");
+ 	}
+-	delete gauss;
+ 
+-	vector_control->SetValues(NUMVERTICES,&sidlist[0],&values[0],ADD_VAL);
+-	vector_gradient->SetValues(NUMVERTICES,&sidlist[0],&gradients[0],ADD_VAL);
+-
+-}/*}}}*/
+-void       Tria::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data,bool onsid){/*{{{*/
+-
+-	int vertexidlist[NUMVERTICES];
+-	Input *input=NULL;
+-
+-	/*Get out if this is not an element input*/
+-	if(!IsInput(control_enum)) return;
+-
+-	/*Prepare index list*/
+-	GradientIndexing(&vertexidlist[0],control_index,onsid);
+-
+-	/*Get input (either in element or material)*/
+-	input=(Input*)this->inputs->GetInput(control_enum);   _assert_(input);
+-
+-	/*Check that it is a ControlInput*/
+-	if (input->ObjectEnum()!=ControlInputEnum){
+-		_error_("input " << EnumToStringx(control_enum) << " is not a ControlInput");
+-	}
+-
+-	((ControlInput*)input)->GetVectorFromInputs(vector,&vertexidlist[0],data);
+ }
+ /*}}}*/
+-void       Tria::SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){/*{{{*/
+-
+-	IssmDouble  values[NUMVERTICES];
+-	int         vertexpidlist[NUMVERTICES],control_init;
+-
+-
+-	/*Get Domain type*/
+-	int domaintype;
+-	parameters->FindParam(&domaintype,DomainTypeEnum);
+-
+-	/*Specific case for depth averaged quantities*/
+-	control_init=control_enum;
+-	if(domaintype==Domain2DverticalEnum){
+-		if(control_enum==MaterialsRheologyBbarEnum){
+-			control_enum=MaterialsRheologyBEnum;
+-			if(!IsOnBase()) return;
+-		}
+-		if(control_enum==DamageDbarEnum){
+-			control_enum=DamageDEnum;
+-			if(!IsOnBase()) return;
+-		}
+-	}
+-
+-	/*Get out if this is not an element input*/
+-	if(!IsInput(control_enum)) return;
+-
+-	/*Prepare index list*/
+-	GradientIndexing(&vertexpidlist[0],control_index);
+-
+-	/*Get values on vertices*/
+-	for(int i=0;i<NUMVERTICES;i++){
+-		values[i]=vector[vertexpidlist[i]];
+-	}
+-	Input* new_input = new TriaInput(control_enum,values,P1Enum);
+-	Input* input     = (Input*)this->inputs->GetInput(control_enum);   _assert_(input);
+-	if(input->ObjectEnum()!=ControlInputEnum){
+-		_error_("input " << EnumToStringx(control_enum) << " is not a ControlInput");
+-	}
+-
+-	((ControlInput*)input)->SetInput(new_input);
+-}
+-/*}}}*/
+-void       Tria::GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution, int enum_type){/*{{{*/
+-
+-	int        *doflist = NULL;
+-	IssmDouble  value;
+-
+-	/*Fetch number of nodes for this finite element*/
+-	int numnodes = this->NumberofNodes(this->element_type);
+-
+-	/*Fetch dof list and allocate solution vector*/
+-	GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
+-	IssmDouble* values = xNew<IssmDouble>(numnodes);
+-
+-	/*Get inputs*/
+-	Input* enum_input=inputs->GetInput(enum_type); _assert_(enum_input);
+-
+-	/*Ok, we have the values, fill in the array: */
+-	GaussTria* gauss=new GaussTria();
+-	for(int i=0;i<numnodes;i++){
+-		gauss->GaussNode(this->element_type,i);
+-
+-		enum_input->GetInputValue(&value,gauss);
+-		values[i]=value;
+-	}
+-
+-	solution->SetValues(numnodes,doflist,values,INS_VAL);
+-
+-	/*Free ressources:*/
+-	xDelete<int>(doflist);
+-	xDelete<IssmDouble>(values);
+-	delete gauss;
+-}
+-/*}}}*/
+-
+-#ifdef _HAVE_DAKOTA_
+ void       Tria::InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){/*{{{*/
+ 
+ 	int i,j;
+@@ -3222,89 +3305,4 @@
+ 
+ }
+ /*}}}*/
+-void       Tria::InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols, int name, int type){/*{{{*/
+-
+-	int             i,t,row;
+-	IssmDouble      time;
+-	TransientInput *transientinput = NULL;
+-	IssmDouble      values[3];
+-
+-	/*Check that name is an element input*/
+-	if (!IsInput(name)) return;
+-
+-	switch(type){
+-
+-		case VertexEnum:
+-			/*Create transient input: */
+-			for(t=0;t<ncols;t++){ //ncols is the number of times
+-
+-				/*create input values: */
+-				for(i=0;i<3;i++){
+-					row=this->vertices[i]->Sid();
+-					values[i]=matrix[ncols*row+t];
+-				}
+-
+-				/*time:*/
+-				time=matrix[(nrows-1)*ncols+t];
+-
+-				if(t==0) transientinput=new TransientInput(name);
+-				transientinput->AddTimeInput(new TriaInput(name,values,P1Enum),time);
+-				transientinput->Configure(parameters);
+-			}
+-			this->inputs->AddInput(transientinput);
+-			break;
+-
+-		default:
+-			_error_("type " << type << " (" << EnumToStringx(type) << ") not implemented yet");
+-	}
+-
+-}
+-/*}}}*/
+ #endif
+-
+-void       Tria::PotentialUngrounding(Vector<IssmDouble>* potential_ungrounding){/*{{{*/
+-
+-	IssmDouble  h[NUMVERTICES],r[NUMVERTICES],gl[NUMVERTICES];
+-	IssmDouble  bed_hydro;
+-	IssmDouble  rho_water,rho_ice,density;
+-
+-	/*material parameters: */
+-	rho_water=matpar->GetRhoWater();
+-	rho_ice=matpar->GetRhoIce();
+-	density=rho_ice/rho_water;
+-	GetInputListOnVertices(&h[0],ThicknessEnum);
+-	GetInputListOnVertices(&r[0],BedEnum);
+-	GetInputListOnVertices(&gl[0],MaskGroundediceLevelsetEnum);
+-
+-	/*go through vertices, and figure out which ones are grounded and want to unground: */
+-	for(int i=0;i<NUMVERTICES;i++){
+-		/*Find if grounded vertices want to start floating*/
+-		if (gl[i]>0.){
+-			bed_hydro=-density*h[i];
+-			if(bed_hydro>r[i]){
+-				/*Vertex that could potentially unground, flag it*/
+-				potential_ungrounding->SetValue(vertices[i]->Pid(),1,INS_VAL);
+-			}
+-		}
+-	}
+-}
+-/*}}}*/
+-int        Tria::UpdatePotentialUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf){/*{{{*/
+-
+-	int i;
+-	int nflipped=0;
+-
+-	/*Go through nodes, and whoever is on the potential_ungrounding, ends up in nodes_on_iceshelf: */
+-	for(i=0;i<3;i++){
+-		if (reCast<bool>(vertices_potentially_ungrounding[vertices[i]->Pid()])){
+-			vec_nodes_on_iceshelf->SetValue(vertices[i]->Pid(),-1.,INS_VAL);
+-
+-			/*If node was not on ice shelf, we flipped*/
+-			if(nodes_on_iceshelf[vertices[i]->Pid()]>=0.){
+-				nflipped++;
+-			}
+-		}
+-	}
+-	return nflipped;
+-}
+-/*}}}*/
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18910)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18911)
+@@ -41,105 +41,101 @@
+ 		Object *copy();
+ 		/*}}}*/
+ 		/*Update virtual functions resolution: {{{*/
+-		void  InputUpdateFromVector(IssmDouble* vector, int name, int type);
+ 		#ifdef _HAVE_DAKOTA_
++		void  InputUpdateFromMatrixDakota(IssmDouble* matrix, int nows, int ncols, int name, int type);
+ 		void  InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type);
+-		void  InputUpdateFromMatrixDakota(IssmDouble* matrix, int nows, int ncols, int name, int type);
+ 		#endif
+ 		void  InputUpdateFromIoModel(int index, IoModel* iomodel);
++		void  InputUpdateFromVector(IssmDouble* vector, int name, int type);
+ 		/*}}}*/
+ 		/*Element virtual functions definitions: {{{*/
++		void        AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part);
++		void			CalvingRateLevermann();
+ 		IssmDouble  CharacteristicLength(void);
+ 		void        ComputeBasalStress(Vector<IssmDouble>* sigma_b);
++		void        ComputeDeviatoricStressTensor();
+ 		void        ComputeSigmaNN();
+ 		void        ComputeStressTensor();
+-		void        ComputeDeviatoricStressTensor();
+-		void			StrainRateparallel();
+-		void			StrainRateperpendicular();
+ 		void        ComputeSurfaceNormalVelocity();
+-		void        StressIntensityFactor(void){_error_("not implemented yet");};
+-		void			CalvingRateLevermann();
+ 		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters);
+-		void        SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters);
+-		void        ResetHooks();
++		void        ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index);
++		void        ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum);
+ 		void        Delta18oParameterization(void);
++		int         EdgeOnBaseIndex();
++		void        EdgeOnBaseIndices(int* pindex1,int* pindex);
++		int         EdgeOnSurfaceIndex();
++		void        EdgeOnSurfaceIndices(int* pindex1,int* pindex);
++		void        ElementResponse(IssmDouble* presponse,int response_enum);
+ 		void        ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz);
++		int         FiniteElement(void);
+ 		void        FSContactMigration(Vector<IssmDouble>* vertexgrounded,Vector<IssmDouble>* vertexfloating);
+-		int         FiniteElement(void);
+-		Element*    GetUpperElement(void){_error_("not implemented yet");};
+ 		Element*    GetBasalElement(void){_error_("not implemented yet");};
+ 		void        GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues);
+ 		void        GetGroundedPart(int* point1,IssmDouble* fraction1, IssmDouble* fraction2,bool* mainlyfloating);
+ 		IssmDouble  GetGroundedPortion(IssmDouble* xyz_list);
++		void	      GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum);
++		void	      GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level);
+ 		int         GetNodeIndex(Node* node);
+ 		int         GetNumberOfNodes(void);
+ 		int         GetNumberOfNodes(int enum_type);
+ 		int         GetNumberOfVertices(void);
+-		bool        IsOnBase();
+-		bool        IsOnSurface();
+-		bool        HasEdgeOnBase();
+-		bool        HasEdgeOnSurface();
+-		void        EdgeOnSurfaceIndices(int* pindex1,int* pindex);
+-		void        EdgeOnBaseIndices(int* pindex1,int* pindex);
+-		int         EdgeOnBaseIndex();
+-		int         EdgeOnSurfaceIndex();
+-		bool        IsNodeOnShelfFromFlags(IssmDouble* flags);
+-		int         NumberofNodesVelocity(void);
+-		int         NumberofNodesPressure(void);
+ 		void        GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int enum_type);
++		Element*    GetUpperElement(void){_error_("not implemented yet");};
++		void        GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid);
+ 		void        GetVerticesCoordinatesBase(IssmDouble** pxyz_list);
+ 		void        GetVerticesCoordinatesTop(IssmDouble** pxyz_list);
++		bool        HasEdgeOnBase();
++		bool        HasEdgeOnSurface();
++		IssmDouble  IceVolume(void);
++		IssmDouble  IceVolumeAboveFloatation(void);
++		void        InputControlUpdate(IssmDouble scalar,bool save_parameter);
+ 		void        InputDepthAverageAtBase(int enum_type,int average_enum_type);
+ 		void        InputExtrude(int enum_type,int start){_error_("not implemented"); /*For penta only*/};
+ 		void        InputScale(int enum_type,IssmDouble scale_factor);
++		bool	   	IsFaceOnBoundary(void);
++		bool	   	IsIcefront(void);
++		bool        IsNodeOnShelfFromFlags(IssmDouble* flags);
++		bool        IsOnBase();
++		bool        IsOnSurface();
++		bool        IsZeroLevelset(int levelset_enum);
++		IssmDouble  Masscon(IssmDouble* levelset);
++		IssmDouble  MassFlux(IssmDouble* segment);
++		IssmDouble  MassFlux(IssmDouble x1,IssmDouble y1, IssmDouble x2, IssmDouble y2,int segment_id);
+ 		void        MaterialUpdateFromTemperature(void){_error_("not implemented yet");};
++		IssmDouble  Misfit(int modelenum,int observationenum,int weightsenum);
++		IssmDouble  MisfitArea(int weightsenum);
+ 		int         NodalValue(IssmDouble* pvalue, int index, int natureofdataenum);
++		int         NumberofNodesPressure(void);
++		int         NumberofNodesVelocity(void);
+ 		void        PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm);
++		void        PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding);
++		int         PressureInterpolation();
+ 		void        ReduceMatrices(ElementMatrix* Ke,ElementVector* pe);
+ 		void        ResetFSBasalBoundaryCondition(void);
++		void        ResetHooks();
++		void        SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index);
++		void        SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters);
+ 	   Element*    SpawnBasalElement(void);
+ 		Element*    SpawnTopElement(void);
+-		int         VelocityInterpolation();
+-		int         PressureInterpolation();
++		void			StrainRateparallel();
++		void			StrainRateperpendicular();
++		void        StressIntensityFactor(void){_error_("not implemented yet");};
++		IssmDouble  SurfaceArea(void);
+ 		int         TensorInterpolation();
+-		IssmDouble  SurfaceArea(void);
++		IssmDouble  TimeAdapt();
++		IssmDouble  TotalSmb(void);
+ 		void        Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement);
+-		IssmDouble  TimeAdapt();
++		int         UpdatePotentialUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf);
++		void        ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss);
+ 		void        ValueP1OnGauss(IssmDouble* pvalue,IssmDouble* values,Gauss* gauss);
+-		void        ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss);
++		int         VelocityInterpolation();
+ 		int         VertexConnectivity(int vertexindex);
+ 		void        VerticalSegmentIndices(int** pindices,int* pnumseg){_error_("not implemented yet");};
+ 		void        ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum);
+-		void	      GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum);
+-		void	      GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level);
+-		bool        IsZeroLevelset(int levelset_enum);
+-		bool	   	IsIcefront(void);
+-		bool	   	IsFaceOnBoundary(void);
+ 
+-		void       AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part);
+-		IssmDouble IceVolume(void);
+-		IssmDouble IceVolumeAboveFloatation(void);
+-		IssmDouble TotalSmb(void);
+-		IssmDouble MassFlux(IssmDouble* segment);
+-		IssmDouble MassFlux(IssmDouble x1,IssmDouble y1, IssmDouble x2, IssmDouble y2,int segment_id);
+-		void       ElementResponse(IssmDouble* presponse,int response_enum);
+-		IssmDouble Masscon(IssmDouble* levelset);
+-		IssmDouble Misfit(int modelenum,int observationenum,int weightsenum);
+-		IssmDouble MisfitArea(int weightsenum);
+-
+ 		#ifdef _HAVE_GIA_
+ 		void   GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,IssmDouble* x,IssmDouble* y);
+ 		#endif
+-
+-		void       GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid);
+-		void       SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index);
+-		void       ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index);
+-		void       ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum);
+-		void       InputControlUpdate(IssmDouble scalar,bool save_parameter);
+-
+-		void   PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding);
+-		int    UpdatePotentialUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf);
+-
+ 		/*}}}*/
+ 		/*Tria specific routines:{{{*/
+ 		void           AddBasalInput(int input_enum, IssmDouble* values, int interpolation_enum);
+@@ -147,18 +143,15 @@
+ 		IssmDouble     GetArea(void);
+ 		void           GetAreaCoordinates(IssmDouble *area_coordinates,IssmDouble* xyz_zero,IssmDouble* xyz_list,int numpoints);
+ 		int            GetElementType(void);
+-		void           NormalSection(IssmDouble* normal,IssmDouble* xyz_list);
+-		void           NormalTop(IssmDouble* normal,IssmDouble* xyz_list);
+-		void           NormalBase(IssmDouble* normal,IssmDouble* xyz_list);
+ 		void           GetInputValue(IssmDouble* pvalue,Node* node,int enumtype);
+ 		void           GetMaterialInputValue(IssmDouble* pvalue,Node* node,int enumtype);
+ 		Node*          GetNode(int node_number);
+ 		void	         InputUpdateFromSolutionOneDof(IssmDouble* solution,int enum_type);
+ 		void	         InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int enum_type){_error_("not implemented yet");};
+ 		void           JacobianDeterminant(IssmDouble*  pJdet, IssmDouble* xyz_list,Gauss* gauss);
++		void           JacobianDeterminantBase(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss);
+ 		void           JacobianDeterminantLine(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
+ 		void           JacobianDeterminantSurface(IssmDouble*  pJdet, IssmDouble* xyz_list,Gauss* gauss);
+-		void           JacobianDeterminantBase(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss);
+ 		void           JacobianDeterminantTop(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss);
+ 		IssmDouble     MinEdgeLength(IssmDouble* xyz_list){_error_("not implemented yet");};
+ 		Gauss*         NewGauss(void);
+@@ -170,23 +163,25 @@
+ 		Gauss*         NewGaussLine(int vertex1,int vertex2,int order){_error_("not implemented yet");};
+ 		Gauss*         NewGaussTop(int order);
+ 		void           NodalFunctions(IssmDouble* basis,Gauss* gauss);
+-		void           NodalFunctionsP1(IssmDouble* basis,Gauss* gauss);
+-		void           NodalFunctionsP2(IssmDouble* basis,Gauss* gauss);
+ 		void           NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
+-		void           NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
++		void           NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
+ 		void           NodalFunctionsMINIDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
+-		void           NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
+-		void           NodalFunctionsVelocity(IssmDouble* basis,Gauss* gauss);
+ 		void           NodalFunctionsPressure(IssmDouble* basis,Gauss* gauss);
++		void           NodalFunctionsP1(IssmDouble* basis,Gauss* gauss);
++		void           NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
++		void           NodalFunctionsP2(IssmDouble* basis,Gauss* gauss);
+ 		void           NodalFunctionsTensor(IssmDouble* basis,Gauss* gauss);
++		void           NodalFunctionsVelocity(IssmDouble* basis,Gauss* gauss);
++		void           NormalBase(IssmDouble* normal,IssmDouble* xyz_list);
++		void           NormalSection(IssmDouble* normal,IssmDouble* xyz_list);
++		void           NormalTop(IssmDouble* normal,IssmDouble* xyz_list);
+ 		void	         SetClone(int* minranks);
+ 		void           SetTemporaryElementType(int element_type_in){_error_("not implemented yet");};
+ 		Seg*	         SpawnSeg(int index1,int index2);
+ 		IssmDouble     StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa){_error_("not implemented yet");};
++		void           UpdateConstraintsExtrudeFromBase(void);
++		void           UpdateConstraintsExtrudeFromTop(void);
+ 		void           ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){_error_("not implemented yet");};
+-
+-		void UpdateConstraintsExtrudeFromBase(void);
+-		void UpdateConstraintsExtrudeFromTop(void);
+ 		/*}}}*/
+ 
+ };
Index: /issm/oecreview/Archive/18296-19100/ISSM-18911-18912.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18911-18912.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18911-18912.diff	(revision 19102)
@@ -0,0 +1,837 @@
+Index: ../trunk-jpl/src/c/classes/kriging/Covertree.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/Covertree.cpp	(revision 18911)
++++ ../trunk-jpl/src/c/classes/kriging/Covertree.cpp	(revision 18912)
+@@ -1,12 +1,478 @@
+ #include "../classes.h"
++//#include <utility>
++#include <set>
+ 
+ 	/*Constructors/Destructors*/
+-Covertree::Covertree(){/*{{{*/
+-	_error_("Constructor not supported");
++Covertree::Covertree(const double& maxDist,const std::vector<Observation>& points){
++	this->base = 2.;
++	_root=NULL;
++	_numNodes=0;
++	_maxLevel=ceilf(log(maxDist)/log(base));
++	_minLevel=_maxLevel-1;
++	std::vector<Observation>::const_iterator it;
++	for(it=points.begin(); it!=points.end(); ++it) {
++		this->insert(*it);//adds data to the covertree object
++	}
+ }
+-/*}}}*/
+-Covertree::~Covertree(){/*{{{*/
++
++Covertree::~Covertree(){
++	if(_root==NULL) return;
++	//Get all of the root's children (from any level),
++	//delete the root, repeat for each of the children
++	std::vector<CoverTreeNode*> nodes;
++	nodes.push_back(_root);
++	while(!nodes.empty()) {
++		CoverTreeNode* byeNode = nodes[0];
++		nodes.erase(nodes.begin());
++		std::vector<CoverTreeNode*> children = byeNode->getAllChildren();
++		nodes.insert(nodes.begin(),children.begin(),children.end());
++		//std::cout << _numNodes << "\n";
++		delete byeNode;
++		//_numNodes--;
++	}   
+ }
+-/*}}}*/
+ 
++std::vector<Covertree::CoverTreeNode*> Covertree::kNearestNodes(const Observation& p, const unsigned int& k) const{
++	if(_root==NULL) return std::vector<CoverTreeNode*>();
++	//maxDist is the kth nearest known point to p, and also the farthest
++	//point from p in the set minNodes defined below.
++	double maxDist = p.distance(_root->getObservation());
++	//minNodes stores the k nearest known points to p.
++	std::set<distNodePair> minNodes;
++
++	minNodes.insert(std::make_pair(maxDist,_root));
++	std::vector<distNodePair> Qj(1,std::make_pair(maxDist,_root));
++	for(int level = _maxLevel; level>=_minLevel;level--) {
++		std::vector<distNodePair>::const_iterator it;
++		int size = Qj.size();
++		for(int i=0; i<size; i++) {
++			std::vector<CoverTreeNode*> children =
++			  Qj[i].second->getChildren(level);
++			std::vector<CoverTreeNode*>::const_iterator it2;
++			for(it2=children.begin(); it2!=children.end(); ++it2) {
++				double d = p.distance((*it2)->getObservation());
++				if(d < maxDist || minNodes.size() < k) {
++					minNodes.insert(std::make_pair(d,*it2));
++					//--minNodes.end() gives us an iterator to the greatest
++					//element of minNodes.
++					if(minNodes.size() > k) minNodes.erase(--minNodes.end());
++					maxDist = (--minNodes.end())->first;
++				}
++				Qj.push_back(std::make_pair(d,*it2));
++			}
++		}
++		double sep = maxDist + pow(base, level);
++		size = Qj.size();
++		for(int i=0; i<size; i++) {
++			if(Qj[i].first > sep) {
++				//quickly removes an element from a vector w/o preserving order.
++				Qj[i]=Qj.back();
++				Qj.pop_back();
++				size--; i--;
++			}
++		}
++	}
++	std::vector<CoverTreeNode*> kNN;
++	std::set<distNodePair>::const_iterator it;
++	for(it=minNodes.begin();it!=minNodes.end();++it) {
++		kNN.push_back(it->second);
++	}
++	return kNN;
++}
++bool Covertree::insert_rec(const Observation& p,
++			const std::vector<distNodePair>& Qi,
++			const int& level)
++{
++	std::vector<std::pair<double, CoverTreeNode*> > Qj;
++	double sep = pow(base,level);
++	double minDist = 1.e+50;
++	std::pair<double,CoverTreeNode*> minQiDist(1.e+50,NULL);
++	std::vector<std::pair<double, CoverTreeNode*> >::const_iterator it;
++	for(it=Qi.begin(); it!=Qi.end(); ++it) {
++		if(it->first<minQiDist.first) minQiDist = *it;
++		if(it->first<minDist) minDist=it->first;
++		if(it->first<=sep) Qj.push_back(*it);
++		std::vector<CoverTreeNode*> children = it->second->getChildren(level);
++		std::vector<CoverTreeNode*>::const_iterator it2;
++		for(it2=children.begin();it2!=children.end();++it2) {
++			double d = p.distance((*it2)->getObservation());
++			if(d<minDist) minDist = d;
++			if(d<=sep) {
++				Qj.push_back(std::make_pair(d,*it2));
++			}
++		}
++	}
++	//std::cout << "level: " << level << ", sep: " << sep << ", dist: " << minQDist.first << "\n";
++	if(minDist > sep) {
++		return true;
++	} else {
++		bool found = insert_rec(p,Qj,level-1);
++		//distNodePair minQiDist = distance(p,Qi);
++		if(found && minQiDist.first <= sep) {
++			if(level-1<_minLevel) _minLevel=level-1;
++			minQiDist.second->addChild(level,
++						new CoverTreeNode(p));
++			//std::cout << "parent is ";
++			//minQiDist.second->getObservation().print();
++			_numNodes++;
++			return false;
++		} else {
++			return found;
++		}
++	}
++}
++
++void Covertree::remove_rec(const Observation& p,
++			std::map<int,std::vector<distNodePair> >& coverSets,
++			int level,
++			bool& multi)
++{
++	std::vector<distNodePair>& Qi = coverSets[level];
++	std::vector<distNodePair>& Qj = coverSets[level-1];
++	double minDist = 1.e+50;
++	CoverTreeNode* minNode = _root;
++	CoverTreeNode* parent = 0;
++	double sep = pow(base, level);
++	std::vector<distNodePair>::const_iterator it;
++	//set Qj to be all children q of Qi such that p.distance(q)<=sep
++	//and also keep track of the minimum distance from p to a node in Qj
++	//note that every node has itself as a child, but the
++	//getChildren function only returns non-self-children.
++	for(it=Qi.begin();it!=Qi.end();++it) {
++		std::vector<CoverTreeNode*> children = it->second->getChildren(level);
++		double dist = it->first;
++		if(dist<minDist) {
++			minDist = dist;
++			minNode = it->second;
++		}
++		if(dist <= sep) {
++			Qj.push_back(*it);
++		}
++		std::vector<CoverTreeNode*>::const_iterator it2;
++		for(it2=children.begin();it2!=children.end();++it2) {
++			dist = p.distance((*it2)->getObservation());
++			if(dist<minDist) {
++				minDist = dist;
++				minNode = *it2;
++				if(dist == 0.0) parent = it->second;
++			}
++			if(dist <= sep) {
++				Qj.push_back(std::make_pair(dist,*it2));
++			}
++		}
++	}
++	if(level>_minLevel) remove_rec(p,coverSets,level-1,multi);
++	if(minNode->hasObservation(p)) {
++		//the multi flag indicates the point we removed is from a
++		//node containing multiple points, and we have removed it,
++		//so we don't need to do anything else.
++		if(multi) return;
++		if(!minNode->isSingle()) {
++			minNode->removeObservation(p);
++			multi=true;
++			return;
++		}
++		if(parent!=NULL) parent->removeChild(level, minNode);
++		std::vector<CoverTreeNode*> children = minNode->getChildren(level-1);
++		std::vector<distNodePair>& Q = coverSets[level-1];
++		if(Q.size()==1 && Q[0].second==minNode) {
++			Q.pop_back();
++		} else {
++			for(unsigned int i=0;i<Q.size();i++) {
++				if(Q[i].second==minNode) {
++					Q[i]=Q.back();
++					Q.pop_back();
++					break;
++				}
++			}
++		}
++		std::vector<CoverTreeNode*>::const_iterator it;
++		for(it=children.begin();it!=children.end();++it) {
++			int i = level-1;
++			Observation q = (*it)->getObservation();
++			double minDQ = 1.e+50;
++			CoverTreeNode* minDQNode = nullptr;
++			double sep = pow(base,i);
++			bool br=false;
++			while(true) {
++				std::vector<distNodePair>&
++				  Q = coverSets[i];
++				std::vector<distNodePair>::const_iterator it2;
++				minDQ = 1.e+50;
++				for(it2=Q.begin();it2!=Q.end();++it2) {
++					double d = q.distance(it2->second->getObservation());
++					if(d<minDQ) {
++						minDQ = d;
++						minDQNode = it2->second;
++						if(d <=sep) {
++							br=true;
++							break;
++						}
++					}
++				}
++				minDQ=1.e+50;
++				if(br) break;
++				Q.push_back(std::make_pair((*it)->distance(p),*it));
++				i++;
++				sep = pow(base,i);
++			}
++			//minDQNode->getObservation().print();
++			//std::cout << " is level " << i << " parent of ";
++			//(*it)->getObservation().print();
++			if (minDQNode != nullptr)
++			 minDQNode->addChild(i,*it);
++		}
++		if(parent!=NULL) {
++			delete minNode;
++			_numNodes--;
++		}
++	}
++}
++
++int Covertree::get_numberofobs(){
++	return _numNodes;
++}
++
++std::pair<double, Covertree::CoverTreeNode*>
++Covertree::distance(const Observation& p,
++			const std::vector<CoverTreeNode*>& Q)
++{
++	double minDist = 1.e+50;
++	CoverTreeNode* minNode;
++	std::vector<CoverTreeNode*>::const_iterator it;
++	for(it=Q.begin();it!=Q.end();++it) {
++		double dist = p.distance((*it)->getObservation());
++		if(dist < minDist) {
++			minDist = dist;
++			minNode = *it;
++		}
++	}
++	return std::make_pair(minDist,minNode);  
++}
++
++void Covertree::insert(const Observation& newObservation)
++{
++	if(_root==NULL) {
++		_root = new CoverTreeNode(newObservation);
++		_numNodes=1;
++		return;
++	}
++	//TODO: this is pretty inefficient, there may be a better way
++	//to check if the node already exists...
++	CoverTreeNode* n = kNearestNodes(newObservation,1)[0];
++	if(newObservation.distance(n->getObservation())==0.0) {
++		n->addObservation(newObservation);
++	} else {
++		//insert_rec acts under the assumption that there are no nodes with
++		//distance 0 to newObservation in the cover tree (the previous lines check it)
++		insert_rec(newObservation,
++					std::vector<distNodePair>
++					(1,std::make_pair(_root->distance(newObservation),_root)),
++					_maxLevel);
++	}
++}
++
++void Covertree::remove(const Observation& p)
++{
++	//Most of this function's code is for the special case of removing the root
++	if(_root==NULL) return;
++	bool removingRoot=_root->hasObservation(p);
++	if(removingRoot && !_root->isSingle()) {
++		_root->removeObservation(p);
++		return;
++	}
++	CoverTreeNode* newRoot=NULL;
++	if(removingRoot) {
++		if(_numNodes==1) {
++			//removing the last node...
++			delete _root;
++			_numNodes--;
++			_root=NULL;
++			return;
++		} else {
++			for(int i=_maxLevel;i>_minLevel;i--) {
++				if(!(_root->getChildren(i).empty())) {
++					newRoot = _root->getChildren(i).back();
++					_root->removeChild(i,newRoot);
++					break;
++				}
++			}
++		}
++	}
++	std::map<int, std::vector<distNodePair> > coverSets;
++	coverSets[_maxLevel].push_back(std::make_pair(_root->distance(p),_root));
++	if(removingRoot)
++	 coverSets[_maxLevel].push_back(std::make_pair(newRoot->distance(p),newRoot));
++	bool multi = false;
++	remove_rec(p,coverSets,_maxLevel,multi);
++	if(removingRoot) {
++		delete _root;
++		_numNodes--;
++		_root=newRoot;
++	}
++}
++
++std::vector<Observation> Covertree::kNearestNeighbors(const Observation& p,
++			const unsigned int& k) const
++{
++	if(_root==NULL) return std::vector<Observation>();
++	std::vector<CoverTreeNode*> v = kNearestNodes(p, k);
++	std::vector<Observation> kNN;
++	std::vector<CoverTreeNode*>::const_iterator it;
++	for(it=v.begin();it!=v.end();++it) {
++		const std::vector<Observation>& p = (*it)->getObservations();
++		kNN.insert(kNN.end(),p.begin(),p.end());
++		if(kNN.size() >= k) break;
++	}
++	return kNN;
++}
++
++void Covertree::print() const
++{
++	int d = _maxLevel-_minLevel+1;
++	std::vector<CoverTreeNode*> Q;
++	Q.push_back(_root);
++	for(int i=0;i<d;i++) {
++		std::cout << "LEVEL " << _maxLevel-i << "\n";
++		std::vector<CoverTreeNode*>::const_iterator it;
++		for(it=Q.begin();it!=Q.end();++it) {
++			(*it)->getObservation().print();
++			std::vector<CoverTreeNode*>
++			  children = (*it)->getChildren(_maxLevel-i);
++			std::vector<CoverTreeNode*>::const_iterator it2;
++			for(it2=children.begin();it2!=children.end();++it2) {
++				std::cout << "  ";
++				(*it2)->getObservation().print();
++			}
++		}
++		std::vector<CoverTreeNode*> newQ;
++		for(it=Q.begin();it!=Q.end();++it) {
++			std::vector<CoverTreeNode*>
++			  children = (*it)->getChildren(_maxLevel-i);
++			newQ.insert(newQ.end(),children.begin(),children.end());
++		}
++		Q.insert(Q.end(),newQ.begin(),newQ.end());
++		std::cout << "\n\n";
++	}
++}
++
++Covertree::CoverTreeNode* Covertree::getRoot() const
++{
++	return _root;
++}
++
++Covertree::CoverTreeNode::CoverTreeNode(const Observation& p) {
++	_observations.push_back(p);
++}
++
++std::vector<Covertree::CoverTreeNode*>
++Covertree::CoverTreeNode::getChildren(int level) const
++{
++	std::map<int,std::vector<CoverTreeNode*> >::const_iterator
++	  it = _childMap.find(level);
++	if(it!=_childMap.end()) {
++		return it->second;
++	}
++	return std::vector<CoverTreeNode*>();
++}
++
++void Covertree::CoverTreeNode::addChild(int level, CoverTreeNode* p)
++{
++	_childMap[level].push_back(p);
++}
++
++void Covertree::CoverTreeNode::removeChild(int level, CoverTreeNode* p)
++{
++	std::vector<CoverTreeNode*>& v = _childMap[level];
++	for(unsigned int i=0;i<v.size();i++) {
++		if(v[i]==p) {
++			v[i]=v.back();
++			v.pop_back();
++			break;
++		}
++	}
++}
++
++void Covertree::CoverTreeNode::addObservation(const Observation& p)
++{
++	if(find(_observations.begin(), _observations.end(), p) == _observations.end())
++	 _observations.push_back(p);
++}
++
++void Covertree::CoverTreeNode::removeObservation(const Observation& p)
++{
++	std::vector<Observation>::iterator it =
++	  find(_observations.begin(), _observations.end(), p);
++	if(it != _observations.end())
++	 _observations.erase(it);
++}
++
++double Covertree::CoverTreeNode::distance(const CoverTreeNode& p) const
++{
++	return _observations[0].distance(p.getObservation());
++}
++
++bool Covertree::CoverTreeNode::isSingle() const
++{
++	return _observations.size() == 1;
++}
++
++bool Covertree::CoverTreeNode::hasObservation(const Observation& p) const
++{
++	return find(_observations.begin(), _observations.end(), p) != _observations.end();
++}
++
++const Observation& Covertree::CoverTreeNode::getObservation() const { return _observations[0]; }
++
++std::vector<Covertree::CoverTreeNode*>
++Covertree::CoverTreeNode::getAllChildren() const
++{
++	std::vector<CoverTreeNode*> children;
++	std::map<int,std::vector<CoverTreeNode*> >::const_iterator it;
++	for(it=_childMap.begin();it!=_childMap.end();++it) {
++		children.insert(children.end(), it->second.begin(), it->second.end());
++	}
++	return children;
++}
++
++bool Covertree::isValidTree() const {
++	if(_numNodes==0)
++	 return _root==NULL;
++
++	std::vector<CoverTreeNode*> nodes;
++	nodes.push_back(_root);
++	for(int i=_maxLevel;i>_minLevel;i--) {
++		double sep = pow(base,i);
++		std::vector<CoverTreeNode*>::const_iterator it, it2;
++		//verify separation invariant of cover tree: for each level,
++		//every point is farther than base^level away
++		for(it=nodes.begin(); it!=nodes.end(); ++it) {
++			for(it2=nodes.begin(); it2!=nodes.end(); ++it2) {
++				double dist=(*it)->distance((*it2)->getObservation());
++				if(dist<=sep && dist!=0.0) {
++					std::cout << "Level " << i << " Separation invariant failed.\n";
++					return false;
++				}
++			}
++		}
++		std::vector<CoverTreeNode*> allChildren;
++		for(it=nodes.begin(); it!=nodes.end(); ++it) {        
++			std::vector<CoverTreeNode*> children = (*it)->getChildren(i);
++			//verify covering tree invariant: the children of node n at level
++			//i are no further than base^i away
++			for(it2=children.begin(); it2!=children.end(); ++it2) {
++				double dist = (*it2)->distance((*it)->getObservation());
++				if(dist>sep) {
++					std::cout << "Level" << i << " covering tree invariant failed.n";
++					return false;
++				}
++			}
++			allChildren.insert
++			  (allChildren.end(),children.begin(),children.end());
++		}
++		nodes.insert(nodes.begin(),allChildren.begin(),allChildren.end());
++	}
++	return true;
++}
++
+ 	/*Methods*/
+Index: ../trunk-jpl/src/c/classes/kriging/Observation.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/Observation.h	(revision 18911)
++++ ../trunk-jpl/src/c/classes/kriging/Observation.h	(revision 18912)
+@@ -19,16 +19,23 @@
+ 		/*Observation constructors, destructors*/
+ 		Observation();
+ 		Observation(double x_in,double y_in,int xi_in,int yi_in,int index_in,double value_in);
++		Observation(double x_in,double y_in,double value_in);
+ 		~Observation();
+ 
+ 		/*Object virtual functions definitions*/
++		double  distance(const Observation& ob) const;
++		const   std::pair<double, double>& getXY() const;
++
+ 		void    Echo();
++		void    print() const;
+ 		void    DeepEcho()  {_error_("Not implemented yet"); };
+ 		int     Id()        {_error_("Not implemented yet"); };
+ 		int     ObjectEnum(){_error_("Not implemented yet"); };
++		bool operator==(const Observation& ob) const;
+ 		Object *copy();
+ 
+ 		/*Management*/
++		void WriteXYObs(const Observation& ob, double* px, double* py, double* pobs);
+ 		void WriteXYObs(double* px,double* py,double* pobs);
+ };
+ #endif  /* _OBSERVATION_*/
+Index: ../trunk-jpl/src/c/classes/kriging/Covertree.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/Covertree.h	(revision 18911)
++++ ../trunk-jpl/src/c/classes/kriging/Covertree.h	(revision 18912)
+@@ -2,13 +2,135 @@
+ #ifndef _COVERTREE_H
+ #define _COVERTREE_H
+ 
++#include <map>
+ class Observation;
+ 
+ class Covertree{
+ 
++	/**
++	 * Cover tree node. Consists of arbitrarily many points P, as long as
++	 * they have distance 0 to each other. Keeps track of its children.
++	 */
++	class CoverTreeNode{
++		private:
++			//_childMap[i] is a vector of the node's children at level i
++			std::map<int,std::vector<CoverTreeNode*> > _childMap;
++			//_observations is all of the points with distance 0 which are not equal.
++			std::vector<Observation> _observations;
++		public:
++			CoverTreeNode(const Observation& o);
++			/**
++			 * Returns the children of the node at level i. Note that this means
++			 * the children exist in cover set i-1, not level i.
++			 *
++			 * Does not include the node itself, though technically every node
++			 * has itself as a child in a cover tree.
++			 */
++			std::vector<CoverTreeNode*> getChildren(int level) const;
++			void addChild(int level, CoverTreeNode* p);
++			void removeChild(int level, CoverTreeNode* p);
++			void addObservation(const Observation& o);
++			void removeObservation(const Observation& o);
++			const std::vector<Observation>& getObservations() { return _observations; }
++			double distance(const CoverTreeNode& p) const;
++
++			bool isSingle() const;
++			bool hasObservation(const Observation& o) const;
++
++			const Observation& getObservation() const;
++
++			/**
++			 * Return every child of the node from any level. This is handy for
++			 * the destructor.
++			 */
++			std::vector<CoverTreeNode*> getAllChildren() const;
++	  }; // CoverTreeNode class
++	private:
++	typedef std::pair<double, CoverTreeNode*> distNodePair;
++
++	CoverTreeNode* _root;
++	unsigned int _numNodes;
++	int _maxLevel;//base^_maxLevel should be the max distance
++	//between any 2 points
++	int _minLevel;//A level beneath which there are no more new nodes.
++
++	std::vector<CoverTreeNode*>
++	  kNearestNodes(const Observation& o, const unsigned int& k) const;
++	/**
++	 * Recursive implementation of the insert algorithm (see paper).
++	 */
++	bool insert_rec(const Observation& p,
++				const std::vector<distNodePair>& Qi,
++				const int& level);
++
++	/**
++	 * Finds the node in Q with the minimum distance to p. Returns a
++	 * pair consisting of this node and the distance.
++	 */
++	distNodePair distance(const Observation& p,
++				const std::vector<CoverTreeNode*>& Q);
++
++
++	void remove_rec(const Observation& p,
++				std::map<int,std::vector<distNodePair> >& coverSets,
++				int level,
++				bool& multi);
++
+ 	public:
+-		Covertree();
+-		~Covertree();
++	double base;
+ 
++	/**
++	 * Constructs a cover tree which begins with all points in points.
++	 *
++	 * maxDist should be the maximum distance that any two points
++	 * can have between each other. IE p.distance(q) < maxDist for all
++	 * p,q that you will ever try to insert. The cover tree may be invalid
++	 * if an inaccurate maxDist is given.
++	 */
++
++	Covertree(const double& maxDist,
++				const std::vector<Observation>& points=std::vector<Observation>()); 
++	~Covertree();
++
++	/**
++	 * Just for testing/debugging. Returns true iff the cover tree satisfies the
++	 * the covering tree invariants (every node in level i is greater than base^i
++	 * distance from every other node, and every node in level i is less than
++	 * or equal to base^i distance from its children). See the cover tree
++	 * papers for details.
++	 */
++	bool isValidTree() const;
++
++	/**
++	 * Insert newPoint into the cover tree. If newPoint is already present,
++	 * (that is, newPoint==p for some p already in the tree), then the tree
++	 * is unchanged. If p.distance(newPoint)==0.0 but newPoint!=p, then
++	 * newPoint WILL be inserted and both points may be returned in k-nearest-
++	 * neighbor searches.
++	 */
++	void insert(const Observation& newObservation);
++
++	/**
++	 * Remove point p from the cover tree. If p is not present in the tree,
++	 * it will remain unchanged. Otherwise, this will remove exactly one
++	 * point q from the tree satisfying p==q.
++	 */
++	void remove(const Observation& p);
++
++	/**
++	 * Returns the k nearest points to p in order (the 0th element of the vector
++	 * is closest to p, 1th is next, etc). It may return greater than k points
++	 * if there is a tie for the kth place.
++	 */
++	std::vector<Observation> kNearestNeighbors(const Observation& p, const unsigned int& k) const;
++
++	int get_numberofobs();
++
++	CoverTreeNode* getRoot() const;
++
++	/**
++	 * Print the cover tree.
++	 */
++	void print() const;
+ };
+ #endif //_COVERTREE_H
+Index: ../trunk-jpl/src/c/classes/kriging/Observations.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/Observations.cpp	(revision 18911)
++++ ../trunk-jpl/src/c/classes/kriging/Observations.cpp	(revision 18912)
+@@ -42,8 +42,10 @@
+ 	/*Check that there are observations*/
+ 	if(n<=0) _error_("No observation found");
+ 
+-	/*Get tree type*/
+-	options->Get(&this->treetype,"treetype",1);
++	/*Get tree type (FIXME)*/
++	IssmDouble dtree = 0.;
++	options->Get(&dtree,"treetype",1.);
++	this->treetype = reCast<int>(dtree);
+ 	switch(this->treetype){
+ 		case 1:
+ 			this->covertree = NULL;
+@@ -154,8 +156,16 @@
+ /*}}}*/
+ void Observations::InitCovertree(IssmPDouble* observations_list,IssmPDouble* x,IssmPDouble* y,int n,Options* options){/*{{{*/
+ 
+-	_error_("Not supported yet");
++    int maxdepth = 10;
++	 _printf0_("Generating covertree with a maximum depth " <<  maxdepth <<"... ");
++    this->covertree=new Covertree(maxdepth);
+ 
++    for(int i=0;i<n;i++){
++		 if(i%1000) printf("progress = %g \n",double(i)/double(n)*100.);
++		 this->covertree->insert(Observation(x[i],y[i],observations_list[i]));
++    }
++
++	 _printf0_("done\n");
+ }
+ /*}}}*/
+ 
+@@ -227,6 +237,11 @@
+ }/*}}}*/
+ void Observations::ObservationList(IssmPDouble **px,IssmPDouble **py,IssmPDouble **pobs,int* pnobs,IssmPDouble x_interp,IssmPDouble y_interp,IssmPDouble radius,int maxdata){/*{{{*/
+ 
++	if(this->treetype==2){
++		this->ObservationList2(px,py,pobs,pnobs,x_interp,y_interp,radius,maxdata);
++		return;
++	}
++
+ 	/*Output and Intermediaries*/
+ 	bool         stop;
+ 	int          nobs,tempnobs,i,j,k,n,counter;
+@@ -602,3 +617,56 @@
+ 	/*Assign output pointer*/
+ 	xDelete<IssmPDouble>(counter);
+ }/*}}}*/
++
++
++void Observations::ObservationList2(double **px,double **py,double **pobs,int* pnobs,double x_interp,double y_interp,double radius,int maxdata){/*{{{*/
++    
++
++    double *x            = NULL;
++    double *y            = NULL;
++    double *obs          = NULL;
++    Observation observation=Observation(x_interp,y_interp,0.);
++    std::vector<Observation> kNN;
++    
++    /*If radius is not provided or is 0, return all observations*/
++    if(radius==0.)
++    {
++        kNN=(this->covertree->getRoot())->getObservations();
++    }
++    else
++    {
++        kNN=(this->covertree->kNearestNeighbors(observation, maxdata));
++		//cout << "kNN's size: " << kNN.size() << endl;
++		
++    }
++	
++	//kNN is sort from closest to farthest neighbor
++	//searches for the first neighbor that is out of radius
++	//deletes and resizes the kNN vector
++	vector<Observation>::iterator it;
++	for (it = kNN.begin(); it != kNN.end(); ++it) {
++		//(*it).print();
++		//cout << "\n" << (*it).distance(observation) << endl;
++		if ((*it).distance(observation) > radius) {
++			break;
++		}
++	}
++	kNN.erase(it, kNN.end());
++    
++	/*Allocate vectors*/
++	x   = new double[kNN.size()];
++	y   = new double[kNN.size()];
++	obs = new double[kNN.size()];
++
++	/*Loop over all observations and fill in x, y and obs*/
++	int i = 0;
++	for (it = kNN.begin(); it != kNN.end(); ++it) {
++		(*it).WriteXYObs((*it), &x[i], &y[i], &obs[i]);
++		i++;
++	}
++    
++    *px=x;
++    *py=y;
++    *pobs=obs;
++	*pnobs = kNN.size();
++}/*}}}*/
+Index: ../trunk-jpl/src/c/classes/kriging/Observations.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/Observations.h	(revision 18911)
++++ ../trunk-jpl/src/c/classes/kriging/Observations.h	(revision 18912)
+@@ -40,6 +40,7 @@
+ 		void InterpolationNearestNeighbor(IssmDouble *pprediction,IssmDouble x_interp,IssmDouble y_interp,IssmDouble radius);
+ 		void ObservationList(IssmDouble **px,IssmDouble **py,IssmDouble **pobs,int* pnobs);
+ 		void ObservationList(IssmDouble **px,IssmDouble **py,IssmDouble **pobs,int* pnobs,IssmDouble x_interp,IssmDouble y_interp,IssmDouble radius,int maxdata);
++		void ObservationList2(IssmDouble **px,IssmDouble **py,IssmDouble **pobs,int* pnobs,IssmDouble x_interp,IssmDouble y_interp,IssmDouble radius,int maxdata);
+ 		void QuadtreeColoring(IssmDouble* A,IssmDouble *x,IssmDouble *y,int n);
+ 		void Variomap(IssmDouble* gamma,IssmDouble *x,int n);
+ 
+Index: ../trunk-jpl/src/c/classes/kriging/Observation.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/Observation.cpp	(revision 18911)
++++ ../trunk-jpl/src/c/classes/kriging/Observation.cpp	(revision 18912)
+@@ -3,6 +3,8 @@
+  */
+ 
+ #include <stdlib.h>
++#include <cmath>
++#include <utility>
+ #include "../classes.h"
+ 
+ /*Observation constructors and destructor*/
+@@ -22,6 +24,16 @@
+ 
+ }
+ /*}}}*/
++Observation::Observation(double x_in, double y_in,double value_in){
++	this->x = x_in;
++	this->y = y_in;
++	this->value = value_in;
++
++	this->xi     = 0;
++	this->yi     = 0;
++	this->index  = 0;
++	this->weight = 0.;
++}
+ Observation::~Observation(){/*{{{*/
+ 	return;
+ }
+@@ -58,3 +70,32 @@
+ 	*pobs = this->value;
+ }
+ /*}}}*/
++
++/*Covertree*/
++void Observation::print(void) const{/*{{{*/
++
++	_printf_("Observation\n");
++	_printf_("   x     : " << this->x << "\n");
++	_printf_("   y     : " << this->y << "\n");
++	_printf_("   value : " << this->value << "\n");
++}
++/*}}}*/
++double Observation::distance(const Observation& ob) const
++{
++	return std::sqrt( (std::pow( (ob.getXY().first - this->x), 2 ) + std::pow((ob.getXY().second - this->y), 2) ));
++}
++
++const std::pair<double, double>& Observation::getXY() const
++{
++	return std::make_pair(this->x, this->y);
++}
++bool Observation::operator==(const Observation& ob) const
++{
++	return (ob.getXY().first == this->x && ob.getXY().second == this->y && ob.value == this->value);
++}
++
++void Observation::WriteXYObs(const Observation& ob, double* px, double* py, double* pobs){
++    *px   = ob.getXY().first;
++    *py   = ob.getXY().second;
++    *pobs = ob.value;
++}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18912-18913.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18912-18913.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18912-18913.diff	(revision 19102)
@@ -0,0 +1,467 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Element.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18912)
++++ ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18913)
+@@ -55,248 +55,233 @@
+ 		~Element();
+ 
+ 		/*Functions*/
+-		void       AddInput(Input* input_in);
+-		/* bool       AllActive(void); */
+-		/* bool       AnyActive(void); */
+-		void       ComputeNewDamage();
+-		void       ComputeStrainRate();
+-		void       CoordinateSystemTransform(IssmDouble** ptransform,Node** nodes,int numnodes,int* cs_array);
+-		void       Echo();
+-		void       DeepEcho();
+-		void       DeleteMaterials(void);
+-		void       dViscositydBSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
+-		void       dViscositydBHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
+-		void       dViscositydBFS(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
+-		void       dViscositydDSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
+-		IssmDouble Divergence(void);
+-		void       ThermalToEnthalpy(IssmDouble* penthalpy,IssmDouble temperature,IssmDouble waterfraction,IssmDouble pressure);
+-		void       EnthalpyToThermal(IssmDouble* ptemperature,IssmDouble* pwaterfraction,IssmDouble enthalpy,IssmDouble pressure);
+-		IssmDouble EnthalpyDiffusionParameter(IssmDouble enthalpy,IssmDouble pressure);
+-		IssmDouble EnthalpyDiffusionParameterVolume(int numvertices,IssmDouble* enthalpy,IssmDouble* pressure);
+-		void       FindParam(bool* pvalue,int paramenum);
+-		void       FindParam(int* pvalue,int paramenum);
+-		void       FindParam(IssmDouble* pvalue,int paramenum);
+-		void       FindParam(int** pvalues,int* psize,int paramenum);
+-		void	     GetDofList(int** pdoflist,int approximation_enum,int setenum);
+-		void	     GetDofListVelocity(int** pdoflist,int setenum);
+-		void	     GetDofListPressure(int** pdoflist,int setenum);
+-		Input*     GetInput(int inputenum);
+-		void       GetInputListOnNodes(IssmDouble* pvalue,int enumtype);
+-		void       GetInputListOnNodes(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue);
+-		void       GetInputListOnNodesVelocity(IssmDouble* pvalue,int enumtype);
+-		void       GetInputListOnVertices(IssmDouble* pvalue,int enumtype);
+-		void       GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue);
+-		void       GetInputLocalMinMaxOnNodes(IssmDouble* min,IssmDouble* max,IssmDouble* ug);
+-		void       GetInputValue(bool* pvalue,int enum_type);
+-		void       GetInputValue(int* pvalue,int enum_type);
+-		void       GetInputValue(IssmDouble* pvalue,int enum_type);
+-		void       GetInputValue(IssmDouble* pvalue,Gauss* gauss,int enum_type);
+-		IssmDouble GetMaterialParameter(int enum_in);
+-		void       GetNodesSidList(int* sidlist);
+-		void       GetNodesLidList(int* lidlist);
+-		void       GetPhi(IssmDouble* phi, IssmDouble*  epsilon, IssmDouble viscosity);
+-		void       GetVectorFromInputs(Vector<IssmDouble>* vector, int name_enum);
+-		void	     GetVertexPidList(int* pidlist);
+-		void       GetVerticesCoordinates(IssmDouble** xyz_list);
+-		void       GetVerticesSidList(int* sidlist);
+-		void       GetVerticesConnectivityList(int* connectivitylist);
+-		IssmDouble GetXcoord(IssmDouble* xyz_list,Gauss* gauss);
+-		IssmDouble GetYcoord(IssmDouble* xyz_list,Gauss* gauss);
+-		IssmDouble GetZcoord(IssmDouble* xyz_list,Gauss* gauss);
+-		void       GradientIndexing(int* indexing,int control_index,bool onsid=false);
+-		bool       HasNodeOnBase();
+-		bool       HasNodeOnSurface();
+-		int        Id();
+-		int        Sid();
+-		void       InputChangeName(int enum_type,int enum_type_old);
+-		void       InputCreate(IssmDouble* vector,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code);
+-		void       DeleteInput(int input_enum);
+-		void       InputDuplicate(int original_enum,int new_enum);
+-		void       InputUpdateFromConstant(IssmDouble constant, int name);
+-		void       InputUpdateFromConstant(int constant, int name);
+-		void       InputUpdateFromConstant(bool constant, int name);
+-		bool       IsIceInElement();
+-		bool	     IsInput(int name);
+-		bool       IsFloating(); 
+-		void       LinearFloatingiceMeltingRate(); 
+-		void       MigrateGroundingLine(IssmDouble* sheet_ungrounding);
+-		ElementVector*  NewElementVector(int approximation_enum=NoneApproximationEnum);
+-		ElementMatrix*  NewElementMatrix(int approximation_enum=NoneApproximationEnum);
+-		ElementMatrix*  NewElementMatrixCoupling(int number_nodes,int approximation_enum=NoneApproximationEnum);
+-		IssmDouble PureIceEnthalpy(IssmDouble pressure);
+-		void       ResultInterpolation(int* pinterpolation,int*nodesperelement,int output_enum);
+-		void       ResultToVector(Vector<IssmDouble>* vector,int output_enum);
+-		void       ResultToPatch(IssmDouble* values,int nodesperelement,int output_enum);
+-		void       SetwiseNodeConnectivity(int* d_nz,int* o_nz,Node* node,bool* flags,int* flagsindices,int set1_enum,int set2_enum);
+-		void       StrainRateSSA(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
+-		void       StrainRateSSA1d(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input);
+-		void       StrainRateHO(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
+-		void       StrainRateHO2dvertical(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
+-		void       StrainRateFS(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
+-		IssmDouble TMeltingPoint(IssmDouble pressure);
+-		void       TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,int cs_enum);
+-		void       TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);
+-		void       TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array);
+-		void       TransformLoadVectorCoord(ElementVector* pe,int cs_enum);
+-		void       TransformLoadVectorCoord(ElementVector* pe,int* cs_array);
+-		void       TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int cs_enum);
+-		void       TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int* cs_array);
+-		void       TransformSolutionCoord(IssmDouble* solution,int cs_enum);
+-		void       TransformSolutionCoord(IssmDouble* solution,int* cs_array);
+-		void       TransformSolutionCoord(IssmDouble* solution,int numnodes,int cs_enum);
+-		void       TransformSolutionCoord(IssmDouble* solution,int numnodes,int* cs_array);
+-		void       TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int cs_enum);
+-		void       TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int* cs_array);
+-		void       TransformStiffnessMatrixCoord(ElementMatrix* Ke,int cs_enum);
+-		void       TransformStiffnessMatrixCoord(ElementMatrix* Ke,int* cs_array);
+-		void       TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);
+-		void       TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array);
+-		void       ViscousHeatingCreateInput(void);
+-		void       StressMaxPrincipalCreateInput(void);
+-		void       ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
+-		void       ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
+-		void       ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* surf);
+-		void       ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
+-		void       ViscositySSADerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon);
+-		void       ViscosityHODerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon);
+-		void       ViscosityFSDerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon);
+-		void       TransformLoadVectorCoord(ElementVector* pe,int numnodes,int transformenum){_error_("not implemented yet");};/*Tiling only*/
+-		void       TransformLoadVectorCoord(ElementVector* pe,int numnodes,int* transformenum_list){_error_("not implemented yet");};/*Tiling only*/
+-		void       TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int* transformenum_list){_error_("not implemented yet");};/*Tiling only*/
++		void               AddInput(Input* input_in);
++		/*bool               AllActive(void);*/
++		/*bool               AnyActive(void);*/
++		void               ComputeNewDamage();
++		void               ComputeStrainRate();
++		void               CoordinateSystemTransform(IssmDouble** ptransform,Node** nodes,int numnodes,int* cs_array);
++		void               Echo();
++		void               DeepEcho();
++		void               DeleteInput(int input_enum);
++		void               DeleteMaterials(void);
++		IssmDouble         Divergence(void);
++		void               dViscositydBFS(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
++		void               dViscositydBHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
++		void               dViscositydBSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
++		void               dViscositydDSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
++		IssmDouble         EnthalpyDiffusionParameter(IssmDouble enthalpy,IssmDouble pressure);
++		IssmDouble         EnthalpyDiffusionParameterVolume(int numvertices,IssmDouble* enthalpy,IssmDouble* pressure);
++		void               EnthalpyToThermal(IssmDouble* ptemperature,IssmDouble* pwaterfraction,IssmDouble enthalpy,IssmDouble pressure);
++		void               FindParam(bool* pvalue,int paramenum);
++		void               FindParam(int* pvalue,int paramenum);
++		void               FindParam(IssmDouble* pvalue,int paramenum);
++		void               FindParam(int** pvalues,int* psize,int paramenum);
++		void	             GetDofList(int** pdoflist,int approximation_enum,int setenum);
++		void	             GetDofListPressure(int** pdoflist,int setenum);
++		void	             GetDofListVelocity(int** pdoflist,int setenum);
++		Input*             GetInput(int inputenum);
++		void               GetInputListOnNodes(IssmDouble* pvalue,int enumtype);
++		void               GetInputListOnNodes(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue);
++		void               GetInputListOnNodesVelocity(IssmDouble* pvalue,int enumtype);
++		void               GetInputListOnVertices(IssmDouble* pvalue,int enumtype);
++		void               GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue);
++		void               GetInputLocalMinMaxOnNodes(IssmDouble* min,IssmDouble* max,IssmDouble* ug);
++		void               GetInputValue(bool* pvalue,int enum_type);
++		void               GetInputValue(int* pvalue,int enum_type);
++		void               GetInputValue(IssmDouble* pvalue,int enum_type);
++		void               GetInputValue(IssmDouble* pvalue,Gauss* gauss,int enum_type);
++		IssmDouble         GetMaterialParameter(int enum_in);
++		void               GetNodesLidList(int* lidlist);
++		void               GetNodesSidList(int* sidlist);
++		void               GetPhi(IssmDouble* phi, IssmDouble*  epsilon, IssmDouble viscosity);
++		void               GetVectorFromInputs(Vector<IssmDouble>* vector, int name_enum);
++		void	             GetVertexPidList(int* pidlist);
++		void               GetVerticesConnectivityList(int* connectivitylist);
++		void               GetVerticesCoordinates(IssmDouble** xyz_list);
++		void               GetVerticesSidList(int* sidlist);
++		IssmDouble         GetXcoord(IssmDouble* xyz_list,Gauss* gauss);
++		IssmDouble         GetYcoord(IssmDouble* xyz_list,Gauss* gauss);
++		IssmDouble         GetZcoord(IssmDouble* xyz_list,Gauss* gauss);
++		void               GradientIndexing(int* indexing,int control_index,bool onsid=false);
++		bool               HasNodeOnBase();
++		bool               HasNodeOnSurface();
++		int                Id();
++		void               InputChangeName(int enum_type,int enum_type_old);
++		void               InputCreate(IssmDouble* vector,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code);
++		void               InputDuplicate(int original_enum,int new_enum);
++		void               InputUpdateFromConstant(IssmDouble constant, int name);
++		void               InputUpdateFromConstant(int constant, int name);
++		void               InputUpdateFromConstant(bool constant, int name);
++		bool               IsFloating(); 
++		bool               IsIceInElement();
++		bool	             IsInput(int name);
++		void               LinearFloatingiceMeltingRate(); 
++		void               MigrateGroundingLine(IssmDouble* sheet_ungrounding);
++		ElementMatrix*     NewElementMatrix(int approximation_enum=NoneApproximationEnum);
++		ElementMatrix*     NewElementMatrixCoupling(int number_nodes,int approximation_enum=NoneApproximationEnum);
++		ElementVector*     NewElementVector(int approximation_enum=NoneApproximationEnum);
++		IssmDouble         PureIceEnthalpy(IssmDouble pressure);
++		void               ResultInterpolation(int* pinterpolation,int*nodesperelement,int output_enum);
++		void               ResultToPatch(IssmDouble* values,int nodesperelement,int output_enum);
++		void               ResultToVector(Vector<IssmDouble>* vector,int output_enum);
++		void               SetwiseNodeConnectivity(int* d_nz,int* o_nz,Node* node,bool* flags,int* flagsindices,int set1_enum,int set2_enum);
++		int                Sid();
++		void               StrainRateFS(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
++		void               StrainRateHO(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
++		void               StrainRateHO2dvertical(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
++		void               StrainRateSSA(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
++		void               StrainRateSSA1d(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input);
++		void               StressMaxPrincipalCreateInput(void);
++		void               ThermalToEnthalpy(IssmDouble* penthalpy,IssmDouble temperature,IssmDouble waterfraction,IssmDouble pressure);
++		IssmDouble         TMeltingPoint(IssmDouble pressure);
++		void               TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,int cs_enum);
++		void               TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);
++		void               TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array);
++		void               TransformLoadVectorCoord(ElementVector* pe,int cs_enum);
++		void               TransformLoadVectorCoord(ElementVector* pe,int* cs_array);
++		void               TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int cs_enum);
++		void               TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int* cs_array);
++		void               TransformLoadVectorCoord(ElementVector* pe,int numnodes,int transformenum){_error_("not implemented yet");};/*Tiling only*/
++		void               TransformLoadVectorCoord(ElementVector* pe,int numnodes,int* transformenum_list){_error_("not implemented yet");};/*Tiling only*/
++		void               TransformSolutionCoord(IssmDouble* solution,int cs_enum);
++		void               TransformSolutionCoord(IssmDouble* solution,int* cs_array);
++		void               TransformSolutionCoord(IssmDouble* solution,int numnodes,int cs_enum);
++		void               TransformSolutionCoord(IssmDouble* solution,int numnodes,int* cs_array);
++		void               TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int cs_enum);
++		void               TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int* cs_array);
++		void               TransformStiffnessMatrixCoord(ElementMatrix* Ke,int cs_enum);
++		void               TransformStiffnessMatrixCoord(ElementMatrix* Ke,int* cs_array);
++		void               TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);
++		void               TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array);
++		void               TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int* transformenum_list){_error_("not implemented yet");};/*Tiling only*/
++		void               ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
++		void               ViscosityFSDerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon);
++		void               ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
++		void               ViscosityHODerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon);
++		void               ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* surf);
++		void               ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
++		void               ViscositySSADerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon);
++		void               ViscousHeatingCreateInput(void);
+ 
+ 		/*Virtual functions*/
+ 		virtual void       AddBasalInput(int input_enum, IssmDouble* values, int interpolation_enum)=0;
+ 		virtual void       AddInput(int input_enum, IssmDouble* values, int interpolation_enum)=0;
++		virtual void       AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part)=0;
++		virtual void	    CalvingRateLevermann(void)=0;
+ 		virtual IssmDouble CharacteristicLength(void)=0;
++		virtual void       ComputeBasalStress(Vector<IssmDouble>* sigma_b)=0;
++		virtual void       ComputeDeviatoricStressTensor(void)=0;
++		virtual void       ComputeSigmaNN(void)=0;
++		virtual void       ComputeStressTensor(void)=0;
+ 		virtual void       Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters)=0;
++		virtual void       ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index)=0;
++		virtual void       ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum)=0;
++		virtual void       Delta18oParameterization(void)=0;
++		virtual void       ElementResponse(IssmDouble* presponse,int response_enum)=0;
++		virtual void       ElementSizes(IssmDouble* phx,IssmDouble* phy,IssmDouble* phz)=0;
++		virtual int        FiniteElement(void)=0;
++		virtual void       FSContactMigration(Vector<IssmDouble>* vertexgrounded,Vector<IssmDouble>* vertexfloating)=0;
++		virtual Element*   GetBasalElement(void)=0;
++		virtual int        GetElementType(void)=0;
++		virtual void       GetGroundedPart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlyfloating)=0;
++		virtual IssmDouble GetGroundedPortion(IssmDouble* xyz_list)=0;
++		virtual void       GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum)=0;
++		virtual void       GetInputValue(IssmDouble* pvalue,Node* node,int enumtype)=0;
++		virtual void       GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level)=0;
++		virtual void       GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues)=0;
++		virtual Node*      GetNode(int node_number)=0;
++		virtual int        GetNodeIndex(Node* node)=0;
++		virtual int        GetNumberOfNodes(void)=0;
++		virtual int        GetNumberOfNodes(int enum_type)=0;
++		virtual int        GetNumberOfVertices(void)=0;
++		virtual void       GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int solutionenum)=0;
++		virtual Element*   GetUpperElement(void)=0;
++		virtual void       GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid)=0;
++		virtual void       GetVerticesCoordinatesBase(IssmDouble** xyz_list)=0;
++		virtual void       GetVerticesCoordinatesTop(IssmDouble** xyz_list)=0;
++		virtual IssmDouble IceVolume(void)=0;
++		virtual IssmDouble IceVolumeAboveFloatation(void)=0;
++		virtual void       InputControlUpdate(IssmDouble scalar,bool save_parameter)=0;
++		virtual void       InputDepthAverageAtBase(int enum_type,int average_enum_type)=0;
++		virtual void       InputExtrude(int input_enum,int start)=0;
++		virtual void       InputScale(int enum_type,IssmDouble scale_factor)=0;
++		virtual void       InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum)=0;
++		virtual void       InputUpdateFromSolutionOneDof(IssmDouble* solution,int inputenum)=0;
++		virtual bool       IsFaceOnBoundary(void)=0;
++		virtual bool       IsIcefront(void)=0;
++		virtual bool       IsNodeOnShelfFromFlags(IssmDouble* flags)=0; 
++		virtual bool       IsOnBase()=0;
++		virtual bool       IsOnSurface()=0;
++		virtual bool       IsZeroLevelset(int levelset_enum)=0;
++		virtual void       JacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss)=0;
++		virtual void       JacobianDeterminantBase(IssmDouble* Jdet,IssmDouble* xyz_list_base,Gauss* gauss)=0;
++		virtual void       JacobianDeterminantLine(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss)=0;
++		virtual void       JacobianDeterminantSurface(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss)=0;
++		virtual void       JacobianDeterminantTop(IssmDouble* Jdet,IssmDouble* xyz_list_base,Gauss* gauss)=0;
++		virtual IssmDouble Masscon(IssmDouble* levelset)=0;
++		virtual IssmDouble MassFlux(IssmDouble* segment)=0;
++		virtual IssmDouble MassFlux(IssmDouble x1,IssmDouble y1, IssmDouble x2, IssmDouble y2,int segment_id)=0;
++		virtual IssmDouble MinEdgeLength(IssmDouble* xyz_list)=0;
++		virtual IssmDouble Misfit(int modelenum,int observationenum,int weightsenum)=0;
++		virtual IssmDouble MisfitArea(int weightsenum)=0;
++		virtual Gauss*     NewGauss(void)=0;
++		virtual Gauss*     NewGauss(int order)=0;
++      virtual Gauss*     NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order)=0;
++      virtual Gauss*     NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order_horiz,int order_vert)=0;
++      virtual Gauss*     NewGauss(int point1,IssmDouble fraction1,IssmDouble fraction2,bool mainlyfloating,int order)=0;
++		virtual Gauss*     NewGaussBase(int order)=0;
++		virtual Gauss*     NewGaussLine(int vertex1,int vertex2,int order)=0;
++		virtual Gauss*     NewGaussTop(int order)=0;
++		virtual void       NodalFunctions(IssmDouble* basis,Gauss* gauss)=0;
++		virtual void       NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss)=0;
++		virtual void       NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss)=0;
++		virtual void       NodalFunctionsMINIDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss)=0;
++		virtual void       NodalFunctionsPressure(IssmDouble* basis, Gauss* gauss)=0;
++		virtual void       NodalFunctionsP1(IssmDouble* basis,Gauss* gauss)=0;
++		virtual void       NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss)=0;
++		virtual void       NodalFunctionsP2(IssmDouble* basis,Gauss* gauss)=0;
++		virtual void       NodalFunctionsVelocity(IssmDouble* basis, Gauss* gauss)=0;
++		virtual void       NodalFunctionsTensor(IssmDouble* basis, Gauss* gauss)=0;
++		virtual int        NodalValue(IssmDouble* pvalue, int index, int natureofdataenum)=0;
++		virtual void       NormalBase(IssmDouble* normal,IssmDouble* xyz_list)=0;
++		virtual void       NormalSection(IssmDouble* normal,IssmDouble* xyz_list)=0;
++		virtual void       NormalTop(IssmDouble* normal,IssmDouble* xyz_list)=0;
++		virtual int        NumberofNodesPressure(void)=0;
++		virtual int        NumberofNodesVelocity(void)=0;
++		virtual void       PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm)=0;
++		virtual void       PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding)=0;
++		virtual int        PressureInterpolation()=0;
++		virtual void       ReduceMatrices(ElementMatrix* Ke,ElementVector* pe)=0;
++		virtual void       ResetFSBasalBoundaryCondition()=0;
++		virtual void       ResetHooks()=0;
++		virtual void       SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index)=0;
+ 		virtual void       SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters)=0;
+-		virtual void       ResetHooks()=0;
+-		virtual void   ElementSizes(IssmDouble* phx,IssmDouble* phy,IssmDouble* phz)=0;
+-
+-		virtual int    FiniteElement(void)=0;
+-		virtual IssmDouble MinEdgeLength(IssmDouble* xyz_list)=0;
+-		virtual void   NodalFunctions(IssmDouble* basis,Gauss* gauss)=0;
+-		virtual void   NodalFunctionsP1(IssmDouble* basis,Gauss* gauss)=0;
+-		virtual void   NodalFunctionsP2(IssmDouble* basis,Gauss* gauss)=0;
+-		virtual void   NodalFunctionsVelocity(IssmDouble* basis, Gauss* gauss)=0;
+-		virtual void   NodalFunctionsPressure(IssmDouble* basis, Gauss* gauss)=0;
+-		virtual void   NodalFunctionsTensor(IssmDouble* basis, Gauss* gauss)=0;
+-		virtual void   NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss)=0;
+-		virtual void   NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss)=0;
+-		virtual void   NodalFunctionsMINIDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss)=0;
+-		virtual void   NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss)=0;
+-		virtual void   NormalSection(IssmDouble* normal,IssmDouble* xyz_list)=0;
+-		virtual void   NormalTop(IssmDouble* normal,IssmDouble* xyz_list)=0;
+-		virtual void   NormalBase(IssmDouble* normal,IssmDouble* xyz_list)=0;
+-
+-		virtual Element* GetUpperElement(void)=0;
+-		virtual Element* GetBasalElement(void)=0;
+-
+-		virtual void   JacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss)=0;
+-		virtual void   JacobianDeterminantLine(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss)=0;
+-		virtual void   JacobianDeterminantSurface(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss)=0;
+-		virtual void   JacobianDeterminantBase(IssmDouble* Jdet,IssmDouble* xyz_list_base,Gauss* gauss)=0;
+-		virtual void   JacobianDeterminantTop(IssmDouble* Jdet,IssmDouble* xyz_list_base,Gauss* gauss)=0;
+-		virtual void   GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int solutionenum)=0;
+-		virtual int    GetNodeIndex(Node* node)=0;
+-		virtual int    GetNumberOfNodes(void)=0;
+-		virtual int    GetNumberOfNodes(int enum_type)=0;
+-		virtual int    GetNumberOfVertices(void)=0;
+-
+-		virtual bool   IsNodeOnShelfFromFlags(IssmDouble* flags)=0; 
+-		virtual bool   IsOnBase()=0;
+-		virtual bool   IsOnSurface()=0;
+-		virtual void   GetGroundedPart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlyfloating)=0;
+-		virtual void   GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues)=0;
+-		virtual IssmDouble GetGroundedPortion(IssmDouble* xyz_list)=0;
+-		virtual void   GetInputValue(IssmDouble* pvalue,Node* node,int enumtype)=0;
+-		virtual Node*  GetNode(int node_number)=0;
+-		virtual void   GetVerticesCoordinatesBase(IssmDouble** xyz_list)=0;
+-		virtual void   GetVerticesCoordinatesTop(IssmDouble** xyz_list)=0;
+-
+-		virtual int    GetElementType(void)=0;
+-
+-		virtual IssmDouble SurfaceArea(void)=0;
+-		virtual void   InputDepthAverageAtBase(int enum_type,int average_enum_type)=0;
+-		virtual void   ComputeSigmaNN(void)=0;
+-		virtual void   ComputeBasalStress(Vector<IssmDouble>* sigma_b)=0;
+-		virtual void   ComputeStressTensor(void)=0;
+-		virtual void   ComputeDeviatoricStressTensor(void)=0;
+-		virtual void	StressIntensityFactor(void)=0;
+-		virtual void	StrainRateparallel(void)=0;
+-		virtual void	StrainRateperpendicular(void)=0;
+-		virtual void	CalvingRateLevermann(void)=0;
+-
+-		virtual void   Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finite_element)=0;
+-		virtual void   InputExtrude(int input_enum,int start)=0;
+-		virtual void   InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum)=0;
+-		virtual void   InputUpdateFromSolutionOneDof(IssmDouble* solution,int inputenum)=0;
+-
+-		virtual int    NodalValue(IssmDouble* pvalue, int index, int natureofdataenum)=0;
+-		virtual int    NumberofNodesVelocity(void)=0;
+-		virtual int    NumberofNodesPressure(void)=0;
+-		virtual Gauss* NewGauss(void)=0;
+-		virtual Gauss* NewGauss(int order)=0;
+-      virtual Gauss* NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order)=0;
+-      virtual Gauss* NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order_horiz,int order_vert)=0;
+-      virtual Gauss* NewGauss(int point1,IssmDouble fraction1,IssmDouble fraction2,bool mainlyfloating,int order)=0;
+-		virtual Gauss* NewGaussBase(int order)=0;
+-		virtual Gauss* NewGaussLine(int vertex1,int vertex2,int order)=0;
+-		virtual Gauss* NewGaussTop(int order)=0;
+-
+-		virtual void   InputScale(int enum_type,IssmDouble scale_factor)=0;
+-		virtual IssmDouble TimeAdapt()=0;
+-		virtual void   PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm)=0;
+-		virtual void   Delta18oParameterization(void)=0;
++		virtual void       SetTemporaryElementType(int element_type_in)=0;
+ 	   virtual Element*   SpawnBasalElement(void)=0;
+ 		virtual Element*   SpawnTopElement(void)=0;
+-		virtual void   ReduceMatrices(ElementMatrix* Ke,ElementVector* pe)=0;
+-		virtual void   ResetFSBasalBoundaryCondition()=0;
+-		virtual void   SetTemporaryElementType(int element_type_in)=0;
+ 		virtual IssmDouble StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa)=0;
+-		virtual void   ValueP1OnGauss(IssmDouble* pvalue,IssmDouble* values,Gauss* gauss)=0;
+-		virtual void   ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss)=0;
+-		virtual void   ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input)=0;
+-
+-		virtual int    VelocityInterpolation()=0;
+-		virtual int    PressureInterpolation()=0;
+-		virtual int    TensorInterpolation()=0;
+-		virtual bool   IsZeroLevelset(int levelset_enum)=0;
+-		virtual bool   IsIcefront(void)=0;
+-		virtual bool   IsFaceOnBoundary(void)=0;
+-		virtual void   ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum)=0;
+-		virtual void   GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum)=0;
+-		virtual void   GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level)=0;
+-
+-		virtual void   AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part)=0;
+-		virtual IssmDouble MassFlux(IssmDouble* segment)=0;
+-		virtual IssmDouble MassFlux(IssmDouble x1,IssmDouble y1, IssmDouble x2, IssmDouble y2,int segment_id)=0;
+-		virtual void   ElementResponse(IssmDouble* presponse,int response_enum)=0;
+-		virtual IssmDouble IceVolume(void)=0;
+-		virtual IssmDouble IceVolumeAboveFloatation(void)=0;
++		virtual void	    StrainRateparallel(void)=0;
++		virtual void	    StrainRateperpendicular(void)=0;
++		virtual void	    StressIntensityFactor(void)=0;
++		virtual IssmDouble SurfaceArea(void)=0;
++		virtual int        TensorInterpolation()=0;
++		virtual IssmDouble TimeAdapt()=0;
+ 		virtual IssmDouble TotalSmb(void)=0;
+-		virtual IssmDouble Misfit(int modelenum,int observationenum,int weightsenum)=0;
+-		virtual IssmDouble Masscon(IssmDouble* levelset)=0;
+-		virtual IssmDouble MisfitArea(int weightsenum)=0;
+-		virtual int    VertexConnectivity(int vertexindex)=0;
+-		virtual void   VerticalSegmentIndices(int** pindices,int* pnumseg)=0;
++		virtual void       Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finite_element)=0;
++		virtual void       UpdateConstraintsExtrudeFromBase(void)=0;
++		virtual void       UpdateConstraintsExtrudeFromTop(void)=0;
++		virtual int        UpdatePotentialUngrounding(IssmDouble* potential_sheet_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf)=0;
++		virtual void       ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss)=0;
++		virtual void       ValueP1OnGauss(IssmDouble* pvalue,IssmDouble* values,Gauss* gauss)=0;
++		virtual int        VelocityInterpolation()=0;
++		virtual int        VertexConnectivity(int vertexindex)=0;
++		virtual void       VerticalSegmentIndices(int** pindices,int* pnumseg)=0;
++		virtual void       ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input)=0;
++		virtual void       ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum)=0;
+ 
+ 		#ifdef _HAVE_GIA_
+-		virtual void   GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,IssmDouble* x,IssmDouble* y)=0;
++		virtual void       GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,IssmDouble* x,IssmDouble* y)=0;
+ 		#endif
+-
+-		virtual void   ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index)=0;
+-		virtual void   ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum)=0;
+-		virtual void   GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid)=0;
+-		virtual void   SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index)=0;
+-		virtual void   InputControlUpdate(IssmDouble scalar,bool save_parameter)=0;
+-
+-		virtual void UpdateConstraintsExtrudeFromBase(void)=0;
+-		virtual void UpdateConstraintsExtrudeFromTop(void)=0;
+-
+-		virtual void   FSContactMigration(Vector<IssmDouble>* vertexgrounded,Vector<IssmDouble>* vertexfloating)=0;
+-		virtual void   PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding)=0;
+-		virtual int    UpdatePotentialUngrounding(IssmDouble* potential_sheet_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf)=0;
+-
+ };
+ #endif
Index: /issm/oecreview/Archive/18296-19100/ISSM-18913-18914.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18913-18914.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18913-18914.diff	(revision 19102)
@@ -0,0 +1,72 @@
+Index: ../trunk-jpl/src/c/classes/kriging/Covertree.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/Covertree.cpp	(revision 18913)
++++ ../trunk-jpl/src/c/classes/kriging/Covertree.cpp	(revision 18914)
+@@ -1,6 +1,8 @@
+ #include "../classes.h"
+ //#include <utility>
+ #include <set>
++//#include <vector>
++#include <algorithm>
+ 
+ 	/*Constructors/Destructors*/
+ Covertree::Covertree(const double& maxDist,const std::vector<Observation>& points){
+@@ -191,7 +193,7 @@
+ 			int i = level-1;
+ 			Observation q = (*it)->getObservation();
+ 			double minDQ = 1.e+50;
+-			CoverTreeNode* minDQNode = nullptr;
++			CoverTreeNode* minDQNode = NULL;
+ 			double sep = pow(base,i);
+ 			bool br=false;
+ 			while(true) {
+@@ -219,7 +221,7 @@
+ 			//minDQNode->getObservation().print();
+ 			//std::cout << " is level " << i << " parent of ";
+ 			//(*it)->getObservation().print();
+-			if (minDQNode != nullptr)
++			if (minDQNode != NULL)
+ 			 minDQNode->addChild(i,*it);
+ 		}
+ 		if(parent!=NULL) {
+Index: ../trunk-jpl/src/c/classes/kriging/Observation.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/Observation.h	(revision 18913)
++++ ../trunk-jpl/src/c/classes/kriging/Observation.h	(revision 18914)
+@@ -24,7 +24,6 @@
+ 
+ 		/*Object virtual functions definitions*/
+ 		double  distance(const Observation& ob) const;
+-		const   std::pair<double, double>& getXY() const;
+ 
+ 		void    Echo();
+ 		void    print() const;
+Index: ../trunk-jpl/src/c/classes/kriging/Observation.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/Observation.cpp	(revision 18913)
++++ ../trunk-jpl/src/c/classes/kriging/Observation.cpp	(revision 18914)
+@@ -82,20 +82,16 @@
+ /*}}}*/
+ double Observation::distance(const Observation& ob) const
+ {
+-	return std::sqrt( (std::pow( (ob.getXY().first - this->x), 2 ) + std::pow((ob.getXY().second - this->y), 2) ));
++	return std::sqrt( (std::pow( (ob.x - this->x), 2 ) + std::pow((ob.y - this->y), 2) ));
+ }
+ 
+-const std::pair<double, double>& Observation::getXY() const
+-{
+-	return std::make_pair(this->x, this->y);
+-}
+ bool Observation::operator==(const Observation& ob) const
+ {
+-	return (ob.getXY().first == this->x && ob.getXY().second == this->y && ob.value == this->value);
++	return (ob.x == this->x && ob.y == this->y && ob.value == this->value);
+ }
+ 
+ void Observation::WriteXYObs(const Observation& ob, double* px, double* py, double* pobs){
+-    *px   = ob.getXY().first;
+-    *py   = ob.getXY().second;
++    *px   = ob.x;
++    *py   = ob.y;
+     *pobs = ob.value;
+ }
Index: /issm/oecreview/Archive/18296-19100/ISSM-18914-18915.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18914-18915.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18914-18915.diff	(revision 19102)
@@ -0,0 +1,63 @@
+Index: ../trunk-jpl/src/c/classes/kriging/Observations.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/Observations.cpp	(revision 18914)
++++ ../trunk-jpl/src/c/classes/kriging/Observations.cpp	(revision 18915)
+@@ -627,31 +627,24 @@
+     double *obs          = NULL;
+     Observation observation=Observation(x_interp,y_interp,0.);
+     std::vector<Observation> kNN;
+-    
+-    /*If radius is not provided or is 0, return all observations*/
+-    if(radius==0.)
+-    {
+-        kNN=(this->covertree->getRoot())->getObservations();
+-    }
+-    else
+-    {
+-        kNN=(this->covertree->kNearestNeighbors(observation, maxdata));
+-		//cout << "kNN's size: " << kNN.size() << endl;
+-		
+-    }
++
++	 kNN=(this->covertree->kNearestNeighbors(observation, maxdata));
++	 //cout << "kNN's size: " << kNN.size() << endl;
+ 	
+ 	//kNN is sort from closest to farthest neighbor
+ 	//searches for the first neighbor that is out of radius
+ 	//deletes and resizes the kNN vector
+ 	vector<Observation>::iterator it;
+-	for (it = kNN.begin(); it != kNN.end(); ++it) {
+-		//(*it).print();
+-		//cout << "\n" << (*it).distance(observation) << endl;
+-		if ((*it).distance(observation) > radius) {
+-			break;
++	if(radius>0.){
++		for (it = kNN.begin(); it != kNN.end(); ++it) {
++			//(*it).print();
++			//cout << "\n" << (*it).distance(observation) << endl;
++			if ((*it).distance(observation) > radius) {
++				break;
++			}
+ 		}
++		kNN.erase(it, kNN.end());
+ 	}
+-	kNN.erase(it, kNN.end());
+     
+ 	/*Allocate vectors*/
+ 	x   = new double[kNN.size()];
+@@ -660,7 +653,7 @@
+ 
+ 	/*Loop over all observations and fill in x, y and obs*/
+ 	int i = 0;
+-	for (it = kNN.begin(); it != kNN.end(); ++it) {
++	for(it = kNN.begin(); it != kNN.end(); ++it) {
+ 		(*it).WriteXYObs((*it), &x[i], &y[i], &obs[i]);
+ 		i++;
+ 	}
+@@ -668,5 +661,5 @@
+     *px=x;
+     *py=y;
+     *pobs=obs;
+-	*pnobs = kNN.size();
++	 *pnobs = kNN.size();
+ }/*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18915-18916.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18915-18916.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18915-18916.diff	(revision 19102)
@@ -0,0 +1,70 @@
+Index: ../trunk-jpl/src/c/classes/kriging/Covertree.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/Covertree.cpp	(revision 18915)
++++ ../trunk-jpl/src/c/classes/kriging/Covertree.cpp	(revision 18916)
+@@ -28,12 +28,11 @@
+ 		nodes.erase(nodes.begin());
+ 		std::vector<CoverTreeNode*> children = byeNode->getAllChildren();
+ 		nodes.insert(nodes.begin(),children.begin(),children.end());
+-		//std::cout << _numNodes << "\n";
+ 		delete byeNode;
+-		//_numNodes--;
+ 	}   
+ }
+ 
++/*Methods*/
+ std::vector<Covertree::CoverTreeNode*> Covertree::kNearestNodes(const Observation& p, const unsigned int& k) const{
+ 	if(_root==NULL) return std::vector<CoverTreeNode*>();
+ 	//maxDist is the kth nearest known point to p, and also the farthest
+@@ -81,10 +80,7 @@
+ 	}
+ 	return kNN;
+ }
+-bool Covertree::insert_rec(const Observation& p,
+-			const std::vector<distNodePair>& Qi,
+-			const int& level)
+-{
++bool Covertree::insert_rec(const Observation& p, const std::vector<distNodePair>& Qi, const int& level){
+ 	std::vector<std::pair<double, CoverTreeNode*> > Qj;
+ 	double sep = pow(base,level);
+ 	double minDist = 1.e+50;
+@@ -124,11 +120,7 @@
+ 	}
+ }
+ 
+-void Covertree::remove_rec(const Observation& p,
+-			std::map<int,std::vector<distNodePair> >& coverSets,
+-			int level,
+-			bool& multi)
+-{
++void Covertree::remove_rec(const Observation& p, std::map<int,std::vector<distNodePair> >& coverSets, int level, bool& multi){
+ 	std::vector<distNodePair>& Qi = coverSets[level];
+ 	std::vector<distNodePair>& Qj = coverSets[level-1];
+ 	double minDist = 1.e+50;
+@@ -314,9 +306,7 @@
+ 	}
+ }
+ 
+-std::vector<Observation> Covertree::kNearestNeighbors(const Observation& p,
+-			const unsigned int& k) const
+-{
++std::vector<Observation> Covertree::kNearestNeighbors(const Observation& p, const unsigned int& k) const{
+ 	if(_root==NULL) return std::vector<Observation>();
+ 	std::vector<CoverTreeNode*> v = kNearestNodes(p, k);
+ 	std::vector<Observation> kNN;
+@@ -329,8 +319,7 @@
+ 	return kNN;
+ }
+ 
+-void Covertree::print() const
+-{
++void Covertree::print() const{
+ 	int d = _maxLevel-_minLevel+1;
+ 	std::vector<CoverTreeNode*> Q;
+ 	Q.push_back(_root);
+@@ -476,5 +465,3 @@
+ 	}
+ 	return true;
+ }
+-
+-	/*Methods*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18916-18917.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18916-18917.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18916-18917.diff	(revision 19102)
@@ -0,0 +1,30 @@
+Index: ../trunk-jpl/src/m/plot/plot_scatter.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/plot_scatter.m	(revision 18916)
++++ ../trunk-jpl/src/m/plot/plot_scatter.m	(revision 18917)
+@@ -36,7 +36,7 @@
+ %Max=1300;
+ 
+ %OK, should we create a new colorbar for the occasion?
+-if isempty(findobj(gcf,'tag','TMW_COLORBAR')),
++if isempty(findobj(gcf,'tag','TMW_COLORBAR')) && isempty(findobj(gcf,'Type','Colorbar')),
+ 	alreadyplot=false;
+ else
+ 	alreadyplot=true;
+@@ -45,8 +45,14 @@
+ %generate levels
+ if (alreadyplot),
+ 	phch = get(findall(gcf,'type','image','tag','TMW_COLORBAR'),{'parent'});
+-	h    = phch{1};
+-	ylim=get(h,'YLim');
++	if ~isempty(phch),
++		h    = phch{1};
++		ylim=get(h,'YLim');
++	else
++		%R2014b +
++		h = findobj(gcf,'Type','Colorbar');
++		ylim = h.Limits;
++	end
+ 	palette=colormap;
+ 	numcolors=size(palette,1);
+ 	levels=round_ice(linspace(ylim(1),ylim(2),numcolors+1),2);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18917-18918.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18917-18918.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18917-18918.diff	(revision 19102)
@@ -0,0 +1,18 @@
+Index: ../trunk-jpl/src/c/classes/Options/GenericOption.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Options/GenericOption.h	(revision 18917)
++++ ../trunk-jpl/src/c/classes/Options/GenericOption.h	(revision 18918)
+@@ -131,4 +131,13 @@
+ } 
+ /*}}}*/
+ 
++/*Special destructors when there is a pointer*/
++template <> inline GenericOption<char*>::~GenericOption(){ /*{{{*/
++
++	if(name)   xDelete<char>(name);
++	if(size)   xDelete<int>(size);
++	if(value)  xDelete<char>(value);
++} 
++/*}}}*/
++
+ #endif  /* _OPTIONOBJECT_H */
Index: /issm/oecreview/Archive/18296-19100/ISSM-18918-18919.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18918-18919.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18918-18919.diff	(revision 19102)
@@ -0,0 +1,69 @@
+Index: ../trunk-jpl/src/c/classes/kriging/Covertree.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/Covertree.cpp	(revision 18918)
++++ ../trunk-jpl/src/c/classes/kriging/Covertree.cpp	(revision 18919)
+@@ -5,11 +5,11 @@
+ #include <algorithm>
+ 
+ 	/*Constructors/Destructors*/
+-Covertree::Covertree(const double& maxDist,const std::vector<Observation>& points){
++Covertree::Covertree(int maxLevel,const std::vector<Observation>& points){
+ 	this->base = 2.;
+ 	_root=NULL;
+ 	_numNodes=0;
+-	_maxLevel=ceilf(log(maxDist)/log(base));
++	_maxLevel=maxLevel;//ceilf(log(maxDist)/log(base));
+ 	_minLevel=_maxLevel-1;
+ 	std::vector<Observation>::const_iterator it;
+ 	for(it=points.begin(); it!=points.end(); ++it) {
+Index: ../trunk-jpl/src/c/classes/kriging/Covertree.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/Covertree.h	(revision 18918)
++++ ../trunk-jpl/src/c/classes/kriging/Covertree.h	(revision 18919)
+@@ -88,7 +88,7 @@
+ 	 * if an inaccurate maxDist is given.
+ 	 */
+ 
+-	Covertree(const double& maxDist,
++	Covertree(int maxDist,
+ 				const std::vector<Observation>& points=std::vector<Observation>()); 
+ 	~Covertree();
+ 
+Index: ../trunk-jpl/src/c/classes/kriging/Observations.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/kriging/Observations.cpp	(revision 18918)
++++ ../trunk-jpl/src/c/classes/kriging/Observations.cpp	(revision 18919)
+@@ -156,15 +156,13 @@
+ /*}}}*/
+ void Observations::InitCovertree(IssmPDouble* observations_list,IssmPDouble* x,IssmPDouble* y,int n,Options* options){/*{{{*/
+ 
+-    int maxdepth = 10;
++    int maxdepth = 20;
+ 	 _printf0_("Generating covertree with a maximum depth " <<  maxdepth <<"... ");
+     this->covertree=new Covertree(maxdepth);
+ 
+     for(int i=0;i<n;i++){
+-		 if(i%1000) printf("progress = %g \n",double(i)/double(n)*100.);
+ 		 this->covertree->insert(Observation(x[i],y[i],observations_list[i]));
+     }
+-
+ 	 _printf0_("done\n");
+ }
+ /*}}}*/
+@@ -618,7 +616,6 @@
+ 	xDelete<IssmPDouble>(counter);
+ }/*}}}*/
+ 
+-
+ void Observations::ObservationList2(double **px,double **py,double **pobs,int* pnobs,double x_interp,double y_interp,double radius,int maxdata){/*{{{*/
+     
+ 
+@@ -629,7 +626,7 @@
+     std::vector<Observation> kNN;
+ 
+ 	 kNN=(this->covertree->kNearestNeighbors(observation, maxdata));
+-	 //cout << "kNN's size: " << kNN.size() << endl;
++	 //cout << "kNN's size: " << kNN.size() << " (maxdata = " <<maxdata<<")"<<endl;
+ 	
+ 	//kNN is sort from closest to farthest neighbor
+ 	//searches for the first neighbor that is out of radius
Index: /issm/oecreview/Archive/18296-19100/ISSM-18919-18920.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18919-18920.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18919-18920.diff	(revision 19102)
@@ -0,0 +1,1192 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18919)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18920)
+@@ -305,9 +305,6 @@
+ 	*ptransform=transform;
+ }
+ /*}}}*/
+-void       Element::DeleteMaterials(void){/*{{{*/
+-	delete this->material;
+-}/*}}}*/
+ void       Element::DeepEcho(void){/*{{{*/
+ 
+ 	_printf_(EnumToStringx(this->ObjectEnum())<<" element:\n");
+@@ -342,40 +339,15 @@
+ 	return;
+ }
+ /*}}}*/
+-void       Element::Echo(void){/*{{{*/
+-	_printf_(EnumToStringx(this->ObjectEnum())<<" element:\n");
+-	_printf_("   id : "<<this->id <<"\n");
+-	_printf_("   sid: "<<this->sid<<"\n");
+-	if(vertices){
+-		int numvertices = this->GetNumberOfVertices();
+-		for(int i=0;i<numvertices;i++) vertices[i]->Echo();
+-	}
+-	else _printf_("vertices = NULL\n");
++void       Element::DeleteInput(int input_enum){/*{{{*/
+ 
+-	if(nodes){
+-		int numnodes = this->GetNumberOfNodes();
+-		for(int i=0;i<numnodes;i++) {
+-			_printf_("nodes[" << i << "] = " << nodes[i]);	
+-			nodes[i]->Echo();
+-		}
+-	}
+-	else _printf_("nodes = NULL\n");
++	inputs->DeleteInput(input_enum);
+ 
+-	if (material) material->Echo();
+-	else _printf_("material = NULL\n");
+-
+-	if (matpar) matpar->Echo();
+-	else _printf_("matpar = NULL\n");
+-
+-	_printf_("   parameters\n");
+-	if (parameters) parameters->Echo();
+-	else _printf_("parameters = NULL\n");
+-
+-	_printf_("   inputs\n");
+-	if (inputs) inputs->Echo();
+-	else _printf_("inputs=NULL\n");
+ }
+ /*}}}*/
++void       Element::DeleteMaterials(void){/*{{{*/
++	delete this->material;
++}/*}}}*/
+ IssmDouble Element::Divergence(void){/*{{{*/
+ 	/*Compute element divergence*/
+ 
+@@ -418,25 +390,25 @@
+ 	delete gauss;
+ 	return divergence;
+ }/*}}}*/
+-void       Element::dViscositydBSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/
++void       Element::dViscositydBFS(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){/*{{{*/
+ 
+ 	/*Intermediaries*/
+ 	IssmDouble dmudB;
++	IssmDouble epsilon3d[6];/* epsilon=[exx,eyy,exy,exy,exz,eyz];    */
+ 	IssmDouble epsilon2d[3];/* epsilon=[exx,eyy,exy];    */
+-	IssmDouble epsilon1d;   /* epsilon=[exx];    */
+ 	IssmDouble eps_eff;
++	IssmDouble eps0=1.e-27;
+ 
+-	 if(dim==2){
+-		 /* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exx*eyy*/
+-		 this->StrainRateSSA(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
+-		 eps_eff = sqrt(epsilon2d[0]*epsilon2d[0] + epsilon2d[1]*epsilon2d[1] + epsilon2d[2]*epsilon2d[2] + epsilon2d[0]*epsilon2d[1]);
+-	 }
+-	 else{
+-		 /* eps_eff^2 = 1/2 exx^2*/
+-		 this->StrainRateSSA1d(&epsilon1d,xyz_list,gauss,vx_input);
+-		 eps_eff = sqrt(epsilon1d*epsilon1d/2.);
+-	 }
+-
++	if(dim==3){
++		/* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
++		this->StrainRateFS(&epsilon3d[0],xyz_list,gauss,vx_input,vy_input,vz_input);
++		eps_eff = sqrt(epsilon3d[0]*epsilon3d[0] + epsilon3d[1]*epsilon3d[1] + epsilon3d[3]*epsilon3d[3] +  epsilon3d[4]*epsilon3d[4] + epsilon3d[5]*epsilon3d[5] + epsilon3d[0]*epsilon3d[1]+eps0*eps0);
++	}
++	else{
++		/* eps_eff^2 = 1/2 ( exx^2 + eyy^2 + 2*exy^2 )*/
++		this->StrainRateSSA(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
++		eps_eff = 1./sqrt(2.)*sqrt(epsilon2d[0]*epsilon2d[0] + epsilon2d[1]*epsilon2d[1] + 2.*epsilon2d[2]*epsilon2d[2]);
++	}
+ 	/*Get viscosity*/
+ 	material->GetViscosity_B(&dmudB,eps_eff);
+ 
+@@ -472,25 +444,25 @@
+ 
+ }
+ /*}}}*/
+-void       Element::dViscositydBFS(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){/*{{{*/
++void       Element::dViscositydBSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/
+ 
+ 	/*Intermediaries*/
+ 	IssmDouble dmudB;
+-	IssmDouble epsilon3d[6];/* epsilon=[exx,eyy,exy,exy,exz,eyz];    */
+ 	IssmDouble epsilon2d[3];/* epsilon=[exx,eyy,exy];    */
++	IssmDouble epsilon1d;   /* epsilon=[exx];    */
+ 	IssmDouble eps_eff;
+-	IssmDouble eps0=1.e-27;
+ 
+-	if(dim==3){
+-		/* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
+-		this->StrainRateFS(&epsilon3d[0],xyz_list,gauss,vx_input,vy_input,vz_input);
+-		eps_eff = sqrt(epsilon3d[0]*epsilon3d[0] + epsilon3d[1]*epsilon3d[1] + epsilon3d[3]*epsilon3d[3] +  epsilon3d[4]*epsilon3d[4] + epsilon3d[5]*epsilon3d[5] + epsilon3d[0]*epsilon3d[1]+eps0*eps0);
+-	}
+-	else{
+-		/* eps_eff^2 = 1/2 ( exx^2 + eyy^2 + 2*exy^2 )*/
+-		this->StrainRateSSA(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
+-		eps_eff = 1./sqrt(2.)*sqrt(epsilon2d[0]*epsilon2d[0] + epsilon2d[1]*epsilon2d[1] + 2.*epsilon2d[2]*epsilon2d[2]);
+-	}
++	 if(dim==2){
++		 /* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exx*eyy*/
++		 this->StrainRateSSA(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
++		 eps_eff = sqrt(epsilon2d[0]*epsilon2d[0] + epsilon2d[1]*epsilon2d[1] + epsilon2d[2]*epsilon2d[2] + epsilon2d[0]*epsilon2d[1]);
++	 }
++	 else{
++		 /* eps_eff^2 = 1/2 exx^2*/
++		 this->StrainRateSSA1d(&epsilon1d,xyz_list,gauss,vx_input);
++		 eps_eff = sqrt(epsilon1d*epsilon1d/2.);
++	 }
++
+ 	/*Get viscosity*/
+ 	material->GetViscosity_B(&dmudB,eps_eff);
+ 
+@@ -526,18 +498,49 @@
+ 
+ }
+ /*}}}*/
+-void       Element::ThermalToEnthalpy(IssmDouble* penthalpy,IssmDouble temperature,IssmDouble waterfraction,IssmDouble pressure){/*{{{*/
+-	matpar->ThermalToEnthalpy(penthalpy,temperature,waterfraction,pressure);
+-}/*}}}*/
+-void       Element::EnthalpyToThermal(IssmDouble* ptemperature,IssmDouble* pwaterfraction,IssmDouble enthalpy,IssmDouble pressure){/*{{{*/
+-	matpar->EnthalpyToThermal(ptemperature,pwaterfraction,enthalpy,pressure);
+-}/*}}}*/
++void       Element::Echo(void){/*{{{*/
++	_printf_(EnumToStringx(this->ObjectEnum())<<" element:\n");
++	_printf_("   id : "<<this->id <<"\n");
++	_printf_("   sid: "<<this->sid<<"\n");
++	if(vertices){
++		int numvertices = this->GetNumberOfVertices();
++		for(int i=0;i<numvertices;i++) vertices[i]->Echo();
++	}
++	else _printf_("vertices = NULL\n");
++
++	if(nodes){
++		int numnodes = this->GetNumberOfNodes();
++		for(int i=0;i<numnodes;i++) {
++			_printf_("nodes[" << i << "] = " << nodes[i]);	
++			nodes[i]->Echo();
++		}
++	}
++	else _printf_("nodes = NULL\n");
++
++	if (material) material->Echo();
++	else _printf_("material = NULL\n");
++
++	if (matpar) matpar->Echo();
++	else _printf_("matpar = NULL\n");
++
++	_printf_("   parameters\n");
++	if (parameters) parameters->Echo();
++	else _printf_("parameters = NULL\n");
++
++	_printf_("   inputs\n");
++	if (inputs) inputs->Echo();
++	else _printf_("inputs=NULL\n");
++}
++/*}}}*/
+ IssmDouble Element::EnthalpyDiffusionParameter(IssmDouble enthalpy,IssmDouble pressure){/*{{{*/
+ 	return matpar->GetEnthalpyDiffusionParameter(enthalpy,pressure);
+ }/*}}}*/
+ IssmDouble Element::EnthalpyDiffusionParameterVolume(int numvertices,IssmDouble* enthalpy,IssmDouble* pressure){/*{{{*/
+ 	return matpar->GetEnthalpyDiffusionParameterVolume(numvertices,enthalpy,pressure);
+ }/*}}}*/
++void       Element::EnthalpyToThermal(IssmDouble* ptemperature,IssmDouble* pwaterfraction,IssmDouble enthalpy,IssmDouble pressure){/*{{{*/
++	matpar->EnthalpyToThermal(ptemperature,pwaterfraction,enthalpy,pressure);
++}/*}}}*/
+ void       Element::FindParam(bool* pvalue,int paramenum){/*{{{*/
+ 	this->parameters->FindParam(pvalue,paramenum);
+ }/*}}}*/
+@@ -573,155 +576,56 @@
+ 	*pdoflist=doflist;
+ }
+ /*}}}*/
+-void       Element::GetDofListVelocity(int** pdoflist,int setenum){/*{{{*/
++void       Element::GetDofListPressure(int** pdoflist,int setenum){/*{{{*/
+ 
+ 	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = this->NumberofNodesVelocity();
++	int vnumnodes = this->NumberofNodesVelocity();
++	int pnumnodes = this->NumberofNodesPressure();
+ 
+ 	/*First, figure out size of doflist and create it: */
+ 	int numberofdofs=0;
+-	for(int i=0;i<numnodes;i++) numberofdofs+=nodes[i]->GetNumberOfDofs(FSvelocityEnum,setenum);
++	for(int i=vnumnodes;i<vnumnodes+pnumnodes;i++) numberofdofs+=nodes[i]->GetNumberOfDofs(FSApproximationEnum,setenum);
+ 
+ 	/*Allocate output*/
+ 	int* doflist=xNew<int>(numberofdofs);
+ 
+ 	/*Populate: */
+ 	int count=0;
+-	for(int i=0;i<numnodes;i++){
+-		nodes[i]->GetDofList(doflist+count,FSvelocityEnum,setenum);
+-		count+=nodes[i]->GetNumberOfDofs(FSvelocityEnum,setenum);
++	for(int i=vnumnodes;i<vnumnodes+pnumnodes;i++){
++		nodes[i]->GetDofList(doflist+count,FSApproximationEnum,setenum);
++		count+=nodes[i]->GetNumberOfDofs(FSApproximationEnum,setenum);
+ 	}
+ 
+ 	/*Assign output pointers:*/
+ 	*pdoflist=doflist;
+ }
+ /*}}}*/
+-void       Element::GetDofListPressure(int** pdoflist,int setenum){/*{{{*/
++void       Element::GetDofListVelocity(int** pdoflist,int setenum){/*{{{*/
+ 
+ 	/*Fetch number of nodes and dof for this finite element*/
+-	int vnumnodes = this->NumberofNodesVelocity();
+-	int pnumnodes = this->NumberofNodesPressure();
++	int numnodes = this->NumberofNodesVelocity();
+ 
+ 	/*First, figure out size of doflist and create it: */
+ 	int numberofdofs=0;
+-	for(int i=vnumnodes;i<vnumnodes+pnumnodes;i++) numberofdofs+=nodes[i]->GetNumberOfDofs(FSApproximationEnum,setenum);
++	for(int i=0;i<numnodes;i++) numberofdofs+=nodes[i]->GetNumberOfDofs(FSvelocityEnum,setenum);
+ 
+ 	/*Allocate output*/
+ 	int* doflist=xNew<int>(numberofdofs);
+ 
+ 	/*Populate: */
+ 	int count=0;
+-	for(int i=vnumnodes;i<vnumnodes+pnumnodes;i++){
+-		nodes[i]->GetDofList(doflist+count,FSApproximationEnum,setenum);
+-		count+=nodes[i]->GetNumberOfDofs(FSApproximationEnum,setenum);
++	for(int i=0;i<numnodes;i++){
++		nodes[i]->GetDofList(doflist+count,FSvelocityEnum,setenum);
++		count+=nodes[i]->GetNumberOfDofs(FSvelocityEnum,setenum);
+ 	}
+ 
+ 	/*Assign output pointers:*/
+ 	*pdoflist=doflist;
+ }
+ /*}}}*/
+-IssmDouble Element::GetMaterialParameter(int enum_in){/*{{{*/
+-
+-	_assert_(this->matpar);
+-	switch(enum_in){ // FIXME: change this to material
+-		case MaterialsRheologyNEnum:
+-			return this->material->GetN();
+-		case MaterialsRheologyBEnum:
+-			return this->material->GetB();
+-		case MaterialsRheologyBbarEnum:
+-			return this->material->GetBbar();
+-		default:
+-			return this->matpar->GetMaterialParameter(enum_in);
+-	}
+-}/*}}}*/
+-void       Element::GetPhi(IssmDouble* phi, IssmDouble*  epsilon, IssmDouble viscosity){/*{{{*/
+-	/*Compute deformational heating from epsilon and viscosity */
+-
+-	IssmDouble epsilon_matrix[3][3];
+-	IssmDouble epsilon_eff;
+-	IssmDouble epsilon_sqr[3][3];
+-
+-	/* Build epsilon matrix */
+-	epsilon_matrix[0][0]=epsilon[0];
+-	epsilon_matrix[1][0]=epsilon[3];
+-	epsilon_matrix[2][0]=epsilon[4];
+-	epsilon_matrix[0][1]=epsilon[3];
+-	epsilon_matrix[1][1]=epsilon[1];
+-	epsilon_matrix[2][1]=epsilon[5];
+-	epsilon_matrix[0][2]=epsilon[4];
+-	epsilon_matrix[1][2]=epsilon[5];
+-	epsilon_matrix[2][2]=epsilon[2];
+-
+-	/* Effective value of epsilon_matrix */
+-	epsilon_sqr[0][0]=epsilon_matrix[0][0]*epsilon_matrix[0][0];
+-	epsilon_sqr[1][0]=epsilon_matrix[1][0]*epsilon_matrix[1][0];
+-	epsilon_sqr[2][0]=epsilon_matrix[2][0]*epsilon_matrix[2][0];
+-	epsilon_sqr[0][1]=epsilon_matrix[0][1]*epsilon_matrix[0][1];
+-	epsilon_sqr[1][1]=epsilon_matrix[1][1]*epsilon_matrix[1][1];
+-	epsilon_sqr[2][1]=epsilon_matrix[2][1]*epsilon_matrix[2][1];
+-	epsilon_sqr[0][2]=epsilon_matrix[0][2]*epsilon_matrix[0][2];
+-	epsilon_sqr[1][2]=epsilon_matrix[1][2]*epsilon_matrix[1][2];
+-	epsilon_sqr[2][2]=epsilon_matrix[2][2]*epsilon_matrix[2][2];
+-	epsilon_eff=1/sqrt(2.)*sqrt(epsilon_sqr[0][0]+epsilon_sqr[0][1]+ epsilon_sqr[0][2]+ epsilon_sqr[1][0]+ epsilon_sqr[1][1]+ epsilon_sqr[1][2]+ epsilon_sqr[2][0]+ epsilon_sqr[2][1]+ epsilon_sqr[2][2]);
+-
+-	/*Phi = Tr(sigma * eps) 
+-	 *    = Tr(sigma'* eps)
+-	 *    = 2 * eps_eff * sigma'_eff
+-	 *    = 4 * mu * eps_eff ^2*/
+-	*phi=4.*epsilon_eff*epsilon_eff*viscosity;
+-}
+-/*}}}*/
+ Input*     Element::GetInput(int inputenum){/*{{{*/
+ 	return inputs->GetInput(inputenum);
+ }/*}}}*/
+-void       Element::GetInputListOnVertices(IssmDouble* pvalue,int enumtype){/*{{{*/
+-
+-	/*Recover input*/
+-	Input* input=this->GetInput(enumtype);
+-	if (!input) _error_("Input " << EnumToStringx(enumtype) << " not found in element");
+-
+-	/*Fetch number vertices for this element*/
+-	int numvertices = this->GetNumberOfVertices();
+-
+-	/*Checks in debugging mode*/
+-	_assert_(pvalue);
+-
+-	/* Start looping on the number of vertices: */
+-	Gauss*gauss=this->NewGauss();
+-	for(int iv=0;iv<numvertices;iv++){
+-		gauss->GaussVertex(iv);
+-		input->GetInputValue(&pvalue[iv],gauss);
+-	}
+-
+-	/*clean-up*/
+-	delete gauss;
+-}
+-/*}}}*/
+-void       Element::GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue){/*{{{*/
+-
+-	/*Recover input*/
+-	Input* input=this->GetInput(enumtype);
+-
+-	/*Checks in debugging mode*/
+-	_assert_(pvalue);
+-
+-	/*Fetch number vertices for this element*/
+-	int numvertices = this->GetNumberOfVertices();
+-
+-	/* Start looping on the number of vertices: */
+-	if (input){
+-		Gauss* gauss=this->NewGauss();
+-		for (int iv=0;iv<numvertices;iv++){
+-			gauss->GaussVertex(iv);
+-			input->GetInputValue(&pvalue[iv],gauss);
+-		}
+-		delete gauss;
+-	}
+-	else{
+-		for(int iv=0;iv<numvertices;iv++) pvalue[iv]=defaultvalue;
+-	}
+-}
+-/*}}}*/
+ void       Element::GetInputListOnNodes(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue){/*{{{*/
+ 
+ 	_assert_(pvalue);
+@@ -777,6 +681,54 @@
+ 	delete gauss;
+ }
+ /*}}}*/
++void       Element::GetInputListOnVertices(IssmDouble* pvalue,int enumtype){/*{{{*/
++
++	/*Recover input*/
++	Input* input=this->GetInput(enumtype);
++	if (!input) _error_("Input " << EnumToStringx(enumtype) << " not found in element");
++
++	/*Fetch number vertices for this element*/
++	int numvertices = this->GetNumberOfVertices();
++
++	/*Checks in debugging mode*/
++	_assert_(pvalue);
++
++	/* Start looping on the number of vertices: */
++	Gauss*gauss=this->NewGauss();
++	for(int iv=0;iv<numvertices;iv++){
++		gauss->GaussVertex(iv);
++		input->GetInputValue(&pvalue[iv],gauss);
++	}
++
++	/*clean-up*/
++	delete gauss;
++}
++/*}}}*/
++void       Element::GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue){/*{{{*/
++
++	/*Recover input*/
++	Input* input=this->GetInput(enumtype);
++
++	/*Checks in debugging mode*/
++	_assert_(pvalue);
++
++	/*Fetch number vertices for this element*/
++	int numvertices = this->GetNumberOfVertices();
++
++	/* Start looping on the number of vertices: */
++	if (input){
++		Gauss* gauss=this->NewGauss();
++		for (int iv=0;iv<numvertices;iv++){
++			gauss->GaussVertex(iv);
++			input->GetInputValue(&pvalue[iv],gauss);
++		}
++		delete gauss;
++	}
++	else{
++		for(int iv=0;iv<numvertices;iv++) pvalue[iv]=defaultvalue;
++	}
++}
++/*}}}*/
+ void       Element::GetInputLocalMinMaxOnNodes(IssmDouble* min,IssmDouble* max,IssmDouble* ug){/*{{{*/
+ 
+ 
+@@ -832,26 +784,77 @@
+ 	input->GetInputValue(pvalue,gauss);
+ 
+ }/*}}}*/
+-void       Element::GetNodesSidList(int* sidlist){/*{{{*/
++IssmDouble Element::GetMaterialParameter(int enum_in){/*{{{*/
+ 
+-	_assert_(sidlist);
++	_assert_(this->matpar);
++	switch(enum_in){ // FIXME: change this to material
++		case MaterialsRheologyNEnum:
++			return this->material->GetN();
++		case MaterialsRheologyBEnum:
++			return this->material->GetB();
++		case MaterialsRheologyBbarEnum:
++			return this->material->GetBbar();
++		default:
++			return this->matpar->GetMaterialParameter(enum_in);
++	}
++}/*}}}*/
++void       Element::GetNodesLidList(int* lidlist){/*{{{*/
++
++	_assert_(lidlist);
+ 	_assert_(nodes);
+ 	int numnodes = this->GetNumberOfNodes();
+ 	for(int i=0;i<numnodes;i++){
+-		sidlist[i]=nodes[i]->Sid();
++		lidlist[i]=nodes[i]->Lid();
+ 	}
+ }
+ /*}}}*/
+-void       Element::GetNodesLidList(int* lidlist){/*{{{*/
++void       Element::GetNodesSidList(int* sidlist){/*{{{*/
+ 
+-	_assert_(lidlist);
++	_assert_(sidlist);
+ 	_assert_(nodes);
+ 	int numnodes = this->GetNumberOfNodes();
+ 	for(int i=0;i<numnodes;i++){
+-		lidlist[i]=nodes[i]->Lid();
++		sidlist[i]=nodes[i]->Sid();
+ 	}
+ }
+ /*}}}*/
++void       Element::GetPhi(IssmDouble* phi, IssmDouble*  epsilon, IssmDouble viscosity){/*{{{*/
++	/*Compute deformational heating from epsilon and viscosity */
++
++	IssmDouble epsilon_matrix[3][3];
++	IssmDouble epsilon_eff;
++	IssmDouble epsilon_sqr[3][3];
++
++	/* Build epsilon matrix */
++	epsilon_matrix[0][0]=epsilon[0];
++	epsilon_matrix[1][0]=epsilon[3];
++	epsilon_matrix[2][0]=epsilon[4];
++	epsilon_matrix[0][1]=epsilon[3];
++	epsilon_matrix[1][1]=epsilon[1];
++	epsilon_matrix[2][1]=epsilon[5];
++	epsilon_matrix[0][2]=epsilon[4];
++	epsilon_matrix[1][2]=epsilon[5];
++	epsilon_matrix[2][2]=epsilon[2];
++
++	/* Effective value of epsilon_matrix */
++	epsilon_sqr[0][0]=epsilon_matrix[0][0]*epsilon_matrix[0][0];
++	epsilon_sqr[1][0]=epsilon_matrix[1][0]*epsilon_matrix[1][0];
++	epsilon_sqr[2][0]=epsilon_matrix[2][0]*epsilon_matrix[2][0];
++	epsilon_sqr[0][1]=epsilon_matrix[0][1]*epsilon_matrix[0][1];
++	epsilon_sqr[1][1]=epsilon_matrix[1][1]*epsilon_matrix[1][1];
++	epsilon_sqr[2][1]=epsilon_matrix[2][1]*epsilon_matrix[2][1];
++	epsilon_sqr[0][2]=epsilon_matrix[0][2]*epsilon_matrix[0][2];
++	epsilon_sqr[1][2]=epsilon_matrix[1][2]*epsilon_matrix[1][2];
++	epsilon_sqr[2][2]=epsilon_matrix[2][2]*epsilon_matrix[2][2];
++	epsilon_eff=1/sqrt(2.)*sqrt(epsilon_sqr[0][0]+epsilon_sqr[0][1]+ epsilon_sqr[0][2]+ epsilon_sqr[1][0]+ epsilon_sqr[1][1]+ epsilon_sqr[1][2]+ epsilon_sqr[2][0]+ epsilon_sqr[2][1]+ epsilon_sqr[2][2]);
++
++	/*Phi = Tr(sigma * eps) 
++	 *    = Tr(sigma'* eps)
++	 *    = 2 * eps_eff * sigma'_eff
++	 *    = 4 * mu * eps_eff ^2*/
++	*phi=4.*epsilon_eff*epsilon_eff*viscosity;
++}
++/*}}}*/
+ void       Element::GetVectorFromInputs(Vector<IssmDouble>* vector,int input_enum){/*{{{*/
+ 
+ 	/*Fetch number vertices for this element and allocate arrays*/
+@@ -877,6 +880,12 @@
+ 
+ }
+ /*}}}*/
++void       Element::GetVerticesConnectivityList(int* connectivity){/*{{{*/
++
++	int numvertices = this->GetNumberOfVertices();
++	for(int i=0;i<numvertices;i++) connectivity[i]=this->vertices[i]->Connectivity();
++}
++/*}}}*/
+ void       Element::GetVerticesCoordinates(IssmDouble** pxyz_list){/*{{{*/
+ 
+ 	int         numvertices = this->GetNumberOfVertices();
+@@ -892,12 +901,6 @@
+ 	for(int i=0;i<numvertices;i++) sidlist[i]=this->vertices[i]->Sid();
+ }
+ /*}}}*/
+-void       Element::GetVerticesConnectivityList(int* connectivity){/*{{{*/
+-
+-	int numvertices = this->GetNumberOfVertices();
+-	for(int i=0;i<numvertices;i++) connectivity[i]=this->vertices[i]->Connectivity();
+-}
+-/*}}}*/
+ IssmDouble Element::GetXcoord(IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 
+ 	/*output*/
+@@ -1057,12 +1060,6 @@
+ 
+ }
+ /*}}}*/
+-void       Element::DeleteInput(int input_enum){/*{{{*/
+-
+-	inputs->DeleteInput(input_enum);
+-
+-}
+-/*}}}*/
+ void       Element::InputUpdateFromConstant(int constant, int name){/*{{{*/
+ 
+ 	/*Check that name is an element input*/
+@@ -1297,10 +1294,6 @@
+ 
+ }
+ /*}}}*/
+-ElementVector* Element::NewElementVector(int approximation_enum){/*{{{*/
+-	return new ElementVector(nodes,this->GetNumberOfNodes(),this->parameters,approximation_enum);
+-}
+-/*}}}*/
+ ElementMatrix* Element::NewElementMatrix(int approximation_enum){/*{{{*/
+ 	return new ElementMatrix(nodes,this->GetNumberOfNodes(),this->parameters,approximation_enum);
+ }
+@@ -1309,6 +1302,10 @@
+ 	return new ElementMatrix(nodes,number_nodes,this->parameters,approximation_enum);
+ }
+ /*}}}*/
++ElementVector* Element::NewElementVector(int approximation_enum){/*{{{*/
++	return new ElementVector(nodes,this->GetNumberOfNodes(),this->parameters,approximation_enum);
++}
++/*}}}*/
+ IssmDouble Element::PureIceEnthalpy(IssmDouble pressure){/*{{{*/
+ 	return this->matpar->PureIceEnthalpy(pressure);
+ }/*}}}*/
+@@ -1392,6 +1389,14 @@
+ 	*pinterpolation   = input->GetResultInterpolation();
+ 	*pnodesperelement = input->GetResultNumberOfNodes();
+ }/*}}}*/
++void       Element::ResultToPatch(IssmDouble* values,int nodesperelement,int output_enum){/*{{{*/
++
++	Input* input=this->inputs->GetInput(output_enum);
++	if(!input) _error_("input "<<EnumToStringx(output_enum)<<" not found in element");
++
++	input->ResultToPatch(values,nodesperelement,this->Sid());
++
++} /*}}}*/
+ void       Element::ResultToVector(Vector<IssmDouble>* vector,int output_enum){/*{{{*/
+ 
+ 	Input* input=this->inputs->GetInput(output_enum);
+@@ -1440,14 +1445,6 @@
+ 					 _error_("interpolation "<<EnumToStringx(input->GetResultInterpolation())<<" not supported yet");
+ 	}
+ } /*}}}*/
+-void       Element::ResultToPatch(IssmDouble* values,int nodesperelement,int output_enum){/*{{{*/
+-
+-	Input* input=this->inputs->GetInput(output_enum);
+-	if(!input) _error_("input "<<EnumToStringx(output_enum)<<" not found in element");
+-
+-	input->ResultToPatch(values,nodesperelement,this->Sid());
+-
+-} /*}}}*/
+ void       Element::SetwiseNodeConnectivity(int* pd_nz,int* po_nz,Node* node,bool* flags,int* flagsindices,int set1_enum,int set2_enum){/*{{{*/
+ 
+ 	/*Intermediaries*/
+@@ -1524,295 +1521,6 @@
+ 
+ }
+ /*}}}*/
+-IssmDouble Element::TMeltingPoint(IssmDouble pressure){/*{{{*/
+-	_assert_(matpar);
+-	return this->matpar->TMeltingPoint(pressure);
+-}/*}}}*/
+-void       Element::StressMaxPrincipalCreateInput(void){/*{{{*/
+-
+-	/*Intermediaries*/
+-	IssmDouble *xyz_list = NULL;
+-	IssmDouble  sigma_xx,sigma_yy,sigma_zz,sigma_xy,sigma_xz,sigma_yz;
+-	IssmDouble  a,b,c,d,x[3],max;
+-	int         dim,numroots;
+-
+-	/*First: get stress tensor*/
+-	this->ComputeStressTensor();
+-
+-	/*Get domain dimension*/
+-	this->FindParam(&dim,DomainDimensionEnum);
+-
+-	/*Fetch number vertices and allocate memory*/
+-	int         numvertices  = this->GetNumberOfVertices();
+-	IssmDouble* maxprincipal = xNew<IssmDouble>(numvertices);
+-
+-	/*Retrieve all inputs and parameters*/
+-	this->GetVerticesCoordinatesBase(&xyz_list);
+-	Input* sigma_xx_input  = this->GetInput(StressTensorxxEnum); _assert_(sigma_xx_input);
+-	Input* sigma_yy_input  = this->GetInput(StressTensoryyEnum); _assert_(sigma_yy_input);
+-	Input* sigma_xy_input  = this->GetInput(StressTensorxyEnum); _assert_(sigma_xy_input);
+-	Input* sigma_xz_input  = NULL;
+-	Input* sigma_yz_input  = NULL;
+-	Input* sigma_zz_input  = NULL;
+-	if(dim==3){
+-		sigma_xz_input  = this->GetInput(StressTensorxzEnum); _assert_(sigma_xz_input);
+-		sigma_yz_input  = this->GetInput(StressTensoryzEnum); _assert_(sigma_yz_input);
+-		sigma_zz_input  = this->GetInput(StressTensorzzEnum); _assert_(sigma_zz_input);
+-	}
+-
+-	/*loop over vertices: */
+-	Gauss* gauss=this->NewGauss();
+-	for (int iv=0;iv<numvertices;iv++){
+-		gauss->GaussVertex(iv);
+-
+-		sigma_xx_input->GetInputValue(&sigma_xx,gauss);
+-		sigma_yy_input->GetInputValue(&sigma_yy,gauss);
+-		sigma_xy_input->GetInputValue(&sigma_xy,gauss);
+-		if(dim==3){
+-			sigma_xz_input->GetInputValue(&sigma_xz,gauss);
+-			sigma_yz_input->GetInputValue(&sigma_yz,gauss);
+-			sigma_zz_input->GetInputValue(&sigma_zz,gauss);
+-		}
+-
+-		if(dim==2){
+-			a = 0.;
+-			b = 1.;
+-			c = -sigma_yy -sigma_xx;
+-			d = sigma_xx*sigma_yy - sigma_xy*sigma_xy;
+-		}
+-		else{
+-			a = -1.;
+-			b = sigma_xx+sigma_yy+sigma_zz;
+-			c = -sigma_xx*sigma_yy -sigma_xx*sigma_zz -sigma_yy*sigma_zz + sigma_xy*sigma_xy +sigma_xz*sigma_xz +sigma_yz*sigma_yz;
+-			d = sigma_xx*sigma_yy*sigma_zz - sigma_xx*sigma_yz*sigma_yz -sigma_yy*sigma_xz*sigma_xz - sigma_zz*sigma_xy*sigma_xy + 2.*sigma_xy*sigma_xz*sigma_yz;
+-		}
+-
+-		/*Get roots of polynomials*/
+-		cubic(a,b,c,d,x,&numroots);
+-
+-		/*Initialize maximum eigne value*/
+-		if(numroots>0){
+-			max = fabs(x[0]);
+-		}
+-		else{
+-			_error_("No eigen value found");
+-		}
+-
+-		/*Get max*/
+-		for(int i=1;i<numroots;i++){
+-			if(fabs(x[i])>max) max = fabs(x[i]);
+-		}
+-
+-		maxprincipal[iv]=max;
+-	}
+-
+-	/*Create input*/
+-	this->AddInput(StressMaxPrincipalEnum,maxprincipal,P1Enum);
+-
+-	/*Clean up and return*/
+-	xDelete<IssmDouble>(maxprincipal);
+-	delete gauss;
+-}
+-/*}}}*/
+-void       Element::ViscousHeatingCreateInput(void){/*{{{*/
+-
+-	/*Intermediaries*/
+-	IssmDouble phi;
+-	IssmDouble viscosity;
+-	IssmDouble epsilon[6];
+-	IssmDouble thickness;
+-	IssmDouble *xyz_list = NULL;
+-
+-	/*Fetch number vertices and allocate memory*/
+-	int         numvertices    = this->GetNumberOfVertices();
+-	IssmDouble* viscousheating = xNew<IssmDouble>(numvertices);
+-
+-	/*Retrieve all inputs and parameters*/
+-	this->GetVerticesCoordinatesBase(&xyz_list);
+-	Input* vx_input        = this->GetInput(VxEnum); _assert_(vx_input);
+-	Input* vy_input        = this->GetInput(VyEnum); _assert_(vy_input);
+-	Input* vz_input        = this->GetInput(VzEnum); _assert_(vz_input);
+-	Input* thickness_input = this->GetInput(ThicknessEnum); _assert_(thickness_input);
+-
+-	/*loop over vertices: */
+-	Gauss* gauss=this->NewGauss();
+-	for (int iv=0;iv<numvertices;iv++){
+-		gauss->GaussVertex(iv);
+-
+-		thickness_input->GetInputValue(&thickness,gauss);
+-
+-		this->StrainRateFS(&epsilon[0],xyz_list,gauss,vx_input,vy_input,vz_input);
+-		this->ViscosityFS(&viscosity,3,xyz_list,gauss,vx_input,vy_input,vz_input);
+-		this->GetPhi(&phi,&epsilon[0],viscosity);
+-
+-		viscousheating[iv]=phi*thickness;
+-	}
+-
+-	/*Create PentaVertex input, which will hold the basal friction:*/
+-	this->AddInput(ViscousHeatingEnum,viscousheating,P1Enum);
+-
+-	/*Clean up and return*/
+-	xDelete<IssmDouble>(viscousheating);
+-	delete gauss;
+-}
+-/*}}}*/
+-void       Element::ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){/*{{{*/
+-	/*The effective strain rate is defined in Paterson 3d Ed p 91 eq 9,
+-	 * and Cuffey p 303 eq 8.18:
+-	 *
+-	 *  2 eps_eff^2 = eps_xx^2 + eps_yy^2 + eps_zz^2 + 2(eps_xy^2 + eps_xz^2 + eps_yz^2)
+-	 *
+-	 *  or
+-	 *
+-	 *  eps_eff = 1/sqrt(2) sqrt( \sum_ij eps_ij^2 )
+-	 *
+-	 *          = 1/sqrt(2) ||eps||_F
+-	 *
+-	 *  where ||.||_F is the Frobenius norm */
+-
+-	/*Intermediaries*/
+-	IssmDouble viscosity;
+-	IssmDouble epsilon3d[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
+-	IssmDouble epsilon2d[3]; /* epsilon=[exx,eyy,exy];            */
+-	IssmDouble eps_eff;
+-	IssmDouble eps0=1.e-27;
+-
+-	if(dim==3){
+-		/* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
+-		this->StrainRateFS(&epsilon3d[0],xyz_list,gauss,vx_input,vy_input,vz_input);
+-		eps_eff = sqrt(epsilon3d[0]*epsilon3d[0] + epsilon3d[1]*epsilon3d[1] + epsilon3d[3]*epsilon3d[3] +  epsilon3d[4]*epsilon3d[4] + epsilon3d[5]*epsilon3d[5] + epsilon3d[0]*epsilon3d[1]+eps0*eps0);
+-	}
+-	else{
+-		/* eps_eff^2 = 1/2 ( exx^2 + eyy^2 + 2*exy^2 )*/
+-		this->StrainRateSSA(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
+-		eps_eff = 1./sqrt(2.)*sqrt(epsilon2d[0]*epsilon2d[0] + epsilon2d[1]*epsilon2d[1] + 2.*epsilon2d[2]*epsilon2d[2]);
+-	}
+-
+-	/*Get viscosity*/
+-	material->GetViscosity(&viscosity,eps_eff);
+-
+-	/*Assign output pointer*/
+-	*pviscosity=viscosity;
+-}
+-/*}}}*/
+-void       Element::ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* surface_input){/*{{{*/
+-	/*Compute the L1L2 viscosity
+-	 *
+-	 *      1
+-	 * mu = - A^-1 (sigma'_e)^(1-n)
+-	 *      2
+-	 *
+-	 * sigma'_e^2 = |sigma'_//|^2 + |sigma'_perp|^2 (see Perego 2012 eq. 17,18)
+-	 *
+-	 * L1L2 assumptions:
+-	 *
+-	 * (1) |eps_b|_// = A (|sigma'_//|^2 + |sigma'_perp|^2)^((n-1)/2) |sigma'_//|
+-	 * (2) |sigma'_perp|^2 = |rho g (s-z) grad(s)|^2
+-	 *
+-	 * Assuming that n = 3, we have a polynom of degree 3 to solve (the only unkown is X=|sigma'_//|)
+-	 *
+-	 * A X^3 + A |rho g (s-z) grad(s)|^2 X - |eps_b|_// = 0     */
+-
+-	IssmDouble z,s,viscosity,p,q,delta;
+-	IssmDouble tau_perp,tau_par,eps_b,A;
+-	IssmDouble epsilon[5];   /*exx eyy exy exz eyz*/
+-	IssmDouble slope[3];
+-
+-	/*Check that both inputs have been found*/
+-	if (!vx_input || !vy_input || !surface_input) _error_("Input missing");
+-
+-	/*Get tau_perp*/
+-	surface_input->GetInputValue(&s,gauss);
+-	surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss);
+-	z=this->GetZcoord(xyz_list,gauss);
+-	tau_perp = matpar->GetRhoIce() * matpar->GetG() * fabs(s-z)*sqrt(slope[0]*slope[0]+slope[1]*slope[1]);
+-
+-	/* Get eps_b*/
+-	this->StrainRateHO(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
+-	eps_b = sqrt(epsilon[0]*epsilon[0] + epsilon[1]*epsilon[1] + epsilon[0]*epsilon[1] + epsilon[2]*epsilon[2]);
+-	if(eps_b==0.){
+-		*pviscosity = 2.5e+17;
+-		return;
+-	}
+-
+-	/*Get A*/
+-	_assert_(material->GetN()==3.0);
+-	A=material->GetA();
+-
+-	/*Solve for tau_perp (http://fr.wikipedia.org/wiki/Méthode_de_Cardan)*/
+-	p     = tau_perp *tau_perp;
+-	q     = - eps_b/A;
+-	delta = q *q + p*p*p*4./27.;
+-	_assert_(delta>0);
+-	tau_par = pow(0.5*(-q+sqrt(delta)),1./3.) - pow(0.5*(q+sqrt(delta)),1./3.);
+-
+-	/*Viscosity*/
+-	viscosity = 1./(2.*A*(tau_par*tau_par + tau_perp*tau_perp));
+-	_assert_(!xIsNan(viscosity));
+-	_assert_(viscosity > 0.);
+-
+-	/*Assign output pointer*/
+-	*pviscosity = viscosity;
+-}/*}}}*/
+-void       Element::ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/
+-
+-	/*Intermediaries*/
+-	IssmDouble viscosity;
+-	IssmDouble epsilon3d[5];/* epsilon=[exx,eyy,exy,exz,eyz];*/
+-	IssmDouble epsilon2d[2];/* epsilon=[exx,exy];            */
+-	IssmDouble eps_eff;
+-
+-	if(dim==3){
+-		/* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
+-		this->StrainRateHO(&epsilon3d[0],xyz_list,gauss,vx_input,vy_input);
+-		eps_eff = sqrt(epsilon3d[0]*epsilon3d[0] + epsilon3d[1]*epsilon3d[1] + epsilon3d[2]*epsilon3d[2] +  epsilon3d[3]*epsilon3d[3] + epsilon3d[4]*epsilon3d[4] + epsilon3d[0]*epsilon3d[1]);
+-	}
+-	else{
+-		/* eps_eff^2 = 1/2 (exx^2 + 2*exy^2 )*/
+-		this->StrainRateHO2dvertical(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
+-		eps_eff = 1./sqrt(2.)*sqrt(epsilon2d[0]*epsilon2d[0] + 2.*epsilon2d[1]*epsilon2d[1]);
+-	}
+-
+-	/*Get viscosity*/
+-	material->GetViscosity(&viscosity,eps_eff);
+-
+-	/*Assign output pointer*/
+-	*pviscosity=viscosity;
+-}/*}}}*/
+-void       Element::ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/
+-
+-	/*Intermediaries*/
+-	IssmDouble viscosity;
+-	IssmDouble epsilon2d[3];/* epsilon=[exx,eyy,exy];    */
+-	IssmDouble epsilon1d;   /* epsilon=[exx];    */
+-	IssmDouble eps_eff;
+-
+-	 if(dim==2){
+-		 /* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exx*eyy*/
+-		 this->StrainRateSSA(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
+-		 eps_eff = sqrt(epsilon2d[0]*epsilon2d[0] + epsilon2d[1]*epsilon2d[1] + epsilon2d[2]*epsilon2d[2] + epsilon2d[0]*epsilon2d[1]);
+-	 }
+-	 else{
+-		 /* eps_eff^2 = 1/2 exx^2*/
+-		 this->StrainRateSSA1d(&epsilon1d,xyz_list,gauss,vx_input);
+-		 eps_eff = sqrt(epsilon1d*epsilon1d/2.);
+-	 }
+-
+-	/*Get viscosity*/
+-	material->GetViscosityBar(&viscosity,eps_eff);
+-
+-	/*Assign output pointer*/
+-	*pviscosity=viscosity;
+-}/*}}}*/
+-void       Element::ViscositySSADerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon){/*{{{*/
+-	this->material->GetViscosity2dDerivativeEpsSquare(pmu_prime,epsilon);
+-}/*}}}*/
+-void       Element::ViscosityHODerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon){/*{{{*/
+-	this->material->GetViscosityDerivativeEpsSquare(pmu_prime,epsilon);
+-}/*}}}*/
+-void       Element::ViscosityFSDerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon){/*{{{*/
+-	this->material->GetViscosityDerivativeEpsSquare(pmu_prime,epsilon);
+-}/*}}}*/
+ void       Element::StrainRateFS(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){/*{{{*/
+ 	/*Compute the 3d Strain Rate (6 components):
+ 	 *
+@@ -1929,6 +1637,99 @@
+ 	*epsilon = dvx[0];
+ 
+ }/*}}}*/
++void       Element::StressMaxPrincipalCreateInput(void){/*{{{*/
++
++	/*Intermediaries*/
++	IssmDouble *xyz_list = NULL;
++	IssmDouble  sigma_xx,sigma_yy,sigma_zz,sigma_xy,sigma_xz,sigma_yz;
++	IssmDouble  a,b,c,d,x[3],max;
++	int         dim,numroots;
++
++	/*First: get stress tensor*/
++	this->ComputeStressTensor();
++
++	/*Get domain dimension*/
++	this->FindParam(&dim,DomainDimensionEnum);
++
++	/*Fetch number vertices and allocate memory*/
++	int         numvertices  = this->GetNumberOfVertices();
++	IssmDouble* maxprincipal = xNew<IssmDouble>(numvertices);
++
++	/*Retrieve all inputs and parameters*/
++	this->GetVerticesCoordinatesBase(&xyz_list);
++	Input* sigma_xx_input  = this->GetInput(StressTensorxxEnum); _assert_(sigma_xx_input);
++	Input* sigma_yy_input  = this->GetInput(StressTensoryyEnum); _assert_(sigma_yy_input);
++	Input* sigma_xy_input  = this->GetInput(StressTensorxyEnum); _assert_(sigma_xy_input);
++	Input* sigma_xz_input  = NULL;
++	Input* sigma_yz_input  = NULL;
++	Input* sigma_zz_input  = NULL;
++	if(dim==3){
++		sigma_xz_input  = this->GetInput(StressTensorxzEnum); _assert_(sigma_xz_input);
++		sigma_yz_input  = this->GetInput(StressTensoryzEnum); _assert_(sigma_yz_input);
++		sigma_zz_input  = this->GetInput(StressTensorzzEnum); _assert_(sigma_zz_input);
++	}
++
++	/*loop over vertices: */
++	Gauss* gauss=this->NewGauss();
++	for (int iv=0;iv<numvertices;iv++){
++		gauss->GaussVertex(iv);
++
++		sigma_xx_input->GetInputValue(&sigma_xx,gauss);
++		sigma_yy_input->GetInputValue(&sigma_yy,gauss);
++		sigma_xy_input->GetInputValue(&sigma_xy,gauss);
++		if(dim==3){
++			sigma_xz_input->GetInputValue(&sigma_xz,gauss);
++			sigma_yz_input->GetInputValue(&sigma_yz,gauss);
++			sigma_zz_input->GetInputValue(&sigma_zz,gauss);
++		}
++
++		if(dim==2){
++			a = 0.;
++			b = 1.;
++			c = -sigma_yy -sigma_xx;
++			d = sigma_xx*sigma_yy - sigma_xy*sigma_xy;
++		}
++		else{
++			a = -1.;
++			b = sigma_xx+sigma_yy+sigma_zz;
++			c = -sigma_xx*sigma_yy -sigma_xx*sigma_zz -sigma_yy*sigma_zz + sigma_xy*sigma_xy +sigma_xz*sigma_xz +sigma_yz*sigma_yz;
++			d = sigma_xx*sigma_yy*sigma_zz - sigma_xx*sigma_yz*sigma_yz -sigma_yy*sigma_xz*sigma_xz - sigma_zz*sigma_xy*sigma_xy + 2.*sigma_xy*sigma_xz*sigma_yz;
++		}
++
++		/*Get roots of polynomials*/
++		cubic(a,b,c,d,x,&numroots);
++
++		/*Initialize maximum eigne value*/
++		if(numroots>0){
++			max = fabs(x[0]);
++		}
++		else{
++			_error_("No eigen value found");
++		}
++
++		/*Get max*/
++		for(int i=1;i<numroots;i++){
++			if(fabs(x[i])>max) max = fabs(x[i]);
++		}
++
++		maxprincipal[iv]=max;
++	}
++
++	/*Create input*/
++	this->AddInput(StressMaxPrincipalEnum,maxprincipal,P1Enum);
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(maxprincipal);
++	delete gauss;
++}
++/*}}}*/
++void       Element::ThermalToEnthalpy(IssmDouble* penthalpy,IssmDouble temperature,IssmDouble waterfraction,IssmDouble pressure){/*{{{*/
++	matpar->ThermalToEnthalpy(penthalpy,temperature,waterfraction,pressure);
++}/*}}}*/
++IssmDouble Element::TMeltingPoint(IssmDouble pressure){/*{{{*/
++	_assert_(matpar);
++	return this->matpar->TMeltingPoint(pressure);
++}/*}}}*/
+ void       Element::TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,int transformenum){/*{{{*/
+ 
+ 	/*All nodes have the same Coordinate System*/
+@@ -2152,3 +1953,202 @@
+ 	xDelete<IssmDouble>(transform);
+ 	xDelete<IssmDouble>(values);
+ }/*}}}*/
++void       Element::ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){/*{{{*/
++	/*The effective strain rate is defined in Paterson 3d Ed p 91 eq 9,
++	 * and Cuffey p 303 eq 8.18:
++	 *
++	 *  2 eps_eff^2 = eps_xx^2 + eps_yy^2 + eps_zz^2 + 2(eps_xy^2 + eps_xz^2 + eps_yz^2)
++	 *
++	 *  or
++	 *
++	 *  eps_eff = 1/sqrt(2) sqrt( \sum_ij eps_ij^2 )
++	 *
++	 *          = 1/sqrt(2) ||eps||_F
++	 *
++	 *  where ||.||_F is the Frobenius norm */
++
++	/*Intermediaries*/
++	IssmDouble viscosity;
++	IssmDouble epsilon3d[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
++	IssmDouble epsilon2d[3]; /* epsilon=[exx,eyy,exy];            */
++	IssmDouble eps_eff;
++	IssmDouble eps0=1.e-27;
++
++	if(dim==3){
++		/* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
++		this->StrainRateFS(&epsilon3d[0],xyz_list,gauss,vx_input,vy_input,vz_input);
++		eps_eff = sqrt(epsilon3d[0]*epsilon3d[0] + epsilon3d[1]*epsilon3d[1] + epsilon3d[3]*epsilon3d[3] +  epsilon3d[4]*epsilon3d[4] + epsilon3d[5]*epsilon3d[5] + epsilon3d[0]*epsilon3d[1]+eps0*eps0);
++	}
++	else{
++		/* eps_eff^2 = 1/2 ( exx^2 + eyy^2 + 2*exy^2 )*/
++		this->StrainRateSSA(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
++		eps_eff = 1./sqrt(2.)*sqrt(epsilon2d[0]*epsilon2d[0] + epsilon2d[1]*epsilon2d[1] + 2.*epsilon2d[2]*epsilon2d[2]);
++	}
++
++	/*Get viscosity*/
++	material->GetViscosity(&viscosity,eps_eff);
++
++	/*Assign output pointer*/
++	*pviscosity=viscosity;
++}
++/*}}}*/
++void       Element::ViscosityFSDerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon){/*{{{*/
++	this->material->GetViscosityDerivativeEpsSquare(pmu_prime,epsilon);
++}/*}}}*/
++void       Element::ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/
++
++	/*Intermediaries*/
++	IssmDouble viscosity;
++	IssmDouble epsilon3d[5];/* epsilon=[exx,eyy,exy,exz,eyz];*/
++	IssmDouble epsilon2d[2];/* epsilon=[exx,exy];            */
++	IssmDouble eps_eff;
++
++	if(dim==3){
++		/* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
++		this->StrainRateHO(&epsilon3d[0],xyz_list,gauss,vx_input,vy_input);
++		eps_eff = sqrt(epsilon3d[0]*epsilon3d[0] + epsilon3d[1]*epsilon3d[1] + epsilon3d[2]*epsilon3d[2] +  epsilon3d[3]*epsilon3d[3] + epsilon3d[4]*epsilon3d[4] + epsilon3d[0]*epsilon3d[1]);
++	}
++	else{
++		/* eps_eff^2 = 1/2 (exx^2 + 2*exy^2 )*/
++		this->StrainRateHO2dvertical(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
++		eps_eff = 1./sqrt(2.)*sqrt(epsilon2d[0]*epsilon2d[0] + 2.*epsilon2d[1]*epsilon2d[1]);
++	}
++
++	/*Get viscosity*/
++	material->GetViscosity(&viscosity,eps_eff);
++
++	/*Assign output pointer*/
++	*pviscosity=viscosity;
++}/*}}}*/
++void       Element::ViscosityHODerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon){/*{{{*/
++	this->material->GetViscosityDerivativeEpsSquare(pmu_prime,epsilon);
++}/*}}}*/
++void       Element::ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* surface_input){/*{{{*/
++	/*Compute the L1L2 viscosity
++	 *
++	 *      1
++	 * mu = - A^-1 (sigma'_e)^(1-n)
++	 *      2
++	 *
++	 * sigma'_e^2 = |sigma'_//|^2 + |sigma'_perp|^2 (see Perego 2012 eq. 17,18)
++	 *
++	 * L1L2 assumptions:
++	 *
++	 * (1) |eps_b|_// = A (|sigma'_//|^2 + |sigma'_perp|^2)^((n-1)/2) |sigma'_//|
++	 * (2) |sigma'_perp|^2 = |rho g (s-z) grad(s)|^2
++	 *
++	 * Assuming that n = 3, we have a polynom of degree 3 to solve (the only unkown is X=|sigma'_//|)
++	 *
++	 * A X^3 + A |rho g (s-z) grad(s)|^2 X - |eps_b|_// = 0     */
++
++	IssmDouble z,s,viscosity,p,q,delta;
++	IssmDouble tau_perp,tau_par,eps_b,A;
++	IssmDouble epsilon[5];   /*exx eyy exy exz eyz*/
++	IssmDouble slope[3];
++
++	/*Check that both inputs have been found*/
++	if (!vx_input || !vy_input || !surface_input) _error_("Input missing");
++
++	/*Get tau_perp*/
++	surface_input->GetInputValue(&s,gauss);
++	surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss);
++	z=this->GetZcoord(xyz_list,gauss);
++	tau_perp = matpar->GetRhoIce() * matpar->GetG() * fabs(s-z)*sqrt(slope[0]*slope[0]+slope[1]*slope[1]);
++
++	/* Get eps_b*/
++	this->StrainRateHO(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
++	eps_b = sqrt(epsilon[0]*epsilon[0] + epsilon[1]*epsilon[1] + epsilon[0]*epsilon[1] + epsilon[2]*epsilon[2]);
++	if(eps_b==0.){
++		*pviscosity = 2.5e+17;
++		return;
++	}
++
++	/*Get A*/
++	_assert_(material->GetN()==3.0);
++	A=material->GetA();
++
++	/*Solve for tau_perp (http://fr.wikipedia.org/wiki/Méthode_de_Cardan)*/
++	p     = tau_perp *tau_perp;
++	q     = - eps_b/A;
++	delta = q *q + p*p*p*4./27.;
++	_assert_(delta>0);
++	tau_par = pow(0.5*(-q+sqrt(delta)),1./3.) - pow(0.5*(q+sqrt(delta)),1./3.);
++
++	/*Viscosity*/
++	viscosity = 1./(2.*A*(tau_par*tau_par + tau_perp*tau_perp));
++	_assert_(!xIsNan(viscosity));
++	_assert_(viscosity > 0.);
++
++	/*Assign output pointer*/
++	*pviscosity = viscosity;
++}/*}}}*/
++void       Element::ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/
++
++	/*Intermediaries*/
++	IssmDouble viscosity;
++	IssmDouble epsilon2d[3];/* epsilon=[exx,eyy,exy];    */
++	IssmDouble epsilon1d;   /* epsilon=[exx];    */
++	IssmDouble eps_eff;
++
++	 if(dim==2){
++		 /* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exx*eyy*/
++		 this->StrainRateSSA(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
++		 eps_eff = sqrt(epsilon2d[0]*epsilon2d[0] + epsilon2d[1]*epsilon2d[1] + epsilon2d[2]*epsilon2d[2] + epsilon2d[0]*epsilon2d[1]);
++	 }
++	 else{
++		 /* eps_eff^2 = 1/2 exx^2*/
++		 this->StrainRateSSA1d(&epsilon1d,xyz_list,gauss,vx_input);
++		 eps_eff = sqrt(epsilon1d*epsilon1d/2.);
++	 }
++
++	/*Get viscosity*/
++	material->GetViscosityBar(&viscosity,eps_eff);
++
++	/*Assign output pointer*/
++	*pviscosity=viscosity;
++}/*}}}*/
++void       Element::ViscositySSADerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon){/*{{{*/
++	this->material->GetViscosity2dDerivativeEpsSquare(pmu_prime,epsilon);
++}/*}}}*/
++void       Element::ViscousHeatingCreateInput(void){/*{{{*/
++
++	/*Intermediaries*/
++	IssmDouble phi;
++	IssmDouble viscosity;
++	IssmDouble epsilon[6];
++	IssmDouble thickness;
++	IssmDouble *xyz_list = NULL;
++
++	/*Fetch number vertices and allocate memory*/
++	int         numvertices    = this->GetNumberOfVertices();
++	IssmDouble* viscousheating = xNew<IssmDouble>(numvertices);
++
++	/*Retrieve all inputs and parameters*/
++	this->GetVerticesCoordinatesBase(&xyz_list);
++	Input* vx_input        = this->GetInput(VxEnum); _assert_(vx_input);
++	Input* vy_input        = this->GetInput(VyEnum); _assert_(vy_input);
++	Input* vz_input        = this->GetInput(VzEnum); _assert_(vz_input);
++	Input* thickness_input = this->GetInput(ThicknessEnum); _assert_(thickness_input);
++
++	/*loop over vertices: */
++	Gauss* gauss=this->NewGauss();
++	for (int iv=0;iv<numvertices;iv++){
++		gauss->GaussVertex(iv);
++
++		thickness_input->GetInputValue(&thickness,gauss);
++
++		this->StrainRateFS(&epsilon[0],xyz_list,gauss,vx_input,vy_input,vz_input);
++		this->ViscosityFS(&viscosity,3,xyz_list,gauss,vx_input,vy_input,vz_input);
++		this->GetPhi(&phi,&epsilon[0],viscosity);
++
++		viscousheating[iv]=phi*thickness;
++	}
++
++	/*Create PentaVertex input, which will hold the basal friction:*/
++	this->AddInput(ViscousHeatingEnum,viscousheating,P1Enum);
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(viscousheating);
++	delete gauss;
++}
++/*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18920-18921.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18920-18921.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18920-18921.diff	(revision 19102)
@@ -0,0 +1,2547 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18920)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18921)
+@@ -124,12 +124,6 @@
+ /*}}}*/
+ 
+ /*Other*/
+-void       Penta::AddInput(int input_enum,IssmDouble* values, int interpolation_enum){/*{{{*/
+-
+-	_assert_(this->inputs);
+-	this->inputs->AddInput(new PentaInput(input_enum,values,interpolation_enum));
+-}
+-/*}}}*/
+ void       Penta::AddBasalInput(int input_enum,IssmDouble* values, int interpolation_enum){/*{{{*/
+ 
+ 	_assert_(this->inputs);
+@@ -155,6 +149,71 @@
+ 	}
+ }
+ /*}}}*/
++void       Penta::AddInput(int input_enum,IssmDouble* values, int interpolation_enum){/*{{{*/
++
++	_assert_(this->inputs);
++	this->inputs->AddInput(new PentaInput(input_enum,values,interpolation_enum));
++}
++/*}}}*/
++void       Penta::AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part){/*{{{*/
++	_error_("Not supported yet!");
++}
++/*}}}*/
++void       Penta::CalvingRateLevermann(){/*{{{*/
++
++	IssmDouble  xyz_list[NUMVERTICES][3];
++	GaussPenta* gauss=NULL;
++	IssmDouble  vx,vy,vel;
++	IssmDouble  strainparallel;
++	IssmDouble  propcoeff;
++	IssmDouble  strainperpendicular;
++	IssmDouble  calvingratex[NUMVERTICES];
++	IssmDouble  calvingratey[NUMVERTICES];
++	IssmDouble  calvingrate[NUMVERTICES];
++
++
++	/* Get node coordinates and dof list: */
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++
++	/*Retrieve all inputs and parameters we will need*/
++	Input* vx_input=inputs->GetInput(VxEnum);																		_assert_(vx_input);
++	Input* vy_input=inputs->GetInput(VyEnum);																		_assert_(vy_input);
++	Input* strainparallel_input=inputs->GetInput(StrainRateparallelEnum);								_assert_(strainparallel_input);
++	Input* strainperpendicular_input=inputs->GetInput(StrainRateperpendicularEnum);              _assert_(strainperpendicular_input);
++	Input* levermanncoeff_input=inputs->GetInput(CalvinglevermannCoeffEnum);                     _assert_(levermanncoeff_input);
++
++	/* Start looping on the number of vertices: */
++	gauss=new GaussPenta();
++	for (int iv=0;iv<NUMVERTICES;iv++){
++		gauss->GaussVertex(iv);
++
++		/* Get the value we need*/
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		vel=vx*vx+vy*vy;
++		strainparallel_input->GetInputValue(&strainparallel,gauss);
++		strainperpendicular_input->GetInputValue(&strainperpendicular,gauss);
++		levermanncoeff_input->GetInputValue(&propcoeff,gauss);
++
++		/*Calving rate proportionnal to the positive product of the strain rate along the ice flow direction and the strain rate perpendicular to the ice flow */
++		calvingrate[iv]=propcoeff*strainparallel*strainperpendicular;	
++		if(calvingrate[iv]<0){
++			calvingrate[iv]=0;
++		}
++		calvingratex[iv]=calvingrate[iv]*vx/(vel+1.e-6);
++		calvingratey[iv]=calvingrate[iv]*vy/(vel+1.e-6);
++	}
++
++	/*Add input*/
++	this->inputs->AddInput(new PentaInput(CalvingratexEnum,&calvingratex[0],P1Enum));
++	this->inputs->AddInput(new PentaInput(CalvingrateyEnum,&calvingratey[0],P1Enum));
++	this->inputs->AddInput(new PentaInput(CalvingCalvingrateEnum,&calvingrate[0],P1Enum));
++
++	/*Clean up and return*/
++	delete gauss;
++
++}
++/*}}}*/
+ void       Penta::ComputeBasalStress(Vector<IssmDouble>* sigma_b){/*{{{*/
+ 
+ 	int         i,j;
+@@ -242,59 +301,6 @@
+ 	sigma_b->SetValue(id-1,value,INS_VAL);
+ }
+ /*}}}*/
+-void       Penta::ComputeStressTensor(){/*{{{*/
+-
+-	IssmDouble  xyz_list[NUMVERTICES][3];
+-	IssmDouble  pressure,viscosity;
+-	IssmDouble  epsilon[6]; /* epsilon=[exx,eyy,exy];*/
+-	IssmDouble  sigma_xx[NUMVERTICES];
+-	IssmDouble	sigma_yy[NUMVERTICES];
+-	IssmDouble	sigma_zz[NUMVERTICES];
+-	IssmDouble  sigma_xy[NUMVERTICES];
+-	IssmDouble	sigma_xz[NUMVERTICES];
+-	IssmDouble	sigma_yz[NUMVERTICES];
+-	GaussPenta* gauss=NULL;
+-
+-	/* Get node coordinates and dof list: */
+-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-
+-	/*Retrieve all inputs we will be needing: */
+-	Input* pressure_input=inputs->GetInput(PressureEnum); _assert_(pressure_input);
+-	Input* vx_input=inputs->GetInput(VxEnum);             _assert_(vx_input);
+-	Input* vy_input=inputs->GetInput(VyEnum);             _assert_(vy_input);
+-	Input* vz_input=inputs->GetInput(VzEnum);             _assert_(vz_input);
+-
+-	/* Start looping on the number of vertices: */
+-	gauss=new GaussPenta();
+-	for (int iv=0;iv<NUMVERTICES;iv++){
+-		gauss->GaussVertex(iv);
+-
+-		/*Compute strain rate viscosity and pressure: */
+-		this->StrainRateFS(&epsilon[0],&xyz_list[0][0],gauss,vx_input,vy_input,vz_input);
+-		this->ViscosityFS(&viscosity,3,&xyz_list[0][0],gauss,vx_input,vy_input,vz_input);
+-		pressure_input->GetInputValue(&pressure,gauss);
+-
+-		/*Compute Stress*/
+-		sigma_xx[iv]=2*viscosity*epsilon[0]-pressure; // sigma = nu eps - pressure
+-		sigma_yy[iv]=2*viscosity*epsilon[1]-pressure;
+-		sigma_zz[iv]=2*viscosity*epsilon[2]-pressure;
+-		sigma_xy[iv]=2*viscosity*epsilon[3];
+-		sigma_xz[iv]=2*viscosity*epsilon[4];
+-		sigma_yz[iv]=2*viscosity*epsilon[5];
+-	}
+-
+-	/*Add Stress tensor components into inputs*/
+-	this->inputs->AddInput(new PentaInput(StressTensorxxEnum,&sigma_xx[0],P1Enum));
+-	this->inputs->AddInput(new PentaInput(StressTensorxyEnum,&sigma_xy[0],P1Enum));
+-	this->inputs->AddInput(new PentaInput(StressTensorxzEnum,&sigma_xz[0],P1Enum));
+-	this->inputs->AddInput(new PentaInput(StressTensoryyEnum,&sigma_yy[0],P1Enum));
+-	this->inputs->AddInput(new PentaInput(StressTensoryzEnum,&sigma_yz[0],P1Enum));
+-	this->inputs->AddInput(new PentaInput(StressTensorzzEnum,&sigma_zz[0],P1Enum));
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-}
+-/*}}}*/
+ void       Penta::ComputeDeviatoricStressTensor(){/*{{{*/
+ 
+ 	IssmDouble  xyz_list[NUMVERTICES][3];
+@@ -346,232 +352,59 @@
+ 	delete gauss;
+ }
+ /*}}}*/
+-void       Penta::CalvingRateLevermann(){/*{{{*/
++void       Penta::ComputeStressTensor(){/*{{{*/
+ 
+ 	IssmDouble  xyz_list[NUMVERTICES][3];
++	IssmDouble  pressure,viscosity;
++	IssmDouble  epsilon[6]; /* epsilon=[exx,eyy,exy];*/
++	IssmDouble  sigma_xx[NUMVERTICES];
++	IssmDouble	sigma_yy[NUMVERTICES];
++	IssmDouble	sigma_zz[NUMVERTICES];
++	IssmDouble  sigma_xy[NUMVERTICES];
++	IssmDouble	sigma_xz[NUMVERTICES];
++	IssmDouble	sigma_yz[NUMVERTICES];
+ 	GaussPenta* gauss=NULL;
+-	IssmDouble  vx,vy,vel;
+-	IssmDouble  strainparallel;
+-	IssmDouble  propcoeff;
+-	IssmDouble  strainperpendicular;
+-	IssmDouble  calvingratex[NUMVERTICES];
+-	IssmDouble  calvingratey[NUMVERTICES];
+-	IssmDouble  calvingrate[NUMVERTICES];
+ 
+-
+ 	/* Get node coordinates and dof list: */
+ 	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+ 
+-	/*Retrieve all inputs and parameters we will need*/
+-	Input* vx_input=inputs->GetInput(VxEnum);																		_assert_(vx_input);
+-	Input* vy_input=inputs->GetInput(VyEnum);																		_assert_(vy_input);
+-	Input* strainparallel_input=inputs->GetInput(StrainRateparallelEnum);								_assert_(strainparallel_input);
+-	Input* strainperpendicular_input=inputs->GetInput(StrainRateperpendicularEnum);              _assert_(strainperpendicular_input);
+-	Input* levermanncoeff_input=inputs->GetInput(CalvinglevermannCoeffEnum);                     _assert_(levermanncoeff_input);
++	/*Retrieve all inputs we will be needing: */
++	Input* pressure_input=inputs->GetInput(PressureEnum); _assert_(pressure_input);
++	Input* vx_input=inputs->GetInput(VxEnum);             _assert_(vx_input);
++	Input* vy_input=inputs->GetInput(VyEnum);             _assert_(vy_input);
++	Input* vz_input=inputs->GetInput(VzEnum);             _assert_(vz_input);
+ 
+ 	/* Start looping on the number of vertices: */
+ 	gauss=new GaussPenta();
+ 	for (int iv=0;iv<NUMVERTICES;iv++){
+ 		gauss->GaussVertex(iv);
+ 
+-		/* Get the value we need*/
+-		vx_input->GetInputValue(&vx,gauss);
+-		vy_input->GetInputValue(&vy,gauss);
+-		vel=vx*vx+vy*vy;
+-		strainparallel_input->GetInputValue(&strainparallel,gauss);
+-		strainperpendicular_input->GetInputValue(&strainperpendicular,gauss);
+-		levermanncoeff_input->GetInputValue(&propcoeff,gauss);
++		/*Compute strain rate viscosity and pressure: */
++		this->StrainRateFS(&epsilon[0],&xyz_list[0][0],gauss,vx_input,vy_input,vz_input);
++		this->ViscosityFS(&viscosity,3,&xyz_list[0][0],gauss,vx_input,vy_input,vz_input);
++		pressure_input->GetInputValue(&pressure,gauss);
+ 
+-		/*Calving rate proportionnal to the positive product of the strain rate along the ice flow direction and the strain rate perpendicular to the ice flow */
+-		calvingrate[iv]=propcoeff*strainparallel*strainperpendicular;	
+-		if(calvingrate[iv]<0){
+-			calvingrate[iv]=0;
+-		}
+-		calvingratex[iv]=calvingrate[iv]*vx/(vel+1.e-6);
+-		calvingratey[iv]=calvingrate[iv]*vy/(vel+1.e-6);
++		/*Compute Stress*/
++		sigma_xx[iv]=2*viscosity*epsilon[0]-pressure; // sigma = nu eps - pressure
++		sigma_yy[iv]=2*viscosity*epsilon[1]-pressure;
++		sigma_zz[iv]=2*viscosity*epsilon[2]-pressure;
++		sigma_xy[iv]=2*viscosity*epsilon[3];
++		sigma_xz[iv]=2*viscosity*epsilon[4];
++		sigma_yz[iv]=2*viscosity*epsilon[5];
+ 	}
+ 
+-	/*Add input*/
+-	this->inputs->AddInput(new PentaInput(CalvingratexEnum,&calvingratex[0],P1Enum));
+-	this->inputs->AddInput(new PentaInput(CalvingrateyEnum,&calvingratey[0],P1Enum));
+-	this->inputs->AddInput(new PentaInput(CalvingCalvingrateEnum,&calvingrate[0],P1Enum));
++	/*Add Stress tensor components into inputs*/
++	this->inputs->AddInput(new PentaInput(StressTensorxxEnum,&sigma_xx[0],P1Enum));
++	this->inputs->AddInput(new PentaInput(StressTensorxyEnum,&sigma_xy[0],P1Enum));
++	this->inputs->AddInput(new PentaInput(StressTensorxzEnum,&sigma_xz[0],P1Enum));
++	this->inputs->AddInput(new PentaInput(StressTensoryyEnum,&sigma_yy[0],P1Enum));
++	this->inputs->AddInput(new PentaInput(StressTensoryzEnum,&sigma_yz[0],P1Enum));
++	this->inputs->AddInput(new PentaInput(StressTensorzzEnum,&sigma_zz[0],P1Enum));
+ 
+ 	/*Clean up and return*/
+ 	delete gauss;
+-
+ }
+ /*}}}*/
+-void       Penta::StressIntensityFactor(){/*{{{*/
+-
+-	/* Check if we are on the base */
+-	if(!IsOnBase()) return;
+-
+-	IssmDouble  ki[6]={0.};
+-	IssmDouble  const_grav=9.81;
+-	IssmDouble  rho_ice=900;
+-	IssmDouble  rho_water=1000;
+-	IssmDouble  Jdet[3];
+-	IssmDouble  pressure,vx,vy,vel,deviaxx,deviaxy,deviayy,water_depth,prof,stress_xx,thickness;
+-
+-	Penta* penta=this;
+-	for(;;){
+-	
+-		IssmDouble  xyz_list[NUMVERTICES][3];
+-		/* Get node coordinates and dof list: */
+-		::GetVerticesCoordinates(&xyz_list[0][0],penta->vertices,NUMVERTICES);
+-
+-		///*Compute the Jacobian for the vertical integration*/
+-		Jdet[0]=(xyz_list[3][2]-xyz_list[0][2])*0.5;
+-		Jdet[1]=(xyz_list[4][2]-xyz_list[1][2])*0.5;
+-		Jdet[2]=(xyz_list[5][2]-xyz_list[2][2])*0.5;
+-	
+-		/*Retrieve all inputs we will need*/
+-		Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
+-		Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
+-		Input* vel_input=inputs->GetInput(VelEnum);                                _assert_(vel_input);
+-		Input* pressure_input=inputs->GetInput(PressureEnum);                      _assert_(pressure_input);
+-		Input* deviaxx_input=inputs->GetInput(DeviatoricStressxxEnum);             _assert_(deviaxx_input);
+-		Input* deviaxy_input=inputs->GetInput(DeviatoricStressxyEnum);             _assert_(deviaxy_input);
+-		Input* deviayy_input=inputs->GetInput(DeviatoricStressyyEnum);             _assert_(deviayy_input);
+-		Input* surface_input=inputs->GetInput(SurfaceEnum);								_assert_(surface_input);
+-		Input* thickness_input=inputs->GetInput(ThicknessEnum);							_assert_(thickness_input);
+-		
+-		/* Start looping on the number of 2D vertices: */
+-		for(int ig=0;ig<3;ig++){
+-			GaussPenta* gauss=new GaussPenta(ig,3+ig,11);
+-			for (int iv=gauss->begin();iv<gauss->end();iv++){
+-				gauss->GaussPoint(iv);
+-
+-				/* Get the value we need*/
+-				pressure_input->GetInputValue(&pressure,gauss);
+-				vx_input->GetInputValue(&vx,gauss);
+-				vy_input->GetInputValue(&vy,gauss);
+-				vel_input->GetInputValue(&vel,gauss);
+-				deviaxx_input->GetInputValue(&deviaxx,gauss);
+-				deviaxy_input->GetInputValue(&deviaxy,gauss);
+-				deviayy_input->GetInputValue(&deviayy,gauss);
+-				surface_input->GetInputValue(&water_depth,gauss);
+-				thickness_input->GetInputValue(&thickness,gauss);
+-				prof=water_depth-penta->GetZcoord(&xyz_list[0][0],gauss);
+-
+-				/*stress_xx= Deviatoric stress along the ice flow direction plus cryostatic pressure */
+-				stress_xx=(vx*vx*(deviaxx)+vy*vy*(deviayy)+2*vy*vx*deviaxy)/(vel*vel+1.e-6);
+-
+-				if(prof<water_depth&prof<thickness){
+-					/* Compute the local stress intensity factor*/ 
+-					ki[ig]+=Jdet[ig]*gauss->weight*stress_xx*StressIntensityIntegralWeight(prof,min(water_depth,thickness),thickness);
+-				}
+-			}
+-			delete gauss;
+-		}
+-			
+-		/*Stop if we have reached the surface/base*/
+-		if(penta->IsOnSurface()) break;
+-		
+-		/*get upper Penta*/
+-		penta=penta->GetUpperPenta();
+-		_assert_(penta->Id()!=this->id);
+-	}
+-
+-	/*Add input*/
+-	this->inputs->AddInput(new PentaInput(StressIntensityFactorEnum,&ki[0],P1Enum));
+-	this->InputExtrude(StressIntensityFactorEnum,-1);
+-}
+-/*}}}*/
+-void       Penta::StrainRateparallel(){/*{{{*/
+-
+-	IssmDouble *xyz_list = NULL;
+-	IssmDouble  epsilon[6];
+-	GaussPenta* gauss=NULL;
+-	IssmDouble  vx,vy,vel;
+-	IssmDouble  strainxx;
+-	IssmDouble  strainxy;
+-	IssmDouble  strainyy;
+-	IssmDouble  strainparallel[NUMVERTICES];
+-
+-	/* Get node coordinates and dof list: */
+-	this->GetVerticesCoordinates(&xyz_list);
+-
+-	/*Retrieve all inputs we will need*/
+-	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
+-	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
+-	Input* vz_input=inputs->GetInput(VzEnum);												_assert_(vz_input);
+-
+-	/* Start looping on the number of vertices: */
+-	gauss=new GaussPenta();
+-	for (int iv=0;iv<NUMVERTICES;iv++){
+-		gauss->GaussVertex(iv);
+-
+-		/* Get the value we need*/
+-		vx_input->GetInputValue(&vx,gauss);
+-		vy_input->GetInputValue(&vy,gauss);
+-		vel=vx*vx+vy*vy;
+-
+-		/*Compute strain rate and viscosity: */
+-		this->StrainRateFS(&epsilon[0],xyz_list,gauss,vx_input,vy_input,vz_input);
+-		strainxx=epsilon[0];
+-		strainyy=epsilon[1];
+-		strainxy=epsilon[3];
+-
+-		/*strainparallel= Strain rate along the ice flow direction */
+-		strainparallel[iv]=(vx*vx*(strainxx)+vy*vy*(strainyy)+2*vy*vx*strainxy)/(vel+1.e-6);
+-	}
+-
+-	/*Add input*/
+-	this->inputs->AddInput(new PentaInput(StrainRateparallelEnum,&strainparallel[0],P1Enum));
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-	xDelete<IssmDouble>(xyz_list);
+-}
+-/*}}}*/
+-void       Penta::StrainRateperpendicular(){/*{{{*/
+-
+-	IssmDouble *xyz_list = NULL;
+-	IssmDouble  epsilon[6];
+-	GaussPenta* gauss=NULL;
+-	IssmDouble  vx,vy,vel;
+-	IssmDouble  strainxx;
+-	IssmDouble  strainxy;
+-	IssmDouble  strainyy;
+-	IssmDouble  strainperpendicular[NUMVERTICES];
+-
+-	/* Get node coordinates and dof list: */
+-	this->GetVerticesCoordinates(&xyz_list);
+-
+-	/*Retrieve all inputs we will need*/
+-	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
+-	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
+-	Input* vz_input=inputs->GetInput(VzEnum);												_assert_(vz_input);
+-
+-	/* Start looping on the number of vertices: */
+-	gauss=new GaussPenta();
+-	for (int iv=0;iv<NUMVERTICES;iv++){
+-		gauss->GaussVertex(iv);
+-
+-		/* Get the value we need*/
+-		vx_input->GetInputValue(&vx,gauss);
+-		vy_input->GetInputValue(&vy,gauss);
+-		vel=vx*vx+vy*vy;
+-
+-		/*Compute strain rate and viscosity: */
+-		this->StrainRateFS(&epsilon[0],xyz_list,gauss,vx_input,vy_input,vz_input);
+-		strainxx=epsilon[0];
+-		strainyy=epsilon[1];
+-		strainxy=epsilon[3];
+-
+-		/*strainperpendicular= Strain rate perpendicular to the ice flow direction */
+-		strainperpendicular[iv]=(vx*vx*(strainyy)+vy*vy*(strainxx)-2*vy*vx*strainxy)/(vel+1.e-6);
+-	}
+-
+-	/*Add input*/
+-	this->inputs->AddInput(new PentaInput(StrainRateperpendicularEnum,&strainperpendicular[0],P1Enum));
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-	xDelete<IssmDouble>(xyz_list);
+-}
+-/*}}}*/
+ void       Penta::Configure(Elements* elementsin, Loads* loadsin, Nodes* nodesin,Vertices* verticesin, Materials* materialsin, Parameters* parametersin){/*{{{*/
+ 
+ 	int analysis_counter;
+@@ -605,6 +438,72 @@
+ 	this->inputs->Configure(parameters);
+ }
+ /*}}}*/
++void       Penta::ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){/*{{{*/
++
++	int    vertexpidlist[NUMVERTICES];
++	IssmDouble grad_list[NUMVERTICES];
++	Input* grad_input=NULL;
++	Input* input=NULL;
++
++	if(enum_type==MaterialsRheologyBbarEnum){
++		input=(Input*)inputs->GetInput(MaterialsRheologyBEnum);
++	}
++	else if(enum_type==DamageDbarEnum){
++		input=(Input*)inputs->GetInput(DamageDEnum);
++	}
++	else{
++		input=inputs->GetInput(enum_type);
++	}
++	if (!input) _error_("Input " << EnumToStringx(enum_type) << " not found");
++	if (input->ObjectEnum()!=ControlInputEnum) _error_("Input " << EnumToStringx(enum_type) << " is not a ControlInput");
++
++	GradientIndexing(&vertexpidlist[0],control_index);
++	for(int i=0;i<NUMVERTICES;i++) grad_list[i]=gradient[vertexpidlist[i]];
++	grad_input=new PentaInput(GradientEnum,grad_list,P1Enum);
++	((ControlInput*)input)->SetGradient(grad_input);
++
++}/*}}}*/
++void       Penta::ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum){/*{{{*/
++
++	Input* input=NULL;
++
++	if(control_enum==MaterialsRheologyBbarEnum){
++		input=(Input*)inputs->GetInput(MaterialsRheologyBEnum);
++	}
++	else if(control_enum==DamageDbarEnum){
++		input=(Input*)inputs->GetInput(DamageDEnum);
++	}
++	else{
++		input=inputs->GetInput(control_enum);
++	}
++	if (!input) _error_("Input " << EnumToStringx(control_enum) << " not found");
++	if (input->ObjectEnum()!=ControlInputEnum) _error_("Input " << EnumToStringx(control_enum) << " is not a ControlInput");
++
++	int         sidlist[NUMVERTICES];
++	int         connectivity[NUMVERTICES];
++	IssmPDouble values[NUMVERTICES];
++	IssmPDouble gradients[NUMVERTICES]; 
++	IssmDouble  value,gradient;
++
++	this->GetVerticesConnectivityList(&connectivity[0]);
++	this->GetVerticesSidList(&sidlist[0]);
++
++	GaussPenta* gauss=new GaussPenta();
++	for (int iv=0;iv<NUMVERTICES;iv++){
++		gauss->GaussVertex(iv);
++
++		((ControlInput*)input)->GetInputValue(&value,gauss);
++		((ControlInput*)input)->GetGradientValue(&gradient,gauss);
++
++		values[iv]    = reCast<IssmPDouble>(value)/reCast<IssmPDouble>(connectivity[iv]);
++		gradients[iv] = reCast<IssmPDouble>(gradient)/reCast<IssmPDouble>(connectivity[iv]);
++	}
++	delete gauss;
++
++	vector_control->SetValues(NUMVERTICES,&sidlist[0],&values[0],ADD_VAL);
++	vector_gradient->SetValues(NUMVERTICES,&sidlist[0],&gradients[0],ADD_VAL);
++
++}/*}}}*/
+ void       Penta::Delta18oParameterization(void){/*{{{*/
+ 
+ 	/*Are we on the base? If not, return*/
+@@ -679,6 +578,61 @@
+ 	delete gauss;
+ }
+ /*}}}*/
++void       Penta::ElementResponse(IssmDouble* presponse,int response_enum){/*{{{*/
++
++	switch(response_enum){
++		case MaterialsRheologyBbarEnum:
++			*presponse=this->material->GetBbar();
++			break;
++		case DamageDbarEnum:
++			*presponse=this->material->GetDbar();
++			break;
++		case VelEnum:
++			{
++
++				/*Get input:*/
++				IssmDouble vel;
++				Input* vel_input;
++
++				vel_input=this->inputs->GetInput(VelEnum); _assert_(vel_input);
++				vel_input->GetInputAverage(&vel);
++
++				/*Assign output pointers:*/
++				*presponse=vel;
++			}
++			break;
++		default:  
++			_error_("Response type " << EnumToStringx(response_enum) << " not supported yet!");
++	}
++
++}
++/*}}}*/
++void       Penta::ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz){/*{{{*/
++
++	IssmDouble xyz_list[NUMVERTICES][3];
++	IssmDouble xmin,ymin,zmin;
++	IssmDouble xmax,ymax,zmax;
++
++	/*Get xyz list: */
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++	xmin=xyz_list[0][0]; xmax=xyz_list[0][0];
++	ymin=xyz_list[0][1]; ymax=xyz_list[0][1];
++	zmin=xyz_list[0][2]; zmax=xyz_list[0][2];
++
++	for(int i=1;i<NUMVERTICES;i++){
++		if(xyz_list[i][0]<xmin) xmin=xyz_list[i][0];
++		if(xyz_list[i][0]>xmax) xmax=xyz_list[i][0];
++		if(xyz_list[i][1]<ymin) ymin=xyz_list[i][1];
++		if(xyz_list[i][1]>ymax) ymax=xyz_list[i][1];
++		if(xyz_list[i][2]<zmin) zmin=xyz_list[i][2];
++		if(xyz_list[i][2]>zmax) zmax=xyz_list[i][2];
++	}
++
++	*hx=xmax-xmin;
++	*hy=ymax-ymin;
++	*hz=zmax-zmin;
++}
++/*}}}*/
+ int        Penta::FiniteElement(void){/*{{{*/
+ 	return this->element_type;
+ }
+@@ -769,12 +723,6 @@
+ 	}
+ }
+ /*}}}*/
+-int        Penta::ObjectEnum(void){/*{{{*/
+-
+-	return PentaEnum;
+-
+-}
+-/*}}}*/
+ void       Penta::GetAreaCoordinates(IssmDouble* area_coordinates,IssmDouble* xyz_zero,IssmDouble* xyz_list,int numpoints){/*{{{*/
+ 	/*Computeportion of the element that is grounded*/ 
+ 
+@@ -810,42 +758,11 @@
+ 	}
+ }
+ /*}}}*/
+-Penta*     Penta::GetUpperPenta(void){/*{{{*/
++Element*   Penta::GetBasalElement(void){/*{{{*/
+ 
+-	Penta* upper_penta=NULL;
+-
+-	upper_penta=(Penta*)verticalneighbors[1]; //first one (0) under, second one (1) above
+-
+-	return upper_penta;
+-}
+-/*}}}*/
+-Penta*     Penta::GetLowerPenta(void){/*{{{*/
+-
+-	Penta* lower_penta=NULL;
+-
+-	lower_penta=(Penta*)verticalneighbors[0]; //first one (0) under, second one (1) above
+-
+-	return lower_penta;
+-}
+-/*}}}*/
+-Penta*     Penta::GetSurfacePenta(void){/*{{{*/
+-
+ 	/*Output*/
+-	Penta* penta=NULL;
+-
+-	/*Go through all pentas till the surface is reached*/
+-	penta=this;
+-	for(;;){
+-		/*Stop if we have reached the surface, else, take upper penta*/
+-		if (penta->IsOnSurface()) break;
+-
+-		/* get upper Penta*/
+-		penta=penta->GetUpperPenta();
+-		_assert_(penta->Id()!=this->id);
+-	}
+-
+-	/*return output*/
+-	return penta;
++	Element* element=this->GetBasalPenta();
++	return element;
+ }
+ /*}}}*/
+ Penta*     Penta::GetBasalPenta(void){/*{{{*/
+@@ -868,20 +785,12 @@
+ 	return penta;
+ }
+ /*}}}*/
+-Element*   Penta::GetUpperElement(void){/*{{{*/
++int        Penta::GetElementType(){/*{{{*/
+ 
+-	/*Output*/
+-	Element* upper_element=this->GetUpperPenta();
+-	return upper_element;
++	/*return PentaRef field*/
++	return this->element_type;
+ }
+ /*}}}*/
+-Element*   Penta::GetBasalElement(void){/*{{{*/
+-
+-	/*Output*/
+-	Element* element=this->GetBasalPenta();
+-	return element;
+-}
+-/*}}}*/
+ void       Penta::GetGroundedPart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlyfloating){/*{{{*/
+ 	/*Computeportion of the element that is grounded*/ 
+ 
+@@ -1036,38 +945,75 @@
+ 	return phi;
+ }
+ /*}}}*/
+-int        Penta::GetElementType(){/*{{{*/
++void       Penta::GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){/*{{{*/
++	
++	/* Intermediaries */
++	const int dim=3;
++	int i, dir,nrfrontnodes;
++	IssmDouble  levelset[NUMVERTICES];
+ 
+-	/*return PentaRef field*/
+-	return this->element_type;
+-}
+-/*}}}*/
+-void       Penta::ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz){/*{{{*/
++	/*Recover parameters and values*/
++	GetInputListOnVertices(&levelset[0],levelsetenum);
+ 
+-	IssmDouble xyz_list[NUMVERTICES][3];
+-	IssmDouble xmin,ymin,zmin;
+-	IssmDouble xmax,ymax,zmax;
++	int* indicesfront = xNew<int>(NUMVERTICES);
++	/* Get basal nodes where there is no ice */
++	nrfrontnodes=0;
++	for(i=0;i<NUMVERTICES2D;i++){
++		if(levelset[i]>=0.){
++			indicesfront[nrfrontnodes]=i;
++			nrfrontnodes++;
++		}
++	}
++	_assert_(nrfrontnodes==2);
+ 
+-	/*Get xyz list: */
+-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-	xmin=xyz_list[0][0]; xmax=xyz_list[0][0];
+-	ymin=xyz_list[0][1]; ymax=xyz_list[0][1];
+-	zmin=xyz_list[0][2]; zmax=xyz_list[0][2];
++	/* arrange order of basal frontnodes such that they are oriented counterclockwise */
++	if((NUMVERTICES2D+indicesfront[0]-indicesfront[1])%NUMVERTICES2D!=NUMVERTICES2D-1){
++		int index=indicesfront[0];
++		indicesfront[0]=indicesfront[1];
++		indicesfront[1]=index;
++	}	
+ 
+-	for(int i=1;i<NUMVERTICES;i++){
+-		if(xyz_list[i][0]<xmin) xmin=xyz_list[i][0];
+-		if(xyz_list[i][0]>xmax) xmax=xyz_list[i][0];
+-		if(xyz_list[i][1]<ymin) ymin=xyz_list[i][1];
+-		if(xyz_list[i][1]>ymax) ymax=xyz_list[i][1];
+-		if(xyz_list[i][2]<zmin) zmin=xyz_list[i][2];
+-		if(xyz_list[i][2]>zmax) zmax=xyz_list[i][2];
++	IssmDouble* xyz_front = xNew<IssmDouble>(2*dim*nrfrontnodes);
++	/* Return basal and top front nodes */
++	for(i=0;i<nrfrontnodes;i++){
++		for(dir=0;dir<dim;dir++){
++			int ind1=i*dim+dir, ind2=(2*nrfrontnodes-1-i)*dim+dir; // vertex structure front segment: base0, base1, top1, top0
++			xyz_front[ind1]=xyz_list[dim*indicesfront[i]+dir];
++			xyz_front[ind2]=xyz_list[dim*(indicesfront[i]+NUMVERTICES2D)+dir];
++		}
+ 	}
+ 
+-	*hx=xmax-xmin;
+-	*hy=ymax-ymin;
+-	*hz=zmax-zmin;
++	*pxyz_front=xyz_front;
++
++	xDelete<int>(indicesfront);
++}/*}}}*/
++void       Penta::GetInputValue(IssmDouble* pvalue,Node* node,int enumtype){/*{{{*/
++
++	Input* input=inputs->GetInput(enumtype);
++	if(!input) _error_("No input of type " << EnumToStringx(enumtype) << " found in tria");
++
++	GaussPenta* gauss=new GaussPenta();
++	gauss->GaussVertex(this->GetNodeIndex(node));
++
++	input->GetInputValue(pvalue,gauss);
++	delete gauss;
+ }
+ /*}}}*/
++Penta*     Penta::GetLowerPenta(void){/*{{{*/
++
++	Penta* lower_penta=NULL;
++
++	lower_penta=(Penta*)verticalneighbors[0]; //first one (0) under, second one (1) above
++
++	return lower_penta;
++}
++/*}}}*/
++Node*      Penta::GetNode(int node_number){/*{{{*/
++	_assert_(node_number>=0); 
++	_assert_(node_number<this->NumberofNodes(this->element_type)); 
++	return this->nodes[node_number];
++}
++/*}}}*/
+ int        Penta::GetNodeIndex(Node* node){/*{{{*/
+ 
+ 	_assert_(nodes);
+@@ -1092,276 +1038,208 @@
+ 	return NUMVERTICES; 
+ }
+ /*}}}*/
+-Node*      Penta::GetNode(int node_number){/*{{{*/
+-	_assert_(node_number>=0); 
+-	_assert_(node_number<this->NumberofNodes(this->element_type)); 
+-	return this->nodes[node_number];
+-}
+-/*}}}*/
+-void       Penta::GetInputValue(IssmDouble* pvalue,Node* node,int enumtype){/*{{{*/
++void       Penta::GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution, int enum_type){/*{{{*/
+ 
+-	Input* input=inputs->GetInput(enumtype);
+-	if(!input) _error_("No input of type " << EnumToStringx(enumtype) << " found in tria");
++	const int    numdof=NDOF1*NUMVERTICES;
+ 
+-	GaussPenta* gauss=new GaussPenta();
+-	gauss->GaussVertex(this->GetNodeIndex(node));
++	int          i;
++	int*         doflist=NULL;
++	IssmDouble   values[numdof];
++	IssmDouble   enum_value;
++	GaussPenta   *gauss=NULL;
+ 
+-	input->GetInputValue(pvalue,gauss);
++	/*Get dof list: */
++	GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
++	Input* enum_input=inputs->GetInput(enum_type); _assert_(enum_input);
++
++	gauss=new GaussPenta();
++	for(i=0;i<NUMVERTICES;i++){
++		/*Recover temperature*/
++		gauss->GaussVertex(i);
++		enum_input->GetInputValue(&enum_value,gauss);
++		values[i]=enum_value;
++	}
++
++	/*Add value to global vector*/
++	solution->SetValues(numdof,doflist,values,INS_VAL);
++
++	/*Free ressources:*/
+ 	delete gauss;
++	xDelete<int>(doflist);
+ }
+ /*}}}*/
+-void       Penta::GetVerticesCoordinatesBase(IssmDouble** pxyz_list){/*{{{*/
++Penta*     Penta::GetSurfacePenta(void){/*{{{*/
+ 
+-	IssmDouble* xyz_list = xNew<IssmDouble>(NUMVERTICES2D*3);
+-	::GetVerticesCoordinates(xyz_list,this->vertices,NUMVERTICES2D);
++	/*Output*/
++	Penta* penta=NULL;
+ 
+-	/*Assign output pointer*/
+-	*pxyz_list = xyz_list;
++	/*Go through all pentas till the surface is reached*/
++	penta=this;
++	for(;;){
++		/*Stop if we have reached the surface, else, take upper penta*/
++		if (penta->IsOnSurface()) break;
+ 
+-}/*}}}*/
+-void       Penta::GetVerticesCoordinatesTop(IssmDouble** pxyz_list){/*{{{*/
++		/* get upper Penta*/
++		penta=penta->GetUpperPenta();
++		_assert_(penta->Id()!=this->id);
++	}
+ 
+-	IssmDouble* xyz_list = xNew<IssmDouble>(NUMVERTICES2D*3);
+-	::GetVerticesCoordinates(xyz_list,&this->vertices[3],NUMVERTICES2D);
++	/*return output*/
++	return penta;
++}
++/*}}}*/
++Element*   Penta::GetUpperElement(void){/*{{{*/
+ 
+-	/*Assign output pointer*/
+-	*pxyz_list = xyz_list;
+-
+-}/*}}}*/
+-void       Penta::NormalSection(IssmDouble* normal,IssmDouble* xyz_list){/*{{{*/
+-
+-	/*Build unit outward pointing vector*/
+-	IssmDouble AB[3];
+-	IssmDouble AC[3];
+-	IssmDouble norm;
+-
+-	AB[0]=xyz_list[1*3+0] - xyz_list[0*3+0];
+-	AB[1]=xyz_list[1*3+1] - xyz_list[0*3+1];
+-	AB[2]=xyz_list[1*3+2] - xyz_list[0*3+2];
+-	AC[0]=xyz_list[2*3+0] - xyz_list[0*3+0];
+-	AC[1]=xyz_list[2*3+1] - xyz_list[0*3+1];
+-	AC[2]=xyz_list[2*3+2] - xyz_list[0*3+2];
+-
+-	cross(normal,AB,AC);
+-	norm=sqrt(normal[0]*normal[0]+normal[1]*normal[1]+normal[2]*normal[2]);
+-
+-	for(int i=0;i<3;i++) normal[i]=normal[i]/norm;
++	/*Output*/
++	Element* upper_element=this->GetUpperPenta();
++	return upper_element;
+ }
+ /*}}}*/
+-IssmDouble Penta::StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa){/*{{{*/
+-	/*Compute stabilization parameter*/
+-	/*kappa=thermalconductivity/(rho_ice*hearcapacity) for thermal model*/
+-	/*kappa=enthalpydiffusionparameter for enthalpy model*/
++Penta*     Penta::GetUpperPenta(void){/*{{{*/
+ 
+-	IssmDouble normu;
+-	IssmDouble tau_parameter;
++	Penta* upper_penta=NULL;
+ 
+-	normu=pow(pow(u,2)+pow(v,2)+pow(w,2),0.5);
+-	if(normu*diameter/(3*2*kappa)<1){ 
+-		tau_parameter=pow(diameter,2)/(3*2*2*kappa);
+-	}
+-	else tau_parameter=diameter/(2*normu);
++	upper_penta=(Penta*)verticalneighbors[1]; //first one (0) under, second one (1) above
+ 
+-	return tau_parameter;
++	return upper_penta;
+ }
+ /*}}}*/
+-void       Penta::ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum){/*{{{*/
+-	/*Compute portion of the element that is grounded*/ 
++void       Penta::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data,bool onsid){/*{{{*/
+ 
+-	int         normal_orientation=0;
+-	IssmDouble  s1,s2;
+-	IssmDouble  levelset[NUMVERTICES];
+-	IssmDouble* xyz_zero = xNew<IssmDouble>(4*3);
++	int vertexidlist[NUMVERTICES];
+ 
+-	/*Recover parameters and values*/
+-	GetInputListOnVertices(&levelset[0],levelsetenum);
++	/*Get out if this is not an element input*/
++	if(!IsInput(control_enum)) return;
+ 
+-	if(levelset[0]*levelset[1]>0.){ //Nodes 0 and 1 are similar, so points must be found on segment 0-2 and 1-2
+-		/*Portion of the segments*/
+-		s1=levelset[2]/(levelset[2]-levelset[1]);
+-		s2=levelset[2]/(levelset[2]-levelset[0]);
++	/*Prepare index list*/
++	GradientIndexing(&vertexidlist[0],control_index,onsid);
+ 
+-		if(levelset[2]<0.) normal_orientation=1; //orientation of quadrangle at base and top, depending on distribution of levelsetfunction
+-		/*New point 1*/
+-		xyz_zero[3*normal_orientation+0]=xyz_list[2*3+0]+s1*(xyz_list[1*3+0]-xyz_list[2*3+0]);
+-		xyz_zero[3*normal_orientation+1]=xyz_list[2*3+1]+s1*(xyz_list[1*3+1]-xyz_list[2*3+1]);
+-		xyz_zero[3*normal_orientation+2]=xyz_list[2*3+2]+s1*(xyz_list[1*3+2]-xyz_list[2*3+2]);
++	/*Get input (either in element or material)*/
++	if(control_enum==MaterialsRheologyBbarEnum) control_enum=MaterialsRheologyBEnum;
++	Input* input=inputs->GetInput(control_enum);
++	if(!input) _error_("Input " << EnumToStringx(control_enum) << " not found in element");
+ 
+-		/*New point 0*/
+-		xyz_zero[3*(1-normal_orientation)+0]=xyz_list[2*3+0]+s2*(xyz_list[0*3+0]-xyz_list[2*3+0]);
+-		xyz_zero[3*(1-normal_orientation)+1]=xyz_list[2*3+1]+s2*(xyz_list[0*3+1]-xyz_list[2*3+1]);
+-		xyz_zero[3*(1-normal_orientation)+2]=xyz_list[2*3+2]+s2*(xyz_list[0*3+2]-xyz_list[2*3+2]);
++	/*Check that it is a ControlInput*/
++	if (input->ObjectEnum()!=ControlInputEnum){
++		_error_("input " << EnumToStringx(control_enum) << " is not a ControlInput");
++	}
+ 
+-		/*New point 3*/
+-		xyz_zero[3*(2+1-normal_orientation)+0]=xyz_list[5*3+0]+s1*(xyz_list[4*3+0]-xyz_list[5*3+0]);
+-		xyz_zero[3*(2+1-normal_orientation)+1]=xyz_list[5*3+1]+s1*(xyz_list[4*3+1]-xyz_list[5*3+1]);
+-		xyz_zero[3*(2+1-normal_orientation)+2]=xyz_list[5*3+2]+s1*(xyz_list[4*3+2]-xyz_list[5*3+2]);
++	((ControlInput*)input)->GetVectorFromInputs(vector,&vertexidlist[0],data);
++}
++/*}}}*/
++void       Penta::GetVerticesCoordinatesBase(IssmDouble** pxyz_list){/*{{{*/
+ 
+-		/*New point 4*/
+-		xyz_zero[3*(2+normal_orientation)+0]=xyz_list[5*3+0]+s2*(xyz_list[3*3+0]-xyz_list[5*3+0]);
+-		xyz_zero[3*(2+normal_orientation)+1]=xyz_list[5*3+1]+s2*(xyz_list[3*3+1]-xyz_list[5*3+1]);
+-		xyz_zero[3*(2+normal_orientation)+2]=xyz_list[5*3+2]+s2*(xyz_list[3*3+2]-xyz_list[5*3+2]);
+-	}
+-	else if(levelset[1]*levelset[2]>0.){ //Nodes 1 and 2 are similar, so points must be found on segment 0-1 and 0-2
+-		/*Portion of the segments*/
+-		s1=levelset[0]/(levelset[0]-levelset[2]);
+-		s2=levelset[0]/(levelset[0]-levelset[1]);
++	IssmDouble* xyz_list = xNew<IssmDouble>(NUMVERTICES2D*3);
++	::GetVerticesCoordinates(xyz_list,this->vertices,NUMVERTICES2D);
+ 
+-		if(levelset[0]<0.) normal_orientation=1;
+-		/*New point 1*/
+-		xyz_zero[3*normal_orientation+0]=xyz_list[0*3+0]+s1*(xyz_list[2*3+0]-xyz_list[0*3+0]);
+-		xyz_zero[3*normal_orientation+1]=xyz_list[0*3+1]+s1*(xyz_list[2*3+1]-xyz_list[0*3+1]);
+-		xyz_zero[3*normal_orientation+2]=xyz_list[0*3+2]+s1*(xyz_list[2*3+2]-xyz_list[0*3+2]);
++	/*Assign output pointer*/
++	*pxyz_list = xyz_list;
+ 
+-		/*New point 2*/
+-		xyz_zero[3*(1-normal_orientation)+0]=xyz_list[0*3+0]+s2*(xyz_list[1*3+0]-xyz_list[0*3+0]);
+-		xyz_zero[3*(1-normal_orientation)+1]=xyz_list[0*3+1]+s2*(xyz_list[1*3+1]-xyz_list[0*3+1]);
+-		xyz_zero[3*(1-normal_orientation)+2]=xyz_list[0*3+2]+s2*(xyz_list[1*3+2]-xyz_list[0*3+2]);
++}/*}}}*/
++void       Penta::GetVerticesCoordinatesTop(IssmDouble** pxyz_list){/*{{{*/
+ 
+-		/*New point 3*/
+-		xyz_zero[3*(2+1-normal_orientation)+0]=xyz_list[3*3+0]+s1*(xyz_list[5*3+0]-xyz_list[3*3+0]);
+-		xyz_zero[3*(2+1-normal_orientation)+1]=xyz_list[3*3+1]+s1*(xyz_list[5*3+1]-xyz_list[3*3+1]);
+-		xyz_zero[3*(2+1-normal_orientation)+2]=xyz_list[3*3+2]+s1*(xyz_list[5*3+2]-xyz_list[3*3+2]);
++	IssmDouble* xyz_list = xNew<IssmDouble>(NUMVERTICES2D*3);
++	::GetVerticesCoordinates(xyz_list,&this->vertices[3],NUMVERTICES2D);
+ 
+-		/*New point 4*/
+-		xyz_zero[3*(2+normal_orientation)+0]=xyz_list[3*3+0]+s2*(xyz_list[4*3+0]-xyz_list[3*3+0]);
+-		xyz_zero[3*(2+normal_orientation)+1]=xyz_list[3*3+1]+s2*(xyz_list[4*3+1]-xyz_list[3*3+1]);
+-		xyz_zero[3*(2+normal_orientation)+2]=xyz_list[3*3+2]+s2*(xyz_list[4*3+2]-xyz_list[3*3+2]);
+-	}
+-	else if(levelset[0]*levelset[2]>0.){ //Nodes 0 and 2 are similar, so points must be found on segment 1-0 and 1-2
+-		/*Portion of the segments*/
+-		s1=levelset[1]/(levelset[1]-levelset[0]);
+-		s2=levelset[1]/(levelset[1]-levelset[2]);
++	/*Assign output pointer*/
++	*pxyz_list = xyz_list;
+ 
+-		if(levelset[1]<0.) normal_orientation=1;
+-		/*New point 0*/
+-		xyz_zero[3*normal_orientation+0]=xyz_list[1*3+0]+s1*(xyz_list[0*3+0]-xyz_list[1*3+0]);
+-		xyz_zero[3*normal_orientation+1]=xyz_list[1*3+1]+s1*(xyz_list[0*3+1]-xyz_list[1*3+1]);
+-		xyz_zero[3*normal_orientation+2]=xyz_list[1*3+2]+s1*(xyz_list[0*3+2]-xyz_list[1*3+2]);
++}/*}}}*/
++IssmDouble Penta::IceVolume(void){/*{{{*/
+ 
+-		/*New point 2*/
+-		xyz_zero[3*(1-normal_orientation)+0]=xyz_list[1*3+0]+s2*(xyz_list[2*3+0]-xyz_list[1*3+0]);
+-		xyz_zero[3*(1-normal_orientation)+1]=xyz_list[1*3+1]+s2*(xyz_list[2*3+1]-xyz_list[1*3+1]);
+-		xyz_zero[3*(1-normal_orientation)+2]=xyz_list[1*3+2]+s2*(xyz_list[2*3+2]-xyz_list[1*3+2]);
++	/*The volume of a troncated prism is base * 1/3 sum(length of edges)*/
++	IssmDouble base,height;
++	IssmDouble xyz_list[NUMVERTICES][3];
+ 
+-		/*New point 3*/
+-		xyz_zero[3*(2+1-normal_orientation)+0]=xyz_list[4*3+0]+s1*(xyz_list[3*3+0]-xyz_list[4*3+0]);
+-		xyz_zero[3*(2+1-normal_orientation)+1]=xyz_list[4*3+1]+s1*(xyz_list[3*3+1]-xyz_list[4*3+1]);
+-		xyz_zero[3*(2+1-normal_orientation)+2]=xyz_list[4*3+2]+s1*(xyz_list[3*3+2]-xyz_list[4*3+2]);
++	if(!IsIceInElement())return 0;
+ 
+-		/*New point 4*/
+-		xyz_zero[3*(2+normal_orientation)+0]=xyz_list[4*3+0]+s2*(xyz_list[5*3+0]-xyz_list[4*3+0]);
+-		xyz_zero[3*(2+normal_orientation)+1]=xyz_list[4*3+1]+s2*(xyz_list[5*3+1]-xyz_list[4*3+1]);
+-		xyz_zero[3*(2+normal_orientation)+2]=xyz_list[4*3+2]+s2*(xyz_list[5*3+2]-xyz_list[4*3+2]);
+-	}
+-	else if(levelset[0]==0. && levelset[1]==0.){ //front is on point 0 and 1
+-		xyz_zero[3*0+0]=xyz_list[0*3+0];
+-		xyz_zero[3*0+1]=xyz_list[0*3+1];
+-		xyz_zero[3*0+2]=xyz_list[0*3+2];
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+ 
+-		/*New point 2*/
+-		xyz_zero[3*1+0]=xyz_list[1*3+0];
+-		xyz_zero[3*1+1]=xyz_list[1*3+1];
+-		xyz_zero[3*1+2]=xyz_list[1*3+2];
++	/*First calculate the area of the base (cross section triangle)
++	 * http://en.wikipedia.org/wiki/Pentangle
++	 * base = 1/2 abs((xA-xC)(yB-yA)-(xA-xB)(yC-yA))*/
++	base = 1./2.*fabs((xyz_list[0][0]-xyz_list[2][0])*(xyz_list[1][1]-xyz_list[0][1]) - (xyz_list[0][0]-xyz_list[1][0])*(xyz_list[2][1]-xyz_list[0][1]));
+ 
+-		/*New point 3*/
+-		xyz_zero[3*2+0]=xyz_list[4*3+0];
+-		xyz_zero[3*2+1]=xyz_list[4*3+1];
+-		xyz_zero[3*2+2]=xyz_list[4*3+2];
++	/*Now get the average height*/
++	height = 1./3.*((xyz_list[3][2]-xyz_list[0][2])+(xyz_list[4][2]-xyz_list[1][2])+(xyz_list[5][2]-xyz_list[2][2]));
+ 
+-		/*New point 4*/
+-		xyz_zero[3*3+0]=xyz_list[3*3+0];
+-		xyz_zero[3*3+1]=xyz_list[3*3+1];
+-		xyz_zero[3*3+2]=xyz_list[3*3+2];
+-	}
+-	else if(levelset[0]==0. && levelset[2]==0.){ //front is on point 0 and 1
+-		xyz_zero[3*0+0]=xyz_list[2*3+0];
+-		xyz_zero[3*0+1]=xyz_list[2*3+1];
+-		xyz_zero[3*0+2]=xyz_list[2*3+2];
++	/*Return: */
++	return base*height;
++}
++/*}}}*/
++IssmDouble Penta::IceVolumeAboveFloatation(void){/*{{{*/
+ 
+-		/*New point 2*/
+-		xyz_zero[3*1+0]=xyz_list[0*3+0];
+-		xyz_zero[3*1+1]=xyz_list[0*3+1];
+-		xyz_zero[3*1+2]=xyz_list[0*3+2];
++	/*Volume above floatation: H + rho_water/rho_ice*bathymetry for nodes on the bed*/
++	IssmDouble rho_ice,rho_water;
++	IssmDouble base,bed,surface,bathymetry;
++	IssmDouble xyz_list[NUMVERTICES][3];
+ 
+-		/*New point 3*/
+-		xyz_zero[3*2+0]=xyz_list[3*3+0];
+-		xyz_zero[3*2+1]=xyz_list[3*3+1];
+-		xyz_zero[3*2+2]=xyz_list[3*3+2];
++	if(!IsIceInElement() || IsFloating() || !IsOnBase())return 0;
+ 
+-		/*New point 4*/
+-		xyz_zero[3*3+0]=xyz_list[5*3+0];
+-		xyz_zero[3*3+1]=xyz_list[5*3+1];
+-		xyz_zero[3*3+2]=xyz_list[5*3+2];
+-	}
+-	else if(levelset[1]==0. && levelset[2]==0.){ //front is on point 0 and 1
+-		xyz_zero[3*0+0]=xyz_list[1*3+0];
+-		xyz_zero[3*0+1]=xyz_list[1*3+1];
+-		xyz_zero[3*0+2]=xyz_list[1*3+2];
++	rho_ice=matpar->GetRhoIce();
++	rho_water=matpar->GetRhoWater();
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+ 
+-		/*New point 2*/
+-		xyz_zero[3*1+0]=xyz_list[2*3+0];
+-		xyz_zero[3*1+1]=xyz_list[2*3+1];
+-		xyz_zero[3*1+2]=xyz_list[2*3+2];
++	/*First calculate the area of the base (cross section triangle)
++	 * http://en.wikipedia.org/wiki/Pentangle
++	 * base = 1/2 abs((xA-xC)(yB-yA)-(xA-xB)(yC-yA))*/
++	base = 1./2.*fabs((xyz_list[0][0]-xyz_list[2][0])*(xyz_list[1][1]-xyz_list[0][1]) - (xyz_list[0][0]-xyz_list[1][0])*(xyz_list[2][1]-xyz_list[0][1]));
+ 
+-		/*New point 3*/
+-		xyz_zero[3*2+0]=xyz_list[5*3+0];
+-		xyz_zero[3*2+1]=xyz_list[5*3+1];
+-		xyz_zero[3*2+2]=xyz_list[5*3+2];
++	/*Now get the average height above floatation*/
++	Input* surface_input    = inputs->GetInput(SurfaceEnum);    _assert_(surface_input);
++	Input* base_input        = inputs->GetInput(BaseEnum);        _assert_(base_input);
++	Input* bed_input = inputs->GetInput(BedEnum); _assert_(bed_input);
++	surface_input->GetInputAverage(&surface);
++	base_input->GetInputAverage(&bed);
++	bed_input->GetInputAverage(&bathymetry);
+ 
+-		/*New point 4*/
+-		xyz_zero[3*3+0]=xyz_list[4*3+0];
+-		xyz_zero[3*3+1]=xyz_list[4*3+1];
+-		xyz_zero[3*3+2]=xyz_list[4*3+2];
+-	}
+-	else _error_("Case not covered");
+-
+-	/*Assign output pointer*/
+-	*pxyz_zero= xyz_zero;
++	/*Return: */
++	return base*(surface - bed + min( rho_water/rho_ice * bathymetry, 0.) );
+ }
+ /*}}}*/
+-void       Penta::GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){/*{{{*/
+-	
+-	/* Intermediaries */
+-	const int dim=3;
+-	int i, dir,nrfrontnodes;
+-	IssmDouble  levelset[NUMVERTICES];
++void       Penta::InputControlUpdate(IssmDouble scalar,bool save_parameter){/*{{{*/
+ 
+-	/*Recover parameters and values*/
+-	GetInputListOnVertices(&levelset[0],levelsetenum);
++	/*Intermediary*/
++	int    num_controls;
++	int*   control_type=NULL;
++	Input* input=NULL;
+ 
+-	int* indicesfront = xNew<int>(NUMVERTICES);
+-	/* Get basal nodes where there is no ice */
+-	nrfrontnodes=0;
+-	for(i=0;i<NUMVERTICES2D;i++){
+-		if(levelset[i]>=0.){
+-			indicesfront[nrfrontnodes]=i;
+-			nrfrontnodes++;
++	/*retrieve some parameters: */
++	this->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
++	this->parameters->FindParam(&control_type,NULL,InversionControlParametersEnum);
++
++	for(int i=0;i<num_controls;i++){
++
++		if(control_type[i]==MaterialsRheologyBbarEnum){
++			if (!IsOnBase()) goto cleanup_and_return;
++			input=(Input*)this->inputs->GetInput(MaterialsRheologyBEnum); _assert_(input);
+ 		}
+-	}
+-	_assert_(nrfrontnodes==2);
++		else if(control_type[i]==DamageDbarEnum){
++			if (!IsOnBase()) goto cleanup_and_return;
++			input=(Input*)this->inputs->GetInput(DamageDEnum); _assert_(input);
++		}
++		else{
++			input=(Input*)this->inputs->GetInput(control_type[i]); _assert_(input);
++		}
++		if(input->ObjectEnum()!=ControlInputEnum) _error_("input " << EnumToStringx(control_type[i]) << " is not a ControlInput");
+ 
+-	/* arrange order of basal frontnodes such that they are oriented counterclockwise */
+-	if((NUMVERTICES2D+indicesfront[0]-indicesfront[1])%NUMVERTICES2D!=NUMVERTICES2D-1){
+-		int index=indicesfront[0];
+-		indicesfront[0]=indicesfront[1];
+-		indicesfront[1]=index;
+-	}	
++		((ControlInput*)input)->UpdateValue(scalar);
++		((ControlInput*)input)->Constrain();
++		if (save_parameter) ((ControlInput*)input)->SaveValue();
+ 
+-	IssmDouble* xyz_front = xNew<IssmDouble>(2*dim*nrfrontnodes);
+-	/* Return basal and top front nodes */
+-	for(i=0;i<nrfrontnodes;i++){
+-		for(dir=0;dir<dim;dir++){
+-			int ind1=i*dim+dir, ind2=(2*nrfrontnodes-1-i)*dim+dir; // vertex structure front segment: base0, base1, top1, top0
+-			xyz_front[ind1]=xyz_list[dim*indicesfront[i]+dir];
+-			xyz_front[ind2]=xyz_list[dim*(indicesfront[i]+NUMVERTICES2D)+dir];
++		if(control_type[i]==MaterialsRheologyBbarEnum){
++			this->InputExtrude(MaterialsRheologyBEnum,-1);
+ 		}
++		else if(control_type[i]==DamageDbarEnum){
++			this->InputExtrude(DamageDEnum,-1);
++		}
+ 	}
+ 
+-	*pxyz_front=xyz_front;
+-
+-	xDelete<int>(indicesfront);
+-}/*}}}*/
++	/*Clean up and return*/
++cleanup_and_return:
++	xDelete<int>(control_type);
++}
++/*}}}*/
+ void       Penta::InputDepthAverageAtBase(int enum_type,int average_enum_type){/*{{{*/
+ 
+ 	int  step,i;
+@@ -1731,6 +1609,39 @@
+ 	}
+ }
+ /*}}}*/
++bool       Penta::IsIcefront(void){/*{{{*/
++
++	bool isicefront;
++	int i,nrice;
++   IssmDouble ls[NUMVERTICES];
++
++	/*Retrieve all inputs and parameters*/
++	GetInputListOnVertices(&ls[0],MaskIceLevelsetEnum);
++
++	/* If only one vertex has ice, there is an ice front here */
++	isicefront=false;
++	if(IsIceInElement()){
++		nrice=0;       
++		for(i=0;i<NUMVERTICES2D;i++)
++			if(ls[i]<0.) nrice++;
++		if(nrice==1) isicefront= true;
++	}
++	return isicefront;
++}/*}}}*/
++bool       Penta::IsNodeOnShelfFromFlags(IssmDouble* flags){/*{{{*/
++
++	int  i;
++	bool shelf=false;
++
++	for(i=0;i<NUMVERTICES;i++){
++		if (flags[vertices[i]->Pid()]<0.){
++			shelf=true;
++			break;
++		}
++	}
++	return shelf;
++}
++/*}}}*/
+ bool       Penta::IsOnBase(void){/*{{{*/
+ 
+ 	IssmDouble values[NUMVERTICES];
+@@ -1767,18 +1678,22 @@
+ 	}
+ }
+ /*}}}*/
+-bool       Penta::IsNodeOnShelfFromFlags(IssmDouble* flags){/*{{{*/
++bool       Penta::IsZeroLevelset(int levelset_enum){/*{{{*/
+ 
+-	int  i;
+-	bool shelf=false;
++	bool        iszerols;
++	IssmDouble  ls[NUMVERTICES];
+ 
+-	for(i=0;i<NUMVERTICES;i++){
+-		if (flags[vertices[i]->Pid()]<0.){
+-			shelf=true;
+-			break;
++	/*Retrieve all inputs and parameters*/
++	GetInputListOnVertices(&ls[0],levelset_enum);
++
++	/*If the level set has always same sign, there is no ice front here*/
++	iszerols = false;
++	if(IsIceInElement()){
++		if(ls[0]*ls[1]<0. || ls[0]*ls[2]<0. || (ls[0]*ls[1]*ls[2]==0. && ls[0]*ls[1]+ls[0]*ls[2]+ls[1]*ls[2]<=0.)){
++			iszerols = true;
+ 		}
+ 	}
+-	return shelf;
++	return iszerols;
+ }
+ /*}}}*/
+ void       Penta::JacobianDeterminant(IssmDouble* pJdet,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+@@ -1802,6 +1717,13 @@
+ 
+ }
+ /*}}}*/
++void       Penta::JacobianDeterminantSurface(IssmDouble* pJdet,IssmDouble* xyz_list_quad,Gauss* gauss){/*{{{*/
++
++	_assert_(gauss->Enum()==GaussPentaEnum);
++	this->GetQuadJacobianDeterminant(pJdet,xyz_list_quad,(GaussPenta*)gauss);
++
++}
++/*}}}*/
+ void       Penta::JacobianDeterminantTop(IssmDouble* pJdet,IssmDouble* xyz_list_top,Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussPentaEnum);
+@@ -1809,13 +1731,52 @@
+ 
+ }
+ /*}}}*/
+-void       Penta::JacobianDeterminantSurface(IssmDouble* pJdet,IssmDouble* xyz_list_quad,Gauss* gauss){/*{{{*/
++IssmDouble Penta::MassFlux(IssmDouble* segment){/*{{{*/
+ 
+-	_assert_(gauss->Enum()==GaussPentaEnum);
+-	this->GetQuadJacobianDeterminant(pJdet,xyz_list_quad,(GaussPenta*)gauss);
++	IssmDouble mass_flux=0;
+ 
++	if(!IsOnBase()) return mass_flux;
++
++	/*Depth Averaging Vx and Vy*/
++	this->InputDepthAverageAtBase(VxEnum,VxAverageEnum);
++	this->InputDepthAverageAtBase(VyEnum,VyAverageEnum);
++
++	/*Spawn Tria element from the base of the Penta: */
++	Tria* tria=(Tria*)SpawnTria(0,1,2);
++	mass_flux=tria->MassFlux(segment);
++	delete tria->material; delete tria;
++
++	/*Delete Vx and Vy averaged*/
++	this->inputs->DeleteInput(VxAverageEnum);
++	this->inputs->DeleteInput(VyAverageEnum);
++
++	/*clean up and return*/
++	return mass_flux;
+ }
+ /*}}}*/
++IssmDouble Penta::MassFlux(IssmDouble x1, IssmDouble y1, IssmDouble x2, IssmDouble y2,int segment_id){/*{{{*/
++
++	IssmDouble mass_flux=0;
++
++	if(!IsOnBase()) return mass_flux;
++
++	/*Depth Averaging Vx and Vy*/
++	this->InputDepthAverageAtBase(VxEnum,VxAverageEnum);
++	this->InputDepthAverageAtBase(VyEnum,VyAverageEnum);
++
++	/*Spawn Tria element from the base of the Penta: */
++	Tria* tria=(Tria*)SpawnTria(0,1,2);
++	mass_flux=tria->MassFlux(x1,y1,x2,y2,segment_id);
++	delete tria->material; delete tria;
++
++	/*Delete Vx and Vy averaged*/
++	this->inputs->DeleteInput(VxAverageEnum);
++	this->inputs->DeleteInput(VyAverageEnum);
++
++	/*clean up and return*/
++	return mass_flux;
++}
++/*}}}*/
+ IssmDouble Penta::MinEdgeLength(IssmDouble* xyz_list){/*{{{*/
+ 	/*Return the minimum lenght of the nine egdes of the penta*/
+ 
+@@ -1837,37 +1798,6 @@
+ 	return minlength;
+ }
+ /*}}}*/
+-int        Penta::NodalValue(IssmDouble* pvalue, int index, int natureofdataenum){/*{{{*/
+-
+-	int i;
+-	int found=0;
+-	IssmDouble value;
+-	Input* data=NULL;
+-	GaussPenta* gauss=NULL;
+-
+-	/*First, serarch the input: */
+-	data=inputs->GetInput(natureofdataenum); 
+-
+-	/*figure out if we have the vertex id: */
+-	found=0;
+-	for(i=0;i<NUMVERTICES;i++){
+-		if(index==vertices[i]->Id()){
+-			/*Do we have natureofdataenum in our inputs? :*/
+-			if(data){
+-				/*ok, we are good. retrieve value of input at vertex :*/
+-				gauss=new GaussPenta(); gauss->GaussVertex(i);
+-				data->GetInputValue(&value,gauss);
+-				found=1;
+-				break;
+-			}
+-		}
+-	}
+-
+-	delete gauss;
+-	if(found)*pvalue=value;
+-	return found;
+-}
+-/*}}}*/
+ Gauss*     Penta::NewGauss(void){/*{{{*/
+ 	return new GaussPenta();
+ }
+@@ -1904,59 +1834,59 @@
+ 
+ }
+ /*}}}*/
+-void       Penta::NodalFunctionsP1(IssmDouble* basis, Gauss* gauss){/*{{{*/
++void       Penta::NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussPentaEnum);
+-	this->GetNodalFunctions(basis,(GaussPenta*)gauss,P1Enum);
++	this->GetNodalFunctionsDerivatives(dbasis,xyz_list,(GaussPenta*)gauss,this->element_type);
+ 
+ }
+ /*}}}*/
+-void       Penta::NodalFunctionsP2(IssmDouble* basis, Gauss* gauss){/*{{{*/
++void       Penta::NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussPentaEnum);
+-	this->GetNodalFunctions(basis,(GaussPenta*)gauss,P2Enum);
++	this->GetNodalFunctionsDerivatives(dbasis,xyz_list,(GaussPenta*)gauss,this->VelocityInterpolation());
+ 
+ }
+ /*}}}*/
+-void       Penta::NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void       Penta::NodalFunctionsMINIDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussPentaEnum);
+-	this->GetNodalFunctionsDerivatives(dbasis,xyz_list,(GaussPenta*)gauss,this->element_type);
++	this->GetNodalFunctionsDerivatives(dbasis,xyz_list,(GaussPenta*)gauss,P1bubbleEnum);
+ 
+ }
+ /*}}}*/
+-void       Penta::NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void       Penta::NodalFunctionsPressure(IssmDouble* basis, Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussPentaEnum);
+-	this->GetNodalFunctionsDerivatives(dbasis,xyz_list,(GaussPenta*)gauss,P1Enum);
++	this->GetNodalFunctions(basis,(GaussPenta*)gauss,this->PressureInterpolation());
+ 
+ }
+ /*}}}*/
+-void       Penta::NodalFunctionsMINIDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void       Penta::NodalFunctionsP1(IssmDouble* basis, Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussPentaEnum);
+-	this->GetNodalFunctionsDerivatives(dbasis,xyz_list,(GaussPenta*)gauss,P1bubbleEnum);
++	this->GetNodalFunctions(basis,(GaussPenta*)gauss,P1Enum);
+ 
+ }
+ /*}}}*/
+-void       Penta::NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void       Penta::NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussPentaEnum);
+-	this->GetNodalFunctionsDerivatives(dbasis,xyz_list,(GaussPenta*)gauss,this->VelocityInterpolation());
++	this->GetNodalFunctionsDerivatives(dbasis,xyz_list,(GaussPenta*)gauss,P1Enum);
+ 
+ }
+ /*}}}*/
+-void       Penta::NodalFunctionsVelocity(IssmDouble* basis, Gauss* gauss){/*{{{*/
++void       Penta::NodalFunctionsP2(IssmDouble* basis, Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussPentaEnum);
+-	this->GetNodalFunctions(basis,(GaussPenta*)gauss,this->VelocityInterpolation());
++	this->GetNodalFunctions(basis,(GaussPenta*)gauss,P2Enum);
+ 
+ }
+ /*}}}*/
+-void       Penta::NodalFunctionsPressure(IssmDouble* basis, Gauss* gauss){/*{{{*/
++void       Penta::NodalFunctionsVelocity(IssmDouble* basis, Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussPentaEnum);
+-	this->GetNodalFunctions(basis,(GaussPenta*)gauss,this->PressureInterpolation());
++	this->GetNodalFunctions(basis,(GaussPenta*)gauss,this->VelocityInterpolation());
+ 
+ }
+ /*}}}*/
+@@ -1967,6 +1897,37 @@
+ 
+ }
+ /*}}}*/
++int        Penta::NodalValue(IssmDouble* pvalue, int index, int natureofdataenum){/*{{{*/
++
++	int i;
++	int found=0;
++	IssmDouble value;
++	Input* data=NULL;
++	GaussPenta* gauss=NULL;
++
++	/*First, serarch the input: */
++	data=inputs->GetInput(natureofdataenum); 
++
++	/*figure out if we have the vertex id: */
++	found=0;
++	for(i=0;i<NUMVERTICES;i++){
++		if(index==vertices[i]->Id()){
++			/*Do we have natureofdataenum in our inputs? :*/
++			if(data){
++				/*ok, we are good. retrieve value of input at vertex :*/
++				gauss=new GaussPenta(); gauss->GaussVertex(i);
++				data->GetInputValue(&value,gauss);
++				found=1;
++				break;
++			}
++		}
++	}
++
++	delete gauss;
++	if(found)*pvalue=value;
++	return found;
++}
++/*}}}*/
+ void       Penta::NormalBase(IssmDouble* bed_normal,IssmDouble* xyz_list){/*{{{*/
+ 
+ 	IssmDouble v13[3],v23[3];
+@@ -1989,6 +1950,26 @@
+ 	bed_normal[2]=-normal[2]/normal_norm;
+ }
+ /*}}}*/
++void       Penta::NormalSection(IssmDouble* normal,IssmDouble* xyz_list){/*{{{*/
++
++	/*Build unit outward pointing vector*/
++	IssmDouble AB[3];
++	IssmDouble AC[3];
++	IssmDouble norm;
++
++	AB[0]=xyz_list[1*3+0] - xyz_list[0*3+0];
++	AB[1]=xyz_list[1*3+1] - xyz_list[0*3+1];
++	AB[2]=xyz_list[1*3+2] - xyz_list[0*3+2];
++	AC[0]=xyz_list[2*3+0] - xyz_list[0*3+0];
++	AC[1]=xyz_list[2*3+1] - xyz_list[0*3+1];
++	AC[2]=xyz_list[2*3+2] - xyz_list[0*3+2];
++
++	cross(normal,AB,AC);
++	norm=sqrt(normal[0]*normal[0]+normal[1]*normal[1]+normal[2]*normal[2]);
++
++	for(int i=0;i<3;i++) normal[i]=normal[i]/norm;
++}
++/*}}}*/
+ void       Penta::NormalTop(IssmDouble* top_normal,IssmDouble* xyz_list){/*{{{*/
+ 
+ 	int i;
+@@ -2019,6 +2000,12 @@
+ 	return PentaRef::NumberofNodes(this->VelocityInterpolation());
+ }
+ /*}}}*/
++int        Penta::ObjectEnum(void){/*{{{*/
++
++	return PentaEnum;
++
++}
++/*}}}*/
+ void       Penta::PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm){/*{{{*/
+ 
+    IssmDouble agd[NUMVERTICES];             // surface mass balance
+@@ -2088,6 +2075,37 @@
+ 	delete gauss;
+ }
+ /*}}}*/
++void       Penta::PotentialUngrounding(Vector<IssmDouble>* potential_ungrounding){/*{{{*/
++
++	IssmDouble  h[NUMVERTICES],r[NUMVERTICES],gl[NUMVERTICES];
++	IssmDouble  bed_hydro;
++	IssmDouble  rho_water,rho_ice,density;
++
++	/*material parameters: */
++	rho_water=matpar->GetRhoWater();
++	rho_ice=matpar->GetRhoIce();
++	density=rho_ice/rho_water;
++	GetInputListOnVertices(&h[0],ThicknessEnum);
++	GetInputListOnVertices(&r[0],BedEnum);
++	GetInputListOnVertices(&gl[0],MaskGroundediceLevelsetEnum);
++
++	/*go through vertices, and figure out which ones are on the ice sheet, and want to unground: */
++	for(int i=0;i<NUMVERTICES;i++){
++		/*Find if grounded vertices want to start floating*/
++		if (gl[i]>0.){
++			bed_hydro=-density*h[i];
++			if(bed_hydro>r[i]){
++				/*Vertex that could potentially unground, flag it*/
++				potential_ungrounding->SetValue(vertices[i]->Pid(),1,INS_VAL);
++			}
++		}
++	}
++}
++/*}}}*/
++int        Penta::PressureInterpolation(void){/*{{{*/
++	return PentaRef::PressureInterpolation(this->element_type);
++}
++/*}}}*/
+ void       Penta::ReduceMatrices(ElementMatrix* Ke,ElementVector* pe){/*{{{*/
+ 
+ 	int analysis_type;
+@@ -2206,11 +2224,71 @@
+ 	delete gauss;
+ }
+ /*}}}*/
++void       Penta::ResetHooks(){/*{{{*/
++
++	this->nodes=NULL;
++	this->vertices=NULL;
++	this->material=NULL;
++	this->matpar=NULL;
++	this->verticalneighbors=NULL;
++	this->parameters=NULL;
++
++	//deal with ElementHook mother class
++	for(int i=0;i<this->numanalyses;i++) if(this->hnodes[i]) this->hnodes[i]->reset();
++	this->hvertices->reset();
++	this->hmaterial->reset();
++	this->hmatpar->reset();
++	if(this->hneighbors) this->hneighbors->reset();
++
++}
++/*}}}*/
+ void       Penta::SetClone(int* minranks){/*{{{*/
+ 
+ 	_error_("not implemented yet");
+ }
+ /*}}}*/
++void       Penta::SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){/*{{{*/
++
++	IssmDouble  values[NUMVERTICES];
++	int         vertexpidlist[NUMVERTICES],control_init;
++
++	/*Specific case for depth averaged quantities*/
++	control_init=control_enum;
++	if(control_enum==MaterialsRheologyBbarEnum){
++		control_enum=MaterialsRheologyBEnum;
++		if(!IsOnBase()) return;
++	}
++	if(control_enum==DamageDbarEnum){
++		control_enum=DamageDEnum;
++		if(!IsOnBase()) return;
++	}
++
++	/*Get out if this is not an element input*/
++	if(!IsInput(control_enum)) return;
++
++	/*Prepare index list*/
++	GradientIndexing(&vertexpidlist[0],control_index);
++
++	/*Get values on vertices*/
++	for(int i=0;i<NUMVERTICES;i++){
++		values[i]=vector[vertexpidlist[i]];
++	}
++	Input* new_input = new PentaInput(control_enum,values,P1Enum);
++	Input* input=(Input*)this->inputs->GetInput(control_enum);   _assert_(input);
++	if(input->ObjectEnum()!=ControlInputEnum){
++		_error_("input " << EnumToStringx(control_enum) << " is not a ControlInput");
++	}
++
++	((ControlInput*)input)->SetInput(new_input);
++
++	if(control_init==MaterialsRheologyBbarEnum){
++		this->InputExtrude(control_enum,-1);
++	}
++	if(control_init==DamageDbarEnum){
++		this->InputExtrude(control_enum,-1);
++	}
++}
++/*}}}*/
+ void       Penta::SetCurrentConfiguration(Elements* elementsin, Loads* loadsin, Nodes* nodesin, Materials* materialsin, Parameters* parametersin){/*{{{*/
+ 
+ 	/*go into parameters and get the analysis_counter: */
+@@ -2226,26 +2304,38 @@
+ 
+ }
+ /*}}}*/
+-void       Penta::ResetHooks(){/*{{{*/
++void       Penta::SetTemporaryElementType(int element_type_in){/*{{{*/
++	this->element_type=element_type_in;
++}
++/*}}}*/
++Element*   Penta::SpawnBasalElement(void){/*{{{*/
+ 
+-	this->nodes=NULL;
+-	this->vertices=NULL;
+-	this->material=NULL;
+-	this->matpar=NULL;
+-	this->verticalneighbors=NULL;
+-	this->parameters=NULL;
++	_assert_(this->IsOnBase());
+ 
+-	//deal with ElementHook mother class
+-	for(int i=0;i<this->numanalyses;i++) if(this->hnodes[i]) this->hnodes[i]->reset();
+-	this->hvertices->reset();
+-	this->hmaterial->reset();
+-	this->hmatpar->reset();
+-	if(this->hneighbors) this->hneighbors->reset();
++	this->InputDepthAverageAtBase(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
++	if(this->material->IsDamage())this->InputDepthAverageAtBase(DamageDEnum,DamageDbarEnum);
++	if(this->inputs->GetInput(VxEnum)) this->InputDepthAverageAtBase(VxEnum,VxAverageEnum);
++	if(this->inputs->GetInput(VyEnum)) this->InputDepthAverageAtBase(VyEnum,VyAverageEnum);
++	if(this->inputs->GetInput(CalvingratexEnum)) this->InputDepthAverageAtBase(CalvingratexEnum,CalvingratexAverageEnum);
++	if(this->inputs->GetInput(CalvingrateyEnum)) this->InputDepthAverageAtBase(CalvingrateyEnum,CalvingrateyAverageEnum);
++	Tria* tria=(Tria*)SpawnTria(0,1,2);
++	this->inputs->DeleteInput(MaterialsRheologyBbarEnum);
++	this->inputs->DeleteInput(DamageDbarEnum);
++	this->inputs->DeleteInput(VxAverageEnum);
++	this->inputs->DeleteInput(VyAverageEnum);
++	this->inputs->DeleteInput(CalvingratexAverageEnum);
++	this->inputs->DeleteInput(CalvingrateyAverageEnum);
+ 
++	return tria;
+ }
+ /*}}}*/
+-void       Penta::SetTemporaryElementType(int element_type_in){/*{{{*/
+-	this->element_type=element_type_in;
++Element*   Penta::SpawnTopElement(void){/*{{{*/
++
++	_assert_(this->IsOnSurface());
++
++	Tria* tria=(Tria*)SpawnTria(3,4,5);
++
++	return tria;
+ }
+ /*}}}*/
+ Tria*      Penta::SpawnTria(int index1,int index2,int index3){/*{{{*/
+@@ -2275,36 +2365,194 @@
+ 	return tria;
+ }
+ /*}}}*/
+-Element*   Penta::SpawnBasalElement(void){/*{{{*/
++IssmDouble Penta::StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa){/*{{{*/
++	/*Compute stabilization parameter*/
++	/*kappa=thermalconductivity/(rho_ice*hearcapacity) for thermal model*/
++	/*kappa=enthalpydiffusionparameter for enthalpy model*/
+ 
+-	_assert_(this->IsOnBase());
++	IssmDouble normu;
++	IssmDouble tau_parameter;
+ 
+-	this->InputDepthAverageAtBase(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum);
+-	if(this->material->IsDamage())this->InputDepthAverageAtBase(DamageDEnum,DamageDbarEnum);
+-	if(this->inputs->GetInput(VxEnum)) this->InputDepthAverageAtBase(VxEnum,VxAverageEnum);
+-	if(this->inputs->GetInput(VyEnum)) this->InputDepthAverageAtBase(VyEnum,VyAverageEnum);
+-	if(this->inputs->GetInput(CalvingratexEnum)) this->InputDepthAverageAtBase(CalvingratexEnum,CalvingratexAverageEnum);
+-	if(this->inputs->GetInput(CalvingrateyEnum)) this->InputDepthAverageAtBase(CalvingrateyEnum,CalvingrateyAverageEnum);
+-	Tria* tria=(Tria*)SpawnTria(0,1,2);
+-	this->inputs->DeleteInput(MaterialsRheologyBbarEnum);
+-	this->inputs->DeleteInput(DamageDbarEnum);
+-	this->inputs->DeleteInput(VxAverageEnum);
+-	this->inputs->DeleteInput(VyAverageEnum);
+-	this->inputs->DeleteInput(CalvingratexAverageEnum);
+-	this->inputs->DeleteInput(CalvingrateyAverageEnum);
++	normu=pow(pow(u,2)+pow(v,2)+pow(w,2),0.5);
++	if(normu*diameter/(3*2*kappa)<1){ 
++		tau_parameter=pow(diameter,2)/(3*2*2*kappa);
++	}
++	else tau_parameter=diameter/(2*normu);
+ 
+-	return tria;
++	return tau_parameter;
+ }
+ /*}}}*/
+-Element*   Penta::SpawnTopElement(void){/*{{{*/
++void       Penta::StrainRateparallel(){/*{{{*/
+ 
+-	_assert_(this->IsOnSurface());
++	IssmDouble *xyz_list = NULL;
++	IssmDouble  epsilon[6];
++	GaussPenta* gauss=NULL;
++	IssmDouble  vx,vy,vel;
++	IssmDouble  strainxx;
++	IssmDouble  strainxy;
++	IssmDouble  strainyy;
++	IssmDouble  strainparallel[NUMVERTICES];
+ 
+-	Tria* tria=(Tria*)SpawnTria(3,4,5);
++	/* Get node coordinates and dof list: */
++	this->GetVerticesCoordinates(&xyz_list);
+ 
+-	return tria;
++	/*Retrieve all inputs we will need*/
++	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
++	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
++	Input* vz_input=inputs->GetInput(VzEnum);												_assert_(vz_input);
++
++	/* Start looping on the number of vertices: */
++	gauss=new GaussPenta();
++	for (int iv=0;iv<NUMVERTICES;iv++){
++		gauss->GaussVertex(iv);
++
++		/* Get the value we need*/
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		vel=vx*vx+vy*vy;
++
++		/*Compute strain rate and viscosity: */
++		this->StrainRateFS(&epsilon[0],xyz_list,gauss,vx_input,vy_input,vz_input);
++		strainxx=epsilon[0];
++		strainyy=epsilon[1];
++		strainxy=epsilon[3];
++
++		/*strainparallel= Strain rate along the ice flow direction */
++		strainparallel[iv]=(vx*vx*(strainxx)+vy*vy*(strainyy)+2*vy*vx*strainxy)/(vel+1.e-6);
++	}
++
++	/*Add input*/
++	this->inputs->AddInput(new PentaInput(StrainRateparallelEnum,&strainparallel[0],P1Enum));
++
++	/*Clean up and return*/
++	delete gauss;
++	xDelete<IssmDouble>(xyz_list);
+ }
+ /*}}}*/
++void       Penta::StrainRateperpendicular(){/*{{{*/
++
++	IssmDouble *xyz_list = NULL;
++	IssmDouble  epsilon[6];
++	GaussPenta* gauss=NULL;
++	IssmDouble  vx,vy,vel;
++	IssmDouble  strainxx;
++	IssmDouble  strainxy;
++	IssmDouble  strainyy;
++	IssmDouble  strainperpendicular[NUMVERTICES];
++
++	/* Get node coordinates and dof list: */
++	this->GetVerticesCoordinates(&xyz_list);
++
++	/*Retrieve all inputs we will need*/
++	Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
++	Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
++	Input* vz_input=inputs->GetInput(VzEnum);												_assert_(vz_input);
++
++	/* Start looping on the number of vertices: */
++	gauss=new GaussPenta();
++	for (int iv=0;iv<NUMVERTICES;iv++){
++		gauss->GaussVertex(iv);
++
++		/* Get the value we need*/
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		vel=vx*vx+vy*vy;
++
++		/*Compute strain rate and viscosity: */
++		this->StrainRateFS(&epsilon[0],xyz_list,gauss,vx_input,vy_input,vz_input);
++		strainxx=epsilon[0];
++		strainyy=epsilon[1];
++		strainxy=epsilon[3];
++
++		/*strainperpendicular= Strain rate perpendicular to the ice flow direction */
++		strainperpendicular[iv]=(vx*vx*(strainyy)+vy*vy*(strainxx)-2*vy*vx*strainxy)/(vel+1.e-6);
++	}
++
++	/*Add input*/
++	this->inputs->AddInput(new PentaInput(StrainRateperpendicularEnum,&strainperpendicular[0],P1Enum));
++
++	/*Clean up and return*/
++	delete gauss;
++	xDelete<IssmDouble>(xyz_list);
++}
++/*}}}*/
++void       Penta::StressIntensityFactor(){/*{{{*/
++
++	/* Check if we are on the base */
++	if(!IsOnBase()) return;
++
++	IssmDouble  ki[6]={0.};
++	IssmDouble  const_grav=9.81;
++	IssmDouble  rho_ice=900;
++	IssmDouble  rho_water=1000;
++	IssmDouble  Jdet[3];
++	IssmDouble  pressure,vx,vy,vel,deviaxx,deviaxy,deviayy,water_depth,prof,stress_xx,thickness;
++
++	Penta* penta=this;
++	for(;;){
++	
++		IssmDouble  xyz_list[NUMVERTICES][3];
++		/* Get node coordinates and dof list: */
++		::GetVerticesCoordinates(&xyz_list[0][0],penta->vertices,NUMVERTICES);
++
++		///*Compute the Jacobian for the vertical integration*/
++		Jdet[0]=(xyz_list[3][2]-xyz_list[0][2])*0.5;
++		Jdet[1]=(xyz_list[4][2]-xyz_list[1][2])*0.5;
++		Jdet[2]=(xyz_list[5][2]-xyz_list[2][2])*0.5;
++	
++		/*Retrieve all inputs we will need*/
++		Input* vx_input=inputs->GetInput(VxEnum);                                  _assert_(vx_input);
++		Input* vy_input=inputs->GetInput(VyEnum);                                  _assert_(vy_input);
++		Input* vel_input=inputs->GetInput(VelEnum);                                _assert_(vel_input);
++		Input* pressure_input=inputs->GetInput(PressureEnum);                      _assert_(pressure_input);
++		Input* deviaxx_input=inputs->GetInput(DeviatoricStressxxEnum);             _assert_(deviaxx_input);
++		Input* deviaxy_input=inputs->GetInput(DeviatoricStressxyEnum);             _assert_(deviaxy_input);
++		Input* deviayy_input=inputs->GetInput(DeviatoricStressyyEnum);             _assert_(deviayy_input);
++		Input* surface_input=inputs->GetInput(SurfaceEnum);								_assert_(surface_input);
++		Input* thickness_input=inputs->GetInput(ThicknessEnum);							_assert_(thickness_input);
++		
++		/* Start looping on the number of 2D vertices: */
++		for(int ig=0;ig<3;ig++){
++			GaussPenta* gauss=new GaussPenta(ig,3+ig,11);
++			for (int iv=gauss->begin();iv<gauss->end();iv++){
++				gauss->GaussPoint(iv);
++
++				/* Get the value we need*/
++				pressure_input->GetInputValue(&pressure,gauss);
++				vx_input->GetInputValue(&vx,gauss);
++				vy_input->GetInputValue(&vy,gauss);
++				vel_input->GetInputValue(&vel,gauss);
++				deviaxx_input->GetInputValue(&deviaxx,gauss);
++				deviaxy_input->GetInputValue(&deviaxy,gauss);
++				deviayy_input->GetInputValue(&deviayy,gauss);
++				surface_input->GetInputValue(&water_depth,gauss);
++				thickness_input->GetInputValue(&thickness,gauss);
++				prof=water_depth-penta->GetZcoord(&xyz_list[0][0],gauss);
++
++				/*stress_xx= Deviatoric stress along the ice flow direction plus cryostatic pressure */
++				stress_xx=(vx*vx*(deviaxx)+vy*vy*(deviayy)+2*vy*vx*deviaxy)/(vel*vel+1.e-6);
++
++				if(prof<water_depth&prof<thickness){
++					/* Compute the local stress intensity factor*/ 
++					ki[ig]+=Jdet[ig]*gauss->weight*stress_xx*StressIntensityIntegralWeight(prof,min(water_depth,thickness),thickness);
++				}
++			}
++			delete gauss;
++		}
++			
++		/*Stop if we have reached the surface/base*/
++		if(penta->IsOnSurface()) break;
++		
++		/*get upper Penta*/
++		penta=penta->GetUpperPenta();
++		_assert_(penta->Id()!=this->id);
++	}
++
++	/*Add input*/
++	this->inputs->AddInput(new PentaInput(StressIntensityFactorEnum,&ki[0],P1Enum));
++	this->InputExtrude(StressIntensityFactorEnum,-1);
++}
++/*}}}*/
+ IssmDouble Penta::SurfaceArea(void){/*{{{*/
+ 
+ 	int    approximation;
+@@ -2384,6 +2632,35 @@
+ 
+ 	return dt;
+ }/*}}}*/
++IssmDouble Penta::TotalSmb(void){/*{{{*/
++
++	/*The smb[Gt yr-1] of one element is area[m2] * smb [ m ice yr^-1] * rho_ice [kg m-3] / 1e+10^12 */
++	IssmDouble base,smb,rho_ice;
++	IssmDouble Total_Smb=0;
++	IssmDouble xyz_list[NUMVERTICES][3];
++
++	/*Get material parameters :*/
++	rho_ice=matpar->GetRhoIce();
++
++	if(!IsIceInElement() || !IsOnSurface()) return 0.;
++
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++
++	/*First calculate the area of the base (cross section triangle)
++	 * http://en.wikipedia.org/wiki/Triangle
++	 * base = 1/2 abs((xA-xC)(yB-yA)-(xA-xB)(yC-yA))*/
++	base = 1./2. * fabs((xyz_list[0][0]-xyz_list[2][0])*(xyz_list[1][1]-xyz_list[0][1]) - (xyz_list[0][0]-xyz_list[1][0])*(xyz_list[2][1]-xyz_list[0][1]));
++
++	/*Now get the average SMB over the element*/
++	Input* smb_input = inputs->GetInput(SurfaceforcingsMassBalanceEnum); _assert_(smb_input);
++
++	smb_input->GetInputAverage(&smb);
++	Total_Smb=rho_ice*base*smb;// smb on element in kg s-1
++
++	/*Return: */
++	return Total_Smb;
++}
++/*}}}*/
+ void       Penta::Update(int index,IoModel* iomodel,int analysis_counter,int analysis_type,int finiteelement_type){ /*{{{*/
+ 
+ 	/*Intermediaries*/
+@@ -2832,14 +3109,37 @@
+ 
+ }
+ /*}}}*/
+-void       Penta::ValueP1OnGauss(IssmDouble* pvalue,IssmDouble* values,Gauss* gauss){/*{{{*/
+-	PentaRef::GetInputValue(pvalue,values,gauss,P1Enum);
++int        Penta::UpdatePotentialUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf){/*{{{*/
++
++	int i;
++	int nflipped=0;
++
++	/*Go through nodes, and whoever is on the potential_ungrounding, ends up in nodes_on_iceshelf: */
++	for(i=0;i<NUMVERTICES;i++){
++		if (reCast<bool,IssmDouble>(vertices_potentially_ungrounding[vertices[i]->Pid()])){
++			vec_nodes_on_iceshelf->SetValue(vertices[i]->Pid(),-1.,INS_VAL);
++
++			/*If node was not on ice shelf, we flipped*/
++			if(nodes_on_iceshelf[vertices[i]->Pid()]>=0.){
++				nflipped++;
++			}
++		}
++	}
++	return nflipped;
+ }
+ /*}}}*/
+ void       Penta::ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	PentaRef::GetInputDerivativeValue(dvalue,values,xyz_list,gauss,P1Enum);
+ }
+ /*}}}*/
++void       Penta::ValueP1OnGauss(IssmDouble* pvalue,IssmDouble* values,Gauss* gauss){/*{{{*/
++	PentaRef::GetInputValue(pvalue,values,gauss,P1Enum);
++}
++/*}}}*/
++int        Penta::VelocityInterpolation(void){/*{{{*/
++	return PentaRef::VelocityInterpolation(this->element_type);
++}
++/*}}}*/
+ int        Penta::VertexConnectivity(int vertexindex){/*{{{*/
+ 	_assert_(this->vertices);
+ 	return this->vertices[vertexindex]->Connectivity();
+@@ -2874,393 +3174,168 @@
+ 	*pphi = phi;
+ }
+ /*}}}*/
+-int        Penta::VelocityInterpolation(void){/*{{{*/
+-	return PentaRef::VelocityInterpolation(this->element_type);
+-}
+-/*}}}*/
+-int        Penta::PressureInterpolation(void){/*{{{*/
+-	return PentaRef::PressureInterpolation(this->element_type);
+-}
+-/*}}}*/
+-bool       Penta::IsZeroLevelset(int levelset_enum){/*{{{*/
++void       Penta::ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum){/*{{{*/
++	/*Compute portion of the element that is grounded*/ 
+ 
+-	bool        iszerols;
+-	IssmDouble  ls[NUMVERTICES];
++	int         normal_orientation=0;
++	IssmDouble  s1,s2;
++	IssmDouble  levelset[NUMVERTICES];
++	IssmDouble* xyz_zero = xNew<IssmDouble>(4*3);
+ 
+-	/*Retrieve all inputs and parameters*/
+-	GetInputListOnVertices(&ls[0],levelset_enum);
++	/*Recover parameters and values*/
++	GetInputListOnVertices(&levelset[0],levelsetenum);
+ 
+-	/*If the level set has always same sign, there is no ice front here*/
+-	iszerols = false;
+-	if(IsIceInElement()){
+-		if(ls[0]*ls[1]<0. || ls[0]*ls[2]<0. || (ls[0]*ls[1]*ls[2]==0. && ls[0]*ls[1]+ls[0]*ls[2]+ls[1]*ls[2]<=0.)){
+-			iszerols = true;
+-		}
+-	}
+-	return iszerols;
+-}
+-/*}}}*/
+-bool       Penta::IsIcefront(void){/*{{{*/
++	if(levelset[0]*levelset[1]>0.){ //Nodes 0 and 1 are similar, so points must be found on segment 0-2 and 1-2
++		/*Portion of the segments*/
++		s1=levelset[2]/(levelset[2]-levelset[1]);
++		s2=levelset[2]/(levelset[2]-levelset[0]);
+ 
+-	bool isicefront;
+-	int i,nrice;
+-   IssmDouble ls[NUMVERTICES];
++		if(levelset[2]<0.) normal_orientation=1; //orientation of quadrangle at base and top, depending on distribution of levelsetfunction
++		/*New point 1*/
++		xyz_zero[3*normal_orientation+0]=xyz_list[2*3+0]+s1*(xyz_list[1*3+0]-xyz_list[2*3+0]);
++		xyz_zero[3*normal_orientation+1]=xyz_list[2*3+1]+s1*(xyz_list[1*3+1]-xyz_list[2*3+1]);
++		xyz_zero[3*normal_orientation+2]=xyz_list[2*3+2]+s1*(xyz_list[1*3+2]-xyz_list[2*3+2]);
+ 
+-	/*Retrieve all inputs and parameters*/
+-	GetInputListOnVertices(&ls[0],MaskIceLevelsetEnum);
++		/*New point 0*/
++		xyz_zero[3*(1-normal_orientation)+0]=xyz_list[2*3+0]+s2*(xyz_list[0*3+0]-xyz_list[2*3+0]);
++		xyz_zero[3*(1-normal_orientation)+1]=xyz_list[2*3+1]+s2*(xyz_list[0*3+1]-xyz_list[2*3+1]);
++		xyz_zero[3*(1-normal_orientation)+2]=xyz_list[2*3+2]+s2*(xyz_list[0*3+2]-xyz_list[2*3+2]);
+ 
+-	/* If only one vertex has ice, there is an ice front here */
+-	isicefront=false;
+-	if(IsIceInElement()){
+-		nrice=0;       
+-		for(i=0;i<NUMVERTICES2D;i++)
+-			if(ls[i]<0.) nrice++;
+-		if(nrice==1) isicefront= true;
+-	}
+-	return isicefront;
+-}/*}}}*/
+-void       Penta::AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part){/*{{{*/
+-	_error_("Not supported yet!");
+-}
+-/*}}}*/
+-IssmDouble Penta::IceVolume(void){/*{{{*/
++		/*New point 3*/
++		xyz_zero[3*(2+1-normal_orientation)+0]=xyz_list[5*3+0]+s1*(xyz_list[4*3+0]-xyz_list[5*3+0]);
++		xyz_zero[3*(2+1-normal_orientation)+1]=xyz_list[5*3+1]+s1*(xyz_list[4*3+1]-xyz_list[5*3+1]);
++		xyz_zero[3*(2+1-normal_orientation)+2]=xyz_list[5*3+2]+s1*(xyz_list[4*3+2]-xyz_list[5*3+2]);
+ 
+-	/*The volume of a troncated prism is base * 1/3 sum(length of edges)*/
+-	IssmDouble base,height;
+-	IssmDouble xyz_list[NUMVERTICES][3];
+-
+-	if(!IsIceInElement())return 0;
+-
+-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-
+-	/*First calculate the area of the base (cross section triangle)
+-	 * http://en.wikipedia.org/wiki/Pentangle
+-	 * base = 1/2 abs((xA-xC)(yB-yA)-(xA-xB)(yC-yA))*/
+-	base = 1./2.*fabs((xyz_list[0][0]-xyz_list[2][0])*(xyz_list[1][1]-xyz_list[0][1]) - (xyz_list[0][0]-xyz_list[1][0])*(xyz_list[2][1]-xyz_list[0][1]));
+-
+-	/*Now get the average height*/
+-	height = 1./3.*((xyz_list[3][2]-xyz_list[0][2])+(xyz_list[4][2]-xyz_list[1][2])+(xyz_list[5][2]-xyz_list[2][2]));
+-
+-	/*Return: */
+-	return base*height;
+-}
+-/*}}}*/
+-IssmDouble Penta::IceVolumeAboveFloatation(void){/*{{{*/
+-
+-	/*Volume above floatation: H + rho_water/rho_ice*bathymetry for nodes on the bed*/
+-	IssmDouble rho_ice,rho_water;
+-	IssmDouble base,bed,surface,bathymetry;
+-	IssmDouble xyz_list[NUMVERTICES][3];
+-
+-	if(!IsIceInElement() || IsFloating() || !IsOnBase())return 0;
+-
+-	rho_ice=matpar->GetRhoIce();
+-	rho_water=matpar->GetRhoWater();
+-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-
+-	/*First calculate the area of the base (cross section triangle)
+-	 * http://en.wikipedia.org/wiki/Pentangle
+-	 * base = 1/2 abs((xA-xC)(yB-yA)-(xA-xB)(yC-yA))*/
+-	base = 1./2.*fabs((xyz_list[0][0]-xyz_list[2][0])*(xyz_list[1][1]-xyz_list[0][1]) - (xyz_list[0][0]-xyz_list[1][0])*(xyz_list[2][1]-xyz_list[0][1]));
+-
+-	/*Now get the average height above floatation*/
+-	Input* surface_input    = inputs->GetInput(SurfaceEnum);    _assert_(surface_input);
+-	Input* base_input        = inputs->GetInput(BaseEnum);        _assert_(base_input);
+-	Input* bed_input = inputs->GetInput(BedEnum); _assert_(bed_input);
+-	surface_input->GetInputAverage(&surface);
+-	base_input->GetInputAverage(&bed);
+-	bed_input->GetInputAverage(&bathymetry);
+-
+-	/*Return: */
+-	return base*(surface - bed + min( rho_water/rho_ice * bathymetry, 0.) );
+-}
+-/*}}}*/
+-IssmDouble Penta::MassFlux( IssmDouble* segment){/*{{{*/
+-
+-	IssmDouble mass_flux=0;
+-
+-	if(!IsOnBase()) return mass_flux;
+-
+-	/*Depth Averaging Vx and Vy*/
+-	this->InputDepthAverageAtBase(VxEnum,VxAverageEnum);
+-	this->InputDepthAverageAtBase(VyEnum,VyAverageEnum);
+-
+-	/*Spawn Tria element from the base of the Penta: */
+-	Tria* tria=(Tria*)SpawnTria(0,1,2);
+-	mass_flux=tria->MassFlux(segment);
+-	delete tria->material; delete tria;
+-
+-	/*Delete Vx and Vy averaged*/
+-	this->inputs->DeleteInput(VxAverageEnum);
+-	this->inputs->DeleteInput(VyAverageEnum);
+-
+-	/*clean up and return*/
+-	return mass_flux;
+-}
+-/*}}}*/
+-IssmDouble Penta::MassFlux( IssmDouble x1, IssmDouble y1, IssmDouble x2, IssmDouble y2,int segment_id){/*{{{*/
+-
+-	IssmDouble mass_flux=0;
+-
+-	if(!IsOnBase()) return mass_flux;
+-
+-	/*Depth Averaging Vx and Vy*/
+-	this->InputDepthAverageAtBase(VxEnum,VxAverageEnum);
+-	this->InputDepthAverageAtBase(VyEnum,VyAverageEnum);
+-
+-	/*Spawn Tria element from the base of the Penta: */
+-	Tria* tria=(Tria*)SpawnTria(0,1,2);
+-	mass_flux=tria->MassFlux(x1,y1,x2,y2,segment_id);
+-	delete tria->material; delete tria;
+-
+-	/*Delete Vx and Vy averaged*/
+-	this->inputs->DeleteInput(VxAverageEnum);
+-	this->inputs->DeleteInput(VyAverageEnum);
+-
+-	/*clean up and return*/
+-	return mass_flux;
+-}
+-/*}}}*/
+-void       Penta::ElementResponse(IssmDouble* presponse,int response_enum){/*{{{*/
+-
+-	switch(response_enum){
+-		case MaterialsRheologyBbarEnum:
+-			*presponse=this->material->GetBbar();
+-			break;
+-		case DamageDbarEnum:
+-			*presponse=this->material->GetDbar();
+-			break;
+-		case VelEnum:
+-			{
+-
+-				/*Get input:*/
+-				IssmDouble vel;
+-				Input* vel_input;
+-
+-				vel_input=this->inputs->GetInput(VelEnum); _assert_(vel_input);
+-				vel_input->GetInputAverage(&vel);
+-
+-				/*Assign output pointers:*/
+-				*presponse=vel;
+-			}
+-			break;
+-		default:  
+-			_error_("Response type " << EnumToStringx(response_enum) << " not supported yet!");
++		/*New point 4*/
++		xyz_zero[3*(2+normal_orientation)+0]=xyz_list[5*3+0]+s2*(xyz_list[3*3+0]-xyz_list[5*3+0]);
++		xyz_zero[3*(2+normal_orientation)+1]=xyz_list[5*3+1]+s2*(xyz_list[3*3+1]-xyz_list[5*3+1]);
++		xyz_zero[3*(2+normal_orientation)+2]=xyz_list[5*3+2]+s2*(xyz_list[3*3+2]-xyz_list[5*3+2]);
+ 	}
++	else if(levelset[1]*levelset[2]>0.){ //Nodes 1 and 2 are similar, so points must be found on segment 0-1 and 0-2
++		/*Portion of the segments*/
++		s1=levelset[0]/(levelset[0]-levelset[2]);
++		s2=levelset[0]/(levelset[0]-levelset[1]);
+ 
+-}
+-/*}}}*/
+-IssmDouble Penta::TotalSmb(void){/*{{{*/
++		if(levelset[0]<0.) normal_orientation=1;
++		/*New point 1*/
++		xyz_zero[3*normal_orientation+0]=xyz_list[0*3+0]+s1*(xyz_list[2*3+0]-xyz_list[0*3+0]);
++		xyz_zero[3*normal_orientation+1]=xyz_list[0*3+1]+s1*(xyz_list[2*3+1]-xyz_list[0*3+1]);
++		xyz_zero[3*normal_orientation+2]=xyz_list[0*3+2]+s1*(xyz_list[2*3+2]-xyz_list[0*3+2]);
+ 
+-	/*The smb[Gt yr-1] of one element is area[m2] * smb [ m ice yr^-1] * rho_ice [kg m-3] / 1e+10^12 */
+-	IssmDouble base,smb,rho_ice;
+-	IssmDouble Total_Smb=0;
+-	IssmDouble xyz_list[NUMVERTICES][3];
++		/*New point 2*/
++		xyz_zero[3*(1-normal_orientation)+0]=xyz_list[0*3+0]+s2*(xyz_list[1*3+0]-xyz_list[0*3+0]);
++		xyz_zero[3*(1-normal_orientation)+1]=xyz_list[0*3+1]+s2*(xyz_list[1*3+1]-xyz_list[0*3+1]);
++		xyz_zero[3*(1-normal_orientation)+2]=xyz_list[0*3+2]+s2*(xyz_list[1*3+2]-xyz_list[0*3+2]);
+ 
+-	/*Get material parameters :*/
+-	rho_ice=matpar->GetRhoIce();
++		/*New point 3*/
++		xyz_zero[3*(2+1-normal_orientation)+0]=xyz_list[3*3+0]+s1*(xyz_list[5*3+0]-xyz_list[3*3+0]);
++		xyz_zero[3*(2+1-normal_orientation)+1]=xyz_list[3*3+1]+s1*(xyz_list[5*3+1]-xyz_list[3*3+1]);
++		xyz_zero[3*(2+1-normal_orientation)+2]=xyz_list[3*3+2]+s1*(xyz_list[5*3+2]-xyz_list[3*3+2]);
+ 
+-	if(!IsIceInElement() || !IsOnSurface()) return 0.;
+-
+-	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-
+-	/*First calculate the area of the base (cross section triangle)
+-	 * http://en.wikipedia.org/wiki/Triangle
+-	 * base = 1/2 abs((xA-xC)(yB-yA)-(xA-xB)(yC-yA))*/
+-	base = 1./2. * fabs((xyz_list[0][0]-xyz_list[2][0])*(xyz_list[1][1]-xyz_list[0][1]) - (xyz_list[0][0]-xyz_list[1][0])*(xyz_list[2][1]-xyz_list[0][1]));
+-
+-	/*Now get the average SMB over the element*/
+-	Input* smb_input = inputs->GetInput(SurfaceforcingsMassBalanceEnum); _assert_(smb_input);
+-
+-	smb_input->GetInputAverage(&smb);
+-	Total_Smb=rho_ice*base*smb;// smb on element in kg s-1
+-
+-	/*Return: */
+-	return Total_Smb;
+-}
+-/*}}}*/
+-
+-#ifdef _HAVE_GIA_
+-void       Penta::GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,IssmDouble* x,IssmDouble* y){/*{{{*/
+-	_error_("GIA deflection not implemented yet!");
+-}
+-/*}}}*/
+-#endif
+-
+-void       Penta::ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){/*{{{*/
+-
+-	int    vertexpidlist[NUMVERTICES];
+-	IssmDouble grad_list[NUMVERTICES];
+-	Input* grad_input=NULL;
+-	Input* input=NULL;
+-
+-	if(enum_type==MaterialsRheologyBbarEnum){
+-		input=(Input*)inputs->GetInput(MaterialsRheologyBEnum);
++		/*New point 4*/
++		xyz_zero[3*(2+normal_orientation)+0]=xyz_list[3*3+0]+s2*(xyz_list[4*3+0]-xyz_list[3*3+0]);
++		xyz_zero[3*(2+normal_orientation)+1]=xyz_list[3*3+1]+s2*(xyz_list[4*3+1]-xyz_list[3*3+1]);
++		xyz_zero[3*(2+normal_orientation)+2]=xyz_list[3*3+2]+s2*(xyz_list[4*3+2]-xyz_list[3*3+2]);
+ 	}
+-	else if(enum_type==DamageDbarEnum){
+-		input=(Input*)inputs->GetInput(DamageDEnum);
+-	}
+-	else{
+-		input=inputs->GetInput(enum_type);
+-	}
+-	if (!input) _error_("Input " << EnumToStringx(enum_type) << " not found");
+-	if (input->ObjectEnum()!=ControlInputEnum) _error_("Input " << EnumToStringx(enum_type) << " is not a ControlInput");
++	else if(levelset[0]*levelset[2]>0.){ //Nodes 0 and 2 are similar, so points must be found on segment 1-0 and 1-2
++		/*Portion of the segments*/
++		s1=levelset[1]/(levelset[1]-levelset[0]);
++		s2=levelset[1]/(levelset[1]-levelset[2]);
+ 
+-	GradientIndexing(&vertexpidlist[0],control_index);
+-	for(int i=0;i<NUMVERTICES;i++) grad_list[i]=gradient[vertexpidlist[i]];
+-	grad_input=new PentaInput(GradientEnum,grad_list,P1Enum);
+-	((ControlInput*)input)->SetGradient(grad_input);
++		if(levelset[1]<0.) normal_orientation=1;
++		/*New point 0*/
++		xyz_zero[3*normal_orientation+0]=xyz_list[1*3+0]+s1*(xyz_list[0*3+0]-xyz_list[1*3+0]);
++		xyz_zero[3*normal_orientation+1]=xyz_list[1*3+1]+s1*(xyz_list[0*3+1]-xyz_list[1*3+1]);
++		xyz_zero[3*normal_orientation+2]=xyz_list[1*3+2]+s1*(xyz_list[0*3+2]-xyz_list[1*3+2]);
+ 
+-}/*}}}*/
+-void       Penta::ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum){/*{{{*/
++		/*New point 2*/
++		xyz_zero[3*(1-normal_orientation)+0]=xyz_list[1*3+0]+s2*(xyz_list[2*3+0]-xyz_list[1*3+0]);
++		xyz_zero[3*(1-normal_orientation)+1]=xyz_list[1*3+1]+s2*(xyz_list[2*3+1]-xyz_list[1*3+1]);
++		xyz_zero[3*(1-normal_orientation)+2]=xyz_list[1*3+2]+s2*(xyz_list[2*3+2]-xyz_list[1*3+2]);
+ 
+-	Input* input=NULL;
++		/*New point 3*/
++		xyz_zero[3*(2+1-normal_orientation)+0]=xyz_list[4*3+0]+s1*(xyz_list[3*3+0]-xyz_list[4*3+0]);
++		xyz_zero[3*(2+1-normal_orientation)+1]=xyz_list[4*3+1]+s1*(xyz_list[3*3+1]-xyz_list[4*3+1]);
++		xyz_zero[3*(2+1-normal_orientation)+2]=xyz_list[4*3+2]+s1*(xyz_list[3*3+2]-xyz_list[4*3+2]);
+ 
+-	if(control_enum==MaterialsRheologyBbarEnum){
+-		input=(Input*)inputs->GetInput(MaterialsRheologyBEnum);
++		/*New point 4*/
++		xyz_zero[3*(2+normal_orientation)+0]=xyz_list[4*3+0]+s2*(xyz_list[5*3+0]-xyz_list[4*3+0]);
++		xyz_zero[3*(2+normal_orientation)+1]=xyz_list[4*3+1]+s2*(xyz_list[5*3+1]-xyz_list[4*3+1]);
++		xyz_zero[3*(2+normal_orientation)+2]=xyz_list[4*3+2]+s2*(xyz_list[5*3+2]-xyz_list[4*3+2]);
+ 	}
+-	else if(control_enum==DamageDbarEnum){
+-		input=(Input*)inputs->GetInput(DamageDEnum);
+-	}
+-	else{
+-		input=inputs->GetInput(control_enum);
+-	}
+-	if (!input) _error_("Input " << EnumToStringx(control_enum) << " not found");
+-	if (input->ObjectEnum()!=ControlInputEnum) _error_("Input " << EnumToStringx(control_enum) << " is not a ControlInput");
++	else if(levelset[0]==0. && levelset[1]==0.){ //front is on point 0 and 1
++		xyz_zero[3*0+0]=xyz_list[0*3+0];
++		xyz_zero[3*0+1]=xyz_list[0*3+1];
++		xyz_zero[3*0+2]=xyz_list[0*3+2];
+ 
+-	int         sidlist[NUMVERTICES];
+-	int         connectivity[NUMVERTICES];
+-	IssmPDouble values[NUMVERTICES];
+-	IssmPDouble gradients[NUMVERTICES]; 
+-	IssmDouble  value,gradient;
++		/*New point 2*/
++		xyz_zero[3*1+0]=xyz_list[1*3+0];
++		xyz_zero[3*1+1]=xyz_list[1*3+1];
++		xyz_zero[3*1+2]=xyz_list[1*3+2];
+ 
+-	this->GetVerticesConnectivityList(&connectivity[0]);
+-	this->GetVerticesSidList(&sidlist[0]);
++		/*New point 3*/
++		xyz_zero[3*2+0]=xyz_list[4*3+0];
++		xyz_zero[3*2+1]=xyz_list[4*3+1];
++		xyz_zero[3*2+2]=xyz_list[4*3+2];
+ 
+-	GaussPenta* gauss=new GaussPenta();
+-	for (int iv=0;iv<NUMVERTICES;iv++){
+-		gauss->GaussVertex(iv);
+-
+-		((ControlInput*)input)->GetInputValue(&value,gauss);
+-		((ControlInput*)input)->GetGradientValue(&gradient,gauss);
+-
+-		values[iv]    = reCast<IssmPDouble>(value)/reCast<IssmPDouble>(connectivity[iv]);
+-		gradients[iv] = reCast<IssmPDouble>(gradient)/reCast<IssmPDouble>(connectivity[iv]);
++		/*New point 4*/
++		xyz_zero[3*3+0]=xyz_list[3*3+0];
++		xyz_zero[3*3+1]=xyz_list[3*3+1];
++		xyz_zero[3*3+2]=xyz_list[3*3+2];
+ 	}
+-	delete gauss;
++	else if(levelset[0]==0. && levelset[2]==0.){ //front is on point 0 and 1
++		xyz_zero[3*0+0]=xyz_list[2*3+0];
++		xyz_zero[3*0+1]=xyz_list[2*3+1];
++		xyz_zero[3*0+2]=xyz_list[2*3+2];
+ 
+-	vector_control->SetValues(NUMVERTICES,&sidlist[0],&values[0],ADD_VAL);
+-	vector_gradient->SetValues(NUMVERTICES,&sidlist[0],&gradients[0],ADD_VAL);
++		/*New point 2*/
++		xyz_zero[3*1+0]=xyz_list[0*3+0];
++		xyz_zero[3*1+1]=xyz_list[0*3+1];
++		xyz_zero[3*1+2]=xyz_list[0*3+2];
+ 
+-}/*}}}*/
+-void       Penta::InputControlUpdate(IssmDouble scalar,bool save_parameter){/*{{{*/
++		/*New point 3*/
++		xyz_zero[3*2+0]=xyz_list[3*3+0];
++		xyz_zero[3*2+1]=xyz_list[3*3+1];
++		xyz_zero[3*2+2]=xyz_list[3*3+2];
+ 
+-	/*Intermediary*/
+-	int    num_controls;
+-	int*   control_type=NULL;
+-	Input* input=NULL;
+-
+-	/*retrieve some parameters: */
+-	this->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
+-	this->parameters->FindParam(&control_type,NULL,InversionControlParametersEnum);
+-
+-	for(int i=0;i<num_controls;i++){
+-
+-		if(control_type[i]==MaterialsRheologyBbarEnum){
+-			if (!IsOnBase()) goto cleanup_and_return;
+-			input=(Input*)this->inputs->GetInput(MaterialsRheologyBEnum); _assert_(input);
+-		}
+-		else if(control_type[i]==DamageDbarEnum){
+-			if (!IsOnBase()) goto cleanup_and_return;
+-			input=(Input*)this->inputs->GetInput(DamageDEnum); _assert_(input);
+-		}
+-		else{
+-			input=(Input*)this->inputs->GetInput(control_type[i]); _assert_(input);
+-		}
+-		if(input->ObjectEnum()!=ControlInputEnum) _error_("input " << EnumToStringx(control_type[i]) << " is not a ControlInput");
+-
+-		((ControlInput*)input)->UpdateValue(scalar);
+-		((ControlInput*)input)->Constrain();
+-		if (save_parameter) ((ControlInput*)input)->SaveValue();
+-
+-		if(control_type[i]==MaterialsRheologyBbarEnum){
+-			this->InputExtrude(MaterialsRheologyBEnum,-1);
+-		}
+-		else if(control_type[i]==DamageDbarEnum){
+-			this->InputExtrude(DamageDEnum,-1);
+-		}
++		/*New point 4*/
++		xyz_zero[3*3+0]=xyz_list[5*3+0];
++		xyz_zero[3*3+1]=xyz_list[5*3+1];
++		xyz_zero[3*3+2]=xyz_list[5*3+2];
+ 	}
++	else if(levelset[1]==0. && levelset[2]==0.){ //front is on point 0 and 1
++		xyz_zero[3*0+0]=xyz_list[1*3+0];
++		xyz_zero[3*0+1]=xyz_list[1*3+1];
++		xyz_zero[3*0+2]=xyz_list[1*3+2];
+ 
+-	/*Clean up and return*/
+-cleanup_and_return:
+-	xDelete<int>(control_type);
+-}
+-/*}}}*/
+-void       Penta::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data,bool onsid){/*{{{*/
++		/*New point 2*/
++		xyz_zero[3*1+0]=xyz_list[2*3+0];
++		xyz_zero[3*1+1]=xyz_list[2*3+1];
++		xyz_zero[3*1+2]=xyz_list[2*3+2];
+ 
+-	int vertexidlist[NUMVERTICES];
++		/*New point 3*/
++		xyz_zero[3*2+0]=xyz_list[5*3+0];
++		xyz_zero[3*2+1]=xyz_list[5*3+1];
++		xyz_zero[3*2+2]=xyz_list[5*3+2];
+ 
+-	/*Get out if this is not an element input*/
+-	if(!IsInput(control_enum)) return;
+-
+-	/*Prepare index list*/
+-	GradientIndexing(&vertexidlist[0],control_index,onsid);
+-
+-	/*Get input (either in element or material)*/
+-	if(control_enum==MaterialsRheologyBbarEnum) control_enum=MaterialsRheologyBEnum;
+-	Input* input=inputs->GetInput(control_enum);
+-	if(!input) _error_("Input " << EnumToStringx(control_enum) << " not found in element");
+-
+-	/*Check that it is a ControlInput*/
+-	if (input->ObjectEnum()!=ControlInputEnum){
+-		_error_("input " << EnumToStringx(control_enum) << " is not a ControlInput");
++		/*New point 4*/
++		xyz_zero[3*3+0]=xyz_list[4*3+0];
++		xyz_zero[3*3+1]=xyz_list[4*3+1];
++		xyz_zero[3*3+2]=xyz_list[4*3+2];
+ 	}
++	else _error_("Case not covered");
+ 
+-	((ControlInput*)input)->GetVectorFromInputs(vector,&vertexidlist[0],data);
++	/*Assign output pointer*/
++	*pxyz_zero= xyz_zero;
+ }
+ /*}}}*/
+-void       Penta::SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){/*{{{*/
+ 
+-	IssmDouble  values[NUMVERTICES];
+-	int         vertexpidlist[NUMVERTICES],control_init;
+-
+-	/*Specific case for depth averaged quantities*/
+-	control_init=control_enum;
+-	if(control_enum==MaterialsRheologyBbarEnum){
+-		control_enum=MaterialsRheologyBEnum;
+-		if(!IsOnBase()) return;
+-	}
+-	if(control_enum==DamageDbarEnum){
+-		control_enum=DamageDEnum;
+-		if(!IsOnBase()) return;
+-	}
+-
+-	/*Get out if this is not an element input*/
+-	if(!IsInput(control_enum)) return;
+-
+-	/*Prepare index list*/
+-	GradientIndexing(&vertexpidlist[0],control_index);
+-
+-	/*Get values on vertices*/
+-	for(int i=0;i<NUMVERTICES;i++){
+-		values[i]=vector[vertexpidlist[i]];
+-	}
+-	Input* new_input = new PentaInput(control_enum,values,P1Enum);
+-	Input* input=(Input*)this->inputs->GetInput(control_enum);   _assert_(input);
+-	if(input->ObjectEnum()!=ControlInputEnum){
+-		_error_("input " << EnumToStringx(control_enum) << " is not a ControlInput");
+-	}
+-
+-	((ControlInput*)input)->SetInput(new_input);
+-
+-	if(control_init==MaterialsRheologyBbarEnum){
+-		this->InputExtrude(control_enum,-1);
+-	}
+-	if(control_init==DamageDbarEnum){
+-		this->InputExtrude(control_enum,-1);
+-	}
++#ifdef _HAVE_GIA_
++void       Penta::GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,IssmDouble* x,IssmDouble* y){/*{{{*/
++	_error_("GIA deflection not implemented yet!");
+ }
+ /*}}}*/
++#endif
+ 
+ #ifdef _HAVE_DAKOTA_
+ void       Penta::InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){/*{{{*/
+@@ -3402,79 +3477,3 @@
+ }
+ /*}}}*/
+ #endif
+-void       Penta::GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution, int enum_type){/*{{{*/
+-
+-	const int    numdof=NDOF1*NUMVERTICES;
+-
+-	int          i;
+-	int*         doflist=NULL;
+-	IssmDouble   values[numdof];
+-	IssmDouble   enum_value;
+-	GaussPenta   *gauss=NULL;
+-
+-	/*Get dof list: */
+-	GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
+-	Input* enum_input=inputs->GetInput(enum_type); _assert_(enum_input);
+-
+-	gauss=new GaussPenta();
+-	for(i=0;i<NUMVERTICES;i++){
+-		/*Recover temperature*/
+-		gauss->GaussVertex(i);
+-		enum_input->GetInputValue(&enum_value,gauss);
+-		values[i]=enum_value;
+-	}
+-
+-	/*Add value to global vector*/
+-	solution->SetValues(numdof,doflist,values,INS_VAL);
+-
+-	/*Free ressources:*/
+-	delete gauss;
+-	xDelete<int>(doflist);
+-}
+-/*}}}*/
+-void       Penta::PotentialUngrounding(Vector<IssmDouble>* potential_ungrounding){/*{{{*/
+-
+-	IssmDouble  h[NUMVERTICES],r[NUMVERTICES],gl[NUMVERTICES];
+-	IssmDouble  bed_hydro;
+-	IssmDouble  rho_water,rho_ice,density;
+-
+-	/*material parameters: */
+-	rho_water=matpar->GetRhoWater();
+-	rho_ice=matpar->GetRhoIce();
+-	density=rho_ice/rho_water;
+-	GetInputListOnVertices(&h[0],ThicknessEnum);
+-	GetInputListOnVertices(&r[0],BedEnum);
+-	GetInputListOnVertices(&gl[0],MaskGroundediceLevelsetEnum);
+-
+-	/*go through vertices, and figure out which ones are on the ice sheet, and want to unground: */
+-	for(int i=0;i<NUMVERTICES;i++){
+-		/*Find if grounded vertices want to start floating*/
+-		if (gl[i]>0.){
+-			bed_hydro=-density*h[i];
+-			if(bed_hydro>r[i]){
+-				/*Vertex that could potentially unground, flag it*/
+-				potential_ungrounding->SetValue(vertices[i]->Pid(),1,INS_VAL);
+-			}
+-		}
+-	}
+-}
+-/*}}}*/
+-int        Penta::UpdatePotentialUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf){/*{{{*/
+-
+-	int i;
+-	int nflipped=0;
+-
+-	/*Go through nodes, and whoever is on the potential_ungrounding, ends up in nodes_on_iceshelf: */
+-	for(i=0;i<NUMVERTICES;i++){
+-		if (reCast<bool,IssmDouble>(vertices_potentially_ungrounding[vertices[i]->Pid()])){
+-			vec_nodes_on_iceshelf->SetValue(vertices[i]->Pid(),-1.,INS_VAL);
+-
+-			/*If node was not on ice shelf, we flipped*/
+-			if(nodes_on_iceshelf[vertices[i]->Pid()]>=0.){
+-				nflipped++;
+-			}
+-		}
+-	}
+-	return nflipped;
+-}
+-/*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18921-18922.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18921-18922.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18921-18922.diff	(revision 19102)
@@ -0,0 +1,252 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18921)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18922)
+@@ -42,123 +42,75 @@
+ 		Object *copy();
+ 		int     ObjectEnum();
+ 		/*}}}*/
+-		/*Update virtual functions definitions: {{{*/
+-		void  InputUpdateFromVector(IssmDouble* vector, int name, int type);
+-		#ifdef _HAVE_DAKOTA_
+-		void  InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type);
+-		void  InputUpdateFromMatrixDakota(IssmDouble* matrix, int nows, int ncols, int name, int type);
+-		#endif
+-		void  InputUpdateFromIoModel(int index, IoModel* iomodel);
+-		/*}}}*/
+-		/*Element virtual functions definitions: {{{*/
+-		IssmDouble CharacteristicLength(void){_error_("not implemented yet");};
+-		void   ComputeBasalStress(Vector<IssmDouble>* sigma_b);
+-		void   ComputeSigmaNN(){_error_("not implemented yet");};
+-		void   ComputeStressTensor();
+-		void   ComputeDeviatoricStressTensor();
+-		void   StressIntensityFactor();
+-		void   StrainRateparallel();
+-		void   StrainRateperpendicular();
+-		void   CalvingRateLevermann();
+-		void   Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
+-		void   ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz);
+-		int    FiniteElement(void);
+-		void   FSContactMigration(Vector<IssmDouble>* vertexgrounded,Vector<IssmDouble>* vertexfloating);
+-		void   SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters);
+-		void   ResetHooks();
+-		void   Delta18oParameterization(void);
+-		Penta* GetUpperPenta(void);
+-		Penta* GetLowerPenta(void);
+-		Penta* GetSurfacePenta(void);
+-		Penta* GetBasalPenta(void);
+-		Element* GetUpperElement(void);
+-		Element* GetBasalElement(void);
+-		void        GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues){_error_("not implemented yet");};
+-		void   GetGroundedPart(int* point1,IssmDouble* fraction1, IssmDouble* fraction2,bool* mainlyfloating);
+-		IssmDouble GetGroundedPortion(IssmDouble* xyz_list);
+-		int    GetNodeIndex(Node* node);
+-		int    GetNumberOfNodes(void);
+-		int    GetNumberOfNodes(int enum_type);
+-		int    GetNumberOfVertices(void);
+-		void   GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int enum_type);
+-		void   GetVerticesCoordinatesBase(IssmDouble** pxyz_list);
+-		void   GetVerticesCoordinatesTop(IssmDouble** pxyz_list);
+-
+-		void   InputDepthAverageAtBase(int enum_type,int average_enum_type);
+-		void   InputScale(int enum_type,IssmDouble scale_factor);
+-		int    NumberofNodesVelocity(void);
+-		int    NumberofNodesPressure(void);
+-		int    VelocityInterpolation();
+-		int    PressureInterpolation();
+-		int    TensorInterpolation(){_error_("not implemented yet");};
+-		bool   IsZeroLevelset(int levelset_enum);
+-		bool   IsIcefront(void);
+-		bool   IsFaceOnBoundary(void){_error_("not implemented yet");};
+-		void   ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum);
+-		void   GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum);
+-		void   GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level){_error_("not implemented yet");};
+-		void   PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm);
+-		void   ReduceMatrices(ElementMatrix* Ke,ElementVector* pe);
+-		void   ResetFSBasalBoundaryCondition(void);
+-		void   SetTemporaryElementType(int element_type_in);
+-	   Element* SpawnBasalElement(void);
+-		Element* SpawnTopElement(void);
+-		IssmDouble SurfaceArea(void);
+-		void   Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement);
+-		int    NodalValue(IssmDouble* pvalue, int index, int natureofdataenum);
+-		IssmDouble TimeAdapt();
+-		void   ValueP1OnGauss(IssmDouble* pvalue,IssmDouble* values,Gauss* gauss);
+-		void   ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss);
+-		int    VertexConnectivity(int vertexindex);
+-		void   VerticalSegmentIndices(int** pindices,int* pnumseg);
+-		void   ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
+-
+-		void   AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part);
+-		IssmDouble IceVolume(void);
+-		IssmDouble IceVolumeAboveFloatation(void);
+-		IssmDouble TotalSmb(void);
+-		IssmDouble MassFlux(IssmDouble* segment);
+-		IssmDouble MassFlux(IssmDouble x1,IssmDouble y1, IssmDouble x2, IssmDouble y2,int segment_id);
+-		void   ElementResponse(IssmDouble* presponse,int response_enum);
+-
+-		#ifdef _HAVE_GIA_
+-		void   GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,IssmDouble* x,IssmDouble* y);
+-		#endif
+-
+-		void   GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid);
+-		void   SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index);
+-		void   ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index);
+-		void   ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum);
+-		void   InputControlUpdate(IssmDouble scalar,bool save_parameter);
+-		IssmDouble Misfit(int modelenum,int observationenum,int weightsenum){_error_("not implemented yet");};
+-		IssmDouble MisfitArea(int weightsenum){_error_("not implemented yet");};
+-		IssmDouble Masscon(IssmDouble* levelset){_error_("not implemented yet");};
+-
+-		void   PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding);
+-		int    UpdatePotentialUngrounding(IssmDouble* potential_sheet_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf);
+-		/*}}}*/
+-		/*Penta specific routines:{{{*/
++		/*Penta routines:{{{*/
+ 		void           AddBasalInput(int input_enum, IssmDouble* values, int interpolation_enum);
+ 		void           AddInput(int input_enum, IssmDouble* values, int interpolation_enum);
+-		void	         NormalBase(IssmDouble* bed_normal, IssmDouble* xyz_list);
+-		void           NormalSection(IssmDouble* normal,IssmDouble* xyz_list);
+-		void	         NormalTop(IssmDouble* bed_normal, IssmDouble* xyz_list);
++		void           AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part);
++		IssmDouble     CharacteristicLength(void){_error_("not implemented yet");};
++		void           CalvingRateLevermann();
++		void           ComputeBasalStress(Vector<IssmDouble>* sigma_b);
++		void           ComputeDeviatoricStressTensor();
++		void           ComputeSigmaNN(){_error_("not implemented yet");};
++		void           ComputeStressTensor();
++		void           Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
++		void           ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index);
++		void           ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum);
+ 		ElementMatrix* CreateBasalMassMatrix(void);
++		void           Delta18oParameterization(void);
++		void           ElementResponse(IssmDouble* presponse,int response_enum);
++		void           ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz);
++		int            FiniteElement(void);
++		void           FSContactMigration(Vector<IssmDouble>* vertexgrounded,Vector<IssmDouble>* vertexfloating);
+ 		void           GetAreaCoordinates(IssmDouble *area_coordinates,IssmDouble* xyz_zero,IssmDouble* xyz_list,int numpoints);
++		Element*       GetBasalElement(void);
++		Penta*         GetBasalPenta(void);
+ 		int            GetElementType(void);
++		void           GetGroundedPart(int* point1,IssmDouble* fraction1, IssmDouble* fraction2,bool* mainlyfloating);
++		IssmDouble     GetGroundedPortion(IssmDouble* xyz_list);
++		void           GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum);
+ 		void           GetInputValue(IssmDouble* pvalue,Node* node,int enumtype);
++		void           GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level){_error_("not implemented yet");};
++		void           GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues){_error_("not implemented yet");};
+ 		Node*          GetNode(int node_number);
++		int            GetNodeIndex(Node* node);
++		int            GetNumberOfNodes(void);
++		int            GetNumberOfNodes(int enum_type);
++		int            GetNumberOfVertices(void);
++		Penta*         GetLowerPenta(void);
++		void           GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int enum_type);
++		Penta*         GetSurfacePenta(void);
++		Element*       GetUpperElement(void);
++		Penta*         GetUpperPenta(void);
++		void           GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid);
++		void           GetVerticesCoordinatesBase(IssmDouble** pxyz_list);
++		void           GetVerticesCoordinatesTop(IssmDouble** pxyz_list);
++		IssmDouble     IceVolume(void);
++		IssmDouble     IceVolumeAboveFloatation(void);
++		void           InputControlUpdate(IssmDouble scalar,bool save_parameter);
++		void           InputDepthAverageAtBase(int enum_type,int average_enum_type);
+ 		void	         InputExtrude(int enum_type,int start);
++		void           InputScale(int enum_type,IssmDouble scale_factor);
++		void           InputUpdateFromIoModel(int index, IoModel* iomodel);
+ 		void           InputUpdateFromSolutionOneDof(IssmDouble* solutiong,int enum_type);
+ 		void           InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solutiong,int enum_type);
++		void           InputUpdateFromVector(IssmDouble* vector, int name, int type);
++		bool           IsFaceOnBoundary(void){_error_("not implemented yet");};
++		bool           IsIcefront(void);
++		bool           IsNodeOnShelfFromFlags(IssmDouble* flags);
++		bool	         IsOnBase(void);
+ 		bool	         IsOnSurface(void);
+-		bool	         IsOnBase(void);
+-		bool           IsNodeOnShelfFromFlags(IssmDouble* flags);
++		bool           IsZeroLevelset(int levelset_enum);
+ 		void           JacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss);
++		void           JacobianDeterminantBase(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss);
+ 		void           JacobianDeterminantLine(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss);
+ 		void           JacobianDeterminantSurface(IssmDouble*  pJdet, IssmDouble* xyz_list,Gauss* gauss);
+-		void           JacobianDeterminantBase(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss);
+ 		void           JacobianDeterminantTop(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss);
++		IssmDouble     Masscon(IssmDouble* levelset){_error_("not implemented yet");};
++		IssmDouble     MassFlux(IssmDouble* segment);
++		IssmDouble     MassFlux(IssmDouble x1,IssmDouble y1, IssmDouble x2, IssmDouble y2,int segment_id);
++		IssmDouble     MinEdgeLength(IssmDouble* xyz_list);
++		IssmDouble     Misfit(int modelenum,int observationenum,int weightsenum){_error_("not implemented yet");};
++		IssmDouble     MisfitArea(int weightsenum){_error_("not implemented yet");};
+ 		Gauss*         NewGauss(void);
+ 		Gauss*         NewGauss(int order);
+ 		Gauss*         NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order){_error_("not implemented yet");};
+@@ -168,22 +120,62 @@
+ 		Gauss*         NewGaussLine(int vertex1,int vertex2,int order);
+ 		Gauss*         NewGaussTop(int order);
+ 		void           NodalFunctions(IssmDouble* basis,Gauss* gauss);
+-		void           NodalFunctionsP1(IssmDouble* basis,Gauss* gauss);
+-		void           NodalFunctionsP2(IssmDouble* basis,Gauss* gauss);
+ 		void           NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
+-		void           NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
++		void           NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
+ 		void           NodalFunctionsMINIDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
+-		void           NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
+-		void           NodalFunctionsVelocity(IssmDouble* basis,Gauss* gauss);
+ 		void           NodalFunctionsPressure(IssmDouble* basis,Gauss* gauss);
++		void           NodalFunctionsP1(IssmDouble* basis,Gauss* gauss);
++		void           NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
++		void           NodalFunctionsP2(IssmDouble* basis,Gauss* gauss);
+ 		void           NodalFunctionsTensor(IssmDouble* basis,Gauss* gauss);
+-		IssmDouble     MinEdgeLength(IssmDouble* xyz_list);
++		void           NodalFunctionsVelocity(IssmDouble* basis,Gauss* gauss);
++		void	         NormalBase(IssmDouble* bed_normal, IssmDouble* xyz_list);
++		void           NormalSection(IssmDouble* normal,IssmDouble* xyz_list);
++		void	         NormalTop(IssmDouble* bed_normal, IssmDouble* xyz_list);
++		int            NodalValue(IssmDouble* pvalue, int index, int natureofdataenum);
++		int            NumberofNodesPressure(void);
++		int            NumberofNodesVelocity(void);
++		void           PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm);
++		void           PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding);
++		int            PressureInterpolation();
++		void           ReduceMatrices(ElementMatrix* Ke,ElementVector* pe);
++		void           ResetFSBasalBoundaryCondition(void);
++		void           ResetHooks();
+ 		void	         SetClone(int* minranks);
++		void           SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index);
++		void           SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters);
++		void           SetTemporaryElementType(int element_type_in);
++	   Element*       SpawnBasalElement(void);
++		Element*       SpawnTopElement(void);
+ 		Tria*	         SpawnTria(int index1,int index2,int index3);
+ 		IssmDouble     StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa);
+-
++		void           StressIntensityFactor();
++		void           StrainRateparallel();
++		void           StrainRateperpendicular();
++		IssmDouble     SurfaceArea(void);
++		int            TensorInterpolation(){_error_("not implemented yet");};
++		IssmDouble     TimeAdapt();
++		IssmDouble     TotalSmb(void);
++		void           Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement);
+ 		void           UpdateConstraintsExtrudeFromBase(void);
+ 		void           UpdateConstraintsExtrudeFromTop(void);
++		int            UpdatePotentialUngrounding(IssmDouble* potential_sheet_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf);
++		void           ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss);
++		void           ValueP1OnGauss(IssmDouble* pvalue,IssmDouble* values,Gauss* gauss);
++		int            VelocityInterpolation();
++		int            VertexConnectivity(int vertexindex);
++		void           VerticalSegmentIndices(int** pindices,int* pnumseg);
++		void           ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
++		void           ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum);
++
++		#ifdef _HAVE_DAKOTA_
++		void           InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type);
++		void           InputUpdateFromMatrixDakota(IssmDouble* matrix, int nows, int ncols, int name, int type);
++		#endif
++
++		#ifdef _HAVE_GIA_
++		void           GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,IssmDouble* x,IssmDouble* y);
++		#endif
+ 		/*}}}*/
+ };
+ #endif  /* _PENTA_H */
Index: /issm/oecreview/Archive/18296-19100/ISSM-18922-18923.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18922-18923.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18922-18923.diff	(revision 19102)
@@ -0,0 +1,540 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Tetra.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tetra.cpp	(revision 18922)
++++ ../trunk-jpl/src/c/classes/Elements/Tetra.cpp	(revision 18923)
+@@ -103,14 +103,6 @@
+ }
+ /*}}}*/
+ 
+-int      Tetra::FiniteElement(void){/*{{{*/
+-	return this->element_type;
+-} /*}}}*/
+-int      Tetra::ObjectEnum(void){/*{{{*/
+-
+-	return TetraEnum;
+-
+-}/*}}}*/
+ void     Tetra::AddInput(int input_enum,IssmDouble* values, int interpolation_enum){/*{{{*/
+ 
+ 	/*Call inputs method*/
+@@ -195,16 +187,16 @@
+ 	_error_("Could not find 3 vertices on bed");
+ }
+ /*}}}*/
+-void     Tetra::FaceOnSurfaceIndices(int* pindex1,int* pindex2,int* pindex3){/*{{{*/
++void     Tetra::FaceOnFrontIndices(int* pindex1,int* pindex2,int* pindex3){/*{{{*/
+ 
+ 	IssmDouble values[NUMVERTICES];
+ 	int        indices[4][3] = {{0,1,2},{0,3,1},{1,3,2},{0,2,3}};
+ 
+ 	/*Retrieve all inputs and parameters*/
+-	GetInputListOnVertices(&values[0],MeshVertexonsurfaceEnum);
++	GetInputListOnVertices(&values[0],MaskIceLevelsetEnum);
+ 
+ 	for(int i=0;i<4;i++){
+-		if(values[indices[i][0]] == 1. && values[indices[i][1]] == 1. && values[indices[i][2]] == 1.){
++		if(values[indices[i][0]] == 0. && values[indices[i][1]] == 0. && values[indices[i][2]] == 0.){
+ 			*pindex1 = indices[i][0];
+ 			*pindex2 = indices[i][1];
+ 			*pindex3 = indices[i][2];
+@@ -215,16 +207,16 @@
+ 	_error_("Could not find 3 vertices on bed");
+ }
+ /*}}}*/
+-void     Tetra::FaceOnFrontIndices(int* pindex1,int* pindex2,int* pindex3){/*{{{*/
++void     Tetra::FaceOnSurfaceIndices(int* pindex1,int* pindex2,int* pindex3){/*{{{*/
+ 
+ 	IssmDouble values[NUMVERTICES];
+ 	int        indices[4][3] = {{0,1,2},{0,3,1},{1,3,2},{0,2,3}};
+ 
+ 	/*Retrieve all inputs and parameters*/
+-	GetInputListOnVertices(&values[0],MaskIceLevelsetEnum);
++	GetInputListOnVertices(&values[0],MeshVertexonsurfaceEnum);
+ 
+ 	for(int i=0;i<4;i++){
+-		if(values[indices[i][0]] == 0. && values[indices[i][1]] == 0. && values[indices[i][2]] == 0.){
++		if(values[indices[i][0]] == 1. && values[indices[i][1]] == 1. && values[indices[i][2]] == 1.){
+ 			*pindex1 = indices[i][0];
+ 			*pindex2 = indices[i][1];
+ 			*pindex3 = indices[i][2];
+@@ -235,6 +227,9 @@
+ 	_error_("Could not find 3 vertices on bed");
+ }
+ /*}}}*/
++int      Tetra::FiniteElement(void){/*{{{*/
++	return this->element_type;
++} /*}}}*/
+ int      Tetra::GetElementType(){/*{{{*/
+ 
+ 	/*return TetraRef field*/
+@@ -474,14 +469,6 @@
+ 	xDelete<int>(doflist);
+ }
+ /*}}}*/
+-bool     Tetra::IsOnBase(){/*{{{*/
+-	return HasFaceOnBase();
+-}
+-/*}}}*/
+-bool     Tetra::IsOnSurface(){/*{{{*/
+-	return HasFaceOnSurface();
+-}
+-/*}}}*/
+ bool     Tetra::IsIcefront(void){/*{{{*/
+ 
+ 	/*Retrieve all inputs and parameters*/
+@@ -496,6 +483,14 @@
+ 	}
+ 	return false;
+ }/*}}}*/
++bool     Tetra::IsOnBase(){/*{{{*/
++	return HasFaceOnBase();
++}
++/*}}}*/
++bool     Tetra::IsOnSurface(){/*{{{*/
++	return HasFaceOnSurface();
++}
++/*}}}*/
+ void     Tetra::JacobianDeterminant(IssmDouble* pJdet,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussTetraEnum);
+@@ -503,17 +498,17 @@
+ 
+ }
+ /*}}}*/
+-void     Tetra::JacobianDeterminantSurface(IssmDouble* pJdet,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void     Tetra::JacobianDeterminantBase(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussTetraEnum);
+-	this->GetJacobianDeterminantFace(pJdet,xyz_list,(GaussTetra*)gauss);
++	this->GetJacobianDeterminantFace(pJdet,xyz_list_base,(GaussTetra*)gauss);
+ 
+ }
+ /*}}}*/
+-void     Tetra::JacobianDeterminantBase(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss){/*{{{*/
++void     Tetra::JacobianDeterminantSurface(IssmDouble* pJdet,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussTetraEnum);
+-	this->GetJacobianDeterminantFace(pJdet,xyz_list_base,(GaussTetra*)gauss);
++	this->GetJacobianDeterminantFace(pJdet,xyz_list,(GaussTetra*)gauss);
+ 
+ }
+ /*}}}*/
+@@ -560,61 +555,41 @@
+ 
+ }
+ /*}}}*/
+-void     Tetra::NodalFunctionsVelocity(IssmDouble* basis, Gauss* gauss){/*{{{*/
++void     Tetra::NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussTetraEnum);
+-	this->GetNodalFunctions(basis,(GaussTetra*)gauss,this->VelocityInterpolation());
++	this->GetNodalFunctionsDerivatives(dbasis,xyz_list,(GaussTetra*)gauss,this->element_type);
+ 
+ }
+ /*}}}*/
+-void     Tetra::NodalFunctionsPressure(IssmDouble* basis, Gauss* gauss){/*{{{*/
++void     Tetra::NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussTetraEnum);
+-	this->GetNodalFunctions(basis,(GaussTetra*)gauss,this->PressureInterpolation());
++	this->GetNodalFunctionsDerivatives(dbasis,xyz_list,(GaussTetra*)gauss,this->VelocityInterpolation());
+ 
+ }
+ /*}}}*/
+-void     Tetra::NodalFunctionsTensor(IssmDouble* basis, Gauss* gauss){/*{{{*/
++void     Tetra::NodalFunctionsPressure(IssmDouble* basis, Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussTetraEnum);
+-	this->GetNodalFunctions(basis,(GaussTetra*)gauss,this->TensorInterpolation());
++	this->GetNodalFunctions(basis,(GaussTetra*)gauss,this->PressureInterpolation());
+ 
+ }
+ /*}}}*/
+-void     Tetra::NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void     Tetra::NodalFunctionsTensor(IssmDouble* basis, Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussTetraEnum);
+-	this->GetNodalFunctionsDerivatives(dbasis,xyz_list,(GaussTetra*)gauss,this->element_type);
++	this->GetNodalFunctions(basis,(GaussTetra*)gauss,this->TensorInterpolation());
+ 
+ }
+ /*}}}*/
+-void     Tetra::NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void     Tetra::NodalFunctionsVelocity(IssmDouble* basis, Gauss* gauss){/*{{{*/
+ 
+ 	_assert_(gauss->Enum()==GaussTetraEnum);
+-	this->GetNodalFunctionsDerivatives(dbasis,xyz_list,(GaussTetra*)gauss,this->VelocityInterpolation());
++	this->GetNodalFunctions(basis,(GaussTetra*)gauss,this->VelocityInterpolation());
+ 
+ }
+ /*}}}*/
+-void     Tetra::NormalSection(IssmDouble* normal,IssmDouble* xyz_list){/*{{{*/
+-
+-	/*Build unit outward pointing vector*/
+-	IssmDouble AB[3];
+-	IssmDouble AC[3];
+-	IssmDouble norm;
+-
+-	AB[0]=xyz_list[1*3+0] - xyz_list[0*3+0];
+-	AB[1]=xyz_list[1*3+1] - xyz_list[0*3+1];
+-	AB[2]=xyz_list[1*3+2] - xyz_list[0*3+2];
+-	AC[0]=xyz_list[2*3+0] - xyz_list[0*3+0];
+-	AC[1]=xyz_list[2*3+1] - xyz_list[0*3+1];
+-	AC[2]=xyz_list[2*3+2] - xyz_list[0*3+2];
+-
+-	cross(normal,AB,AC);
+-	norm=sqrt(normal[0]*normal[0]+normal[1]*normal[1]+normal[2]*normal[2]);
+-
+-	for(int i=0;i<3;i++) normal[i]=normal[i]/norm;
+-}
+-/*}}}*/
+ void     Tetra::NormalBase(IssmDouble* bed_normal,IssmDouble* xyz_list){/*{{{*/
+ 
+ 	IssmDouble v13[3],v23[3];
+@@ -639,6 +614,26 @@
+ 	_assert_(bed_normal[2]<0.);
+ }
+ /*}}}*/
++void     Tetra::NormalSection(IssmDouble* normal,IssmDouble* xyz_list){/*{{{*/
++
++	/*Build unit outward pointing vector*/
++	IssmDouble AB[3];
++	IssmDouble AC[3];
++	IssmDouble norm;
++
++	AB[0]=xyz_list[1*3+0] - xyz_list[0*3+0];
++	AB[1]=xyz_list[1*3+1] - xyz_list[0*3+1];
++	AB[2]=xyz_list[1*3+2] - xyz_list[0*3+2];
++	AC[0]=xyz_list[2*3+0] - xyz_list[0*3+0];
++	AC[1]=xyz_list[2*3+1] - xyz_list[0*3+1];
++	AC[2]=xyz_list[2*3+2] - xyz_list[0*3+2];
++
++	cross(normal,AB,AC);
++	norm=sqrt(normal[0]*normal[0]+normal[1]*normal[1]+normal[2]*normal[2]);
++
++	for(int i=0;i<3;i++) normal[i]=normal[i]/norm;
++}
++/*}}}*/
+ void     Tetra::NormalTop(IssmDouble* top_normal,IssmDouble* xyz_list){/*{{{*/
+ 
+ 	IssmDouble v13[3],v23[3];
+@@ -669,6 +664,15 @@
+ 	return TetraRef::NumberofNodes(this->VelocityInterpolation());
+ }
+ /*}}}*/
++int      Tetra::ObjectEnum(void){/*{{{*/
++
++	return TetraEnum;
++
++}/*}}}*/
++int      Tetra::PressureInterpolation(void){/*{{{*/
++	return TetraRef::PressureInterpolation(this->element_type);
++}
++/*}}}*/
+ void     Tetra::ReduceMatrices(ElementMatrix* Ke,ElementVector* pe){/*{{{*/
+ 
+ 	if(pe){
+@@ -763,21 +767,6 @@
+ 	delete gauss;
+ }
+ /*}}}*/
+-void     Tetra::SetCurrentConfiguration(Elements* elementsin, Loads* loadsin, Nodes* nodesin, Materials* materialsin, Parameters* parametersin){/*{{{*/
+-
+-	/*go into parameters and get the analysis_counter: */
+-	int analysis_counter;
+-	parametersin->FindParam(&analysis_counter,AnalysisCounterEnum);
+-
+-	/*Get Element type*/
+-	this->element_type=this->element_type_list[analysis_counter];
+-
+-	/*Pick up nodes*/
+-	if(this->hnodes[analysis_counter]) this->nodes=(Node**)this->hnodes[analysis_counter]->deliverp();
+-	else this->nodes=NULL;
+-
+-}
+-/*}}}*/
+ void     Tetra::ResetHooks(){/*{{{*/
+ 
+ 	this->nodes=NULL;
+@@ -794,6 +783,21 @@
+ 	if(this->hneighbors) this->hneighbors->reset();
+ }
+ /*}}}*/
++void     Tetra::SetCurrentConfiguration(Elements* elementsin, Loads* loadsin, Nodes* nodesin, Materials* materialsin, Parameters* parametersin){/*{{{*/
++
++	/*go into parameters and get the analysis_counter: */
++	int analysis_counter;
++	parametersin->FindParam(&analysis_counter,AnalysisCounterEnum);
++
++	/*Get Element type*/
++	this->element_type=this->element_type_list[analysis_counter];
++
++	/*Pick up nodes*/
++	if(this->hnodes[analysis_counter]) this->nodes=(Node**)this->hnodes[analysis_counter]->deliverp();
++	else this->nodes=NULL;
++
++}
++/*}}}*/
+ Element* Tetra::SpawnBasalElement(void){/*{{{*/
+ 
+ 	_assert_(HasFaceOnBase());
+@@ -837,6 +841,10 @@
+ 	return tria;
+ }
+ /*}}}*/
++int      Tetra::TensorInterpolation(void){/*{{{*/
++	return TetraRef::TensorInterpolation(this->element_type);
++}
++/*}}}*/
+ void     Tetra::Update(int index,IoModel* iomodel,int analysis_counter,int analysis_type,int finiteelement_type){ /*{{{*/
+ 
+ 	/*Intermediaries*/
+@@ -980,14 +988,6 @@
+ 	*pphi = phi;
+ }
+ /*}}}*/
+-int      Tetra::PressureInterpolation(void){/*{{{*/
+-	return TetraRef::PressureInterpolation(this->element_type);
+-}
+-/*}}}*/
+-int      Tetra::TensorInterpolation(void){/*{{{*/
+-	return TetraRef::TensorInterpolation(this->element_type);
+-}
+-/*}}}*/
+ void     Tetra::ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum){/*{{{*/
+ 	/*Compute portion of the element that is grounded*/ 
+ 
+Index: ../trunk-jpl/src/c/classes/Elements/Tetra.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18922)
++++ ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18923)
+@@ -38,145 +38,141 @@
+ 		int     ObjectEnum();
+ 		Object *copy();
+ 		/*}}}*/
+-		/*Update virtual functions resolution: {{{*/
+-		void  InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum){_error_("not implemented yet");};
+-		void  InputUpdateFromSolutionOneDof(IssmDouble* solution,int inputenum);
+-		void  InputUpdateFromVector(IssmDouble* vector, int name, int type){_error_("not implemented yet");};
+-#ifdef _HAVE_DAKOTA_
+-		void  InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){_error_("not implemented yet");};
+-		void  InputUpdateFromMatrixDakota(IssmDouble* matrix, int nows, int ncols, int name, int type){_error_("not implemented yet");};
+-#endif
+-		void  InputUpdateFromIoModel(int index, IoModel* iomodel);
+-		/*}}}*/
+ 		/*Element virtual functions definitions: {{{*/
+ 		void        AddBasalInput(int input_enum, IssmDouble* values, int interpolation_enum){_error_("not implemented yet");};
+ 		void        AddInput(int input_enum, IssmDouble* values, int interpolation_enum);
++		void        AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part){_error_("not implemented yet");};
++		void        CalvingRateLevermann(void){_error_("not implemented yet");};
+ 		IssmDouble  CharacteristicLength(void){_error_("not implemented yet");};
+ 		void        ComputeBasalStress(Vector<IssmDouble>* sigma_b){_error_("not implemented yet");};
+ 		void        ComputeSigmaNN(){_error_("not implemented yet");};
+ 		void        ComputeStressTensor(){_error_("not implemented yet");};
+ 		void        ComputeDeviatoricStressTensor(){_error_("not implemented yet");};
+-		void        StressIntensityFactor(void){_error_("not implemented yet");};
+-		void        StrainRateparallel(void){_error_("not implemented yet");};
+-		void        StrainRateperpendicular(void){_error_("not implemented yet");};
+-		void        CalvingRateLevermann(void){_error_("not implemented yet");};
+ 		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters);
+-		void        SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters);
+-		void        ResetHooks();
++		void        ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){_error_("not implemented yet");};
++		void        ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum){_error_("not implemented yet");};
+ 		void        Delta18oParameterization(void){_error_("not implemented yet");};
++		IssmDouble  DragCoefficientAbsGradient(void){_error_("not implemented yet");};
++		void        ElementResponse(IssmDouble* presponse,int response_enum){_error_("not implemented yet");};
+ 		void        ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz);
++		void        FaceOnBaseIndices(int* pindex1,int* pindex2,int* pindex3);
+ 		void        FaceOnFrontIndices(int* pindex1,int* pindex2,int* pindex3);
+-		void        FaceOnBaseIndices(int* pindex1,int* pindex2,int* pindex3);
+ 		void        FaceOnSurfaceIndices(int* pindex1,int* pindex2,int* pindex3);
++		int         FiniteElement(void);
+ 		void        FSContactMigration(Vector<IssmDouble>* vertexgrounded,Vector<IssmDouble>* vertexfloating){_error_("not implemented yet");};
+-		int         FiniteElement(void);
+-		Element*    GetUpperElement(void){_error_("not implemented yet");};
+ 		Element*    GetBasalElement(void){_error_("not implemented yet");};
++		int         GetElementType(void);
++		void        GetGroundedPart(int* point1,IssmDouble* fraction1, IssmDouble* fraction2,bool* mainlyfloating){_error_("not implemented yet");};
++		IssmDouble  GetGroundedPortion(IssmDouble* xyz_list){_error_("not implemented yet");};
++		void		   GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){_error_("not implemented yet");};
++		void        GetInputValue(IssmDouble* pvalue,Node* node,int enumtype);
++		void		   GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level){_error_("not implemented yet");};
++		void        GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues){_error_("not implemented yet");};
++		Node*       GetNode(int node_number){_error_("Not implemented");};
+ 		int         GetNodeIndex(Node* node);
+ 		int         GetNumberOfNodes(void);
+ 		int         GetNumberOfNodes(int enum_type){_error_("not implemented yet");};
+ 		int         GetNumberOfVertices(void);
++		void        GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int enum_type){_error_("not implemented yet");};
++		Element*    GetUpperElement(void){_error_("not implemented yet");};
++		void        GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid){_error_("not implemented yet");};
+ 		void        GetVerticesCoordinatesBase(IssmDouble** pxyz_list);
+ 		void        GetVerticesCoordinatesTop(IssmDouble** pxyz_list);
++		void        GradientIndexing(int* indexing,int control_index){_error_("not implemented yet");};
+ 		bool        HasFaceOnBase();
+ 		bool        HasFaceOnSurface();
++		IssmDouble  IceVolume(void){_error_("not implemented yet");};
++		IssmDouble  IceVolumeAboveFloatation(void){_error_("not implemented yet");};
++		bool        IsFaceOnBoundary(void){_error_("not implemented yet");};
++		bool		   IsIcefront(void);
++		bool        IsNodeOnShelfFromFlags(IssmDouble* flags){_error_("not implemented yet");};
+ 		bool        IsOnBase();
+ 		bool        IsOnSurface();
+-		bool        IsNodeOnShelfFromFlags(IssmDouble* flags){_error_("not implemented yet");};
++		bool        IsZeroLevelset(int levelset_enum){_error_("not implemented");};
++		void        InputControlUpdate(IssmDouble scalar,bool save_parameter){_error_("not implemented yet");};
++		void        InputDepthAverageAtBase(int enum_type,int average_enum_type){_error_("not implemented yet");};
++		void        InputExtrude(int enum_type,int start){_error_("not implemented"); /*For penta only*/};
++		void        InputScale(int enum_type,IssmDouble scale_factor){_error_("not implemented yet");};
++		void        InputUpdateFromIoModel(int index, IoModel* iomodel);
++		void        InputUpdateFromSolutionOneDof(IssmDouble* solution,int inputenum);
++		void        InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum){_error_("not implemented yet");};
++		void        InputUpdateFromVector(IssmDouble* vector, int name, int type){_error_("not implemented yet");};
+ 		void        JacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss);
++		void        JacobianDeterminantBase(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss);
+ 		void        JacobianDeterminantLine(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
+ 		void        JacobianDeterminantSurface(IssmDouble*  pJdet, IssmDouble* xyz_list,Gauss* gauss);
+-		void        JacobianDeterminantBase(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss);
+ 		void        JacobianDeterminantTop(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss);
++		IssmDouble  Masscon(IssmDouble* levelset){_error_("not implemented yet");};
++		IssmDouble  MassFlux(IssmDouble* segment){_error_("not implemented yet");};
++		IssmDouble  MassFlux(IssmDouble x1,IssmDouble y1, IssmDouble x2, IssmDouble y2,int segment_id){_error_("not implemented yet");}
++		void        MaterialUpdateFromTemperature(void){_error_("not implemented yet");};
+ 		IssmDouble  MinEdgeLength(IssmDouble* xyz_list){_error_("not implemented yet");};
++		IssmDouble  Misfit(int modelenum,int observationenum,int weightsenum){_error_("not implemented yet");};
++		IssmDouble  MisfitArea(int weightsenum){_error_("not implemented yet");};
++		Gauss*      NewGauss(void);
++		Gauss*      NewGauss(int order);
++      Gauss*      NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order){_error_("not implemented yet");};
++      Gauss*      NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order_horiz,int order_vert);
++      Gauss*      NewGauss(int point1,IssmDouble fraction1,IssmDouble fraction2,bool mainlyfloating,int order){_error_("not implemented yet");};
++		Gauss*      NewGaussBase(int order);
++		Gauss*      NewGaussLine(int vertex1,int vertex2,int order){_error_("not implemented yet");};
++		Gauss*      NewGaussTop(int order);
+ 		void        NodalFunctions(IssmDouble* basis,Gauss* gauss);
++		void        NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
++		void        NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
++		void        NodalFunctionsMINIDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
++		void        NodalFunctionsPressure(IssmDouble* basis,Gauss* gauss);
+ 		void        NodalFunctionsP1(IssmDouble* basis,Gauss* gauss){_error_("not implemented yet");};
++		void        NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
+ 		void        NodalFunctionsP2(IssmDouble* basis,Gauss* gauss){_error_("not implemented yet");};
++		void        NodalFunctionsTensor(IssmDouble* basis,Gauss* gauss);
+ 		void        NodalFunctionsVelocity(IssmDouble* basis,Gauss* gauss);
+-		void        NodalFunctionsPressure(IssmDouble* basis,Gauss* gauss);
+-		void        NodalFunctionsTensor(IssmDouble* basis,Gauss* gauss);
+-		void        NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
+-		void        NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
+-		void        NodalFunctionsMINIDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
+-		void        NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
++		int         NodalValue(IssmDouble* pvalue, int index, int natureofdataenum){_error_("not implemented yet");};
++		void        NormalBase(IssmDouble* normal,IssmDouble* xyz_list);
+ 		void        NormalSection(IssmDouble* normal,IssmDouble* xyz_list);
+ 		void        NormalTop(IssmDouble* normal,IssmDouble* xyz_list);
+-		void        NormalBase(IssmDouble* normal,IssmDouble* xyz_list);
++		int         NumberofNodesPressure(void);
+ 		int         NumberofNodesVelocity(void);
+-		int         NumberofNodesPressure(void);
++		void        PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm){_error_("not implemented yet");};
++		void        PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding){_error_("not implemented yet");};
++		int         PressureInterpolation(void);
++		void        ResetFSBasalBoundaryCondition(void);
++		void        ResetHooks();
++		void        ReduceMatrices(ElementMatrix* Ke,ElementVector* pe);
++		void        SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){_error_("not implemented yet");};
++		void        SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters);
++		void        SetTemporaryElementType(int element_type_in){_error_("not implemented yet");};
+ 	   Element*    SpawnBasalElement(void);
+ 		Element*    SpawnTopElement(void);
+ 		Tria*       SpawnTria(int index1,int index2,int index3);
+ 		IssmDouble  StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa){_error_("not implemented yet");};
+-		int         PressureInterpolation(void);
++		void        StrainRateparallel(void){_error_("not implemented yet");};
++		void        StrainRateperpendicular(void){_error_("not implemented yet");};
++		void        StressIntensityFactor(void){_error_("not implemented yet");};
++		IssmDouble  SurfaceArea(void){_error_("not implemented yet");};
++		int         TensorInterpolation(void);
++		IssmDouble  TimeAdapt(){_error_("not implemented yet");};
++		IssmDouble  TotalSmb(void){_error_("not implemented yet");};
++		void        Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement);
++		void        UpdateConstraintsExtrudeFromBase(){_error_("not implemented");};
++		void        UpdateConstraintsExtrudeFromTop(){_error_("not implemented");};
++		int         UpdatePotentialUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf){_error_("not implemented yet");};
++		void        ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
+ 		void        ValueP1OnGauss(IssmDouble* pvalue,IssmDouble* values,Gauss* gauss);
+-		void        ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
+ 		int         VelocityInterpolation(void);
+-		int         TensorInterpolation(void);
+-		void        GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues){_error_("not implemented yet");};
+-		void        GetGroundedPart(int* point1,IssmDouble* fraction1, IssmDouble* fraction2,bool* mainlyfloating){_error_("not implemented yet");};
+-		IssmDouble  GetGroundedPortion(IssmDouble* xyz_list){_error_("not implemented yet");};
+-		void        GetInputValue(IssmDouble* pvalue,Node* node,int enumtype);
+-		Node*       GetNode(int node_number){_error_("Not implemented");};
+-		int         GetElementType(void);
+-		Gauss*      NewGauss(void);
+-		Gauss*      NewGauss(int order);
+-      Gauss*      NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order){_error_("not implemented yet");};
+-      Gauss*      NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order_horiz,int order_vert);
+-      Gauss*      NewGauss(int point1,IssmDouble fraction1,IssmDouble fraction2,bool mainlyfloating,int order){_error_("not implemented yet");};
+-		Gauss*      NewGaussBase(int order);
+-		Gauss*      NewGaussLine(int vertex1,int vertex2,int order){_error_("not implemented yet");};
+-		Gauss*      NewGaussTop(int order);
+ 		int         VertexConnectivity(int vertexindex){_error_("not implemented yet");};
+ 		void        VerticalSegmentIndices(int** pindices,int* pnumseg){_error_("not implemented yet");};
+ 		void        ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
+-		bool        IsZeroLevelset(int levelset_enum){_error_("not implemented");};
+-		bool		   IsIcefront(void);
+-		bool        IsFaceOnBoundary(void){_error_("not implemented yet");};
+ 		void        ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum);
+-		void		   GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){_error_("not implemented yet");};
+-		void		   GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level){_error_("not implemented yet");};
+-		void        GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int enum_type){_error_("not implemented yet");};
+-		void        InputDepthAverageAtBase(int enum_type,int average_enum_type){_error_("not implemented yet");};
+-		void        InputExtrude(int enum_type,int start){_error_("not implemented"); /*For penta only*/};
+-		void        InputScale(int enum_type,IssmDouble scale_factor){_error_("not implemented yet");};
+-		void        MaterialUpdateFromTemperature(void){_error_("not implemented yet");};
+-		int         NodalValue(IssmDouble* pvalue, int index, int natureofdataenum){_error_("not implemented yet");};
+-		void        PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm){_error_("not implemented yet");};
+-		void        ResetFSBasalBoundaryCondition(void);
+-		void        ReduceMatrices(ElementMatrix* Ke,ElementVector* pe);
+-		void        SetTemporaryElementType(int element_type_in){_error_("not implemented yet");};
+-		IssmDouble  SurfaceArea(void){_error_("not implemented yet");};
+-		void        Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement);
+-		IssmDouble  TimeAdapt(){_error_("not implemented yet");};
+-		void UpdateConstraintsExtrudeFromBase(){_error_("not implemented");};
+-		void UpdateConstraintsExtrudeFromTop(){_error_("not implemented");};
+ 
+-		void       AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part){_error_("not implemented yet");};
+-		IssmDouble IceVolume(void){_error_("not implemented yet");};
+-		IssmDouble IceVolumeAboveFloatation(void){_error_("not implemented yet");};
+-		IssmDouble TotalSmb(void){_error_("not implemented yet");};
+-		IssmDouble MassFlux(IssmDouble* segment){_error_("not implemented yet");};
+-		IssmDouble MassFlux(IssmDouble x1,IssmDouble y1, IssmDouble x2, IssmDouble y2,int segment_id){_error_("not implemented yet");}
+-		void       ElementResponse(IssmDouble* presponse,int response_enum){_error_("not implemented yet");};
+-		IssmDouble Misfit(int modelenum,int observationenum,int weightsenum){_error_("not implemented yet");};
+-		IssmDouble MisfitArea(int weightsenum){_error_("not implemented yet");};
+-		IssmDouble Masscon(IssmDouble* levelset){_error_("not implemented yet");};
+-
+ #ifdef _HAVE_GIA_
+-		void   GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,IssmDouble* x,IssmDouble* y){_error_("not implemented yet");};
++		void        GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,IssmDouble* x,IssmDouble* y){_error_("not implemented yet");};
+ #endif
+ 
+-		IssmDouble DragCoefficientAbsGradient(void){_error_("not implemented yet");};
+-		void       GradientIndexing(int* indexing,int control_index){_error_("not implemented yet");};
+-		void       GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid){_error_("not implemented yet");};
+-		void       SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){_error_("not implemented yet");};
+-		void       ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){_error_("not implemented yet");};
+-		void       ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum){_error_("not implemented yet");};
+-		void       InputControlUpdate(IssmDouble scalar,bool save_parameter){_error_("not implemented yet");};
+-
+-		void   PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding){_error_("not implemented yet");};
+-		int    UpdatePotentialUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf){_error_("not implemented yet");};
++#ifdef _HAVE_DAKOTA_
++		void        InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){_error_("not implemented yet");};
++		void        InputUpdateFromMatrixDakota(IssmDouble* matrix, int nows, int ncols, int name, int type){_error_("not implemented yet");};
++#endif
+ 		/*}}}*/
+ };
+ #endif  /* _TETRA_H_*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18923-18924.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18923-18924.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18923-18924.diff	(revision 19102)
@@ -0,0 +1,294 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Seg.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Seg.cpp	(revision 18923)
++++ ../trunk-jpl/src/c/classes/Elements/Seg.cpp	(revision 18924)
+@@ -67,12 +67,6 @@
+ 	return this->element_type;
+ }
+ /*}}}*/
+-int        Seg::ObjectEnum(void){/*{{{*/
+-
+-	return SegEnum;
+-
+-}
+-/*}}}*/
+ void       Seg::GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){/*{{{*/
+ 	
+ 	/* Intermediaries */
+@@ -101,20 +95,6 @@
+ 
+ 	*pxyz_front=xyz_front;
+ }/*}}}*/
+-void       Seg::NodalFunctionsP1(IssmDouble* basis, Gauss* gauss){/*{{{*/
+-
+-	_assert_(gauss->Enum()==GaussSegEnum);
+-	this->GetNodalFunctions(basis,(GaussSeg*)gauss,P1Enum);
+-
+-}
+-/*}}}*/
+-void       Seg::NodalFunctionsP2(IssmDouble* basis, Gauss* gauss){/*{{{*/
+-
+-	_assert_(gauss->Enum()==GaussSegEnum);
+-	this->GetNodalFunctions(basis,(GaussSeg*)gauss,P2Enum);
+-
+-}
+-/*}}}*/
+ int        Seg::GetNumberOfNodes(void){/*{{{*/
+ 	return this->NumberofNodes(this->element_type);
+ }
+@@ -204,6 +184,20 @@
+ 
+ }
+ /*}}}*/
++void       Seg::NodalFunctionsP1(IssmDouble* basis, Gauss* gauss){/*{{{*/
++
++	_assert_(gauss->Enum()==GaussSegEnum);
++	this->GetNodalFunctions(basis,(GaussSeg*)gauss,P1Enum);
++
++}
++/*}}}*/
++void       Seg::NodalFunctionsP2(IssmDouble* basis, Gauss* gauss){/*{{{*/
++
++	_assert_(gauss->Enum()==GaussSegEnum);
++	this->GetNodalFunctions(basis,(GaussSeg*)gauss,P2Enum);
++
++}
++/*}}}*/
+ void       Seg::NormalSection(IssmDouble* normal,IssmDouble* xyz_list_front){/*{{{*/
+ 
+ 	IssmDouble* xyz_list = xNew<IssmDouble>(NUMVERTICES*3);
+@@ -217,3 +211,9 @@
+ 	xDelete<IssmDouble>(xyz_list);
+ }
+ /*}}}*/
++int        Seg::ObjectEnum(void){/*{{{*/
++
++	return SegEnum;
++
++}
++/*}}}*/
+Index: ../trunk-jpl/src/c/classes/Elements/Seg.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18923)
++++ ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18924)
+@@ -38,139 +38,134 @@
+ 		int     ObjectEnum();
+ 		Object *copy();
+ 		/*}}}*/
+-		/*Update virtual functions resolution: {{{*/
+-		void  InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum){_error_("not implemented yet");};
+-		void  InputUpdateFromSolutionOneDof(IssmDouble* solution,int inputenum){_error_("not implemented yet");};
+-		void  InputUpdateFromVector(IssmDouble* vector, int name, int type){_error_("not implemented yet");};
+-#ifdef _HAVE_DAKOTA_
+-		void  InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){_error_("not implemented yet");};
+-		void  InputUpdateFromMatrixDakota(IssmDouble* matrix, int nows, int ncols, int name, int type){_error_("not implemented yet");};
+-#endif
+-		void  InputUpdateFromIoModel(int index, IoModel* iomodel){_error_("not implemented yet");};
+-		/*}}}*/
+ 		/*Element virtual functions definitions: {{{*/
+ 		void        AddBasalInput(int input_enum, IssmDouble* values, int interpolation_enum){_error_("not implemented yet");};
+ 		void        AddInput(int input_enum, IssmDouble* values, int interpolation_enum){_error_("not implemented yet");};
++		void        AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part){_error_("not implemented yet");};
++		void        CalvingRateLevermann(void){_error_("not implemented yet");};
+ 		IssmDouble  CharacteristicLength(void);
+ 		void        ComputeBasalStress(Vector<IssmDouble>* sigma_b){_error_("not implemented yet");};
++		void        ComputeDeviatoricStressTensor(){_error_("not implemented yet");};
+ 		void        ComputeSigmaNN(){_error_("not implemented yet");};
+ 		void        ComputeStressTensor(){_error_("not implemented yet");};
+-		void        ComputeDeviatoricStressTensor(){_error_("not implemented yet");};
+-		void        StressIntensityFactor(void){_error_("not implemented yet");};
+-		void        StrainRateparallel(void){_error_("not implemented yet");};
+-		void        StrainRateperpendicular(void){_error_("not implemented yet");};
+-		void        CalvingRateLevermann(void){_error_("not implemented yet");};
+ 		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters){_error_("not implemented yet");};
+-		void        SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters){_error_("not implemented yet");};
+-		void        ResetHooks(){_error_("not implemented yet");};
++		void        ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){_error_("not implemented yet");};
++		void        ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum){_error_("not implemented yet");};
+ 		void        Delta18oParameterization(void){_error_("not implemented yet");};
++		void        ElementResponse(IssmDouble* presponse,int response_enum){_error_("not implemented yet");};
+ 		void        ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz){_error_("not implemented yet");};
+ 		void        FSContactMigration(Vector<IssmDouble>* vertexgrounded,Vector<IssmDouble>* vertexfloating){_error_("not implemented yet");};
+ 		int         FiniteElement(void);
+-		Element*    GetUpperElement(void){_error_("not implemented yet");};
+ 		Element*    GetBasalElement(void){_error_("not implemented yet");};
++		int         GetElementType(void){_error_("not implemented yet");};
++		void        GetGroundedPart(int* point1,IssmDouble* fraction1, IssmDouble* fraction2,bool* mainlyfloating){_error_("not implemented yet");};
++		IssmDouble  GetGroundedPortion(IssmDouble* xyz_list){_error_("not implemented yet");};
++		void		   GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum);
++		void        GetInputValue(IssmDouble* pvalue,Node* node,int enumtype){_error_("not implemented yet");};
++		void		   GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level){_error_("not implemented");};
++		void        GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues){_error_("not implemented yet");};
++		Node*       GetNode(int node_number){_error_("Not implemented");};
+ 		int         GetNodeIndex(Node* node){_error_("not implemented yet");};
+ 		int         GetNumberOfNodes(void);
+ 		int         GetNumberOfNodes(int enum_type){_error_("not implemented yet");};
+ 		int         GetNumberOfVertices(void);
++		void        GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int enum_type){_error_("not implemented yet");};
++		Element*    GetUpperElement(void){_error_("not implemented yet");};
++		void        GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid){_error_("not implemented yet");};
+ 		void        GetVerticesCoordinates(IssmDouble** pxyz_list);
+ 		void        GetVerticesCoordinatesBase(IssmDouble** pxyz_list){_error_("not implemented yet");};
+ 		void        GetVerticesCoordinatesTop(IssmDouble** pxyz_list){_error_("not implemented yet");};
++		IssmDouble  IceVolume(void){_error_("not implemented yet");};
++		IssmDouble  IceVolumeAboveFloatation(void){_error_("not implemented yet");};
++		void        InputControlUpdate(IssmDouble scalar,bool save_parameter){_error_("not implemented yet");};
++		void        InputDepthAverageAtBase(int enum_type,int average_enum_type){_error_("not implemented yet");};
++		void        InputExtrude(int enum_type,int start){_error_("not implemented"); /*For penta only*/};
++		void        InputScale(int enum_type,IssmDouble scale_factor){_error_("not implemented yet");};
++		void        InputUpdateFromIoModel(int index, IoModel* iomodel){_error_("not implemented yet");};
++		void        InputUpdateFromSolutionOneDof(IssmDouble* solution,int inputenum){_error_("not implemented yet");};
++		void        InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum){_error_("not implemented yet");};
++		void        InputUpdateFromVector(IssmDouble* vector, int name, int type){_error_("not implemented yet");};
++		bool        IsFaceOnBoundary(void){_error_("not implemented yet");};
++		bool		   IsIcefront(void);
++		bool        IsNodeOnShelfFromFlags(IssmDouble* flags){_error_("not implemented yet");};
+ 		bool        IsOnBase(){_error_("not implemented yet");};
+ 		bool        IsOnSurface(){_error_("not implemented yet");};
+-		bool        IsNodeOnShelfFromFlags(IssmDouble* flags){_error_("not implemented yet");};
++		bool        IsZeroLevelset(int levelset_enum){_error_("not implemented");};
+ 		void        JacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss);
++		void        JacobianDeterminantBase(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss){_error_("not implemented yet");};
+ 		void        JacobianDeterminantLine(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
+ 		void        JacobianDeterminantSurface(IssmDouble*  pJdet, IssmDouble* xyz_list,Gauss* gauss);
+-		void        JacobianDeterminantBase(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss){_error_("not implemented yet");};
+ 		void        JacobianDeterminantTop(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss){_error_("not implemented yet");};
++		IssmDouble  Masscon(IssmDouble* levelset){_error_("not implemented yet");};
++		IssmDouble  MassFlux(IssmDouble* segment){_error_("not implemented yet");};
++		IssmDouble  MassFlux(IssmDouble x1,IssmDouble y1, IssmDouble x2, IssmDouble y2,int segment_id){_error_("not implemented yet");}
++		void        MaterialUpdateFromTemperature(void){_error_("not implemented yet");};
+ 		IssmDouble  MinEdgeLength(IssmDouble* xyz_list){_error_("not implemented yet");};
++		IssmDouble  Misfit(int modelenum,int observationenum,int weightsenum){_error_("not implemented yet");};
++		IssmDouble  MisfitArea(int weightsenum){_error_("not implemented yet");};
++		Gauss*      NewGauss(void);
++		Gauss*      NewGauss(int order);
++      Gauss*      NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order);
++      Gauss*      NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order_horiz,int order_vert){_error_("not implemented yet");};
++      Gauss*      NewGauss(int point1,IssmDouble fraction1,IssmDouble fraction2,bool mainlyfloating,int order){_error_("not implemented yet");};
++		Gauss*      NewGaussBase(int order){_error_("not implemented yet");};
++		Gauss*      NewGaussLine(int vertex1,int vertex2,int order){_error_("not implemented yet");};
++		Gauss*      NewGaussTop(int order){_error_("not implemented yet");};
++		int         NodalValue(IssmDouble* pvalue, int index, int natureofdataenum){_error_("not implemented yet");};
+ 		void        NodalFunctions(IssmDouble* basis,Gauss* gauss);
++		void        NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
++		void        NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
++		void        NodalFunctionsMINIDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
++		void        NodalFunctionsPressure(IssmDouble* basis,Gauss* gauss){_error_("not implemented yet");};
+ 		void        NodalFunctionsP1(IssmDouble* basis,Gauss* gauss);
++		void        NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
+ 		void        NodalFunctionsP2(IssmDouble* basis,Gauss* gauss);
++		void        NodalFunctionsTensor(IssmDouble* basis,Gauss* gauss){_error_("not implemented yet");};
+ 		void        NodalFunctionsVelocity(IssmDouble* basis,Gauss* gauss){_error_("not implemented yet");};
+-		void        NodalFunctionsPressure(IssmDouble* basis,Gauss* gauss){_error_("not implemented yet");};
+-		void        NodalFunctionsTensor(IssmDouble* basis,Gauss* gauss){_error_("not implemented yet");};
+-		void        NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss);
+-		void        NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
+-		void        NodalFunctionsMINIDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
+-		void        NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
++		void        NormalBase(IssmDouble* normal,IssmDouble* xyz_list){_error_("not implemented yet");};
+ 		void        NormalSection(IssmDouble* normal,IssmDouble* xyz_list);
+ 		void        NormalTop(IssmDouble* normal,IssmDouble* xyz_list){_error_("not implemented yet");};
+-		void        NormalBase(IssmDouble* normal,IssmDouble* xyz_list){_error_("not implemented yet");};
++		int         NumberofNodesPressure(void){_error_("not implemented yet");};
+ 		int         NumberofNodesVelocity(void){_error_("not implemented yet");};
+-		int         NumberofNodesPressure(void){_error_("not implemented yet");};
++		void        PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm){_error_("not implemented yet");};
++		void        PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding){_error_("not implemented yet");};
++		int         PressureInterpolation(void){_error_("not implemented yet");};
++		void        ReduceMatrices(ElementMatrix* Ke,ElementVector* pe){_error_("not implemented yet");};
++		void        ResetFSBasalBoundaryCondition(void){_error_("not implemented yet");};
++		void        ResetHooks(){_error_("not implemented yet");};
++		void        SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){_error_("not implemented yet");};
++		void        SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters){_error_("not implemented yet");};
++		void        SetTemporaryElementType(int element_type_in){_error_("not implemented yet");};
+ 	   Element*    SpawnBasalElement(void){_error_("not implemented yet");};
+ 		Element*    SpawnTopElement(void){_error_("not implemented yet");};
+ 		IssmDouble  StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa){_error_("not implemented yet");};
+-		int         PressureInterpolation(void){_error_("not implemented yet");};
++		void        StrainRateparallel(void){_error_("not implemented yet");};
++		void        StrainRateperpendicular(void){_error_("not implemented yet");};
++		void        StressIntensityFactor(void){_error_("not implemented yet");};
++		IssmDouble  SurfaceArea(void){_error_("not implemented yet");};
++		int         TensorInterpolation(void){_error_("not implemented yet");};
++		IssmDouble  TimeAdapt(){_error_("not implemented yet");};
++		IssmDouble  TotalSmb(void){_error_("not implemented yet");};
++		void        Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement){_error_("not implemented yet");};
++		void        UpdateConstraintsExtrudeFromBase(){_error_("not implemented");};
++		void        UpdateConstraintsExtrudeFromTop(){_error_("not implemented");};
++		int         UpdatePotentialUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf){_error_("not implemented yet");};
++		void        ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
+ 		void        ValueP1OnGauss(IssmDouble* pvalue,IssmDouble* values,Gauss* gauss){_error_("not implemented yet");};
+-		void        ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");};
+ 		int         VelocityInterpolation(void){_error_("not implemented yet");};
+-		int         TensorInterpolation(void){_error_("not implemented yet");};
+-		void        GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues){_error_("not implemented yet");};
+-		void        GetGroundedPart(int* point1,IssmDouble* fraction1, IssmDouble* fraction2,bool* mainlyfloating){_error_("not implemented yet");};
+-		IssmDouble  GetGroundedPortion(IssmDouble* xyz_list){_error_("not implemented yet");};
+-		void        GetInputValue(IssmDouble* pvalue,Node* node,int enumtype){_error_("not implemented yet");};
+-		Node*       GetNode(int node_number){_error_("Not implemented");};
+-		int         GetElementType(void){_error_("not implemented yet");};
+-		Gauss*      NewGauss(void);
+-		Gauss*      NewGauss(int order);
+-      Gauss*      NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order);
+-      Gauss*      NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order_horiz,int order_vert){_error_("not implemented yet");};
+-      Gauss*      NewGauss(int point1,IssmDouble fraction1,IssmDouble fraction2,bool mainlyfloating,int order){_error_("not implemented yet");};
+-		Gauss*      NewGaussBase(int order){_error_("not implemented yet");};
+-		Gauss*      NewGaussLine(int vertex1,int vertex2,int order){_error_("not implemented yet");};
+-		Gauss*      NewGaussTop(int order){_error_("not implemented yet");};
+ 		int         VertexConnectivity(int vertexindex){_error_("not implemented yet");};
+ 		void        VerticalSegmentIndices(int** pindices,int* pnumseg){_error_("not implemented yet");};
+ 		void        ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){_error_("not implemented yet");};
+-		bool        IsZeroLevelset(int levelset_enum){_error_("not implemented");};
+-		bool		   IsIcefront(void);
+-		bool        IsFaceOnBoundary(void){_error_("not implemented yet");};
+ 		void        ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum){_error_("not implemented");};
+-		void		   GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum);
+-		void		   GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level){_error_("not implemented");};
+ 
+-		void        GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int enum_type){_error_("not implemented yet");};
+-		void        InputDepthAverageAtBase(int enum_type,int average_enum_type){_error_("not implemented yet");};
+-		void        InputExtrude(int enum_type,int start){_error_("not implemented"); /*For penta only*/};
+-		void        InputScale(int enum_type,IssmDouble scale_factor){_error_("not implemented yet");};
+-		void        MaterialUpdateFromTemperature(void){_error_("not implemented yet");};
+-		int         NodalValue(IssmDouble* pvalue, int index, int natureofdataenum){_error_("not implemented yet");};
+-		void        PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm){_error_("not implemented yet");};
+-		void        ResetFSBasalBoundaryCondition(void){_error_("not implemented yet");};
+-		void        ReduceMatrices(ElementMatrix* Ke,ElementVector* pe){_error_("not implemented yet");};
+-		void        SetTemporaryElementType(int element_type_in){_error_("not implemented yet");};
+-		IssmDouble  SurfaceArea(void){_error_("not implemented yet");};
+-		void        Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement){_error_("not implemented yet");};
+-		IssmDouble  TimeAdapt(){_error_("not implemented yet");};
+-		void UpdateConstraintsExtrudeFromBase(){_error_("not implemented");};
+-		void UpdateConstraintsExtrudeFromTop(){_error_("not implemented");};
+-
+-		void       AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part){_error_("not implemented yet");};
+-		IssmDouble IceVolume(void){_error_("not implemented yet");};
+-		IssmDouble IceVolumeAboveFloatation(void){_error_("not implemented yet");};
+-		IssmDouble TotalSmb(void){_error_("not implemented yet");};
+-		IssmDouble MassFlux(IssmDouble* segment){_error_("not implemented yet");};
+-		IssmDouble MassFlux(IssmDouble x1,IssmDouble y1, IssmDouble x2, IssmDouble y2,int segment_id){_error_("not implemented yet");}
+-		void       ElementResponse(IssmDouble* presponse,int response_enum){_error_("not implemented yet");};
+-		IssmDouble Misfit(int modelenum,int observationenum,int weightsenum){_error_("not implemented yet");};
+-		IssmDouble MisfitArea(int weightsenum){_error_("not implemented yet");};
+-		IssmDouble Masscon(IssmDouble* levelset){_error_("not implemented yet");};
+-
+ #ifdef _HAVE_GIA_
+-		void   GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,IssmDouble* x,IssmDouble* y){_error_("not implemented yet");};
++		void        GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,IssmDouble* x,IssmDouble* y){_error_("not implemented yet");};
+ #endif
+ 
+-		void       GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid){_error_("not implemented yet");};
+-		void       SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){_error_("not implemented yet");};
+-		void       ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){_error_("not implemented yet");};
+-		void       ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum){_error_("not implemented yet");};
+-		void       InputControlUpdate(IssmDouble scalar,bool save_parameter){_error_("not implemented yet");};
+-
+-		void   PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding){_error_("not implemented yet");};
+-		int    UpdatePotentialUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf){_error_("not implemented yet");};
++#ifdef _HAVE_DAKOTA_
++		void        InputUpdateFromMatrixDakota(IssmDouble* matrix, int nows, int ncols, int name, int type){_error_("not implemented yet");};
++		void        InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){_error_("not implemented yet");};
++#endif
+ 		/*}}}*/
+ };
+ #endif  /* _SEG_H */
Index: /issm/oecreview/Archive/18296-19100/ISSM-18924-18925.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18924-18925.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18924-18925.diff	(revision 19102)
@@ -0,0 +1,1635 @@
+Index: ../trunk-jpl/src/c/classes/Elements/TriaRef.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/TriaRef.h	(revision 18924)
++++ ../trunk-jpl/src/c/classes/Elements/TriaRef.h	(revision 18925)
+@@ -15,23 +15,22 @@
+ 		~TriaRef();
+ 
+ 		/*Numerics*/
++		void GetInputDerivativeValue(IssmDouble* pp, IssmDouble* plist,IssmDouble* xyz_list, Gauss* gauss,int finiteelement);
++		void GetInputValue(IssmDouble* pp, IssmDouble* plist, Gauss* gauss,int finiteelement);
+ 		void GetJacobian(IssmDouble* J, IssmDouble* xyz_list,Gauss* gauss);
+-		void GetSegmentJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss);
+ 		void GetJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss);
+ 		void GetJacobianInvert(IssmDouble*  Jinv, IssmDouble* xyz_list,Gauss* gauss);
+ 		void GetNodalFunctions(IssmDouble* basis,Gauss* gauss,int finiteelement);
+-		void GetSegmentNodalFunctions(IssmDouble* basis,Gauss* gauss, int index1,int index2,int finiteelement);
++		void GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, Gauss* gauss,int finiteelement);
++		void GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,Gauss* gauss,int finiteelement);
+ 		void GetSegmentBFlux(IssmDouble* B,Gauss* gauss, int index1,int index2,int finiteelement);
+ 		void GetSegmentBprimeFlux(IssmDouble* Bprime,Gauss* gauss, int index1,int index2,int finiteelement);
+-		void GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, Gauss* gauss,int finiteelement);
+-		void GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,Gauss* gauss,int finiteelement);
+-		void GetInputValue(IssmDouble* pp, IssmDouble* plist, Gauss* gauss,int finiteelement);
+-		void GetInputDerivativeValue(IssmDouble* pp, IssmDouble* plist,IssmDouble* xyz_list, Gauss* gauss,int finiteelement);
+-
++		void GetSegmentJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss);
++		void GetSegmentNodalFunctions(IssmDouble* basis,Gauss* gauss, int index1,int index2,int finiteelement);
+ 		void NodeOnEdgeIndices(int* pnumindices,int** pindices,int index,int finiteelement);
+ 		int  NumberofNodes(int finiteelement);
+-		int  VelocityInterpolation(int fe_stokes);
+ 		int  PressureInterpolation(int fe_stokes);
+ 		int  TensorInterpolation(int fe_stokes);
++		int  VelocityInterpolation(int fe_stokes);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/classes/Elements/PentaRef.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/PentaRef.cpp	(revision 18924)
++++ ../trunk-jpl/src/c/classes/Elements/PentaRef.cpp	(revision 18925)
+@@ -36,6 +36,150 @@
+ /*}}}*/
+ 
+ /*Reference Element numerics*/
++void PentaRef::BasalNodeIndices(int* pnumindices,int** pindices,int finiteelement){/*{{{*/
++
++	/*Output*/
++	int  numindices;
++	int* indices = NULL;
++
++	switch(finiteelement){
++		case P1Enum: case P1DGEnum:
++			numindices = 3;
++			indices    = xNew<int>(numindices);
++			indices[0] = 0;
++			indices[1] = 1;
++			indices[2] = 2;
++			break;
++		case P1bubbleEnum: case P1bubblecondensedEnum:
++			numindices = 3;
++			indices    = xNew<int>(numindices);
++			indices[0] = 0;
++			indices[1] = 1;
++			indices[2] = 2;
++			break;
++		case P2xP1Enum:
++			numindices = 6;
++			indices    = xNew<int>(numindices);
++			indices[0] = 0;
++			indices[1] = 1;
++			indices[2] = 2;
++			indices[3] = 6;
++			indices[4] = 7;
++			indices[5] = 8;
++			break;
++		case P1xP2Enum:
++			numindices = 3;
++			indices    = xNew<int>(numindices);
++			indices[0] = 0;
++			indices[1] = 1;
++			indices[2] = 2;
++			break;
++		case P1xP3Enum:
++			numindices = 3;
++			indices    = xNew<int>(numindices);
++			indices[0] = 0;
++			indices[1] = 1;
++			indices[2] = 2;
++			break;
++		case P2Enum:
++			numindices = 6;
++			indices    = xNew<int>(numindices);
++			indices[0] = 0;
++			indices[1] = 1;
++			indices[2] = 2;
++			indices[3] = 9;
++			indices[4] = 10;
++			indices[5] = 11;
++			break;
++		case P2bubbleEnum:
++			numindices = 6;
++			indices    = xNew<int>(numindices);
++			indices[0] = 0;
++			indices[1] = 1;
++			indices[2] = 2;
++			indices[3] = 9;
++			indices[4] = 10;
++			indices[5] = 11;
++			break;
++		case P2xP4Enum:
++			numindices = 6;
++			indices    = xNew<int>(numindices);
++			indices[0] = 0;
++			indices[1] = 1;
++			indices[2] = 2;
++			indices[3] = 9;
++			indices[4] = 10;
++			indices[5] = 11;
++			break;
++		default:
++			_error_("Element type "<<EnumToStringx(finiteelement)<<" not supported yet");
++	}
++
++	/*Assign output pointer*/
++	*pnumindices = numindices;
++	*pindices    = indices;
++}
++/*}}}*/
++void PentaRef::GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, Gauss* gauss,int finiteelement){/*{{{*/
++	/*From node values of parameter p (p_list[0], p_list[1], p_list[2],
++	 * p_list[3], p_list[4] and p_list[4]), return parameter derivative value at
++	 * gaussian point specified by gauss_coord:
++	 *   dp/dx=p_list[0]*dh1/dx+p_list[1]*dh2/dx+p_list[2]*dh3/dx+p_list[3]*dh4/dx+p_list[4]*dh5/dx+p_list[5]*dh6/dx;
++	 *   dp/dy=p_list[0]*dh1/dy+p_list[1]*dh2/dy+p_list[2]*dh3/dy+p_list[3]*dh4/dy+p_list[4]*dh5/dy+p_list[5]*dh6/dy;
++	 *   dp/dz=p_list[0]*dh1/dz+p_list[1]*dh2/dz+p_list[2]*dh3/dz+p_list[3]*dh4/dz+p_list[4]*dh5/dz+p_list[5]*dh6/dz;
++	 *
++	 *   p is a vector of size 3x1 already allocated.
++	 *
++	 * WARNING: For a significant gain in performance, it is better to use
++	 * static memory allocation instead of dynamic.
++	 */
++
++	/*Allocate derivatives of basis functions*/
++	IssmDouble  dbasis[3*NUMNODESMAX];
++
++	/*Fetch number of nodes for this finite element*/
++	int numnodes = this->NumberofNodes(finiteelement);
++	_assert_(numnodes<=NUMNODESMAX);
++
++	/*Get basis functions derivatives at this point*/
++	GetNodalFunctionsDerivatives(&dbasis[0],xyz_list,gauss,finiteelement);
++
++	/*Calculate parameter for this Gauss point*/
++	IssmDouble dpx=0.;
++	IssmDouble dpy=0.;
++	IssmDouble dpz=0.;
++	for(int i=0;i<numnodes;i++) dpx += dbasis[0*numnodes+i]*plist[i];
++	for(int i=0;i<numnodes;i++) dpy += dbasis[1*numnodes+i]*plist[i];
++	for(int i=0;i<numnodes;i++) dpz += dbasis[2*numnodes+i]*plist[i];
++
++	/*Assign values*/
++	p[0]=dpx;
++	p[1]=dpy;
++	p[2]=dpz;
++}
++/*}}}*/
++void PentaRef::GetInputValue(IssmDouble* pvalue,IssmDouble* plist,Gauss* gauss,int finiteelement){/*{{{*/
++	/* WARNING: For a significant gain in performance, it is better to use
++	 * static memory allocation instead of dynamic.*/
++
++	/*Allocate basis functions*/
++	IssmDouble  basis[NUMNODESMAX];
++
++	/*Fetch number of nodes for this finite element*/
++	int numnodes = this->NumberofNodes(finiteelement);
++	_assert_(numnodes<=NUMNODESMAX);
++
++	/*Get basis functions at this point*/
++	GetNodalFunctions(&basis[0],gauss,finiteelement);
++
++	/*Calculate parameter for this Gauss point*/
++	IssmDouble value =0.;
++	for(int i=0;i<numnodes;i++) value += basis[i]*plist[i];
++
++	/*Assign output pointer*/
++	*pvalue = value;
++}
++/*}}}*/
+ void PentaRef::GetJacobian(IssmDouble* J, IssmDouble* xyz_list,Gauss* gauss_in){/*{{{*/
+ 	/*The Jacobian is constant over the element, discard the gaussian points. 
+ 	 * J is assumed to have been allocated of size NDOF2xNDOF2.*/
+@@ -106,41 +250,6 @@
+ 
+ }
+ /*}}}*/
+-void PentaRef::GetTriaJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+-	/*The Jacobian determinant is constant over the element, discard the gaussian points. 
+-	 * J is assumed to have been allocated of size NDOF2xNDOF2.*/
+-
+-	IssmDouble x1=xyz_list[3*0+0];
+-	IssmDouble y1=xyz_list[3*0+1];
+-	IssmDouble z1=xyz_list[3*0+2];
+-	IssmDouble x2=xyz_list[3*1+0];
+-	IssmDouble y2=xyz_list[3*1+1];
+-	IssmDouble z2=xyz_list[3*1+2];
+-	IssmDouble x3=xyz_list[3*2+0];
+-	IssmDouble y3=xyz_list[3*2+1];
+-	IssmDouble z3=xyz_list[3*2+2];
+-
+-	/*Jdet = norm( AB ^ AC ) / (2 * area of the reference triangle), with areaRef=sqrt(3) */
+-	*Jdet=SQRT3/6.*pow(pow(((y2-y1)*(z3-z1)-(z2-z1)*(y3-y1)),2)+pow(((z2-z1)*(x3-x1)-(x2-x1)*(z3-z1)),2)+pow(((x2-x1)*(y3-y1)-(y2-y1)*(x3-x1)),2),0.5);
+-	if(*Jdet<0) _error_("negative jacobian determinant!");
+-}
+-/*}}}*/
+-void PentaRef::GetSegmentJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+-	/*The Jacobian determinant is constant over the element, discard the gaussian points. 
+-	 * J is assumed to have been allocated of size NDOF2xNDOF2.*/
+-
+-	IssmDouble x1=xyz_list[3*0+0];
+-	IssmDouble y1=xyz_list[3*0+1];
+-	IssmDouble z1=xyz_list[3*0+2];
+-	IssmDouble x2=xyz_list[3*1+0];
+-	IssmDouble y2=xyz_list[3*1+1];
+-	IssmDouble z2=xyz_list[3*1+2];
+-
+-	*Jdet=.5*sqrt(pow(x2-x1,2) + pow(y2-y1,2) + pow(z2-z1,2));
+-	if(*Jdet<0) _error_("negative jacobian determinant!");
+-
+-}
+-/*}}}*/
+ void PentaRef::GetJacobianInvert(IssmDouble* Jinv, IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 
+ 	/*Jacobian*/
+@@ -885,64 +994,39 @@
+ 
+ }
+ /*}}}*/
+-void PentaRef::GetInputValue(IssmDouble* pvalue,IssmDouble* plist,Gauss* gauss,int finiteelement){/*{{{*/
+-	/* WARNING: For a significant gain in performance, it is better to use
+-	 * static memory allocation instead of dynamic.*/
++void PentaRef::GetSegmentJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++	/*The Jacobian determinant is constant over the element, discard the gaussian points. 
++	 * J is assumed to have been allocated of size NDOF2xNDOF2.*/
+ 
+-	/*Allocate basis functions*/
+-	IssmDouble  basis[NUMNODESMAX];
++	IssmDouble x1=xyz_list[3*0+0];
++	IssmDouble y1=xyz_list[3*0+1];
++	IssmDouble z1=xyz_list[3*0+2];
++	IssmDouble x2=xyz_list[3*1+0];
++	IssmDouble y2=xyz_list[3*1+1];
++	IssmDouble z2=xyz_list[3*1+2];
+ 
+-	/*Fetch number of nodes for this finite element*/
+-	int numnodes = this->NumberofNodes(finiteelement);
+-	_assert_(numnodes<=NUMNODESMAX);
++	*Jdet=.5*sqrt(pow(x2-x1,2) + pow(y2-y1,2) + pow(z2-z1,2));
++	if(*Jdet<0) _error_("negative jacobian determinant!");
+ 
+-	/*Get basis functions at this point*/
+-	GetNodalFunctions(&basis[0],gauss,finiteelement);
+-
+-	/*Calculate parameter for this Gauss point*/
+-	IssmDouble value =0.;
+-	for(int i=0;i<numnodes;i++) value += basis[i]*plist[i];
+-
+-	/*Assign output pointer*/
+-	*pvalue = value;
+ }
+ /*}}}*/
+-void PentaRef::GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, Gauss* gauss,int finiteelement){/*{{{*/
+-	/*From node values of parameter p (p_list[0], p_list[1], p_list[2],
+-	 * p_list[3], p_list[4] and p_list[4]), return parameter derivative value at
+-	 * gaussian point specified by gauss_coord:
+-	 *   dp/dx=p_list[0]*dh1/dx+p_list[1]*dh2/dx+p_list[2]*dh3/dx+p_list[3]*dh4/dx+p_list[4]*dh5/dx+p_list[5]*dh6/dx;
+-	 *   dp/dy=p_list[0]*dh1/dy+p_list[1]*dh2/dy+p_list[2]*dh3/dy+p_list[3]*dh4/dy+p_list[4]*dh5/dy+p_list[5]*dh6/dy;
+-	 *   dp/dz=p_list[0]*dh1/dz+p_list[1]*dh2/dz+p_list[2]*dh3/dz+p_list[3]*dh4/dz+p_list[4]*dh5/dz+p_list[5]*dh6/dz;
+-	 *
+-	 *   p is a vector of size 3x1 already allocated.
+-	 *
+-	 * WARNING: For a significant gain in performance, it is better to use
+-	 * static memory allocation instead of dynamic.
+-	 */
++void PentaRef::GetTriaJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++	/*The Jacobian determinant is constant over the element, discard the gaussian points. 
++	 * J is assumed to have been allocated of size NDOF2xNDOF2.*/
+ 
+-	/*Allocate derivatives of basis functions*/
+-	IssmDouble  dbasis[3*NUMNODESMAX];
++	IssmDouble x1=xyz_list[3*0+0];
++	IssmDouble y1=xyz_list[3*0+1];
++	IssmDouble z1=xyz_list[3*0+2];
++	IssmDouble x2=xyz_list[3*1+0];
++	IssmDouble y2=xyz_list[3*1+1];
++	IssmDouble z2=xyz_list[3*1+2];
++	IssmDouble x3=xyz_list[3*2+0];
++	IssmDouble y3=xyz_list[3*2+1];
++	IssmDouble z3=xyz_list[3*2+2];
+ 
+-	/*Fetch number of nodes for this finite element*/
+-	int numnodes = this->NumberofNodes(finiteelement);
+-	_assert_(numnodes<=NUMNODESMAX);
+-
+-	/*Get basis functions derivatives at this point*/
+-	GetNodalFunctionsDerivatives(&dbasis[0],xyz_list,gauss,finiteelement);
+-
+-	/*Calculate parameter for this Gauss point*/
+-	IssmDouble dpx=0.;
+-	IssmDouble dpy=0.;
+-	IssmDouble dpz=0.;
+-	for(int i=0;i<numnodes;i++) dpx += dbasis[0*numnodes+i]*plist[i];
+-	for(int i=0;i<numnodes;i++) dpy += dbasis[1*numnodes+i]*plist[i];
+-	for(int i=0;i<numnodes;i++) dpz += dbasis[2*numnodes+i]*plist[i];
+-
+-	/*Assign values*/
+-	p[0]=dpx;
+-	p[1]=dpy;
+-	p[2]=dpz;
++	/*Jdet = norm( AB ^ AC ) / (2 * area of the reference triangle), with areaRef=sqrt(3) */
++	*Jdet=SQRT3/6.*pow(pow(((y2-y1)*(z3-z1)-(z2-z1)*(y3-y1)),2)+pow(((z2-z1)*(x3-x1)-(x2-x1)*(z3-z1)),2)+pow(((x2-x1)*(y3-y1)-(y2-y1)*(x3-x1)),2),0.5);
++	if(*Jdet<0) _error_("negative jacobian determinant!");
+ }
+ /*}}}*/
+ int  PentaRef::NumberofNodes(int finiteelement){/*{{{*/
+@@ -976,24 +1060,6 @@
+ 	return -1;
+ }
+ /*}}}*/
+-int  PentaRef::VelocityInterpolation(int fe_stokes){/*{{{*/
+-
+-	switch(fe_stokes){
+-		case P1P1Enum:              return P1Enum;
+-		case P1P1GLSEnum:           return P1Enum;
+-		case MINIcondensedEnum:     return P1bubbleEnum;
+-		case MINIEnum:              return P1bubbleEnum;
+-		case TaylorHoodEnum:        return P2Enum;
+-		case LATaylorHoodEnum:      return P2Enum;
+-		case OneLayerP4zEnum:       return P2xP4Enum;
+-		case CrouzeixRaviartEnum:   return P2bubbleEnum;
+-		case LACrouzeixRaviartEnum: return P2bubbleEnum;
+-		default:       _error_("Element type "<<EnumToStringx(fe_stokes)<<" not supported yet");
+-	}
+-
+-	return -1;
+-}
+-/*}}}*/
+ int  PentaRef::PressureInterpolation(int fe_stokes){/*{{{*/
+ 
+ 	switch(fe_stokes){
+@@ -1012,100 +1078,6 @@
+ 	return -1;
+ }
+ /*}}}*/
+-int  PentaRef::TensorInterpolation(int fe_stokes){/*{{{*/
+-
+-	switch(fe_stokes){
+-		case XTaylorHoodEnum:    return P1DGEnum;
+-		default: _error_("Element type "<<EnumToStringx(fe_stokes)<<" not supported yet");
+-	}
+-
+-	return -1;
+-}
+-/*}}}*/
+-void PentaRef::BasalNodeIndices(int* pnumindices,int** pindices,int finiteelement){/*{{{*/
+-
+-	/*Output*/
+-	int  numindices;
+-	int* indices = NULL;
+-
+-	switch(finiteelement){
+-		case P1Enum: case P1DGEnum:
+-			numindices = 3;
+-			indices    = xNew<int>(numindices);
+-			indices[0] = 0;
+-			indices[1] = 1;
+-			indices[2] = 2;
+-			break;
+-		case P1bubbleEnum: case P1bubblecondensedEnum:
+-			numindices = 3;
+-			indices    = xNew<int>(numindices);
+-			indices[0] = 0;
+-			indices[1] = 1;
+-			indices[2] = 2;
+-			break;
+-		case P2xP1Enum:
+-			numindices = 6;
+-			indices    = xNew<int>(numindices);
+-			indices[0] = 0;
+-			indices[1] = 1;
+-			indices[2] = 2;
+-			indices[3] = 6;
+-			indices[4] = 7;
+-			indices[5] = 8;
+-			break;
+-		case P1xP2Enum:
+-			numindices = 3;
+-			indices    = xNew<int>(numindices);
+-			indices[0] = 0;
+-			indices[1] = 1;
+-			indices[2] = 2;
+-			break;
+-		case P1xP3Enum:
+-			numindices = 3;
+-			indices    = xNew<int>(numindices);
+-			indices[0] = 0;
+-			indices[1] = 1;
+-			indices[2] = 2;
+-			break;
+-		case P2Enum:
+-			numindices = 6;
+-			indices    = xNew<int>(numindices);
+-			indices[0] = 0;
+-			indices[1] = 1;
+-			indices[2] = 2;
+-			indices[3] = 9;
+-			indices[4] = 10;
+-			indices[5] = 11;
+-			break;
+-		case P2bubbleEnum:
+-			numindices = 6;
+-			indices    = xNew<int>(numindices);
+-			indices[0] = 0;
+-			indices[1] = 1;
+-			indices[2] = 2;
+-			indices[3] = 9;
+-			indices[4] = 10;
+-			indices[5] = 11;
+-			break;
+-		case P2xP4Enum:
+-			numindices = 6;
+-			indices    = xNew<int>(numindices);
+-			indices[0] = 0;
+-			indices[1] = 1;
+-			indices[2] = 2;
+-			indices[3] = 9;
+-			indices[4] = 10;
+-			indices[5] = 11;
+-			break;
+-		default:
+-			_error_("Element type "<<EnumToStringx(finiteelement)<<" not supported yet");
+-	}
+-
+-	/*Assign output pointer*/
+-	*pnumindices = numindices;
+-	*pindices    = indices;
+-}
+-/*}}}*/
+ void PentaRef::SurfaceNodeIndices(int* pnumindices,int** pindices,int finiteelement){/*{{{*/
+ 
+ 	/*Output*/
+@@ -1163,3 +1135,31 @@
+ 	*pindices    = indices;
+ }
+ /*}}}*/
++int  PentaRef::TensorInterpolation(int fe_stokes){/*{{{*/
++
++	switch(fe_stokes){
++		case XTaylorHoodEnum:    return P1DGEnum;
++		default: _error_("Element type "<<EnumToStringx(fe_stokes)<<" not supported yet");
++	}
++
++	return -1;
++}
++/*}}}*/
++int  PentaRef::VelocityInterpolation(int fe_stokes){/*{{{*/
++
++	switch(fe_stokes){
++		case P1P1Enum:              return P1Enum;
++		case P1P1GLSEnum:           return P1Enum;
++		case MINIcondensedEnum:     return P1bubbleEnum;
++		case MINIEnum:              return P1bubbleEnum;
++		case TaylorHoodEnum:        return P2Enum;
++		case LATaylorHoodEnum:      return P2Enum;
++		case OneLayerP4zEnum:       return P2xP4Enum;
++		case CrouzeixRaviartEnum:   return P2bubbleEnum;
++		case LACrouzeixRaviartEnum: return P2bubbleEnum;
++		default:       _error_("Element type "<<EnumToStringx(fe_stokes)<<" not supported yet");
++	}
++
++	return -1;
++}
++/*}}}*/
+Index: ../trunk-jpl/src/c/classes/Elements/PentaRef.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/PentaRef.h	(revision 18924)
++++ ../trunk-jpl/src/c/classes/Elements/PentaRef.h	(revision 18925)
+@@ -14,24 +14,23 @@
+ 		~PentaRef();
+ 
+ 		/*Numerics*/
++		void BasalNodeIndices(int* pnumindices,int** pindices,int finiteelement);
++		void GetInputDerivativeValue(IssmDouble* pvalues, IssmDouble* plist,IssmDouble* xyz_list, Gauss* gauss,int finiteelement);
++		void GetInputValue(IssmDouble* pvalue,IssmDouble* plist, Gauss* gauss,int finiteelement);
++		void GetJacobian(IssmDouble* J, IssmDouble* xyz_list,Gauss* gauss);
++		void GetJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss);
++		void GetJacobianInvert(IssmDouble*  Jinv, IssmDouble* xyz_list,Gauss* gauss);
++		void GetLprimeFSSSA(IssmDouble* LprimeFSSSA, IssmDouble* xyz_list, Gauss* gauss);
+ 		void GetNodalFunctions(IssmDouble* basis, Gauss* gauss,int finiteelement);
+ 		void GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss,int finiteelement);
+ 		void GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,Gauss* gauss,int finiteelement);
+ 		void GetQuadJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss);
+-		void GetJacobian(IssmDouble* J, IssmDouble* xyz_list,Gauss* gauss);
+-		void GetJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss);
++		void GetSegmentJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss);
+ 		void GetTriaJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss);
+-		void GetSegmentJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,Gauss* gauss);
+-		void GetJacobianInvert(IssmDouble*  Jinv, IssmDouble* xyz_list,Gauss* gauss);
+-		void GetLprimeFSSSA(IssmDouble* LprimeFSSSA, IssmDouble* xyz_list, Gauss* gauss);
+-		void GetInputValue(IssmDouble* pvalue,IssmDouble* plist, Gauss* gauss,int finiteelement);
+-		void GetInputDerivativeValue(IssmDouble* pvalues, IssmDouble* plist,IssmDouble* xyz_list, Gauss* gauss,int finiteelement);
+-
+-		void BasalNodeIndices(int* pnumindices,int** pindices,int finiteelement);
+-		void SurfaceNodeIndices(int* pnumindices,int** pindices,int finiteelement);
+ 		int  NumberofNodes(int finiteelement);
+-		int  VelocityInterpolation(int fe_stokes);
+ 		int  PressureInterpolation(int fe_stokes);
++		void SurfaceNodeIndices(int* pnumindices,int** pindices,int finiteelement);
+ 		int  TensorInterpolation(int fe_stokes);
++		int  VelocityInterpolation(int fe_stokes);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/classes/Elements/ElementHook.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/ElementHook.cpp	(revision 18924)
++++ ../trunk-jpl/src/c/classes/Elements/ElementHook.cpp	(revision 18925)
+@@ -74,24 +74,22 @@
+ }
+ /*}}}*/
+ 
++void ElementHook::InitHookNeighbors(int* element_ids){/*{{{*/
++	this->hneighbors=new Hook(element_ids,2);
++}
++/*}}}*/
+ void ElementHook::SetHookNodes(int* node_ids,int numnodes,int analysis_counter){/*{{{*/
+ 	if(this->hnodes) this->hnodes[analysis_counter]= new Hook(node_ids,numnodes);
+ }
+ /*}}}*/
+-void ElementHook::InitHookNeighbors(int* element_ids){/*{{{*/
+-	this->hneighbors=new Hook(element_ids,2);
+-}
+-/*}}}*/
+-void ElementHook::SpawnTriaHook(ElementHook* triahook,int index1,int index2,int index3){/*{{{*/
++void ElementHook::SpawnSegHook(ElementHook* triahook,int index1,int index2){/*{{{*/
+ 
+-	/*Create arrow of indices depending on location (0=base 1=surface)*/
+-	int indices[3];
+-	indices[0] = index1;
+-	indices[1] = index2;
+-	indices[2] = index3;
+-
+ 	triahook->numanalyses=this->numanalyses;
+ 
++	int indices[2];
++	indices[0]=index1;
++	indices[1]=index2;
++
+ 	/*Spawn nodes hook*/
+ 	triahook->hnodes=new Hook*[this->numanalyses];
+ 	for(int i=0;i<this->numanalyses;i++){
+@@ -100,24 +98,26 @@
+ 			triahook->hnodes[i]=NULL;
+ 		}
+ 		else{
+-			triahook->hnodes[i]=this->hnodes[i]->Spawn(indices,3);
++			triahook->hnodes[i]=this->hnodes[i]->Spawn(indices,2);
+ 		}
+ 	}
+ 
+-	/*do not spawn hmaterial. material will be taken care of by Penta*/
++	/*do not spawn hmaterial. material will be taken care of by Tria*/
+ 	triahook->hmaterial=NULL;
+-	triahook->hvertices=(Hook*)this->hvertices->Spawn(indices,3);
++	triahook->hvertices=(Hook*)this->hvertices->Spawn(indices,2);
+ 	triahook->hmatpar=(Hook*)this->hmatpar->copy();
+ }
+ /*}}}*/
+-void ElementHook::SpawnSegHook(ElementHook* triahook,int index1,int index2){/*{{{*/
++void ElementHook::SpawnTriaHook(ElementHook* triahook,int index1,int index2,int index3){/*{{{*/
+ 
++	/*Create arrow of indices depending on location (0=base 1=surface)*/
++	int indices[3];
++	indices[0] = index1;
++	indices[1] = index2;
++	indices[2] = index3;
++
+ 	triahook->numanalyses=this->numanalyses;
+ 
+-	int indices[2];
+-	indices[0]=index1;
+-	indices[1]=index2;
+-
+ 	/*Spawn nodes hook*/
+ 	triahook->hnodes=new Hook*[this->numanalyses];
+ 	for(int i=0;i<this->numanalyses;i++){
+@@ -126,13 +126,13 @@
+ 			triahook->hnodes[i]=NULL;
+ 		}
+ 		else{
+-			triahook->hnodes[i]=this->hnodes[i]->Spawn(indices,2);
++			triahook->hnodes[i]=this->hnodes[i]->Spawn(indices,3);
+ 		}
+ 	}
+ 
+-	/*do not spawn hmaterial. material will be taken care of by Tria*/
++	/*do not spawn hmaterial. material will be taken care of by Penta*/
+ 	triahook->hmaterial=NULL;
+-	triahook->hvertices=(Hook*)this->hvertices->Spawn(indices,2);
++	triahook->hvertices=(Hook*)this->hvertices->Spawn(indices,3);
+ 	triahook->hmatpar=(Hook*)this->hmatpar->copy();
+ }
+ /*}}}*/
+Index: ../trunk-jpl/src/c/classes/Elements/SegRef.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/SegRef.cpp	(revision 18924)
++++ ../trunk-jpl/src/c/classes/Elements/SegRef.cpp	(revision 18925)
+@@ -28,86 +28,6 @@
+ /*}}}*/
+ 
+ /*Reference Element numerics*/
+-void SegRef::GetNodalFunctions(IssmDouble* basis,GaussSeg* gauss,int finiteelement){/*{{{*/
+-	/*This routine returns the values of the nodal functions  at the gaussian point.*/
+-
+-	_assert_(basis);
+-
+-	switch(finiteelement){
+-		case P0Enum:
+-			basis[0]=1.;
+-			return;
+-		case P1Enum: case P1DGEnum:
+-			basis[0]=(1.-gauss->coord1)/2.;
+-			basis[1]=(1.+gauss->coord1)/2.;
+-			return;
+-		case P2Enum:
+-			basis[0]=(gauss->coord1-1.)*gauss->coord1/2.;
+-			basis[1]=gauss->coord1*(1.+gauss->coord1)/2.;
+-			basis[2]=(1.-gauss->coord1)*(1.+gauss->coord1);
+-			return;
+-		default:
+-			_error_("Element type "<<EnumToStringx(finiteelement)<<" not supported yet");
+-	}
+-}
+-/*}}}*/
+-void SegRef::GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, GaussSeg* gauss,int finiteelement){/*{{{*/
+-
+-	/*This routine returns the values of the nodal functions derivatives  (with respect to the 
+-	 * actual coordinate system): */
+-	IssmDouble    Jinv;
+-
+-	/*Fetch number of nodes for this finite element*/
+-	int numnodes = this->NumberofNodes(finiteelement);
+-
+-	/*Get nodal functions derivatives in reference triangle*/
+-	IssmDouble* dbasis_ref=xNew<IssmDouble>(numnodes);
+-	GetNodalFunctionsDerivativesReference(dbasis_ref,gauss,finiteelement); 
+-
+-	/*Get Jacobian invert: */
+-	GetJacobianInvert(&Jinv, xyz_list, gauss);
+-
+-	/*Build dbasis: 
+-	 * [dhi/dx]= Jinv*[dhi/dr]
+-	 */
+-	for(int i=0;i<numnodes;i++){
+-		dbasis[i] = Jinv*dbasis_ref[i];
+-	}
+-
+-	/*Clean up*/
+-	xDelete<IssmDouble>(dbasis_ref);
+-
+-}
+-/*}}}*/
+-void SegRef::GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,GaussSeg* gauss,int finiteelement){/*{{{*/
+-	/*This routine returns the values of the nodal functions derivatives  (with respect to the 
+-	 * natural coordinate system) at the gaussian point. */
+-
+-	_assert_(dbasis && gauss);
+-
+-	switch(finiteelement){
+-		case P0Enum:
+-			/*Nodal function 1*/
+-			dbasis[0] = 0.;
+-			break;
+-		case P1Enum: case P1DGEnum:
+-			/*Nodal function 1*/
+-			dbasis[0] = -0.5;
+-			/*Nodal function 2*/
+-			dbasis[1] = 0.5;
+-			return;
+-		case P2Enum:
+-			/*Nodal function 1*/
+-			dbasis[0] = (gauss->coord1-1.)/2. + gauss->coord1/2.;
+-			dbasis[1] = (1.+gauss->coord1)/2. + gauss->coord1/2.;
+-			dbasis[2] = -2.*gauss->coord1;
+-			return;
+-		default:
+-			_error_("Element type "<<EnumToStringx(finiteelement)<<" not supported yet");
+-	}
+-
+-}
+-/*}}}*/
+ void SegRef::GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, GaussSeg* gauss,int finiteelement){/*{{{*/
+ 
+ 	/*From node values of parameter p (plist[0],plist[1]), return parameter derivative value at gaussian 
+@@ -192,6 +112,86 @@
+ 	*Jinv = 1./J;
+ }
+ /*}}}*/
++void SegRef::GetNodalFunctions(IssmDouble* basis,GaussSeg* gauss,int finiteelement){/*{{{*/
++	/*This routine returns the values of the nodal functions  at the gaussian point.*/
++
++	_assert_(basis);
++
++	switch(finiteelement){
++		case P0Enum:
++			basis[0]=1.;
++			return;
++		case P1Enum: case P1DGEnum:
++			basis[0]=(1.-gauss->coord1)/2.;
++			basis[1]=(1.+gauss->coord1)/2.;
++			return;
++		case P2Enum:
++			basis[0]=(gauss->coord1-1.)*gauss->coord1/2.;
++			basis[1]=gauss->coord1*(1.+gauss->coord1)/2.;
++			basis[2]=(1.-gauss->coord1)*(1.+gauss->coord1);
++			return;
++		default:
++			_error_("Element type "<<EnumToStringx(finiteelement)<<" not supported yet");
++	}
++}
++/*}}}*/
++void SegRef::GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, GaussSeg* gauss,int finiteelement){/*{{{*/
++
++	/*This routine returns the values of the nodal functions derivatives  (with respect to the 
++	 * actual coordinate system): */
++	IssmDouble    Jinv;
++
++	/*Fetch number of nodes for this finite element*/
++	int numnodes = this->NumberofNodes(finiteelement);
++
++	/*Get nodal functions derivatives in reference triangle*/
++	IssmDouble* dbasis_ref=xNew<IssmDouble>(numnodes);
++	GetNodalFunctionsDerivativesReference(dbasis_ref,gauss,finiteelement); 
++
++	/*Get Jacobian invert: */
++	GetJacobianInvert(&Jinv, xyz_list, gauss);
++
++	/*Build dbasis: 
++	 * [dhi/dx]= Jinv*[dhi/dr]
++	 */
++	for(int i=0;i<numnodes;i++){
++		dbasis[i] = Jinv*dbasis_ref[i];
++	}
++
++	/*Clean up*/
++	xDelete<IssmDouble>(dbasis_ref);
++
++}
++/*}}}*/
++void SegRef::GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,GaussSeg* gauss,int finiteelement){/*{{{*/
++	/*This routine returns the values of the nodal functions derivatives  (with respect to the 
++	 * natural coordinate system) at the gaussian point. */
++
++	_assert_(dbasis && gauss);
++
++	switch(finiteelement){
++		case P0Enum:
++			/*Nodal function 1*/
++			dbasis[0] = 0.;
++			break;
++		case P1Enum: case P1DGEnum:
++			/*Nodal function 1*/
++			dbasis[0] = -0.5;
++			/*Nodal function 2*/
++			dbasis[1] = 0.5;
++			return;
++		case P2Enum:
++			/*Nodal function 1*/
++			dbasis[0] = (gauss->coord1-1.)/2. + gauss->coord1/2.;
++			dbasis[1] = (1.+gauss->coord1)/2. + gauss->coord1/2.;
++			dbasis[2] = -2.*gauss->coord1;
++			return;
++		default:
++			_error_("Element type "<<EnumToStringx(finiteelement)<<" not supported yet");
++	}
++
++}
++/*}}}*/
+ int  SegRef::NumberofNodes(int finiteelement){/*{{{*/
+ 
+ 	switch(finiteelement){
+Index: ../trunk-jpl/src/c/classes/Elements/TetraRef.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/TetraRef.cpp	(revision 18924)
++++ ../trunk-jpl/src/c/classes/Elements/TetraRef.cpp	(revision 18925)
+@@ -30,6 +30,143 @@
+ /*}}}*/
+ 
+ /*Reference Element numerics*/
++void TetraRef::GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, GaussTetra* gauss,int finiteelement){/*{{{*/
++	/*From node values of parameter p (p_list[0], p_list[1], p_list[2],
++	 * p_list[3], p_list[4] and p_list[4]), return parameter derivative value at
++	 * gaussian point specified by gauss_coord:
++	 *   dp/dx=p_list[0]*dh1/dx+p_list[1]*dh2/dx+p_list[2]*dh3/dx+p_list[3]*dh4/dx+p_list[4]*dh5/dx+p_list[5]*dh6/dx;
++	 *   dp/dy=p_list[0]*dh1/dy+p_list[1]*dh2/dy+p_list[2]*dh3/dy+p_list[3]*dh4/dy+p_list[4]*dh5/dy+p_list[5]*dh6/dy;
++	 *   dp/dz=p_list[0]*dh1/dz+p_list[1]*dh2/dz+p_list[2]*dh3/dz+p_list[3]*dh4/dz+p_list[4]*dh5/dz+p_list[5]*dh6/dz;
++	 *
++	 *   p is a vector of size 3x1 already allocated.
++	 *
++	 * WARNING: For a significant gain in performance, it is better to use
++	 * static memory allocation instead of dynamic.
++	 */
++
++	/*Allocate derivatives of basis functions*/
++	IssmDouble  dbasis[3*NUMNODESMAX];
++
++	/*Fetch number of nodes for this finite element*/
++	int numnodes = this->NumberofNodes(finiteelement);
++	_assert_(numnodes<=NUMNODESMAX);
++
++	/*Get basis functions derivatives at this point*/
++	GetNodalFunctionsDerivatives(&dbasis[0],xyz_list,gauss,finiteelement);
++
++	/*Calculate parameter for this Gauss point*/
++	IssmDouble dpx=0.;
++	IssmDouble dpy=0.;
++	IssmDouble dpz=0.;
++	for(int i=0;i<numnodes;i++) dpx += dbasis[0*numnodes+i]*plist[i];
++	for(int i=0;i<numnodes;i++) dpy += dbasis[1*numnodes+i]*plist[i];
++	for(int i=0;i<numnodes;i++) dpz += dbasis[2*numnodes+i]*plist[i];
++
++	/*Assign values*/
++	p[0]=dpx;
++	p[1]=dpy;
++	p[2]=dpz;
++}
++/*}}}*/
++void TetraRef::GetInputValue(IssmDouble* p, IssmDouble* plist, Gauss* gauss,int finiteelement){/*{{{*/
++	/* WARNING: For a significant gain in performance, it is better to use
++	 * static memory allocation instead of dynamic.*/
++
++	/*Allocate basis functions*/
++	IssmDouble  basis[NUMNODESMAX];
++
++	/*Fetch number of nodes for this finite element*/
++	int numnodes = this->NumberofNodes(finiteelement);
++	_assert_(numnodes<=NUMNODESMAX);
++
++	/*Get basis functions at this point*/
++	GetNodalFunctions(&basis[0],gauss,finiteelement);
++
++	/*Calculate parameter for this Gauss point*/
++	IssmDouble value =0.;
++	for(int i=0;i<numnodes;i++) value += basis[i]*plist[i];
++
++	/*Assign output pointer*/
++	*p = value;
++}
++/*}}}*/
++void TetraRef::GetJacobian(IssmDouble* J, IssmDouble* xyz_list,GaussTetra* gauss){/*{{{*/
++	/*The Jacobian is constant over the element, discard the gaussian points. 
++	 * J is assumed to have been allocated of size 1*/
++
++	IssmDouble x1=xyz_list[3*0+0];
++	IssmDouble x2=xyz_list[3*1+0];
++	IssmDouble x3=xyz_list[3*2+0];
++	IssmDouble x4=xyz_list[3*3+0];
++
++	IssmDouble y1=xyz_list[3*0+1];
++	IssmDouble y2=xyz_list[3*1+1];
++	IssmDouble y3=xyz_list[3*2+1];
++	IssmDouble y4=xyz_list[3*3+1];
++
++	IssmDouble z1=xyz_list[3*0+2];
++	IssmDouble z2=xyz_list[3*1+2];
++	IssmDouble z3=xyz_list[3*2+2];
++	IssmDouble z4=xyz_list[3*3+2];
++
++	J[NDOF3*0+0] = x2-x1;
++	J[NDOF3*0+1] = y2-y1;
++	J[NDOF3*0+2] = z2-z1;
++
++	J[NDOF3*1+0] = x3-x1;
++	J[NDOF3*1+1] = y3-y1;
++	J[NDOF3*1+2] = z3-z1;
++
++	J[NDOF3*2+0] = x4-x1;
++	J[NDOF3*2+1] = y4-y1;
++	J[NDOF3*2+2] = z4-z1;
++}
++/*}}}*/
++void TetraRef::GetJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussTetra* gauss){/*{{{*/
++	/*The Jacobian determinant is constant over the element, discard the gaussian points. 
++	 * J is assumed to have been allocated of size NDOF2xNDOF2.*/
++	IssmDouble J[3][3];
++
++	/*Call Jacobian routine to get the jacobian:*/
++	GetJacobian(&J[0][0],xyz_list, gauss);
++
++	/*Get Determinant*/
++	Matrix3x3Determinant(Jdet,&J[0][0]);
++	if(*Jdet<0) _error_("negative jacobian determinant!");
++
++}
++/*}}}*/
++void TetraRef::GetJacobianDeterminantFace(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussTetra* gauss){/*{{{*/
++	/*The Jacobian determinant is constant over the element, discard the gaussian points. 
++	 * J is assumed to have been allocated of size NDOF2xNDOF2.*/
++
++	IssmDouble x1=xyz_list[3*0+0];
++	IssmDouble y1=xyz_list[3*0+1];
++	IssmDouble z1=xyz_list[3*0+2];
++	IssmDouble x2=xyz_list[3*1+0];
++	IssmDouble y2=xyz_list[3*1+1];
++	IssmDouble z2=xyz_list[3*1+2];
++	IssmDouble x3=xyz_list[3*2+0];
++	IssmDouble y3=xyz_list[3*2+1];
++	IssmDouble z3=xyz_list[3*2+2];
++
++	/*Jdet = norm( AB ^ AC ) / (2 * area of the reference triangle), with areaRef=sqrt(3) */
++	*Jdet=SQRT3/6.*pow(pow(((y2-y1)*(z3-z1)-(z2-z1)*(y3-y1)),2)+pow(((z2-z1)*(x3-x1)-(x2-x1)*(z3-z1)),2)+pow(((x2-x1)*(y3-y1)-(y2-y1)*(x3-x1)),2),0.5);
++	if(*Jdet<0) _error_("negative jacobian determinant!");
++}
++/*}}}*/
++void TetraRef::GetJacobianInvert(IssmDouble* Jinv, IssmDouble* xyz_list,GaussTetra* gauss){/*{{{*/
++
++	/*Jacobian*/
++	IssmDouble J[3][3];
++
++	/*Call Jacobian routine to get the jacobian:*/
++	GetJacobian(&J[0][0], xyz_list, gauss);
++
++	/*Invert Jacobian matrix: */
++	Matrix3x3Invert(Jinv,&J[0][0]);
++}
++/*}}}*/
+ void TetraRef::GetNodalFunctions(IssmDouble* basis,Gauss* gauss_in,int finiteelement){/*{{{*/
+ 	/*This routine returns the values of the nodal functions  at the gaussian point.*/
+ 
+@@ -208,143 +345,6 @@
+ 
+ }
+ /*}}}*/
+-void TetraRef::GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, GaussTetra* gauss,int finiteelement){/*{{{*/
+-	/*From node values of parameter p (p_list[0], p_list[1], p_list[2],
+-	 * p_list[3], p_list[4] and p_list[4]), return parameter derivative value at
+-	 * gaussian point specified by gauss_coord:
+-	 *   dp/dx=p_list[0]*dh1/dx+p_list[1]*dh2/dx+p_list[2]*dh3/dx+p_list[3]*dh4/dx+p_list[4]*dh5/dx+p_list[5]*dh6/dx;
+-	 *   dp/dy=p_list[0]*dh1/dy+p_list[1]*dh2/dy+p_list[2]*dh3/dy+p_list[3]*dh4/dy+p_list[4]*dh5/dy+p_list[5]*dh6/dy;
+-	 *   dp/dz=p_list[0]*dh1/dz+p_list[1]*dh2/dz+p_list[2]*dh3/dz+p_list[3]*dh4/dz+p_list[4]*dh5/dz+p_list[5]*dh6/dz;
+-	 *
+-	 *   p is a vector of size 3x1 already allocated.
+-	 *
+-	 * WARNING: For a significant gain in performance, it is better to use
+-	 * static memory allocation instead of dynamic.
+-	 */
+-
+-	/*Allocate derivatives of basis functions*/
+-	IssmDouble  dbasis[3*NUMNODESMAX];
+-
+-	/*Fetch number of nodes for this finite element*/
+-	int numnodes = this->NumberofNodes(finiteelement);
+-	_assert_(numnodes<=NUMNODESMAX);
+-
+-	/*Get basis functions derivatives at this point*/
+-	GetNodalFunctionsDerivatives(&dbasis[0],xyz_list,gauss,finiteelement);
+-
+-	/*Calculate parameter for this Gauss point*/
+-	IssmDouble dpx=0.;
+-	IssmDouble dpy=0.;
+-	IssmDouble dpz=0.;
+-	for(int i=0;i<numnodes;i++) dpx += dbasis[0*numnodes+i]*plist[i];
+-	for(int i=0;i<numnodes;i++) dpy += dbasis[1*numnodes+i]*plist[i];
+-	for(int i=0;i<numnodes;i++) dpz += dbasis[2*numnodes+i]*plist[i];
+-
+-	/*Assign values*/
+-	p[0]=dpx;
+-	p[1]=dpy;
+-	p[2]=dpz;
+-}
+-/*}}}*/
+-void TetraRef::GetInputValue(IssmDouble* p, IssmDouble* plist, Gauss* gauss,int finiteelement){/*{{{*/
+-	/* WARNING: For a significant gain in performance, it is better to use
+-	 * static memory allocation instead of dynamic.*/
+-
+-	/*Allocate basis functions*/
+-	IssmDouble  basis[NUMNODESMAX];
+-
+-	/*Fetch number of nodes for this finite element*/
+-	int numnodes = this->NumberofNodes(finiteelement);
+-	_assert_(numnodes<=NUMNODESMAX);
+-
+-	/*Get basis functions at this point*/
+-	GetNodalFunctions(&basis[0],gauss,finiteelement);
+-
+-	/*Calculate parameter for this Gauss point*/
+-	IssmDouble value =0.;
+-	for(int i=0;i<numnodes;i++) value += basis[i]*plist[i];
+-
+-	/*Assign output pointer*/
+-	*p = value;
+-}
+-/*}}}*/
+-void TetraRef::GetJacobian(IssmDouble* J, IssmDouble* xyz_list,GaussTetra* gauss){/*{{{*/
+-	/*The Jacobian is constant over the element, discard the gaussian points. 
+-	 * J is assumed to have been allocated of size 1*/
+-
+-	IssmDouble x1=xyz_list[3*0+0];
+-	IssmDouble x2=xyz_list[3*1+0];
+-	IssmDouble x3=xyz_list[3*2+0];
+-	IssmDouble x4=xyz_list[3*3+0];
+-
+-	IssmDouble y1=xyz_list[3*0+1];
+-	IssmDouble y2=xyz_list[3*1+1];
+-	IssmDouble y3=xyz_list[3*2+1];
+-	IssmDouble y4=xyz_list[3*3+1];
+-
+-	IssmDouble z1=xyz_list[3*0+2];
+-	IssmDouble z2=xyz_list[3*1+2];
+-	IssmDouble z3=xyz_list[3*2+2];
+-	IssmDouble z4=xyz_list[3*3+2];
+-
+-	J[NDOF3*0+0] = x2-x1;
+-	J[NDOF3*0+1] = y2-y1;
+-	J[NDOF3*0+2] = z2-z1;
+-
+-	J[NDOF3*1+0] = x3-x1;
+-	J[NDOF3*1+1] = y3-y1;
+-	J[NDOF3*1+2] = z3-z1;
+-
+-	J[NDOF3*2+0] = x4-x1;
+-	J[NDOF3*2+1] = y4-y1;
+-	J[NDOF3*2+2] = z4-z1;
+-}
+-/*}}}*/
+-void TetraRef::GetJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussTetra* gauss){/*{{{*/
+-	/*The Jacobian determinant is constant over the element, discard the gaussian points. 
+-	 * J is assumed to have been allocated of size NDOF2xNDOF2.*/
+-	IssmDouble J[3][3];
+-
+-	/*Call Jacobian routine to get the jacobian:*/
+-	GetJacobian(&J[0][0],xyz_list, gauss);
+-
+-	/*Get Determinant*/
+-	Matrix3x3Determinant(Jdet,&J[0][0]);
+-	if(*Jdet<0) _error_("negative jacobian determinant!");
+-
+-}
+-/*}}}*/
+-void TetraRef::GetJacobianDeterminantFace(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussTetra* gauss){/*{{{*/
+-	/*The Jacobian determinant is constant over the element, discard the gaussian points. 
+-	 * J is assumed to have been allocated of size NDOF2xNDOF2.*/
+-
+-	IssmDouble x1=xyz_list[3*0+0];
+-	IssmDouble y1=xyz_list[3*0+1];
+-	IssmDouble z1=xyz_list[3*0+2];
+-	IssmDouble x2=xyz_list[3*1+0];
+-	IssmDouble y2=xyz_list[3*1+1];
+-	IssmDouble z2=xyz_list[3*1+2];
+-	IssmDouble x3=xyz_list[3*2+0];
+-	IssmDouble y3=xyz_list[3*2+1];
+-	IssmDouble z3=xyz_list[3*2+2];
+-
+-	/*Jdet = norm( AB ^ AC ) / (2 * area of the reference triangle), with areaRef=sqrt(3) */
+-	*Jdet=SQRT3/6.*pow(pow(((y2-y1)*(z3-z1)-(z2-z1)*(y3-y1)),2)+pow(((z2-z1)*(x3-x1)-(x2-x1)*(z3-z1)),2)+pow(((x2-x1)*(y3-y1)-(y2-y1)*(x3-x1)),2),0.5);
+-	if(*Jdet<0) _error_("negative jacobian determinant!");
+-}
+-/*}}}*/
+-void TetraRef::GetJacobianInvert(IssmDouble* Jinv, IssmDouble* xyz_list,GaussTetra* gauss){/*{{{*/
+-
+-	/*Jacobian*/
+-	IssmDouble J[3][3];
+-
+-	/*Call Jacobian routine to get the jacobian:*/
+-	GetJacobian(&J[0][0], xyz_list, gauss);
+-
+-	/*Invert Jacobian matrix: */
+-	Matrix3x3Invert(Jinv,&J[0][0]);
+-}
+-/*}}}*/
+ int  TetraRef::NumberofNodes(int finiteelement){/*{{{*/
+ 
+ 	switch(finiteelement){
+@@ -367,22 +367,6 @@
+ 	return -1;
+ }
+ /*}}}*/
+-int  TetraRef::VelocityInterpolation(int fe_stokes){/*{{{*/
+-
+-	switch(fe_stokes){
+-		case P1P1Enum:          return P1Enum;
+-		case P1P1GLSEnum:       return P1Enum;
+-		case MINIcondensedEnum: return P1bubbleEnum;
+-		case MINIEnum:          return P1bubbleEnum;
+-		case TaylorHoodEnum:    return P2Enum;
+-		case LATaylorHoodEnum:  return P2Enum;
+-		case XTaylorHoodEnum:   return P2Enum;
+-		default:       _error_("Element type "<<EnumToStringx(fe_stokes)<<" not supported yet");
+-	}
+-
+-	return -1;
+-}
+-/*}}}*/
+ int  TetraRef::PressureInterpolation(int fe_stokes){/*{{{*/
+ 
+ 	switch(fe_stokes){
+@@ -407,3 +391,19 @@
+ 	}
+ }
+ /*}}}*/
++int  TetraRef::VelocityInterpolation(int fe_stokes){/*{{{*/
++
++	switch(fe_stokes){
++		case P1P1Enum:          return P1Enum;
++		case P1P1GLSEnum:       return P1Enum;
++		case MINIcondensedEnum: return P1bubbleEnum;
++		case MINIEnum:          return P1bubbleEnum;
++		case TaylorHoodEnum:    return P2Enum;
++		case LATaylorHoodEnum:  return P2Enum;
++		case XTaylorHoodEnum:   return P2Enum;
++		default:       _error_("Element type "<<EnumToStringx(fe_stokes)<<" not supported yet");
++	}
++
++	return -1;
++}
++/*}}}*/
+Index: ../trunk-jpl/src/c/classes/Elements/ElementHook.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/ElementHook.h	(revision 18924)
++++ ../trunk-jpl/src/c/classes/Elements/ElementHook.h	(revision 18925)
+@@ -23,10 +23,10 @@
+ 		ElementHook(int in_numanalyses,int material_id,int numvertices,IoModel* iomodel);
+ 		~ElementHook();
+ 
++		void InitHookNeighbors(int* element_ids);               //3d only
+ 		void SetHookNodes(int* node_ids,int numnodes,int analysis_counter);
++		void SpawnSegHook(ElementHook* triahook,int ndex1,int index2); //2d only
+ 		void SpawnTriaHook(ElementHook* triahook,int index1,int index2,int index3); //3d only
+-		void SpawnSegHook(ElementHook* triahook,int ndex1,int index2); //2d only
+-		void InitHookNeighbors(int* element_ids);               //3d only
+ };
+ 
+ #endif //ifndef _ELEMENTHOOK_H_
+Index: ../trunk-jpl/src/c/classes/Elements/SegRef.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/SegRef.h	(revision 18924)
++++ ../trunk-jpl/src/c/classes/Elements/SegRef.h	(revision 18925)
+@@ -15,14 +15,14 @@
+ 		SegRef();
+ 		~SegRef();
+ 
++		void GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, GaussSeg* gauss,int finiteelement);
++		void GetInputValue(IssmDouble* p, IssmDouble* plist, GaussSeg* gauss,int finiteelement);
+ 		void GetJacobian(IssmDouble* J, IssmDouble* xyz_list,GaussSeg* gauss);
+ 		void GetJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussSeg* gauss);
+ 		void GetJacobianInvert(IssmDouble* Jinv, IssmDouble* xyz_list,GaussSeg* gauss);
+ 		void GetNodalFunctions(IssmDouble* basis,GaussSeg* gauss,int finiteelement);
+ 		void GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, GaussSeg* gauss,int finiteelement);
+ 		void GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,GaussSeg* gauss,int finiteelement);
+-		void GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, GaussSeg* gauss,int finiteelement);
+-		void GetInputValue(IssmDouble* p, IssmDouble* plist, GaussSeg* gauss,int finiteelement);
+ 		int  NumberofNodes(int finiteelement);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/classes/Elements/TetraRef.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/TetraRef.h	(revision 18924)
++++ ../trunk-jpl/src/c/classes/Elements/TetraRef.h	(revision 18925)
+@@ -15,6 +15,8 @@
+ 		TetraRef();
+ 		~TetraRef();
+ 
++		void GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, GaussTetra* gauss,int finiteelement);
++		void GetInputValue(IssmDouble* p, IssmDouble* plist, Gauss* gauss,int finiteelement);
+ 		void GetJacobian(IssmDouble* J, IssmDouble* xyz_list,GaussTetra* gauss);
+ 		void GetJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussTetra* gauss);
+ 		void GetJacobianDeterminantFace(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussTetra* gauss);
+@@ -22,12 +24,9 @@
+ 		void GetNodalFunctions(IssmDouble* basis,Gauss* gauss_in,int finiteelement);
+ 		void GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, GaussTetra* gauss,int finiteelement);
+ 		void GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,GaussTetra* gauss,int finiteelement);
+-		void GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, GaussTetra* gauss,int finiteelement);
+-		void GetInputValue(IssmDouble* p, IssmDouble* plist, Gauss* gauss,int finiteelement);
+-
+ 		int  NumberofNodes(int finiteelement);
+-		int  VelocityInterpolation(int fe_stokes);
+ 		int  PressureInterpolation(int fe_stokes);
+ 		int  TensorInterpolation(int fe_stokes);
++		int  VelocityInterpolation(int fe_stokes);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/classes/Elements/TriaRef.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/TriaRef.cpp	(revision 18924)
++++ ../trunk-jpl/src/c/classes/Elements/TriaRef.cpp	(revision 18925)
+@@ -31,54 +31,60 @@
+ /*}}}*/
+ 
+ /*Reference Element numerics*/
+-void TriaRef::GetSegmentBFlux(IssmDouble* B,Gauss* gauss, int index1,int index2,int finiteelement){/*{{{*/
+-	/*Compute B  matrix. B=[phi1 phi2 -phi3 -phi4]
++void TriaRef::GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, Gauss* gauss,int finiteelement){/*{{{*/
++	/*From node values of parameter p (plist[0],plist[1],plist[2]), return parameter derivative value at gaussian 
++	 * point specified by gauss_basis:
++	 *   dp/dx=plist[0]*dh1/dx+plist[1]*dh2/dx+plist[2]*dh3/dx
++	 *   dp/dx=plist[0]*dh1/dx+plist[1]*dh2/dx+plist[2]*dh3/dx
+ 	 *
+-	 * and phi1=phi3 phi2=phi4
++	 * p is a vector already allocated.
+ 	 *
+-	 * We assume B has been allocated already, of size: 1x4
++	 * WARNING: For a significant gain in performance, it is better to use
++	 * static memory allocation instead of dynamic.
+ 	 */
+ 
++	/*Allocate derivatives of basis functions*/
++	IssmDouble  dbasis[2*NUMNODESMAX];
++
+ 	/*Fetch number of nodes for this finite element*/
+ 	int numnodes = this->NumberofNodes(finiteelement);
++	_assert_(numnodes<=NUMNODESMAX);
+ 
+-	/*Get nodal functions*/
+-	IssmDouble* basis=xNew<IssmDouble>(numnodes);
+-	GetNodalFunctions(basis,gauss,finiteelement);
++	/*Get basis functions derivatives at this point*/
++	GetNodalFunctionsDerivatives(&dbasis[0],xyz_list,gauss,finiteelement);
+ 
+-	/*Build B for this segment*/
+-	B[0] = +basis[index1];
+-	B[1] = +basis[index2];
+-	B[2] = -basis[index1];
+-	B[3] = -basis[index2];
++	/*Calculate parameter for this Gauss point*/
++	IssmDouble dpx=0.;
++	IssmDouble dpy=0.;
++	for(int i=0;i<numnodes;i++) dpx += dbasis[0*numnodes+i]*plist[i];
++	for(int i=0;i<numnodes;i++) dpy += dbasis[1*numnodes+i]*plist[i];
+ 
+-	/*Clean-up*/
+-	xDelete<IssmDouble>(basis);
++	/*Assign values*/
++	p[0]=dpx;
++	p[1]=dpy;
++
+ }
+ /*}}}*/
+-void TriaRef::GetSegmentBprimeFlux(IssmDouble* Bprime,Gauss* gauss, int index1,int index2,int finiteelement){/*{{{*/
+-	/*Compute Bprime  matrix. Bprime=[phi1 phi2 phi3 phi4]
+-	 *
+-	 * and phi1=phi3 phi2=phi4
+-	 *
+-	 * We assume Bprime has been allocated already, of size: 1x4
+-	 */
++void TriaRef::GetInputValue(IssmDouble* p, IssmDouble* plist, Gauss* gauss,int finiteelement){/*{{{*/
++	/* WARNING: For a significant gain in performance, it is better to use
++	 * static memory allocation instead of dynamic.*/
+ 
++	/*Allocate basis functions*/
++	IssmDouble  basis[NUMNODESMAX];
++
+ 	/*Fetch number of nodes for this finite element*/
+ 	int numnodes = this->NumberofNodes(finiteelement);
++	_assert_(numnodes<=NUMNODESMAX);
+ 
+-	/*Get nodal functions*/
+-	IssmDouble* basis=xNew<IssmDouble>(numnodes);
+-	GetNodalFunctions(basis,gauss,finiteelement);
++	/*Get basis functions at this point*/
++	GetNodalFunctions(&basis[0],gauss,finiteelement);
+ 
+-	/*Build B'*/
+-	Bprime[0] = basis[index1];
+-	Bprime[1] = basis[index2];
+-	Bprime[2] = basis[index1];
+-	Bprime[3] = basis[index2];
++	/*Calculate parameter for this Gauss point*/
++	IssmDouble value =0.;
++	for(int i=0;i<numnodes;i++) value += basis[i]*plist[i];
+ 
+-	/*Clean-up*/
+-	xDelete<IssmDouble>(basis);
++	/*Assign output pointer*/
++	*p = value;
+ }
+ /*}}}*/
+ void TriaRef::GetJacobian(IssmDouble* J, IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+@@ -98,20 +104,6 @@
+ 	J[2*1+1] = SQRT3/6.0*(2*y3-y1-y2);
+ }
+ /*}}}*/
+-void TriaRef::GetSegmentJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+-	/*The Jacobian determinant is constant over the element, discard the gaussian points. 
+-	 * J is assumed to have been allocated*/
+-
+-	IssmDouble x1 = xyz_list[3*0+0];
+-	IssmDouble y1 = xyz_list[3*0+1];
+-	IssmDouble x2 = xyz_list[3*1+0];
+-	IssmDouble y2 = xyz_list[3*1+1];
+-
+-	*Jdet = .5*sqrt(pow(x2-x1,2) + pow(y2-y1,2));
+-	if(*Jdet<0) _error_("negative jacobian determinant!");
+-
+-}
+-/*}}}*/
+ void TriaRef::GetJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*The Jacobian determinant is constant over the element, discard the gaussian points. 
+ 	 * J is assumed to have been allocated of size NDOF2xNDOF2.*/
+@@ -194,45 +186,6 @@
+ 	}
+ }
+ /*}}}*/
+-void TriaRef::GetSegmentNodalFunctions(IssmDouble* basis,Gauss* gauss,int index1,int index2,int finiteelement){/*{{{*/
+-	/*This routine returns the values of the nodal functions  at the gaussian point.*/
+-
+-	_assert_(index1>=0 && index1<3);
+-	_assert_(index2>=0 && index2<3);
+-
+-	/*Fetch number of nodes for this finite element*/
+-	int numnodes = this->NumberofNodes(finiteelement);
+-
+-	/*Get nodal functions*/
+-	IssmDouble* triabasis=xNew<IssmDouble>(numnodes);
+-	GetNodalFunctions(triabasis,gauss,finiteelement);
+-
+-	switch(finiteelement){
+-		case P1Enum: case P1DGEnum:
+-			basis[0]=triabasis[index1];
+-			basis[1]=triabasis[index2];
+-			xDelete<IssmDouble>(triabasis);
+-			return;
+-		case P1bubbleEnum: case P1bubblecondensedEnum:
+-			basis[0]=triabasis[index1];
+-			basis[1]=triabasis[index2];
+-			xDelete<IssmDouble>(triabasis);
+-			return;
+-		case P2Enum:
+-			_assert_(index2<index1);
+-			basis[0]=triabasis[index1];
+-			basis[1]=triabasis[index2];
+-			basis[2]=triabasis[3+index2-1];
+-			xDelete<IssmDouble>(triabasis);
+-			return;
+-		default:
+-			_error_("Element type "<<EnumToStringx(finiteelement)<<" not supported yet");
+-	}
+-
+-	/*Clean up*/
+-	xDelete<IssmDouble>(triabasis);
+-}
+-/*}}}*/
+ void TriaRef::GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, Gauss* gauss,int finiteelement){/*{{{*/
+ 
+ 	/*This routine returns the values of the nodal functions derivatives  (with respect to the 
+@@ -353,134 +306,109 @@
+ 
+ }
+ /*}}}*/
+-void TriaRef::GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, Gauss* gauss,int finiteelement){/*{{{*/
+-	/*From node values of parameter p (plist[0],plist[1],plist[2]), return parameter derivative value at gaussian 
+-	 * point specified by gauss_basis:
+-	 *   dp/dx=plist[0]*dh1/dx+plist[1]*dh2/dx+plist[2]*dh3/dx
+-	 *   dp/dx=plist[0]*dh1/dx+plist[1]*dh2/dx+plist[2]*dh3/dx
++void TriaRef::GetSegmentBFlux(IssmDouble* B,Gauss* gauss, int index1,int index2,int finiteelement){/*{{{*/
++	/*Compute B  matrix. B=[phi1 phi2 -phi3 -phi4]
+ 	 *
+-	 * p is a vector already allocated.
++	 * and phi1=phi3 phi2=phi4
+ 	 *
+-	 * WARNING: For a significant gain in performance, it is better to use
+-	 * static memory allocation instead of dynamic.
++	 * We assume B has been allocated already, of size: 1x4
+ 	 */
+ 
+-	/*Allocate derivatives of basis functions*/
+-	IssmDouble  dbasis[2*NUMNODESMAX];
+-
+ 	/*Fetch number of nodes for this finite element*/
+ 	int numnodes = this->NumberofNodes(finiteelement);
+-	_assert_(numnodes<=NUMNODESMAX);
+ 
+-	/*Get basis functions derivatives at this point*/
+-	GetNodalFunctionsDerivatives(&dbasis[0],xyz_list,gauss,finiteelement);
++	/*Get nodal functions*/
++	IssmDouble* basis=xNew<IssmDouble>(numnodes);
++	GetNodalFunctions(basis,gauss,finiteelement);
+ 
+-	/*Calculate parameter for this Gauss point*/
+-	IssmDouble dpx=0.;
+-	IssmDouble dpy=0.;
+-	for(int i=0;i<numnodes;i++) dpx += dbasis[0*numnodes+i]*plist[i];
+-	for(int i=0;i<numnodes;i++) dpy += dbasis[1*numnodes+i]*plist[i];
++	/*Build B for this segment*/
++	B[0] = +basis[index1];
++	B[1] = +basis[index2];
++	B[2] = -basis[index1];
++	B[3] = -basis[index2];
+ 
+-	/*Assign values*/
+-	p[0]=dpx;
+-	p[1]=dpy;
+-
++	/*Clean-up*/
++	xDelete<IssmDouble>(basis);
+ }
+ /*}}}*/
+-void TriaRef::GetInputValue(IssmDouble* p, IssmDouble* plist, Gauss* gauss,int finiteelement){/*{{{*/
+-	/* WARNING: For a significant gain in performance, it is better to use
+-	 * static memory allocation instead of dynamic.*/
++void TriaRef::GetSegmentBprimeFlux(IssmDouble* Bprime,Gauss* gauss, int index1,int index2,int finiteelement){/*{{{*/
++	/*Compute Bprime  matrix. Bprime=[phi1 phi2 phi3 phi4]
++	 *
++	 * and phi1=phi3 phi2=phi4
++	 *
++	 * We assume Bprime has been allocated already, of size: 1x4
++	 */
+ 
+-	/*Allocate basis functions*/
+-	IssmDouble  basis[NUMNODESMAX];
+-
+ 	/*Fetch number of nodes for this finite element*/
+ 	int numnodes = this->NumberofNodes(finiteelement);
+-	_assert_(numnodes<=NUMNODESMAX);
+ 
+-	/*Get basis functions at this point*/
+-	GetNodalFunctions(&basis[0],gauss,finiteelement);
++	/*Get nodal functions*/
++	IssmDouble* basis=xNew<IssmDouble>(numnodes);
++	GetNodalFunctions(basis,gauss,finiteelement);
+ 
+-	/*Calculate parameter for this Gauss point*/
+-	IssmDouble value =0.;
+-	for(int i=0;i<numnodes;i++) value += basis[i]*plist[i];
++	/*Build B'*/
++	Bprime[0] = basis[index1];
++	Bprime[1] = basis[index2];
++	Bprime[2] = basis[index1];
++	Bprime[3] = basis[index2];
+ 
+-	/*Assign output pointer*/
+-	*p = value;
++	/*Clean-up*/
++	xDelete<IssmDouble>(basis);
+ }
+ /*}}}*/
+-int  TriaRef::NumberofNodes(int finiteelement){/*{{{*/
++void TriaRef::GetSegmentJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++	/*The Jacobian determinant is constant over the element, discard the gaussian points. 
++	 * J is assumed to have been allocated*/
+ 
+-	switch(finiteelement){
+-		case NoneEnum:                return 0;
+-		case P0Enum:                  return NUMNODESP0;
+-		case P1Enum:                  return NUMNODESP1;
+-		case P1DGEnum:                return NUMNODESP1;
+-		case P1bubbleEnum:            return NUMNODESP1b;
+-		case P1bubblecondensedEnum:   return NUMNODESP1b;
+-		case P2Enum:                  return NUMNODESP2;
+-		case P2bubbleEnum:            return NUMNODESP2b;
+-		case P2bubblecondensedEnum:   return NUMNODESP2b;
+-		case P1P1Enum:                return NUMNODESP1*2;
+-		case P1P1GLSEnum:             return NUMNODESP1*2;
+-		case MINIcondensedEnum:       return NUMNODESP1b+NUMNODESP1;
+-		case MINIEnum:                return NUMNODESP1b+NUMNODESP1;
+-		case TaylorHoodEnum:          return NUMNODESP2+NUMNODESP1;
+-		case LATaylorHoodEnum:        return NUMNODESP2;
+-		case XTaylorHoodEnum:         return NUMNODESP2+NUMNODESP1;
+-		case CrouzeixRaviartEnum:     return NUMNODESP2b+NUMNODESP1;
+-		case LACrouzeixRaviartEnum:   return NUMNODESP2b;
+-		default: _error_("Element type "<<EnumToStringx(finiteelement)<<" not supported yet");
+-	}
++	IssmDouble x1 = xyz_list[3*0+0];
++	IssmDouble y1 = xyz_list[3*0+1];
++	IssmDouble x2 = xyz_list[3*1+0];
++	IssmDouble y2 = xyz_list[3*1+1];
+ 
+-	return -1;
++	*Jdet = .5*sqrt(pow(x2-x1,2) + pow(y2-y1,2));
++	if(*Jdet<0) _error_("negative jacobian determinant!");
++
+ }
+ /*}}}*/
+-int  TriaRef::VelocityInterpolation(int fe_stokes){/*{{{*/
++void TriaRef::GetSegmentNodalFunctions(IssmDouble* basis,Gauss* gauss,int index1,int index2,int finiteelement){/*{{{*/
++	/*This routine returns the values of the nodal functions  at the gaussian point.*/
+ 
+-	switch(fe_stokes){
+-		case P1P1Enum:              return P1Enum;
+-		case P1P1GLSEnum:           return P1Enum;
+-		case MINIcondensedEnum:     return P1bubbleEnum;
+-		case MINIEnum:              return P1bubbleEnum;
+-		case TaylorHoodEnum:        return P2Enum;
+-		case LATaylorHoodEnum:      return P2Enum;
+-		case XTaylorHoodEnum:       return P2Enum;
+-		case CrouzeixRaviartEnum:   return P2bubbleEnum;
+-		case LACrouzeixRaviartEnum: return P2bubbleEnum;
+-		default:       _error_("Element type "<<EnumToStringx(fe_stokes)<<" not supported yet");
+-	}
++	_assert_(index1>=0 && index1<3);
++	_assert_(index2>=0 && index2<3);
+ 
+-	return -1;
+-}
+-/*}}}*/
+-int  TriaRef::PressureInterpolation(int fe_stokes){/*{{{*/
++	/*Fetch number of nodes for this finite element*/
++	int numnodes = this->NumberofNodes(finiteelement);
+ 
+-	switch(fe_stokes){
+-		case P1P1Enum:              return P1Enum;
+-		case P1P1GLSEnum:           return P1Enum;
+-		case MINIcondensedEnum:     return P1Enum;
+-		case MINIEnum:              return P1Enum;
+-		case TaylorHoodEnum:        return P1Enum;
+-		case LATaylorHoodEnum:      return NoneEnum;
+-		case XTaylorHoodEnum:       return P1Enum;
+-		case CrouzeixRaviartEnum:   return P1DGEnum;
+-		case LACrouzeixRaviartEnum: return NoneEnum;
+-		default:       _error_("Element type "<<EnumToStringx(fe_stokes)<<" not supported yet");
++	/*Get nodal functions*/
++	IssmDouble* triabasis=xNew<IssmDouble>(numnodes);
++	GetNodalFunctions(triabasis,gauss,finiteelement);
++
++	switch(finiteelement){
++		case P1Enum: case P1DGEnum:
++			basis[0]=triabasis[index1];
++			basis[1]=triabasis[index2];
++			xDelete<IssmDouble>(triabasis);
++			return;
++		case P1bubbleEnum: case P1bubblecondensedEnum:
++			basis[0]=triabasis[index1];
++			basis[1]=triabasis[index2];
++			xDelete<IssmDouble>(triabasis);
++			return;
++		case P2Enum:
++			_assert_(index2<index1);
++			basis[0]=triabasis[index1];
++			basis[1]=triabasis[index2];
++			basis[2]=triabasis[3+index2-1];
++			xDelete<IssmDouble>(triabasis);
++			return;
++		default:
++			_error_("Element type "<<EnumToStringx(finiteelement)<<" not supported yet");
+ 	}
+ 
+-	return -1;
++	/*Clean up*/
++	xDelete<IssmDouble>(triabasis);
+ }
+ /*}}}*/
+-int  TriaRef::TensorInterpolation(int fe_stokes){/*{{{*/
+-	/*This routine returns the values of the nodal functions  at the gaussian point.*/
+-
+-	switch(fe_stokes){
+-		case XTaylorHoodEnum: return P1DGEnum;
+-		default: _error_("Element type "<<EnumToStringx(fe_stokes)<<" not supported yet");
+-	}
+-}
+-/*}}}*/
+ void TriaRef::NodeOnEdgeIndices(int* pnumindices,int** pindices,int index,int finiteelement){/*{{{*/
+ 
+ 	/*Output*/
+@@ -540,3 +468,75 @@
+ 	*pindices    = indices;
+ }
+ /*}}}*/
++int  TriaRef::NumberofNodes(int finiteelement){/*{{{*/
++
++	switch(finiteelement){
++		case NoneEnum:                return 0;
++		case P0Enum:                  return NUMNODESP0;
++		case P1Enum:                  return NUMNODESP1;
++		case P1DGEnum:                return NUMNODESP1;
++		case P1bubbleEnum:            return NUMNODESP1b;
++		case P1bubblecondensedEnum:   return NUMNODESP1b;
++		case P2Enum:                  return NUMNODESP2;
++		case P2bubbleEnum:            return NUMNODESP2b;
++		case P2bubblecondensedEnum:   return NUMNODESP2b;
++		case P1P1Enum:                return NUMNODESP1*2;
++		case P1P1GLSEnum:             return NUMNODESP1*2;
++		case MINIcondensedEnum:       return NUMNODESP1b+NUMNODESP1;
++		case MINIEnum:                return NUMNODESP1b+NUMNODESP1;
++		case TaylorHoodEnum:          return NUMNODESP2+NUMNODESP1;
++		case LATaylorHoodEnum:        return NUMNODESP2;
++		case XTaylorHoodEnum:         return NUMNODESP2+NUMNODESP1;
++		case CrouzeixRaviartEnum:     return NUMNODESP2b+NUMNODESP1;
++		case LACrouzeixRaviartEnum:   return NUMNODESP2b;
++		default: _error_("Element type "<<EnumToStringx(finiteelement)<<" not supported yet");
++	}
++
++	return -1;
++}
++/*}}}*/
++int  TriaRef::PressureInterpolation(int fe_stokes){/*{{{*/
++
++	switch(fe_stokes){
++		case P1P1Enum:              return P1Enum;
++		case P1P1GLSEnum:           return P1Enum;
++		case MINIcondensedEnum:     return P1Enum;
++		case MINIEnum:              return P1Enum;
++		case TaylorHoodEnum:        return P1Enum;
++		case LATaylorHoodEnum:      return NoneEnum;
++		case XTaylorHoodEnum:       return P1Enum;
++		case CrouzeixRaviartEnum:   return P1DGEnum;
++		case LACrouzeixRaviartEnum: return NoneEnum;
++		default:       _error_("Element type "<<EnumToStringx(fe_stokes)<<" not supported yet");
++	}
++
++	return -1;
++}
++/*}}}*/
++int  TriaRef::TensorInterpolation(int fe_stokes){/*{{{*/
++	/*This routine returns the values of the nodal functions  at the gaussian point.*/
++
++	switch(fe_stokes){
++		case XTaylorHoodEnum: return P1DGEnum;
++		default: _error_("Element type "<<EnumToStringx(fe_stokes)<<" not supported yet");
++	}
++}
++/*}}}*/
++int  TriaRef::VelocityInterpolation(int fe_stokes){/*{{{*/
++
++	switch(fe_stokes){
++		case P1P1Enum:              return P1Enum;
++		case P1P1GLSEnum:           return P1Enum;
++		case MINIcondensedEnum:     return P1bubbleEnum;
++		case MINIEnum:              return P1bubbleEnum;
++		case TaylorHoodEnum:        return P2Enum;
++		case LATaylorHoodEnum:      return P2Enum;
++		case XTaylorHoodEnum:       return P2Enum;
++		case CrouzeixRaviartEnum:   return P2bubbleEnum;
++		case LACrouzeixRaviartEnum: return P2bubbleEnum;
++		default:       _error_("Element type "<<EnumToStringx(fe_stokes)<<" not supported yet");
++	}
++
++	return -1;
++}
++/*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18925-18926.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18925-18926.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18925-18926.diff	(revision 19102)
@@ -0,0 +1,2380 @@
+Index: ../trunk-jpl/src/c/classes/Loads/Numericalflux.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Numericalflux.cpp	(revision 18925)
++++ ../trunk-jpl/src/c/classes/Loads/Numericalflux.cpp	(revision 18926)
+@@ -130,43 +130,6 @@
+ /*}}}*/
+ 
+ /*Object virtual functions definitions:*/
+-void Numericalflux::Echo(void){/*{{{*/
+-	_printf_("Numericalflux:\n");
+-	_printf_("   id: " << id << "\n");
+-	_printf_("   analysis_type: " << EnumToStringx(analysis_type) << "\n");
+-	_printf_("   flux_type: " << this->flux_type<< "\n");
+-	hnodes->Echo();
+-	hvertices->Echo();
+-	helement->Echo();
+-	_printf_("   parameters: " << parameters << "\n");
+-}
+-/*}}}*/
+-void Numericalflux::DeepEcho(void){/*{{{*/
+-
+-	_printf_("Numericalflux:\n");
+-	_printf_("   id: " << id << "\n");
+-	_printf_("   analysis_type: " << EnumToStringx(analysis_type) << "\n");
+-	_printf_("   flux_type: " << this->flux_type<< "\n");
+-	hnodes->DeepEcho();
+-	hvertices->DeepEcho();
+-	helement->DeepEcho();
+-	_printf_("   parameters\n");
+-	if(parameters)
+-	 parameters->DeepEcho();
+-	else
+-	 _printf_("      NULL\n");
+-}		
+-/*}}}*/
+-int Numericalflux::Id(void){/*{{{*/
+-	return id;
+-}
+-/*}}}*/
+-int Numericalflux::ObjectEnum(void){/*{{{*/
+-
+-	return NumericalfluxEnum;
+-
+-}
+-/*}}}*/
+ Object* Numericalflux::copy() {/*{{{*/
+ 
+ 	Numericalflux* numericalflux=NULL;
+@@ -194,7 +157,44 @@
+ 	return numericalflux;
+ }
+ /*}}}*/
++void    Numericalflux::DeepEcho(void){/*{{{*/
+ 
++	_printf_("Numericalflux:\n");
++	_printf_("   id: " << id << "\n");
++	_printf_("   analysis_type: " << EnumToStringx(analysis_type) << "\n");
++	_printf_("   flux_type: " << this->flux_type<< "\n");
++	hnodes->DeepEcho();
++	hvertices->DeepEcho();
++	helement->DeepEcho();
++	_printf_("   parameters\n");
++	if(parameters)
++	 parameters->DeepEcho();
++	else
++	 _printf_("      NULL\n");
++}		
++/*}}}*/
++void    Numericalflux::Echo(void){/*{{{*/
++	_printf_("Numericalflux:\n");
++	_printf_("   id: " << id << "\n");
++	_printf_("   analysis_type: " << EnumToStringx(analysis_type) << "\n");
++	_printf_("   flux_type: " << this->flux_type<< "\n");
++	hnodes->Echo();
++	hvertices->Echo();
++	helement->Echo();
++	_printf_("   parameters: " << parameters << "\n");
++}
++/*}}}*/
++int     Numericalflux::Id(void){/*{{{*/
++	return id;
++}
++/*}}}*/
++int     Numericalflux::ObjectEnum(void){/*{{{*/
++
++	return NumericalfluxEnum;
++
++}
++/*}}}*/
++
+ /*Load virtual functions definitions:*/
+ void  Numericalflux::Configure(Elements* elementsin,Loads* loadsin,Nodes* nodesin,Vertices* verticesin,Materials* materialsin,Parameters* parametersin){/*{{{*/
+ 
+@@ -213,24 +213,6 @@
+ 	this->parameters=parametersin;
+ }
+ /*}}}*/
+-void  Numericalflux::SetCurrentConfiguration(Elements* elementsin,Loads* loadsin,Nodes* nodesin,Vertices* verticesin,Materials* materialsin,Parameters* parametersin){/*{{{*/
+-
+-}
+-/*}}}*/
+-void  Numericalflux::ResetHooks(){/*{{{*/
+-
+-	this->nodes=NULL;
+-	this->vertices=NULL;
+-	this->element=NULL;
+-	this->parameters=NULL;
+-
+-	/*Get Element type*/
+-	this->hnodes->reset();
+-	this->hvertices->reset();
+-	this->helement->reset();
+-
+-}
+-/*}}}*/
+ void  Numericalflux::CreateKMatrix(Matrix<IssmDouble>* Kff, Matrix<IssmDouble>* Kfs){/*{{{*/
+ 
+ 	/*recover some parameters*/
+@@ -290,34 +272,34 @@
+ 
+ }
+ /*}}}*/
+-void  Numericalflux::GetNodesSidList(int* sidlist){/*{{{*/
++void  Numericalflux::GetNodesLidList(int* lidlist){/*{{{*/
+ 
+-	_assert_(sidlist);
++	_assert_(lidlist);
+ 	_assert_(nodes);
+ 
+ 	switch(this->flux_type){
+ 		case InternalEnum:
+-			for(int i=0;i<NUMNODES_INTERNAL;i++) sidlist[i]=nodes[i]->Sid();
++			for(int i=0;i<NUMNODES_INTERNAL;i++) lidlist[i]=nodes[i]->Lid();
+ 			return;
+ 		case BoundaryEnum:
+-			for(int i=0;i<NUMNODES_BOUNDARY;i++) sidlist[i]=nodes[i]->Sid();
++			for(int i=0;i<NUMNODES_BOUNDARY;i++) lidlist[i]=nodes[i]->Lid();
+ 			return;
+ 		default:
+ 			_error_("Numericalflux type " << EnumToStringx(this->flux_type) << " not supported yet");
+ 	}
+ }
+ /*}}}*/
+-void  Numericalflux::GetNodesLidList(int* lidlist){/*{{{*/
++void  Numericalflux::GetNodesSidList(int* sidlist){/*{{{*/
+ 
+-	_assert_(lidlist);
++	_assert_(sidlist);
+ 	_assert_(nodes);
+ 
+ 	switch(this->flux_type){
+ 		case InternalEnum:
+-			for(int i=0;i<NUMNODES_INTERNAL;i++) lidlist[i]=nodes[i]->Lid();
++			for(int i=0;i<NUMNODES_INTERNAL;i++) sidlist[i]=nodes[i]->Sid();
+ 			return;
+ 		case BoundaryEnum:
+-			for(int i=0;i<NUMNODES_BOUNDARY;i++) lidlist[i]=nodes[i]->Lid();
++			for(int i=0;i<NUMNODES_BOUNDARY;i++) sidlist[i]=nodes[i]->Sid();
+ 			return;
+ 		default:
+ 			_error_("Numericalflux type " << EnumToStringx(this->flux_type) << " not supported yet");
+@@ -337,6 +319,11 @@
+ 
+ }
+ /*}}}*/
++bool  Numericalflux::InAnalysis(int in_analysis_type){/*{{{*/
++	if (in_analysis_type==this->analysis_type) return true;
++	else return false;
++}
++/*}}}*/
+ bool  Numericalflux::IsPenalty(void){/*{{{*/
+ 	return false;
+ }
+@@ -355,11 +342,24 @@
+ 
+ }
+ /*}}}*/
+-bool  Numericalflux::InAnalysis(int in_analysis_type){/*{{{*/
+-	if (in_analysis_type==this->analysis_type) return true;
+-	else return false;
++void  Numericalflux::ResetHooks(){/*{{{*/
++
++	this->nodes=NULL;
++	this->vertices=NULL;
++	this->element=NULL;
++	this->parameters=NULL;
++
++	/*Get Element type*/
++	this->hnodes->reset();
++	this->hvertices->reset();
++	this->helement->reset();
++
+ }
+ /*}}}*/
++void  Numericalflux::SetCurrentConfiguration(Elements* elementsin,Loads* loadsin,Nodes* nodesin,Vertices* verticesin,Materials* materialsin,Parameters* parametersin){/*{{{*/
++
++}
++/*}}}*/
+ void  Numericalflux::SetwiseNodeConnectivity(int* pd_nz,int* po_nz,Node* node,bool* flags,int* flagsindices,int set1_enum,int set2_enum){/*{{{*/
+ 
+ 	/*Output */
+@@ -416,90 +416,52 @@
+ /*}}}*/
+ 
+ /*Numericalflux management*/
+-ElementMatrix* Numericalflux::CreateKMatrixMasstransport(void){/*{{{*/
++ElementMatrix* Numericalflux::CreateKMatrixAdjointBalancethickness(void){/*{{{*/
+ 
+ 	switch(this->flux_type){
+ 		case InternalEnum:
+-			return CreateKMatrixMasstransportInternal();
++			return CreateKMatrixAdjointBalancethicknessInternal();
+ 		case BoundaryEnum:
+-			return CreateKMatrixMasstransportBoundary();
++			return CreateKMatrixAdjointBalancethicknessBoundary();
+ 		default:
+ 			_error_("type not supported yet");
+ 	}
+ }
+ /*}}}*/
+-ElementMatrix* Numericalflux::CreateKMatrixMasstransportInternal(void){/*{{{*/
++ElementMatrix* Numericalflux::CreateKMatrixAdjointBalancethicknessBoundary(void){/*{{{*/
+ 
+-	/* constants*/
+-	const int numdof=NDOF1*NUMNODES_INTERNAL;
++	ElementMatrix* Ke=CreateKMatrixBalancethicknessBoundary();
++	if(Ke) Ke->Transpose();
++	return Ke;
++}
++/*}}}*/
++ElementMatrix* Numericalflux::CreateKMatrixAdjointBalancethicknessInternal(void){/*{{{*/
+ 
+-	/* Intermediaries*/
+-	int        i,j,ig,index1,index2;
+-	IssmDouble     DL1,DL2,Jdet,dt,vx,vy,UdotN;
+-	IssmDouble     xyz_list[NUMVERTICES][3];
+-	IssmDouble     normal[2];
+-	IssmDouble     B[numdof];
+-	IssmDouble     Bprime[numdof];
+-	IssmDouble     Ke_g1[numdof][numdof];
+-	IssmDouble     Ke_g2[numdof][numdof];
+-	GaussTria *gauss;
++	ElementMatrix* Ke=CreateKMatrixBalancethicknessInternal();
++	if (Ke) Ke->Transpose();
++	return Ke;
++}
++/*}}}*/
++ElementMatrix* Numericalflux::CreateKMatrixBalancethickness(void){/*{{{*/
+ 
+-	/*Initialize Element matrix and return if necessary*/
+-	Tria*  tria=(Tria*)element;
+-	if(!tria->IsIceInElement()) return NULL;
+-	ElementMatrix* Ke=new ElementMatrix(nodes,NUMNODES_INTERNAL,this->parameters);
+-
+-	/*Retrieve all inputs and parameters*/
+-	GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-	parameters->FindParam(&dt,TimesteppingTimeStepEnum);
+-	Input* vxaverage_input=tria->inputs->GetInput(VxEnum);
+-	Input* vyaverage_input=tria->inputs->GetInput(VyEnum);
+-	GetNormal(&normal[0],xyz_list);
+-
+-	/* Start  looping on the number of gaussian points: */
+-	index1=tria->GetNodeIndex(nodes[0]);
+-	index2=tria->GetNodeIndex(nodes[1]);
+-	gauss=new GaussTria(index1,index2,2);
+-	for(ig=gauss->begin();ig<gauss->end();ig++){
+-
+-		gauss->GaussPoint(ig);
+-
+-		tria->GetSegmentBFlux(&B[0],gauss,index1,index2,tria->FiniteElement());
+-		tria->GetSegmentBprimeFlux(&Bprime[0],gauss,index1,index2,tria->FiniteElement());
+-
+-		vxaverage_input->GetInputValue(&vx,gauss);
+-		vyaverage_input->GetInputValue(&vy,gauss);
+-		UdotN=vx*normal[0]+vy*normal[1];
+-		tria->GetSegmentJacobianDeterminant(&Jdet,&xyz_list[0][0],gauss);
+-		DL1=gauss->weight*Jdet*dt*UdotN/2;
+-		DL2=gauss->weight*Jdet*dt*fabs(UdotN)/2;
+-
+-		TripleMultiply(&B[0],1,numdof,1,
+-					&DL1,1,1,0,
+-					&Bprime[0],1,numdof,0,
+-					&Ke_g1[0][0],0);
+-		TripleMultiply(&B[0],1,numdof,1,
+-					&DL2,1,1,0,
+-					&B[0],1,numdof,0,
+-					&Ke_g2[0][0],0);
+-
+-		for(i=0;i<numdof;i++) for(j=0;j<numdof;j++) Ke->values[i*numdof+j]+=Ke_g1[i][j];
+-		for(i=0;i<numdof;i++) for(j=0;j<numdof;j++) Ke->values[i*numdof+j]+=Ke_g2[i][j];
++	switch(this->flux_type){
++		case InternalEnum:
++			return CreateKMatrixBalancethicknessInternal();
++		case BoundaryEnum:
++			return CreateKMatrixBalancethicknessBoundary();
++		default:
++			_error_("type not supported yet");
+ 	}
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-	return Ke;
+ }
+ /*}}}*/
+-ElementMatrix* Numericalflux::CreateKMatrixMasstransportBoundary(void){/*{{{*/
++ElementMatrix* Numericalflux::CreateKMatrixBalancethicknessBoundary(void){/*{{{*/
+ 
+ 	/* constants*/
+ 	const int numdof=NDOF1*NUMNODES_BOUNDARY;
+ 
+ 	/* Intermediaries*/
+ 	int        i,j,ig,index1,index2;
+-	IssmDouble     DL,Jdet,dt,vx,vy,mean_vx,mean_vy,UdotN;
++	IssmDouble     DL,Jdet,vx,vy,mean_vx,mean_vy,UdotN;
+ 	IssmDouble     xyz_list[NUMVERTICES][3];
+ 	IssmDouble     normal[2];
+ 	IssmDouble     L[numdof];
+@@ -513,9 +475,8 @@
+ 
+ 	/*Retrieve all inputs and parameters*/
+ 	GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-	parameters->FindParam(&dt,TimesteppingTimeStepEnum);
+-	Input* vxaverage_input=tria->inputs->GetInput(VxEnum); _assert_(vxaverage_input);
+-	Input* vyaverage_input=tria->inputs->GetInput(VyEnum); _assert_(vyaverage_input);
++	Input* vxaverage_input=tria->inputs->GetInput(VxEnum);
++	Input* vyaverage_input=tria->inputs->GetInput(VyEnum);
+ 	GetNormal(&normal[0],xyz_list);
+ 
+ 	/*Check wether it is an inflow or outflow BC (0 is the middle of the segment)*/
+@@ -548,7 +509,7 @@
+ 		vyaverage_input->GetInputValue(&vy,gauss);
+ 		UdotN=vx*normal[0]+vy*normal[1];
+ 		tria->GetSegmentJacobianDeterminant(&Jdet,&xyz_list[0][0],gauss);
+-		DL=gauss->weight*Jdet*dt*UdotN;
++		DL=gauss->weight*Jdet*UdotN;
+ 
+ 		TripleMultiply(&L[0],1,numdof,1,
+ 					&DL,1,1,0,
+@@ -563,18 +524,6 @@
+ 	return Ke;
+ }
+ /*}}}*/
+-ElementMatrix* Numericalflux::CreateKMatrixBalancethickness(void){/*{{{*/
+-
+-	switch(this->flux_type){
+-		case InternalEnum:
+-			return CreateKMatrixBalancethicknessInternal();
+-		case BoundaryEnum:
+-			return CreateKMatrixBalancethicknessBoundary();
+-		default:
+-			_error_("type not supported yet");
+-	}
+-}
+-/*}}}*/
+ ElementMatrix* Numericalflux::CreateKMatrixBalancethicknessInternal(void){/*{{{*/
+ 
+ 	/* constants*/
+@@ -638,14 +587,26 @@
+ 	return Ke;
+ }
+ /*}}}*/
+-ElementMatrix* Numericalflux::CreateKMatrixBalancethicknessBoundary(void){/*{{{*/
++ElementMatrix* Numericalflux::CreateKMatrixMasstransport(void){/*{{{*/
+ 
++	switch(this->flux_type){
++		case InternalEnum:
++			return CreateKMatrixMasstransportInternal();
++		case BoundaryEnum:
++			return CreateKMatrixMasstransportBoundary();
++		default:
++			_error_("type not supported yet");
++	}
++}
++/*}}}*/
++ElementMatrix* Numericalflux::CreateKMatrixMasstransportBoundary(void){/*{{{*/
++
+ 	/* constants*/
+ 	const int numdof=NDOF1*NUMNODES_BOUNDARY;
+ 
+ 	/* Intermediaries*/
+ 	int        i,j,ig,index1,index2;
+-	IssmDouble     DL,Jdet,vx,vy,mean_vx,mean_vy,UdotN;
++	IssmDouble     DL,Jdet,dt,vx,vy,mean_vx,mean_vy,UdotN;
+ 	IssmDouble     xyz_list[NUMVERTICES][3];
+ 	IssmDouble     normal[2];
+ 	IssmDouble     L[numdof];
+@@ -659,8 +620,9 @@
+ 
+ 	/*Retrieve all inputs and parameters*/
+ 	GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-	Input* vxaverage_input=tria->inputs->GetInput(VxEnum);
+-	Input* vyaverage_input=tria->inputs->GetInput(VyEnum);
++	parameters->FindParam(&dt,TimesteppingTimeStepEnum);
++	Input* vxaverage_input=tria->inputs->GetInput(VxEnum); _assert_(vxaverage_input);
++	Input* vyaverage_input=tria->inputs->GetInput(VyEnum); _assert_(vyaverage_input);
+ 	GetNormal(&normal[0],xyz_list);
+ 
+ 	/*Check wether it is an inflow or outflow BC (0 is the middle of the segment)*/
+@@ -693,7 +655,7 @@
+ 		vyaverage_input->GetInputValue(&vy,gauss);
+ 		UdotN=vx*normal[0]+vy*normal[1];
+ 		tria->GetSegmentJacobianDeterminant(&Jdet,&xyz_list[0][0],gauss);
+-		DL=gauss->weight*Jdet*UdotN;
++		DL=gauss->weight*Jdet*dt*UdotN;
+ 
+ 		TripleMultiply(&L[0],1,numdof,1,
+ 					&DL,1,1,0,
+@@ -708,62 +670,99 @@
+ 	return Ke;
+ }
+ /*}}}*/
+-ElementMatrix* Numericalflux::CreateKMatrixAdjointBalancethickness(void){/*{{{*/
++ElementMatrix* Numericalflux::CreateKMatrixMasstransportInternal(void){/*{{{*/
+ 
+-	switch(this->flux_type){
+-		case InternalEnum:
+-			return CreateKMatrixAdjointBalancethicknessInternal();
+-		case BoundaryEnum:
+-			return CreateKMatrixAdjointBalancethicknessBoundary();
+-		default:
+-			_error_("type not supported yet");
++	/* constants*/
++	const int numdof=NDOF1*NUMNODES_INTERNAL;
++
++	/* Intermediaries*/
++	int        i,j,ig,index1,index2;
++	IssmDouble     DL1,DL2,Jdet,dt,vx,vy,UdotN;
++	IssmDouble     xyz_list[NUMVERTICES][3];
++	IssmDouble     normal[2];
++	IssmDouble     B[numdof];
++	IssmDouble     Bprime[numdof];
++	IssmDouble     Ke_g1[numdof][numdof];
++	IssmDouble     Ke_g2[numdof][numdof];
++	GaussTria *gauss;
++
++	/*Initialize Element matrix and return if necessary*/
++	Tria*  tria=(Tria*)element;
++	if(!tria->IsIceInElement()) return NULL;
++	ElementMatrix* Ke=new ElementMatrix(nodes,NUMNODES_INTERNAL,this->parameters);
++
++	/*Retrieve all inputs and parameters*/
++	GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++	parameters->FindParam(&dt,TimesteppingTimeStepEnum);
++	Input* vxaverage_input=tria->inputs->GetInput(VxEnum);
++	Input* vyaverage_input=tria->inputs->GetInput(VyEnum);
++	GetNormal(&normal[0],xyz_list);
++
++	/* Start  looping on the number of gaussian points: */
++	index1=tria->GetNodeIndex(nodes[0]);
++	index2=tria->GetNodeIndex(nodes[1]);
++	gauss=new GaussTria(index1,index2,2);
++	for(ig=gauss->begin();ig<gauss->end();ig++){
++
++		gauss->GaussPoint(ig);
++
++		tria->GetSegmentBFlux(&B[0],gauss,index1,index2,tria->FiniteElement());
++		tria->GetSegmentBprimeFlux(&Bprime[0],gauss,index1,index2,tria->FiniteElement());
++
++		vxaverage_input->GetInputValue(&vx,gauss);
++		vyaverage_input->GetInputValue(&vy,gauss);
++		UdotN=vx*normal[0]+vy*normal[1];
++		tria->GetSegmentJacobianDeterminant(&Jdet,&xyz_list[0][0],gauss);
++		DL1=gauss->weight*Jdet*dt*UdotN/2;
++		DL2=gauss->weight*Jdet*dt*fabs(UdotN)/2;
++
++		TripleMultiply(&B[0],1,numdof,1,
++					&DL1,1,1,0,
++					&Bprime[0],1,numdof,0,
++					&Ke_g1[0][0],0);
++		TripleMultiply(&B[0],1,numdof,1,
++					&DL2,1,1,0,
++					&B[0],1,numdof,0,
++					&Ke_g2[0][0],0);
++
++		for(i=0;i<numdof;i++) for(j=0;j<numdof;j++) Ke->values[i*numdof+j]+=Ke_g1[i][j];
++		for(i=0;i<numdof;i++) for(j=0;j<numdof;j++) Ke->values[i*numdof+j]+=Ke_g2[i][j];
+ 	}
+-}
+-/*}}}*/
+-ElementMatrix* Numericalflux::CreateKMatrixAdjointBalancethicknessInternal(void){/*{{{*/
+ 
+-	ElementMatrix* Ke=CreateKMatrixBalancethicknessInternal();
+-	if (Ke) Ke->Transpose();
++	/*Clean up and return*/
++	delete gauss;
+ 	return Ke;
+ }
+ /*}}}*/
+-ElementMatrix* Numericalflux::CreateKMatrixAdjointBalancethicknessBoundary(void){/*{{{*/
++ElementVector* Numericalflux::CreatePVectorAdjointBalancethickness(void){/*{{{*/
+ 
+-	ElementMatrix* Ke=CreateKMatrixBalancethicknessBoundary();
+-	if(Ke) Ke->Transpose();
+-	return Ke;
++	/*No PVector for the Adjoint*/
++	return NULL;
+ }
+ /*}}}*/
+-ElementVector* Numericalflux::CreatePVectorMasstransport(void){/*{{{*/
++ElementVector* Numericalflux::CreatePVectorBalancethickness(void){/*{{{*/
+ 
+ 	switch(this->flux_type){
+ 		case InternalEnum:
+-			return CreatePVectorMasstransportInternal();
++			return CreatePVectorBalancethicknessInternal();
+ 		case BoundaryEnum:
+-			return CreatePVectorMasstransportBoundary();
++			return CreatePVectorBalancethicknessBoundary();
+ 		default:
+ 			_error_("type not supported yet");
+ 	}
+ }
+ /*}}}*/
+-ElementVector* Numericalflux::CreatePVectorMasstransportInternal(void){/*{{{*/
++ElementVector* Numericalflux::CreatePVectorBalancethicknessBoundary(void){/*{{{*/
+ 
+-	/*Nothing added to PVector*/
+-	return NULL;
+-
+-}
+-/*}}}*/
+-ElementVector* Numericalflux::CreatePVectorMasstransportBoundary(void){/*{{{*/
+-
+ 	/* constants*/
+ 	const int numdof=NDOF1*NUMNODES_BOUNDARY;
+ 
+ 	/* Intermediaries*/
+ 	int        i,ig,index1,index2;
+-	IssmDouble     DL,Jdet,dt,vx,vy,mean_vx,mean_vy,UdotN,thickness;
+-	IssmDouble     xyz_list[NUMVERTICES][3];
+-	IssmDouble     normal[2];
+-	IssmDouble     L[numdof];
++	IssmDouble DL,Jdet,vx,vy,mean_vx,mean_vy,UdotN,thickness;
++	IssmDouble xyz_list[NUMVERTICES][3];
++	IssmDouble normal[2];
++	IssmDouble L[numdof];
+ 	GaussTria *gauss;
+ 
+ 	/*Initialize Load Vector and return if necessary*/
+@@ -773,10 +772,9 @@
+ 
+ 	/*Retrieve all inputs and parameters*/
+ 	GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-	parameters->FindParam(&dt,TimesteppingTimeStepEnum);
+-	Input* vxaverage_input   =tria->inputs->GetInput(VxEnum);                     _assert_(vxaverage_input); 
+-	Input* vyaverage_input   =tria->inputs->GetInput(VyEnum);                     _assert_(vyaverage_input);
+-	Input* spcthickness_input=tria->inputs->GetInput(MasstransportSpcthicknessEnum); _assert_(spcthickness_input);
++	Input* vxaverage_input=tria->inputs->GetInput(VxEnum); _assert_(vxaverage_input); 
++	Input* vyaverage_input=tria->inputs->GetInput(VyEnum); _assert_(vyaverage_input);
++	Input* thickness_input=tria->inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
+ 	GetNormal(&normal[0],xyz_list);
+ 
+ 	/*Check wether it is an inflow or outflow BC (0 is the middle of the segment)*/
+@@ -788,7 +786,6 @@
+ 	vxaverage_input->GetInputValue(&mean_vx,gauss);
+ 	vyaverage_input->GetInputValue(&mean_vy,gauss);
+ 	delete gauss;
+-
+ 	UdotN=mean_vx*normal[0]+mean_vy*normal[1];
+ 	if (UdotN>0){
+ 		return NULL; /*(u,n)>0 -> outflow, PenaltyCreateKMatrix will take care of it*/
+@@ -807,12 +804,11 @@
+ 
+ 		vxaverage_input->GetInputValue(&vx,gauss);
+ 		vyaverage_input->GetInputValue(&vy,gauss);
+-		spcthickness_input->GetInputValue(&thickness,gauss);
+-		if(xIsNan<IssmDouble>(thickness)) _error_("Cannot weakly apply constraint because NaN was provided");
++		thickness_input->GetInputValue(&thickness,gauss);
+ 
+ 		UdotN=vx*normal[0]+vy*normal[1];
+ 		tria->GetSegmentJacobianDeterminant(&Jdet,&xyz_list[0][0],gauss);
+-		DL= - gauss->weight*Jdet*dt*UdotN*thickness;
++		DL= - gauss->weight*Jdet*UdotN*thickness;
+ 
+ 		for(i=0;i<numdof;i++) pe->values[i] += DL*L[i];
+ 	}
+@@ -822,36 +818,36 @@
+ 	return pe;
+ }
+ /*}}}*/
+-ElementVector* Numericalflux::CreatePVectorBalancethickness(void){/*{{{*/
++ElementVector* Numericalflux::CreatePVectorBalancethicknessInternal(void){/*{{{*/
+ 
++	/*Nothing added to PVector*/
++	return NULL;
++
++}
++/*}}}*/
++ElementVector* Numericalflux::CreatePVectorMasstransport(void){/*{{{*/
++
+ 	switch(this->flux_type){
+ 		case InternalEnum:
+-			return CreatePVectorBalancethicknessInternal();
++			return CreatePVectorMasstransportInternal();
+ 		case BoundaryEnum:
+-			return CreatePVectorBalancethicknessBoundary();
++			return CreatePVectorMasstransportBoundary();
+ 		default:
+ 			_error_("type not supported yet");
+ 	}
+ }
+ /*}}}*/
+-ElementVector* Numericalflux::CreatePVectorBalancethicknessInternal(void){/*{{{*/
++ElementVector* Numericalflux::CreatePVectorMasstransportBoundary(void){/*{{{*/
+ 
+-	/*Nothing added to PVector*/
+-	return NULL;
+-
+-}
+-/*}}}*/
+-ElementVector* Numericalflux::CreatePVectorBalancethicknessBoundary(void){/*{{{*/
+-
+ 	/* constants*/
+ 	const int numdof=NDOF1*NUMNODES_BOUNDARY;
+ 
+ 	/* Intermediaries*/
+ 	int        i,ig,index1,index2;
+-	IssmDouble DL,Jdet,vx,vy,mean_vx,mean_vy,UdotN,thickness;
+-	IssmDouble xyz_list[NUMVERTICES][3];
+-	IssmDouble normal[2];
+-	IssmDouble L[numdof];
++	IssmDouble     DL,Jdet,dt,vx,vy,mean_vx,mean_vy,UdotN,thickness;
++	IssmDouble     xyz_list[NUMVERTICES][3];
++	IssmDouble     normal[2];
++	IssmDouble     L[numdof];
+ 	GaussTria *gauss;
+ 
+ 	/*Initialize Load Vector and return if necessary*/
+@@ -861,9 +857,10 @@
+ 
+ 	/*Retrieve all inputs and parameters*/
+ 	GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+-	Input* vxaverage_input=tria->inputs->GetInput(VxEnum); _assert_(vxaverage_input); 
+-	Input* vyaverage_input=tria->inputs->GetInput(VyEnum); _assert_(vyaverage_input);
+-	Input* thickness_input=tria->inputs->GetInput(ThicknessEnum); _assert_(thickness_input);
++	parameters->FindParam(&dt,TimesteppingTimeStepEnum);
++	Input* vxaverage_input   =tria->inputs->GetInput(VxEnum);                     _assert_(vxaverage_input); 
++	Input* vyaverage_input   =tria->inputs->GetInput(VyEnum);                     _assert_(vyaverage_input);
++	Input* spcthickness_input=tria->inputs->GetInput(MasstransportSpcthicknessEnum); _assert_(spcthickness_input);
+ 	GetNormal(&normal[0],xyz_list);
+ 
+ 	/*Check wether it is an inflow or outflow BC (0 is the middle of the segment)*/
+@@ -875,6 +872,7 @@
+ 	vxaverage_input->GetInputValue(&mean_vx,gauss);
+ 	vyaverage_input->GetInputValue(&mean_vy,gauss);
+ 	delete gauss;
++
+ 	UdotN=mean_vx*normal[0]+mean_vy*normal[1];
+ 	if (UdotN>0){
+ 		return NULL; /*(u,n)>0 -> outflow, PenaltyCreateKMatrix will take care of it*/
+@@ -893,11 +891,12 @@
+ 
+ 		vxaverage_input->GetInputValue(&vx,gauss);
+ 		vyaverage_input->GetInputValue(&vy,gauss);
+-		thickness_input->GetInputValue(&thickness,gauss);
++		spcthickness_input->GetInputValue(&thickness,gauss);
++		if(xIsNan<IssmDouble>(thickness)) _error_("Cannot weakly apply constraint because NaN was provided");
+ 
+ 		UdotN=vx*normal[0]+vy*normal[1];
+ 		tria->GetSegmentJacobianDeterminant(&Jdet,&xyz_list[0][0],gauss);
+-		DL= - gauss->weight*Jdet*UdotN*thickness;
++		DL= - gauss->weight*Jdet*dt*UdotN*thickness;
+ 
+ 		for(i=0;i<numdof;i++) pe->values[i] += DL*L[i];
+ 	}
+@@ -907,13 +906,14 @@
+ 	return pe;
+ }
+ /*}}}*/
+-ElementVector* Numericalflux::CreatePVectorAdjointBalancethickness(void){/*{{{*/
++ElementVector* Numericalflux::CreatePVectorMasstransportInternal(void){/*{{{*/
+ 
+-	/*No PVector for the Adjoint*/
++	/*Nothing added to PVector*/
+ 	return NULL;
++
+ }
+ /*}}}*/
+-void Numericalflux:: GetNormal(IssmDouble* normal,IssmDouble xyz_list[4][3]){/*{{{*/
++void           Numericalflux::GetNormal(IssmDouble* normal,IssmDouble xyz_list[4][3]){/*{{{*/
+ 
+ 	/*Build unit outward pointing vector*/
+ 	IssmDouble vector[2];
+Index: ../trunk-jpl/src/c/classes/Loads/Penpair.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Penpair.cpp	(revision 18925)
++++ ../trunk-jpl/src/c/classes/Loads/Penpair.cpp	(revision 18926)
+@@ -44,33 +44,6 @@
+ /*}}}*/
+ 
+ /*Object virtual functions definitions:*/
+-void Penpair::Echo(void){/*{{{*/
+-
+-	_printf_("Penpair:\n");
+-	_printf_("   id: " << id << "\n");
+-	_printf_("   analysis_type: " << EnumToStringx(analysis_type) << "\n");
+-	hnodes->Echo();
+-
+-	return;
+-}
+-/*}}}*/
+-void Penpair::DeepEcho(void){/*{{{*/
+-
+-	_printf_("Penpair:\n");
+-	_printf_("   id: " << id << "\n");
+-	_printf_("   analysis_type: " << EnumToStringx(analysis_type) << "\n");
+-	hnodes->DeepEcho();
+-
+-	return;
+-}		
+-/*}}}*/
+-int  Penpair::Id(void){ return id; }/*{{{*/
+-/*}}}*/
+-int  Penpair::ObjectEnum(void){/*{{{*/
+-
+-	return PenpairEnum;
+-}
+-/*}}}*/
+ Object* Penpair::copy() {/*{{{*/
+ 
+ 	Penpair* penpair=NULL;
+@@ -92,7 +65,34 @@
+ 
+ }
+ /*}}}*/
++void    Penpair::DeepEcho(void){/*{{{*/
+ 
++	_printf_("Penpair:\n");
++	_printf_("   id: " << id << "\n");
++	_printf_("   analysis_type: " << EnumToStringx(analysis_type) << "\n");
++	hnodes->DeepEcho();
++
++	return;
++}		
++/*}}}*/
++void    Penpair::Echo(void){/*{{{*/
++
++	_printf_("Penpair:\n");
++	_printf_("   id: " << id << "\n");
++	_printf_("   analysis_type: " << EnumToStringx(analysis_type) << "\n");
++	hnodes->Echo();
++
++	return;
++}
++/*}}}*/
++int     Penpair::Id(void){ return id; }/*{{{*/
++/*}}}*/
++int     Penpair::ObjectEnum(void){/*{{{*/
++
++	return PenpairEnum;
++}
++/*}}}*/
++
+ /*Load virtual functions definitions:*/
+ void  Penpair::Configure(Elements* elementsin,Loads* loadsin,Nodes* nodesin,Vertices* verticesin,Materials* materialsin,Parameters* parametersin){/*{{{*/
+ 
+@@ -108,20 +108,10 @@
+ 
+ }
+ /*}}}*/
+-void  Penpair::SetCurrentConfiguration(Elements* elementsin,Loads* loadsin,Nodes* nodesin,Vertices* verticesin,Materials* materialsin,Parameters* parametersin){/*{{{*/
+-
++void  Penpair::CreateJacobianMatrix(Matrix<IssmDouble>* Jff){/*{{{*/
++	this->CreateKMatrix(Jff,NULL);
+ }
+ /*}}}*/
+-void  Penpair::ResetHooks(){/*{{{*/
+-
+-	this->nodes=NULL;
+-	this->parameters=NULL;
+-
+-	/*Get Element type*/
+-	this->hnodes->reset();
+-
+-}
+-/*}}}*/
+ void  Penpair::CreateKMatrix(Matrix<IssmDouble>* Kff, Matrix<IssmDouble>* Kfs){/*{{{*/
+ 	/*If you code this piece, don't forget that a penalty will be inactive if it is dealing with clone nodes*/
+ 	/*No loads applied, do nothing: */
+@@ -136,10 +126,6 @@
+ 
+ }
+ /*}}}*/
+-void  Penpair::CreateJacobianMatrix(Matrix<IssmDouble>* Jff){/*{{{*/
+-	this->CreateKMatrix(Jff,NULL);
+-}
+-/*}}}*/
+ void  Penpair::GetNodesSidList(int* sidlist){/*{{{*/
+ 
+ 	_assert_(sidlist);
+@@ -161,10 +147,19 @@
+ 	return NUMVERTICES;
+ }
+ /*}}}*/
++bool  Penpair::InAnalysis(int in_analysis_type){/*{{{*/
++	if (in_analysis_type==this->analysis_type)return true;
++	else return false;
++}
++/*}}}*/
+ bool  Penpair::IsPenalty(void){/*{{{*/
+ 	return true;
+ }
+ /*}}}*/
++void  Penpair::PenaltyCreateJacobianMatrix(Matrix<IssmDouble>* Jff,IssmDouble kmax){/*{{{*/
++	this->PenaltyCreateKMatrix(Jff,NULL,kmax);
++}
++/*}}}*/
+ void  Penpair::PenaltyCreateKMatrix(Matrix<IssmDouble>* Kff, Matrix<IssmDouble>* Kfs,IssmDouble kmax){/*{{{*/
+ 
+ 	/*Retrieve parameters: */
+@@ -195,13 +190,18 @@
+ 	return;
+ }
+ /*}}}*/
+-void  Penpair::PenaltyCreateJacobianMatrix(Matrix<IssmDouble>* Jff,IssmDouble kmax){/*{{{*/
+-	this->PenaltyCreateKMatrix(Jff,NULL,kmax);
++void  Penpair::ResetHooks(){/*{{{*/
++
++	this->nodes=NULL;
++	this->parameters=NULL;
++
++	/*Get Element type*/
++	this->hnodes->reset();
++
+ }
+ /*}}}*/
+-bool  Penpair::InAnalysis(int in_analysis_type){/*{{{*/
+-	if (in_analysis_type==this->analysis_type)return true;
+-	else return false;
++void  Penpair::SetCurrentConfiguration(Elements* elementsin,Loads* loadsin,Nodes* nodesin,Vertices* verticesin,Materials* materialsin,Parameters* parametersin){/*{{{*/
++
+ }
+ /*}}}*/
+ void  Penpair::SetwiseNodeConnectivity(int* pd_nz,int* po_nz,Node* node,bool* flags,int* flagsindices,int set1_enum,int set2_enum){/*{{{*/
+@@ -278,6 +278,58 @@
+ /*}}}*/
+ 
+ /*Penpair management:*/
++ElementMatrix* Penpair::PenaltyCreateKMatrixMasstransport(IssmDouble kmax){/*{{{*/
++
++	const int numdof=NUMVERTICES*NDOF1;
++	IssmDouble penalty_factor;
++
++	/*Initialize Element vector and return if necessary*/
++	ElementMatrix* Ke=new ElementMatrix(nodes,NUMVERTICES,this->parameters);
++
++	/*recover parameters: */
++	parameters->FindParam(&penalty_factor,MasstransportPenaltyFactorEnum);
++
++	//Create elementary matrix: add penalty to 
++	Ke->values[0*numdof+0]=+kmax*pow(10.,penalty_factor);
++	Ke->values[0*numdof+1]=-kmax*pow(10.,penalty_factor);
++	Ke->values[1*numdof+0]=-kmax*pow(10.,penalty_factor);
++	Ke->values[1*numdof+1]=+kmax*pow(10.,penalty_factor);
++
++	/*Clean up and return*/
++	return Ke;
++}
++/*}}}*/
++ElementMatrix* Penpair::PenaltyCreateKMatrixStressbalanceFS(IssmDouble kmax){/*{{{*/
++
++	const int  numdof=NUMVERTICES*NDOF3;
++	IssmDouble penalty_offset;
++
++	/*Initialize Element vector and return if necessary*/
++	ElementMatrix* Ke=new ElementMatrix(nodes,NUMVERTICES,this->parameters);
++
++	/*recover parameters: */
++	parameters->FindParam(&penalty_offset,StressbalancePenaltyFactorEnum);
++
++	//Create elementary matrix: add penalty to 
++	Ke->values[0*numdof+0]=+kmax*pow(10.,penalty_offset);
++	Ke->values[0*numdof+3]=-kmax*pow(10.,penalty_offset);
++	Ke->values[3*numdof+0]=-kmax*pow(10.,penalty_offset);
++	Ke->values[3*numdof+3]=+kmax*pow(10.,penalty_offset);
++
++	Ke->values[1*numdof+1]=+kmax*pow(10.,penalty_offset);
++	Ke->values[1*numdof+4]=-kmax*pow(10.,penalty_offset);
++	Ke->values[4*numdof+1]=-kmax*pow(10.,penalty_offset);
++	Ke->values[4*numdof+4]=+kmax*pow(10.,penalty_offset);
++
++	Ke->values[2*numdof+2]=+kmax*pow(10.,penalty_offset);
++	Ke->values[2*numdof+5]=-kmax*pow(10.,penalty_offset);
++	Ke->values[5*numdof+2]=-kmax*pow(10.,penalty_offset);
++	Ke->values[5*numdof+5]=+kmax*pow(10.,penalty_offset);
++
++	/*Clean up and return*/
++	return Ke;
++}
++/*}}}*/
+ ElementMatrix* Penpair::PenaltyCreateKMatrixStressbalanceHoriz(IssmDouble kmax){/*{{{*/
+ 
+ 	int    approximation0=nodes[0]->GetApproximation();
+@@ -337,55 +389,3 @@
+ 	return Ke;
+ }
+ /*}}}*/
+-ElementMatrix* Penpair::PenaltyCreateKMatrixStressbalanceFS(IssmDouble kmax){/*{{{*/
+-
+-	const int  numdof=NUMVERTICES*NDOF3;
+-	IssmDouble penalty_offset;
+-
+-	/*Initialize Element vector and return if necessary*/
+-	ElementMatrix* Ke=new ElementMatrix(nodes,NUMVERTICES,this->parameters);
+-
+-	/*recover parameters: */
+-	parameters->FindParam(&penalty_offset,StressbalancePenaltyFactorEnum);
+-
+-	//Create elementary matrix: add penalty to 
+-	Ke->values[0*numdof+0]=+kmax*pow(10.,penalty_offset);
+-	Ke->values[0*numdof+3]=-kmax*pow(10.,penalty_offset);
+-	Ke->values[3*numdof+0]=-kmax*pow(10.,penalty_offset);
+-	Ke->values[3*numdof+3]=+kmax*pow(10.,penalty_offset);
+-
+-	Ke->values[1*numdof+1]=+kmax*pow(10.,penalty_offset);
+-	Ke->values[1*numdof+4]=-kmax*pow(10.,penalty_offset);
+-	Ke->values[4*numdof+1]=-kmax*pow(10.,penalty_offset);
+-	Ke->values[4*numdof+4]=+kmax*pow(10.,penalty_offset);
+-
+-	Ke->values[2*numdof+2]=+kmax*pow(10.,penalty_offset);
+-	Ke->values[2*numdof+5]=-kmax*pow(10.,penalty_offset);
+-	Ke->values[5*numdof+2]=-kmax*pow(10.,penalty_offset);
+-	Ke->values[5*numdof+5]=+kmax*pow(10.,penalty_offset);
+-
+-	/*Clean up and return*/
+-	return Ke;
+-}
+-/*}}}*/
+-ElementMatrix* Penpair::PenaltyCreateKMatrixMasstransport(IssmDouble kmax){/*{{{*/
+-
+-	const int numdof=NUMVERTICES*NDOF1;
+-	IssmDouble penalty_factor;
+-
+-	/*Initialize Element vector and return if necessary*/
+-	ElementMatrix* Ke=new ElementMatrix(nodes,NUMVERTICES,this->parameters);
+-
+-	/*recover parameters: */
+-	parameters->FindParam(&penalty_factor,MasstransportPenaltyFactorEnum);
+-
+-	//Create elementary matrix: add penalty to 
+-	Ke->values[0*numdof+0]=+kmax*pow(10.,penalty_factor);
+-	Ke->values[0*numdof+1]=-kmax*pow(10.,penalty_factor);
+-	Ke->values[1*numdof+0]=-kmax*pow(10.,penalty_factor);
+-	Ke->values[1*numdof+1]=+kmax*pow(10.,penalty_factor);
+-
+-	/*Clean up and return*/
+-	return Ke;
+-}
+-/*}}}*/
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.h	(revision 18925)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.h	(revision 18926)
+@@ -28,14 +28,14 @@
+ 		~Friction();
+ 
+ 		void  Echo(void);
++		void  GetAlphaComplement(IssmDouble* alpha_complement,Gauss* gauss);
+ 		void  GetAlpha2(IssmDouble* palpha2,Gauss* gauss);
+-		void  GetAlpha2Viscous(IssmDouble* palpha2,Gauss* gauss);
+-		void  GetAlpha2Weertman(IssmDouble* palpha2,Gauss* gauss);
+ 		void  GetAlpha2Hydro(IssmDouble* palpha2,Gauss* gauss);
+ 		void  GetAlpha2Temp(IssmDouble* palpha2,Gauss* gauss);
++		void  GetAlpha2Viscous(IssmDouble* palpha2,Gauss* gauss);
+ 		void  GetAlpha2WaterLayer(IssmDouble* palpha2,Gauss* gauss);
++		void  GetAlpha2Weertman(IssmDouble* palpha2,Gauss* gauss);
+ 		void  GetAlpha2WeertmanTemp(IssmDouble* palpha2,Gauss* gauss);
+-		void  GetAlphaComplement(IssmDouble* alpha_complement,Gauss* gauss);
+ };
+ 
+ #endif  /* _FRICTION_H_ */
+Index: ../trunk-jpl/src/c/classes/Loads/Loads.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Loads.cpp	(revision 18925)
++++ ../trunk-jpl/src/c/classes/Loads/Loads.cpp	(revision 18926)
+@@ -47,20 +47,6 @@
+ 
+ }
+ /*}}}*/
+-void Loads::ResetHooks(){/*{{{*/
+-
+-	vector<Object*>::iterator object;
+-	Load* load=NULL;
+-
+-	for ( object=objects.begin() ; object < objects.end(); object++ ){
+-
+-		load=xDynamicCast<Load*>((*object));
+-		load->ResetHooks();
+-
+-	}
+-
+-}
+-/*}}}*/
+ bool Loads::IsPenalty(int analysis_type){/*{{{*/
+ 
+ 	int ispenalty=0;
+@@ -85,7 +71,7 @@
+ 	 return false;
+ }
+ /*}}}*/
+-int Loads::MaxNumNodes(int analysis_type){/*{{{*/
++int  Loads::MaxNumNodes(int analysis_type){/*{{{*/
+ 
+ 	int max=0;
+ 	int allmax;
+@@ -108,7 +94,7 @@
+ 	return max;
+ }
+ /*}}}*/
+-int Loads::NumberOfLoads(void){/*{{{*/
++int  Loads::NumberOfLoads(void){/*{{{*/
+ 
+ 	int localloads;
+ 	int numberofloads;
+@@ -123,7 +109,7 @@
+ 	return numberofloads;
+ }
+ /*}}}*/
+-int Loads::NumberOfLoads(int analysis_type){/*{{{*/
++int  Loads::NumberOfLoads(int analysis_type){/*{{{*/
+ 
+ 	int localloads = 0;
+ 	int numberofloads;
+@@ -144,25 +130,18 @@
+ 	return numberofloads;
+ }
+ /*}}}*/
+-int Loads::Size(void){/*{{{*/
++void Loads::ResetHooks(){/*{{{*/
+ 
+-	return this->DataSet::Size();
+-}
+-/*}}}*/
+-int Loads::Size(int analysis_type){/*{{{*/
++	vector<Object*>::iterator object;
++	Load* load=NULL;
+ 
+-	int localloads = 0;
++	for ( object=objects.begin() ; object < objects.end(); object++ ){
+ 
+-	/*Get number of local loads*/
+-	for(int i=0;i<this->Size();i++){
++		load=xDynamicCast<Load*>((*object));
++		load->ResetHooks();
+ 
+-		Load* load=xDynamicCast<Load*>(this->GetObjectByOffset(i));
+-
+-		/*Check that this load corresponds to our analysis currently being carried out: */
+-		if (load->InAnalysis(analysis_type)) localloads++;
+ 	}
+ 
+-	return localloads;
+ }
+ /*}}}*/
+ void Loads::SetCurrentConfiguration(Elements* elements,Loads* loads, Nodes* nodes, Vertices* vertices, Materials* materials,Parameters* parameters){/*{{{*/
+@@ -179,3 +158,24 @@
+ 
+ }
+ /*}}}*/
++int  Loads::Size(void){/*{{{*/
++
++	return this->DataSet::Size();
++}
++/*}}}*/
++int  Loads::Size(int analysis_type){/*{{{*/
++
++	int localloads = 0;
++
++	/*Get number of local loads*/
++	for(int i=0;i<this->Size();i++){
++
++		Load* load=xDynamicCast<Load*>(this->GetObjectByOffset(i));
++
++		/*Check that this load corresponds to our analysis currently being carried out: */
++		if (load->InAnalysis(analysis_type)) localloads++;
++	}
++
++	return localloads;
++}
++/*}}}*/
+Index: ../trunk-jpl/src/c/classes/Loads/Riftfront.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Riftfront.h	(revision 18925)
++++ ../trunk-jpl/src/c/classes/Loads/Riftfront.h	(revision 18926)
+@@ -56,44 +56,44 @@
+ 		~Riftfront();
+ 		/*}}}*/
+ 		/*Object virtual functions definitions:{{{ */
+-		void  Echo();
+-		void  DeepEcho();
+-		int   Id(); 
+-		int   ObjectEnum();
+-		Object* copy();
++		Object*  copy();
++		void     DeepEcho();
++		void     Echo();
++		int      Id(); 
++		int      ObjectEnum();
+ 		/*}}}*/
+ 		/*Update virtual functions resolution: {{{*/
+-		void    InputUpdateFromVector(IssmDouble* vector, int name, int type);
+-		void    InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows,int ncols, int name, int type){_error_("Not implemented yet!");}
+-		void    InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){_error_("Not implemented yet!");}
+ 		void    InputUpdateFromConstant(IssmDouble constant, int name);
+ 		void    InputUpdateFromConstant(int constant, int name){_error_("Not implemented yet!");}
+ 		void    InputUpdateFromConstant(bool constant, int name);
+ 		void    InputUpdateFromIoModel(int index, IoModel* iomodel){_error_("not implemented yet");};
++		void    InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows,int ncols, int name, int type){_error_("Not implemented yet!");}
++		void    InputUpdateFromVector(IssmDouble* vector, int name, int type);
++		void    InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){_error_("Not implemented yet!");}
+ 		/*}}}*/
+ 		/*Load virtual functions definitions: {{{*/
+ 		void  Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
+-		void  ResetHooks();
+-		void  SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
++		void  CreateJacobianMatrix(Matrix<IssmDouble>* Jff){_error_("Not implemented yet");};
+ 		void  CreateKMatrix(Matrix<IssmDouble>* Kff, Matrix<IssmDouble>* Kfs);
+ 		void  CreatePVector(Vector<IssmDouble>* pf);
+-		void  CreateJacobianMatrix(Matrix<IssmDouble>* Jff){_error_("Not implemented yet");};
++		void  GetNodesLidList(int* lidlist);
+ 		void  GetNodesSidList(int* sidlist);
+-		void  GetNodesLidList(int* lidlist);
+ 		int   GetNumberOfNodes(void);
++		bool  InAnalysis(int analysis_type);
+ 		bool  IsPenalty(void);
+ 		void  PenaltyCreateJacobianMatrix(Matrix<IssmDouble>* Jff,IssmDouble kmax){_error_("Not implemented yet");};
+ 		void  PenaltyCreateKMatrix(Matrix<IssmDouble>* Kff, Matrix<IssmDouble>* kfs, IssmDouble kmax);
+ 		void  PenaltyCreatePVector(Vector<IssmDouble>* pf, IssmDouble kmax);
++		void  ResetHooks();
++		void  SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
+ 		void  SetwiseNodeConnectivity(int* d_nz,int* o_nz,Node* node,bool* flags,int* flagsindices,int set1_enum,int set2_enum);
+-		bool  InAnalysis(int analysis_type);
+ 		/*}}}*/
+ 		/*Riftfront specific routines: {{{*/
++		int            Constrain(int* punstable);
++		void           FreezeConstraints(void);
++		bool           IsFrozen(void);
+ 		ElementMatrix* PenaltyCreateKMatrixStressbalanceHoriz(IssmDouble kmax);
+ 		ElementVector* PenaltyCreatePVectorStressbalanceHoriz(IssmDouble kmax);
+-		int   Constrain(int* punstable);
+-		void  FreezeConstraints(void);
+-		bool  IsFrozen(void);
+ 		/*}}}*/
+ };
+ #endif  /* _RIFTFRONT_H_ */
+Index: ../trunk-jpl/src/c/classes/Loads/Numericalflux.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Numericalflux.h	(revision 18925)
++++ ../trunk-jpl/src/c/classes/Loads/Numericalflux.h	(revision 18926)
+@@ -39,56 +39,56 @@
+ 		~Numericalflux();
+ 		/*}}}*/
+ 		/*Object virtual functions definitions:{{{ */
++		Object *copy();
++		void    DeepEcho();
+ 		void    Echo();
+-		void    DeepEcho();
+ 		int     Id();
+ 		int     ObjectEnum();
+-		Object *copy();
+ 		/*}}}*/
+ 		/*Update virtual functions resolution: {{{*/
+-		void InputUpdateFromVector(IssmDouble* vector, int name, int type){/*Do nothing*/}
+-		void InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols, int name, int type){/*Do nothing*/}
+-		void InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){/*Do nothing*/}
+ 		void InputUpdateFromConstant(IssmDouble constant, int name){/*Do nothing*/};
+ 		void InputUpdateFromConstant(int constant, int name){/*Do nothing*/};
+ 		void InputUpdateFromConstant(bool constant, int name){_error_("Not implemented yet!");}
+ 		void InputUpdateFromIoModel(int index, IoModel* iomodel){_error_("not implemented yet");};
++		void InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols, int name, int type){/*Do nothing*/}
++		void InputUpdateFromVector(IssmDouble* vector, int name, int type){/*Do nothing*/}
++		void InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){/*Do nothing*/}
+ 		/*}}}*/
+ 		/*Load virtual functions definitions: {{{*/
+ 		void Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
+-		void SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
+-		void ResetHooks();
++		void CreateJacobianMatrix(Matrix<IssmDouble>* Jff){_error_("Not implemented yet");};
+ 		void CreateKMatrix(Matrix<IssmDouble>* Kff, Matrix<IssmDouble>* Kfs);
+ 		void CreatePVector(Vector<IssmDouble>* pf);
++		void GetNodesLidList(int* lidlist);
+ 		void GetNodesSidList(int* sidlist);
+-		void GetNodesLidList(int* lidlist);
+ 		int  GetNumberOfNodes(void);
+-		void CreateJacobianMatrix(Matrix<IssmDouble>* Jff){_error_("Not implemented yet");};
++		bool InAnalysis(int analysis_type);
+ 		bool IsPenalty(void);
+ 		void PenaltyCreateJacobianMatrix(Matrix<IssmDouble>* Jff,IssmDouble kmax){_error_("Not implemented yet");};
+ 		void PenaltyCreateKMatrix(Matrix<IssmDouble>* Kff, Matrix<IssmDouble>* kfs, IssmDouble kmax);
+ 		void PenaltyCreatePVector(Vector<IssmDouble>* pf, IssmDouble kmax);
++		void ResetHooks();
+ 		void SetwiseNodeConnectivity(int* d_nz,int* o_nz,Node* node,bool* flags,int* flagsindices,int set1_enum,int set2_enum);
+-		bool InAnalysis(int analysis_type);
++		void SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
+ 		/*}}}*/
+ 		/*Numericalflux management:{{{*/
+-		void           GetNormal(IssmDouble* normal,IssmDouble xyz_list[4][3]);
++		ElementMatrix* CreateKMatrixAdjointBalancethickness(void);
++		ElementMatrix* CreateKMatrixAdjointBalancethicknessBoundary(void);
++		ElementMatrix* CreateKMatrixAdjointBalancethicknessInternal(void);
++		ElementMatrix* CreateKMatrixBalancethickness(void);
++		ElementMatrix* CreateKMatrixBalancethicknessBoundary(void);
++		ElementMatrix* CreateKMatrixBalancethicknessInternal(void);
+ 		ElementMatrix* CreateKMatrixMasstransport(void);
++		ElementMatrix* CreateKMatrixMasstransportBoundary(void);
+ 		ElementMatrix* CreateKMatrixMasstransportInternal(void);
+-		ElementMatrix* CreateKMatrixMasstransportBoundary(void);
+-		ElementMatrix* CreateKMatrixBalancethickness(void);
+-		ElementMatrix* CreateKMatrixBalancethicknessInternal(void);
+-		ElementMatrix* CreateKMatrixBalancethicknessBoundary(void);
+-		ElementMatrix* CreateKMatrixAdjointBalancethickness(void);
+-		ElementMatrix* CreateKMatrixAdjointBalancethicknessInternal(void);
+-		ElementMatrix* CreateKMatrixAdjointBalancethicknessBoundary(void);
++		ElementVector* CreatePVectorAdjointBalancethickness(void);
++		ElementVector* CreatePVectorBalancethickness(void);
++		ElementVector* CreatePVectorBalancethicknessBoundary(void);
++		ElementVector* CreatePVectorBalancethicknessInternal(void);
+ 		ElementVector* CreatePVectorMasstransport(void);
++		ElementVector* CreatePVectorMasstransportBoundary(void);
+ 		ElementVector* CreatePVectorMasstransportInternal(void);
+-		ElementVector* CreatePVectorMasstransportBoundary(void);
+-		ElementVector* CreatePVectorBalancethickness(void);
+-		ElementVector* CreatePVectorBalancethicknessInternal(void);
+-		ElementVector* CreatePVectorBalancethicknessBoundary(void);
+-		ElementVector* CreatePVectorAdjointBalancethickness(void);
++		void           GetNormal(IssmDouble* normal,IssmDouble xyz_list[4][3]);
+ 		/*}}}*/
+ 
+ };
+Index: ../trunk-jpl/src/c/classes/Loads/Penpair.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Penpair.h	(revision 18925)
++++ ../trunk-jpl/src/c/classes/Loads/Penpair.h	(revision 18926)
+@@ -30,43 +30,43 @@
+ 		~Penpair();
+ 		/*}}}*/
+ 		/*Object virtual functions definitions:{{{ */
+-		void  Echo();
+-		void  DeepEcho();
+-		int   Id(); 
+-		int   ObjectEnum();
+ 		Object* copy();
++		void     DeepEcho();
++		void     Echo();
++		int      Id(); 
++		int      ObjectEnum();
+ 		/*}}}*/
+ 		/*Update virtual functions resolution: {{{*/
+-		void  InputUpdateFromVector(IssmDouble* vector, int name, int type);
+-		void  InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrow, int ncols,int name, int type){_error_("Not implemented yet!");}
+-		void  InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){_error_("Not implemented yet!");}
+ 		void  InputUpdateFromConstant(IssmDouble constant, int name);
+ 		void  InputUpdateFromConstant(int constant, int name);
+ 		void  InputUpdateFromConstant(bool constant, int name);
+ 		void  InputUpdateFromIoModel(int index, IoModel* iomodel){_error_("not implemented yet");};
++		void  InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrow, int ncols,int name, int type){_error_("Not implemented yet!");}
++		void  InputUpdateFromVector(IssmDouble* vector, int name, int type);
++		void  InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){_error_("Not implemented yet!");}
+ 		/*}}}*/
+ 			/*Load virtual functions definitions: {{{*/
+ 		void  Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
+-		void  ResetHooks();
+-		void  SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
++		void  CreateJacobianMatrix(Matrix<IssmDouble>* Jff);
+ 		void  CreateKMatrix(Matrix<IssmDouble>* Kff, Matrix<IssmDouble>* Kfs);
+ 		void  CreatePVector(Vector<IssmDouble>* pf);
+-		void  CreateJacobianMatrix(Matrix<IssmDouble>* Jff);
++		void  GetNodesLidList(int* lidlist);
+ 		void  GetNodesSidList(int* sidlist);
+-		void  GetNodesLidList(int* lidlist);
+ 		int   GetNumberOfNodes(void);
++		bool  InAnalysis(int analysis_type);
+ 		bool  IsPenalty(void);
++		void  PenaltyCreateJacobianMatrix(Matrix<IssmDouble>* Jff,IssmDouble kmax);
+ 		void  PenaltyCreateKMatrix(Matrix<IssmDouble>* Kff,Matrix<IssmDouble>* Kfs,IssmDouble kmax);
+ 		void  PenaltyCreatePVector(Vector<IssmDouble>* pf, IssmDouble kmax);
+-		void  PenaltyCreateJacobianMatrix(Matrix<IssmDouble>* Jff,IssmDouble kmax);
++		void  ResetHooks();
++		void  SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
+ 		void  SetwiseNodeConnectivity(int* d_nz,int* o_nz,Node* node,bool* flags,int* flagsindices,int set1_enum,int set2_enum);
+-		bool  InAnalysis(int analysis_type);
+ 		/*}}}*/
+ 			/*Penpair management: {{{*/
++		ElementMatrix* PenaltyCreateKMatrixMasstransport(IssmDouble kmax);
++		ElementMatrix* PenaltyCreateKMatrixStressbalanceFS(IssmDouble kmax);
+ 		ElementMatrix* PenaltyCreateKMatrixStressbalanceHoriz(IssmDouble kmax);
+ 		ElementMatrix* PenaltyCreateKMatrixStressbalanceSSAHO(IssmDouble kmax);
+-		ElementMatrix* PenaltyCreateKMatrixStressbalanceFS(IssmDouble kmax);
+-		ElementMatrix* PenaltyCreateKMatrixMasstransport(IssmDouble kmax);
+ 		/*}}}*/
+ };
+ 
+Index: ../trunk-jpl/src/c/classes/Loads/Load.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Load.h	(revision 18925)
++++ ../trunk-jpl/src/c/classes/Loads/Load.h	(revision 18926)
+@@ -25,19 +25,19 @@
+ 	public: 
+ 		virtual       ~Load(){};
+ 		virtual void  Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters)=0;
+-		virtual void  ResetHooks()=0;
+-		virtual bool  IsPenalty(void)=0;
+-		virtual int   GetNumberOfNodes(void)=0;
+-		virtual void  GetNodesSidList(int* sidlist)=0;
+-		virtual void  GetNodesLidList(int* lidlist)=0;
+-		virtual void  SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters)=0;
++		virtual void  CreateJacobianMatrix(Matrix<IssmDouble>* Jff)=0;
+ 		virtual void  CreateKMatrix(Matrix<IssmDouble>* Kff, Matrix<IssmDouble>* Kfs)=0;
+ 		virtual void  CreatePVector(Vector<IssmDouble>* pf)=0;
+-		virtual void  CreateJacobianMatrix(Matrix<IssmDouble>* Jff)=0;
++		virtual void  GetNodesLidList(int* lidlist)=0;
++		virtual void  GetNodesSidList(int* sidlist)=0;
++		virtual int   GetNumberOfNodes(void)=0;
++		virtual bool  InAnalysis(int analysis_type)=0;
++		virtual bool  IsPenalty(void)=0;
+ 		virtual void  PenaltyCreateJacobianMatrix(Matrix<IssmDouble>* Jff,IssmDouble kmax)=0;
+ 		virtual void  PenaltyCreateKMatrix(Matrix<IssmDouble>* Kff, Matrix<IssmDouble>* Kfs, IssmDouble kmax)=0;
+ 		virtual void  PenaltyCreatePVector(Vector<IssmDouble>* pf, IssmDouble kmax)=0;
+-		virtual bool  InAnalysis(int analysis_type)=0;
++		virtual void  ResetHooks()=0;
++		virtual void  SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters)=0;
+ 		virtual void  SetwiseNodeConnectivity(int* d_nz,int* o_nz,Node* node,bool* flags,int* flagsindices,int set1_enum,int set2_enum)=0;
+ };
+ #endif
+Index: ../trunk-jpl/src/c/classes/Loads/Loads.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Loads.h	(revision 18925)
++++ ../trunk-jpl/src/c/classes/Loads/Loads.h	(revision 18926)
+@@ -23,11 +23,11 @@
+ 
+ 		/*numerics*/
+ 		void  Configure(Elements* elements,Loads* loads, Nodes* nodes, Vertices* vertices, Materials* materials,Parameters* parameters);
+-		void  ResetHooks();
+ 		bool  IsPenalty(int analysis);
+ 		int   MaxNumNodes(int analysis);
+ 		int   NumberOfLoads(void);
+ 		int   NumberOfLoads(int analysis);
++		void  ResetHooks();
+ 		void  SetCurrentConfiguration(Elements* elements,Loads* loads, Nodes* nodes, Vertices* vertices, Materials* materials,Parameters* parameters);
+ 		int   Size(int analysis);
+ 		int   Size(void);
+Index: ../trunk-jpl/src/c/classes/Loads/Pengrid.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Pengrid.cpp	(revision 18925)
++++ ../trunk-jpl/src/c/classes/Loads/Pengrid.cpp	(revision 18926)
+@@ -80,31 +80,6 @@
+ /*}}}*/
+ 
+ /*Object virtual functions definitions:*/
+-void Pengrid::Echo(void){/*{{{*/
+-	this->DeepEcho();
+-}
+-/*}}}*/
+-void Pengrid::DeepEcho(void){/*{{{*/
+-
+-	_printf_("Pengrid:\n");
+-	_printf_("   id: " << id << "\n");
+-	_printf_("   analysis_type: " << EnumToStringx(analysis_type) << "\n");
+-	hnode->DeepEcho();
+-	helement->DeepEcho();
+-	hmatpar->DeepEcho();
+-	_printf_("   active " << this->active << "\n");
+-	_printf_("   zigzag_counter " << this->zigzag_counter << "\n");
+-	_printf_("   parameters\n");
+-	parameters->DeepEcho();
+-}
+-/*}}}*/
+-int    Pengrid::Id(void){ return id; }/*{{{*/
+-/*}}}*/
+-int Pengrid::ObjectEnum(void){/*{{{*/
+-
+-	return PengridEnum;
+-}
+-/*}}}*/
+ Object* Pengrid::copy() {/*{{{*/
+ 
+ 	Pengrid* pengrid=NULL;
+@@ -136,7 +111,32 @@
+ 
+ }
+ /*}}}*/
++void    Pengrid::DeepEcho(void){/*{{{*/
+ 
++	_printf_("Pengrid:\n");
++	_printf_("   id: " << id << "\n");
++	_printf_("   analysis_type: " << EnumToStringx(analysis_type) << "\n");
++	hnode->DeepEcho();
++	helement->DeepEcho();
++	hmatpar->DeepEcho();
++	_printf_("   active " << this->active << "\n");
++	_printf_("   zigzag_counter " << this->zigzag_counter << "\n");
++	_printf_("   parameters\n");
++	parameters->DeepEcho();
++}
++/*}}}*/
++void    Pengrid::Echo(void){/*{{{*/
++	this->DeepEcho();
++}
++/*}}}*/
++int     Pengrid::Id(void){ return id; }/*{{{*/
++/*}}}*/
++int     Pengrid::ObjectEnum(void){/*{{{*/
++
++	return PengridEnum;
++}
++/*}}}*/
++
+ /*Load virtual functions definitions:*/
+ void  Pengrid::Configure(Elements* elementsin,Loads* loadsin,Nodes* nodesin,Vertices* verticesin,Materials* materialsin,Parameters* parametersin){/*{{{*/
+ 
+@@ -155,24 +155,6 @@
+ 	this->parameters=parametersin;
+ }
+ /*}}}*/
+-void  Pengrid::SetCurrentConfiguration(Elements* elementsin,Loads* loadsin,Nodes* nodesin,Vertices* verticesin,Materials* materialsin,Parameters* parametersin){/*{{{*/
+-
+-}
+-/*}}}*/
+-void  Pengrid::ResetHooks(){/*{{{*/
+-
+-	this->node=NULL;
+-	this->element=NULL;
+-	this->matpar=NULL;
+-	this->parameters=NULL;
+-
+-	/*Get Element type*/
+-	this->hnode->reset();
+-	this->helement->reset();
+-	this->hmatpar->reset();
+-
+-}
+-/*}}}*/
+ void  Pengrid::CreateKMatrix(Matrix<IssmDouble>* Kff, Matrix<IssmDouble>* Kfs){/*{{{*/
+ 
+ 	/*No loads applied, do nothing: */
+@@ -202,20 +184,20 @@
+ 
+ }
+ /*}}}*/
+-void  Pengrid::GetNodesSidList(int* sidlist){/*{{{*/
++void  Pengrid::GetNodesLidList(int* lidlist){/*{{{*/
+ 
+-	_assert_(sidlist);
++	_assert_(lidlist);
+ 	_assert_(node);
+ 
+-	sidlist[0]=node->Sid();
++	lidlist[0]=node->Lid();
+ }
+ /*}}}*/
+-void  Pengrid::GetNodesLidList(int* lidlist){/*{{{*/
++void  Pengrid::GetNodesSidList(int* sidlist){/*{{{*/
+ 
+-	_assert_(lidlist);
++	_assert_(sidlist);
+ 	_assert_(node);
+ 
+-	lidlist[0]=node->Lid();
++	sidlist[0]=node->Sid();
+ }
+ /*}}}*/
+ int   Pengrid::GetNumberOfNodes(void){/*{{{*/
+@@ -223,6 +205,15 @@
+ 	return NUMVERTICES;
+ }
+ /*}}}*/
++bool  Pengrid::InAnalysis(int in_analysis_type){/*{{{*/
++	if (in_analysis_type==this->analysis_type)return true;
++	else return false;
++}
++/*}}}*/
++bool  Pengrid::IsPenalty(void){/*{{{*/
++	return true;
++}
++/*}}}*/
+ void  Pengrid::PenaltyCreateKMatrix(Matrix<IssmDouble>* Kff, Matrix<IssmDouble>* Kfs,IssmDouble kmax){/*{{{*/
+ 
+ 	/*Retrieve parameters: */
+@@ -281,13 +272,22 @@
+ 	}
+ }
+ /*}}}*/
+-bool  Pengrid::InAnalysis(int in_analysis_type){/*{{{*/
+-	if (in_analysis_type==this->analysis_type)return true;
+-	else return false;
++void  Pengrid::ResetHooks(){/*{{{*/
++
++	this->node=NULL;
++	this->element=NULL;
++	this->matpar=NULL;
++	this->parameters=NULL;
++
++	/*Get Element type*/
++	this->hnode->reset();
++	this->helement->reset();
++	this->hmatpar->reset();
++
+ }
+ /*}}}*/
+-bool  Pengrid::IsPenalty(void){/*{{{*/
+-	return true;
++void  Pengrid::SetCurrentConfiguration(Elements* elementsin,Loads* loadsin,Nodes* nodesin,Vertices* verticesin,Materials* materialsin,Parameters* parametersin){/*{{{*/
++
+ }
+ /*}}}*/
+ void  Pengrid::SetwiseNodeConnectivity(int* pd_nz,int* po_nz,Node* node,bool* flags,int* flagsindices,int set1_enum,int set2_enum){/*{{{*/
+@@ -342,18 +342,6 @@
+ /*}}}*/
+ 
+ /*Update virtual functions definitions:*/
+-void  Pengrid::InputUpdateFromVector(IssmDouble* vector, int name, int type){/*{{{*/
+-	/*Nothing updated yet*/
+-}
+-/*}}}*/
+-void  Pengrid::InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols, int name, int type){/*{{{*/
+-	/*Nothing updated yet*/
+-}
+-/*}}}*/
+-void  Pengrid::InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){/*{{{*/
+-	/*Nothing updated yet*/
+-}
+-/*}}}*/
+ void  Pengrid::InputUpdateFromConstant(IssmDouble constant, int name){/*{{{*/
+ 	/*Nothing*/
+ }
+@@ -373,9 +361,21 @@
+ 	}
+ }
+ /*}}}*/
++void  Pengrid::InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols, int name, int type){/*{{{*/
++	/*Nothing updated yet*/
++}
++/*}}}*/
++void  Pengrid::InputUpdateFromVector(IssmDouble* vector, int name, int type){/*{{{*/
++	/*Nothing updated yet*/
++}
++/*}}}*/
++void  Pengrid::InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){/*{{{*/
++	/*Nothing updated yet*/
++}
++/*}}}*/
+ 
+ /*Pengrid management:*/
+-void  Pengrid::ConstraintActivate(int* punstable){/*{{{*/
++void           Pengrid::ConstraintActivate(int* punstable){/*{{{*/
+ 
+ 	int analysis_type;
+ 
+@@ -403,8 +403,68 @@
+ 
+ }
+ /*}}}*/
+-void  Pengrid::ConstraintActivateThermal(int* punstable){/*{{{*/
++void           Pengrid::ConstraintActivateHydrologyDCInefficient(int* punstable){/*{{{*/
+ 
++	//   The penalty is stable if it doesn't change during two consecutive iterations.   
++	int        unstable=0;
++	int        new_active;
++	int        penalty_lock;
++	IssmDouble pressure;
++	IssmDouble h;
++	IssmDouble h_max;	
++	HydrologyDCInefficientAnalysis* inefanalysis = NULL;
++
++	/*check that pengrid is not a clone (penalty to be added only once)*/
++	if(node->IsClone()){
++		unstable=0;
++		*punstable=unstable;
++		return;
++	}
++	if(!element->IsOnBase()){
++		unstable=0;
++		active=0;
++		*punstable=unstable;
++		return;
++	}
++
++	/*Get sediment water head h*/
++	inefanalysis = new HydrologyDCInefficientAnalysis();
++	element->GetInputValue(&h,node,SedimentHeadEnum);
++	inefanalysis->GetHydrologyDCInefficientHmax(&h_max,element,node);
++	parameters->FindParam(&penalty_lock,HydrologydcPenaltyLockEnum);
++
++	if (h>h_max){
++	 new_active=1;
++	}
++	else{
++	 new_active=0;
++	}
++
++	if(this->active==new_active){
++		unstable=0;
++	}
++	else{
++		unstable=1;
++		if(penalty_lock)zigzag_counter++;
++	}
++
++	/*If penalty keeps zigzagging more than penalty_lock times: */
++	if(penalty_lock){
++		if(zigzag_counter>penalty_lock){
++			unstable=0;
++			active=1;
++		}
++	}
++	/*Set penalty flag*/
++	this->active=new_active;
++
++	/*Assign output pointers:*/
++	delete inefanalysis;
++	*punstable=unstable;
++}
++/*}}}*/
++void           Pengrid::ConstraintActivateThermal(int* punstable){/*{{{*/
++
+ 	//   The penalty is stable if it doesn't change during to successive iterations.   
+ 	IssmDouble pressure;
+ 	IssmDouble temperature;
+@@ -466,6 +526,38 @@
+ 	*punstable=unstable;
+ }
+ /*}}}*/
++ElementVector* Pengrid::CreatePVectorHydrologyDCInefficient(void){/*{{{*/
++
++	IssmDouble moulin_load,dt;
++
++	/*Initialize Element matrix*/
++	ElementVector* pe=new ElementVector(&node,1,this->parameters);
++
++	this->element->GetInputValue(&moulin_load,node,HydrologydcBasalMoulinInputEnum);
++	parameters->FindParam(&dt,TimesteppingTimeStepEnum);
++
++	if(dt!=0.0) pe->values[0]=moulin_load*dt;
++
++	/*Clean up and return*/
++	return pe;
++ }
++/*}}}*/
++ElementMatrix* Pengrid::PenaltyCreateKMatrixHydrologyDCInefficient(IssmDouble kmax){/*{{{*/
++	IssmDouble    penalty_factor;
++
++	/*Retrieve parameters*/
++	parameters->FindParam(&penalty_factor,HydrologydcPenaltyFactorEnum);
++
++	/*Initialize Element matrix and return if necessary*/
++	if(!this->active) return NULL;
++	ElementMatrix* Ke=new ElementMatrix(&node,NUMVERTICES,this->parameters);
++
++	Ke->values[0]=kmax*pow(10.,penalty_factor);
++
++	/*Clean up and return*/
++	return Ke;
++}
++/*}}}*/
+ ElementMatrix* Pengrid::PenaltyCreateKMatrixMelting(IssmDouble kmax){/*{{{*/
+ 
+ 	IssmDouble pressure,temperature,t_pmp;
+@@ -511,6 +603,30 @@
+ 	return Ke;
+ }
+ /*}}}*/
++ElementVector* Pengrid::PenaltyCreatePVectorHydrologyDCInefficient(IssmDouble kmax){/*{{{*/
++
++	IssmDouble h_max;
++	IssmDouble penalty_factor;
++	HydrologyDCInefficientAnalysis* inefanalysis = NULL;
++
++	/*Initialize Element matrix and return if necessary*/
++	if(!this->active) return NULL;
++	ElementVector* pe=new ElementVector(&node,1,this->parameters);
++	inefanalysis = new HydrologyDCInefficientAnalysis();
++
++	/*Retrieve parameters*/
++	parameters->FindParam(&penalty_factor,HydrologydcPenaltyFactorEnum);
++
++	/*Get h_max and compute penalty*/
++	inefanalysis->GetHydrologyDCInefficientHmax(&h_max,element,node);
++
++	pe->values[0]=kmax*pow(10.,penalty_factor)*h_max;
++
++	/*Clean up and return*/
++	delete inefanalysis;
++	return pe;
++}
++/*}}}*/
+ ElementVector* Pengrid::PenaltyCreatePVectorMelting(IssmDouble kmax){/*{{{*/
+ 
+ 	IssmDouble pressure;
+@@ -577,123 +693,7 @@
+ 	return pe;
+ }
+ /*}}}*/
+-void  Pengrid::ConstraintActivateHydrologyDCInefficient(int* punstable){/*{{{*/
+-
+-	//   The penalty is stable if it doesn't change during two consecutive iterations.   
+-	int        unstable=0;
+-	int        new_active;
+-	int        penalty_lock;
+-	IssmDouble pressure;
+-	IssmDouble h;
+-	IssmDouble h_max;	
+-	HydrologyDCInefficientAnalysis* inefanalysis = NULL;
+-
+-	/*check that pengrid is not a clone (penalty to be added only once)*/
+-	if(node->IsClone()){
+-		unstable=0;
+-		*punstable=unstable;
+-		return;
+-	}
+-	if(!element->IsOnBase()){
+-		unstable=0;
+-		active=0;
+-		*punstable=unstable;
+-		return;
+-	}
+-
+-	/*Get sediment water head h*/
+-	inefanalysis = new HydrologyDCInefficientAnalysis();
+-	element->GetInputValue(&h,node,SedimentHeadEnum);
+-	inefanalysis->GetHydrologyDCInefficientHmax(&h_max,element,node);
+-	parameters->FindParam(&penalty_lock,HydrologydcPenaltyLockEnum);
+-
+-	if (h>h_max){
+-	 new_active=1;
+-	}
+-	else{
+-	 new_active=0;
+-	}
+-
+-	if(this->active==new_active){
+-		unstable=0;
+-	}
+-	else{
+-		unstable=1;
+-		if(penalty_lock)zigzag_counter++;
+-	}
+-
+-	/*If penalty keeps zigzagging more than penalty_lock times: */
+-	if(penalty_lock){
+-		if(zigzag_counter>penalty_lock){
+-			unstable=0;
+-			active=1;
+-		}
+-	}
+-	/*Set penalty flag*/
+-	this->active=new_active;
+-
+-	/*Assign output pointers:*/
+-	delete inefanalysis;
+-	*punstable=unstable;
+-}
+-/*}}}*/
+-ElementMatrix* Pengrid::PenaltyCreateKMatrixHydrologyDCInefficient(IssmDouble kmax){/*{{{*/
+-	IssmDouble    penalty_factor;
+-
+-	/*Retrieve parameters*/
+-	parameters->FindParam(&penalty_factor,HydrologydcPenaltyFactorEnum);
+-
+-	/*Initialize Element matrix and return if necessary*/
+-	if(!this->active) return NULL;
+-	ElementMatrix* Ke=new ElementMatrix(&node,NUMVERTICES,this->parameters);
+-
+-	Ke->values[0]=kmax*pow(10.,penalty_factor);
+-
+-	/*Clean up and return*/
+-	return Ke;
+-}
+-/*}}}*/
+-ElementVector* Pengrid::PenaltyCreatePVectorHydrologyDCInefficient(IssmDouble kmax){/*{{{*/
+-
+-	IssmDouble h_max;
+-	IssmDouble penalty_factor;
+-	HydrologyDCInefficientAnalysis* inefanalysis = NULL;
+-
+-	/*Initialize Element matrix and return if necessary*/
+-	if(!this->active) return NULL;
+-	ElementVector* pe=new ElementVector(&node,1,this->parameters);
+-	inefanalysis = new HydrologyDCInefficientAnalysis();
+-
+-	/*Retrieve parameters*/
+-	parameters->FindParam(&penalty_factor,HydrologydcPenaltyFactorEnum);
+-
+-	/*Get h_max and compute penalty*/
+-	inefanalysis->GetHydrologyDCInefficientHmax(&h_max,element,node);
+-
+-	pe->values[0]=kmax*pow(10.,penalty_factor)*h_max;
+-
+-	/*Clean up and return*/
+-	delete inefanalysis;
+-	return pe;
+-}
+-/*}}}*/
+-ElementVector* Pengrid::CreatePVectorHydrologyDCInefficient(void){/*{{{*/
+-
+-	IssmDouble moulin_load,dt;
+-
+-	/*Initialize Element matrix*/
+-	ElementVector* pe=new ElementVector(&node,1,this->parameters);
+-
+-	this->element->GetInputValue(&moulin_load,node,HydrologydcBasalMoulinInputEnum);
+-	parameters->FindParam(&dt,TimesteppingTimeStepEnum);
+-
+-	if(dt!=0.0) pe->values[0]=moulin_load*dt;
+-
+-	/*Clean up and return*/
+-	return pe;
+- }
+-/*}}}*/
+-void  Pengrid::ResetConstraint(void){/*{{{*/
++void           Pengrid::ResetConstraint(void){/*{{{*/
+ 	active         = 0;
+ 	zigzag_counter = 0;
+ }
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18925)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18926)
+@@ -39,45 +39,22 @@
+ 	_printf_("   dim: " << this->dim<< "\n");
+ }
+ /*}}}*/
+-void Friction::GetAlpha2(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
++void Friction::GetAlphaComplement(IssmDouble* palpha_complement, Gauss* gauss){/*{{{*/
+ 
+-	switch(this->law){
+-		case 1:
+-			GetAlpha2Viscous(palpha2,gauss);
+-			break;
+-		case 2:
+-			GetAlpha2Weertman(palpha2,gauss);
+-			break;
+-		case 3:
+-			GetAlpha2Hydro(palpha2,gauss);
+-			break;
+-		case 4:
+-			GetAlpha2Temp(palpha2,gauss);
+-			break;
+-		case 5:
+-			GetAlpha2WaterLayer(palpha2,gauss);
+-			break;
+-		case 6:
+-			GetAlpha2WeertmanTemp(palpha2,gauss);
+-			break;
+-	  default:
+-			_error_("not supported");
+-	}
++	/* FrictionGetAlpha2 computes alpha2= drag^2 * Neff ^r * vel ^s, with Neff=rho_ice*g*thickness+rho_ice*g*bed, r=q/p and s=1/p. 
++	 * FrictionGetAlphaComplement is used in control methods on drag, and it computes: 
++	 * alpha_complement= Neff ^r * vel ^s*/
+ 
+-}/*}}}*/
+-void Friction::GetAlpha2Viscous(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
++	if(this->law!=1)_error_("not supported");
+ 
+-	/*This routine calculates the basal friction coefficient 
+-	  alpha2= drag^2 * Neff ^r * | vel | ^(s-1), with Neff=rho_ice*g*thickness+rho_ice*g*bed, r=q/p and s=1/p**/
+-
+ 	/*diverse: */
+ 	IssmDouble  r,s;
+-	IssmDouble  drag_p, drag_q;
++	IssmDouble  vx,vy,vz,vmag;
++	IssmDouble  drag_p,drag_q;
+ 	IssmDouble  Neff;
+-	IssmDouble  thickness,bed;
+-	IssmDouble  vx,vy,vz,vmag;
+ 	IssmDouble  drag_coefficient;
+-	IssmDouble  alpha2;
++	IssmDouble  bed,thickness;
++	IssmDouble  alpha_complement;
+ 
+ 	/*Recover parameters: */
+ 	element->GetInputValue(&drag_p,FrictionPEnum);
+@@ -97,6 +74,7 @@
+ 	Neff=gravity*(rho_ice*thickness+rho_water*bed);
+ 	if(Neff<0)Neff=0;
+ 
++	//We need the velocity magnitude to evaluate the basal stress:
+ 	switch(dim){
+ 		case 1:
+ 			element->GetInputValue(&vx,gauss,VxEnum);
+@@ -118,53 +96,38 @@
+ 	}
+ 
+ 	/*Check to prevent dividing by zero if vmag==0*/
+-	if(vmag==0. && (s-1.)<0.) alpha2=0.;
+-	else alpha2=drag_coefficient*drag_coefficient*pow(Neff,r)*pow(vmag,(s-1.));
+-	_assert_(!xIsNan<IssmDouble>(alpha2));
++	if(vmag==0. && (s-1.)<0.) alpha_complement=0.;
++	else alpha_complement=pow(Neff,r)*pow(vmag,(s-1));_assert_(!xIsNan<IssmDouble>(alpha_complement));
+ 
+ 	/*Assign output pointers:*/
+-	*palpha2=alpha2;
+-}/*}}}*/
+-void Friction::GetAlpha2Weertman(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
++	*palpha_complement=alpha_complement;
++}
++/*}}}*/
++void Friction::GetAlpha2(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
+ 
+-	/*This routine calculates the basal friction coefficient alpha2= C^-1/m |v|^(1/m-1) */
+-
+-	/*diverse: */
+-	IssmDouble  C,m;
+-	IssmDouble  vx,vy,vz,vmag;
+-	IssmDouble  alpha2;
+-
+-	/*Recover parameters: */
+-	element->GetInputValue(&C,gauss,FrictionCEnum);
+-	element->GetInputValue(&m,FrictionMEnum);
+-
+-	switch(dim){
++	switch(this->law){
+ 		case 1:
+-			element->GetInputValue(&vx,gauss,VxEnum);
+-			vmag=sqrt(vx*vx);
++			GetAlpha2Viscous(palpha2,gauss);
+ 			break;
+ 		case 2:
+-			element->GetInputValue(&vx,gauss,VxEnum);
+-			element->GetInputValue(&vy,gauss,VyEnum);
+-			vmag=sqrt(vx*vx+vy*vy);
++			GetAlpha2Weertman(palpha2,gauss);
+ 			break;
+ 		case 3:
+-			element->GetInputValue(&vx,gauss,VxEnum);
+-			element->GetInputValue(&vy,gauss,VyEnum);
+-			element->GetInputValue(&vz,gauss,VzEnum);
+-			vmag=sqrt(vx*vx+vy*vy+vz*vz);
++			GetAlpha2Hydro(palpha2,gauss);
+ 			break;
+-		default:
++		case 4:
++			GetAlpha2Temp(palpha2,gauss);
++			break;
++		case 5:
++			GetAlpha2WaterLayer(palpha2,gauss);
++			break;
++		case 6:
++			GetAlpha2WeertmanTemp(palpha2,gauss);
++			break;
++	  default:
+ 			_error_("not supported");
+ 	}
+ 
+-	/*Check to prevent dividing by zero if vmag==0*/
+-	if(vmag==0. && (1./m-1.)<0.) alpha2=0.;
+-	else alpha2=pow(C,-1./m)*pow(vmag,(1./m-1.));
+-	_assert_(!xIsNan<IssmDouble>(alpha2));
+-
+-	/*Assign output pointers:*/
+-	*palpha2=alpha2;
+ }/*}}}*/
+ void Friction::GetAlpha2Hydro(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
+ 
+@@ -259,7 +222,7 @@
+ 	/*Assign output pointers:*/
+ 	*palpha2=alpha2;
+ }/*}}}*/
+-void Friction::GetAlpha2WaterLayer(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
++void Friction::GetAlpha2Viscous(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
+ 
+ 	/*This routine calculates the basal friction coefficient 
+ 	  alpha2= drag^2 * Neff ^r * | vel | ^(s-1), with Neff=rho_ice*g*thickness+rho_ice*g*bed, r=q/p and s=1/p**/
+@@ -270,7 +233,7 @@
+ 	IssmDouble  Neff;
+ 	IssmDouble  thickness,bed;
+ 	IssmDouble  vx,vy,vz,vmag;
+-	IssmDouble  drag_coefficient,water_layer;
++	IssmDouble  drag_coefficient;
+ 	IssmDouble  alpha2;
+ 
+ 	/*Recover parameters: */
+@@ -279,7 +242,6 @@
+ 	element->GetInputValue(&thickness, gauss,ThicknessEnum);
+ 	element->GetInputValue(&bed, gauss,BaseEnum);
+ 	element->GetInputValue(&drag_coefficient, gauss,FrictionCoefficientEnum);
+-	element->GetInputValue(&water_layer, gauss,FrictionWaterLayerEnum);
+ 	IssmDouble rho_water   = element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
+ 	IssmDouble rho_ice     = element->GetMaterialParameter(MaterialsRhoIceEnum);
+ 	IssmDouble gravity     = element->GetMaterialParameter(ConstantsGEnum);
+@@ -289,9 +251,8 @@
+ 	s=1./drag_p;
+ 
+ 	//From bed and thickness, compute effective pressure when drag is viscous:
+-	if(bed>0) bed=0;
+-	Neff=gravity*(rho_ice*thickness+rho_water*(bed-water_layer));
+-	if(Neff<0) Neff=0;
++	Neff=gravity*(rho_ice*thickness+rho_water*bed);
++	if(Neff<0)Neff=0;
+ 
+ 	switch(dim){
+ 		case 1:
+@@ -321,49 +282,19 @@
+ 	/*Assign output pointers:*/
+ 	*palpha2=alpha2;
+ }/*}}}*/
+-void Friction::GetAlpha2WeertmanTemp(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
+-	/*Here, we want to parameterize the friction as a function of temperature
+-	 *
+-	 * alpha2 = alpha2_weertman * 1/f(T)
+-	 *
+-	 * where f(T) = exp((T-Tpmp)/gamma)
+-	 */
++void Friction::GetAlpha2WaterLayer(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
+ 
+-	/*Intermediaries: */
+-	IssmDouble  f,T,pressure,Tpmp,gamma;
+-	IssmDouble  alpha2;
++	/*This routine calculates the basal friction coefficient 
++	  alpha2= drag^2 * Neff ^r * | vel | ^(s-1), with Neff=rho_ice*g*thickness+rho_ice*g*bed, r=q/p and s=1/p**/
+ 
+-	/*Get viscous part*/
+-	this->GetAlpha2Weertman(&alpha2,gauss);
+-
+-	/*Get pressure melting point (Tpmp) for local pressure and get current temperature*/
+-	element->GetInputValue(&T,gauss,TemperatureEnum);
+-	element->GetInputValue(&pressure,gauss,PressureEnum);
+-	Tpmp = element->TMeltingPoint(pressure);
+-
+-	/*Compute scaling parameter*/
+-	element->parameters->FindParam(&gamma,FrictionGammaEnum);
+-	alpha2 = alpha2 / exp((T-Tpmp)/gamma);
+-
+-	/*Assign output pointers:*/
+-	*palpha2=alpha2;
+-}/*}}}*/
+-void Friction::GetAlphaComplement(IssmDouble* palpha_complement, Gauss* gauss){/*{{{*/
+-
+-	/* FrictionGetAlpha2 computes alpha2= drag^2 * Neff ^r * vel ^s, with Neff=rho_ice*g*thickness+rho_ice*g*bed, r=q/p and s=1/p. 
+-	 * FrictionGetAlphaComplement is used in control methods on drag, and it computes: 
+-	 * alpha_complement= Neff ^r * vel ^s*/
+-
+-	if(this->law!=1)_error_("not supported");
+-
+ 	/*diverse: */
+ 	IssmDouble  r,s;
++	IssmDouble  drag_p, drag_q;
++	IssmDouble  Neff;
++	IssmDouble  thickness,bed;
+ 	IssmDouble  vx,vy,vz,vmag;
+-	IssmDouble  drag_p,drag_q;
+-	IssmDouble  Neff;
+-	IssmDouble  drag_coefficient;
+-	IssmDouble  bed,thickness;
+-	IssmDouble  alpha_complement;
++	IssmDouble  drag_coefficient,water_layer;
++	IssmDouble  alpha2;
+ 
+ 	/*Recover parameters: */
+ 	element->GetInputValue(&drag_p,FrictionPEnum);
+@@ -371,6 +302,7 @@
+ 	element->GetInputValue(&thickness, gauss,ThicknessEnum);
+ 	element->GetInputValue(&bed, gauss,BaseEnum);
+ 	element->GetInputValue(&drag_coefficient, gauss,FrictionCoefficientEnum);
++	element->GetInputValue(&water_layer, gauss,FrictionWaterLayerEnum);
+ 	IssmDouble rho_water   = element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
+ 	IssmDouble rho_ice     = element->GetMaterialParameter(MaterialsRhoIceEnum);
+ 	IssmDouble gravity     = element->GetMaterialParameter(ConstantsGEnum);
+@@ -380,10 +312,10 @@
+ 	s=1./drag_p;
+ 
+ 	//From bed and thickness, compute effective pressure when drag is viscous:
+-	Neff=gravity*(rho_ice*thickness+rho_water*bed);
+-	if(Neff<0)Neff=0;
++	if(bed>0) bed=0;
++	Neff=gravity*(rho_ice*thickness+rho_water*(bed-water_layer));
++	if(Neff<0) Neff=0;
+ 
+-	//We need the velocity magnitude to evaluate the basal stress:
+ 	switch(dim){
+ 		case 1:
+ 			element->GetInputValue(&vx,gauss,VxEnum);
+@@ -405,10 +337,78 @@
+ 	}
+ 
+ 	/*Check to prevent dividing by zero if vmag==0*/
+-	if(vmag==0. && (s-1.)<0.) alpha_complement=0.;
+-	else alpha_complement=pow(Neff,r)*pow(vmag,(s-1));_assert_(!xIsNan<IssmDouble>(alpha_complement));
++	if(vmag==0. && (s-1.)<0.) alpha2=0.;
++	else alpha2=drag_coefficient*drag_coefficient*pow(Neff,r)*pow(vmag,(s-1.));
++	_assert_(!xIsNan<IssmDouble>(alpha2));
+ 
+ 	/*Assign output pointers:*/
+-	*palpha_complement=alpha_complement;
+-}
+-/*}}}*/
++	*palpha2=alpha2;
++}/*}}}*/
++void Friction::GetAlpha2Weertman(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
++
++	/*This routine calculates the basal friction coefficient alpha2= C^-1/m |v|^(1/m-1) */
++
++	/*diverse: */
++	IssmDouble  C,m;
++	IssmDouble  vx,vy,vz,vmag;
++	IssmDouble  alpha2;
++
++	/*Recover parameters: */
++	element->GetInputValue(&C,gauss,FrictionCEnum);
++	element->GetInputValue(&m,FrictionMEnum);
++
++	switch(dim){
++		case 1:
++			element->GetInputValue(&vx,gauss,VxEnum);
++			vmag=sqrt(vx*vx);
++			break;
++		case 2:
++			element->GetInputValue(&vx,gauss,VxEnum);
++			element->GetInputValue(&vy,gauss,VyEnum);
++			vmag=sqrt(vx*vx+vy*vy);
++			break;
++		case 3:
++			element->GetInputValue(&vx,gauss,VxEnum);
++			element->GetInputValue(&vy,gauss,VyEnum);
++			element->GetInputValue(&vz,gauss,VzEnum);
++			vmag=sqrt(vx*vx+vy*vy+vz*vz);
++			break;
++		default:
++			_error_("not supported");
++	}
++
++	/*Check to prevent dividing by zero if vmag==0*/
++	if(vmag==0. && (1./m-1.)<0.) alpha2=0.;
++	else alpha2=pow(C,-1./m)*pow(vmag,(1./m-1.));
++	_assert_(!xIsNan<IssmDouble>(alpha2));
++
++	/*Assign output pointers:*/
++	*palpha2=alpha2;
++}/*}}}*/
++void Friction::GetAlpha2WeertmanTemp(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
++	/*Here, we want to parameterize the friction as a function of temperature
++	 *
++	 * alpha2 = alpha2_weertman * 1/f(T)
++	 *
++	 * where f(T) = exp((T-Tpmp)/gamma)
++	 */
++
++	/*Intermediaries: */
++	IssmDouble  f,T,pressure,Tpmp,gamma;
++	IssmDouble  alpha2;
++
++	/*Get viscous part*/
++	this->GetAlpha2Weertman(&alpha2,gauss);
++
++	/*Get pressure melting point (Tpmp) for local pressure and get current temperature*/
++	element->GetInputValue(&T,gauss,TemperatureEnum);
++	element->GetInputValue(&pressure,gauss,PressureEnum);
++	Tpmp = element->TMeltingPoint(pressure);
++
++	/*Compute scaling parameter*/
++	element->parameters->FindParam(&gamma,FrictionGammaEnum);
++	alpha2 = alpha2 / exp((T-Tpmp)/gamma);
++
++	/*Assign output pointers:*/
++	*palpha2=alpha2;
++}/*}}}*/
+Index: ../trunk-jpl/src/c/classes/Loads/Riftfront.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Riftfront.cpp	(revision 18925)
++++ ../trunk-jpl/src/c/classes/Loads/Riftfront.cpp	(revision 18926)
+@@ -107,52 +107,6 @@
+ /*}}}*/
+ 
+ /*Object virtual functions definitions:*/
+-void Riftfront::Echo(void){/*{{{*/
+-
+-	_printf_("Riftfront:\n");
+-	_printf_("   id: " << id << "\n");
+-	_printf_("   analysis_type: " << EnumToStringx(analysis_type) << "\n");
+-	_printf_("   hnodes: " << hnodes << "\n");
+-	_printf_("   helements: " << helements << "\n");
+-	_printf_("   hmatpar: " << hmatpar << "\n");
+-	_printf_("   parameters: " << parameters << "\n");
+-	_printf_("   internal parameters: \n");
+-	_printf_("   normal: " << normal[0] << "|" << normal[1] << "\n");
+-	_printf_("   length: " << length << "\n");
+-	_printf_("   penalty_lock: " << penalty_lock << "\n");
+-	_printf_("   active: " <<(active ? "true":"false") << "\n");
+-	_printf_("   counter: " << counter << "\n");
+-	_printf_("   prestable: " << (prestable ? "true":"false") << "\n");
+-	_printf_("   material_converged: " << (material_converged ? "true":"false") << "\n");
+-	_printf_("   fill: " << fill << "\n");
+-	_printf_("   friction: " << friction << "\n");
+-	_printf_("   fraction: " << fraction << "\n");
+-	_printf_("   fractionincrement: " << fractionincrement << "\n");
+-	_printf_("   state: " << state << "\n");
+-	_printf_("   frozen: " << (frozen ? "true":"false") << "\n");
+-
+-}
+-/*}}}*/
+-void Riftfront::DeepEcho(void){/*{{{*/
+-
+-	_printf_("Riftfront:\n");
+-	_printf_("   id: " << id << "\n");
+-	_printf_("   analysis_type: " << EnumToStringx(analysis_type) << "\n");
+-	hnodes->DeepEcho();
+-	helements->DeepEcho();
+-	hmatpar->DeepEcho();
+-	_printf_("   parameters\n");
+-	if(parameters)parameters->DeepEcho();
+-}
+-/*}}}*/
+-int    Riftfront::Id(void){ return id; }/*{{{*/
+-/*}}}*/
+-int Riftfront::ObjectEnum(void){/*{{{*/
+-
+-	return RiftfrontEnum;
+-
+-}
+-/*}}}*/
+ Object* Riftfront::copy() {/*{{{*/
+ 
+ 	Riftfront* riftfront=NULL;
+@@ -198,7 +152,53 @@
+ 
+ }
+ /*}}}*/
++void    Riftfront::DeepEcho(void){/*{{{*/
+ 
++	_printf_("Riftfront:\n");
++	_printf_("   id: " << id << "\n");
++	_printf_("   analysis_type: " << EnumToStringx(analysis_type) << "\n");
++	hnodes->DeepEcho();
++	helements->DeepEcho();
++	hmatpar->DeepEcho();
++	_printf_("   parameters\n");
++	if(parameters)parameters->DeepEcho();
++}
++/*}}}*/
++void    Riftfront::Echo(void){/*{{{*/
++
++	_printf_("Riftfront:\n");
++	_printf_("   id: " << id << "\n");
++	_printf_("   analysis_type: " << EnumToStringx(analysis_type) << "\n");
++	_printf_("   hnodes: " << hnodes << "\n");
++	_printf_("   helements: " << helements << "\n");
++	_printf_("   hmatpar: " << hmatpar << "\n");
++	_printf_("   parameters: " << parameters << "\n");
++	_printf_("   internal parameters: \n");
++	_printf_("   normal: " << normal[0] << "|" << normal[1] << "\n");
++	_printf_("   length: " << length << "\n");
++	_printf_("   penalty_lock: " << penalty_lock << "\n");
++	_printf_("   active: " <<(active ? "true":"false") << "\n");
++	_printf_("   counter: " << counter << "\n");
++	_printf_("   prestable: " << (prestable ? "true":"false") << "\n");
++	_printf_("   material_converged: " << (material_converged ? "true":"false") << "\n");
++	_printf_("   fill: " << fill << "\n");
++	_printf_("   friction: " << friction << "\n");
++	_printf_("   fraction: " << fraction << "\n");
++	_printf_("   fractionincrement: " << fractionincrement << "\n");
++	_printf_("   state: " << state << "\n");
++	_printf_("   frozen: " << (frozen ? "true":"false") << "\n");
++
++}
++/*}}}*/
++int     Riftfront::Id(void){ return id; }/*{{{*/
++/*}}}*/
++int     Riftfront::ObjectEnum(void){/*{{{*/
++
++	return RiftfrontEnum;
++
++}
++/*}}}*/
++
+ /*Update virtual functions definitions:*/
+ void  Riftfront::InputUpdateFromConstant(bool constant,int name){/*{{{*/
+ }
+@@ -233,28 +233,46 @@
+ 
+ }
+ /*}}}*/
+-void  Riftfront::ResetHooks(){/*{{{*/
++void  Riftfront::CreateKMatrix(Matrix<IssmDouble>* Kff, Matrix<IssmDouble>* Kfs){/*{{{*/
++	/*do nothing: */
++	return;
++}
++/*}}}*/
++void  Riftfront::CreatePVector(Vector<IssmDouble>* pf){/*{{{*/
++	/*do nothing: */
++	return;
++}
++/*}}}*/
++void  Riftfront::GetNodesLidList(int* lidlist){/*{{{*/
+ 
+-	this->nodes=NULL;
+-	this->elements=NULL;
+-	this->matpar=NULL;
+-	this->parameters=NULL;
++	_assert_(lidlist);
++	_assert_(nodes);
+ 
+-	/*Get Element type*/
+-	this->hnodes->reset();
+-	this->helements->reset();
+-	this->hmatpar->reset();
++	for(int i=0;i<NUMVERTICES;i++) lidlist[i]=nodes[i]->Lid();
++}
++/*}}}*/
++void  Riftfront::GetNodesSidList(int* sidlist){/*{{{*/
+ 
++	_assert_(sidlist);
++	_assert_(nodes);
++
++	for(int i=0;i<NUMVERTICES;i++) sidlist[i]=nodes[i]->Sid();
+ }
+ /*}}}*/
++int   Riftfront::GetNumberOfNodes(void){/*{{{*/
++
++	return NUMVERTICES;
++}
++/*}}}*/
++bool  Riftfront::InAnalysis(int in_analysis_type){/*{{{*/
++	if (in_analysis_type==this->analysis_type) return true;
++	else return false;
++}
++/*}}}*/
+ bool  Riftfront::IsPenalty(void){/*{{{*/
+ 	return true;
+ }
+ /*}}}*/
+-void  Riftfront::SetCurrentConfiguration(Elements* elementsin,Loads* loadsin,Nodes* nodesin,Vertices* verticesin,Materials* materialsin,Parameters* parametersin){/*{{{*/
+-
+-}
+-/*}}}*/
+ void  Riftfront::PenaltyCreateKMatrix(Matrix<IssmDouble>* Kff, Matrix<IssmDouble>* Kfs,IssmDouble kmax){/*{{{*/
+ 
+ 	/*Retrieve parameters: */
+@@ -305,42 +323,24 @@
+ 	}
+ }
+ /*}}}*/
+-void  Riftfront::CreateKMatrix(Matrix<IssmDouble>* Kff, Matrix<IssmDouble>* Kfs){/*{{{*/
+-	/*do nothing: */
+-	return;
+-}
+-/*}}}*/
+-void  Riftfront::CreatePVector(Vector<IssmDouble>* pf){/*{{{*/
+-	/*do nothing: */
+-	return;
+-}
+-/*}}}*/
+-void  Riftfront::GetNodesSidList(int* sidlist){/*{{{*/
++void  Riftfront::ResetHooks(){/*{{{*/
+ 
+-	_assert_(sidlist);
+-	_assert_(nodes);
++	this->nodes=NULL;
++	this->elements=NULL;
++	this->matpar=NULL;
++	this->parameters=NULL;
+ 
+-	for(int i=0;i<NUMVERTICES;i++) sidlist[i]=nodes[i]->Sid();
+-}
+-/*}}}*/
+-void  Riftfront::GetNodesLidList(int* lidlist){/*{{{*/
++	/*Get Element type*/
++	this->hnodes->reset();
++	this->helements->reset();
++	this->hmatpar->reset();
+ 
+-	_assert_(lidlist);
+-	_assert_(nodes);
+-
+-	for(int i=0;i<NUMVERTICES;i++) lidlist[i]=nodes[i]->Lid();
+ }
+ /*}}}*/
+-int   Riftfront::GetNumberOfNodes(void){/*{{{*/
++void  Riftfront::SetCurrentConfiguration(Elements* elementsin,Loads* loadsin,Nodes* nodesin,Vertices* verticesin,Materials* materialsin,Parameters* parametersin){/*{{{*/
+ 
+-	return NUMVERTICES;
+ }
+ /*}}}*/
+-bool  Riftfront::InAnalysis(int in_analysis_type){/*{{{*/
+-	if (in_analysis_type==this->analysis_type) return true;
+-	else return false;
+-}
+-/*}}}*/
+ void  Riftfront::SetwiseNodeConnectivity(int* pd_nz,int* po_nz,Node* node,bool* flags,int* flagsindices,int set1_enum,int set2_enum){/*{{{*/
+ 
+ 	/*Output */
Index: /issm/oecreview/Archive/18296-19100/ISSM-18926-18927.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18926-18927.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18926-18927.diff	(revision 19102)
@@ -0,0 +1,149 @@
+Index: ../trunk-jpl/src/m/contrib/netCDF/ClassTry.py
+===================================================================
+--- ../trunk-jpl/src/m/contrib/netCDF/ClassTry.py	(revision 0)
++++ ../trunk-jpl/src/m/contrib/netCDF/ClassTry.py	(revision 18927)
+@@ -0,0 +1,122 @@
++#module imports {{{
++from netCDF4 import Dataset
++import time
++import collections
++from os import path, remove
++#}}}
++
++				
++class truc(object):
++	#properties
++	def __init__(self,*filename):#{{{
++
++		def netCDFread(filename):
++			def walktree(data):
++				keys = data.groups.keys()
++				yield keys
++				for key in keys:
++					for children in walktree(data.groups[str(key)]):
++						yield children
++
++			if path.exists(filename):
++				print ('Opening {} for reading '.format(filename))
++				NCData=Dataset(filename, 'r')
++				class_dict={}
++				
++				for children in walktree(NCData):
++					for child in children:
++						class_dict[str(child)]=str(getattr(NCData.groups[str(child)],'classtype'))
++
++				return class_dict
++
++		if filename:		
++			classtype=netCDFread(filename[0])
++		else:
++			classtype=self.default_prop()
++			
++		module=map(__import__,dict.values(classtype))
++
++		for i,mod in enumerate(dict.keys(classtype)):
++			self.__dict__[mod] = getattr(module[i],str(classtype[str(mod)]))()
++			
++		#}}}
++	def default_prop(self):    # {{{
++		# ordered list of properties since vars(self) is random
++		return {'mesh':'mesh2d',\
++		        'mask':'mask',\
++		        'geometry':'geometry',\
++		        'constants':'constants',\
++		        'surfaceforcings':'SMB',\
++		        'basalforcings':'basalforcings',\
++		        'materials':'matice',\
++		        'damage':'damage',\
++		        'friction':'friction',\
++		        'flowequation':'flowequation',\
++		        'timestepping':'timestepping',\
++		        'initialization':'initialization',\
++		        'rifts':'rifts',\
++		        'debug':'debug',\
++		        'verbose':'verbose',\
++		        'settings':'settings',\
++		        'toolkits':'toolkits',\
++		        'cluster':'generic',\
++		        'balancethickness':'balancethickness',\
++		        'stressbalance':'stressbalance',\
++		        'groundingline':'groundingline',\
++		        'hydrology':'hydrologyshreve',\
++		        'masstransport':'masstransport',\
++		        'thermal':'thermal',\
++		        'steadystate':'steadystate',\
++		        'transient':'transient',\
++		        'calving':'calving',\
++						'gia':'gia',\
++		        'autodiff':'autodiff',\
++		        'flaim':'flaim',\
++		        'inversion':'inversion',\
++		        'qmu':'qmu',\
++		        'outputdefinition':'outputdefinition',\
++		        'results':'results',\
++		        'radaroverlay':'radaroverlay',\
++		        'miscellaneous':'miscellaneous',\
++		        'private':'private'}
++	# }}}
++		
++	def __repr__(obj): #{{{
++		#print "Here %s the number: %d" % ("is", 37)
++		string="%19s: %-22s -- %s" % ("mesh","[%s,%s]" % ("1x1",obj.mesh.__class__.__name__),"mesh properties")
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("mask","[%s,%s]" % ("1x1",obj.mask.__class__.__name__),"defines grounded and floating elements"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("geometry","[%s,%s]" % ("1x1",obj.geometry.__class__.__name__),"surface elevation, bedrock topography, ice thickness,..."))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("constants","[%s,%s]" % ("1x1",obj.constants.__class__.__name__),"physical constants"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("surfaceforcings","[%s,%s]" % ("1x1",obj.surfaceforcings.__class__.__name__),"surface forcings"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("basalforcings","[%s,%s]" % ("1x1",obj.basalforcings.__class__.__name__),"bed forcings"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("materials","[%s,%s]" % ("1x1",obj.materials.__class__.__name__),"material properties"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("damage","[%s,%s]" % ("1x1",obj.damage.__class__.__name__),"damage propagation laws"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("friction","[%s,%s]" % ("1x1",obj.friction.__class__.__name__),"basal friction/drag properties"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("flowequation","[%s,%s]" % ("1x1",obj.flowequation.__class__.__name__),"flow equations"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("timestepping","[%s,%s]" % ("1x1",obj.timestepping.__class__.__name__),"time stepping for transient models"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("initialization","[%s,%s]" % ("1x1",obj.initialization.__class__.__name__),"initial guess/state"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("rifts","[%s,%s]" % ("1x1",obj.rifts.__class__.__name__),"rifts properties"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("debug","[%s,%s]" % ("1x1",obj.debug.__class__.__name__),"debugging tools (valgrind, gprof)"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("verbose","[%s,%s]" % ("1x1",obj.verbose.__class__.__name__),"verbosity level in solve"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("settings","[%s,%s]" % ("1x1",obj.settings.__class__.__name__),"settings properties"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("toolkits","[%s,%s]" % ("1x1",obj.toolkits.__class__.__name__),"PETSc options for each solution"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("cluster","[%s,%s]" % ("1x1",obj.cluster.__class__.__name__),"cluster parameters (number of cpus...)"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("balancethickness","[%s,%s]" % ("1x1",obj.balancethickness.__class__.__name__),"parameters for balancethickness solution"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("stressbalance","[%s,%s]" % ("1x1",obj.stressbalance.__class__.__name__),"parameters for stressbalance solution"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("groundingline","[%s,%s]" % ("1x1",obj.groundingline.__class__.__name__),"parameters for groundingline solution"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("hydrology","[%s,%s]" % ("1x1",obj.hydrology.__class__.__name__),"parameters for hydrology solution"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("masstransport","[%s,%s]" % ("1x1",obj.masstransport.__class__.__name__),"parameters for masstransport solution"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("thermal","[%s,%s]" % ("1x1",obj.thermal.__class__.__name__),"parameters for thermal solution"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("steadystate","[%s,%s]" % ("1x1",obj.steadystate.__class__.__name__),"parameters for steadystate solution"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("transient","[%s,%s]" % ("1x1",obj.transient.__class__.__name__),"parameters for transient solution"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("calving","[%s,%s]" % ("1x1",obj.calving.__class__.__name__),"parameters for calving"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("autodiff","[%s,%s]" % ("1x1",obj.autodiff.__class__.__name__),"automatic differentiation parameters"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("flaim","[%s,%s]" % ("1x1",obj.flaim.__class__.__name__),"flaim parameters"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("inversion","[%s,%s]" % ("1x1",obj.inversion.__class__.__name__),"parameters for inverse methods"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("qmu","[%s,%s]" % ("1x1",obj.qmu.__class__.__name__),"dakota properties"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("outputdefinition","[%s,%s]" % ("1x1",obj.outputdefinition.__class__.__name__),"output definition"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("results","[%s,%s]" % ("1x1",obj.results.__class__.__name__),"model results"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("radaroverlay","[%s,%s]" % ("1x1",obj.radaroverlay.__class__.__name__),"radar image for plot overlay"))
++		string="%s\n%s" % (string,"%19s: %-22s -- %s" % ("miscellaneous","[%s,%s]" % ("1x1",obj.miscellaneous.__class__.__name__),"miscellaneous fields"))
++		return string
++	# }}}
+Index: ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py
+===================================================================
+--- ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py	(revision 18926)
++++ ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py	(revision 18927)
+@@ -171,7 +171,7 @@
+ 					#grab first time step
+ 					subfields=dict.keys(md.results.__dict__[supfield].__getitem__(0).__dict__)
+ 					for field in subfields:
+-						NCgroup.__setattr__('classtype', md.results.__dict__[supfield].__class__.__name__)
++						NCgroup.__setattr__('classtype', "results")
+ 						if str(field)!='errlog' and str(field)!='outlog' and str(field)!='SolutionType':
+ 							Var=md.results.__dict__[supfield].__getitem__(0).__dict__[field]
+ 							CreateVar(Var,True,last_step,step_freq)
+@@ -179,7 +179,7 @@
+ 				elif type(md.results.__dict__[supfield])==results:#only one timestep
+ 					subfields=dict.keys(md.results.__dict__[supfield].__dict__)
+ 					for field in subfields:
+-						NCgroup.__setattr__('classtype', md.results.__dict__[supfield].__class__.__name__)
++						NCgroup.__setattr__('classtype', "results")
+ 						if str(field)!='errlog' and str(field)!='outlog' and str(field)!='SolutionType':
+ #							print 'Treating '+str(group)+'.'+str(supfield)+'.'+str(field)
+ 							Var=md.results.__dict__[supfield].__dict__[field]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18927-18928.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18927-18928.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18927-18928.diff	(revision 19102)
@@ -0,0 +1,3666 @@
+Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h	(revision 18927)
++++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h	(revision 18928)
+@@ -12,12 +12,12 @@
+ 
+   public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+@@ -25,92 +25,92 @@
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void GetSolutionFromInputsHoriz(Vector<IssmDouble>* solution,Element* element);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GetSolutionFromInputsHoriz(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ 
+ 		/*SSA*/
+ 		ElementMatrix* CreateJacobianMatrixSSA(Element* element);
+ 		ElementMatrix* CreateKMatrixSSA(Element* element);
+-		ElementMatrix* CreateKMatrixSSAViscous(Element* element);
+ 		ElementMatrix* CreateKMatrixSSAFriction(Element* element);
+ 		ElementMatrix* CreateKMatrixSSALateralFriction(Element* element);
++		ElementMatrix* CreateKMatrixSSAViscous(Element* element);
+ 		ElementVector* CreatePVectorSSA(Element* element);
++		ElementVector* CreatePVectorSSAFront(Element* element);
+ 		ElementVector* CreatePVectorSSADrivingStress(Element* element);
+-		ElementVector* CreatePVectorSSAFront(Element* element);
+-		void GetBSSA(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBSSAprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBSSAFriction(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void InputUpdateFromSolutionSSA(IssmDouble* solution,Element* element);
++		void           GetBSSA(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBSSAFriction(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBSSAprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           InputUpdateFromSolutionSSA(IssmDouble* solution,Element* element);
+ 		/*L1L2*/
+ 		ElementMatrix* CreateKMatrixL1L2(Element* element);
++		ElementMatrix* CreateKMatrixL1L2Friction(Element* element);
+ 		ElementMatrix* CreateKMatrixL1L2Viscous(Element* element);
+-		ElementMatrix* CreateKMatrixL1L2Friction(Element* element);
+ 		ElementVector* CreatePVectorL1L2(Element* element);
++		ElementVector* CreatePVectorL1L2Front(Element* element);
+ 		ElementVector* CreatePVectorL1L2DrivingStress(Element* element);
+-		ElementVector* CreatePVectorL1L2Front(Element* element);
+-		void InputUpdateFromSolutionL1L2(IssmDouble* solution,Element* element);
++		void           InputUpdateFromSolutionL1L2(IssmDouble* solution,Element* element);
+ 		/*HO*/
+ 		ElementMatrix* CreateJacobianMatrixHO(Element* element);
+ 		ElementMatrix* CreateKMatrixHO(Element* element);
++		ElementMatrix* CreateKMatrixHOFriction(Element* element);
+ 		ElementMatrix* CreateKMatrixHOViscous(Element* element);
+-		ElementMatrix* CreateKMatrixHOFriction(Element* element);
+ 		ElementVector* CreatePVectorHO(Element* element);
++		ElementVector* CreatePVectorHOFront(Element* element);
+ 		ElementVector* CreatePVectorHODrivingStress(Element* element);
+-		ElementVector* CreatePVectorHOFront(Element* element);
+-		void GetBHO(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBHOprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBHOFriction(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void InputUpdateFromSolutionHO(IssmDouble* solution,Element* element);
++		void           GetBHO(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBHOFriction(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBHOprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           InputUpdateFromSolutionHO(IssmDouble* solution,Element* element);
+ 		/*FS*/
+ 		ElementVector* CreateDVectorFS(Element* element);
+ 		ElementMatrix* CreateJacobianMatrixFS(Element* element);
+ 		ElementMatrix* CreateKMatrixFS(Element* element);
++		ElementMatrix* CreateKMatrixFSFriction(Element* element);
++		ElementMatrix* CreateKMatrixFSShelf(Element* element);
++		ElementMatrix* CreateKMatrixFSViscous(Element* element);
+ 		ElementMatrix* CreateKMatrixFSViscousLA(Element* element);
+ 		ElementMatrix* CreateKMatrixFSViscousXTH(Element* element);
+-		ElementMatrix* CreateKMatrixFSViscous(Element* element);
+-		ElementMatrix* CreateKMatrixFSFriction(Element* element);
+-		ElementMatrix* CreateKMatrixFSShelf(Element* element);
+ 		ElementVector* CreatePVectorFS(Element* element);
++		ElementVector* CreatePVectorFSFriction(Element* element);
++		ElementVector* CreatePVectorFSFront(Element* element);
++		ElementVector* CreatePVectorFSShelf(Element* element);
++		ElementVector* CreatePVectorFSStress(Element* element);
+ 		ElementVector* CreatePVectorFSViscous(Element* element);
+ 		ElementVector* CreatePVectorFSViscousLA(Element* element);
+ 		ElementVector* CreatePVectorFSViscousXTH(Element* element);
+-		ElementVector* CreatePVectorFSShelf(Element* element);
+-		ElementVector* CreatePVectorFSFront(Element* element);
+-		ElementVector* CreatePVectorFSFriction(Element* element);
+-		ElementVector* CreatePVectorFSStress(Element* element);
+-		void GetBFS(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBFSprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBFSvel(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBFSprimevel(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBFSFriction(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBFSUzawa(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBFSprimeUzawa(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetCFS(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetCFSprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetSolutionFromInputsFS(Vector<IssmDouble>* solution,Element* element);
+-		void InputUpdateFromSolutionFS(IssmDouble* solution,Element* element);
+-		void InputUpdateFromSolutionFSXTH_d(Elements* elements,Parameters* parameters);
+-		void InputUpdateFromSolutionFSXTH_tau(Elements* elements,Parameters* parameters);
+-		void InitializeXTH(Elements* elements,Parameters* parameters);
++		void           GetBFS(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBFSFriction(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBFSprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBFSprimeUzawa(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBFSprimevel(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBFSUzawa(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBFSvel(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetCFS(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetCFSprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetSolutionFromInputsFS(Vector<IssmDouble>* solution,Element* element);
++		void           InitializeXTH(Elements* elements,Parameters* parameters);
++		void           InputUpdateFromSolutionFS(IssmDouble* solution,Element* element);
++		void           InputUpdateFromSolutionFSXTH_d(Elements* elements,Parameters* parameters);
++		void           InputUpdateFromSolutionFSXTH_tau(Elements* elements,Parameters* parameters);
+ 		/*Coupling*/
+-		ElementMatrix* CreateKMatrixSSA3d(Element* element);
+-		ElementMatrix* CreateKMatrixSSA3dFriction(Element* element);
+-		ElementMatrix* CreateKMatrixSSA3dViscous(Element* element);
+-		ElementMatrix* CreateKMatrixHOFS(Element* element);
+-		ElementMatrix* CreateKMatrixSSAHO(Element* element);
+-		ElementMatrix* CreateKMatrixSSAFS(Element* element);
+ 		ElementMatrix* CreateKMatrixCouplingHOFS(Element* element);
++		ElementMatrix* CreateKMatrixCouplingSSAFS(Element* element);
++		ElementMatrix* CreateKMatrixCouplingSSAFSFriction(Element* element);
++		ElementMatrix* CreateKMatrixCouplingSSAFSViscous(Element* element);
+ 		ElementMatrix* CreateKMatrixCouplingSSAHO(Element* element);
+ 		ElementMatrix* CreateKMatrixCouplingSSAHOFriction(Element* element);
+ 		ElementMatrix* CreateKMatrixCouplingSSAHOViscous(Element* element);
+-		ElementMatrix* CreateKMatrixCouplingSSAFS(Element* element);
+-		ElementMatrix* CreateKMatrixCouplingSSAFSFriction(Element* element);
+-		ElementMatrix* CreateKMatrixCouplingSSAFSViscous(Element* element);
++		ElementMatrix* CreateKMatrixHOFS(Element* element);
++		ElementMatrix* CreateKMatrixSSAFS(Element* element);
++		ElementMatrix* CreateKMatrixSSAHO(Element* element);
++		ElementMatrix* CreateKMatrixSSA3d(Element* element);
++		ElementMatrix* CreateKMatrixSSA3dFriction(Element* element);
++		ElementMatrix* CreateKMatrixSSA3dViscous(Element* element);
++		ElementVector* CreatePVectorSSAFS(Element* element);
+ 		ElementVector* CreatePVectorSSAHO(Element* element);
+-		ElementVector* CreatePVectorSSAFS(Element* element);
+ 		ElementVector* CreatePVectorCouplingSSAFS(Element* element);
+ 		ElementVector* CreatePVectorCouplingSSAFSFriction(Element* element);
+ 		ElementVector* CreatePVectorCouplingSSAFSViscous(Element* element);
+@@ -118,17 +118,17 @@
+ 		ElementVector* CreatePVectorCouplingHOFS(Element* element);
+ 		ElementVector* CreatePVectorCouplingHOFSFriction(Element* element);
+ 		ElementVector* CreatePVectorCouplingHOFSViscous(Element* element);
+-		void GetBSSAHO(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBSSAFS(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBprimeSSAFS(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBSSAFSTria(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBprimeSSAFSTria(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetLFSSSA(IssmDouble* L,Element* element,Gauss* gauss);
+-		void GetLSSAFS(IssmDouble* L,Element* element,Gauss* gauss);
+-		void GetLprimeFSSSA(IssmDouble* Lprime,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetLprimeSSAFS(IssmDouble* Lprime,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void InputUpdateFromSolutionHOFS(IssmDouble* solution,Element* element);
+-		void InputUpdateFromSolutionSSAFS(IssmDouble* solution,Element* element);
+-		void InputUpdateFromSolutionSSAHO(IssmDouble* solution,Element* element);
++		void           GetBprimeSSAFS(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBprimeSSAFSTria(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBSSAFS(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBSSAFSTria(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBSSAHO(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetLFSSSA(IssmDouble* L,Element* element,Gauss* gauss);
++		void           GetLprimeFSSSA(IssmDouble* Lprime,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetLprimeSSAFS(IssmDouble* Lprime,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetLSSAFS(IssmDouble* L,Element* element,Gauss* gauss);
++		void           InputUpdateFromSolutionHOFS(IssmDouble* solution,Element* element);
++		void           InputUpdateFromSolutionSSAFS(IssmDouble* solution,Element* element);
++		void           InputUpdateFromSolutionSSAHO(IssmDouble* solution,Element* element);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18927)
++++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 18928)
+@@ -10,394 +10,6 @@
+ //#define LATERALFRICTION 1
+ 
+ /*Model processing*/
+-int  StressbalanceAnalysis::DofsPerNode(int** pdoftype,int domaintype,int approximation){/*{{{*/
+-
+-	/*output*/
+-	int *doftype = NULL;
+-	int  numdofs;
+-
+-	switch(approximation){
+-		case SSAApproximationEnum:
+-			 switch(domaintype){
+-				 case Domain3DEnum:           numdofs=2; break;
+-				 case Domain2DhorizontalEnum: numdofs=2; break;
+-				 case Domain2DverticalEnum:   numdofs=1; break;
+-				 default: _error_("mesh type not supported yet");
+-			 }
+-			 break;
+-		case L1L2ApproximationEnum: numdofs =2; break;
+-		case HOApproximationEnum:   
+-			 switch(domaintype){
+-				 case Domain3DEnum:         numdofs=2; break;
+-				 case Domain2DverticalEnum: numdofs=1; break;
+-				 default: _error_("mesh type not supported yet");
+-			 }
+-			 break;
+-		case SIAApproximationEnum:  numdofs =2; break;
+-		case FSvelocityEnum:
+-			 switch(domaintype){
+-				 case Domain3DEnum:         numdofs=3; break;
+-				 case Domain2DverticalEnum: numdofs=2; break;
+-				 default: _error_("mesh type not supported yet");
+-			}
+-			break;
+-		case FSpressureEnum: numdofs=1; break;
+-		case NoneApproximationEnum:
+-			 switch(domaintype){
+-				 case Domain3DEnum:         numdofs=4; break;
+-				 case Domain2DverticalEnum: numdofs=3; break;
+-				 default: _error_("mesh type not supported yet");
+-			}
+-			break;
+-		case SSAHOApproximationEnum:
+-			numdofs=4;
+-			doftype=xNew<int>(numdofs);
+-			doftype[0]=SSAApproximationEnum;
+-			doftype[1]=SSAApproximationEnum;
+-			doftype[2]=HOApproximationEnum;
+-			doftype[3]=HOApproximationEnum;
+-			break;
+-		case HOFSApproximationEnum:
+-			numdofs=5;
+-			doftype=xNew<int>(numdofs);
+-			doftype[0]=HOApproximationEnum;
+-			doftype[1]=HOApproximationEnum;
+-			doftype[2]=FSvelocityEnum;
+-			doftype[3]=FSvelocityEnum;
+-			doftype[4]=FSvelocityEnum;
+-			break;
+-		case SSAFSApproximationEnum:
+-			numdofs=5;
+-			doftype=xNew<int>(numdofs);
+-			doftype[0]=SSAApproximationEnum;
+-			doftype[1]=SSAApproximationEnum;
+-			doftype[2]=FSvelocityEnum;
+-			doftype[3]=FSvelocityEnum;
+-			doftype[4]=FSvelocityEnum;
+-			break;
+-		default:
+-			_error_("Approximation " << EnumToStringx(approximation) << " not implemented yet");
+-	}
+-
+-	/*Assign output pointer and return*/
+-	*pdoftype = doftype;
+-	return numdofs;
+-}/*}}}*/
+-void StressbalanceAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-
+-	/*Intermediaries*/
+-	int     fe_FS;
+-	int     numoutputs;
+-	char**  requestedoutputs = NULL;
+-	int     materials_type;
+-
+-	parameters->AddObject(iomodel->CopyConstantObject(FlowequationIsSIAEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(FlowequationIsSSAEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(FlowequationIsL1L2Enum));
+-	parameters->AddObject(iomodel->CopyConstantObject(FlowequationIsHOEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(FlowequationIsFSEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(FlowequationFeFSEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceRestolEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceReltolEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceAbstolEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceIsnewtonEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceMaxiterEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(StressbalancePenaltyFactorEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceRiftPenaltyThresholdEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceFSreconditioningEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceShelfDampeningEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceViscosityOvershootEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(FrictionLawEnum));
+-
+-	/*XTH LATH parameters*/
+-	iomodel->Constant(&fe_FS,FlowequationFeFSEnum);
+-	if(fe_FS==XTaylorHoodEnum || fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum){
+-		parameters->AddObject(iomodel->CopyConstantObject(AugmentedLagrangianREnum));
+-		parameters->AddObject(iomodel->CopyConstantObject(AugmentedLagrangianRlambdaEnum));
+-		parameters->AddObject(iomodel->CopyConstantObject(AugmentedLagrangianThetaEnum));
+-	}
+-
+-	iomodel->Constant(&materials_type,MaterialsEnum);
+-	if(materials_type==MatdamageiceEnum){
+-		parameters->AddObject(iomodel->CopyConstantObject(DamageC1Enum));
+-		parameters->AddObject(iomodel->CopyConstantObject(DamageStressThresholdEnum));
+-	}
+-
+-	/*Requested outputs*/
+-	iomodel->FetchData(&requestedoutputs,&numoutputs,StressbalanceRequestedOutputsEnum);
+-	parameters->AddObject(new IntParam(StressbalanceNumRequestedOutputsEnum,numoutputs));
+-	if(numoutputs)parameters->AddObject(new StringArrayParam(StressbalanceRequestedOutputsEnum,requestedoutputs,numoutputs));
+-	iomodel->DeleteData(&requestedoutputs,numoutputs,StressbalanceRequestedOutputsEnum);
+-
+-	/*Deal with friction parameters*/
+-	int frictionlaw;
+-	iomodel->Constant(&frictionlaw,FrictionLawEnum);
+-	if(frictionlaw==4 || frictionlaw==6) parameters->AddObject(iomodel->CopyConstantObject(FrictionGammaEnum));
+-
+-}/*}}}*/
+-void StressbalanceAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+-
+-	/*Intermediaries*/
+-	int    materials_type,finiteelement,fe_FS;
+-	int    approximation,frictionlaw;
+-	int*   finiteelement_list=NULL;
+-	bool   isSSA,isL1L2,isHO,isFS,iscoupling;
+-	bool   control_analysis;
+-	bool   dakota_analysis;
+-	bool   islevelset;
+-	bool   isdamage;
+-
+-	/*Fetch constants needed: */
+-	iomodel->Constant(&isSSA,FlowequationIsSSAEnum);
+-	iomodel->Constant(&isL1L2,FlowequationIsL1L2Enum);
+-	iomodel->Constant(&isHO,FlowequationIsHOEnum);
+-	iomodel->Constant(&isFS,FlowequationIsFSEnum);
+-	iomodel->Constant(&control_analysis,InversionIscontrolEnum);
+-	iomodel->Constant(&dakota_analysis,QmuIsdakotaEnum);
+-	iomodel->Constant(&materials_type,MaterialsEnum);
+-	iomodel->Constant(&islevelset,TransientIslevelsetEnum);
+-	iomodel->Constant(&frictionlaw,FrictionLawEnum);
+-
+-	/*return if no processing required*/
+-	if(!isSSA & !isL1L2 & !isHO & !isFS) return;
+-
+-	/*Fetch data needed and allocate vectors: */
+-	iomodel->FetchData(1,FlowequationElementEquationEnum);
+-	finiteelement_list=xNewZeroInit<int>(iomodel->numberofelements);
+-
+-	/*Do we have coupling*/
+-	if( (isSSA?1.:0.) + (isL1L2?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
+-	 iscoupling = true;
+-	else
+-	 iscoupling = false;
+-
+-	/*is damage mechanics being used?*/
+-	if(materials_type==MaticeEnum) isdamage = false;
+-	else if(materials_type==MatdamageiceEnum) isdamage = true;
+-	else _error_("Material type not recognized");
+-
+-	/*Get finite element type*/
+-	if(!iscoupling){
+-		if(isSSA)       iomodel->Constant(&finiteelement,FlowequationFeSSAEnum);
+-		else if(isL1L2) finiteelement = P1Enum;
+-		else if(isHO)   iomodel->Constant(&finiteelement,FlowequationFeHOEnum);
+-		else if(isFS)   iomodel->Constant(&finiteelement,FlowequationFeFSEnum);
+-		for(int i=0;i<iomodel->numberofelements;i++){
+-			finiteelement_list[i]=finiteelement;
+-		}
+-	}
+-	else{
+-		if(isFS){
+-			for(int i=0;i<iomodel->numberofelements;i++){
+-				approximation=reCast<int>(iomodel->Data(FlowequationElementEquationEnum)[i]);
+-				if(approximation==FSApproximationEnum || approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){
+-					finiteelement_list[i]=MINIcondensedEnum;
+-				}
+-				else{
+-					finiteelement_list[i]=P1Enum;
+-				}
+-			}
+-		}
+-		else{
+-			finiteelement = P1Enum;
+-			for(int i=0;i<iomodel->numberofelements;i++){
+-				finiteelement_list[i]=finiteelement;
+-			}
+-		}
+-	}
+-
+-	/*Update elements: */
+-	int counter=0;
+-	for(int i=0;i<iomodel->numberofelements;i++){
+-		if(iomodel->my_elements[i]){
+-			Element* element=(Element*)elements->GetObjectByOffset(counter);
+-			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement_list[i]);
+-			counter++;
+-		}
+-	}
+-
+-	/*Create inputs: */
+-	iomodel->FetchDataToInput(elements,ThicknessEnum);
+-	iomodel->FetchDataToInput(elements,SurfaceEnum);
+-	iomodel->FetchDataToInput(elements,BaseEnum);
+-	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
+-	iomodel->FetchDataToInput(elements,MaskGroundediceLevelsetEnum);
+-	iomodel->FetchDataToInput(elements,MaterialsRheologyBEnum);
+-	iomodel->FetchDataToInput(elements,MaterialsRheologyNEnum);
+-	iomodel->FetchDataToInput(elements,VxEnum,0.);
+-	iomodel->FetchDataToInput(elements,VyEnum,0.);
+-	iomodel->FetchDataToInput(elements,LoadingforceXEnum);
+-	iomodel->FetchDataToInput(elements,LoadingforceYEnum);
+-	#ifdef LATERALFRICTION
+-	iomodel->FetchDataToInput(elements,MeshVertexonboundaryEnum);
+-	#endif
+-	if(isdamage)iomodel->FetchDataToInput(elements,DamageDEnum);
+-
+-	if(iomodel->domaintype!=Domain2DhorizontalEnum){
+-		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
+-		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
+-	}
+-	if(iomodel->domaintype==Domain3DEnum){
+-		iomodel->FetchDataToInput(elements,FlowequationBorderFSEnum);
+-		iomodel->FetchDataToInput(elements,LoadingforceZEnum);
+-		iomodel->FetchDataToInput(elements,VzEnum,0.);
+-	}
+-	if(isFS){
+-		iomodel->FetchDataToInput(elements,PressureEnum,0.);
+-		iomodel->FetchDataToInput(elements,BasalforcingsFloatingiceMeltingRateEnum,0.);
+-	}
+-	if(islevelset){
+-		iomodel->FetchDataToInput(elements,IceMaskNodeActivationEnum);
+-	}
+-	/*LATH parameters*/
+-	iomodel->Constant(&fe_FS,FlowequationFeFSEnum);
+-	if(fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum){
+-		InputUpdateFromConstantx(elements,0.,SigmaNNEnum);
+-	}
+-
+-	/*Friction law variables*/
+-	switch(frictionlaw){
+-		case 1:
+-			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
+-			iomodel->FetchDataToInput(elements,FrictionPEnum);
+-			iomodel->FetchDataToInput(elements,FrictionQEnum);
+-			break;
+-		case 2:
+-			iomodel->FetchDataToInput(elements,FrictionCEnum);
+-			iomodel->FetchDataToInput(elements,FrictionMEnum);
+-			break;
+-		case 3:
+-			iomodel->FetchDataToInput(elements,FrictionCEnum);
+-			iomodel->FetchDataToInput(elements,FrictionAsEnum);
+-			iomodel->FetchDataToInput(elements,FrictionQEnum);
+-			iomodel->FetchDataToInput(elements,FrictionEffectivePressureEnum);
+-			break;
+-		case 4:
+-			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
+-			iomodel->FetchDataToInput(elements,FrictionPEnum);
+-			iomodel->FetchDataToInput(elements,FrictionQEnum);
+-			iomodel->FetchDataToInput(elements,PressureEnum);
+-			iomodel->FetchDataToInput(elements,TemperatureEnum);
+-			break;
+-		case 5:
+-			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
+-			iomodel->FetchDataToInput(elements,FrictionPEnum);
+-			iomodel->FetchDataToInput(elements,FrictionQEnum);
+-			iomodel->FetchDataToInput(elements,FrictionWaterLayerEnum);
+-			break;
+-		case 6:
+-			iomodel->FetchDataToInput(elements,FrictionCEnum);
+-			iomodel->FetchDataToInput(elements,FrictionMEnum);
+-			iomodel->FetchDataToInput(elements,PressureEnum);
+-			iomodel->FetchDataToInput(elements,TemperatureEnum);
+-			break;
+-		default:
+-			_error_("not supported");
+-	}
+-
+-#ifdef _HAVE_ANDROID_
+-	elements->InputDuplicate(FrictionCoefficientEnum,AndroidFrictionCoefficientEnum);
+-#endif
+-
+-	/*Free data: */
+-	iomodel->DeleteData(1,FlowequationElementEquationEnum);
+-	xDelete<int>(finiteelement_list);
+-}/*}}}*/
+-void StressbalanceAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-
+-	/*Intermediary*/
+-	bool isSSA,isL1L2,isHO,isFS,iscoupling;
+-	int  finiteelement=-1,approximation=-1;
+-
+-	/*Fetch parameters: */
+-	iomodel->Constant(&isSSA,FlowequationIsSSAEnum);
+-	iomodel->Constant(&isL1L2,FlowequationIsL1L2Enum);
+-	iomodel->Constant(&isHO,FlowequationIsHOEnum);
+-	iomodel->Constant(&isFS,FlowequationIsFSEnum);
+-
+-	/*Now, check that we have non SIA elements */
+-	if(!isSSA & !isL1L2 & !isHO & !isFS) return;
+-
+-	/*Do we have coupling*/
+-	if( (isSSA?1.:0.) + (isL1L2?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
+-	 iscoupling = true;
+-	else
+-	 iscoupling = false;
+-
+-	/*If no coupling, call Regular CreateNodes, else, use P1 elements only*/
+-	if(!iscoupling){
+-
+-		/*Get finite element type*/
+-		if(isSSA){
+-			approximation=SSAApproximationEnum;
+-			iomodel->Constant(&finiteelement,FlowequationFeSSAEnum);
+-		}
+-		else if(isL1L2){
+-			approximation = L1L2ApproximationEnum;
+-			finiteelement = P1Enum;
+-		}
+-		else if(isHO){
+-			approximation = HOApproximationEnum;
+-			iomodel->Constant(&finiteelement,FlowequationFeHOEnum);
+-		}
+-		else if(isFS){
+-			approximation = FSApproximationEnum;
+-			iomodel->Constant(&finiteelement,FlowequationFeFSEnum);
+-		}
+-		iomodel->FetchData(3,FlowequationBorderSSAEnum,FlowequationVertexEquationEnum,StressbalanceReferentialEnum);
+-		if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(3,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum,FlowequationBorderFSEnum);
+-		::CreateNodes(nodes,iomodel,StressbalanceAnalysisEnum,finiteelement,approximation);
+-		iomodel->DeleteData(6,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum,FlowequationBorderSSAEnum,FlowequationBorderFSEnum,
+-					FlowequationVertexEquationEnum,StressbalanceReferentialEnum);
+-	}
+-	else{
+-		/*Coupling: we are going to create P1 Elements only*/
+-
+-		Node*  node  = NULL;
+-		int    lid=0;
+-		if(!nodes) nodes = new Nodes();
+-
+-		iomodel->FetchData(6,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum,FlowequationBorderSSAEnum,FlowequationBorderFSEnum,
+-					FlowequationVertexEquationEnum,StressbalanceReferentialEnum);
+-		if(isFS){
+-			/*P1+ velocity*/
+-			for(int i=0;i<iomodel->numberofvertices;i++){
+-				if(iomodel->my_vertices[i]){
+-					approximation=reCast<int>(iomodel->Data(FlowequationVertexEquationEnum)[i]);
+-					if(approximation==FSApproximationEnum)  approximation=FSvelocityEnum;
+-					nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,lid++,i,iomodel,StressbalanceAnalysisEnum,approximation));
+-				}
+-			}
+-			for(int i=0;i<iomodel->numberofelements;i++){
+-				if(iomodel->my_elements[i]){
+-					node = new Node(iomodel->nodecounter+iomodel->numberofvertices+i+1,iomodel->numberofvertices+i,lid++,0,iomodel,StressbalanceAnalysisEnum,FSvelocityEnum);
+-					node->Deactivate();
+-					nodes->AddObject(node);
+-				}
+-			}
+-			/*P1 pressure*/
+-			for(int i=0;i<iomodel->numberofvertices;i++){
+-				if(iomodel->my_vertices[i]){
+-					approximation=reCast<int>(iomodel->Data(FlowequationVertexEquationEnum)[i]);
+-					node = new Node(iomodel->nodecounter+iomodel->numberofvertices+iomodel->numberofelements+i+1,iomodel->numberofvertices+iomodel->numberofelements+i,lid++,i,iomodel,StressbalanceAnalysisEnum,FSpressureEnum);
+-					if(approximation==HOApproximationEnum || approximation==SSAApproximationEnum){
+-						node->Deactivate();
+-					}
+-					nodes->AddObject(node);
+-				}
+-			}
+-		}
+-		else{
+-			for(int i=0;i<iomodel->numberofvertices;i++){
+-				if(iomodel->my_vertices[i]){
+-					nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,lid++,i,iomodel,StressbalanceAnalysisEnum,reCast<int>(iomodel->Data(FlowequationVertexEquationEnum)[i])));
+-				}
+-			}
+-		}
+-		iomodel->DeleteData(6,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum,FlowequationBorderSSAEnum,FlowequationBorderFSEnum,
+-					FlowequationVertexEquationEnum,StressbalanceReferentialEnum);
+-	}
+-}/*}}}*/
+ void StressbalanceAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+ 
+ 	/*Intermediary*/
+@@ -887,7 +499,395 @@
+ 		xDelete<IssmDouble>(riftinfo);
+ 	}
+ }/*}}}*/
++void StressbalanceAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 
++	/*Intermediary*/
++	bool isSSA,isL1L2,isHO,isFS,iscoupling;
++	int  finiteelement=-1,approximation=-1;
++
++	/*Fetch parameters: */
++	iomodel->Constant(&isSSA,FlowequationIsSSAEnum);
++	iomodel->Constant(&isL1L2,FlowequationIsL1L2Enum);
++	iomodel->Constant(&isHO,FlowequationIsHOEnum);
++	iomodel->Constant(&isFS,FlowequationIsFSEnum);
++
++	/*Now, check that we have non SIA elements */
++	if(!isSSA & !isL1L2 & !isHO & !isFS) return;
++
++	/*Do we have coupling*/
++	if( (isSSA?1.:0.) + (isL1L2?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
++	 iscoupling = true;
++	else
++	 iscoupling = false;
++
++	/*If no coupling, call Regular CreateNodes, else, use P1 elements only*/
++	if(!iscoupling){
++
++		/*Get finite element type*/
++		if(isSSA){
++			approximation=SSAApproximationEnum;
++			iomodel->Constant(&finiteelement,FlowequationFeSSAEnum);
++		}
++		else if(isL1L2){
++			approximation = L1L2ApproximationEnum;
++			finiteelement = P1Enum;
++		}
++		else if(isHO){
++			approximation = HOApproximationEnum;
++			iomodel->Constant(&finiteelement,FlowequationFeHOEnum);
++		}
++		else if(isFS){
++			approximation = FSApproximationEnum;
++			iomodel->Constant(&finiteelement,FlowequationFeFSEnum);
++		}
++		iomodel->FetchData(3,FlowequationBorderSSAEnum,FlowequationVertexEquationEnum,StressbalanceReferentialEnum);
++		if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(3,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum,FlowequationBorderFSEnum);
++		::CreateNodes(nodes,iomodel,StressbalanceAnalysisEnum,finiteelement,approximation);
++		iomodel->DeleteData(6,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum,FlowequationBorderSSAEnum,FlowequationBorderFSEnum,
++					FlowequationVertexEquationEnum,StressbalanceReferentialEnum);
++	}
++	else{
++		/*Coupling: we are going to create P1 Elements only*/
++
++		Node*  node  = NULL;
++		int    lid=0;
++		if(!nodes) nodes = new Nodes();
++
++		iomodel->FetchData(6,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum,FlowequationBorderSSAEnum,FlowequationBorderFSEnum,
++					FlowequationVertexEquationEnum,StressbalanceReferentialEnum);
++		if(isFS){
++			/*P1+ velocity*/
++			for(int i=0;i<iomodel->numberofvertices;i++){
++				if(iomodel->my_vertices[i]){
++					approximation=reCast<int>(iomodel->Data(FlowequationVertexEquationEnum)[i]);
++					if(approximation==FSApproximationEnum)  approximation=FSvelocityEnum;
++					nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,lid++,i,iomodel,StressbalanceAnalysisEnum,approximation));
++				}
++			}
++			for(int i=0;i<iomodel->numberofelements;i++){
++				if(iomodel->my_elements[i]){
++					node = new Node(iomodel->nodecounter+iomodel->numberofvertices+i+1,iomodel->numberofvertices+i,lid++,0,iomodel,StressbalanceAnalysisEnum,FSvelocityEnum);
++					node->Deactivate();
++					nodes->AddObject(node);
++				}
++			}
++			/*P1 pressure*/
++			for(int i=0;i<iomodel->numberofvertices;i++){
++				if(iomodel->my_vertices[i]){
++					approximation=reCast<int>(iomodel->Data(FlowequationVertexEquationEnum)[i]);
++					node = new Node(iomodel->nodecounter+iomodel->numberofvertices+iomodel->numberofelements+i+1,iomodel->numberofvertices+iomodel->numberofelements+i,lid++,i,iomodel,StressbalanceAnalysisEnum,FSpressureEnum);
++					if(approximation==HOApproximationEnum || approximation==SSAApproximationEnum){
++						node->Deactivate();
++					}
++					nodes->AddObject(node);
++				}
++			}
++		}
++		else{
++			for(int i=0;i<iomodel->numberofvertices;i++){
++				if(iomodel->my_vertices[i]){
++					nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,lid++,i,iomodel,StressbalanceAnalysisEnum,reCast<int>(iomodel->Data(FlowequationVertexEquationEnum)[i])));
++				}
++			}
++		}
++		iomodel->DeleteData(6,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum,FlowequationBorderSSAEnum,FlowequationBorderFSEnum,
++					FlowequationVertexEquationEnum,StressbalanceReferentialEnum);
++	}
++}/*}}}*/
++int  StressbalanceAnalysis::DofsPerNode(int** pdoftype,int domaintype,int approximation){/*{{{*/
++
++	/*output*/
++	int *doftype = NULL;
++	int  numdofs;
++
++	switch(approximation){
++		case SSAApproximationEnum:
++			 switch(domaintype){
++				 case Domain3DEnum:           numdofs=2; break;
++				 case Domain2DhorizontalEnum: numdofs=2; break;
++				 case Domain2DverticalEnum:   numdofs=1; break;
++				 default: _error_("mesh type not supported yet");
++			 }
++			 break;
++		case L1L2ApproximationEnum: numdofs =2; break;
++		case HOApproximationEnum:   
++			 switch(domaintype){
++				 case Domain3DEnum:         numdofs=2; break;
++				 case Domain2DverticalEnum: numdofs=1; break;
++				 default: _error_("mesh type not supported yet");
++			 }
++			 break;
++		case SIAApproximationEnum:  numdofs =2; break;
++		case FSvelocityEnum:
++			 switch(domaintype){
++				 case Domain3DEnum:         numdofs=3; break;
++				 case Domain2DverticalEnum: numdofs=2; break;
++				 default: _error_("mesh type not supported yet");
++			}
++			break;
++		case FSpressureEnum: numdofs=1; break;
++		case NoneApproximationEnum:
++			 switch(domaintype){
++				 case Domain3DEnum:         numdofs=4; break;
++				 case Domain2DverticalEnum: numdofs=3; break;
++				 default: _error_("mesh type not supported yet");
++			}
++			break;
++		case SSAHOApproximationEnum:
++			numdofs=4;
++			doftype=xNew<int>(numdofs);
++			doftype[0]=SSAApproximationEnum;
++			doftype[1]=SSAApproximationEnum;
++			doftype[2]=HOApproximationEnum;
++			doftype[3]=HOApproximationEnum;
++			break;
++		case HOFSApproximationEnum:
++			numdofs=5;
++			doftype=xNew<int>(numdofs);
++			doftype[0]=HOApproximationEnum;
++			doftype[1]=HOApproximationEnum;
++			doftype[2]=FSvelocityEnum;
++			doftype[3]=FSvelocityEnum;
++			doftype[4]=FSvelocityEnum;
++			break;
++		case SSAFSApproximationEnum:
++			numdofs=5;
++			doftype=xNew<int>(numdofs);
++			doftype[0]=SSAApproximationEnum;
++			doftype[1]=SSAApproximationEnum;
++			doftype[2]=FSvelocityEnum;
++			doftype[3]=FSvelocityEnum;
++			doftype[4]=FSvelocityEnum;
++			break;
++		default:
++			_error_("Approximation " << EnumToStringx(approximation) << " not implemented yet");
++	}
++
++	/*Assign output pointer and return*/
++	*pdoftype = doftype;
++	return numdofs;
++}/*}}}*/
++void StressbalanceAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
++
++	/*Intermediaries*/
++	int    materials_type,finiteelement,fe_FS;
++	int    approximation,frictionlaw;
++	int*   finiteelement_list=NULL;
++	bool   isSSA,isL1L2,isHO,isFS,iscoupling;
++	bool   control_analysis;
++	bool   dakota_analysis;
++	bool   islevelset;
++	bool   isdamage;
++
++	/*Fetch constants needed: */
++	iomodel->Constant(&isSSA,FlowequationIsSSAEnum);
++	iomodel->Constant(&isL1L2,FlowequationIsL1L2Enum);
++	iomodel->Constant(&isHO,FlowequationIsHOEnum);
++	iomodel->Constant(&isFS,FlowequationIsFSEnum);
++	iomodel->Constant(&control_analysis,InversionIscontrolEnum);
++	iomodel->Constant(&dakota_analysis,QmuIsdakotaEnum);
++	iomodel->Constant(&materials_type,MaterialsEnum);
++	iomodel->Constant(&islevelset,TransientIslevelsetEnum);
++	iomodel->Constant(&frictionlaw,FrictionLawEnum);
++
++	/*return if no processing required*/
++	if(!isSSA & !isL1L2 & !isHO & !isFS) return;
++
++	/*Fetch data needed and allocate vectors: */
++	iomodel->FetchData(1,FlowequationElementEquationEnum);
++	finiteelement_list=xNewZeroInit<int>(iomodel->numberofelements);
++
++	/*Do we have coupling*/
++	if( (isSSA?1.:0.) + (isL1L2?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
++	 iscoupling = true;
++	else
++	 iscoupling = false;
++
++	/*is damage mechanics being used?*/
++	if(materials_type==MaticeEnum) isdamage = false;
++	else if(materials_type==MatdamageiceEnum) isdamage = true;
++	else _error_("Material type not recognized");
++
++	/*Get finite element type*/
++	if(!iscoupling){
++		if(isSSA)       iomodel->Constant(&finiteelement,FlowequationFeSSAEnum);
++		else if(isL1L2) finiteelement = P1Enum;
++		else if(isHO)   iomodel->Constant(&finiteelement,FlowequationFeHOEnum);
++		else if(isFS)   iomodel->Constant(&finiteelement,FlowequationFeFSEnum);
++		for(int i=0;i<iomodel->numberofelements;i++){
++			finiteelement_list[i]=finiteelement;
++		}
++	}
++	else{
++		if(isFS){
++			for(int i=0;i<iomodel->numberofelements;i++){
++				approximation=reCast<int>(iomodel->Data(FlowequationElementEquationEnum)[i]);
++				if(approximation==FSApproximationEnum || approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){
++					finiteelement_list[i]=MINIcondensedEnum;
++				}
++				else{
++					finiteelement_list[i]=P1Enum;
++				}
++			}
++		}
++		else{
++			finiteelement = P1Enum;
++			for(int i=0;i<iomodel->numberofelements;i++){
++				finiteelement_list[i]=finiteelement;
++			}
++		}
++	}
++
++	/*Update elements: */
++	int counter=0;
++	for(int i=0;i<iomodel->numberofelements;i++){
++		if(iomodel->my_elements[i]){
++			Element* element=(Element*)elements->GetObjectByOffset(counter);
++			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement_list[i]);
++			counter++;
++		}
++	}
++
++	/*Create inputs: */
++	iomodel->FetchDataToInput(elements,ThicknessEnum);
++	iomodel->FetchDataToInput(elements,SurfaceEnum);
++	iomodel->FetchDataToInput(elements,BaseEnum);
++	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
++	iomodel->FetchDataToInput(elements,MaskGroundediceLevelsetEnum);
++	iomodel->FetchDataToInput(elements,MaterialsRheologyBEnum);
++	iomodel->FetchDataToInput(elements,MaterialsRheologyNEnum);
++	iomodel->FetchDataToInput(elements,VxEnum,0.);
++	iomodel->FetchDataToInput(elements,VyEnum,0.);
++	iomodel->FetchDataToInput(elements,LoadingforceXEnum);
++	iomodel->FetchDataToInput(elements,LoadingforceYEnum);
++	#ifdef LATERALFRICTION
++	iomodel->FetchDataToInput(elements,MeshVertexonboundaryEnum);
++	#endif
++	if(isdamage)iomodel->FetchDataToInput(elements,DamageDEnum);
++
++	if(iomodel->domaintype!=Domain2DhorizontalEnum){
++		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
++		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
++	}
++	if(iomodel->domaintype==Domain3DEnum){
++		iomodel->FetchDataToInput(elements,FlowequationBorderFSEnum);
++		iomodel->FetchDataToInput(elements,LoadingforceZEnum);
++		iomodel->FetchDataToInput(elements,VzEnum,0.);
++	}
++	if(isFS){
++		iomodel->FetchDataToInput(elements,PressureEnum,0.);
++		iomodel->FetchDataToInput(elements,BasalforcingsFloatingiceMeltingRateEnum,0.);
++	}
++	if(islevelset){
++		iomodel->FetchDataToInput(elements,IceMaskNodeActivationEnum);
++	}
++	/*LATH parameters*/
++	iomodel->Constant(&fe_FS,FlowequationFeFSEnum);
++	if(fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum){
++		InputUpdateFromConstantx(elements,0.,SigmaNNEnum);
++	}
++
++	/*Friction law variables*/
++	switch(frictionlaw){
++		case 1:
++			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
++			iomodel->FetchDataToInput(elements,FrictionPEnum);
++			iomodel->FetchDataToInput(elements,FrictionQEnum);
++			break;
++		case 2:
++			iomodel->FetchDataToInput(elements,FrictionCEnum);
++			iomodel->FetchDataToInput(elements,FrictionMEnum);
++			break;
++		case 3:
++			iomodel->FetchDataToInput(elements,FrictionCEnum);
++			iomodel->FetchDataToInput(elements,FrictionAsEnum);
++			iomodel->FetchDataToInput(elements,FrictionQEnum);
++			iomodel->FetchDataToInput(elements,FrictionEffectivePressureEnum);
++			break;
++		case 4:
++			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
++			iomodel->FetchDataToInput(elements,FrictionPEnum);
++			iomodel->FetchDataToInput(elements,FrictionQEnum);
++			iomodel->FetchDataToInput(elements,PressureEnum);
++			iomodel->FetchDataToInput(elements,TemperatureEnum);
++			break;
++		case 5:
++			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
++			iomodel->FetchDataToInput(elements,FrictionPEnum);
++			iomodel->FetchDataToInput(elements,FrictionQEnum);
++			iomodel->FetchDataToInput(elements,FrictionWaterLayerEnum);
++			break;
++		case 6:
++			iomodel->FetchDataToInput(elements,FrictionCEnum);
++			iomodel->FetchDataToInput(elements,FrictionMEnum);
++			iomodel->FetchDataToInput(elements,PressureEnum);
++			iomodel->FetchDataToInput(elements,TemperatureEnum);
++			break;
++		default:
++			_error_("not supported");
++	}
++
++#ifdef _HAVE_ANDROID_
++	elements->InputDuplicate(FrictionCoefficientEnum,AndroidFrictionCoefficientEnum);
++#endif
++
++	/*Free data: */
++	iomodel->DeleteData(1,FlowequationElementEquationEnum);
++	xDelete<int>(finiteelement_list);
++}/*}}}*/
++void StressbalanceAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++
++	/*Intermediaries*/
++	int     fe_FS;
++	int     numoutputs;
++	char**  requestedoutputs = NULL;
++	int     materials_type;
++
++	parameters->AddObject(iomodel->CopyConstantObject(FlowequationIsSIAEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(FlowequationIsSSAEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(FlowequationIsL1L2Enum));
++	parameters->AddObject(iomodel->CopyConstantObject(FlowequationIsHOEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(FlowequationIsFSEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(FlowequationFeFSEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceRestolEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceReltolEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceAbstolEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceIsnewtonEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceMaxiterEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(StressbalancePenaltyFactorEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceRiftPenaltyThresholdEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceFSreconditioningEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceShelfDampeningEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceViscosityOvershootEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(FrictionLawEnum));
++
++	/*XTH LATH parameters*/
++	iomodel->Constant(&fe_FS,FlowequationFeFSEnum);
++	if(fe_FS==XTaylorHoodEnum || fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum){
++		parameters->AddObject(iomodel->CopyConstantObject(AugmentedLagrangianREnum));
++		parameters->AddObject(iomodel->CopyConstantObject(AugmentedLagrangianRlambdaEnum));
++		parameters->AddObject(iomodel->CopyConstantObject(AugmentedLagrangianThetaEnum));
++	}
++
++	iomodel->Constant(&materials_type,MaterialsEnum);
++	if(materials_type==MatdamageiceEnum){
++		parameters->AddObject(iomodel->CopyConstantObject(DamageC1Enum));
++		parameters->AddObject(iomodel->CopyConstantObject(DamageStressThresholdEnum));
++	}
++
++	/*Requested outputs*/
++	iomodel->FetchData(&requestedoutputs,&numoutputs,StressbalanceRequestedOutputsEnum);
++	parameters->AddObject(new IntParam(StressbalanceNumRequestedOutputsEnum,numoutputs));
++	if(numoutputs)parameters->AddObject(new StringArrayParam(StressbalanceRequestedOutputsEnum,requestedoutputs,numoutputs));
++	iomodel->DeleteData(&requestedoutputs,numoutputs,StressbalanceRequestedOutputsEnum);
++
++	/*Deal with friction parameters*/
++	int frictionlaw;
++	iomodel->Constant(&frictionlaw,FrictionLawEnum);
++	if(frictionlaw==4 || frictionlaw==6) parameters->AddObject(iomodel->CopyConstantObject(FrictionGammaEnum));
++
++}/*}}}*/
++
+ /*Finite Element Analysis*/
+ void           StressbalanceAnalysis::Core(FemModel* femmodel){/*{{{*/
+ 
+@@ -1026,7 +1026,7 @@
+ 			_error_("Approximation "<<EnumToStringx(approximation)<<" not supported");
+ 	}
+ }/*}}}*/
+-void StressbalanceAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           StressbalanceAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 
+ 	int approximation;
+ 	element->GetInputValue(&approximation,ApproximationEnum);
+@@ -1047,7 +1047,7 @@
+ 			_error_("Approximation "<<EnumToStringx(approximation)<<" not supported");
+ 	}
+ }/*}}}*/
+-void StressbalanceAnalysis::GetSolutionFromInputsHoriz(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           StressbalanceAnalysis::GetSolutionFromInputsHoriz(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 
+ 	IssmDouble   vx,vy;
+ 	int          domaintype,dim,approximation,dofpernode;
+@@ -1097,10 +1097,10 @@
+ 	xDelete<IssmDouble>(values);
+ 	xDelete<int>(doflist);
+ }/*}}}*/
+-void StressbalanceAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           StressbalanceAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void StressbalanceAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           StressbalanceAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	int approximation;
+ 	element->GetInputValue(&approximation,ApproximationEnum);
+@@ -1132,7 +1132,7 @@
+ 			_error_("Approximation "<<EnumToStringx(approximation)<<" not supported");
+ 	}
+ }/*}}}*/
+-void StressbalanceAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           StressbalanceAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	bool islevelset;
+ 	femmodel->parameters->FindParam(&islevelset,TransientIslevelsetEnum);
+@@ -1659,7 +1659,7 @@
+ 	delete gauss;
+ 	return pe;
+ }/*}}}*/
+-void StressbalanceAnalysis::GetBSSA(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           StressbalanceAnalysis::GetBSSA(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
+ 	 * For node i, Bi can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -1699,7 +1699,7 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(dbasis);
+ }/*}}}*/
+-void StressbalanceAnalysis::GetBSSAFriction(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           StressbalanceAnalysis::GetBSSAFriction(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is square and of size 2. 
+ 	 * For node i, Bi can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -1736,7 +1736,7 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(basis);
+ }/*}}}*/
+-void StressbalanceAnalysis::GetBSSAprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           StressbalanceAnalysis::GetBSSAprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 
+ 	 * For node i, Bi' can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -1776,7 +1776,7 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(dbasis);
+ }/*}}}*/
+-void StressbalanceAnalysis::InputUpdateFromSolutionSSA(IssmDouble* solution,Element* element){/*{{{*/
++void           StressbalanceAnalysis::InputUpdateFromSolutionSSA(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	int         i,dim,domaintype;
+ 	IssmDouble  rho_ice,g;
+@@ -2110,7 +2110,7 @@
+ 	delete gauss;
+ 	return pe;
+ }/*}}}*/
+-void StressbalanceAnalysis::InputUpdateFromSolutionL1L2(IssmDouble* solution,Element* element){/*{{{*/
++void           StressbalanceAnalysis::InputUpdateFromSolutionL1L2(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	int         i,dim,domaintype;
+ 	IssmDouble  rho_ice,g;
+@@ -2285,78 +2285,6 @@
+ 	delete Ke2;
+ 	return Ke;
+ }/*}}}*/
+-ElementMatrix* StressbalanceAnalysis::CreateKMatrixHOViscous(Element* element){/*{{{*/
+-
+-	/* Check if ice in element */
+-	if(!element->IsIceInElement()) return NULL;
+-
+-	/*Intermediaries*/
+-	int         dim,bsize;
+-	IssmDouble  viscosity,newviscosity,oldviscosity;
+-	IssmDouble  viscosity_overshoot,thickness,Jdet;
+-	IssmDouble  D_scalar;
+-	IssmDouble *xyz_list = NULL;
+-
+-	/*Get problem dimension*/
+-	element->FindParam(&dim,DomainDimensionEnum);
+-	if(dim==2) bsize = 2;
+-	else       bsize = 5;
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-	int numdof   = numnodes*(dim-1);
+-
+-	/*Initialize Element matrix and vectors*/
+-	ElementMatrix* Ke     = element->NewElementMatrix(HOApproximationEnum);
+-	IssmDouble*    B      = xNew<IssmDouble>(bsize*numdof);
+-	IssmDouble*    Bprime = xNew<IssmDouble>(bsize*numdof);
+-	IssmDouble*    D      = xNewZeroInit<IssmDouble>(bsize*bsize);
+-
+-	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinates(&xyz_list);
+-	Input* vx_input    = element->GetInput(VxEnum);       _assert_(vx_input);
+-	Input* vxold_input = element->GetInput(VxPicardEnum); _assert_(vxold_input);
+-	Input* vy_input    = NULL;
+-	Input* vyold_input = NULL;
+-	if(dim==3){
+-		vy_input=element->GetInput(VyEnum);          _assert_(vy_input);
+-		vyold_input=element->GetInput(VyPicardEnum); _assert_(vyold_input);
+-	}
+-	element->FindParam(&viscosity_overshoot,StressbalanceViscosityOvershootEnum);
+-
+-	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss = element->NewGauss(5);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		this->GetBHO(B,element,dim,xyz_list,gauss);
+-		this->GetBHOprime(Bprime,element,dim,xyz_list,gauss);
+-
+-		element->ViscosityHO(&viscosity,dim,xyz_list,gauss,vx_input,vy_input);
+-		element->ViscosityHO(&oldviscosity,dim,xyz_list,gauss,vxold_input,vyold_input);
+-
+-		newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity);
+-		D_scalar=2.*newviscosity*gauss->weight*Jdet;
+-		for(int i=0;i<bsize;i++) D[i*bsize+i]=D_scalar;
+-
+-		TripleMultiply(B,bsize,numdof,1,
+-					D,bsize,bsize,0,
+-					Bprime,bsize,numdof,0,
+-					&Ke->values[0],1);
+-	}
+-
+-	/*Transform Coordinate System*/
+-	if(dim==3) element->TransformStiffnessMatrixCoord(Ke,XYEnum);
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(D);
+-	xDelete<IssmDouble>(Bprime);
+-	xDelete<IssmDouble>(B);
+-	return Ke;
+-}/*}}}*/
+ ElementMatrix* StressbalanceAnalysis::CreateKMatrixHOFriction(Element* element){/*{{{*/
+ 
+ 	/* Check if ice in element */
+@@ -2437,6 +2365,78 @@
+ 	xDelete<IssmDouble>(D);
+ 	return Ke;
+ }/*}}}*/
++ElementMatrix* StressbalanceAnalysis::CreateKMatrixHOViscous(Element* element){/*{{{*/
++
++	/* Check if ice in element */
++	if(!element->IsIceInElement()) return NULL;
++
++	/*Intermediaries*/
++	int         dim,bsize;
++	IssmDouble  viscosity,newviscosity,oldviscosity;
++	IssmDouble  viscosity_overshoot,thickness,Jdet;
++	IssmDouble  D_scalar;
++	IssmDouble *xyz_list = NULL;
++
++	/*Get problem dimension*/
++	element->FindParam(&dim,DomainDimensionEnum);
++	if(dim==2) bsize = 2;
++	else       bsize = 5;
++
++	/*Fetch number of nodes and dof for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++	int numdof   = numnodes*(dim-1);
++
++	/*Initialize Element matrix and vectors*/
++	ElementMatrix* Ke     = element->NewElementMatrix(HOApproximationEnum);
++	IssmDouble*    B      = xNew<IssmDouble>(bsize*numdof);
++	IssmDouble*    Bprime = xNew<IssmDouble>(bsize*numdof);
++	IssmDouble*    D      = xNewZeroInit<IssmDouble>(bsize*bsize);
++
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinates(&xyz_list);
++	Input* vx_input    = element->GetInput(VxEnum);       _assert_(vx_input);
++	Input* vxold_input = element->GetInput(VxPicardEnum); _assert_(vxold_input);
++	Input* vy_input    = NULL;
++	Input* vyold_input = NULL;
++	if(dim==3){
++		vy_input=element->GetInput(VyEnum);          _assert_(vy_input);
++		vyold_input=element->GetInput(VyPicardEnum); _assert_(vyold_input);
++	}
++	element->FindParam(&viscosity_overshoot,StressbalanceViscosityOvershootEnum);
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss = element->NewGauss(5);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		this->GetBHO(B,element,dim,xyz_list,gauss);
++		this->GetBHOprime(Bprime,element,dim,xyz_list,gauss);
++
++		element->ViscosityHO(&viscosity,dim,xyz_list,gauss,vx_input,vy_input);
++		element->ViscosityHO(&oldviscosity,dim,xyz_list,gauss,vxold_input,vyold_input);
++
++		newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity);
++		D_scalar=2.*newviscosity*gauss->weight*Jdet;
++		for(int i=0;i<bsize;i++) D[i*bsize+i]=D_scalar;
++
++		TripleMultiply(B,bsize,numdof,1,
++					D,bsize,bsize,0,
++					Bprime,bsize,numdof,0,
++					&Ke->values[0],1);
++	}
++
++	/*Transform Coordinate System*/
++	if(dim==3) element->TransformStiffnessMatrixCoord(Ke,XYEnum);
++
++	/*Clean up and return*/
++	delete gauss;
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(D);
++	xDelete<IssmDouble>(Bprime);
++	xDelete<IssmDouble>(B);
++	return Ke;
++}/*}}}*/
+ #ifdef FSANALYTICAL
+ ElementVector* StressbalanceAnalysis::CreatePVectorHO(Element* element){/*{{{*/
+ 
+@@ -2632,7 +2632,7 @@
+ 	delete gauss;
+ 	return pe;
+ }/*}}}*/
+-void StressbalanceAnalysis::GetBHO(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           StressbalanceAnalysis::GetBHO(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF2. 
+ 	 * For node i, Bi can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -2681,7 +2681,44 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(dbasis);
+ }/*}}}*/
+-void StressbalanceAnalysis::GetBHOprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           StressbalanceAnalysis::GetBHOFriction(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++	/*Compute B  matrix. B=[B1 B2 B3] where Bi is square and of size 2. 
++	 * For node i, Bi can be expressed in the actual coordinate system
++	 * by: 
++	 *                       3D           2D
++	 *                 Bi=[ N   0 ]    Bi=N
++	 *                    [ 0   N ]
++	 * where N is the finiteelement function for node i.
++	 *
++	 * We assume B has been allocated already, of size: 2 x (numdof*numnodes)
++	 */
++
++	/*Fetch number of nodes for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++
++	/*Get nodal functions derivatives*/
++	IssmDouble* basis=xNew<IssmDouble>(numnodes);
++	element->NodalFunctions(basis,gauss);
++
++	/*Build L: */
++	if(dim==3){
++		for(int i=0;i<numnodes;i++){
++			B[2*numnodes*0+2*i+0] = basis[i];
++			B[2*numnodes*0+2*i+1] = 0.;
++			B[2*numnodes*1+2*i+0] = 0.;
++			B[2*numnodes*1+2*i+1] = basis[i];
++		}
++	}
++	else{
++		for(int i=0;i<numnodes;i++){
++			B[i] = basis[i];
++		}
++	}
++
++	/*Clean-up*/
++	xDelete<IssmDouble>(basis);
++}/*}}}*/
++void           StressbalanceAnalysis::GetBHOprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 
+ 	 * For node i, Bi' can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -2726,45 +2763,8 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(dbasis);
+ }/*}}}*/
+-void StressbalanceAnalysis::GetBHOFriction(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+-	/*Compute B  matrix. B=[B1 B2 B3] where Bi is square and of size 2. 
+-	 * For node i, Bi can be expressed in the actual coordinate system
+-	 * by: 
+-	 *                       3D           2D
+-	 *                 Bi=[ N   0 ]    Bi=N
+-	 *                    [ 0   N ]
+-	 * where N is the finiteelement function for node i.
+-	 *
+-	 * We assume B has been allocated already, of size: 2 x (numdof*numnodes)
+-	 */
++void           StressbalanceAnalysis::InputUpdateFromSolutionHO(IssmDouble* solution,Element* element){/*{{{*/
+ 
+-	/*Fetch number of nodes for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-
+-	/*Get nodal functions derivatives*/
+-	IssmDouble* basis=xNew<IssmDouble>(numnodes);
+-	element->NodalFunctions(basis,gauss);
+-
+-	/*Build L: */
+-	if(dim==3){
+-		for(int i=0;i<numnodes;i++){
+-			B[2*numnodes*0+2*i+0] = basis[i];
+-			B[2*numnodes*0+2*i+1] = 0.;
+-			B[2*numnodes*1+2*i+0] = 0.;
+-			B[2*numnodes*1+2*i+1] = basis[i];
+-		}
+-	}
+-	else{
+-		for(int i=0;i<numnodes;i++){
+-			B[i] = basis[i];
+-		}
+-	}
+-
+-	/*Clean-up*/
+-	xDelete<IssmDouble>(basis);
+-}/*}}}*/
+-void StressbalanceAnalysis::InputUpdateFromSolutionHO(IssmDouble* solution,Element* element){/*{{{*/
+-
+ 	int         i,dim;
+ 	int*        doflist=NULL;
+ 	IssmDouble* xyz_list=NULL;
+@@ -2981,6 +2981,143 @@
+ 	delete Ke3;
+ 	return Ke;
+ }/*}}}*/
++ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSShelf(Element* element){/*{{{*/
++
++	if(!element->IsFloating() || !element->IsOnBase()) return NULL;
++
++	/*If on not water or not FS, skip stiffness: */
++	int approximation,shelf_dampening;
++	element->GetInputValue(&approximation,ApproximationEnum);
++	if(approximation!=FSApproximationEnum && approximation!=SSAFSApproximationEnum && approximation!=HOFSApproximationEnum) return NULL;
++	element->FindParam(&shelf_dampening,StressbalanceShelfDampeningEnum);
++	if(shelf_dampening==0) return NULL;
++
++	/*Intermediaries*/
++	bool        mainlyfloating;
++	int         j,i,dim;
++	IssmDouble  Jdet,slope2,scalar,dt;
++	IssmDouble  slope[3];
++	IssmDouble *xyz_list_base = NULL;
++	IssmDouble *xyz_list      = NULL;
++	Gauss*      gauss         = NULL;
++
++	/*Get problem dimension*/
++	element->FindParam(&dim,DomainDimensionEnum);
++
++	/*Fetch number of nodes and dof for this finite element*/
++	int vnumnodes = element->NumberofNodesVelocity();
++	int pnumnodes = element->NumberofNodesPressure();
++	int numdof    = vnumnodes*dim + pnumnodes;
++
++	/*Initialize Element matrix and vectors*/
++	ElementMatrix* Ke = element->NewElementMatrix(FSvelocityEnum);
++	IssmDouble*    vbasis = xNew<IssmDouble>(vnumnodes);
++
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinatesBase(&xyz_list_base);
++	element->GetVerticesCoordinates(&xyz_list);
++	element->FindParam(&dt,TimesteppingTimeStepEnum);
++	if(dt==0)   dt=1.e+5;
++	IssmDouble  rho_water     = element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
++	IssmDouble  gravity       = element->GetMaterialParameter(ConstantsGEnum);
++	Input*      surface_input = element->GetInput(SurfaceEnum); _assert_(surface_input);
++
++	/* Start  looping on the number of gaussian points: */
++	gauss=element->NewGaussBase(3);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss);
++		element->NodalFunctionsVelocity(vbasis,gauss);
++		element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
++		if(dim==2) slope2=slope[0]*slope[0];
++		else if(dim==3) slope2=slope[0]*slope[0]+slope[1]*slope[1];
++		scalar  = rho_water*gravity*sqrt(1+slope2)*gauss->weight*Jdet*dt; 
++		for(i=0;i<vnumnodes;i++){
++			for(j=0;j<vnumnodes;j++){
++				Ke->values[numdof*((i+1)*dim-1)+(j+1)*dim-1] += scalar*vbasis[i]*vbasis[j];
++			}
++		}
++	}
++
++	/*DO NOT Transform Coordinate System: this stiffness matrix is already expressed in tangential coordinates*/
++
++	/*Clean up and return*/
++	delete gauss;
++	xDelete<IssmDouble>(xyz_list_base);
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(vbasis);
++	return Ke;
++}/*}}}*/
++ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSViscous(Element* element){/*{{{*/
++
++	/*Intermediaries*/
++	int         i,dim,epssize;
++	IssmDouble  viscosity,FSreconditioning,Jdet;
++	IssmDouble *xyz_list = NULL;
++
++	/*Get problem dimension*/
++	element->FindParam(&dim,DomainDimensionEnum);
++	if(dim==2) epssize = 3;
++	else       epssize = 6;
++
++	/*Fetch number of nodes and dof for this finite element*/
++	int vnumnodes = element->NumberofNodesVelocity();
++	int pnumnodes = element->NumberofNodesPressure();
++	int numdof    = vnumnodes*dim + pnumnodes;
++	int bsize     = epssize + 2;
++
++	/*Prepare coordinate system list*/
++	int* cs_list = xNew<int>(vnumnodes+pnumnodes);
++	if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum;
++	else       for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum;
++	for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum;
++
++	/*Initialize Element matrix and vectors*/
++	ElementMatrix* Ke     = element->NewElementMatrix(FSvelocityEnum);
++	IssmDouble*    B      = xNew<IssmDouble>(bsize*numdof);
++	IssmDouble*    Bprime = xNew<IssmDouble>(bsize*numdof);
++	IssmDouble*    D      = xNewZeroInit<IssmDouble>(bsize*bsize);
++
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinates(&xyz_list);
++	element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
++	Input* vx_input=element->GetInput(VxEnum);     _assert_(vx_input);
++	Input* vy_input=element->GetInput(VyEnum);     _assert_(vy_input);
++	Input* vz_input;
++	if(dim==3){vz_input=element->GetInput(VzEnum); _assert_(vz_input);}
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss = element->NewGauss(5);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		this->GetBFS(B,element,dim,xyz_list,gauss);
++		this->GetBFSprime(Bprime,element,dim,xyz_list,gauss);
++
++		element->ViscosityFS(&viscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input);
++		for(i=0;i<epssize;i++)     D[i*bsize+i] = + 2.*viscosity*gauss->weight*Jdet;
++		for(i=epssize;i<bsize;i++) D[i*bsize+i] = - FSreconditioning*gauss->weight*Jdet;
++
++		TripleMultiply(B,bsize,numdof,1,
++					D,bsize,bsize,0,
++					Bprime,bsize,numdof,0,
++					&Ke->values[0],1);
++	}
++
++	/*Transform Coordinate System*/
++	element->TransformStiffnessMatrixCoord(Ke,cs_list);
++
++	/*Clean up and return*/
++	delete gauss;
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(D);
++	xDelete<IssmDouble>(Bprime);
++	xDelete<IssmDouble>(B);
++	xDelete<int>(cs_list);
++	return Ke;
++}/*}}}*/
+ ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSViscousLA(Element* element){/*{{{*/
+ 
+ 	/*Intermediaries*/
+@@ -3180,143 +3317,6 @@
+ 	xDelete<int>(cs_list);
+ 	return Ke;
+ }/*}}}*/
+-ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSViscous(Element* element){/*{{{*/
+-
+-	/*Intermediaries*/
+-	int         i,dim,epssize;
+-	IssmDouble  viscosity,FSreconditioning,Jdet;
+-	IssmDouble *xyz_list = NULL;
+-
+-	/*Get problem dimension*/
+-	element->FindParam(&dim,DomainDimensionEnum);
+-	if(dim==2) epssize = 3;
+-	else       epssize = 6;
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int vnumnodes = element->NumberofNodesVelocity();
+-	int pnumnodes = element->NumberofNodesPressure();
+-	int numdof    = vnumnodes*dim + pnumnodes;
+-	int bsize     = epssize + 2;
+-
+-	/*Prepare coordinate system list*/
+-	int* cs_list = xNew<int>(vnumnodes+pnumnodes);
+-	if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum;
+-	else       for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum;
+-	for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum;
+-
+-	/*Initialize Element matrix and vectors*/
+-	ElementMatrix* Ke     = element->NewElementMatrix(FSvelocityEnum);
+-	IssmDouble*    B      = xNew<IssmDouble>(bsize*numdof);
+-	IssmDouble*    Bprime = xNew<IssmDouble>(bsize*numdof);
+-	IssmDouble*    D      = xNewZeroInit<IssmDouble>(bsize*bsize);
+-
+-	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinates(&xyz_list);
+-	element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
+-	Input* vx_input=element->GetInput(VxEnum);     _assert_(vx_input);
+-	Input* vy_input=element->GetInput(VyEnum);     _assert_(vy_input);
+-	Input* vz_input;
+-	if(dim==3){vz_input=element->GetInput(VzEnum); _assert_(vz_input);}
+-
+-	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss = element->NewGauss(5);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		this->GetBFS(B,element,dim,xyz_list,gauss);
+-		this->GetBFSprime(Bprime,element,dim,xyz_list,gauss);
+-
+-		element->ViscosityFS(&viscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input);
+-		for(i=0;i<epssize;i++)     D[i*bsize+i] = + 2.*viscosity*gauss->weight*Jdet;
+-		for(i=epssize;i<bsize;i++) D[i*bsize+i] = - FSreconditioning*gauss->weight*Jdet;
+-
+-		TripleMultiply(B,bsize,numdof,1,
+-					D,bsize,bsize,0,
+-					Bprime,bsize,numdof,0,
+-					&Ke->values[0],1);
+-	}
+-
+-	/*Transform Coordinate System*/
+-	element->TransformStiffnessMatrixCoord(Ke,cs_list);
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(D);
+-	xDelete<IssmDouble>(Bprime);
+-	xDelete<IssmDouble>(B);
+-	xDelete<int>(cs_list);
+-	return Ke;
+-}/*}}}*/
+-ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSShelf(Element* element){/*{{{*/
+-
+-	if(!element->IsFloating() || !element->IsOnBase()) return NULL;
+-
+-	/*If on not water or not FS, skip stiffness: */
+-	int approximation,shelf_dampening;
+-	element->GetInputValue(&approximation,ApproximationEnum);
+-	if(approximation!=FSApproximationEnum && approximation!=SSAFSApproximationEnum && approximation!=HOFSApproximationEnum) return NULL;
+-	element->FindParam(&shelf_dampening,StressbalanceShelfDampeningEnum);
+-	if(shelf_dampening==0) return NULL;
+-
+-	/*Intermediaries*/
+-	bool        mainlyfloating;
+-	int         j,i,dim;
+-	IssmDouble  Jdet,slope2,scalar,dt;
+-	IssmDouble  slope[3];
+-	IssmDouble *xyz_list_base = NULL;
+-	IssmDouble *xyz_list      = NULL;
+-	Gauss*      gauss         = NULL;
+-
+-	/*Get problem dimension*/
+-	element->FindParam(&dim,DomainDimensionEnum);
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int vnumnodes = element->NumberofNodesVelocity();
+-	int pnumnodes = element->NumberofNodesPressure();
+-	int numdof    = vnumnodes*dim + pnumnodes;
+-
+-	/*Initialize Element matrix and vectors*/
+-	ElementMatrix* Ke = element->NewElementMatrix(FSvelocityEnum);
+-	IssmDouble*    vbasis = xNew<IssmDouble>(vnumnodes);
+-
+-	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinatesBase(&xyz_list_base);
+-	element->GetVerticesCoordinates(&xyz_list);
+-	element->FindParam(&dt,TimesteppingTimeStepEnum);
+-	if(dt==0)   dt=1.e+5;
+-	IssmDouble  rho_water     = element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
+-	IssmDouble  gravity       = element->GetMaterialParameter(ConstantsGEnum);
+-	Input*      surface_input = element->GetInput(SurfaceEnum); _assert_(surface_input);
+-
+-	/* Start  looping on the number of gaussian points: */
+-	gauss=element->NewGaussBase(3);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss);
+-		element->NodalFunctionsVelocity(vbasis,gauss);
+-		element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
+-		if(dim==2) slope2=slope[0]*slope[0];
+-		else if(dim==3) slope2=slope[0]*slope[0]+slope[1]*slope[1];
+-		scalar  = rho_water*gravity*sqrt(1+slope2)*gauss->weight*Jdet*dt; 
+-		for(i=0;i<vnumnodes;i++){
+-			for(j=0;j<vnumnodes;j++){
+-				Ke->values[numdof*((i+1)*dim-1)+(j+1)*dim-1] += scalar*vbasis[i]*vbasis[j];
+-			}
+-		}
+-	}
+-
+-	/*DO NOT Transform Coordinate System: this stiffness matrix is already expressed in tangential coordinates*/
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-	xDelete<IssmDouble>(xyz_list_base);
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(vbasis);
+-	return Ke;
+-}/*}}}*/
+ #ifdef FSANALYTICAL
+ ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSFriction(Element* element){/*{{{*/
+ 
+@@ -3403,81 +3403,6 @@
+ 	/*clean-up and return*/
+ 	return pe;
+ }/*}}}*/
+-ElementVector* StressbalanceAnalysis::CreatePVectorFSViscous(Element* element){/*{{{*/
+-
+-	int         i,dim,fe_FS;
+-	IssmDouble  x_coord,y_coord,z_coord;
+-	IssmDouble  Jdet,forcex,forcey,forcez;
+-	IssmDouble *xyz_list = NULL;
+-
+-	element->FindParam(&fe_FS,FlowequationFeFSEnum);
+-	element->FindParam(&dim,DomainDimensionEnum);
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int vnumnodes = element->NumberofNodesVelocity();
+-	int pnumnodes = element->NumberofNodesPressure();
+-
+-	/*Prepare coordinate system list*/
+-	int* cs_list = xNew<int>(vnumnodes+pnumnodes);
+-	if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum;
+-	else       for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum;
+-	for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum;
+-
+-	/*Initialize vectors*/
+-	ElementVector* pe     = element->NewElementVector(FSvelocityEnum);
+-	IssmDouble*    vbasis = xNew<IssmDouble>(vnumnodes);
+-
+-	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinates(&xyz_list);
+-
+-	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=element->NewGauss(5);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		element->NodalFunctionsVelocity(vbasis,gauss);
+-
+-		x_coord=element->GetXcoord(xyz_list,gauss);
+-		y_coord=element->GetYcoord(xyz_list,gauss);
+-		if(dim==3) z_coord=element->GetZcoord(xyz_list,gauss);
+-		else z_coord=0.;
+-
+-		forcex=fx(x_coord,y_coord,z_coord,FSANALYTICAL);
+-		forcey=fy(x_coord,y_coord,z_coord,FSANALYTICAL);
+-		forcez=fz(x_coord,y_coord,z_coord,FSANALYTICAL);
+-
+-		for(i=0;i<vnumnodes;i++){
+-			pe->values[i*dim+0] += forcex *Jdet*gauss->weight*vbasis[i];
+-			pe->values[i*dim+1] += forcey *Jdet*gauss->weight*vbasis[i];
+-			if(dim==3) pe->values[i*dim+2] += forcez *Jdet*gauss->weight*vbasis[i];
+-		}
+-	}
+-
+-	/*Transform coordinate system*/
+-	element->TransformLoadVectorCoord(pe,cs_list);
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-	xDelete<int>(cs_list);
+-	xDelete<IssmDouble>(vbasis);
+-	xDelete<IssmDouble>(xyz_list);
+-	if(fe_FS==XTaylorHoodEnum){
+-		ElementVector* pe2=CreatePVectorFSViscousXTH(element);
+-		ElementVector* pe3 = new ElementVector(pe,pe2);
+-		delete pe;
+-		delete pe2;
+-		return pe3;
+-	}
+-	else if(fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum){
+-		ElementVector* pe2=CreatePVectorFSViscousLA(element);
+-		ElementVector* pe3 = new ElementVector(pe,pe2);
+-		delete pe;
+-		delete pe2;
+-		return pe3;
+-	}
+-	return pe;
+-}/*}}}*/
+ ElementVector* StressbalanceAnalysis::CreatePVectorFSFriction(Element* element){/*{{{*/
+ 
+ 	if(!element->IsOnBase()) return NULL;
+@@ -3588,6 +3513,81 @@
+ 	xDelete<IssmDouble>(vbasis);
+ 	return pe;
+ }/*}}}*/
++ElementVector* StressbalanceAnalysis::CreatePVectorFSViscous(Element* element){/*{{{*/
++
++	int         i,dim,fe_FS;
++	IssmDouble  x_coord,y_coord,z_coord;
++	IssmDouble  Jdet,forcex,forcey,forcez;
++	IssmDouble *xyz_list = NULL;
++
++	element->FindParam(&fe_FS,FlowequationFeFSEnum);
++	element->FindParam(&dim,DomainDimensionEnum);
++
++	/*Fetch number of nodes and dof for this finite element*/
++	int vnumnodes = element->NumberofNodesVelocity();
++	int pnumnodes = element->NumberofNodesPressure();
++
++	/*Prepare coordinate system list*/
++	int* cs_list = xNew<int>(vnumnodes+pnumnodes);
++	if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum;
++	else       for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum;
++	for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum;
++
++	/*Initialize vectors*/
++	ElementVector* pe     = element->NewElementVector(FSvelocityEnum);
++	IssmDouble*    vbasis = xNew<IssmDouble>(vnumnodes);
++
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinates(&xyz_list);
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGauss(5);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		element->NodalFunctionsVelocity(vbasis,gauss);
++
++		x_coord=element->GetXcoord(xyz_list,gauss);
++		y_coord=element->GetYcoord(xyz_list,gauss);
++		if(dim==3) z_coord=element->GetZcoord(xyz_list,gauss);
++		else z_coord=0.;
++
++		forcex=fx(x_coord,y_coord,z_coord,FSANALYTICAL);
++		forcey=fy(x_coord,y_coord,z_coord,FSANALYTICAL);
++		forcez=fz(x_coord,y_coord,z_coord,FSANALYTICAL);
++
++		for(i=0;i<vnumnodes;i++){
++			pe->values[i*dim+0] += forcex *Jdet*gauss->weight*vbasis[i];
++			pe->values[i*dim+1] += forcey *Jdet*gauss->weight*vbasis[i];
++			if(dim==3) pe->values[i*dim+2] += forcez *Jdet*gauss->weight*vbasis[i];
++		}
++	}
++
++	/*Transform coordinate system*/
++	element->TransformLoadVectorCoord(pe,cs_list);
++
++	/*Clean up and return*/
++	delete gauss;
++	xDelete<int>(cs_list);
++	xDelete<IssmDouble>(vbasis);
++	xDelete<IssmDouble>(xyz_list);
++	if(fe_FS==XTaylorHoodEnum){
++		ElementVector* pe2=CreatePVectorFSViscousXTH(element);
++		ElementVector* pe3 = new ElementVector(pe,pe2);
++		delete pe;
++		delete pe2;
++		return pe3;
++	}
++	else if(fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum){
++		ElementVector* pe2=CreatePVectorFSViscousLA(element);
++		ElementVector* pe3 = new ElementVector(pe,pe2);
++		delete pe;
++		delete pe2;
++		return pe3;
++	}
++	return pe;
++}/*}}}*/
+ #else
+ ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSFriction(Element* element){/*{{{*/
+ 
+@@ -3789,6 +3789,169 @@
+ 	return pe;
+ }/*}}}*/
+ #endif
++ElementVector* StressbalanceAnalysis::CreatePVectorFSFront(Element* element){/*{{{*/
++
++	/*If no front, return NULL*/
++	if(!element->IsIcefront()) return NULL;
++
++	/*Intermediaries*/
++	int         i,dim;
++	IssmDouble  Jdet,pressure,surface,z;
++	IssmDouble	normal[3];
++	IssmDouble *xyz_list       = NULL;
++	IssmDouble *xyz_list_front = NULL;
++	Gauss      *gauss          = NULL;
++
++	/*Make sure current element is floating*/
++	if(!element->IsFloating()) return NULL;
++
++	/*Get problem dimension*/
++	element->FindParam(&dim,DomainDimensionEnum);
++
++	/*Fetch number of nodes and dof for this finite element*/
++	int vnumnodes   = element->NumberofNodesVelocity();
++	int pnumnodes   = element->NumberofNodesPressure();
++	int numvertices = element->GetNumberOfVertices();
++
++	/*Prepare coordinate system list*/
++	int* cs_list = xNew<int>(vnumnodes+pnumnodes);
++	if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum;
++	else       for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum;
++	for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum;
++
++	/*Initialize vectors*/
++	ElementVector* pe     = element->NewElementVector(FSvelocityEnum);
++	IssmDouble*    vbasis = xNew<IssmDouble>(vnumnodes);
++
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinates(&xyz_list);
++	element->GetIcefrontCoordinates(&xyz_list_front,xyz_list,MaskIceLevelsetEnum);
++	element->NormalSection(&normal[0],xyz_list_front);
++	Input* surface_input  = element->GetInput(SurfaceEnum); _assert_(surface_input);
++	IssmDouble  rho_water = element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
++	IssmDouble  gravity   = element->GetMaterialParameter(ConstantsGEnum);
++
++	/*Initialize gauss points*/
++	IssmDouble zmax=xyz_list[0*3+(dim-1)]; for(int i=1;i<numvertices;i++) if(xyz_list[i*3+(dim-1)]>zmax) zmax=xyz_list[i*3+(dim-1)];
++	IssmDouble zmin=xyz_list[0*3+(dim-1)]; for(int i=1;i<numvertices;i++) if(xyz_list[i*3+(dim-1)]<zmin) zmin=xyz_list[i*3+(dim-1)];
++	if(zmax>0. && zmin<0.) gauss=element->NewGauss(xyz_list,xyz_list_front,3,30);//refined in vertical because of the sea level discontinuity
++	else                   gauss=element->NewGauss(xyz_list,xyz_list_front,3,3);
++
++	/* Start  looping on the number of gaussian points: */
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		element->JacobianDeterminantSurface(&Jdet,xyz_list_front,gauss);
++		element->NodalFunctionsVelocity(vbasis,gauss);
++		surface_input->GetInputValue(&surface,gauss);
++		if(dim==3) z=element->GetZcoord(xyz_list,gauss);
++		else       z=element->GetYcoord(xyz_list,gauss);
++		pressure = rho_water*gravity*min(0.,z);//0 if the gaussian point is above water level
++
++		for (int i=0;i<vnumnodes;i++){
++			pe->values[dim*i+0]+= pressure*Jdet*gauss->weight*normal[0]*vbasis[i];
++			pe->values[dim*i+1]+= pressure*Jdet*gauss->weight*normal[1]*vbasis[i];
++			if(dim==3) pe->values[dim*i+2]+= pressure*Jdet*gauss->weight*normal[2]*vbasis[i];
++		}
++	}
++
++	/*Transform coordinate system*/
++	element->TransformLoadVectorCoord(pe,cs_list);
++
++	/*Clean up and return*/
++	delete gauss;
++	xDelete<int>(cs_list);
++	xDelete<IssmDouble>(vbasis);
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(xyz_list_front);
++	return pe;
++}/*}}}*/
++ElementVector* StressbalanceAnalysis::CreatePVectorFSShelf(Element* element){/*{{{*/
++
++	int         i,dim;
++	IssmDouble  Jdet,water_pressure,bed;
++	IssmDouble	normal[3];
++	IssmDouble *xyz_list_base = NULL;
++
++	/*Get basal element*/
++	if(!element->IsOnBase() || !element->IsFloating()) return NULL;
++
++	/*Get problem dimension*/
++	element->FindParam(&dim,DomainDimensionEnum);
++
++	/*Fetch number of nodes and dof for this finite element*/
++	int vnumnodes = element->NumberofNodesVelocity();
++	int pnumnodes = element->NumberofNodesPressure();
++
++	/*Prepare coordinate system list*/
++	int* cs_list = xNew<int>(vnumnodes+pnumnodes);
++	if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum;
++	else       for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum;
++	for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum;
++
++	/*Initialize vectors*/
++	ElementVector* pe     = element->NewElementVector(FSvelocityEnum);
++	IssmDouble*    vbasis = xNew<IssmDouble>(vnumnodes);
++
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinatesBase(&xyz_list_base);
++	Input*      base_input=element->GetInput(BaseEnum); _assert_(base_input);
++	IssmDouble  rho_water=element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
++	IssmDouble  gravity  =element->GetMaterialParameter(ConstantsGEnum);
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGaussBase(5);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
++		element->NodalFunctionsVelocity(vbasis,gauss);
++
++		element->NormalBase(&normal[0],xyz_list_base);
++		_assert_(normal[dim-1]<0.);
++		base_input->GetInputValue(&bed, gauss);
++		water_pressure=gravity*rho_water*bed;
++
++		for(i=0;i<vnumnodes;i++){
++			pe->values[i*dim+0] += water_pressure*gauss->weight*Jdet*vbasis[i]*normal[0];
++			pe->values[i*dim+1] += water_pressure*gauss->weight*Jdet*vbasis[i]*normal[1];
++			if(dim==3){
++				pe->values[i*dim+2]+=water_pressure*gauss->weight*Jdet*vbasis[i]*normal[2];
++			}
++		}
++	}
++
++	/*Transform coordinate system*/
++	element->TransformLoadVectorCoord(pe,cs_list);
++
++	/* shelf dampening*/
++	int shelf_dampening;
++	element->FindParam(&shelf_dampening,StressbalanceShelfDampeningEnum);
++	if(shelf_dampening) {
++		Input*      mb_input=element->GetInput(BasalforcingsFloatingiceMeltingRateEnum); _assert_(mb_input);
++		IssmDouble dt,mb,normal_b;
++		element->FindParam(&dt,TimesteppingTimeStepEnum);
++		for(int ig=gauss->begin();ig<gauss->end();ig++){
++			gauss->GaussPoint(ig);
++			element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
++			element->NodalFunctionsVelocity(vbasis,gauss);
++			element->NormalBase(&normal[0],xyz_list_base);
++			if (dim==2) normal_b=normal[1];
++			else if (dim==3) normal_b=sqrt(normal[0]*normal[0]+normal[1]*normal[1]);
++			mb_input->GetInputValue(&mb, gauss);
++			for(i=0;i<vnumnodes;i++){
++				pe->values[i*dim+1] += dt*rho_water*gravity*mb*gauss->weight*Jdet*vbasis[i]*normal_b;
++			}
++		}
++	}
++
++	/*Clean up and return*/
++	delete gauss;
++	xDelete<int>(cs_list);
++	xDelete<IssmDouble>(vbasis);
++	xDelete<IssmDouble>(xyz_list_base);
++	return pe;
++}/*}}}*/
+ ElementVector* StressbalanceAnalysis::CreatePVectorFSViscousLA(Element* element){/*{{{*/
+ 
+ 	int         i,dim;
+@@ -4043,170 +4206,7 @@
+ 	xDelete<IssmDouble>(tbasis);
+ 	return pe;
+ }/*}}}*/
+-ElementVector* StressbalanceAnalysis::CreatePVectorFSShelf(Element* element){/*{{{*/
+-
+-	int         i,dim;
+-	IssmDouble  Jdet,water_pressure,bed;
+-	IssmDouble	normal[3];
+-	IssmDouble *xyz_list_base = NULL;
+-
+-	/*Get basal element*/
+-	if(!element->IsOnBase() || !element->IsFloating()) return NULL;
+-
+-	/*Get problem dimension*/
+-	element->FindParam(&dim,DomainDimensionEnum);
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int vnumnodes = element->NumberofNodesVelocity();
+-	int pnumnodes = element->NumberofNodesPressure();
+-
+-	/*Prepare coordinate system list*/
+-	int* cs_list = xNew<int>(vnumnodes+pnumnodes);
+-	if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum;
+-	else       for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum;
+-	for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum;
+-
+-	/*Initialize vectors*/
+-	ElementVector* pe     = element->NewElementVector(FSvelocityEnum);
+-	IssmDouble*    vbasis = xNew<IssmDouble>(vnumnodes);
+-
+-	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinatesBase(&xyz_list_base);
+-	Input*      base_input=element->GetInput(BaseEnum); _assert_(base_input);
+-	IssmDouble  rho_water=element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
+-	IssmDouble  gravity  =element->GetMaterialParameter(ConstantsGEnum);
+-
+-	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=element->NewGaussBase(5);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
+-		element->NodalFunctionsVelocity(vbasis,gauss);
+-
+-		element->NormalBase(&normal[0],xyz_list_base);
+-		_assert_(normal[dim-1]<0.);
+-		base_input->GetInputValue(&bed, gauss);
+-		water_pressure=gravity*rho_water*bed;
+-
+-		for(i=0;i<vnumnodes;i++){
+-			pe->values[i*dim+0] += water_pressure*gauss->weight*Jdet*vbasis[i]*normal[0];
+-			pe->values[i*dim+1] += water_pressure*gauss->weight*Jdet*vbasis[i]*normal[1];
+-			if(dim==3){
+-				pe->values[i*dim+2]+=water_pressure*gauss->weight*Jdet*vbasis[i]*normal[2];
+-			}
+-		}
+-	}
+-
+-	/*Transform coordinate system*/
+-	element->TransformLoadVectorCoord(pe,cs_list);
+-
+-	/* shelf dampening*/
+-	int shelf_dampening;
+-	element->FindParam(&shelf_dampening,StressbalanceShelfDampeningEnum);
+-	if(shelf_dampening) {
+-		Input*      mb_input=element->GetInput(BasalforcingsFloatingiceMeltingRateEnum); _assert_(mb_input);
+-		IssmDouble dt,mb,normal_b;
+-		element->FindParam(&dt,TimesteppingTimeStepEnum);
+-		for(int ig=gauss->begin();ig<gauss->end();ig++){
+-			gauss->GaussPoint(ig);
+-			element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
+-			element->NodalFunctionsVelocity(vbasis,gauss);
+-			element->NormalBase(&normal[0],xyz_list_base);
+-			if (dim==2) normal_b=normal[1];
+-			else if (dim==3) normal_b=sqrt(normal[0]*normal[0]+normal[1]*normal[1]);
+-			mb_input->GetInputValue(&mb, gauss);
+-			for(i=0;i<vnumnodes;i++){
+-				pe->values[i*dim+1] += dt*rho_water*gravity*mb*gauss->weight*Jdet*vbasis[i]*normal_b;
+-			}
+-		}
+-	}
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-	xDelete<int>(cs_list);
+-	xDelete<IssmDouble>(vbasis);
+-	xDelete<IssmDouble>(xyz_list_base);
+-	return pe;
+-}/*}}}*/
+-ElementVector* StressbalanceAnalysis::CreatePVectorFSFront(Element* element){/*{{{*/
+-
+-	/*If no front, return NULL*/
+-	if(!element->IsIcefront()) return NULL;
+-
+-	/*Intermediaries*/
+-	int         i,dim;
+-	IssmDouble  Jdet,pressure,surface,z;
+-	IssmDouble	normal[3];
+-	IssmDouble *xyz_list       = NULL;
+-	IssmDouble *xyz_list_front = NULL;
+-	Gauss      *gauss          = NULL;
+-
+-	/*Make sure current element is floating*/
+-	if(!element->IsFloating()) return NULL;
+-
+-	/*Get problem dimension*/
+-	element->FindParam(&dim,DomainDimensionEnum);
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int vnumnodes   = element->NumberofNodesVelocity();
+-	int pnumnodes   = element->NumberofNodesPressure();
+-	int numvertices = element->GetNumberOfVertices();
+-
+-	/*Prepare coordinate system list*/
+-	int* cs_list = xNew<int>(vnumnodes+pnumnodes);
+-	if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum;
+-	else       for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum;
+-	for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum;
+-
+-	/*Initialize vectors*/
+-	ElementVector* pe     = element->NewElementVector(FSvelocityEnum);
+-	IssmDouble*    vbasis = xNew<IssmDouble>(vnumnodes);
+-
+-	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinates(&xyz_list);
+-	element->GetIcefrontCoordinates(&xyz_list_front,xyz_list,MaskIceLevelsetEnum);
+-	element->NormalSection(&normal[0],xyz_list_front);
+-	Input* surface_input  = element->GetInput(SurfaceEnum); _assert_(surface_input);
+-	IssmDouble  rho_water = element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
+-	IssmDouble  gravity   = element->GetMaterialParameter(ConstantsGEnum);
+-
+-	/*Initialize gauss points*/
+-	IssmDouble zmax=xyz_list[0*3+(dim-1)]; for(int i=1;i<numvertices;i++) if(xyz_list[i*3+(dim-1)]>zmax) zmax=xyz_list[i*3+(dim-1)];
+-	IssmDouble zmin=xyz_list[0*3+(dim-1)]; for(int i=1;i<numvertices;i++) if(xyz_list[i*3+(dim-1)]<zmin) zmin=xyz_list[i*3+(dim-1)];
+-	if(zmax>0. && zmin<0.) gauss=element->NewGauss(xyz_list,xyz_list_front,3,30);//refined in vertical because of the sea level discontinuity
+-	else                   gauss=element->NewGauss(xyz_list,xyz_list_front,3,3);
+-
+-	/* Start  looping on the number of gaussian points: */
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		element->JacobianDeterminantSurface(&Jdet,xyz_list_front,gauss);
+-		element->NodalFunctionsVelocity(vbasis,gauss);
+-		surface_input->GetInputValue(&surface,gauss);
+-		if(dim==3) z=element->GetZcoord(xyz_list,gauss);
+-		else       z=element->GetYcoord(xyz_list,gauss);
+-		pressure = rho_water*gravity*min(0.,z);//0 if the gaussian point is above water level
+-
+-		for (int i=0;i<vnumnodes;i++){
+-			pe->values[dim*i+0]+= pressure*Jdet*gauss->weight*normal[0]*vbasis[i];
+-			pe->values[dim*i+1]+= pressure*Jdet*gauss->weight*normal[1]*vbasis[i];
+-			if(dim==3) pe->values[dim*i+2]+= pressure*Jdet*gauss->weight*normal[2]*vbasis[i];
+-		}
+-	}
+-
+-	/*Transform coordinate system*/
+-	element->TransformLoadVectorCoord(pe,cs_list);
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-	xDelete<int>(cs_list);
+-	xDelete<IssmDouble>(vbasis);
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(xyz_list_front);
+-	return pe;
+-}/*}}}*/
+-void StressbalanceAnalysis::GetBFS(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           StressbalanceAnalysis::GetBFS(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[Bv1 Bv2 ... Bp1 Bp2 ...] where Bvi is of size 3*NDOF3. 
+ 	 * For node i, Bvi can be expressed in the actual coordinate system
+ 	 * by: 	   Bvi=[ dphi/dx          0        ]
+@@ -4318,7 +4318,67 @@
+ 	xDelete<IssmDouble>(vdbasis);
+ 	xDelete<IssmDouble>(pbasis);
+ }/*}}}*/
+-void StressbalanceAnalysis::GetBFSprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           StressbalanceAnalysis::GetBFSFriction(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++	/* Compute L  matrix. L=[L1 L2 L3] where Li is square and of size numdof. 
++	 * For node i, Li can be expressed in the actual coordinate system
++	 * by in 3d 
++	 *       Li=[ h 0 0 0 ]
++	 *	 	      [ 0 h 0 0 ]
++	 *	in 2d:
++	 *       Li=[ h 0 0 ]
++	 * where h is the interpolation function for node i.
++	 */
++
++	/*Fetch number of nodes for this finite element*/
++	int pnumnodes = element->NumberofNodesPressure();
++	int vnumnodes = element->NumberofNodesVelocity();
++	int pnumdof   = pnumnodes;
++	int vnumdof   = vnumnodes*dim;
++
++	/*Get nodal functions derivatives*/
++	IssmDouble* vbasis=xNew<IssmDouble>(vnumnodes);
++	element->NodalFunctionsVelocity(vbasis,gauss);
++
++	/*Build B: */
++	if(dim==3){
++		for(int i=0;i<vnumnodes;i++){
++			B[(vnumdof+pnumdof)*0+3*i+0] = vbasis[i];
++			B[(vnumdof+pnumdof)*0+3*i+1] = 0.;
++			B[(vnumdof+pnumdof)*0+3*i+2] = 0.;
++
++			B[(vnumdof+pnumdof)*1+3*i+0] = 0.;
++			B[(vnumdof+pnumdof)*1+3*i+1] = vbasis[i];
++			B[(vnumdof+pnumdof)*1+3*i+2] = 0.;
++
++			B[(vnumdof+pnumdof)*2+3*i+0] = 0.;
++			B[(vnumdof+pnumdof)*2+3*i+1] = 0.;
++			B[(vnumdof+pnumdof)*2+3*i+2] = vbasis[i];
++		}
++		for(int i=0;i<pnumnodes;i++){
++			B[(vnumdof+pnumdof)*0+i+vnumdof+0] = 0.;
++			B[(vnumdof+pnumdof)*1+i+vnumdof+0] = 0.;
++			B[(vnumdof+pnumdof)*2+i+vnumdof+0] = 0.;
++		}
++	}
++	else{
++		for(int i=0;i<vnumnodes;i++){
++			B[(vnumdof+pnumdof)*0+2*i+0] = vbasis[i];
++			B[(vnumdof+pnumdof)*0+2*i+1] = 0.;
++
++			B[(vnumdof+pnumdof)*1+2*i+0] = 0.;
++			B[(vnumdof+pnumdof)*1+2*i+1] = vbasis[i];
++		}
++
++		for(int i=0;i<pnumnodes;i++){
++			B[(vnumdof+pnumdof)*0+i+vnumdof+0] = 0.;
++			B[(vnumdof+pnumdof)*1+i+vnumdof+0] = 0.;
++		}
++	}
++
++	/*Clean-up*/
++	xDelete<IssmDouble>(vbasis);
++}/*}}}*/
++void           StressbalanceAnalysis::GetBFSprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*	Compute B'  matrix. B'=[B1' B2' B3' B4' B5' B6' Bb'] where Bi' is of size 3*NDOF2. 
+ 	 *	For node i, Bi' can be expressed in the actual coordinate system
+ 	 *	by: 
+@@ -4431,24 +4491,15 @@
+ 	xDelete<IssmDouble>(vdbasis);
+ 	xDelete<IssmDouble>(pbasis);
+ }/*}}}*/
+-void StressbalanceAnalysis::GetBFSvel(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+-	/*Compute B  matrix. B=[Bv1 Bv2 ... Bp1 Bp2 ...] where Bvi is of size 3*NDOF3. 
+-	 * For node i, Bvi can be expressed in the actual coordinate system
+-	 * by: 	   Bvi=[ dphi/dx          0        ]
+-	 *					 [   0           dphi/dy     ]
+-	 *					 [ 1/2*dphi/dy    1/2*dphi/dx]
++void           StressbalanceAnalysis::GetBFSprimeUzawa(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++	/*	Compute B'  matrix. B'=[B1' B2' B3' B4' B5' B6'] where Bi' is of size 3*NDOF2. 
++	 *	For node i, Bi' can be expressed in the actual coordinate system
++	 *	by: 
++	 *			Bvi' = [  dphi/dx   dphi/dy ]
+ 	 *
+-	 *
+-	 *	In 3d:
+-	 *     	   Bvi=[ dh/dx          0             0      ]
+-	 *					[   0           dh/dy           0      ]
+-	 *					[   0             0           dh/dz    ]
+-	 *					[ 1/2*dh/dy    1/2*dh/dx        0      ]
+-	 *					[ 1/2*dh/dz       0         1/2*dh/dx  ]
+-	 *					[   0          1/2*dh/dz    1/2*dh/dy  ]
+-	 *
++	 *	In 3d
++	 *     	   Bvi=[ dh/dx   dh/dy    dh/dz  ]
+ 	 *	where phi is the finiteelement function for node i.
+-	 *	Same thing for Bb except the last column that does not exist.
+ 	 */
+ 
+ 	/*Fetch number of nodes for this finite element*/
+@@ -4458,44 +4509,25 @@
+ 	IssmDouble* vdbasis=xNew<IssmDouble>(dim*vnumnodes);
+ 	element->NodalFunctionsDerivativesVelocity(vdbasis,xyz_list,gauss);
+ 
+-	/*Build B: */
++	/*Build B_prime: */
+ 	if(dim==2){
+ 		for(int i=0;i<vnumnodes;i++){
+-			B[(dim*vnumnodes)*0+dim*i+0] = vdbasis[0*vnumnodes+i];
+-			B[(dim*vnumnodes)*0+dim*i+1] = 0.;
+-			B[(dim*vnumnodes)*1+dim*i+0] = 0.;
+-			B[(dim*vnumnodes)*1+dim*i+1] = vdbasis[1*vnumnodes+i];
+-			B[(dim*vnumnodes)*2+dim*i+0] = .5*vdbasis[1*vnumnodes+i];
+-			B[(dim*vnumnodes)*2+dim*i+1] = .5*vdbasis[0*vnumnodes+i];
++			Bprime[dim*i+0] = vdbasis[0*vnumnodes+i];
++			Bprime[dim*i+1] = vdbasis[1*vnumnodes+i];
+ 		}
+ 	}
+ 	else{
+ 		for(int i=0;i<vnumnodes;i++){
+-			B[(dim*vnumnodes)*0+dim*i+0] = vdbasis[0*vnumnodes+i];
+-			B[(dim*vnumnodes)*0+dim*i+1] = 0.;
+-			B[(dim*vnumnodes)*0+dim*i+2] = 0.;
+-			B[(dim*vnumnodes)*1+dim*i+0] = 0.;
+-			B[(dim*vnumnodes)*1+dim*i+1] = vdbasis[1*vnumnodes+i];
+-			B[(dim*vnumnodes)*1+dim*i+2] = 0.;
+-			B[(dim*vnumnodes)*2+dim*i+0] = 0.;
+-			B[(dim*vnumnodes)*2+dim*i+1] = 0.;
+-			B[(dim*vnumnodes)*2+dim*i+2] = vdbasis[2*vnumnodes+i];
+-			B[(dim*vnumnodes)*3+dim*i+0] = .5*vdbasis[1*vnumnodes+i];
+-			B[(dim*vnumnodes)*3+dim*i+1] = .5*vdbasis[0*vnumnodes+i];
+-			B[(dim*vnumnodes)*3+dim*i+2] = 0.;
+-			B[(dim*vnumnodes)*4+dim*i+0] = .5*vdbasis[2*vnumnodes+i];
+-			B[(dim*vnumnodes)*4+dim*i+1] = 0.;
+-			B[(dim*vnumnodes)*4+dim*i+2] = .5*vdbasis[0*vnumnodes+i];
+-			B[(dim*vnumnodes)*5+dim*i+0] = 0.;
+-			B[(dim*vnumnodes)*5+dim*i+1] = .5*vdbasis[2*vnumnodes+i];
+-			B[(dim*vnumnodes)*5+dim*i+2] = .5*vdbasis[1*vnumnodes+i];
++			Bprime[dim*i+0] = vdbasis[0*vnumnodes+i];
++			Bprime[dim*i+1] = vdbasis[1*vnumnodes+i];
++			Bprime[dim*i+2] = vdbasis[2*vnumnodes+i];
+ 		}
+ 	}
+ 
+ 	/*Clean up*/
+ 	xDelete<IssmDouble>(vdbasis);
+ }/*}}}*/
+-void StressbalanceAnalysis::GetBFSprimevel(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           StressbalanceAnalysis::GetBFSprimevel(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*	Compute B'  matrix. B'=[B1' B2' B3' B4' B5' B6' Bb'] where Bi' is of size 3*NDOF2. 
+ 	 *	For node i, Bi' can be expressed in the actual coordinate system
+ 	 *	by: 
+@@ -4558,7 +4590,7 @@
+ 	/*Clean up*/
+ 	xDelete<IssmDouble>(vdbasis);
+ }/*}}}*/
+-void StressbalanceAnalysis::GetBFSUzawa(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           StressbalanceAnalysis::GetBFSUzawa(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[Bp1 Bp2 ...] where Bpi=phi_pi. 
+ 	 */
+ 
+@@ -4580,15 +4612,24 @@
+ 	/*Clean up*/
+ 	xDelete<IssmDouble>(basis);
+ }/*}}}*/
+-void StressbalanceAnalysis::GetBFSprimeUzawa(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+-	/*	Compute B'  matrix. B'=[B1' B2' B3' B4' B5' B6'] where Bi' is of size 3*NDOF2. 
+-	 *	For node i, Bi' can be expressed in the actual coordinate system
+-	 *	by: 
+-	 *			Bvi' = [  dphi/dx   dphi/dy ]
++void           StressbalanceAnalysis::GetBFSvel(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++	/*Compute B  matrix. B=[Bv1 Bv2 ... Bp1 Bp2 ...] where Bvi is of size 3*NDOF3. 
++	 * For node i, Bvi can be expressed in the actual coordinate system
++	 * by: 	   Bvi=[ dphi/dx          0        ]
++	 *					 [   0           dphi/dy     ]
++	 *					 [ 1/2*dphi/dy    1/2*dphi/dx]
+ 	 *
+-	 *	In 3d
+-	 *     	   Bvi=[ dh/dx   dh/dy    dh/dz  ]
++	 *
++	 *	In 3d:
++	 *     	   Bvi=[ dh/dx          0             0      ]
++	 *					[   0           dh/dy           0      ]
++	 *					[   0             0           dh/dz    ]
++	 *					[ 1/2*dh/dy    1/2*dh/dx        0      ]
++	 *					[ 1/2*dh/dz       0         1/2*dh/dx  ]
++	 *					[   0          1/2*dh/dz    1/2*dh/dy  ]
++	 *
+ 	 *	where phi is the finiteelement function for node i.
++	 *	Same thing for Bb except the last column that does not exist.
+ 	 */
+ 
+ 	/*Fetch number of nodes for this finite element*/
+@@ -4598,85 +4639,44 @@
+ 	IssmDouble* vdbasis=xNew<IssmDouble>(dim*vnumnodes);
+ 	element->NodalFunctionsDerivativesVelocity(vdbasis,xyz_list,gauss);
+ 
+-	/*Build B_prime: */
++	/*Build B: */
+ 	if(dim==2){
+ 		for(int i=0;i<vnumnodes;i++){
+-			Bprime[dim*i+0] = vdbasis[0*vnumnodes+i];
+-			Bprime[dim*i+1] = vdbasis[1*vnumnodes+i];
++			B[(dim*vnumnodes)*0+dim*i+0] = vdbasis[0*vnumnodes+i];
++			B[(dim*vnumnodes)*0+dim*i+1] = 0.;
++			B[(dim*vnumnodes)*1+dim*i+0] = 0.;
++			B[(dim*vnumnodes)*1+dim*i+1] = vdbasis[1*vnumnodes+i];
++			B[(dim*vnumnodes)*2+dim*i+0] = .5*vdbasis[1*vnumnodes+i];
++			B[(dim*vnumnodes)*2+dim*i+1] = .5*vdbasis[0*vnumnodes+i];
+ 		}
+ 	}
+ 	else{
+ 		for(int i=0;i<vnumnodes;i++){
+-			Bprime[dim*i+0] = vdbasis[0*vnumnodes+i];
+-			Bprime[dim*i+1] = vdbasis[1*vnumnodes+i];
+-			Bprime[dim*i+2] = vdbasis[2*vnumnodes+i];
++			B[(dim*vnumnodes)*0+dim*i+0] = vdbasis[0*vnumnodes+i];
++			B[(dim*vnumnodes)*0+dim*i+1] = 0.;
++			B[(dim*vnumnodes)*0+dim*i+2] = 0.;
++			B[(dim*vnumnodes)*1+dim*i+0] = 0.;
++			B[(dim*vnumnodes)*1+dim*i+1] = vdbasis[1*vnumnodes+i];
++			B[(dim*vnumnodes)*1+dim*i+2] = 0.;
++			B[(dim*vnumnodes)*2+dim*i+0] = 0.;
++			B[(dim*vnumnodes)*2+dim*i+1] = 0.;
++			B[(dim*vnumnodes)*2+dim*i+2] = vdbasis[2*vnumnodes+i];
++			B[(dim*vnumnodes)*3+dim*i+0] = .5*vdbasis[1*vnumnodes+i];
++			B[(dim*vnumnodes)*3+dim*i+1] = .5*vdbasis[0*vnumnodes+i];
++			B[(dim*vnumnodes)*3+dim*i+2] = 0.;
++			B[(dim*vnumnodes)*4+dim*i+0] = .5*vdbasis[2*vnumnodes+i];
++			B[(dim*vnumnodes)*4+dim*i+1] = 0.;
++			B[(dim*vnumnodes)*4+dim*i+2] = .5*vdbasis[0*vnumnodes+i];
++			B[(dim*vnumnodes)*5+dim*i+0] = 0.;
++			B[(dim*vnumnodes)*5+dim*i+1] = .5*vdbasis[2*vnumnodes+i];
++			B[(dim*vnumnodes)*5+dim*i+2] = .5*vdbasis[1*vnumnodes+i];
+ 		}
+ 	}
+ 
+ 	/*Clean up*/
+ 	xDelete<IssmDouble>(vdbasis);
+ }/*}}}*/
+-void StressbalanceAnalysis::GetBFSFriction(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+-	/* Compute L  matrix. L=[L1 L2 L3] where Li is square and of size numdof. 
+-	 * For node i, Li can be expressed in the actual coordinate system
+-	 * by in 3d 
+-	 *       Li=[ h 0 0 0 ]
+-	 *	 	      [ 0 h 0 0 ]
+-	 *	in 2d:
+-	 *       Li=[ h 0 0 ]
+-	 * where h is the interpolation function for node i.
+-	 */
+-
+-	/*Fetch number of nodes for this finite element*/
+-	int pnumnodes = element->NumberofNodesPressure();
+-	int vnumnodes = element->NumberofNodesVelocity();
+-	int pnumdof   = pnumnodes;
+-	int vnumdof   = vnumnodes*dim;
+-
+-	/*Get nodal functions derivatives*/
+-	IssmDouble* vbasis=xNew<IssmDouble>(vnumnodes);
+-	element->NodalFunctionsVelocity(vbasis,gauss);
+-
+-	/*Build B: */
+-	if(dim==3){
+-		for(int i=0;i<vnumnodes;i++){
+-			B[(vnumdof+pnumdof)*0+3*i+0] = vbasis[i];
+-			B[(vnumdof+pnumdof)*0+3*i+1] = 0.;
+-			B[(vnumdof+pnumdof)*0+3*i+2] = 0.;
+-
+-			B[(vnumdof+pnumdof)*1+3*i+0] = 0.;
+-			B[(vnumdof+pnumdof)*1+3*i+1] = vbasis[i];
+-			B[(vnumdof+pnumdof)*1+3*i+2] = 0.;
+-
+-			B[(vnumdof+pnumdof)*2+3*i+0] = 0.;
+-			B[(vnumdof+pnumdof)*2+3*i+1] = 0.;
+-			B[(vnumdof+pnumdof)*2+3*i+2] = vbasis[i];
+-		}
+-		for(int i=0;i<pnumnodes;i++){
+-			B[(vnumdof+pnumdof)*0+i+vnumdof+0] = 0.;
+-			B[(vnumdof+pnumdof)*1+i+vnumdof+0] = 0.;
+-			B[(vnumdof+pnumdof)*2+i+vnumdof+0] = 0.;
+-		}
+-	}
+-	else{
+-		for(int i=0;i<vnumnodes;i++){
+-			B[(vnumdof+pnumdof)*0+2*i+0] = vbasis[i];
+-			B[(vnumdof+pnumdof)*0+2*i+1] = 0.;
+-
+-			B[(vnumdof+pnumdof)*1+2*i+0] = 0.;
+-			B[(vnumdof+pnumdof)*1+2*i+1] = vbasis[i];
+-		}
+-
+-		for(int i=0;i<pnumnodes;i++){
+-			B[(vnumdof+pnumdof)*0+i+vnumdof+0] = 0.;
+-			B[(vnumdof+pnumdof)*1+i+vnumdof+0] = 0.;
+-		}
+-	}
+-
+-	/*Clean-up*/
+-	xDelete<IssmDouble>(vbasis);
+-}/*}}}*/
+-void StressbalanceAnalysis::GetCFS(IssmDouble* C,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           StressbalanceAnalysis::GetCFS(IssmDouble* C,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute C  matrix. C=[Cp1 Cp2 ...] where:
+ 	 *     Cpi=[phi phi]. 
+ 	 */
+@@ -4697,7 +4697,7 @@
+ 	/*Clean up*/
+ 	xDelete<IssmDouble>(basis);
+ }/*}}}*/
+-void StressbalanceAnalysis::GetCFSprime(IssmDouble* Cprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           StressbalanceAnalysis::GetCFSprime(IssmDouble* Cprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*	Compute C'  matrix. C'=[C1' C2' ...] 
+ 	 *			Ci' = [  phi  0  ]
+ 	 *			      [   0  phi ]
+@@ -4745,7 +4745,7 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(vbasis);
+ }/*}}}*/
+-void StressbalanceAnalysis::GetSolutionFromInputsFS(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           StressbalanceAnalysis::GetSolutionFromInputsFS(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 
+ 	int*         vdoflist=NULL;
+ 	int*         pdoflist=NULL;
+@@ -4808,7 +4808,7 @@
+ 	xDelete<IssmDouble>(pvalues);
+ 	xDelete<IssmDouble>(vvalues);
+ }/*}}}*/
+-void StressbalanceAnalysis::InitializeXTH(Elements* elements,Parameters* parameters){/*{{{*/
++void           StressbalanceAnalysis::InitializeXTH(Elements* elements,Parameters* parameters){/*{{{*/
+ 
+ 	/*Intermediaries*/
+ 	int        dim;
+@@ -4887,7 +4887,7 @@
+ 	}
+ 
+ }/*}}}*/
+-void StressbalanceAnalysis::InputUpdateFromSolutionFS(IssmDouble* solution,Element* element){/*{{{*/
++void           StressbalanceAnalysis::InputUpdateFromSolutionFS(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	bool         results_on_nodes;
+ 	int          i,dim;
+@@ -4977,7 +4977,7 @@
+ 	xDelete<int>(pdoflist);
+ 	xDelete<int>(cs_list);
+ }/*}}}*/
+-void StressbalanceAnalysis::InputUpdateFromSolutionFSXTH_d(Elements* elements,Parameters* parameters){/*{{{*/
++void           StressbalanceAnalysis::InputUpdateFromSolutionFSXTH_d(Elements* elements,Parameters* parameters){/*{{{*/
+ 
+ 	/*Intermediaries*/
+ 	int         dim,tausize;
+@@ -5190,7 +5190,7 @@
+ 		xDelete<IssmDouble>(pe_yz); xDelete<IssmDouble>(d_yz);
+ 	}
+ }/*}}}*/
+-void StressbalanceAnalysis::InputUpdateFromSolutionFSXTH_tau(Elements* elements,Parameters* parameters){/*{{{*/
++void           StressbalanceAnalysis::InputUpdateFromSolutionFSXTH_tau(Elements* elements,Parameters* parameters){/*{{{*/
+ 
+ 	/*Intermediaries*/
+ 	int         dim,tausize;
+@@ -5326,165 +5326,6 @@
+ }/*}}}*/
+ 
+ /*Coupling (Tiling)*/
+-ElementMatrix* StressbalanceAnalysis::CreateKMatrixSSA3d(Element* element){/*{{{*/
+-
+-	/*compute all stiffness matrices for this element*/
+-	ElementMatrix* Ke1=CreateKMatrixSSA3dViscous(element);
+-	ElementMatrix* Ke2=CreateKMatrixSSA3dFriction(element);
+-	ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2);
+-
+-	/*clean-up and return*/
+-	delete Ke1;
+-	delete Ke2;
+-	return Ke;
+-}/*}}}*/
+-ElementMatrix* StressbalanceAnalysis::CreateKMatrixSSA3dFriction(Element* element){/*{{{*/
+-
+-	/*Initialize Element matrix and return if necessary*/
+-	if(element->IsFloating() || !element->IsOnBase()) return NULL;
+-
+-	/*Build a tria element using the 3 nodes of the base of the penta. Then use 
+-	 * the tria functionality to build a friction stiffness matrix on these 3
+-	 * nodes: */
+-	Element* basalelement = element->SpawnBasalElement();
+-	ElementMatrix* Ke=CreateKMatrixSSAFriction(basalelement);
+-	basalelement->DeleteMaterials(); delete basalelement;
+-
+-	/*clean-up and return*/
+-	return Ke;
+-}/*}}}*/
+-ElementMatrix* StressbalanceAnalysis::CreateKMatrixSSA3dViscous(Element* element){/*{{{*/
+-
+-	/*Constants*/
+-	const int    numdof2d=2*3;
+-
+-	/*Intermediaries */
+-	int         i,j,approximation;
+-	int         dim=3;
+-	IssmDouble  Jdet,viscosity,oldviscosity,newviscosity,viscosity_overshoot;
+-	IssmDouble  epsilon[5],oldepsilon[5];       /* epsilon=[exx,eyy,exy,exz,eyz];*/
+-	IssmDouble  epsilons[6];                    //6 for FS
+-	IssmDouble  B[3][numdof2d];
+-	IssmDouble  Bprime[3][numdof2d];
+-	IssmDouble  D[3][3]= {0.0};                 // material matrix, simple scalar matrix.
+-	IssmDouble  D_scalar;
+-	IssmDouble  Ke_gg[numdof2d][numdof2d]={0.0};
+-	IssmDouble  *xyz_list  = NULL;
+-
+-	/*Find penta on bed as this is a SSA elements: */
+-	Element* pentabase=element->GetBasalElement();
+-	Element* basaltria=pentabase->SpawnBasalElement();
+-
+-	/*Initialize Element matrix*/
+-	ElementMatrix* Ke=basaltria->NewElementMatrix(SSAApproximationEnum);
+-	element->GetInputValue(&approximation,ApproximationEnum);
+-
+-	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinates(&xyz_list);
+-	element->FindParam(&viscosity_overshoot,StressbalanceViscosityOvershootEnum);
+-	Input* vx_input   =element->GetInput(VxEnum);       _assert_(vx_input);
+-	Input* vy_input   =element->GetInput(VyEnum);       _assert_(vy_input);
+-	Input* vxold_input=element->GetInput(VxPicardEnum); _assert_(vxold_input);
+-	Input* vyold_input=element->GetInput(VyPicardEnum); _assert_(vyold_input);
+-	Input* vz_input   =element->GetInput(VzEnum);       _assert_(vz_input);
+-
+-	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=element->NewGauss(5);
+-	Gauss* gauss_tria=new GaussTria();
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-
+-		gauss->GaussPoint(ig);
+-		gauss->SynchronizeGaussBase(gauss_tria);
+-
+-		element->JacobianDeterminant(&Jdet, xyz_list,gauss);
+-		this->GetBSSA(&B[0][0],basaltria,2,xyz_list, gauss_tria);
+-		this->GetBSSAprime(&Bprime[0][0],basaltria,2,xyz_list, gauss_tria);
+-
+-		if(approximation==SSAHOApproximationEnum){
+-			element->ViscosityHO(&viscosity,dim,xyz_list,gauss,vx_input,vy_input);
+-			element->ViscosityHO(&oldviscosity,dim,xyz_list,gauss,vxold_input,vyold_input);
+-			newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity);
+-		}
+-		else if (approximation==SSAFSApproximationEnum){
+-			element->ViscosityFS(&newviscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input);
+-		}
+-		else _error_("approximation " << approximation << " (" << EnumToStringx(approximation) << ") not supported yet");
+-
+-		D_scalar=2*newviscosity*gauss->weight*Jdet;
+-		for (i=0;i<3;i++) D[i][i]=D_scalar;
+-
+-		TripleMultiply( &B[0][0],3,numdof2d,1,
+-					&D[0][0],3,3,0,
+-					&Bprime[0][0],3,numdof2d,0,
+-					&Ke_gg[0][0],1);
+-
+-	}
+-	for(i=0;i<numdof2d;i++) for(j=0;j<numdof2d;j++) Ke->values[i*numdof2d+j]+=Ke_gg[i][j];
+-
+-	/*Transform Coordinate System*/
+-	basaltria->TransformStiffnessMatrixCoord(Ke,XYEnum);
+-
+-	/*Clean up and return*/
+-	xDelete<IssmDouble>(xyz_list);
+-	delete basaltria->material;
+-	delete basaltria;
+-	delete gauss_tria;
+-	delete gauss;
+-	return Ke;
+-
+-}/*}}}*/
+-ElementMatrix* StressbalanceAnalysis::CreateKMatrixHOFS(Element* element){/*{{{*/
+-
+-	/*compute all stiffness matrices for this element*/
+-	ElementMatrix* Ke1=CreateKMatrixFS(element);
+-	int indices[3]={18,19,20};
+-	Ke1->StaticCondensation(3,&indices[0]);
+-	int init = element->FiniteElement();
+-	element->SetTemporaryElementType(P1Enum); // P1 needed for HO
+-	ElementMatrix* Ke2=CreateKMatrixHO(element);
+-	element->SetTemporaryElementType(init); // P1 needed for HO
+-	ElementMatrix* Ke3=CreateKMatrixCouplingHOFS(element);
+-	ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2,Ke3);
+-
+-	/*clean-up and return*/
+-	delete Ke1;
+-	delete Ke2;
+-	delete Ke3;
+-	return Ke;
+-}/*}}}*/
+-ElementMatrix* StressbalanceAnalysis::CreateKMatrixSSAHO(Element* element){/*{{{*/
+-
+-	/*compute all stiffness matrices for this element*/
+-	ElementMatrix* Ke1=CreateKMatrixSSA3d(element);
+-	ElementMatrix* Ke2=CreateKMatrixHO(element);
+-	ElementMatrix* Ke3=CreateKMatrixCouplingSSAHO(element);
+-	ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2,Ke3);
+-
+-	/*clean-up and return*/
+-	delete Ke1;
+-	delete Ke2;
+-	delete Ke3;
+-	return Ke;
+-}/*}}}*/
+-ElementMatrix* StressbalanceAnalysis::CreateKMatrixSSAFS(Element* element){/*{{{*/
+-
+-	/*compute all stiffness matrices for this element*/
+-	ElementMatrix* Ke1=CreateKMatrixFS(element);
+-	int indices[3]={18,19,20};
+-	Ke1->StaticCondensation(3,&indices[0]);
+-	int init = element->FiniteElement();
+-	element->SetTemporaryElementType(P1Enum); 
+-	ElementMatrix* Ke2=CreateKMatrixSSA3d(element);
+-	element->SetTemporaryElementType(init); 
+-	ElementMatrix* Ke3=CreateKMatrixCouplingSSAFS(element);
+-	ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2,Ke3);
+-
+-	/*clean-up and return*/
+-	delete Ke1;
+-	delete Ke2;
+-	delete Ke3;
+-	return Ke;
+-}/*}}}*/
+ ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingHOFS(Element* element){/*{{{*/
+ 
+ 	/*Constants*/
+@@ -5551,184 +5392,6 @@
+ 	delete Ke2;
+ 	return Ke;
+ }/*}}}*/
+-ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAHO(Element* element){/*{{{*/
+-
+-	/*compute all stiffness matrices for this element*/
+-	ElementMatrix* Ke1=CreateKMatrixCouplingSSAHOViscous(element);
+-	ElementMatrix* Ke2=CreateKMatrixCouplingSSAHOFriction(element);
+-	ElementMatrix* Ke=new ElementMatrix(Ke1,Ke2);
+-
+-	/*clean-up and return*/
+-	delete Ke1;
+-	delete Ke2;
+-	return Ke;
+-}/*}}}*/
+-ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAHOFriction(Element* element){/*{{{*/
+-
+-	if(element->IsFloating() || !element->IsOnBase()) return NULL;
+-
+-	/*Constants*/
+-	int numnodes    = element->GetNumberOfNodes();
+-	int numdof      = 2*numnodes;
+-	int numdoftotal = 4*numnodes;
+-
+-	/*Intermediaries */
+-	int         i,j;
+-	IssmDouble  Jdet2d,alpha2;
+-	IssmDouble *xyz_list_tria = NULL;
+-	IssmDouble* L             = xNewZeroInit<IssmDouble>(2*numdof);
+-	IssmDouble  DL[2][2]      = {{ 0,0 },{0,0}}; //for basal drag
+-	IssmDouble  DL_scalar;
+-	IssmDouble* Ke_gg         = xNewZeroInit<IssmDouble>(numdof*numdof);
+-	Node      **node_list     = xNew<Node*>(2*numnodes);
+-	int*        cs_list       = xNew<int>(2*numnodes);
+-
+-	/*Initialize Element matrix and return if necessary*/
+-	ElementMatrix* Ke1=element->NewElementMatrix(SSAApproximationEnum);
+-	ElementMatrix* Ke2=element->NewElementMatrix(HOApproximationEnum);
+-	ElementMatrix* Ke=new ElementMatrix(Ke1,Ke2);
+-	delete Ke1; delete Ke2;
+-
+-	/*Prepare node list*/
+-	for(i=0;i<numnodes;i++){
+-		node_list[i+0*numnodes] = element->GetNode(i);
+-		node_list[i+1*numnodes] = element->GetNode(i);
+-		cs_list[i+0*numnodes] = XYEnum;
+-		cs_list[i+1*numnodes] = XYEnum;
+-	}
+-
+-	/*retrieve inputs :*/
+-	element->GetVerticesCoordinatesBase(&xyz_list_tria);
+-
+-	/*build friction object, used later on: */
+-	Friction* friction=new Friction(element,2);
+-
+-	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=element->NewGaussBase(2);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-
+-		gauss->GaussPoint(ig);
+-
+-		/*Friction: */
+-		friction->GetAlpha2(&alpha2,gauss);
+-		element->JacobianDeterminantBase(&Jdet2d, xyz_list_tria,gauss);
+-		this->GetBHOFriction(L,element,3,xyz_list_tria,gauss);
+-
+-		DL_scalar=alpha2*gauss->weight*Jdet2d;
+-		for (i=0;i<2;i++) DL[i][i]=DL_scalar; 
+-
+-		/*  Do the triple producte tL*D*L: */
+-		TripleMultiply( L,2,numdof,1,
+-					&DL[0][0],2,2,0,
+-					L,2,numdof,0,
+-					Ke_gg,1);
+-	}
+-
+-	for(i=0;i<numdof;i++) for(j=0;j<numdof;j++) Ke->values[i*numdoftotal+(numdof+j)]+=Ke_gg[i*numdof+j];
+-	for(i=0;i<numdof;i++) for(j=0;j<numdof;j++) Ke->values[(i+numdof)*numdoftotal+j]+=Ke_gg[i*numdof+j];
+-
+-	/*Transform Coordinate System*/
+-	element->TransformStiffnessMatrixCoord(Ke,node_list,2*numnodes,cs_list);
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-	delete friction;
+-	xDelete<int>(cs_list);
+-	xDelete<Node*>(node_list);
+-	xDelete<IssmDouble>(xyz_list_tria);
+-	xDelete<IssmDouble>(Ke_gg);
+-	xDelete<IssmDouble>(L);
+-	return Ke;
+-}/*}}}*/
+-ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAHOViscous(Element* element){/*{{{*/
+-
+-	/*Constants*/
+-	int numnodes    = element->GetNumberOfNodes();
+-	int numdofm     = 1 *numnodes; //*2/2
+-	int numdofp     = 2 *numnodes;
+-	int numdoftotal = 2 *2 *numnodes;//2 dof per nodes and 2 sets of nodes for HO and SSA
+-
+-	/*Intermediaries */
+-	int         i,j;
+-	IssmDouble  Jdet,viscosity,oldviscosity,newviscosity,viscosity_overshoot; //viscosity
+-	IssmDouble  *xyz_list      = NULL;
+-	IssmDouble* B              = xNew<IssmDouble>(3*numdofp);
+-	IssmDouble* Bprime         = xNew<IssmDouble>(3*numdofm);
+-	IssmDouble  D[3][3]={0.0}; // material matrix, simple scalar matrix.
+-	IssmDouble  D_scalar;
+-	IssmDouble* Ke_gg          = xNewZeroInit<IssmDouble>(numdofp*numdofm);
+-	Node       **node_list     = xNew<Node*>(2*numnodes);
+-	int*         cs_list= xNew<int>(2*numnodes);
+-
+-	/*Find penta on bed as HO must be coupled to the dofs on the bed: */
+-	Element* pentabase=element->GetBasalElement();
+-	Element* basaltria=pentabase->SpawnBasalElement();
+-
+-	/*prepare node list*/
+-	for(i=0;i<numnodes;i++){
+-		node_list[i+0*numnodes] = pentabase->GetNode(i);
+-		node_list[i+1*numnodes] = element  ->GetNode(i);
+-		cs_list[i+0*numnodes] = XYEnum;
+-		cs_list[i+1*numnodes] = XYEnum;
+-	}
+-
+-	/*Initialize Element matrix*/
+-	ElementMatrix* Ke1= pentabase->NewElementMatrix(SSAApproximationEnum);
+-	ElementMatrix* Ke2= element  ->NewElementMatrix(HOApproximationEnum);
+-	ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2);
+-	delete Ke1; delete Ke2;
+-
+-	/* Get node coordinates and dof list: */
+-	element->GetVerticesCoordinates(&xyz_list);
+-	element->FindParam(&viscosity_overshoot,StressbalanceViscosityOvershootEnum);
+-	Input* vx_input   =element->GetInput(VxEnum);       _assert_(vx_input);
+-	Input* vy_input   =element->GetInput(VyEnum);       _assert_(vy_input);
+-	Input* vxold_input=element->GetInput(VxPicardEnum); _assert_(vxold_input);
+-	Input* vyold_input=element->GetInput(VyPicardEnum); _assert_(vyold_input);
+-
+-	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=element->NewGauss(5);
+-	Gauss* gauss_tria=new GaussTria();
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-
+-		gauss->GaussPoint(ig);
+-		gauss->SynchronizeGaussBase(gauss_tria);
+-
+-		element->JacobianDeterminant(&Jdet, xyz_list,gauss);
+-		this->GetBSSAHO(B, element,xyz_list, gauss);
+-		this->GetBSSAprime(Bprime,basaltria,2,xyz_list, gauss_tria); 
+-		element->ViscosityHO(&viscosity,3,xyz_list,gauss,vx_input,vy_input);
+-		element->ViscosityHO(&oldviscosity,3,xyz_list,gauss,vxold_input,vyold_input);
+-
+-		newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity);
+-		D_scalar=2*newviscosity*gauss->weight*Jdet;
+-		for (i=0;i<3;i++) D[i][i]=D_scalar;
+-
+-		TripleMultiply( B,3,numdofp,1,
+-					&D[0][0],3,3,0,
+-					Bprime,3,numdofm,0,
+-					Ke_gg,1);
+-	} 
+-	for(i=0;i<numdofp;i++) for(j=0;j<numdofm;j++) Ke->values[(i+2*numdofm)*numdoftotal+j]+=Ke_gg[i*numdofm+j];
+-	for(i=0;i<numdofm;i++) for(j=0;j<numdofp;j++) Ke->values[i*numdoftotal+(j+2*numdofm)]+=Ke_gg[j*numdofm+i];
+-
+-	/*Transform Coordinate System*/
+-	element->TransformStiffnessMatrixCoord(Ke,node_list,2*numnodes,cs_list);
+-
+-	/*Clean-up and return*/
+-	basaltria->DeleteMaterials(); delete basaltria;
+-	
+-	delete gauss;
+-	delete gauss_tria;
+-	xDelete<IssmDouble>(B);
+-	xDelete<IssmDouble>(Bprime);
+-	xDelete<IssmDouble>(Ke_gg);
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<Node*>(node_list);
+-	xDelete<int>(cs_list);
+-	return Ke;
+-
+-}/*}}}*/
+ ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAFS(Element* element){/*{{{*/
+ 
+ 	/*compute all stiffness matrices for this element*/
+@@ -5969,64 +5632,343 @@
+ 	return Ke;
+ 
+ }/*}}}*/
+-ElementVector* StressbalanceAnalysis::CreatePVectorSSAHO(Element* element){/*{{{*/
++ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAHO(Element* element){/*{{{*/
+ 
+-	/*compute all load vectors for this element*/
+-	ElementVector* pe1=CreatePVectorSSA(element);
+-	ElementVector* pe2=CreatePVectorHO(element);
+-	ElementVector* pe =new ElementVector(pe1,pe2);
++	/*compute all stiffness matrices for this element*/
++	ElementMatrix* Ke1=CreateKMatrixCouplingSSAHOViscous(element);
++	ElementMatrix* Ke2=CreateKMatrixCouplingSSAHOFriction(element);
++	ElementMatrix* Ke=new ElementMatrix(Ke1,Ke2);
+ 
+ 	/*clean-up and return*/
+-	delete pe1;
+-	delete pe2;
+-	return pe;
++	delete Ke1;
++	delete Ke2;
++	return Ke;
+ }/*}}}*/
+-ElementVector* StressbalanceAnalysis::CreatePVectorSSAFS(Element* element){/*{{{*/
++ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAHOFriction(Element* element){/*{{{*/
+ 
+-	/*compute all load vectors for this element*/
++	if(element->IsFloating() || !element->IsOnBase()) return NULL;
++
++	/*Constants*/
++	int numnodes    = element->GetNumberOfNodes();
++	int numdof      = 2*numnodes;
++	int numdoftotal = 4*numnodes;
++
++	/*Intermediaries */
++	int         i,j;
++	IssmDouble  Jdet2d,alpha2;
++	IssmDouble *xyz_list_tria = NULL;
++	IssmDouble* L             = xNewZeroInit<IssmDouble>(2*numdof);
++	IssmDouble  DL[2][2]      = {{ 0,0 },{0,0}}; //for basal drag
++	IssmDouble  DL_scalar;
++	IssmDouble* Ke_gg         = xNewZeroInit<IssmDouble>(numdof*numdof);
++	Node      **node_list     = xNew<Node*>(2*numnodes);
++	int*        cs_list       = xNew<int>(2*numnodes);
++
++	/*Initialize Element matrix and return if necessary*/
++	ElementMatrix* Ke1=element->NewElementMatrix(SSAApproximationEnum);
++	ElementMatrix* Ke2=element->NewElementMatrix(HOApproximationEnum);
++	ElementMatrix* Ke=new ElementMatrix(Ke1,Ke2);
++	delete Ke1; delete Ke2;
++
++	/*Prepare node list*/
++	for(i=0;i<numnodes;i++){
++		node_list[i+0*numnodes] = element->GetNode(i);
++		node_list[i+1*numnodes] = element->GetNode(i);
++		cs_list[i+0*numnodes] = XYEnum;
++		cs_list[i+1*numnodes] = XYEnum;
++	}
++
++	/*retrieve inputs :*/
++	element->GetVerticesCoordinatesBase(&xyz_list_tria);
++
++	/*build friction object, used later on: */
++	Friction* friction=new Friction(element,2);
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGaussBase(2);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++
++		gauss->GaussPoint(ig);
++
++		/*Friction: */
++		friction->GetAlpha2(&alpha2,gauss);
++		element->JacobianDeterminantBase(&Jdet2d, xyz_list_tria,gauss);
++		this->GetBHOFriction(L,element,3,xyz_list_tria,gauss);
++
++		DL_scalar=alpha2*gauss->weight*Jdet2d;
++		for (i=0;i<2;i++) DL[i][i]=DL_scalar; 
++
++		/*  Do the triple producte tL*D*L: */
++		TripleMultiply( L,2,numdof,1,
++					&DL[0][0],2,2,0,
++					L,2,numdof,0,
++					Ke_gg,1);
++	}
++
++	for(i=0;i<numdof;i++) for(j=0;j<numdof;j++) Ke->values[i*numdoftotal+(numdof+j)]+=Ke_gg[i*numdof+j];
++	for(i=0;i<numdof;i++) for(j=0;j<numdof;j++) Ke->values[(i+numdof)*numdoftotal+j]+=Ke_gg[i*numdof+j];
++
++	/*Transform Coordinate System*/
++	element->TransformStiffnessMatrixCoord(Ke,node_list,2*numnodes,cs_list);
++
++	/*Clean up and return*/
++	delete gauss;
++	delete friction;
++	xDelete<int>(cs_list);
++	xDelete<Node*>(node_list);
++	xDelete<IssmDouble>(xyz_list_tria);
++	xDelete<IssmDouble>(Ke_gg);
++	xDelete<IssmDouble>(L);
++	return Ke;
++}/*}}}*/
++ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAHOViscous(Element* element){/*{{{*/
++
++	/*Constants*/
++	int numnodes    = element->GetNumberOfNodes();
++	int numdofm     = 1 *numnodes; //*2/2
++	int numdofp     = 2 *numnodes;
++	int numdoftotal = 2 *2 *numnodes;//2 dof per nodes and 2 sets of nodes for HO and SSA
++
++	/*Intermediaries */
++	int         i,j;
++	IssmDouble  Jdet,viscosity,oldviscosity,newviscosity,viscosity_overshoot; //viscosity
++	IssmDouble  *xyz_list      = NULL;
++	IssmDouble* B              = xNew<IssmDouble>(3*numdofp);
++	IssmDouble* Bprime         = xNew<IssmDouble>(3*numdofm);
++	IssmDouble  D[3][3]={0.0}; // material matrix, simple scalar matrix.
++	IssmDouble  D_scalar;
++	IssmDouble* Ke_gg          = xNewZeroInit<IssmDouble>(numdofp*numdofm);
++	Node       **node_list     = xNew<Node*>(2*numnodes);
++	int*         cs_list= xNew<int>(2*numnodes);
++
++	/*Find penta on bed as HO must be coupled to the dofs on the bed: */
++	Element* pentabase=element->GetBasalElement();
++	Element* basaltria=pentabase->SpawnBasalElement();
++
++	/*prepare node list*/
++	for(i=0;i<numnodes;i++){
++		node_list[i+0*numnodes] = pentabase->GetNode(i);
++		node_list[i+1*numnodes] = element  ->GetNode(i);
++		cs_list[i+0*numnodes] = XYEnum;
++		cs_list[i+1*numnodes] = XYEnum;
++	}
++
++	/*Initialize Element matrix*/
++	ElementMatrix* Ke1= pentabase->NewElementMatrix(SSAApproximationEnum);
++	ElementMatrix* Ke2= element  ->NewElementMatrix(HOApproximationEnum);
++	ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2);
++	delete Ke1; delete Ke2;
++
++	/* Get node coordinates and dof list: */
++	element->GetVerticesCoordinates(&xyz_list);
++	element->FindParam(&viscosity_overshoot,StressbalanceViscosityOvershootEnum);
++	Input* vx_input   =element->GetInput(VxEnum);       _assert_(vx_input);
++	Input* vy_input   =element->GetInput(VyEnum);       _assert_(vy_input);
++	Input* vxold_input=element->GetInput(VxPicardEnum); _assert_(vxold_input);
++	Input* vyold_input=element->GetInput(VyPicardEnum); _assert_(vyold_input);
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGauss(5);
++	Gauss* gauss_tria=new GaussTria();
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++
++		gauss->GaussPoint(ig);
++		gauss->SynchronizeGaussBase(gauss_tria);
++
++		element->JacobianDeterminant(&Jdet, xyz_list,gauss);
++		this->GetBSSAHO(B, element,xyz_list, gauss);
++		this->GetBSSAprime(Bprime,basaltria,2,xyz_list, gauss_tria); 
++		element->ViscosityHO(&viscosity,3,xyz_list,gauss,vx_input,vy_input);
++		element->ViscosityHO(&oldviscosity,3,xyz_list,gauss,vxold_input,vyold_input);
++
++		newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity);
++		D_scalar=2*newviscosity*gauss->weight*Jdet;
++		for (i=0;i<3;i++) D[i][i]=D_scalar;
++
++		TripleMultiply( B,3,numdofp,1,
++					&D[0][0],3,3,0,
++					Bprime,3,numdofm,0,
++					Ke_gg,1);
++	} 
++	for(i=0;i<numdofp;i++) for(j=0;j<numdofm;j++) Ke->values[(i+2*numdofm)*numdoftotal+j]+=Ke_gg[i*numdofm+j];
++	for(i=0;i<numdofm;i++) for(j=0;j<numdofp;j++) Ke->values[i*numdoftotal+(j+2*numdofm)]+=Ke_gg[j*numdofm+i];
++
++	/*Transform Coordinate System*/
++	element->TransformStiffnessMatrixCoord(Ke,node_list,2*numnodes,cs_list);
++
++	/*Clean-up and return*/
++	basaltria->DeleteMaterials(); delete basaltria;
++	
++	delete gauss;
++	delete gauss_tria;
++	xDelete<IssmDouble>(B);
++	xDelete<IssmDouble>(Bprime);
++	xDelete<IssmDouble>(Ke_gg);
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<Node*>(node_list);
++	xDelete<int>(cs_list);
++	return Ke;
++
++}/*}}}*/
++ElementMatrix* StressbalanceAnalysis::CreateKMatrixHOFS(Element* element){/*{{{*/
++
++	/*compute all stiffness matrices for this element*/
++	ElementMatrix* Ke1=CreateKMatrixFS(element);
++	int indices[3]={18,19,20};
++	Ke1->StaticCondensation(3,&indices[0]);
+ 	int init = element->FiniteElement();
+ 	element->SetTemporaryElementType(P1Enum); // P1 needed for HO
+-	ElementVector* pe1=CreatePVectorSSA(element);
++	ElementMatrix* Ke2=CreateKMatrixHO(element);
+ 	element->SetTemporaryElementType(init); // P1 needed for HO
+-	ElementVector* pe2=CreatePVectorFS(element);
+-	int indices[3]={18,19,20};
+-	element->SetTemporaryElementType(MINIcondensedEnum); // P1 needed for HO
+-	ElementMatrix* Ke = CreateKMatrixFS(element);
+-	element->SetTemporaryElementType(init); // P1 needed for HO
+-	pe2->StaticCondensation(Ke,3,&indices[0]);
+-	delete Ke;
+-	ElementVector* pe3=CreatePVectorCouplingSSAFS(element);
+-	ElementVector* pe =new ElementVector(pe1,pe2,pe3);
++	ElementMatrix* Ke3=CreateKMatrixCouplingHOFS(element);
++	ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2,Ke3);
+ 
+ 	/*clean-up and return*/
+-	delete pe1;
+-	delete pe2;
+-	delete pe3;
+-	return pe;
++	delete Ke1;
++	delete Ke2;
++	delete Ke3;
++	return Ke;
+ }/*}}}*/
+-ElementVector* StressbalanceAnalysis::CreatePVectorHOFS(Element* element){/*{{{*/
++ElementMatrix* StressbalanceAnalysis::CreateKMatrixSSAFS(Element* element){/*{{{*/
+ 
+-	/*compute all load vectors for this element*/
++	/*compute all stiffness matrices for this element*/
++	ElementMatrix* Ke1=CreateKMatrixFS(element);
++	int indices[3]={18,19,20};
++	Ke1->StaticCondensation(3,&indices[0]);
+ 	int init = element->FiniteElement();
+-	element->SetTemporaryElementType(P1Enum);
+-	ElementVector* pe1=CreatePVectorHO(element);
+-	element->SetTemporaryElementType(init);
+-	ElementVector* pe2=CreatePVectorFS(element);
+-	int indices[3]={18,19,20};
+-	element->SetTemporaryElementType(MINIcondensedEnum);
+-	ElementMatrix* Ke = CreateKMatrixFS(element);
+-	element->SetTemporaryElementType(init);
+-	pe2->StaticCondensation(Ke,3,&indices[0]);
+-	delete Ke;
+-	ElementVector* pe3=CreatePVectorCouplingHOFS(element);
+-	ElementVector* pe =new ElementVector(pe1,pe2,pe3);
++	element->SetTemporaryElementType(P1Enum); 
++	ElementMatrix* Ke2=CreateKMatrixSSA3d(element);
++	element->SetTemporaryElementType(init); 
++	ElementMatrix* Ke3=CreateKMatrixCouplingSSAFS(element);
++	ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2,Ke3);
+ 
+ 	/*clean-up and return*/
+-	delete pe1;
+-	delete pe2;
+-	delete pe3;
+-	return pe;
++	delete Ke1;
++	delete Ke2;
++	delete Ke3;
++	return Ke;
+ }/*}}}*/
++ElementMatrix* StressbalanceAnalysis::CreateKMatrixSSAHO(Element* element){/*{{{*/
++
++	/*compute all stiffness matrices for this element*/
++	ElementMatrix* Ke1=CreateKMatrixSSA3d(element);
++	ElementMatrix* Ke2=CreateKMatrixHO(element);
++	ElementMatrix* Ke3=CreateKMatrixCouplingSSAHO(element);
++	ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2,Ke3);
++
++	/*clean-up and return*/
++	delete Ke1;
++	delete Ke2;
++	delete Ke3;
++	return Ke;
++}/*}}}*/
++ElementMatrix* StressbalanceAnalysis::CreateKMatrixSSA3d(Element* element){/*{{{*/
++
++	/*compute all stiffness matrices for this element*/
++	ElementMatrix* Ke1=CreateKMatrixSSA3dViscous(element);
++	ElementMatrix* Ke2=CreateKMatrixSSA3dFriction(element);
++	ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2);
++
++	/*clean-up and return*/
++	delete Ke1;
++	delete Ke2;
++	return Ke;
++}/*}}}*/
++ElementMatrix* StressbalanceAnalysis::CreateKMatrixSSA3dFriction(Element* element){/*{{{*/
++
++	/*Initialize Element matrix and return if necessary*/
++	if(element->IsFloating() || !element->IsOnBase()) return NULL;
++
++	/*Build a tria element using the 3 nodes of the base of the penta. Then use 
++	 * the tria functionality to build a friction stiffness matrix on these 3
++	 * nodes: */
++	Element* basalelement = element->SpawnBasalElement();
++	ElementMatrix* Ke=CreateKMatrixSSAFriction(basalelement);
++	basalelement->DeleteMaterials(); delete basalelement;
++
++	/*clean-up and return*/
++	return Ke;
++}/*}}}*/
++ElementMatrix* StressbalanceAnalysis::CreateKMatrixSSA3dViscous(Element* element){/*{{{*/
++
++	/*Constants*/
++	const int    numdof2d=2*3;
++
++	/*Intermediaries */
++	int         i,j,approximation;
++	int         dim=3;
++	IssmDouble  Jdet,viscosity,oldviscosity,newviscosity,viscosity_overshoot;
++	IssmDouble  epsilon[5],oldepsilon[5];       /* epsilon=[exx,eyy,exy,exz,eyz];*/
++	IssmDouble  epsilons[6];                    //6 for FS
++	IssmDouble  B[3][numdof2d];
++	IssmDouble  Bprime[3][numdof2d];
++	IssmDouble  D[3][3]= {0.0};                 // material matrix, simple scalar matrix.
++	IssmDouble  D_scalar;
++	IssmDouble  Ke_gg[numdof2d][numdof2d]={0.0};
++	IssmDouble  *xyz_list  = NULL;
++
++	/*Find penta on bed as this is a SSA elements: */
++	Element* pentabase=element->GetBasalElement();
++	Element* basaltria=pentabase->SpawnBasalElement();
++
++	/*Initialize Element matrix*/
++	ElementMatrix* Ke=basaltria->NewElementMatrix(SSAApproximationEnum);
++	element->GetInputValue(&approximation,ApproximationEnum);
++
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinates(&xyz_list);
++	element->FindParam(&viscosity_overshoot,StressbalanceViscosityOvershootEnum);
++	Input* vx_input   =element->GetInput(VxEnum);       _assert_(vx_input);
++	Input* vy_input   =element->GetInput(VyEnum);       _assert_(vy_input);
++	Input* vxold_input=element->GetInput(VxPicardEnum); _assert_(vxold_input);
++	Input* vyold_input=element->GetInput(VyPicardEnum); _assert_(vyold_input);
++	Input* vz_input   =element->GetInput(VzEnum);       _assert_(vz_input);
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGauss(5);
++	Gauss* gauss_tria=new GaussTria();
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++
++		gauss->GaussPoint(ig);
++		gauss->SynchronizeGaussBase(gauss_tria);
++
++		element->JacobianDeterminant(&Jdet, xyz_list,gauss);
++		this->GetBSSA(&B[0][0],basaltria,2,xyz_list, gauss_tria);
++		this->GetBSSAprime(&Bprime[0][0],basaltria,2,xyz_list, gauss_tria);
++
++		if(approximation==SSAHOApproximationEnum){
++			element->ViscosityHO(&viscosity,dim,xyz_list,gauss,vx_input,vy_input);
++			element->ViscosityHO(&oldviscosity,dim,xyz_list,gauss,vxold_input,vyold_input);
++			newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity);
++		}
++		else if (approximation==SSAFSApproximationEnum){
++			element->ViscosityFS(&newviscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input);
++		}
++		else _error_("approximation " << approximation << " (" << EnumToStringx(approximation) << ") not supported yet");
++
++		D_scalar=2*newviscosity*gauss->weight*Jdet;
++		for (i=0;i<3;i++) D[i][i]=D_scalar;
++
++		TripleMultiply( &B[0][0],3,numdof2d,1,
++					&D[0][0],3,3,0,
++					&Bprime[0][0],3,numdof2d,0,
++					&Ke_gg[0][0],1);
++
++	}
++	for(i=0;i<numdof2d;i++) for(j=0;j<numdof2d;j++) Ke->values[i*numdof2d+j]+=Ke_gg[i][j];
++
++	/*Transform Coordinate System*/
++	basaltria->TransformStiffnessMatrixCoord(Ke,XYEnum);
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(xyz_list);
++	delete basaltria->material;
++	delete basaltria;
++	delete gauss_tria;
++	delete gauss;
++	return Ke;
++
++}/*}}}*/
+ ElementVector* StressbalanceAnalysis::CreatePVectorCouplingHOFS(Element* element){/*{{{*/
+ 
+ 	/*compute all load vectors for this element*/
+@@ -6350,38 +6292,149 @@
+ 	delete gauss;
+ 	return pe;
+ }/*}}}*/
+-void StressbalanceAnalysis::GetBSSAHO(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+-	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 3*NDOF2. 
+-	 * For node i, Bi can be expressed in the actual coordinate system
++ElementVector* StressbalanceAnalysis::CreatePVectorHOFS(Element* element){/*{{{*/
++
++	/*compute all load vectors for this element*/
++	int init = element->FiniteElement();
++	element->SetTemporaryElementType(P1Enum);
++	ElementVector* pe1=CreatePVectorHO(element);
++	element->SetTemporaryElementType(init);
++	ElementVector* pe2=CreatePVectorFS(element);
++	int indices[3]={18,19,20};
++	element->SetTemporaryElementType(MINIcondensedEnum);
++	ElementMatrix* Ke = CreateKMatrixFS(element);
++	element->SetTemporaryElementType(init);
++	pe2->StaticCondensation(Ke,3,&indices[0]);
++	delete Ke;
++	ElementVector* pe3=CreatePVectorCouplingHOFS(element);
++	ElementVector* pe =new ElementVector(pe1,pe2,pe3);
++
++	/*clean-up and return*/
++	delete pe1;
++	delete pe2;
++	delete pe3;
++	return pe;
++}/*}}}*/
++ElementVector* StressbalanceAnalysis::CreatePVectorSSAFS(Element* element){/*{{{*/
++
++	/*compute all load vectors for this element*/
++	int init = element->FiniteElement();
++	element->SetTemporaryElementType(P1Enum); // P1 needed for HO
++	ElementVector* pe1=CreatePVectorSSA(element);
++	element->SetTemporaryElementType(init); // P1 needed for HO
++	ElementVector* pe2=CreatePVectorFS(element);
++	int indices[3]={18,19,20};
++	element->SetTemporaryElementType(MINIcondensedEnum); // P1 needed for HO
++	ElementMatrix* Ke = CreateKMatrixFS(element);
++	element->SetTemporaryElementType(init); // P1 needed for HO
++	pe2->StaticCondensation(Ke,3,&indices[0]);
++	delete Ke;
++	ElementVector* pe3=CreatePVectorCouplingSSAFS(element);
++	ElementVector* pe =new ElementVector(pe1,pe2,pe3);
++
++	/*clean-up and return*/
++	delete pe1;
++	delete pe2;
++	delete pe3;
++	return pe;
++}/*}}}*/
++ElementVector* StressbalanceAnalysis::CreatePVectorSSAHO(Element* element){/*{{{*/
++
++	/*compute all load vectors for this element*/
++	ElementVector* pe1=CreatePVectorSSA(element);
++	ElementVector* pe2=CreatePVectorHO(element);
++	ElementVector* pe =new ElementVector(pe1,pe2);
++
++	/*clean-up and return*/
++	delete pe1;
++	delete pe2;
++	return pe;
++}/*}}}*/
++void           StressbalanceAnalysis::GetBprimeSSAFS(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++	/*Compute Bprime  matrix. Bprime=[Bprime1 Bprime2 Bprime3 Bprime4 Bprime5 Bprime6] where Bprimei is of size 5*NDOF2. 
++	 * For node i, Bprimei can be expressed in the actual coordinate system
+ 	 * by: 
+-	 *       Bi=[ dh/dx          0      ]
+-	 *          [   0           dh/dy   ]
+-	 *          [ 1/2*dh/dy  1/2*dh/dx  ]
++	 *       Bprimei=[ 2*dh/dx    dh/dy   0   0 ]
++	 *               [  dh/dx    2*dh/dy  0   0 ]
++	 *               [  dh/dy     dh/dx   0   0 ]
+ 	 * where h is the interpolation function for node i.
+ 	 *
+-	 * We assume B has been allocated already, of size: 5x(NDOF2*NUMNODESP1)
++	 * We assume Bprime has been allocated already, of size: 5x(NDOF2*NUMNODESP1)
+ 	 */
+ 
++	int    i;
++	IssmDouble dbasismini[3][7];
++
++	/*Get dbasis in actual coordinate system: */
++	element->NodalFunctionsMINIDerivatives(&dbasismini[0][0],xyz_list, gauss);
++
++	/*Build Bprime: */
++	for(i=0;i<6;i++){
++		Bprime[(3*7+6)*0+3*i+0] = 2.*dbasismini[0][i];
++		Bprime[(3*7+6)*0+3*i+1] = dbasismini[1][i];
++		Bprime[(3*7+6)*0+3*i+2] = 0.;
++		Bprime[(3*7+6)*1+3*i+0] = dbasismini[0][i];
++		Bprime[(3*7+6)*1+3*i+1] = 2.*dbasismini[1][i];
++		Bprime[(3*7+6)*1+3*i+2] = 0.;
++		Bprime[(3*7+6)*2+3*i+0] = dbasismini[1][i];
++		Bprime[(3*7+6)*2+3*i+1] = dbasismini[0][i];
++		Bprime[(3*7+6)*2+3*i+2] = 0.;
++	}
++
++	for(i=0;i<1;i++){ //Add zeros for the bubble function
++		Bprime[(3*7+6)*0+3*(6+i)+0] = 0.;
++		Bprime[(3*7+6)*0+3*(6+i)+1] = 0.;
++		Bprime[(3*7+6)*0+3*(6+i)+2] = 0.;
++		Bprime[(3*7+6)*1+3*(6+i)+0] = 0.;
++		Bprime[(3*7+6)*1+3*(6+i)+1] = 0.;
++		Bprime[(3*7+6)*1+3*(6+i)+2] = 0.;
++		Bprime[(3*7+6)*2+3*(6+i)+0] = 0.;
++		Bprime[(3*7+6)*2+3*(6+i)+1] = 0.;
++		Bprime[(3*7+6)*2+3*(6+i)+2] = 0.;
++	}
++
++	for(i=0;i<6;i++){ //last column not for the bubble function
++		Bprime[(3*7+6)*0+7*3+i] = 0.;
++		Bprime[(3*7+6)*1+7*3+i] = 0.;
++		Bprime[(3*7+6)*2+7*3+i] = 0.;
++	}
++}/*}}}*/
++void           StressbalanceAnalysis::GetBprimeSSAFSTria(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++	/*Compute Bprime  matrix. Bprime=[Bprime1 Bprime2 Bprime3] where Bprimei is of size 3*NDOF2. 
++	 * For node i, Bprimei can be expressed in the actual coordinate system
++	 * by: 
++	 *       Bprimei=[  dN/dx    0   ]
++	 *               [    0    dN/dy ]
++	 *               [  dN/dy  dN/dx ]
++	 N               [  dN/dx  dN/dy ]
++	 * where N is the finiteelement function for node i.
++	 *
++	 * We assume Bprime has been allocated already, of size: 3x(NDOF2*numnodes)
++	 */
++
++	/*Fetch number of nodes for this finite element*/
+ 	int numnodes = element->GetNumberOfNodes();
+-	IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
+ 
+-	/*Get dbasis in actual coordinate system: */
++	/*Get nodal functions*/
++	IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);
+ 	element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+ 
+-	/*Build B: */
++	/*Build Bprime: */
+ 	for(int i=0;i<numnodes;i++){
+-		B[2*numnodes*0+2*i+0] = dbasis[0*numnodes+i];
+-		B[2*numnodes*0+2*i+1] = 0.;
+-		B[2*numnodes*1+2*i+0] = 0.;
+-		B[2*numnodes*1+2*i+1] = dbasis[1*numnodes+i];
+-		B[2*numnodes*2+2*i+0] = .5*dbasis[1*numnodes+i];
+-		B[2*numnodes*2+2*i+1] = .5*dbasis[0*numnodes+i];
++		Bprime[2*numnodes*0+2*i+0] = dbasis[0*numnodes+i];
++		Bprime[2*numnodes*0+2*i+1] = 0.;
++		Bprime[2*numnodes*1+2*i+0] = 0.;
++		Bprime[2*numnodes*1+2*i+1] = dbasis[1*numnodes+i];
++		Bprime[2*numnodes*2+2*i+0] = dbasis[1*numnodes+i];
++		Bprime[2*numnodes*2+2*i+1] = dbasis[0*numnodes+i];
++		Bprime[2*numnodes*3+2*i+0] = dbasis[0*numnodes+i];
++		Bprime[2*numnodes*3+2*i+1] = dbasis[1*numnodes+i];
+ 	}
+ 
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(dbasis);
+ }/*}}}*/
+-void StressbalanceAnalysis::GetBSSAFS(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           StressbalanceAnalysis::GetBSSAFS(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF2. 
+ 	 * For node i, Bi can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -6439,56 +6492,7 @@
+ 		B[(3*7+6)*3+7*3+i] = basis[i];
+ 	}
+ }/*}}}*/
+-void StressbalanceAnalysis::GetBprimeSSAFS(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+-	/*Compute Bprime  matrix. Bprime=[Bprime1 Bprime2 Bprime3 Bprime4 Bprime5 Bprime6] where Bprimei is of size 5*NDOF2. 
+-	 * For node i, Bprimei can be expressed in the actual coordinate system
+-	 * by: 
+-	 *       Bprimei=[ 2*dh/dx    dh/dy   0   0 ]
+-	 *               [  dh/dx    2*dh/dy  0   0 ]
+-	 *               [  dh/dy     dh/dx   0   0 ]
+-	 * where h is the interpolation function for node i.
+-	 *
+-	 * We assume Bprime has been allocated already, of size: 5x(NDOF2*NUMNODESP1)
+-	 */
+-
+-	int    i;
+-	IssmDouble dbasismini[3][7];
+-
+-	/*Get dbasis in actual coordinate system: */
+-	element->NodalFunctionsMINIDerivatives(&dbasismini[0][0],xyz_list, gauss);
+-
+-	/*Build Bprime: */
+-	for(i=0;i<6;i++){
+-		Bprime[(3*7+6)*0+3*i+0] = 2.*dbasismini[0][i];
+-		Bprime[(3*7+6)*0+3*i+1] = dbasismini[1][i];
+-		Bprime[(3*7+6)*0+3*i+2] = 0.;
+-		Bprime[(3*7+6)*1+3*i+0] = dbasismini[0][i];
+-		Bprime[(3*7+6)*1+3*i+1] = 2.*dbasismini[1][i];
+-		Bprime[(3*7+6)*1+3*i+2] = 0.;
+-		Bprime[(3*7+6)*2+3*i+0] = dbasismini[1][i];
+-		Bprime[(3*7+6)*2+3*i+1] = dbasismini[0][i];
+-		Bprime[(3*7+6)*2+3*i+2] = 0.;
+-	}
+-
+-	for(i=0;i<1;i++){ //Add zeros for the bubble function
+-		Bprime[(3*7+6)*0+3*(6+i)+0] = 0.;
+-		Bprime[(3*7+6)*0+3*(6+i)+1] = 0.;
+-		Bprime[(3*7+6)*0+3*(6+i)+2] = 0.;
+-		Bprime[(3*7+6)*1+3*(6+i)+0] = 0.;
+-		Bprime[(3*7+6)*1+3*(6+i)+1] = 0.;
+-		Bprime[(3*7+6)*1+3*(6+i)+2] = 0.;
+-		Bprime[(3*7+6)*2+3*(6+i)+0] = 0.;
+-		Bprime[(3*7+6)*2+3*(6+i)+1] = 0.;
+-		Bprime[(3*7+6)*2+3*(6+i)+2] = 0.;
+-	}
+-
+-	for(i=0;i<6;i++){ //last column not for the bubble function
+-		Bprime[(3*7+6)*0+7*3+i] = 0.;
+-		Bprime[(3*7+6)*1+7*3+i] = 0.;
+-		Bprime[(3*7+6)*2+7*3+i] = 0.;
+-	}
+-}/*}}}*/
+-void StressbalanceAnalysis::GetBSSAFSTria(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           StressbalanceAnalysis::GetBSSAFSTria(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
+ 	 * For node i, Bi can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -6520,57 +6524,47 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(dbasis);
+ }/*}}}*/
+-void StressbalanceAnalysis::GetBprimeSSAFSTria(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+-	/*Compute Bprime  matrix. Bprime=[Bprime1 Bprime2 Bprime3] where Bprimei is of size 3*NDOF2. 
+-	 * For node i, Bprimei can be expressed in the actual coordinate system
++void           StressbalanceAnalysis::GetBSSAHO(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 3*NDOF2. 
++	 * For node i, Bi can be expressed in the actual coordinate system
+ 	 * by: 
+-	 *       Bprimei=[  dN/dx    0   ]
+-	 *               [    0    dN/dy ]
+-	 *               [  dN/dy  dN/dx ]
+-	 N               [  dN/dx  dN/dy ]
+-	 * where N is the finiteelement function for node i.
++	 *       Bi=[ dh/dx          0      ]
++	 *          [   0           dh/dy   ]
++	 *          [ 1/2*dh/dy  1/2*dh/dx  ]
++	 * where h is the interpolation function for node i.
+ 	 *
+-	 * We assume Bprime has been allocated already, of size: 3x(NDOF2*numnodes)
++	 * We assume B has been allocated already, of size: 5x(NDOF2*NUMNODESP1)
+ 	 */
+ 
+-	/*Fetch number of nodes for this finite element*/
+ 	int numnodes = element->GetNumberOfNodes();
++	IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
+ 
+-	/*Get nodal functions*/
+-	IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);
++	/*Get dbasis in actual coordinate system: */
+ 	element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+ 
+-	/*Build Bprime: */
++	/*Build B: */
+ 	for(int i=0;i<numnodes;i++){
+-		Bprime[2*numnodes*0+2*i+0] = dbasis[0*numnodes+i];
+-		Bprime[2*numnodes*0+2*i+1] = 0.;
+-		Bprime[2*numnodes*1+2*i+0] = 0.;
+-		Bprime[2*numnodes*1+2*i+1] = dbasis[1*numnodes+i];
+-		Bprime[2*numnodes*2+2*i+0] = dbasis[1*numnodes+i];
+-		Bprime[2*numnodes*2+2*i+1] = dbasis[0*numnodes+i];
+-		Bprime[2*numnodes*3+2*i+0] = dbasis[0*numnodes+i];
+-		Bprime[2*numnodes*3+2*i+1] = dbasis[1*numnodes+i];
++		B[2*numnodes*0+2*i+0] = dbasis[0*numnodes+i];
++		B[2*numnodes*0+2*i+1] = 0.;
++		B[2*numnodes*1+2*i+0] = 0.;
++		B[2*numnodes*1+2*i+1] = dbasis[1*numnodes+i];
++		B[2*numnodes*2+2*i+0] = .5*dbasis[1*numnodes+i];
++		B[2*numnodes*2+2*i+1] = .5*dbasis[0*numnodes+i];
+ 	}
+ 
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(dbasis);
+ }/*}}}*/
+-void StressbalanceAnalysis::GetLSSAFS(IssmDouble* LFS,Element* element,Gauss* gauss_in){/*{{{*/
+-	/*
+-	 * Compute L  matrix. L=[L1 L2 L3] where Li is square and of size numdof. 
+-	 * For node i, Li can be expressed in the actual coordinate system
++void           StressbalanceAnalysis::GetLprimeFSSSA(IssmDouble* LprimeFS,Element* element,IssmDouble* xyz_list,Gauss* gauss_in){/*{{{*/
++	/* Compute Lprime  matrix. Lprime=[Lp1 Lp2 Lp3] where Lpi is square and of size numdof. 
++	 * For node i, Lpi can be expressed in the actual coordinate system
+ 	 * by: 
+-	 *       Li=[ h    0 ]
+-	 *	 	      [ 0    h ]
+-	 *	 	      [ h    0 ]
+-	 *	 	      [ 0    h ]
+-	 *	 	      [ h    0 ]
+-	 *	 	      [ 0    h ]
+-	 *	 	      [ h    0 ]
+-	 *	 	      [ 0    h ]
++	 *       Lpi=[ h    0 ]
++	 *		       [ 0    h ]
++	 *		       [ h    0 ]
++	 *		       [ 0    h ]
+ 	 * where h is the interpolation function for node i.
+ 	 */
+-
+ 	int num_dof=2;
+ 	IssmDouble basis[3];
+ 
+@@ -6583,27 +6577,19 @@
+ 	basis[1]=gauss->coord2*(1-gauss->coord4)/2.0;
+ 	basis[2]=gauss->coord3*(1-gauss->coord4)/2.0;
+ 
+-	/*Build LFS: */
++	/*Build LprimeFS: */
+ 	for(int i=0;i<3;i++){
+-		LFS[num_dof*3*0+num_dof*i+0] = basis[i];
+-		LFS[num_dof*3*0+num_dof*i+1] = 0;
+-		LFS[num_dof*3*1+num_dof*i+0] = 0;
+-		LFS[num_dof*3*1+num_dof*i+1] = basis[i];
+-		LFS[num_dof*3*2+num_dof*i+0] = basis[i];
+-		LFS[num_dof*3*2+num_dof*i+1] = 0;
+-		LFS[num_dof*3*3+num_dof*i+0] = 0;
+-		LFS[num_dof*3*3+num_dof*i+1] = basis[i];
+-		LFS[num_dof*3*4+num_dof*i+0] = basis[i];
+-		LFS[num_dof*3*4+num_dof*i+1] = 0;
+-		LFS[num_dof*3*5+num_dof*i+0] = 0;
+-		LFS[num_dof*3*5+num_dof*i+1] = basis[i];
+-		LFS[num_dof*3*6+num_dof*i+0] = basis[i];
+-		LFS[num_dof*3*6+num_dof*i+1] = 0;
+-		LFS[num_dof*3*7+num_dof*i+0] = 0;
+-		LFS[num_dof*3*7+num_dof*i+1] = basis[i];
++		LprimeFS[num_dof*3*0+num_dof*i+0] = basis[i];
++		LprimeFS[num_dof*3*0+num_dof*i+1] = 0.;
++		LprimeFS[num_dof*3*1+num_dof*i+0] = 0.;
++		LprimeFS[num_dof*3*1+num_dof*i+1] = basis[i];
++		LprimeFS[num_dof*3*2+num_dof*i+0] = basis[i];
++		LprimeFS[num_dof*3*2+num_dof*i+1] = 0.;
++		LprimeFS[num_dof*3*3+num_dof*i+0] = 0.;
++		LprimeFS[num_dof*3*3+num_dof*i+1] = basis[i];
+ 	}
+ }/*}}}*/
+-void StressbalanceAnalysis::GetLprimeSSAFS(IssmDouble* LprimeFS,Element* element,IssmDouble* xyz_list,Gauss* gauss_in){/*{{{*/
++void           StressbalanceAnalysis::GetLprimeSSAFS(IssmDouble* LprimeFS,Element* element,IssmDouble* xyz_list,Gauss* gauss_in){/*{{{*/
+ 	/* Compute Lprime  matrix. Lprime=[Lp1 Lp2 Lp3] where Lpi is square and of size numdof. 
+ 	 * For node i, Lpi can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -6708,7 +6694,7 @@
+ 		LprimeFS[num_dof_total*7+num_dof_vel+i] = 0.;
+ 	}
+ }/*}}}*/
+-void StressbalanceAnalysis::GetLFSSSA(IssmDouble* LFS,Element* element,Gauss* gauss_in){/*{{{*/
++void           StressbalanceAnalysis::GetLFSSSA(IssmDouble* LFS,Element* element,Gauss* gauss_in){/*{{{*/
+ 	/* Compute L  matrix. L=[L1 L2 L3] where Li is square and of size numdof. 
+ 	 * For node i, Li can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -6747,16 +6733,22 @@
+ 		LFS[num_dof*3*3+num_dof*i+2] = basis[i];
+ 	}
+ }/*}}}*/
+-void StressbalanceAnalysis::GetLprimeFSSSA(IssmDouble* LprimeFS,Element* element,IssmDouble* xyz_list,Gauss* gauss_in){/*{{{*/
+-	/* Compute Lprime  matrix. Lprime=[Lp1 Lp2 Lp3] where Lpi is square and of size numdof. 
+-	 * For node i, Lpi can be expressed in the actual coordinate system
++void           StressbalanceAnalysis::GetLSSAFS(IssmDouble* LFS,Element* element,Gauss* gauss_in){/*{{{*/
++	/*
++	 * Compute L  matrix. L=[L1 L2 L3] where Li is square and of size numdof. 
++	 * For node i, Li can be expressed in the actual coordinate system
+ 	 * by: 
+-	 *       Lpi=[ h    0 ]
+-	 *		       [ 0    h ]
+-	 *		       [ h    0 ]
+-	 *		       [ 0    h ]
++	 *       Li=[ h    0 ]
++	 *	 	      [ 0    h ]
++	 *	 	      [ h    0 ]
++	 *	 	      [ 0    h ]
++	 *	 	      [ h    0 ]
++	 *	 	      [ 0    h ]
++	 *	 	      [ h    0 ]
++	 *	 	      [ 0    h ]
+ 	 * where h is the interpolation function for node i.
+ 	 */
++
+ 	int num_dof=2;
+ 	IssmDouble basis[3];
+ 
+@@ -6769,19 +6761,27 @@
+ 	basis[1]=gauss->coord2*(1-gauss->coord4)/2.0;
+ 	basis[2]=gauss->coord3*(1-gauss->coord4)/2.0;
+ 
+-	/*Build LprimeFS: */
++	/*Build LFS: */
+ 	for(int i=0;i<3;i++){
+-		LprimeFS[num_dof*3*0+num_dof*i+0] = basis[i];
+-		LprimeFS[num_dof*3*0+num_dof*i+1] = 0.;
+-		LprimeFS[num_dof*3*1+num_dof*i+0] = 0.;
+-		LprimeFS[num_dof*3*1+num_dof*i+1] = basis[i];
+-		LprimeFS[num_dof*3*2+num_dof*i+0] = basis[i];
+-		LprimeFS[num_dof*3*2+num_dof*i+1] = 0.;
+-		LprimeFS[num_dof*3*3+num_dof*i+0] = 0.;
+-		LprimeFS[num_dof*3*3+num_dof*i+1] = basis[i];
++		LFS[num_dof*3*0+num_dof*i+0] = basis[i];
++		LFS[num_dof*3*0+num_dof*i+1] = 0;
++		LFS[num_dof*3*1+num_dof*i+0] = 0;
++		LFS[num_dof*3*1+num_dof*i+1] = basis[i];
++		LFS[num_dof*3*2+num_dof*i+0] = basis[i];
++		LFS[num_dof*3*2+num_dof*i+1] = 0;
++		LFS[num_dof*3*3+num_dof*i+0] = 0;
++		LFS[num_dof*3*3+num_dof*i+1] = basis[i];
++		LFS[num_dof*3*4+num_dof*i+0] = basis[i];
++		LFS[num_dof*3*4+num_dof*i+1] = 0;
++		LFS[num_dof*3*5+num_dof*i+0] = 0;
++		LFS[num_dof*3*5+num_dof*i+1] = basis[i];
++		LFS[num_dof*3*6+num_dof*i+0] = basis[i];
++		LFS[num_dof*3*6+num_dof*i+1] = 0;
++		LFS[num_dof*3*7+num_dof*i+0] = 0;
++		LFS[num_dof*3*7+num_dof*i+1] = basis[i];
+ 	}
+ }/*}}}*/
+-void StressbalanceAnalysis::InputUpdateFromSolutionHOFS(IssmDouble* solution,Element* element){/*{{{*/
++void           StressbalanceAnalysis::InputUpdateFromSolutionHOFS(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	int         i;
+ 	IssmDouble  rho_ice,g,FSreconditioning;
+@@ -6878,7 +6878,7 @@
+ 	xDelete<int>(doflistHO);
+ 	xDelete<int>(cs_list);
+ }/*}}}*/
+-void StressbalanceAnalysis::InputUpdateFromSolutionSSAFS(IssmDouble* solution,Element* element){/*{{{*/
++void           StressbalanceAnalysis::InputUpdateFromSolutionSSAFS(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	int         i;
+ 	IssmDouble  rho_ice,g,FSreconditioning;
+@@ -6984,7 +6984,7 @@
+ 	xDelete<int>(doflistSSA);
+ 	xDelete<int>(cs_list);
+ }/*}}}*/
+-void StressbalanceAnalysis::InputUpdateFromSolutionSSAHO(IssmDouble* solution,Element* element){/*{{{*/
++void           StressbalanceAnalysis::InputUpdateFromSolutionSSAHO(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	int         i,domaintype;
+ 	IssmDouble  rho_ice,g;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18928-18929.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18928-18929.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18928-18929.diff	(revision 19102)
@@ -0,0 +1,1182 @@
+Index: ../trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.h	(revision 18928)
++++ ../trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.h	(revision 18929)
+@@ -12,26 +12,26 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+ 		ElementVector* CreateDVector(Element* element);
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
++		ElementMatrix* CreateKMatrixBed(Element* element);
++		ElementMatrix* CreateKMatrixSurface(Element* element);
+ 		ElementMatrix* CreateKMatrixVolume(Element* element);
+-		ElementMatrix* CreateKMatrixSurface(Element* element);
+-		ElementMatrix* CreateKMatrixBed(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/GiaAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/GiaAnalysis.h	(revision 18928)
++++ ../trunk-jpl/src/c/analyses/GiaAnalysis.h	(revision 18929)
+@@ -12,12 +12,12 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+@@ -25,9 +25,9 @@
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.h	(revision 18928)
++++ ../trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.h	(revision 18929)
+@@ -12,26 +12,26 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+ 		ElementVector* CreateDVector(Element* element);
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
++		ElementMatrix* CreateKMatrixBed(Element* element);
++		ElementMatrix* CreateKMatrixSurface(Element* element);
+ 		ElementMatrix* CreateKMatrixVolume(Element* element);
+-		ElementMatrix* CreateKMatrixSurface(Element* element);
+-		ElementMatrix* CreateKMatrixBed(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.cpp	(revision 18928)
++++ ../trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.cpp	(revision 18929)
+@@ -5,11 +5,18 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
++void ExtrudeFromBaseAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++}/*}}}*/
++void ExtrudeFromBaseAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++}/*}}}*/
++void ExtrudeFromBaseAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++
++	::CreateNodes(nodes,iomodel,ExtrudeFromBaseAnalysisEnum,P1Enum);
++
++}/*}}}*/
+ int  ExtrudeFromBaseAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+ 	return 1;
+ }/*}}}*/
+-void ExtrudeFromBaseAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-}/*}}}*/
+ void ExtrudeFromBaseAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	int counter=0;
+@@ -25,15 +32,8 @@
+ 		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
+ 	}
+ }/*}}}*/
+-void ExtrudeFromBaseAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-
+-	::CreateNodes(nodes,iomodel,ExtrudeFromBaseAnalysisEnum,P1Enum);
+-
++void ExtrudeFromBaseAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ }/*}}}*/
+-void ExtrudeFromBaseAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+-}/*}}}*/
+-void ExtrudeFromBaseAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+-}/*}}}*/
+ 
+ /*Finite Element Analysis*/
+ void           ExtrudeFromBaseAnalysis::Core(FemModel* femmodel){/*{{{*/
+@@ -60,47 +60,47 @@
+ 	delete Ke3;
+ 	return Ke;
+ }/*}}}*/
+-ElementMatrix* ExtrudeFromBaseAnalysis::CreateKMatrixVolume(Element* element){/*{{{*/
++ElementMatrix* ExtrudeFromBaseAnalysis::CreateKMatrixBed(Element* element){/*{{{*/
+ 
++	if(!element->IsOnBase()) return NULL;
++
+ 	/*Intermediaries */
+-	IssmDouble  Jdet,D;
+-	IssmDouble *xyz_list = NULL;
++	int         dim;
++	IssmDouble  Jdet,D,normal[3];
++	IssmDouble *xyz_list_base = NULL;
+ 
+ 	/*Get dimension*/
+-	int dim;
+ 	element->FindParam(&dim,DomainDimensionEnum);
+ 
+ 	/*Fetch number of nodes and dof for this finite element*/
+ 	int numnodes = element->GetNumberOfNodes();
+ 
+ 	/*Initialize Element vector and other vectors*/
+-	ElementMatrix* Ke     = element->NewElementMatrix();
+-	IssmDouble*    B      = xNew<IssmDouble>(numnodes);
+-	IssmDouble*    Bprime = xNew<IssmDouble>(numnodes);
++	ElementMatrix* Ke    = element->NewElementMatrix();
++	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
+ 
+ 	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinates(&xyz_list);
++	element->GetVerticesCoordinatesBase(&xyz_list_base);
++	element->NormalBase(&normal[0],xyz_list_base);
+ 
+ 	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=element->NewGauss(2);
++	Gauss* gauss=element->NewGaussBase(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 		gauss->GaussPoint(ig);
+ 
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		element->NodalFunctions(Bprime,gauss);
+-		GetB(B,element,dim,xyz_list,gauss);
+-		D=gauss->weight*Jdet;
++		element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
++		element->NodalFunctions(basis,gauss);
++		D = - gauss->weight*Jdet*normal[dim-1]; 
+ 
+-		TripleMultiply(B,1,numnodes,1,
++		TripleMultiply(basis,1,numnodes,1,
+ 					&D,1,1,0,
+-					Bprime,1,numnodes,0,
++					basis,1,numnodes,0,
+ 					&Ke->values[0],1);
+-	} 
++	}
+ 
+ 	/*Clean up and return*/
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(B);
+-	xDelete<IssmDouble>(Bprime);
++	xDelete<IssmDouble>(xyz_list_base);
++	xDelete<IssmDouble>(basis);
+ 	delete gauss;
+ 	return Ke;
+ }
+@@ -150,47 +150,47 @@
+ 	return Ke;
+ }
+ /*}}}*/
+-ElementMatrix* ExtrudeFromBaseAnalysis::CreateKMatrixBed(Element* element){/*{{{*/
++ElementMatrix* ExtrudeFromBaseAnalysis::CreateKMatrixVolume(Element* element){/*{{{*/
+ 
+-	if(!element->IsOnBase()) return NULL;
+-
+ 	/*Intermediaries */
+-	int         dim;
+-	IssmDouble  Jdet,D,normal[3];
+-	IssmDouble *xyz_list_base = NULL;
++	IssmDouble  Jdet,D;
++	IssmDouble *xyz_list = NULL;
+ 
+ 	/*Get dimension*/
++	int dim;
+ 	element->FindParam(&dim,DomainDimensionEnum);
+ 
+ 	/*Fetch number of nodes and dof for this finite element*/
+ 	int numnodes = element->GetNumberOfNodes();
+ 
+ 	/*Initialize Element vector and other vectors*/
+-	ElementMatrix* Ke    = element->NewElementMatrix();
+-	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
++	ElementMatrix* Ke     = element->NewElementMatrix();
++	IssmDouble*    B      = xNew<IssmDouble>(numnodes);
++	IssmDouble*    Bprime = xNew<IssmDouble>(numnodes);
+ 
+ 	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinatesBase(&xyz_list_base);
+-	element->NormalBase(&normal[0],xyz_list_base);
++	element->GetVerticesCoordinates(&xyz_list);
+ 
+ 	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=element->NewGaussBase(2);
++	Gauss* gauss=element->NewGauss(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 		gauss->GaussPoint(ig);
+ 
+-		element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
+-		element->NodalFunctions(basis,gauss);
+-		D = - gauss->weight*Jdet*normal[dim-1]; 
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		element->NodalFunctions(Bprime,gauss);
++		GetB(B,element,dim,xyz_list,gauss);
++		D=gauss->weight*Jdet;
+ 
+-		TripleMultiply(basis,1,numnodes,1,
++		TripleMultiply(B,1,numnodes,1,
+ 					&D,1,1,0,
+-					basis,1,numnodes,0,
++					Bprime,1,numnodes,0,
+ 					&Ke->values[0],1);
+-	}
++	} 
+ 
+ 	/*Clean up and return*/
+-	xDelete<IssmDouble>(xyz_list_base);
+-	xDelete<IssmDouble>(basis);
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(B);
++	xDelete<IssmDouble>(Bprime);
+ 	delete gauss;
+ 	return Ke;
+ }
+@@ -198,7 +198,7 @@
+ ElementVector* ExtrudeFromBaseAnalysis::CreatePVector(Element* element){/*{{{*/
+ 	return NULL;
+ }/*}}}*/
+-void ExtrudeFromBaseAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           ExtrudeFromBaseAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*	Compute B  matrix. B=[dh1/dz dh2/dz dh3/dz dh4/dz dh5/dz dh6/dz];
+ 		where hi is the interpolation function for node i.*/
+ 
+@@ -218,19 +218,19 @@
+ 	xDelete<IssmDouble>(dbasis);
+ }
+ /*}}}*/
+-void ExtrudeFromBaseAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           ExtrudeFromBaseAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void ExtrudeFromBaseAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           ExtrudeFromBaseAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void ExtrudeFromBaseAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           ExtrudeFromBaseAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	int inputenum;
+ 	element->FindParam(&inputenum,InputToExtrudeEnum);
+ 	element->InputUpdateFromSolutionOneDof(solution,inputenum);
+ }/*}}}*/
+-void ExtrudeFromBaseAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           ExtrudeFromBaseAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/DepthAverageAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/DepthAverageAnalysis.h	(revision 18928)
++++ ../trunk-jpl/src/c/analyses/DepthAverageAnalysis.h	(revision 18929)
+@@ -12,12 +12,12 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+@@ -25,10 +25,10 @@
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.h	(revision 18928)
++++ ../trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.h	(revision 18929)
+@@ -12,12 +12,12 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+@@ -25,11 +25,11 @@
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.cpp	(revision 18928)
++++ ../trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.cpp	(revision 18929)
+@@ -5,11 +5,18 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
++void ExtrudeFromTopAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++}/*}}}*/
++void ExtrudeFromTopAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++}/*}}}*/
++void ExtrudeFromTopAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++
++	::CreateNodes(nodes,iomodel,ExtrudeFromTopAnalysisEnum,P1Enum);
++
++}/*}}}*/
+ int  ExtrudeFromTopAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+ 	return 1;
+ }/*}}}*/
+-void ExtrudeFromTopAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-}/*}}}*/
+ void ExtrudeFromTopAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	int counter=0;
+@@ -25,15 +32,8 @@
+ 		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
+ 	}
+ }/*}}}*/
+-void ExtrudeFromTopAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-
+-	::CreateNodes(nodes,iomodel,ExtrudeFromTopAnalysisEnum,P1Enum);
+-
++void ExtrudeFromTopAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ }/*}}}*/
+-void ExtrudeFromTopAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+-}/*}}}*/
+-void ExtrudeFromTopAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+-}/*}}}*/
+ 
+ /*Finite Element Analysis*/
+ void           ExtrudeFromTopAnalysis::Core(FemModel* femmodel){/*{{{*/
+@@ -198,7 +198,7 @@
+ ElementVector* ExtrudeFromTopAnalysis::CreatePVector(Element* element){/*{{{*/
+ 	return NULL;
+ }/*}}}*/
+-void ExtrudeFromTopAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           ExtrudeFromTopAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*	Compute B  matrix. B=[dh1/dz dh2/dz dh3/dz dh4/dz dh5/dz dh6/dz];
+ 		where hi is the interpolation function for node i.*/
+ 
+@@ -218,19 +218,19 @@
+ 	xDelete<IssmDouble>(dbasis);
+ }
+ /*}}}*/
+-void ExtrudeFromTopAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           ExtrudeFromTopAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void ExtrudeFromTopAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           ExtrudeFromTopAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void ExtrudeFromTopAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           ExtrudeFromTopAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	int inputenum;
+ 	element->FindParam(&inputenum,InputToExtrudeEnum);
+ 	element->InputUpdateFromSolutionOneDof(solution,inputenum);
+ }/*}}}*/
+-void ExtrudeFromTopAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           ExtrudeFromTopAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/DepthAverageAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/DepthAverageAnalysis.cpp	(revision 18928)
++++ ../trunk-jpl/src/c/analyses/DepthAverageAnalysis.cpp	(revision 18929)
+@@ -5,11 +5,18 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
++void DepthAverageAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++}/*}}}*/
++void DepthAverageAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++}/*}}}*/
++void DepthAverageAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++
++	::CreateNodes(nodes,iomodel,DepthAverageAnalysisEnum,P1Enum);
++
++}/*}}}*/
+ int  DepthAverageAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+ 	return 1;
+ }/*}}}*/
+-void DepthAverageAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-}/*}}}*/
+ void DepthAverageAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	int counter=0;
+@@ -25,15 +32,8 @@
+ 		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
+ 	}
+ }/*}}}*/
+-void DepthAverageAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-
+-	::CreateNodes(nodes,iomodel,DepthAverageAnalysisEnum,P1Enum);
+-
++void DepthAverageAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ }/*}}}*/
+-void DepthAverageAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+-}/*}}}*/
+-void DepthAverageAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+-}/*}}}*/
+ 
+ /*Finite Element Analysis*/
+ void           DepthAverageAnalysis::Core(FemModel* femmodel){/*{{{*/
+@@ -136,7 +136,7 @@
+ 	delete gauss;
+ 	return pe;
+ }/*}}}*/
+-void DepthAverageAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           DepthAverageAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*	Compute B  matrix. B=[dh1/dz dh2/dz dh3/dz dh4/dz dh5/dz dh6/dz];
+ 		where hi is the interpolation function for node i.*/
+ 
+@@ -156,19 +156,19 @@
+ 	xDelete<IssmDouble>(dbasis);
+ }
+ /*}}}*/
+-void DepthAverageAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           DepthAverageAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void DepthAverageAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           DepthAverageAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void DepthAverageAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           DepthAverageAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	int inputenum;
+ 	element->FindParam(&inputenum,InputToDepthaverageEnum);
+ 	element->InputUpdateFromSolutionOneDof(solution,inputenum);
+ }/*}}}*/
+-void DepthAverageAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           DepthAverageAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.cpp	(revision 18928)
++++ ../trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.cpp	(revision 18929)
+@@ -5,11 +5,58 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
++void FreeSurfaceTopAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++}/*}}}*/
++void FreeSurfaceTopAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++
++	/*Intermediaries*/
++	int penpair_ids[2];
++	int count=0;
++	int numvertex_pairing;
++
++	/*Create Penpair for vertex_pairing: */
++	IssmDouble *vertex_pairing=NULL;
++	IssmDouble *nodeonsurface=NULL;
++	iomodel->FetchData(&vertex_pairing,&numvertex_pairing,NULL,MasstransportVertexPairingEnum);
++	if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(&nodeonsurface,NULL,NULL,MeshVertexonsurfaceEnum);
++	for(int i=0;i<numvertex_pairing;i++){
++
++		if(iomodel->my_vertices[reCast<int>(vertex_pairing[2*i+0])-1]){
++
++			/*In debugging mode, check that the second node is in the same cpu*/
++			_assert_(iomodel->my_vertices[reCast<int>(vertex_pairing[2*i+1])-1]);
++
++			/*Skip if one of the two is not on the bed*/
++			if(iomodel->domaintype!=Domain2DhorizontalEnum){
++				if(!(reCast<bool>(nodeonsurface[reCast<int>(vertex_pairing[2*i+0])-1])) || !(reCast<bool>(nodeonsurface[reCast<int>(vertex_pairing[2*i+1])-1]))) continue;
++			}
++
++			/*Get node ids*/
++			penpair_ids[0]=iomodel->nodecounter+reCast<int>(vertex_pairing[2*i+0]);
++			penpair_ids[1]=iomodel->nodecounter+reCast<int>(vertex_pairing[2*i+1]);
++
++			/*Create Load*/
++			loads->AddObject(new Penpair(
++							iomodel->loadcounter+count+1,
++							&penpair_ids[0],
++							FreeSurfaceTopAnalysisEnum));
++			count++;
++		}
++	}
++
++	/*free ressources: */
++	iomodel->DeleteData(vertex_pairing,MasstransportVertexPairingEnum);
++	iomodel->DeleteData(nodeonsurface,MeshVertexonsurfaceEnum);
++}/*}}}*/
++void FreeSurfaceTopAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++
++	if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++	::CreateNodes(nodes,iomodel,FreeSurfaceTopAnalysisEnum,P1Enum);
++	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++}/*}}}*/
+ int  FreeSurfaceTopAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+ 	return 1;
+ }/*}}}*/
+-void FreeSurfaceTopAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-}/*}}}*/
+ void FreeSurfaceTopAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	/*Now, is the model 3d? otherwise, do nothing: */
+@@ -50,56 +97,9 @@
+ 			;
+ 	}
+ }/*}}}*/
+-void FreeSurfaceTopAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-
+-	if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-	::CreateNodes(nodes,iomodel,FreeSurfaceTopAnalysisEnum,P1Enum);
+-	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++void FreeSurfaceTopAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ }/*}}}*/
+-void FreeSurfaceTopAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+-}/*}}}*/
+-void FreeSurfaceTopAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+ 
+-	/*Intermediaries*/
+-	int penpair_ids[2];
+-	int count=0;
+-	int numvertex_pairing;
+-
+-	/*Create Penpair for vertex_pairing: */
+-	IssmDouble *vertex_pairing=NULL;
+-	IssmDouble *nodeonsurface=NULL;
+-	iomodel->FetchData(&vertex_pairing,&numvertex_pairing,NULL,MasstransportVertexPairingEnum);
+-	if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(&nodeonsurface,NULL,NULL,MeshVertexonsurfaceEnum);
+-	for(int i=0;i<numvertex_pairing;i++){
+-
+-		if(iomodel->my_vertices[reCast<int>(vertex_pairing[2*i+0])-1]){
+-
+-			/*In debugging mode, check that the second node is in the same cpu*/
+-			_assert_(iomodel->my_vertices[reCast<int>(vertex_pairing[2*i+1])-1]);
+-
+-			/*Skip if one of the two is not on the bed*/
+-			if(iomodel->domaintype!=Domain2DhorizontalEnum){
+-				if(!(reCast<bool>(nodeonsurface[reCast<int>(vertex_pairing[2*i+0])-1])) || !(reCast<bool>(nodeonsurface[reCast<int>(vertex_pairing[2*i+1])-1]))) continue;
+-			}
+-
+-			/*Get node ids*/
+-			penpair_ids[0]=iomodel->nodecounter+reCast<int>(vertex_pairing[2*i+0]);
+-			penpair_ids[1]=iomodel->nodecounter+reCast<int>(vertex_pairing[2*i+1]);
+-
+-			/*Create Load*/
+-			loads->AddObject(new Penpair(
+-							iomodel->loadcounter+count+1,
+-							&penpair_ids[0],
+-							FreeSurfaceTopAnalysisEnum));
+-			count++;
+-		}
+-	}
+-
+-	/*free ressources: */
+-	iomodel->DeleteData(vertex_pairing,MasstransportVertexPairingEnum);
+-	iomodel->DeleteData(nodeonsurface,MeshVertexonsurfaceEnum);
+-}/*}}}*/
+-
+ /*Finite Element Analysis*/
+ void           FreeSurfaceTopAnalysis::Core(FemModel* femmodel){/*{{{*/
+ 	_error_("not implemented");
+@@ -306,7 +306,7 @@
+ 	return pe;
+ 
+ }/*}}}*/
+-void FreeSurfaceTopAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           FreeSurfaceTopAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
+ 	 * For node i, Bi can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -334,7 +334,7 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(basis);
+ }/*}}}*/
+-void FreeSurfaceTopAnalysis::GetBprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           FreeSurfaceTopAnalysis::GetBprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 
+ 	 * For node i, Bi' can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -363,17 +363,17 @@
+ 	xDelete<IssmDouble>(dbasis);
+ 
+ }/*}}}*/
+-void FreeSurfaceTopAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           FreeSurfaceTopAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void FreeSurfaceTopAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           FreeSurfaceTopAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void FreeSurfaceTopAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           FreeSurfaceTopAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	element->InputUpdateFromSolutionOneDof(solution,SurfaceEnum);
+ }/*}}}*/
+-void FreeSurfaceTopAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           FreeSurfaceTopAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/Analysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/Analysis.h	(revision 18928)
++++ ../trunk-jpl/src/c/analyses/Analysis.h	(revision 18929)
+@@ -25,12 +25,12 @@
+ 		virtual      ~Analysis(){};
+ 
+ 		/*Model processing*/
++		virtual void CreateConstraints(Constraints* constraints,IoModel* iomodel)=0;
++		virtual void CreateLoads(Loads* loads, IoModel* iomodel)=0;
++		virtual void CreateNodes(Nodes* nodes,IoModel* iomodel)=0;
+ 		virtual int  DofsPerNode(int** doflist,int domaintype,int approximation)=0;
++		virtual void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type)=0;
+ 		virtual void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum)=0;
+-		virtual void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type)=0;
+-		virtual void CreateNodes(Nodes* nodes,IoModel* iomodel)=0;
+-		virtual void CreateConstraints(Constraints* constraints,IoModel* iomodel)=0;
+-		virtual void CreateLoads(Loads* loads, IoModel* iomodel)=0;
+ 
+ 		/*Finite element Analysis*/
+ 		virtual void           Core(FemModel* femmodel)=0;
+@@ -38,9 +38,9 @@
+ 		virtual ElementMatrix* CreateJacobianMatrix(Element* element)=0;
+ 		virtual ElementMatrix* CreateKMatrix(Element* element)=0;
+ 		virtual ElementVector* CreatePVector(Element* element)=0;
+-		virtual void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element)=0;
+-		virtual void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index)=0;
+-		virtual void InputUpdateFromSolution(IssmDouble* solution,Element* element)=0;
+-		virtual void UpdateConstraints(FemModel* femmodel)=0;
++		virtual void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element)=0;
++		virtual void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index)=0;
++		virtual void           InputUpdateFromSolution(IssmDouble* solution,Element* element)=0;
++		virtual void           UpdateConstraints(FemModel* femmodel)=0;
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.h	(revision 18928)
++++ ../trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.h	(revision 18929)
+@@ -12,12 +12,12 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+@@ -25,11 +25,11 @@
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/ExtrapolationAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/ExtrapolationAnalysis.h	(revision 18928)
++++ ../trunk-jpl/src/c/analyses/ExtrapolationAnalysis.h	(revision 18929)
+@@ -12,12 +12,12 @@
+ 	
+  public:
+ 	/*Model processing*/
++	void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++	void CreateLoads(Loads* loads, IoModel* iomodel);
++	void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 	int  DofsPerNode(int** doflist,int domaintype,int approximation);
++	void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 	void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-	void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-	void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-	void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-	void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 	/*Finite element Analysis*/
+ 	void           Core(FemModel* femmodel);
+@@ -25,12 +25,12 @@
+ 	ElementMatrix* CreateJacobianMatrix(Element* element);
+ 	ElementMatrix* CreateKMatrix(Element* element);
+ 	ElementVector* CreatePVector(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-	void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-	void UpdateConstraints(FemModel* femmodel);
+-	void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-	void GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-	void SetConstraintsOnIce(Element* element);
++	void           GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++	void           GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++	void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++	void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++	void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++	void           SetConstraintsOnIce(Element* element);
++	void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/GiaAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/GiaAnalysis.cpp	(revision 18928)
++++ ../trunk-jpl/src/c/analyses/GiaAnalysis.cpp	(revision 18929)
+@@ -5,11 +5,18 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
++void GiaAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++	/*No constraints*/
++}/*}}}*/
++void GiaAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++	/*No loads*/
++}/*}}}*/
++void GiaAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++	::CreateNodes(nodes,iomodel,GiaAnalysisEnum,P1Enum);
++}/*}}}*/
+ int  GiaAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+ 	return 1;
+ }/*}}}*/
+-void GiaAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-}/*}}}*/
+ void GiaAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	/*Update elements: */
+@@ -26,15 +33,8 @@
+ 	iomodel->FetchDataToInput(elements,GiaMantleViscosityEnum);
+ 	iomodel->FetchDataToInput(elements,GiaLithosphereThicknessEnum);
+ }/*}}}*/
+-void GiaAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-	::CreateNodes(nodes,iomodel,GiaAnalysisEnum,P1Enum);
++void GiaAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ }/*}}}*/
+-void GiaAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+-	/*No constraints*/
+-}/*}}}*/
+-void GiaAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+-	/*No loads*/
+-}/*}}}*/
+ 
+ /*Finite Element Analysis*/
+ void           GiaAnalysis::Core(FemModel* femmodel){/*{{{*/
+@@ -53,16 +53,16 @@
+ ElementVector* GiaAnalysis::CreatePVector(Element* element){/*{{{*/
+ _error_("not implemented yet");
+ }/*}}}*/
+-void GiaAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           GiaAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void GiaAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           GiaAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void GiaAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           GiaAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 	_error_("not implemented yet");
+ }/*}}}*/
+-void GiaAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           GiaAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.cpp	(revision 18928)
++++ ../trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.cpp	(revision 18929)
+@@ -5,49 +5,6 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
+-int  FreeSurfaceBaseAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+-	return 1;
+-}/*}}}*/
+-void FreeSurfaceBaseAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-}/*}}}*/
+-void FreeSurfaceBaseAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+-
+-	/*Now, is the model 3d? otherwise, do nothing: */
+-	if (iomodel->domaintype==Domain2DhorizontalEnum)return;
+-
+-	/*Finite element type*/
+-	int finiteelement = P1Enum;
+-
+-	/*Update elements: */
+-	int counter=0;
+-	for(int i=0;i<iomodel->numberofelements;i++){
+-		if(iomodel->my_elements[i]){
+-			Element* element=(Element*)elements->GetObjectByOffset(counter);
+-			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
+-			counter++;
+-		}
+-	}
+-
+-	iomodel->FetchDataToInput(elements,SurfaceEnum);
+-	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
+-	iomodel->FetchDataToInput(elements,BasalforcingsGroundediceMeltingRateEnum);
+-	iomodel->FetchDataToInput(elements,BasalforcingsFloatingiceMeltingRateEnum);
+-	iomodel->FetchDataToInput(elements,VxEnum);
+-	iomodel->FetchDataToInput(elements,VyEnum);
+-	if(iomodel->domaindim==3){
+-		iomodel->FetchDataToInput(elements,VzEnum);
+-	}
+-	if(iomodel->domaintype!=Domain2DhorizontalEnum){
+-		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
+-		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
+-	}
+-}/*}}}*/
+-void FreeSurfaceBaseAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-
+-	if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-	::CreateNodes(nodes,iomodel,FreeSurfaceBaseAnalysisEnum,P1Enum);
+-	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-}/*}}}*/
+ void FreeSurfaceBaseAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+ }/*}}}*/
+ void FreeSurfaceBaseAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+@@ -91,7 +48,50 @@
+ 	iomodel->DeleteData(vertex_pairing,MasstransportVertexPairingEnum);
+ 	iomodel->DeleteData(nodeonbase,MeshVertexonbaseEnum);
+ }/*}}}*/
++void FreeSurfaceBaseAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 
++	if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++	::CreateNodes(nodes,iomodel,FreeSurfaceBaseAnalysisEnum,P1Enum);
++	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++}/*}}}*/
++int  FreeSurfaceBaseAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
++	return 1;
++}/*}}}*/
++void FreeSurfaceBaseAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
++
++	/*Now, is the model 3d? otherwise, do nothing: */
++	if (iomodel->domaintype==Domain2DhorizontalEnum)return;
++
++	/*Finite element type*/
++	int finiteelement = P1Enum;
++
++	/*Update elements: */
++	int counter=0;
++	for(int i=0;i<iomodel->numberofelements;i++){
++		if(iomodel->my_elements[i]){
++			Element* element=(Element*)elements->GetObjectByOffset(counter);
++			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
++			counter++;
++		}
++	}
++
++	iomodel->FetchDataToInput(elements,SurfaceEnum);
++	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
++	iomodel->FetchDataToInput(elements,BasalforcingsGroundediceMeltingRateEnum);
++	iomodel->FetchDataToInput(elements,BasalforcingsFloatingiceMeltingRateEnum);
++	iomodel->FetchDataToInput(elements,VxEnum);
++	iomodel->FetchDataToInput(elements,VyEnum);
++	if(iomodel->domaindim==3){
++		iomodel->FetchDataToInput(elements,VzEnum);
++	}
++	if(iomodel->domaintype!=Domain2DhorizontalEnum){
++		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
++		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
++	}
++}/*}}}*/
++void FreeSurfaceBaseAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++}/*}}}*/
++
+ /*Finite Element Analysis*/
+ void           FreeSurfaceBaseAnalysis::Core(FemModel* femmodel){/*{{{*/
+ 	_error_("not implemented");
+@@ -303,7 +303,7 @@
+ 	return pe;
+ 
+ }/*}}}*/
+-void FreeSurfaceBaseAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           FreeSurfaceBaseAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
+ 	 * For node i, Bi can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -331,7 +331,7 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(basis);
+ }/*}}}*/
+-void FreeSurfaceBaseAnalysis::GetBprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           FreeSurfaceBaseAnalysis::GetBprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 
+ 	 * For node i, Bi' can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -360,16 +360,16 @@
+ 	xDelete<IssmDouble>(dbasis);
+ 
+ }/*}}}*/
+-void FreeSurfaceBaseAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           FreeSurfaceBaseAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void FreeSurfaceBaseAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           FreeSurfaceBaseAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void FreeSurfaceBaseAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           FreeSurfaceBaseAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 	element->InputUpdateFromSolutionOneDof(solution,BaseEnum);
+ }/*}}}*/
+-void FreeSurfaceBaseAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           FreeSurfaceBaseAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 
+ 	/*Intermediary*/
+ 	IssmDouble phi,isonbase,base;
+Index: ../trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp	(revision 18928)
++++ ../trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp	(revision 18929)
+@@ -5,15 +5,26 @@
+ #include "../modules/modules.h"
+ #include "../solutionsequences/solutionsequences.h"
+ 
+-int ExtrapolationAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+-	return 1;
++void ExtrapolationAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++	// do nothing for now
++	return;
+ }
+ /*}}}*/
+-void ExtrapolationAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-	//do nothing for now
++void ExtrapolationAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++	//	do nothing for now
+ 	return;
++}/*}}}*/
++void ExtrapolationAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++	int finiteelement=P1Enum;
++	if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++	::CreateNodes(nodes,iomodel,ExtrapolationAnalysisEnum,finiteelement);
++	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+ }
+ /*}}}*/
++int  ExtrapolationAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
++	return 1;
++}
++/*}}}*/
+ void ExtrapolationAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 	int    finiteelement;
+ 
+@@ -35,25 +46,14 @@
+ 	}
+ }
+ /*}}}*/
+-void ExtrapolationAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-	int finiteelement=P1Enum;
+-	if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-	::CreateNodes(nodes,iomodel,ExtrapolationAnalysisEnum,finiteelement);
+-	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-}
+-/*}}}*/
+-void ExtrapolationAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+-	// do nothing for now
++void ExtrapolationAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++	//do nothing for now
+ 	return;
+ }
+ /*}}}*/
+-void ExtrapolationAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+-	//	do nothing for now
+-	return;
+-}/*}}}*/
+ 
+ /*Finite element Analysis*/
+-void ExtrapolationAnalysis::Core(FemModel* femmodel){/*{{{*/
++void           ExtrapolationAnalysis::Core(FemModel* femmodel){/*{{{*/
+ 
+ 	/* Intermediaries */
+ 	bool save_results;
+@@ -236,28 +236,7 @@
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 	return pe;
+ }/*}}}*/
+-void ExtrapolationAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+-	_error_("not implemented yet");
+-}/*}}}*/
+-void ExtrapolationAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+-	_error_("Not implemented yet");
+-}/*}}}*/
+-void ExtrapolationAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+-
+-	int domaintype, extrapolationvariable;
+-	element->FindParam(&domaintype,DomainTypeEnum);
+-	element->FindParam(&extrapolationvariable, ExtrapolationVariableEnum);
+-	switch(domaintype){
+-		case Domain2DhorizontalEnum:
+-			element->InputUpdateFromSolutionOneDof(solution,extrapolationvariable);
+-			break;
+-		case Domain3DEnum:
+-			element->InputUpdateFromSolutionOneDofCollapsed(solution,extrapolationvariable);
+-			break;
+-		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+-	}
+-}/*}}}*/
+-void ExtrapolationAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           ExtrapolationAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
+ 	 * For node i, Bi can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -284,7 +263,7 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(basis);
+ }/*}}}*/
+-void ExtrapolationAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           ExtrapolationAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 
+ 	 * For node i, Bi' can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -312,8 +291,29 @@
+ 	xDelete<IssmDouble>(dbasis);
+ 
+ }/*}}}*/
+-void ExtrapolationAnalysis::SetConstraintsOnIce(Element* element){/*{{{*/
++void           ExtrapolationAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++	_error_("not implemented yet");
++}/*}}}*/
++void           ExtrapolationAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++	_error_("Not implemented yet");
++}/*}}}*/
++void           ExtrapolationAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
++	int domaintype, extrapolationvariable;
++	element->FindParam(&domaintype,DomainTypeEnum);
++	element->FindParam(&extrapolationvariable, ExtrapolationVariableEnum);
++	switch(domaintype){
++		case Domain2DhorizontalEnum:
++			element->InputUpdateFromSolutionOneDof(solution,extrapolationvariable);
++			break;
++		case Domain3DEnum:
++			element->InputUpdateFromSolutionOneDofCollapsed(solution,extrapolationvariable);
++			break;
++		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
++	}
++}/*}}}*/
++void           ExtrapolationAnalysis::SetConstraintsOnIce(Element* element){/*{{{*/
++
+ 	int numnodes=element->GetNumberOfNodes();	
+ 
+ 	/* Intermediaries */
+@@ -346,7 +346,7 @@
+ 	}
+ 	delete gauss;
+ }/*}}}*/
+-void ExtrapolationAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           ExtrapolationAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+ 		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
Index: /issm/oecreview/Archive/18296-19100/ISSM-18929-18930.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18929-18930.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18929-18930.diff	(revision 19102)
@@ -0,0 +1,8578 @@
+Index: ../trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.h	(revision 18930)
+@@ -12,12 +12,12 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+@@ -29,9 +29,9 @@
+ 		ElementVector* CreatePVector(Element* element);
+ 		ElementVector* CreatePVector2D(Element* element);
+ 		ElementVector* CreatePVector3D(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/SeaiceAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SeaiceAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/SeaiceAnalysis.h	(revision 18930)
+@@ -12,29 +12,27 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
++		void           CreateCTensor(IssmDouble* C,Element* element,Gauss* gauss);
+ 		ElementVector* CreateDVector(Element* element);
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
+-
+-		/*Sea ice specifics*/
+-		void UpdateDamageAndStress(FemModel* femmodel);
+-		void CreateCTensor(IssmDouble* C,Element* element,Gauss* gauss);
+-		void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetM(IssmDouble* M,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void PostProcess(FemModel* femmodel);
++		void           GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetM(IssmDouble* M,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           PostProcess(FemModel* femmodel);
++		void           UpdateConstraints(FemModel* femmodel);
++		void           UpdateDamageAndStress(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/ThermalAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/ThermalAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/ThermalAnalysis.h	(revision 18930)
+@@ -12,30 +12,30 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+ 		ElementVector* CreateDVector(Element* element);
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
++		ElementMatrix* CreateKMatrixShelf(Element* element);
+ 		ElementMatrix* CreateKMatrixVolume(Element* element);
+-		ElementMatrix* CreateKMatrixShelf(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		ElementVector* CreatePVectorVolume(Element* element);
+ 		ElementVector* CreatePVectorSheet(Element* element);
+ 		ElementVector* CreatePVectorShelf(Element* element);
+-		void GetBConduct(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBAdvec(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBAdvecprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		ElementVector* CreatePVectorVolume(Element* element);
++		void           GetBAdvec(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBAdvecprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBConduct(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/BalancethicknessAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/BalancethicknessAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/BalancethicknessAnalysis.cpp	(revision 18930)
+@@ -5,68 +5,6 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
+-int  BalancethicknessAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+-	return 1;
+-}/*}}}*/
+-void BalancethicknessAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-	parameters->AddObject(iomodel->CopyConstantObject(BalancethicknessStabilizationEnum));
+-}/*}}}*/
+-void BalancethicknessAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+-
+-	int    stabilization,finiteelement;
+-
+-	/*Fetch data needed: */
+-	iomodel->Constant(&stabilization,BalancethicknessStabilizationEnum);
+-
+-	/*Finite element type*/
+-	finiteelement = P1Enum;
+-	if(stabilization==3){
+-		finiteelement = P1DGEnum;
+-	}
+-
+-	/*Update elements: */
+-	int counter=0;
+-	for(int i=0;i<iomodel->numberofelements;i++){
+-		if(iomodel->my_elements[i]){
+-			Element* element=(Element*)elements->GetObjectByOffset(counter);
+-			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
+-			counter++;
+-		}
+-	}
+-
+-	iomodel->FetchDataToInput(elements,ThicknessEnum);
+-	iomodel->FetchDataToInput(elements,SurfaceEnum);
+-	iomodel->FetchDataToInput(elements,BaseEnum);
+-	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
+-	iomodel->FetchDataToInput(elements,VxEnum);
+-	iomodel->FetchDataToInput(elements,VyEnum);
+-	iomodel->FetchDataToInput(elements,BasalforcingsGroundediceMeltingRateEnum);
+-	iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum);
+-	iomodel->FetchDataToInput(elements,BalancethicknessThickeningRateEnum);
+-
+-	if(iomodel->domaintype!=Domain2DhorizontalEnum){
+-		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
+-		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
+-	}
+-}/*}}}*/
+-void BalancethicknessAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-
+-	int  stabilization;
+-	iomodel->Constant(&stabilization,BalancethicknessStabilizationEnum);
+-
+-	/*Check in 3d*/
+-	if(stabilization==3 && iomodel->domaintype==Domain3DEnum) _error_("DG 3d not implemented yet");
+-
+-	/*First fetch data: */
+-	if(iomodel->domaintype==Domain3DEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-	if(stabilization!=3){
+-		::CreateNodes(nodes,iomodel,BalancethicknessAnalysisEnum,P1Enum);
+-	}
+-	else{
+-		::CreateNodes(nodes,iomodel,BalancethicknessAnalysisEnum,P1DGEnum);
+-	}
+-	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-}/*}}}*/
+ void BalancethicknessAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+ 
+ 	/*Fetch parameters: */
+@@ -112,7 +50,69 @@
+ 		iomodel->DeleteData(1,ThicknessEnum);
+ 	}
+ }/*}}}*/
++void BalancethicknessAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 
++	int  stabilization;
++	iomodel->Constant(&stabilization,BalancethicknessStabilizationEnum);
++
++	/*Check in 3d*/
++	if(stabilization==3 && iomodel->domaintype==Domain3DEnum) _error_("DG 3d not implemented yet");
++
++	/*First fetch data: */
++	if(iomodel->domaintype==Domain3DEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++	if(stabilization!=3){
++		::CreateNodes(nodes,iomodel,BalancethicknessAnalysisEnum,P1Enum);
++	}
++	else{
++		::CreateNodes(nodes,iomodel,BalancethicknessAnalysisEnum,P1DGEnum);
++	}
++	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++}/*}}}*/
++int  BalancethicknessAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
++	return 1;
++}/*}}}*/
++void BalancethicknessAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
++
++	int    stabilization,finiteelement;
++
++	/*Fetch data needed: */
++	iomodel->Constant(&stabilization,BalancethicknessStabilizationEnum);
++
++	/*Finite element type*/
++	finiteelement = P1Enum;
++	if(stabilization==3){
++		finiteelement = P1DGEnum;
++	}
++
++	/*Update elements: */
++	int counter=0;
++	for(int i=0;i<iomodel->numberofelements;i++){
++		if(iomodel->my_elements[i]){
++			Element* element=(Element*)elements->GetObjectByOffset(counter);
++			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
++			counter++;
++		}
++	}
++
++	iomodel->FetchDataToInput(elements,ThicknessEnum);
++	iomodel->FetchDataToInput(elements,SurfaceEnum);
++	iomodel->FetchDataToInput(elements,BaseEnum);
++	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
++	iomodel->FetchDataToInput(elements,VxEnum);
++	iomodel->FetchDataToInput(elements,VyEnum);
++	iomodel->FetchDataToInput(elements,BasalforcingsGroundediceMeltingRateEnum);
++	iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum);
++	iomodel->FetchDataToInput(elements,BalancethicknessThickeningRateEnum);
++
++	if(iomodel->domaintype!=Domain2DhorizontalEnum){
++		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
++		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
++	}
++}/*}}}*/
++void BalancethicknessAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++	parameters->AddObject(iomodel->CopyConstantObject(BalancethicknessStabilizationEnum));
++}/*}}}*/
++
+ /*Finite Element Analysis*/
+ void           BalancethicknessAnalysis::Core(FemModel* femmodel){/*{{{*/
+ 	_error_("not implemented");
+@@ -420,7 +420,7 @@
+ 	delete gauss;
+ 	return pe;
+ }/*}}}*/
+-void BalancethicknessAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           BalancethicknessAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
+ 	 * For node i, Bi can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -447,7 +447,7 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(basis);
+ }/*}}}*/
+-void BalancethicknessAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           BalancethicknessAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 
+ 	 * For node i, Bi' can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -475,10 +475,10 @@
+ 	xDelete<IssmDouble>(dbasis);
+ 
+ }/*}}}*/
+-void BalancethicknessAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           BalancethicknessAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void BalancethicknessAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           BalancethicknessAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	/* WARNING: this gradient is valid for Soft balance thickness only */
+ 
+ 	/*If on water, grad = 0: */
+@@ -594,7 +594,7 @@
+ 
+ 
+ }/*}}}*/
+-void BalancethicknessAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           BalancethicknessAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	int domaintype;
+ 	element->FindParam(&domaintype,DomainTypeEnum);
+@@ -608,7 +608,7 @@
+ 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+ 	}
+ }/*}}}*/
+-void BalancethicknessAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           BalancethicknessAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 18930)
+@@ -5,22 +5,22 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
+-int  AdjointHorizAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+-	_error_("not implemented");
+-}/*}}}*/
+-void AdjointHorizAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++void AdjointHorizAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void AdjointHorizAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
++void AdjointHorizAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+ void AdjointHorizAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void AdjointHorizAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++int  AdjointHorizAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
++	_error_("not implemented");
++}/*}}}*/
++void AdjointHorizAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void AdjointHorizAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++void AdjointHorizAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+ 
+@@ -53,110 +53,95 @@
+ 			_error_("Approximation "<<EnumToStringx(approximation)<<" not supported");
+ 	}
+ }/*}}}*/
+-ElementMatrix* AdjointHorizAnalysis::CreateKMatrixSSA(Element* element){/*{{{*/
++ElementMatrix* AdjointHorizAnalysis::CreateKMatrixFS(Element* element){/*{{{*/
+ 
+-	/*Intermediaries*/
+-	int      domaintype;
+-	Element* basalelement;
+-
+-	/*Get basal element*/
+-	element->FindParam(&domaintype,DomainTypeEnum);
+-	switch(domaintype){
+-		case Domain2DhorizontalEnum:
+-			basalelement = element;
+-			break;
+-		case Domain3DEnum:
+-			if(!element->IsOnBase()) return NULL;
+-			basalelement = element->SpawnBasalElement();
+-			break;
+-		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+-	}
+-
+ 	/*Intermediaries */
+ 	bool        incomplete_adjoint;
+-	IssmDouble  Jdet,thickness,mu_prime;
+-	IssmDouble  eps1dotdphii,eps1dotdphij,eps2dotdphii,eps2dotdphij;
+-	IssmDouble  eps1[2],eps2[2],epsilon[3];
++	int         dim,epssize;
++	IssmDouble  Jdet,mu_prime;
++	IssmDouble  eps1dotdphii,eps1dotdphij,eps2dotdphii,eps2dotdphij,eps3dotdphii,eps3dotdphij;
++	IssmDouble  eps1[3],eps2[3],eps3[3],epsilon[5];/* epsilon=[exx,eyy,exy,exz,eyz];*/
+ 	IssmDouble *xyz_list = NULL;
+ 
++	/*Get problem dimension*/
++	element->FindParam(&dim,DomainDimensionEnum);
++	if(dim==2) epssize = 3;
++	else       epssize = 6;
++
+ 	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = basalelement->GetNumberOfNodes();
++	int vnumnodes = element->NumberofNodesVelocity();
++	int pnumnodes = element->NumberofNodesPressure();
++	int numdof    = vnumnodes*dim + pnumnodes;
+ 
+-	/*Initialize Jacobian with regular SSA (first part of the Gateau derivative)*/
+-	basalelement->FindParam(&incomplete_adjoint,InversionIncompleteAdjointEnum);
++	/*Initialize Jacobian with regular FS (first part of the Gateau derivative)*/
++	element->FindParam(&incomplete_adjoint,InversionIncompleteAdjointEnum);
+ 	StressbalanceAnalysis* analysis = new StressbalanceAnalysis();
+ 	ElementMatrix* Ke=analysis->CreateKMatrix(element);
+ 	delete analysis;
+-	if(incomplete_adjoint){
+-		if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+-		return Ke;
+-	}
++	if(incomplete_adjoint) return Ke;
+ 
+ 	/*Retrieve all inputs and parameters*/
+-	basalelement->GetVerticesCoordinates(&xyz_list);
+-	Input* vx_input        = basalelement->GetInput(VxEnum);       _assert_(vx_input);
+-	Input* vy_input        = basalelement->GetInput(VyEnum);       _assert_(vy_input);
+-	Input* thickness_input = basalelement->GetInput(ThicknessEnum); _assert_(thickness_input);
++	element->GetVerticesCoordinates(&xyz_list);
++	Input* vx_input = element->GetInput(VxEnum);_assert_(vx_input);
++	Input* vy_input = element->GetInput(VyEnum);_assert_(vy_input);
++	Input* vz_input = NULL;
++	if(dim==3){
++		vz_input = element->GetInput(VzEnum);
++	}
++	else{
++		_error_("Not implemented yet");
++	}
+ 
+ 	/*Allocate dbasis*/
+-	IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes);
++	IssmDouble* dbasis = xNew<IssmDouble>(dim*vnumnodes);
+ 
+ 	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=basalelement->NewGauss(2);
++	Gauss* gauss=element->NewGauss(5);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 		gauss->GaussPoint(ig);
+ 
+-		basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+ 
+-		thickness_input->GetInputValue(&thickness, gauss);
+-		basalelement->StrainRateSSA(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
+-		basalelement->ViscositySSADerivativeEpsSquare(&mu_prime,&epsilon[0]);
+-		eps1[0]=2.*epsilon[0]+epsilon[1]; eps2[0]=epsilon[2];
+-		eps1[1]=epsilon[2];               eps2[1]=epsilon[0]+2*epsilon[1];
++		element->StrainRateHO(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
++		element->ViscosityFSDerivativeEpsSquare(&mu_prime,&epsilon[0]);
++		eps1[0]=epsilon[0];   eps2[0]=epsilon[2];   eps3[0]=epsilon[3];
++		eps1[1]=epsilon[2];   eps2[1]=epsilon[1];   eps3[1]=epsilon[4];
++		eps1[2]=epsilon[3];   eps2[2]=epsilon[4];   eps3[2]= -epsilon[0] -epsilon[1];
+ 
+-		for(int i=0;i<numnodes;i++){
+-			for(int j=0;j<numnodes;j++){
+-				eps1dotdphii=eps1[0]*dbasis[0*numnodes+i]+eps1[1]*dbasis[1*numnodes+i];
+-				eps1dotdphij=eps1[0]*dbasis[0*numnodes+j]+eps1[1]*dbasis[1*numnodes+j];
+-				eps2dotdphii=eps2[0]*dbasis[0*numnodes+i]+eps2[1]*dbasis[1*numnodes+i];
+-				eps2dotdphij=eps2[0]*dbasis[0*numnodes+j]+eps2[1]*dbasis[1*numnodes+j];
++		for(int i=0;i<vnumnodes;i++){
++			for(int j=0;j<vnumnodes;j++){
++				eps1dotdphii=eps1[0]*dbasis[0*vnumnodes+i]+eps1[1]*dbasis[1*vnumnodes+i]+eps1[2]*dbasis[2*vnumnodes+i];
++				eps1dotdphij=eps1[0]*dbasis[0*vnumnodes+j]+eps1[1]*dbasis[1*vnumnodes+j]+eps1[2]*dbasis[2*vnumnodes+j];
++				eps2dotdphii=eps2[0]*dbasis[0*vnumnodes+i]+eps2[1]*dbasis[1*vnumnodes+i]+eps2[2]*dbasis[2*vnumnodes+i];
++				eps2dotdphij=eps2[0]*dbasis[0*vnumnodes+j]+eps2[1]*dbasis[1*vnumnodes+j]+eps2[2]*dbasis[2*vnumnodes+j];
++				eps3dotdphii=eps3[0]*dbasis[0*vnumnodes+i]+eps3[1]*dbasis[1*vnumnodes+i]+eps3[2]*dbasis[2*vnumnodes+i];
++				eps3dotdphij=eps3[0]*dbasis[0*vnumnodes+j]+eps3[1]*dbasis[1*vnumnodes+j]+eps3[2]*dbasis[2*vnumnodes+j];
+ 
+-				Ke->values[2*numnodes*(2*i+0)+2*j+0]+=gauss->weight*Jdet*2*mu_prime*thickness*eps1dotdphij*eps1dotdphii;
+-				Ke->values[2*numnodes*(2*i+0)+2*j+1]+=gauss->weight*Jdet*2*mu_prime*thickness*eps2dotdphij*eps1dotdphii;
+-				Ke->values[2*numnodes*(2*i+1)+2*j+0]+=gauss->weight*Jdet*2*mu_prime*thickness*eps1dotdphij*eps2dotdphii;
+-				Ke->values[2*numnodes*(2*i+1)+2*j+1]+=gauss->weight*Jdet*2*mu_prime*thickness*eps2dotdphij*eps2dotdphii;
++				Ke->values[numdof*(4*i+0)+4*j+0]+=gauss->weight*Jdet*2*mu_prime*eps1dotdphij*eps1dotdphii;
++				Ke->values[numdof*(4*i+0)+4*j+1]+=gauss->weight*Jdet*2*mu_prime*eps2dotdphij*eps1dotdphii;
++				Ke->values[numdof*(4*i+0)+4*j+2]+=gauss->weight*Jdet*2*mu_prime*eps3dotdphij*eps1dotdphii;
++
++				Ke->values[numdof*(4*i+1)+4*j+0]+=gauss->weight*Jdet*2*mu_prime*eps1dotdphij*eps2dotdphii;
++				Ke->values[numdof*(4*i+1)+4*j+1]+=gauss->weight*Jdet*2*mu_prime*eps2dotdphij*eps2dotdphii;
++				Ke->values[numdof*(4*i+1)+4*j+2]+=gauss->weight*Jdet*2*mu_prime*eps3dotdphij*eps2dotdphii;
++
++				Ke->values[numdof*(4*i+2)+4*j+0]+=gauss->weight*Jdet*2*mu_prime*eps1dotdphij*eps3dotdphii;
++				Ke->values[numdof*(4*i+2)+4*j+1]+=gauss->weight*Jdet*2*mu_prime*eps2dotdphij*eps3dotdphii;
++				Ke->values[numdof*(4*i+2)+4*j+2]+=gauss->weight*Jdet*2*mu_prime*eps3dotdphij*eps3dotdphii;
+ 			}
+ 		}
+ 	}
+ 
+ 	/*Transform Coordinate System*/
+-	basalelement->TransformStiffnessMatrixCoord(Ke,XYEnum);
++	element->TransformStiffnessMatrixCoord(Ke,XYZEnum);
+ 
+ 	/*Clean up and return*/
+ 	delete gauss;
+ 	xDelete<IssmDouble>(dbasis);
+ 	xDelete<IssmDouble>(xyz_list);
+-	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 	return Ke;
+ }/*}}}*/
+-ElementMatrix* AdjointHorizAnalysis::CreateKMatrixL1L2(Element* element){/*{{{*/
+-
+-	/*Intermediaries*/
+-	bool incomplete_adjoint;
+-
+-	/*Initialize Jacobian with regular L1L2 (first part of the Gateau derivative)*/
+-	StressbalanceAnalysis* analysis = new StressbalanceAnalysis();
+-	ElementMatrix* Ke=analysis->CreateKMatrix(element);
+-	delete analysis;
+-
+-	/*return*/
+-	element->FindParam(&incomplete_adjoint,InversionIncompleteAdjointEnum);
+-	if(!incomplete_adjoint){
+-		_error_("Exact adjoint not supported yet for L1L2 model");
+-	}
+-	return Ke;
+-}/*}}}*/
+ ElementMatrix* AdjointHorizAnalysis::CreateKMatrixHO(Element* element){/*{{{*/
+ 
+ 	/*Intermediaries */
+@@ -222,93 +207,108 @@
+ 	xDelete<IssmDouble>(xyz_list);
+ 	return Ke;
+ }/*}}}*/
+-ElementMatrix* AdjointHorizAnalysis::CreateKMatrixFS(Element* element){/*{{{*/
++ElementMatrix* AdjointHorizAnalysis::CreateKMatrixL1L2(Element* element){/*{{{*/
+ 
++	/*Intermediaries*/
++	bool incomplete_adjoint;
++
++	/*Initialize Jacobian with regular L1L2 (first part of the Gateau derivative)*/
++	StressbalanceAnalysis* analysis = new StressbalanceAnalysis();
++	ElementMatrix* Ke=analysis->CreateKMatrix(element);
++	delete analysis;
++
++	/*return*/
++	element->FindParam(&incomplete_adjoint,InversionIncompleteAdjointEnum);
++	if(!incomplete_adjoint){
++		_error_("Exact adjoint not supported yet for L1L2 model");
++	}
++	return Ke;
++}/*}}}*/
++ElementMatrix* AdjointHorizAnalysis::CreateKMatrixSSA(Element* element){/*{{{*/
++
++	/*Intermediaries*/
++	int      domaintype;
++	Element* basalelement;
++
++	/*Get basal element*/
++	element->FindParam(&domaintype,DomainTypeEnum);
++	switch(domaintype){
++		case Domain2DhorizontalEnum:
++			basalelement = element;
++			break;
++		case Domain3DEnum:
++			if(!element->IsOnBase()) return NULL;
++			basalelement = element->SpawnBasalElement();
++			break;
++		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
++	}
++
+ 	/*Intermediaries */
+ 	bool        incomplete_adjoint;
+-	int         dim,epssize;
+-	IssmDouble  Jdet,mu_prime;
+-	IssmDouble  eps1dotdphii,eps1dotdphij,eps2dotdphii,eps2dotdphij,eps3dotdphii,eps3dotdphij;
+-	IssmDouble  eps1[3],eps2[3],eps3[3],epsilon[5];/* epsilon=[exx,eyy,exy,exz,eyz];*/
++	IssmDouble  Jdet,thickness,mu_prime;
++	IssmDouble  eps1dotdphii,eps1dotdphij,eps2dotdphii,eps2dotdphij;
++	IssmDouble  eps1[2],eps2[2],epsilon[3];
+ 	IssmDouble *xyz_list = NULL;
+ 
+-	/*Get problem dimension*/
+-	element->FindParam(&dim,DomainDimensionEnum);
+-	if(dim==2) epssize = 3;
+-	else       epssize = 6;
+-
+ 	/*Fetch number of nodes and dof for this finite element*/
+-	int vnumnodes = element->NumberofNodesVelocity();
+-	int pnumnodes = element->NumberofNodesPressure();
+-	int numdof    = vnumnodes*dim + pnumnodes;
++	int numnodes = basalelement->GetNumberOfNodes();
+ 
+-	/*Initialize Jacobian with regular FS (first part of the Gateau derivative)*/
+-	element->FindParam(&incomplete_adjoint,InversionIncompleteAdjointEnum);
++	/*Initialize Jacobian with regular SSA (first part of the Gateau derivative)*/
++	basalelement->FindParam(&incomplete_adjoint,InversionIncompleteAdjointEnum);
+ 	StressbalanceAnalysis* analysis = new StressbalanceAnalysis();
+ 	ElementMatrix* Ke=analysis->CreateKMatrix(element);
+ 	delete analysis;
+-	if(incomplete_adjoint) return Ke;
++	if(incomplete_adjoint){
++		if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
++		return Ke;
++	}
+ 
+ 	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinates(&xyz_list);
+-	Input* vx_input = element->GetInput(VxEnum);_assert_(vx_input);
+-	Input* vy_input = element->GetInput(VyEnum);_assert_(vy_input);
+-	Input* vz_input = NULL;
+-	if(dim==3){
+-		vz_input = element->GetInput(VzEnum);
+-	}
+-	else{
+-		_error_("Not implemented yet");
+-	}
++	basalelement->GetVerticesCoordinates(&xyz_list);
++	Input* vx_input        = basalelement->GetInput(VxEnum);       _assert_(vx_input);
++	Input* vy_input        = basalelement->GetInput(VyEnum);       _assert_(vy_input);
++	Input* thickness_input = basalelement->GetInput(ThicknessEnum); _assert_(thickness_input);
+ 
+ 	/*Allocate dbasis*/
+-	IssmDouble* dbasis = xNew<IssmDouble>(dim*vnumnodes);
++	IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes);
+ 
+ 	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=element->NewGauss(5);
++	Gauss* gauss=basalelement->NewGauss(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 		gauss->GaussPoint(ig);
+ 
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
++		basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+ 
+-		element->StrainRateHO(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
+-		element->ViscosityFSDerivativeEpsSquare(&mu_prime,&epsilon[0]);
+-		eps1[0]=epsilon[0];   eps2[0]=epsilon[2];   eps3[0]=epsilon[3];
+-		eps1[1]=epsilon[2];   eps2[1]=epsilon[1];   eps3[1]=epsilon[4];
+-		eps1[2]=epsilon[3];   eps2[2]=epsilon[4];   eps3[2]= -epsilon[0] -epsilon[1];
++		thickness_input->GetInputValue(&thickness, gauss);
++		basalelement->StrainRateSSA(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
++		basalelement->ViscositySSADerivativeEpsSquare(&mu_prime,&epsilon[0]);
++		eps1[0]=2.*epsilon[0]+epsilon[1]; eps2[0]=epsilon[2];
++		eps1[1]=epsilon[2];               eps2[1]=epsilon[0]+2*epsilon[1];
+ 
+-		for(int i=0;i<vnumnodes;i++){
+-			for(int j=0;j<vnumnodes;j++){
+-				eps1dotdphii=eps1[0]*dbasis[0*vnumnodes+i]+eps1[1]*dbasis[1*vnumnodes+i]+eps1[2]*dbasis[2*vnumnodes+i];
+-				eps1dotdphij=eps1[0]*dbasis[0*vnumnodes+j]+eps1[1]*dbasis[1*vnumnodes+j]+eps1[2]*dbasis[2*vnumnodes+j];
+-				eps2dotdphii=eps2[0]*dbasis[0*vnumnodes+i]+eps2[1]*dbasis[1*vnumnodes+i]+eps2[2]*dbasis[2*vnumnodes+i];
+-				eps2dotdphij=eps2[0]*dbasis[0*vnumnodes+j]+eps2[1]*dbasis[1*vnumnodes+j]+eps2[2]*dbasis[2*vnumnodes+j];
+-				eps3dotdphii=eps3[0]*dbasis[0*vnumnodes+i]+eps3[1]*dbasis[1*vnumnodes+i]+eps3[2]*dbasis[2*vnumnodes+i];
+-				eps3dotdphij=eps3[0]*dbasis[0*vnumnodes+j]+eps3[1]*dbasis[1*vnumnodes+j]+eps3[2]*dbasis[2*vnumnodes+j];
++		for(int i=0;i<numnodes;i++){
++			for(int j=0;j<numnodes;j++){
++				eps1dotdphii=eps1[0]*dbasis[0*numnodes+i]+eps1[1]*dbasis[1*numnodes+i];
++				eps1dotdphij=eps1[0]*dbasis[0*numnodes+j]+eps1[1]*dbasis[1*numnodes+j];
++				eps2dotdphii=eps2[0]*dbasis[0*numnodes+i]+eps2[1]*dbasis[1*numnodes+i];
++				eps2dotdphij=eps2[0]*dbasis[0*numnodes+j]+eps2[1]*dbasis[1*numnodes+j];
+ 
+-				Ke->values[numdof*(4*i+0)+4*j+0]+=gauss->weight*Jdet*2*mu_prime*eps1dotdphij*eps1dotdphii;
+-				Ke->values[numdof*(4*i+0)+4*j+1]+=gauss->weight*Jdet*2*mu_prime*eps2dotdphij*eps1dotdphii;
+-				Ke->values[numdof*(4*i+0)+4*j+2]+=gauss->weight*Jdet*2*mu_prime*eps3dotdphij*eps1dotdphii;
+-
+-				Ke->values[numdof*(4*i+1)+4*j+0]+=gauss->weight*Jdet*2*mu_prime*eps1dotdphij*eps2dotdphii;
+-				Ke->values[numdof*(4*i+1)+4*j+1]+=gauss->weight*Jdet*2*mu_prime*eps2dotdphij*eps2dotdphii;
+-				Ke->values[numdof*(4*i+1)+4*j+2]+=gauss->weight*Jdet*2*mu_prime*eps3dotdphij*eps2dotdphii;
+-
+-				Ke->values[numdof*(4*i+2)+4*j+0]+=gauss->weight*Jdet*2*mu_prime*eps1dotdphij*eps3dotdphii;
+-				Ke->values[numdof*(4*i+2)+4*j+1]+=gauss->weight*Jdet*2*mu_prime*eps2dotdphij*eps3dotdphii;
+-				Ke->values[numdof*(4*i+2)+4*j+2]+=gauss->weight*Jdet*2*mu_prime*eps3dotdphij*eps3dotdphii;
++				Ke->values[2*numnodes*(2*i+0)+2*j+0]+=gauss->weight*Jdet*2*mu_prime*thickness*eps1dotdphij*eps1dotdphii;
++				Ke->values[2*numnodes*(2*i+0)+2*j+1]+=gauss->weight*Jdet*2*mu_prime*thickness*eps2dotdphij*eps1dotdphii;
++				Ke->values[2*numnodes*(2*i+1)+2*j+0]+=gauss->weight*Jdet*2*mu_prime*thickness*eps1dotdphij*eps2dotdphii;
++				Ke->values[2*numnodes*(2*i+1)+2*j+1]+=gauss->weight*Jdet*2*mu_prime*thickness*eps2dotdphij*eps2dotdphii;
+ 			}
+ 		}
+ 	}
+ 
+ 	/*Transform Coordinate System*/
+-	element->TransformStiffnessMatrixCoord(Ke,XYZEnum);
++	basalelement->TransformStiffnessMatrixCoord(Ke,XYEnum);
+ 
+ 	/*Clean up and return*/
+ 	delete gauss;
+ 	xDelete<IssmDouble>(dbasis);
+ 	xDelete<IssmDouble>(xyz_list);
++	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 	return Ke;
+ }/*}}}*/
+ ElementVector* AdjointHorizAnalysis::CreatePVector(Element* element){/*{{{*/
+@@ -566,6 +566,11 @@
+ 	delete gauss;
+ 	return pe;
+ }/*}}}*/
++ElementVector* AdjointHorizAnalysis::CreatePVectorL1L2(Element* element){/*{{{*/
++
++	/*Same as SSA*/
++	return this->CreatePVectorSSA(element);
++}/*}}}*/
+ ElementVector* AdjointHorizAnalysis::CreatePVectorHO(Element* element){/*{{{*/
+ 
+ 	/*Nothing to be done if not on surface*/
+@@ -1041,15 +1046,10 @@
+ 	delete gauss;
+ 	return pe;
+ }/*}}}*/
+-ElementVector* AdjointHorizAnalysis::CreatePVectorL1L2(Element* element){/*{{{*/
+-
+-	/*Same as SSA*/
+-	return this->CreatePVectorSSA(element);
+-}/*}}}*/
+-void AdjointHorizAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           AdjointHorizAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void AdjointHorizAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           AdjointHorizAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	/*The gradient of the cost function is calculated in 2 parts.
+ 	 *
+ 	 * dJ    \partial J   \partial lambda^T(KU-F)
+@@ -1137,13 +1137,14 @@
+ 	xDelete<int>(responses);
+                          
+ }/*}}}*/
+-void AdjointHorizAnalysis::GradientJDragGradient(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++void           AdjointHorizAnalysis::GradientJBbarFS(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++	/*WARNING: We use SSA as an estimate for now*/
++	this->GradientJBbarSSA(element,gradient,control_index);
++}/*}}}*/
++void           AdjointHorizAnalysis::GradientJBbarGradient(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+-	/*return if floating (gradient is 0)*/
+-	if(element->IsFloating()) return;
+-
+ 	/*Intermediaries*/
+-	int      domaintype,dim;
++	int      domaintype;
+ 	Element* basalelement;
+ 
+ 	/*Get basal element*/
+@@ -1151,17 +1152,14 @@
+ 	switch(domaintype){
+ 		case Domain2DhorizontalEnum:
+ 			basalelement = element;
+-			dim          = 2;
+ 			break;
+ 		case Domain2DverticalEnum:
+ 			if(!element->IsOnBase()) return;
+ 			basalelement = element->SpawnBasalElement();
+-			dim          = 1;
+ 			break;
+ 		case Domain3DEnum:
+ 			if(!element->IsOnBase()) return;
+ 			basalelement = element->SpawnBasalElement();
+-			dim          = 2;
+ 			break;
+ 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+ 	}
+@@ -1182,8 +1180,8 @@
+ 	/*Retrieve all inputs we will be needing: */
+ 	basalelement->GetVerticesCoordinates(&xyz_list);
+ 	basalelement->GradientIndexing(&vertexpidlist[0],control_index);
+-	Input* dragcoefficient_input = basalelement->GetInput(FrictionCoefficientEnum);                _assert_(dragcoefficient_input);
+-	Input* weights_input         = basalelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
++	Input* rheologyb_input = basalelement->GetInput(MaterialsRheologyBbarEnum);              _assert_(rheologyb_input);
++	Input* weights_input   = basalelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+ 
+ 	/* Start  looping on the number of gaussian points: */
+ 	Gauss* gauss=basalelement->NewGauss(2);
+@@ -1192,14 +1190,14 @@
+ 
+ 		basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
+ 		basalelement->NodalFunctionsP1Derivatives(dbasis,xyz_list,gauss);
+-		weights_input->GetInputValue(&weight,gauss,DragCoefficientAbsGradientEnum);
++		weights_input->GetInputValue(&weight,gauss,RheologyBbarAbsGradientEnum);
+ 
+ 		/*Build alpha_complement_list: */
+-		dragcoefficient_input->GetInputDerivativeValue(&dk[0],xyz_list,gauss);
++		rheologyb_input->GetInputDerivativeValue(&dk[0],xyz_list,gauss);
+ 
+-		/*Build gradient vector (actually -dJ/ddrag): */
++		/*Build gradje_g_gaussian vector (actually -dJ/ddrag): */
+ 		for(int i=0;i<numvertices;i++){
+-			if(dim==2){
++			if(domaintype!=Domain2DverticalEnum){
+ 				ge[i]+=-weight*Jdet*gauss->weight*(dbasis[0*numvertices+i]*dk[0]+dbasis[1*numvertices+i]*dk[1]);
+ 			}
+ 			else{
+@@ -1217,12 +1215,21 @@
+ 	xDelete<int>(vertexpidlist);
+ 	delete gauss;
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
++}/*}}}*/
++void           AdjointHorizAnalysis::GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
++	   /*Same as SSA*/
++	   return this->GradientJBbarSSA(element,gradient,control_index);
+ }/*}}}*/
+-void AdjointHorizAnalysis::GradientJBbarGradient(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++void           AdjointHorizAnalysis::GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
++	/*WARNING: We use SSA as an estimate for now*/
++	this->GradientJBbarSSA(element,gradient,control_index);
++}/*}}}*/
++void           AdjointHorizAnalysis::GradientJBbarSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++
+ 	/*Intermediaries*/
+-	int      domaintype;
++	int      domaintype,dim;
+ 	Element* basalelement;
+ 
+ 	/*Get basal element*/
+@@ -1230,57 +1237,66 @@
+ 	switch(domaintype){
+ 		case Domain2DhorizontalEnum:
+ 			basalelement = element;
++			dim          = 2;
+ 			break;
+ 		case Domain2DverticalEnum:
+ 			if(!element->IsOnBase()) return;
+ 			basalelement = element->SpawnBasalElement();
++			dim          = 1;
+ 			break;
+ 		case Domain3DEnum:
+ 			if(!element->IsOnBase()) return;
+ 			basalelement = element->SpawnBasalElement();
++			dim          = 2;
+ 			break;
+ 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+ 	}
+ 
+ 	/*Intermediaries*/
+ 	IssmDouble Jdet,weight;
+-	IssmDouble dk[3]; 
++	IssmDouble thickness,dmudB;
++	IssmDouble dvx[3],dvy[3],dadjx[3],dadjy[3]; 
+ 	IssmDouble *xyz_list= NULL;
+ 
+ 	/*Fetch number of vertices for this finite element*/
+ 	int numvertices = basalelement->GetNumberOfVertices();
+ 
+ 	/*Initialize some vectors*/
+-	IssmDouble* dbasis        = xNew<IssmDouble>(2*numvertices);
++	IssmDouble* basis         = xNew<IssmDouble>(numvertices);
+ 	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
+ 	int*        vertexpidlist = xNew<int>(numvertices);
+ 
+ 	/*Retrieve all inputs we will be needing: */
+ 	basalelement->GetVerticesCoordinates(&xyz_list);
+ 	basalelement->GradientIndexing(&vertexpidlist[0],control_index);
+-	Input* rheologyb_input = basalelement->GetInput(MaterialsRheologyBbarEnum);              _assert_(rheologyb_input);
+-	Input* weights_input   = basalelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
++	Input* thickness_input = basalelement->GetInput(ThicknessEnum);             _assert_(thickness_input);
++	Input* vx_input        = basalelement->GetInput(VxEnum);                    _assert_(vx_input);
++	Input* vy_input        = basalelement->GetInput(VyEnum);                    _assert_(vy_input);
++	Input* adjointx_input  = basalelement->GetInput(AdjointxEnum);              _assert_(adjointx_input);
++	Input* adjointy_input  = basalelement->GetInput(AdjointyEnum);              _assert_(adjointy_input);
++	Input* rheologyb_input = basalelement->GetInput(MaterialsRheologyBbarEnum); _assert_(rheologyb_input);
+ 
+ 	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=basalelement->NewGauss(2);
++	Gauss* gauss=basalelement->NewGauss(4);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 		gauss->GaussPoint(ig);
+ 
++		thickness_input->GetInputValue(&thickness,gauss);
++		vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
++		vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
++		adjointx_input->GetInputDerivativeValue(&dadjx[0],xyz_list,gauss);
++		adjointy_input->GetInputDerivativeValue(&dadjy[0],xyz_list,gauss);
++
++		basalelement->dViscositydBSSA(&dmudB,dim,xyz_list,gauss,vx_input,vy_input);
++
+ 		basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		basalelement->NodalFunctionsP1Derivatives(dbasis,xyz_list,gauss);
+-		weights_input->GetInputValue(&weight,gauss,RheologyBbarAbsGradientEnum);
++		basalelement->NodalFunctionsP1(basis,gauss);
+ 
+-		/*Build alpha_complement_list: */
+-		rheologyb_input->GetInputDerivativeValue(&dk[0],xyz_list,gauss);
+-
+-		/*Build gradje_g_gaussian vector (actually -dJ/ddrag): */
++		/*Build gradient vector (actually -dJ/dB): */
+ 		for(int i=0;i<numvertices;i++){
+-			if(domaintype!=Domain2DverticalEnum){
+-				ge[i]+=-weight*Jdet*gauss->weight*(dbasis[0*numvertices+i]*dk[0]+dbasis[1*numvertices+i]*dk[1]);
+-			}
+-			else{
+-				ge[i]+=-weight*Jdet*gauss->weight*dbasis[0*numvertices+i]*dk[0];
+-			}
++			ge[i]+=-dmudB*thickness*(
++						(2*dvx[0]+dvy[1])*2*dadjx[0]+(dvx[1]+dvy[0])*(dadjx[1]+dadjy[0])+(2*dvy[1]+dvx[0])*2*dadjy[1]
++						)*Jdet*gauss->weight*basis[i];
+ 			_assert_(!xIsNan<IssmDouble>(ge[i]));
+ 		}
+ 	}
+@@ -1288,13 +1304,17 @@
+ 
+ 	/*Clean up and return*/
+ 	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(dbasis);
++	xDelete<IssmDouble>(basis);
+ 	xDelete<IssmDouble>(ge);
+ 	xDelete<int>(vertexpidlist);
+ 	delete gauss;
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ }/*}}}*/
+-void AdjointHorizAnalysis::GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++void           AdjointHorizAnalysis::GradientJBFS(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++	/*WARNING: We use HO as an estimate for now*/
++	this->GradientJBHO(element,gradient,control_index);
++}/*}}}*/
++void           AdjointHorizAnalysis::GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+ 	/*Intermediaries*/
+ 	int      domaintype;
+@@ -1360,12 +1380,85 @@
+ 	xDelete<int>(vertexpidlist);
+ 	delete gauss;
+ }/*}}}*/
+-void AdjointHorizAnalysis::GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++void           AdjointHorizAnalysis::GradientJBHO(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++	/*Intermediaries*/
++	int      domaintype,dim;
+ 
+-	/*return if floating (gradient is 0)*/
+-	if(element->IsFloating()) return;
++	/*Get domaintype*/
++	element->FindParam(&domaintype,DomainTypeEnum);
+ 
+ 	/*Intermediaries*/
++	IssmDouble Jdet,weight;
++	IssmDouble thickness,dmudB;
++	IssmDouble dvx[3],dvy[3],dadjx[3],dadjy[3]; 
++	IssmDouble *xyz_list= NULL;
++
++	/*Fetch number of vertices for this finite element*/
++	int numvertices = element->GetNumberOfVertices();
++
++	/*Initialize some vectors*/
++	IssmDouble* basis         = xNew<IssmDouble>(numvertices);
++	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
++	int*        vertexpidlist = xNew<int>(numvertices);
++
++	/*Retrieve all inputs we will be needing: */
++	element->GetVerticesCoordinates(&xyz_list);
++	element->GradientIndexing(&vertexpidlist[0],control_index);
++	Input* thickness_input = element->GetInput(ThicknessEnum);             _assert_(thickness_input);
++	Input* vx_input        = element->GetInput(VxEnum);                    _assert_(vx_input);
++	Input* vy_input        = NULL;
++	Input* adjointx_input  = element->GetInput(AdjointxEnum);              _assert_(adjointx_input);
++	Input* adjointy_input  = NULL;
++	Input* rheologyb_input = element->GetInput(MaterialsRheologyBEnum); _assert_(rheologyb_input);
++	if(domaintype!=Domain2DverticalEnum){
++		vy_input        = element->GetInput(VyEnum);                   _assert_(vy_input);
++		adjointy_input  = element->GetInput(AdjointyEnum);             _assert_(adjointy_input);
++	}
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGauss(4);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		thickness_input->GetInputValue(&thickness,gauss);
++		vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
++		adjointx_input->GetInputDerivativeValue(&dadjx[0],xyz_list,gauss);
++		dim=2;
++		if(domaintype!=Domain2DverticalEnum){
++			adjointy_input->GetInputDerivativeValue(&dadjy[0],xyz_list, gauss);
++			vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
++			dim=3;
++		}
++
++		element->dViscositydBHO(&dmudB,dim,xyz_list,gauss,vx_input,vy_input);
++
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		element->NodalFunctionsP1(basis,gauss);
++
++		/*Build gradient vector (actually -dJ/dB): */
++		for(int i=0;i<numvertices;i++){
++			if(domaintype!=Domain2DverticalEnum){
++				ge[i]+=-dmudB*thickness*(
++							(2*dvx[0]+dvy[1])*2*dadjx[0]+(dvx[1]+dvy[0])*(dadjx[1]+dadjy[0])+(2*dvy[1]+dvx[0])*2*dadjy[1]
++							)*Jdet*gauss->weight*basis[i];
++			}
++			else{
++				ge[i]+=-dmudB*thickness*4*dvx[0]*dadjx[0]*Jdet*gauss->weight*basis[i];
++			}
++			_assert_(!xIsNan<IssmDouble>(ge[i]));
++		}
++	}
++	gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(basis);
++	xDelete<IssmDouble>(ge);
++	xDelete<int>(vertexpidlist);
++	delete gauss;
++}/*}}}*/
++void           AdjointHorizAnalysis::GradientJBSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++
++	/*Intermediaries*/
+ 	int      domaintype,dim;
+ 	Element* basalelement;
+ 
+@@ -1391,8 +1484,8 @@
+ 
+ 	/*Intermediaries*/
+ 	IssmDouble Jdet,weight;
+-	IssmDouble drag,dalpha2dk;
+-	IssmDouble vx,vy,lambda,mu;
++	IssmDouble thickness,dmudB;
++	IssmDouble dvx[3],dvy[3],dadjx[3],dadjy[3]; 
+ 	IssmDouble *xyz_list= NULL;
+ 
+ 	/*Fetch number of vertices for this finite element*/
+@@ -1403,37 +1496,37 @@
+ 	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
+ 	int*        vertexpidlist = xNew<int>(numvertices);
+ 
+-	/*Build friction element, needed later: */
+-	Friction* friction=new Friction(basalelement,dim);
+-
+ 	/*Retrieve all inputs we will be needing: */
+ 	basalelement->GetVerticesCoordinates(&xyz_list);
+ 	basalelement->GradientIndexing(&vertexpidlist[0],control_index);
+-	Input* vx_input        = basalelement->GetInput(VxEnum);                   _assert_(vx_input);
+-	Input* vy_input        = basalelement->GetInput(VyEnum);                   _assert_(vy_input);
+-	Input* adjointx_input  = basalelement->GetInput(AdjointxEnum);             _assert_(adjointx_input);
+-	Input* adjointy_input  = basalelement->GetInput(AdjointyEnum);             _assert_(adjointy_input);
+-	Input* dragcoeff_input = basalelement->GetInput(FrictionCoefficientEnum);  _assert_(dragcoeff_input);
++	Input* thickness_input = basalelement->GetInput(ThicknessEnum);             _assert_(thickness_input);
++	Input* vx_input        = basalelement->GetInput(VxEnum);                    _assert_(vx_input);
++	Input* vy_input        = basalelement->GetInput(VyEnum);                    _assert_(vy_input);
++	Input* adjointx_input  = basalelement->GetInput(AdjointxEnum);              _assert_(adjointx_input);
++	Input* adjointy_input  = basalelement->GetInput(AdjointyEnum);              _assert_(adjointy_input);
++	Input* rheologyb_input = basalelement->GetInput(MaterialsRheologyBEnum); _assert_(rheologyb_input);
+ 
+ 	/* Start  looping on the number of gaussian points: */
+ 	Gauss* gauss=basalelement->NewGauss(4);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 		gauss->GaussPoint(ig);
+ 
+-		adjointx_input->GetInputValue(&lambda, gauss);
+-		adjointy_input->GetInputValue(&mu, gauss);
+-		vx_input->GetInputValue(&vx,gauss);
+-		vy_input->GetInputValue(&vy,gauss);
+-		dragcoeff_input->GetInputValue(&drag, gauss);
++		thickness_input->GetInputValue(&thickness,gauss);
++		vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
++		vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
++		adjointx_input->GetInputDerivativeValue(&dadjx[0],xyz_list,gauss);
++		adjointy_input->GetInputDerivativeValue(&dadjy[0],xyz_list,gauss);
+ 
+-		friction->GetAlphaComplement(&dalpha2dk,gauss);
++		basalelement->dViscositydBSSA(&dmudB,dim,xyz_list,gauss,vx_input,vy_input);
+ 
+ 		basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
+ 		basalelement->NodalFunctionsP1(basis,gauss);
+ 
+-		/*Build gradient vector (actually -dJ/dD): */
++		/*Build gradient vector (actually -dJ/dB): */
+ 		for(int i=0;i<numvertices;i++){
+-			ge[i]+=-2.*drag*dalpha2dk*((lambda*vx+mu*vy))*Jdet*gauss->weight*basis[i];
++			ge[i]+=-dmudB*thickness*(
++						(2*dvx[0]+dvy[1])*2*dadjx[0]+(dvx[1]+dvy[0])*(dadjx[1]+dadjy[0])+(2*dvy[1]+dvx[0])*2*dadjy[1]
++						)*Jdet*gauss->weight*basis[i];
+ 			_assert_(!xIsNan<IssmDouble>(ge[i]));
+ 		}
+ 	}
+@@ -1445,89 +1538,91 @@
+ 	xDelete<IssmDouble>(ge);
+ 	xDelete<int>(vertexpidlist);
+ 	delete gauss;
+-	delete friction;
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ }/*}}}*/
+-void AdjointHorizAnalysis::GradientJDragL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++void           AdjointHorizAnalysis::GradientJDragGradient(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+-	/*Same as SSA*/
+-	return this->GradientJDragSSA(element,gradient,control_index);
+-}/*}}}*/
+-void AdjointHorizAnalysis::GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+-
+-	/*return if floating or not on bed (gradient is 0)*/
++	/*return if floating (gradient is 0)*/
+ 	if(element->IsFloating()) return;
+-	if(!element->IsOnBase()) return;
+ 
+ 	/*Intermediaries*/
++	int      domaintype,dim;
++	Element* basalelement;
++
++	/*Get basal element*/
++	element->FindParam(&domaintype,DomainTypeEnum);
++	switch(domaintype){
++		case Domain2DhorizontalEnum:
++			basalelement = element;
++			dim          = 2;
++			break;
++		case Domain2DverticalEnum:
++			if(!element->IsOnBase()) return;
++			basalelement = element->SpawnBasalElement();
++			dim          = 1;
++			break;
++		case Domain3DEnum:
++			if(!element->IsOnBase()) return;
++			basalelement = element->SpawnBasalElement();
++			dim          = 2;
++			break;
++		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
++	}
++
++	/*Intermediaries*/
+ 	IssmDouble Jdet,weight;
+-	IssmDouble drag,dalpha2dk;
+-	IssmDouble vx,vy,lambda,mu;
+-	IssmDouble *xyz_list_base= NULL;
++	IssmDouble dk[3]; 
++	IssmDouble *xyz_list= NULL;
+ 
+-	int      domaintype,dim;
+-	element->FindParam(&domaintype,DomainTypeEnum);
+ 	/*Fetch number of vertices for this finite element*/
+-	int numvertices = element->GetNumberOfVertices();
++	int numvertices = basalelement->GetNumberOfVertices();
+ 
+ 	/*Initialize some vectors*/
+-	IssmDouble* basis         = xNew<IssmDouble>(numvertices);
++	IssmDouble* dbasis        = xNew<IssmDouble>(2*numvertices);
+ 	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
+ 	int*        vertexpidlist = xNew<int>(numvertices);
+ 
+-	/*Build friction element, needed later: */
+-	if(domaintype!=Domain2DverticalEnum) dim=3;
+-	else dim=2;
+-	Friction* friction=new Friction(element,dim);
++	/*Retrieve all inputs we will be needing: */
++	basalelement->GetVerticesCoordinates(&xyz_list);
++	basalelement->GradientIndexing(&vertexpidlist[0],control_index);
++	Input* dragcoefficient_input = basalelement->GetInput(FrictionCoefficientEnum);                _assert_(dragcoefficient_input);
++	Input* weights_input         = basalelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+ 
+-	/*Retrieve all inputs we will be needing: */
+-	element->GetVerticesCoordinatesBase(&xyz_list_base);
+-	element->GradientIndexing(&vertexpidlist[0],control_index);
+-	Input* vx_input        = element->GetInput(VxEnum);                   _assert_(vx_input);
+-	Input* vy_input        = NULL;
+-	Input* adjointx_input  = element->GetInput(AdjointxEnum);             _assert_(adjointx_input);
+-	Input* adjointy_input  = NULL;
+-	Input* dragcoeff_input = element->GetInput(FrictionCoefficientEnum);  _assert_(dragcoeff_input);
+-	if(domaintype!=Domain2DverticalEnum){
+-		vy_input        = element->GetInput(VyEnum);                   _assert_(vy_input);
+-		adjointy_input  = element->GetInput(AdjointyEnum);             _assert_(adjointy_input);
+-	}
+ 	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=element->NewGaussBase(4);
++	Gauss* gauss=basalelement->NewGauss(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 		gauss->GaussPoint(ig);
+ 
+-		adjointx_input->GetInputValue(&lambda, gauss);
+-		vx_input->GetInputValue(&vx,gauss);
+-		if(domaintype!=Domain2DverticalEnum){
+-			adjointy_input->GetInputValue(&mu, gauss);
+-			vy_input->GetInputValue(&vy,gauss);
+-		}
+-		dragcoeff_input->GetInputValue(&drag, gauss);
++		basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		basalelement->NodalFunctionsP1Derivatives(dbasis,xyz_list,gauss);
++		weights_input->GetInputValue(&weight,gauss,DragCoefficientAbsGradientEnum);
+ 
+-		friction->GetAlphaComplement(&dalpha2dk,gauss);
++		/*Build alpha_complement_list: */
++		dragcoefficient_input->GetInputDerivativeValue(&dk[0],xyz_list,gauss);
+ 
+-		element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
+-		element->NodalFunctionsP1(basis,gauss);
+-
+-		/*Build gradient vector (actually -dJ/dD): */
++		/*Build gradient vector (actually -dJ/ddrag): */
+ 		for(int i=0;i<numvertices;i++){
+-			if(domaintype!=Domain2DverticalEnum) ge[i]+=-2.*drag*dalpha2dk*((lambda*vx+mu*vy))*Jdet*gauss->weight*basis[i];
+-			else ge[i]+=-2.*drag*dalpha2dk*(lambda*vx)*Jdet*gauss->weight*basis[i];
++			if(dim==2){
++				ge[i]+=-weight*Jdet*gauss->weight*(dbasis[0*numvertices+i]*dk[0]+dbasis[1*numvertices+i]*dk[1]);
++			}
++			else{
++				ge[i]+=-weight*Jdet*gauss->weight*dbasis[0*numvertices+i]*dk[0];
++			}
+ 			_assert_(!xIsNan<IssmDouble>(ge[i]));
+ 		}
+ 	}
+ 	gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
+ 
+ 	/*Clean up and return*/
+-	xDelete<IssmDouble>(xyz_list_base);
+-	xDelete<IssmDouble>(basis);
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(dbasis);
+ 	xDelete<IssmDouble>(ge);
+ 	xDelete<int>(vertexpidlist);
+ 	delete gauss;
+-	delete friction;
++	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
++
+ }/*}}}*/
+-void AdjointHorizAnalysis::GradientJDragFS(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++void           AdjointHorizAnalysis::GradientJDragFS(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+ 	/*return if floating or not on bed (gradient is 0)*/
+ 	if(element->IsFloating()) return;
+@@ -1623,106 +1718,90 @@
+ 	delete gauss;
+ 	delete friction;
+ }/*}}}*/
+-void AdjointHorizAnalysis::GradientJBbarSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++void           AdjointHorizAnalysis::GradientJDragL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+-	/*Intermediaries*/
+-	int      domaintype,dim;
+-	Element* basalelement;
++	/*Same as SSA*/
++	return this->GradientJDragSSA(element,gradient,control_index);
++}/*}}}*/
++void           AdjointHorizAnalysis::GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+-	/*Get basal element*/
+-	element->FindParam(&domaintype,DomainTypeEnum);
+-	switch(domaintype){
+-		case Domain2DhorizontalEnum:
+-			basalelement = element;
+-			dim          = 2;
+-			break;
+-		case Domain2DverticalEnum:
+-			if(!element->IsOnBase()) return;
+-			basalelement = element->SpawnBasalElement();
+-			dim          = 1;
+-			break;
+-		case Domain3DEnum:
+-			if(!element->IsOnBase()) return;
+-			basalelement = element->SpawnBasalElement();
+-			dim          = 2;
+-			break;
+-		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+-	}
++	/*return if floating or not on bed (gradient is 0)*/
++	if(element->IsFloating()) return;
++	if(!element->IsOnBase()) return;
+ 
+ 	/*Intermediaries*/
+ 	IssmDouble Jdet,weight;
+-	IssmDouble thickness,dmudB;
+-	IssmDouble dvx[3],dvy[3],dadjx[3],dadjy[3]; 
+-	IssmDouble *xyz_list= NULL;
++	IssmDouble drag,dalpha2dk;
++	IssmDouble vx,vy,lambda,mu;
++	IssmDouble *xyz_list_base= NULL;
+ 
++	int      domaintype,dim;
++	element->FindParam(&domaintype,DomainTypeEnum);
+ 	/*Fetch number of vertices for this finite element*/
+-	int numvertices = basalelement->GetNumberOfVertices();
++	int numvertices = element->GetNumberOfVertices();
+ 
+ 	/*Initialize some vectors*/
+ 	IssmDouble* basis         = xNew<IssmDouble>(numvertices);
+ 	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
+ 	int*        vertexpidlist = xNew<int>(numvertices);
+ 
++	/*Build friction element, needed later: */
++	if(domaintype!=Domain2DverticalEnum) dim=3;
++	else dim=2;
++	Friction* friction=new Friction(element,dim);
++
+ 	/*Retrieve all inputs we will be needing: */
+-	basalelement->GetVerticesCoordinates(&xyz_list);
+-	basalelement->GradientIndexing(&vertexpidlist[0],control_index);
+-	Input* thickness_input = basalelement->GetInput(ThicknessEnum);             _assert_(thickness_input);
+-	Input* vx_input        = basalelement->GetInput(VxEnum);                    _assert_(vx_input);
+-	Input* vy_input        = basalelement->GetInput(VyEnum);                    _assert_(vy_input);
+-	Input* adjointx_input  = basalelement->GetInput(AdjointxEnum);              _assert_(adjointx_input);
+-	Input* adjointy_input  = basalelement->GetInput(AdjointyEnum);              _assert_(adjointy_input);
+-	Input* rheologyb_input = basalelement->GetInput(MaterialsRheologyBbarEnum); _assert_(rheologyb_input);
+-
++	element->GetVerticesCoordinatesBase(&xyz_list_base);
++	element->GradientIndexing(&vertexpidlist[0],control_index);
++	Input* vx_input        = element->GetInput(VxEnum);                   _assert_(vx_input);
++	Input* vy_input        = NULL;
++	Input* adjointx_input  = element->GetInput(AdjointxEnum);             _assert_(adjointx_input);
++	Input* adjointy_input  = NULL;
++	Input* dragcoeff_input = element->GetInput(FrictionCoefficientEnum);  _assert_(dragcoeff_input);
++	if(domaintype!=Domain2DverticalEnum){
++		vy_input        = element->GetInput(VyEnum);                   _assert_(vy_input);
++		adjointy_input  = element->GetInput(AdjointyEnum);             _assert_(adjointy_input);
++	}
+ 	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=basalelement->NewGauss(4);
++	Gauss* gauss=element->NewGaussBase(4);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 		gauss->GaussPoint(ig);
+ 
+-		thickness_input->GetInputValue(&thickness,gauss);
+-		vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
+-		vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
+-		adjointx_input->GetInputDerivativeValue(&dadjx[0],xyz_list,gauss);
+-		adjointy_input->GetInputDerivativeValue(&dadjy[0],xyz_list,gauss);
++		adjointx_input->GetInputValue(&lambda, gauss);
++		vx_input->GetInputValue(&vx,gauss);
++		if(domaintype!=Domain2DverticalEnum){
++			adjointy_input->GetInputValue(&mu, gauss);
++			vy_input->GetInputValue(&vy,gauss);
++		}
++		dragcoeff_input->GetInputValue(&drag, gauss);
+ 
+-		basalelement->dViscositydBSSA(&dmudB,dim,xyz_list,gauss,vx_input,vy_input);
++		friction->GetAlphaComplement(&dalpha2dk,gauss);
+ 
+-		basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		basalelement->NodalFunctionsP1(basis,gauss);
++		element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
++		element->NodalFunctionsP1(basis,gauss);
+ 
+-		/*Build gradient vector (actually -dJ/dB): */
++		/*Build gradient vector (actually -dJ/dD): */
+ 		for(int i=0;i<numvertices;i++){
+-			ge[i]+=-dmudB*thickness*(
+-						(2*dvx[0]+dvy[1])*2*dadjx[0]+(dvx[1]+dvy[0])*(dadjx[1]+dadjy[0])+(2*dvy[1]+dvx[0])*2*dadjy[1]
+-						)*Jdet*gauss->weight*basis[i];
++			if(domaintype!=Domain2DverticalEnum) ge[i]+=-2.*drag*dalpha2dk*((lambda*vx+mu*vy))*Jdet*gauss->weight*basis[i];
++			else ge[i]+=-2.*drag*dalpha2dk*(lambda*vx)*Jdet*gauss->weight*basis[i];
+ 			_assert_(!xIsNan<IssmDouble>(ge[i]));
+ 		}
+ 	}
+ 	gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
+ 
+ 	/*Clean up and return*/
+-	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(xyz_list_base);
+ 	xDelete<IssmDouble>(basis);
+ 	xDelete<IssmDouble>(ge);
+ 	xDelete<int>(vertexpidlist);
+ 	delete gauss;
+-	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
++	delete friction;
+ }/*}}}*/
+-void AdjointHorizAnalysis::GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++void           AdjointHorizAnalysis::GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+-	   /*Same as SSA*/
+-	   return this->GradientJBbarSSA(element,gradient,control_index);
+-}/*}}}*/
+-void AdjointHorizAnalysis::GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++	/*return if floating (gradient is 0)*/
++	if(element->IsFloating()) return;
+ 
+-	/*WARNING: We use SSA as an estimate for now*/
+-	this->GradientJBbarSSA(element,gradient,control_index);
+-}/*}}}*/
+-void AdjointHorizAnalysis::GradientJBbarFS(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+-	/*WARNING: We use SSA as an estimate for now*/
+-	this->GradientJBbarSSA(element,gradient,control_index);
+-}/*}}}*/
+-void AdjointHorizAnalysis::GradientJBSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+-
+ 	/*Intermediaries*/
+ 	int      domaintype,dim;
+ 	Element* basalelement;
+@@ -1749,8 +1828,8 @@
+ 
+ 	/*Intermediaries*/
+ 	IssmDouble Jdet,weight;
+-	IssmDouble thickness,dmudB;
+-	IssmDouble dvx[3],dvy[3],dadjx[3],dadjy[3]; 
++	IssmDouble drag,dalpha2dk;
++	IssmDouble vx,vy,lambda,mu;
+ 	IssmDouble *xyz_list= NULL;
+ 
+ 	/*Fetch number of vertices for this finite element*/
+@@ -1761,37 +1840,37 @@
+ 	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
+ 	int*        vertexpidlist = xNew<int>(numvertices);
+ 
++	/*Build friction element, needed later: */
++	Friction* friction=new Friction(basalelement,dim);
++
+ 	/*Retrieve all inputs we will be needing: */
+ 	basalelement->GetVerticesCoordinates(&xyz_list);
+ 	basalelement->GradientIndexing(&vertexpidlist[0],control_index);
+-	Input* thickness_input = basalelement->GetInput(ThicknessEnum);             _assert_(thickness_input);
+-	Input* vx_input        = basalelement->GetInput(VxEnum);                    _assert_(vx_input);
+-	Input* vy_input        = basalelement->GetInput(VyEnum);                    _assert_(vy_input);
+-	Input* adjointx_input  = basalelement->GetInput(AdjointxEnum);              _assert_(adjointx_input);
+-	Input* adjointy_input  = basalelement->GetInput(AdjointyEnum);              _assert_(adjointy_input);
+-	Input* rheologyb_input = basalelement->GetInput(MaterialsRheologyBEnum); _assert_(rheologyb_input);
++	Input* vx_input        = basalelement->GetInput(VxEnum);                   _assert_(vx_input);
++	Input* vy_input        = basalelement->GetInput(VyEnum);                   _assert_(vy_input);
++	Input* adjointx_input  = basalelement->GetInput(AdjointxEnum);             _assert_(adjointx_input);
++	Input* adjointy_input  = basalelement->GetInput(AdjointyEnum);             _assert_(adjointy_input);
++	Input* dragcoeff_input = basalelement->GetInput(FrictionCoefficientEnum);  _assert_(dragcoeff_input);
+ 
+ 	/* Start  looping on the number of gaussian points: */
+ 	Gauss* gauss=basalelement->NewGauss(4);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 		gauss->GaussPoint(ig);
+ 
+-		thickness_input->GetInputValue(&thickness,gauss);
+-		vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
+-		vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
+-		adjointx_input->GetInputDerivativeValue(&dadjx[0],xyz_list,gauss);
+-		adjointy_input->GetInputDerivativeValue(&dadjy[0],xyz_list,gauss);
++		adjointx_input->GetInputValue(&lambda, gauss);
++		adjointy_input->GetInputValue(&mu, gauss);
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		dragcoeff_input->GetInputValue(&drag, gauss);
+ 
+-		basalelement->dViscositydBSSA(&dmudB,dim,xyz_list,gauss,vx_input,vy_input);
++		friction->GetAlphaComplement(&dalpha2dk,gauss);
+ 
+ 		basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
+ 		basalelement->NodalFunctionsP1(basis,gauss);
+ 
+-		/*Build gradient vector (actually -dJ/dB): */
++		/*Build gradient vector (actually -dJ/dD): */
+ 		for(int i=0;i<numvertices;i++){
+-			ge[i]+=-dmudB*thickness*(
+-						(2*dvx[0]+dvy[1])*2*dadjx[0]+(dvx[1]+dvy[0])*(dadjx[1]+dadjy[0])+(2*dvy[1]+dvx[0])*2*dadjy[1]
+-						)*Jdet*gauss->weight*basis[i];
++			ge[i]+=-2.*drag*dalpha2dk*((lambda*vx+mu*vy))*Jdet*gauss->weight*basis[i];
+ 			_assert_(!xIsNan<IssmDouble>(ge[i]));
+ 		}
+ 	}
+@@ -1803,91 +1882,12 @@
+ 	xDelete<IssmDouble>(ge);
+ 	xDelete<int>(vertexpidlist);
+ 	delete gauss;
++	delete friction;
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ }/*}}}*/
+-void AdjointHorizAnalysis::GradientJBHO(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+-	/*Intermediaries*/
+-	int      domaintype,dim;
++void           AdjointHorizAnalysis::GradientJDSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+-	/*Get domaintype*/
+-	element->FindParam(&domaintype,DomainTypeEnum);
+-
+ 	/*Intermediaries*/
+-	IssmDouble Jdet,weight;
+-	IssmDouble thickness,dmudB;
+-	IssmDouble dvx[3],dvy[3],dadjx[3],dadjy[3]; 
+-	IssmDouble *xyz_list= NULL;
+-
+-	/*Fetch number of vertices for this finite element*/
+-	int numvertices = element->GetNumberOfVertices();
+-
+-	/*Initialize some vectors*/
+-	IssmDouble* basis         = xNew<IssmDouble>(numvertices);
+-	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
+-	int*        vertexpidlist = xNew<int>(numvertices);
+-
+-	/*Retrieve all inputs we will be needing: */
+-	element->GetVerticesCoordinates(&xyz_list);
+-	element->GradientIndexing(&vertexpidlist[0],control_index);
+-	Input* thickness_input = element->GetInput(ThicknessEnum);             _assert_(thickness_input);
+-	Input* vx_input        = element->GetInput(VxEnum);                    _assert_(vx_input);
+-	Input* vy_input        = NULL;
+-	Input* adjointx_input  = element->GetInput(AdjointxEnum);              _assert_(adjointx_input);
+-	Input* adjointy_input  = NULL;
+-	Input* rheologyb_input = element->GetInput(MaterialsRheologyBEnum); _assert_(rheologyb_input);
+-	if(domaintype!=Domain2DverticalEnum){
+-		vy_input        = element->GetInput(VyEnum);                   _assert_(vy_input);
+-		adjointy_input  = element->GetInput(AdjointyEnum);             _assert_(adjointy_input);
+-	}
+-	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=element->NewGauss(4);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		thickness_input->GetInputValue(&thickness,gauss);
+-		vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
+-		adjointx_input->GetInputDerivativeValue(&dadjx[0],xyz_list,gauss);
+-		dim=2;
+-		if(domaintype!=Domain2DverticalEnum){
+-			adjointy_input->GetInputDerivativeValue(&dadjy[0],xyz_list, gauss);
+-			vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
+-			dim=3;
+-		}
+-
+-		element->dViscositydBHO(&dmudB,dim,xyz_list,gauss,vx_input,vy_input);
+-
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		element->NodalFunctionsP1(basis,gauss);
+-
+-		/*Build gradient vector (actually -dJ/dB): */
+-		for(int i=0;i<numvertices;i++){
+-			if(domaintype!=Domain2DverticalEnum){
+-				ge[i]+=-dmudB*thickness*(
+-							(2*dvx[0]+dvy[1])*2*dadjx[0]+(dvx[1]+dvy[0])*(dadjx[1]+dadjy[0])+(2*dvy[1]+dvx[0])*2*dadjy[1]
+-							)*Jdet*gauss->weight*basis[i];
+-			}
+-			else{
+-				ge[i]+=-dmudB*thickness*4*dvx[0]*dadjx[0]*Jdet*gauss->weight*basis[i];
+-			}
+-			_assert_(!xIsNan<IssmDouble>(ge[i]));
+-		}
+-	}
+-	gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
+-
+-	/*Clean up and return*/
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(basis);
+-	xDelete<IssmDouble>(ge);
+-	xDelete<int>(vertexpidlist);
+-	delete gauss;
+-}/*}}}*/
+-void AdjointHorizAnalysis::GradientJBFS(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+-	/*WARNING: We use HO as an estimate for now*/
+-	this->GradientJBHO(element,gradient,control_index);
+-}/*}}}*/
+-void AdjointHorizAnalysis::GradientJDSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+-
+-	/*Intermediaries*/
+ 	int      domaintype,dim;
+ 	Element* basalelement;
+ 
+@@ -1968,7 +1968,7 @@
+ 	delete gauss;
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ }/*}}}*/
+-void AdjointHorizAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           AdjointHorizAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 	int approximation;
+ 	element->GetInputValue(&approximation,ApproximationEnum);
+ 	if(approximation==FSApproximationEnum || approximation==NoneApproximationEnum){
+@@ -1978,53 +1978,7 @@
+ 		InputUpdateFromSolutionHoriz(solution,element);
+ 	}
+ }/*}}}*/
+-void AdjointHorizAnalysis::InputUpdateFromSolutionHoriz(IssmDouble* solution,Element* element){/*{{{*/
+-	int  i;
+-	int* doflist=NULL;
+-
+-	int    domaintype;
+-	element->FindParam(&domaintype,DomainTypeEnum);
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-	int numdof;
+-	if(domaintype!=Domain2DverticalEnum)  numdof   = numnodes*2;
+-	else			                          numdof   = numnodes*1;
+-	/*Fetch dof list and allocate solution vectors*/
+-	element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
+-	IssmDouble* values  = xNew<IssmDouble>(numdof);
+-	IssmDouble* lambdax = xNew<IssmDouble>(numnodes);
+-	IssmDouble* lambday = xNew<IssmDouble>(numnodes);
+-
+-	/*Use the dof list to index into the solution vector: */
+-	for(i=0;i<numdof;i++) values[i]=solution[doflist[i]];
+-
+-	/*Transform solution in Cartesian Space*/
+-	if(domaintype!=Domain2DverticalEnum)	element->TransformSolutionCoord(&values[0],XYEnum);
+-
+-	/*Ok, we have vx and vy in values, fill in vx and vy arrays: */
+-	for(i=0;i<numnodes;i++){
+-		if(domaintype!=Domain2DverticalEnum){
+-			lambdax[i]=values[i*NDOF2+0];
+-			lambday[i]=values[i*NDOF2+1];
+-		}
+-		else {lambdax[i]=values[i];lambday[i]=0;}
+-		/*Check solution*/
+-		if(xIsNan<IssmDouble>(lambdax[i])) _error_("NaN found in solution vector");
+-		if(domaintype!=Domain2DverticalEnum && xIsNan<IssmDouble>(lambday[i])) _error_("NaN found in solution vector");
+-	}
+-
+-	/*Add vx and vy as inputs to the tria element: */
+-	element->AddInput(AdjointxEnum,lambdax,element->GetElementType());
+-	element->AddInput(AdjointyEnum,lambday,element->GetElementType());
+-
+-	/*Free ressources:*/
+-	xDelete<IssmDouble>(values);
+-	xDelete<IssmDouble>(lambdax);
+-	xDelete<IssmDouble>(lambday);
+-	xDelete<int>(doflist);
+-}/*}}}*/
+-void AdjointHorizAnalysis::InputUpdateFromSolutionFS(IssmDouble* solution,Element* element){/*{{{*/
++void           AdjointHorizAnalysis::InputUpdateFromSolutionFS(IssmDouble* solution,Element* element){/*{{{*/
+ 	int          i,fe_FS;
+ 	int*         vdoflist=NULL;
+ 	int*         pdoflist=NULL;
+@@ -2110,7 +2064,53 @@
+ 	xDelete<IssmDouble>(lambdax);
+ 	xDelete<IssmDouble>(values);
+ }/*}}}*/
+-void AdjointHorizAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           AdjointHorizAnalysis::InputUpdateFromSolutionHoriz(IssmDouble* solution,Element* element){/*{{{*/
++	int  i;
++	int* doflist=NULL;
++
++	int    domaintype;
++	element->FindParam(&domaintype,DomainTypeEnum);
++
++	/*Fetch number of nodes and dof for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++	int numdof;
++	if(domaintype!=Domain2DverticalEnum)  numdof   = numnodes*2;
++	else			                          numdof   = numnodes*1;
++	/*Fetch dof list and allocate solution vectors*/
++	element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
++	IssmDouble* values  = xNew<IssmDouble>(numdof);
++	IssmDouble* lambdax = xNew<IssmDouble>(numnodes);
++	IssmDouble* lambday = xNew<IssmDouble>(numnodes);
++
++	/*Use the dof list to index into the solution vector: */
++	for(i=0;i<numdof;i++) values[i]=solution[doflist[i]];
++
++	/*Transform solution in Cartesian Space*/
++	if(domaintype!=Domain2DverticalEnum)	element->TransformSolutionCoord(&values[0],XYEnum);
++
++	/*Ok, we have vx and vy in values, fill in vx and vy arrays: */
++	for(i=0;i<numnodes;i++){
++		if(domaintype!=Domain2DverticalEnum){
++			lambdax[i]=values[i*NDOF2+0];
++			lambday[i]=values[i*NDOF2+1];
++		}
++		else {lambdax[i]=values[i];lambday[i]=0;}
++		/*Check solution*/
++		if(xIsNan<IssmDouble>(lambdax[i])) _error_("NaN found in solution vector");
++		if(domaintype!=Domain2DverticalEnum && xIsNan<IssmDouble>(lambday[i])) _error_("NaN found in solution vector");
++	}
++
++	/*Add vx and vy as inputs to the tria element: */
++	element->AddInput(AdjointxEnum,lambdax,element->GetElementType());
++	element->AddInput(AdjointyEnum,lambday,element->GetElementType());
++
++	/*Free ressources:*/
++	xDelete<IssmDouble>(values);
++	xDelete<IssmDouble>(lambdax);
++	xDelete<IssmDouble>(lambday);
++	xDelete<int>(doflist);
++}/*}}}*/
++void           AdjointHorizAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/MeltingAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/MeltingAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/MeltingAnalysis.h	(revision 18930)
+@@ -12,12 +12,12 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+@@ -25,9 +25,9 @@
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/SmoothAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SmoothAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/SmoothAnalysis.h	(revision 18930)
+@@ -12,12 +12,12 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+@@ -25,9 +25,9 @@
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.h	(revision 18930)
+@@ -12,12 +12,12 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+@@ -25,9 +25,9 @@
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18930)
+@@ -10,14 +10,24 @@
+ #include "../modules/modules.h"
+ #include "../solutionsequences/solutionsequences.h"
+ 
+-int LevelsetAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+-	return 1;
++void LevelsetAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++	return;
+ }
+ /*}}}*/
+-void LevelsetAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++void LevelsetAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+ 	return;
++}/*}}}*/
++void LevelsetAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++	int finiteelement=P1Enum;
++	if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++	::CreateNodes(nodes,iomodel,LevelsetAnalysisEnum,finiteelement);
++	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+ }
+ /*}}}*/
++int  LevelsetAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
++	return 1;
++}
++/*}}}*/
+ void LevelsetAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	/*Finite element type*/
+@@ -59,23 +69,13 @@
+ 	}
+ }
+ /*}}}*/
+-void LevelsetAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-	int finiteelement=P1Enum;
+-	if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-	::CreateNodes(nodes,iomodel,LevelsetAnalysisEnum,finiteelement);
+-	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-}
+-/*}}}*/
+-void LevelsetAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++void LevelsetAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ 	return;
+ }
+ /*}}}*/
+-void LevelsetAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+-	return;
+-}/*}}}*/
+ 
+ /*Finite element Analysis*/
+-void LevelsetAnalysis::Core(FemModel* femmodel){/*{{{*/
++void           LevelsetAnalysis::Core(FemModel* femmodel){/*{{{*/
+ 
+ 	#if !defined(_DEVELOPMENT_)
+ 	_error_("Not implemented yet");
+@@ -403,31 +403,7 @@
+ 
+ 	return pe;
+ }/*}}}*/
+-void LevelsetAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+-	_error_("not implemented yet");
+-}/*}}}*/
+-void LevelsetAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+-	_error_("Not implemented yet");
+-}/*}}}*/
+-void LevelsetAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+-
+-	int domaintype;
+-	element->FindParam(&domaintype,DomainTypeEnum);
+-	switch(domaintype){
+-		case Domain2DhorizontalEnum:
+-			element->InputUpdateFromSolutionOneDof(solution,MaskIceLevelsetEnum);
+-			break;
+-		case Domain3DEnum:
+-			element->InputUpdateFromSolutionOneDofCollapsed(solution,MaskIceLevelsetEnum);
+-			break;
+-		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+-	}
+-}/*}}}*/
+-void LevelsetAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+-	/*Default, do nothing*/
+-	return;
+-}/*}}}*/
+-void LevelsetAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           LevelsetAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
+ 	 * For node i, Bi can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -454,7 +430,7 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(basis);
+ }/*}}}*/
+-void LevelsetAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           LevelsetAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 
+ 	 * For node i, Bi' can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -482,8 +458,52 @@
+ 	xDelete<IssmDouble>(dbasis);
+ 
+ }/*}}}*/
+-void LevelsetAnalysis::SetDistanceOnIntersectedElements(FemModel* femmodel){/*{{{*/
++IssmDouble     LevelsetAnalysis::GetDistanceToStraight(IssmDouble* q, IssmDouble* s0, IssmDouble* s1){/*{{{*/
++	// returns distance d of point q to straight going through points s0, s1
++	// d=|a x b|/|b|
++	// with a=q-s0, b=s1-s0
++	
++	/* Intermediaries */
++	const int dim=2;
++	int i;
++	IssmDouble a[dim], b[dim];
++	IssmDouble norm_b;
+ 
++	for(i=0;i<dim;i++){
++		a[i]=q[i]-s0[i];
++		b[i]=s1[i]-s0[i];
++	}
++	
++	norm_b=0.;
++	for(i=0;i<dim;i++)
++		norm_b+=b[i]*b[i];
++	norm_b=sqrt(norm_b);
++	_assert_(norm_b>0.);
++
++	return fabs(a[0]*b[1]-a[1]*b[0])/norm_b;
++}/*}}}*/
++void           LevelsetAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++	_error_("not implemented yet");
++}/*}}}*/
++void           LevelsetAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++	_error_("Not implemented yet");
++}/*}}}*/
++void           LevelsetAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++
++	int domaintype;
++	element->FindParam(&domaintype,DomainTypeEnum);
++	switch(domaintype){
++		case Domain2DhorizontalEnum:
++			element->InputUpdateFromSolutionOneDof(solution,MaskIceLevelsetEnum);
++			break;
++		case Domain3DEnum:
++			element->InputUpdateFromSolutionOneDofCollapsed(solution,MaskIceLevelsetEnum);
++			break;
++		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
++	}
++}/*}}}*/
++void           LevelsetAnalysis::SetDistanceOnIntersectedElements(FemModel* femmodel){/*{{{*/
++
+ 	/* Intermediaries */
+ 	int i,k;
+ 	IssmDouble dmaxp=0.,dmaxm=0,val=0.;
+@@ -538,7 +558,7 @@
+ 	delete vec_dist_zerolevelset;
+ 	delete dist_zerolevelset;
+ }/*}}}*/
+-void LevelsetAnalysis::SetDistanceToZeroLevelsetElement(Vector<IssmDouble>* vec_signed_dist, Element* element){/*{{{*/
++void           LevelsetAnalysis::SetDistanceToZeroLevelsetElement(Vector<IssmDouble>* vec_signed_dist, Element* element){/*{{{*/
+ 
+ 	if(!element->IsZeroLevelset(MaskIceLevelsetEnum))
+ 		return;
+@@ -591,27 +611,7 @@
+ 	xDelete<IssmDouble>(xyz_list);
+ 	xDelete<IssmDouble>(xyz_list_zero);
+ }/*}}}*/
+-IssmDouble LevelsetAnalysis::GetDistanceToStraight(IssmDouble* q, IssmDouble* s0, IssmDouble* s1){/*{{{*/
+-	// returns distance d of point q to straight going through points s0, s1
+-	// d=|a x b|/|b|
+-	// with a=q-s0, b=s1-s0
+-	
+-	/* Intermediaries */
+-	const int dim=2;
+-	int i;
+-	IssmDouble a[dim], b[dim];
+-	IssmDouble norm_b;
+-
+-	for(i=0;i<dim;i++){
+-		a[i]=q[i]-s0[i];
+-		b[i]=s1[i]-s0[i];
+-	}
+-	
+-	norm_b=0.;
+-	for(i=0;i<dim;i++)
+-		norm_b+=b[i]*b[i];
+-	norm_b=sqrt(norm_b);
+-	_assert_(norm_b>0.);
+-
+-	return fabs(a[0]*b[1]-a[1]*b[0])/norm_b;
++void           LevelsetAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++	/*Default, do nothing*/
++	return;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.cpp	(revision 18930)
+@@ -6,51 +6,6 @@
+ #include "../solutionsequences/solutionsequences.h"
+ 
+ /*Model processing*/
+-int  StressbalanceVerticalAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+-	return 1;
+-}/*}}}*/
+-void StressbalanceVerticalAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-
+-	/*No specific parameters*/
+-
+-}/*}}}*/
+-void StressbalanceVerticalAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+-
+-	/*return if not 3d mesh*/
+-	if(iomodel->domaintype!=Domain3DEnum) return;
+-
+-	/*Update elements: */
+-	int counter=0;
+-	for(int i=0;i<iomodel->numberofelements;i++){
+-		if(iomodel->my_elements[i]){
+-			Element* element=(Element*)elements->GetObjectByOffset(counter);
+-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+-			counter++;
+-		}
+-	}
+-
+-	iomodel->FetchDataToInput(elements,ThicknessEnum);
+-	iomodel->FetchDataToInput(elements,SurfaceEnum);
+-	iomodel->FetchDataToInput(elements,BaseEnum);
+-	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
+-	if(iomodel->domaintype!=Domain2DhorizontalEnum){
+-		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
+-		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
+-	}
+-	iomodel->FetchDataToInput(elements,BasalforcingsGroundediceMeltingRateEnum);
+-	iomodel->FetchDataToInput(elements,BasalforcingsFloatingiceMeltingRateEnum);
+-	iomodel->FetchDataToInput(elements,VxEnum,0.);
+-	iomodel->FetchDataToInput(elements,VyEnum,0.);
+-}/*}}}*/
+-void StressbalanceVerticalAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-
+-	/*return if not 3d mesh*/
+-	if(iomodel->domaintype!=Domain3DEnum) return;
+-
+-	iomodel->FetchData(3,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum,FlowequationVertexEquationEnum);
+-	::CreateNodes(nodes,iomodel,StressbalanceVerticalAnalysisEnum,P1Enum);
+-	iomodel->DeleteData(3,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum,FlowequationVertexEquationEnum);
+-}/*}}}*/
+ void StressbalanceVerticalAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+ 
+ 	/*Intermediary*/
+@@ -97,7 +52,52 @@
+ 	/*No loads*/
+ 
+ }/*}}}*/
++void StressbalanceVerticalAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 
++	/*return if not 3d mesh*/
++	if(iomodel->domaintype!=Domain3DEnum) return;
++
++	iomodel->FetchData(3,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum,FlowequationVertexEquationEnum);
++	::CreateNodes(nodes,iomodel,StressbalanceVerticalAnalysisEnum,P1Enum);
++	iomodel->DeleteData(3,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum,FlowequationVertexEquationEnum);
++}/*}}}*/
++int  StressbalanceVerticalAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
++	return 1;
++}/*}}}*/
++void StressbalanceVerticalAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
++
++	/*return if not 3d mesh*/
++	if(iomodel->domaintype!=Domain3DEnum) return;
++
++	/*Update elements: */
++	int counter=0;
++	for(int i=0;i<iomodel->numberofelements;i++){
++		if(iomodel->my_elements[i]){
++			Element* element=(Element*)elements->GetObjectByOffset(counter);
++			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
++			counter++;
++		}
++	}
++
++	iomodel->FetchDataToInput(elements,ThicknessEnum);
++	iomodel->FetchDataToInput(elements,SurfaceEnum);
++	iomodel->FetchDataToInput(elements,BaseEnum);
++	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
++	if(iomodel->domaintype!=Domain2DhorizontalEnum){
++		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
++		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
++	}
++	iomodel->FetchDataToInput(elements,BasalforcingsGroundediceMeltingRateEnum);
++	iomodel->FetchDataToInput(elements,BasalforcingsFloatingiceMeltingRateEnum);
++	iomodel->FetchDataToInput(elements,VxEnum,0.);
++	iomodel->FetchDataToInput(elements,VyEnum,0.);
++}/*}}}*/
++void StressbalanceVerticalAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++
++	/*No specific parameters*/
++
++}/*}}}*/
++
+ /*Finite Element Analysis*/
+ void           StressbalanceVerticalAnalysis::Core(FemModel* femmodel){/*{{{*/
+ 
+@@ -125,47 +125,6 @@
+ 	return Ke;
+ 
+ }/*}}}*/
+-ElementMatrix* StressbalanceVerticalAnalysis::CreateKMatrixVolume(Element* element){/*{{{*/
+-
+-	/*Intermediaries*/
+-	IssmDouble  D,Jdet;
+-	IssmDouble *xyz_list = NULL;
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-
+-	/*Initialize Element matrix and vectors*/
+-	ElementMatrix* Ke     = element->NewElementMatrix(NoneApproximationEnum);
+-	IssmDouble*    B      = xNew<IssmDouble>(numnodes);
+-	IssmDouble*    Bprime = xNew<IssmDouble>(numnodes);
+-
+-	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinates(&xyz_list);
+-
+-	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss = element->NewGauss(2);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		this->GetB(B,element,xyz_list,gauss);
+-		this->GetBprime(Bprime,element,xyz_list,gauss);
+-		D=gauss->weight*Jdet;
+-
+-		TripleMultiply(B,1,numnodes,1,
+-					&D,1,1,0,
+-					Bprime,1,numnodes,0,
+-					&Ke->values[0],1);
+-	}
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(Bprime);
+-	xDelete<IssmDouble>(B);
+-	return Ke;
+-
+-}/*}}}*/
+ ElementMatrix* StressbalanceVerticalAnalysis::CreateKMatrixSurface(Element* element){/*{{{*/
+ 
+ 
+@@ -207,68 +166,57 @@
+ 	xDelete<IssmDouble>(basis);
+ 	return Ke;
+ }/*}}}*/
+-ElementVector* StressbalanceVerticalAnalysis::CreatePVector(Element* element){/*{{{*/
++ElementMatrix* StressbalanceVerticalAnalysis::CreateKMatrixVolume(Element* element){/*{{{*/
+ 
+-	/*compute all load vectors for this element*/
+-	ElementVector* pe1=CreatePVectorVolume(element);
+-	ElementVector* pe2=CreatePVectorBase(element);
+-	ElementVector* pe =new ElementVector(pe1,pe2);
+-
+-	/*clean-up and return*/
+-	delete pe1;
+-	delete pe2;
+-	return pe;
+-}/*}}}*/
+-ElementVector* StressbalanceVerticalAnalysis::CreatePVectorVolume(Element* element){/*{{{*/
+-
+ 	/*Intermediaries*/
+-	int         approximation;
+-	IssmDouble  Jdet,dudx,dvdy,dwdz;
+-	IssmDouble  du[3],dv[3],dw[3];
+-	IssmDouble* xyz_list = NULL;
++	IssmDouble  D,Jdet;
++	IssmDouble *xyz_list = NULL;
+ 
+-	/*Fetch number of nodes for this finite element*/
++	/*Fetch number of nodes and dof for this finite element*/
+ 	int numnodes = element->GetNumberOfNodes();
+ 
+-	/*Initialize Element vector and basis functions*/
+-	ElementVector* pe    = element->NewElementVector();
+-	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
++	/*Initialize Element matrix and vectors*/
++	ElementMatrix* Ke     = element->NewElementMatrix(NoneApproximationEnum);
++	IssmDouble*    B      = xNew<IssmDouble>(numnodes);
++	IssmDouble*    Bprime = xNew<IssmDouble>(numnodes);
+ 
+ 	/*Retrieve all inputs and parameters*/
+ 	element->GetVerticesCoordinates(&xyz_list);
+-	element->GetInputValue(&approximation,ApproximationEnum);
+-	Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input);
+-	Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input);
+-	Input* vzFS_input=NULL;
+-	if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){
+-		vzFS_input=element->GetInput(VzFSEnum); _assert_(vzFS_input);
+-	}
+ 
+ 	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=element->NewGauss(2);
++	Gauss* gauss = element->NewGauss(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+ 		gauss->GaussPoint(ig);
+ 
+ 		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		element->NodalFunctions(basis,gauss);
++		this->GetB(B,element,xyz_list,gauss);
++		this->GetBprime(Bprime,element,xyz_list,gauss);
++		D=gauss->weight*Jdet;
+ 
+-		vx_input->GetInputDerivativeValue(&du[0],xyz_list,gauss);
+-		vy_input->GetInputDerivativeValue(&dv[0],xyz_list,gauss);
+-		if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){
+-			vzFS_input->GetInputDerivativeValue(&dw[0],xyz_list,gauss);
+-			dwdz=dw[2];
+-		}
+-		else dwdz=0;
+-		dudx=du[0];
+-		dvdy=dv[1];
+-
+-		for(int i=0;i<numnodes;i++) pe->values[i] += (dudx+dvdy+dwdz)*Jdet*gauss->weight*basis[i];
++		TripleMultiply(B,1,numnodes,1,
++					&D,1,1,0,
++					Bprime,1,numnodes,0,
++					&Ke->values[0],1);
+ 	}
+ 
+ 	/*Clean up and return*/
+ 	delete gauss;
+-	xDelete<IssmDouble>(basis);
+ 	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(Bprime);
++	xDelete<IssmDouble>(B);
++	return Ke;
++
++}/*}}}*/
++ElementVector* StressbalanceVerticalAnalysis::CreatePVector(Element* element){/*{{{*/
++
++	/*compute all load vectors for this element*/
++	ElementVector* pe1=CreatePVectorVolume(element);
++	ElementVector* pe2=CreatePVectorBase(element);
++	ElementVector* pe =new ElementVector(pe1,pe2);
++
++	/*clean-up and return*/
++	delete pe1;
++	delete pe2;
+ 	return pe;
+ }/*}}}*/
+ ElementVector* StressbalanceVerticalAnalysis::CreatePVectorBase(Element* element){/*{{{*/
+@@ -337,7 +285,59 @@
+ 	xDelete<IssmDouble>(xyz_list_base);
+ 	return pe;
+ }/*}}}*/
+-void StressbalanceVerticalAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++ElementVector* StressbalanceVerticalAnalysis::CreatePVectorVolume(Element* element){/*{{{*/
++
++	/*Intermediaries*/
++	int         approximation;
++	IssmDouble  Jdet,dudx,dvdy,dwdz;
++	IssmDouble  du[3],dv[3],dw[3];
++	IssmDouble* xyz_list = NULL;
++
++	/*Fetch number of nodes for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++
++	/*Initialize Element vector and basis functions*/
++	ElementVector* pe    = element->NewElementVector();
++	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
++
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinates(&xyz_list);
++	element->GetInputValue(&approximation,ApproximationEnum);
++	Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input);
++	Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input);
++	Input* vzFS_input=NULL;
++	if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){
++		vzFS_input=element->GetInput(VzFSEnum); _assert_(vzFS_input);
++	}
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGauss(2);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		element->NodalFunctions(basis,gauss);
++
++		vx_input->GetInputDerivativeValue(&du[0],xyz_list,gauss);
++		vy_input->GetInputDerivativeValue(&dv[0],xyz_list,gauss);
++		if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){
++			vzFS_input->GetInputDerivativeValue(&dw[0],xyz_list,gauss);
++			dwdz=dw[2];
++		}
++		else dwdz=0;
++		dudx=du[0];
++		dvdy=dv[1];
++
++		for(int i=0;i<numnodes;i++) pe->values[i] += (dudx+dvdy+dwdz)*Jdet*gauss->weight*basis[i];
++	}
++
++	/*Clean up and return*/
++	delete gauss;
++	xDelete<IssmDouble>(basis);
++	xDelete<IssmDouble>(xyz_list);
++	return pe;
++}/*}}}*/
++void           StressbalanceVerticalAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*	Compute B  matrix. B=[dh1/dz dh2/dz dh3/dz dh4/dz dh5/dz dh6/dz];
+ 		where hi is the interpolation function for node i.*/
+ 
+@@ -356,18 +356,18 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(dbasis);
+ }/*}}}*/
+-void StressbalanceVerticalAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           StressbalanceVerticalAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 
+ 	element->NodalFunctions(Bprime,gauss);
+ 
+ }/*}}}*/
+-void StressbalanceVerticalAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           StressbalanceVerticalAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	element->GetSolutionFromInputsOneDof(solution,VzEnum);
+ }/*}}}*/
+-void StressbalanceVerticalAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           StressbalanceVerticalAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void StressbalanceVerticalAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           StressbalanceVerticalAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	int          numnodes = element->GetNumberOfNodes();
+ 	int          numdof=numnodes*1;
+@@ -480,7 +480,7 @@
+ 	xDelete<IssmDouble>(xyz_list);
+ 	xDelete<int>(doflist);
+ }/*}}}*/
+-void StressbalanceVerticalAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           StressbalanceVerticalAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/UzawaPressureAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/UzawaPressureAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/UzawaPressureAnalysis.h	(revision 18930)
+@@ -12,12 +12,12 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+@@ -25,10 +25,10 @@
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetM(IssmDouble* M,Element* element,Gauss* gauss);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetM(IssmDouble* M,Element* element,Gauss* gauss);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 18930)
+@@ -5,14 +5,23 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
++void SeaiceAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++
++	const int finiteelement = P1Enum;
++	IoModelToConstraintsx(constraints,iomodel,SeaiceSpcvxEnum,SeaiceAnalysisEnum,finiteelement,0);
++	IoModelToConstraintsx(constraints,iomodel,SeaiceSpcvyEnum,SeaiceAnalysisEnum,finiteelement,1);
++}/*}}}*/
++void SeaiceAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++	return;
++}/*}}}*/
++void SeaiceAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++
++	::CreateNodes(nodes,iomodel,SeaiceAnalysisEnum,P1Enum);
++
++}/*}}}*/
+ int  SeaiceAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+ 	return 2;
+ }/*}}}*/
+-void SeaiceAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-	parameters->AddObject(iomodel->CopyConstantObject(SeaiceMinConcentrationEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(SeaiceMinThicknessEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(SeaiceMaxThicknessEnum));
+-}/*}}}*/
+ void SeaiceAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	/*Make sure we are in 2D horizontal*/
+@@ -48,21 +57,12 @@
+ 	iomodel->FetchDataToInput(elements,MeshXEnum);
+ 	iomodel->FetchDataToInput(elements,MeshYEnum);
+ }/*}}}*/
+-void SeaiceAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-
+-	::CreateNodes(nodes,iomodel,SeaiceAnalysisEnum,P1Enum);
+-
++void SeaiceAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++	parameters->AddObject(iomodel->CopyConstantObject(SeaiceMinConcentrationEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(SeaiceMinThicknessEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(SeaiceMaxThicknessEnum));
+ }/*}}}*/
+-void SeaiceAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+ 
+-	const int finiteelement = P1Enum;
+-	IoModelToConstraintsx(constraints,iomodel,SeaiceSpcvxEnum,SeaiceAnalysisEnum,finiteelement,0);
+-	IoModelToConstraintsx(constraints,iomodel,SeaiceSpcvyEnum,SeaiceAnalysisEnum,finiteelement,1);
+-}/*}}}*/
+-void SeaiceAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+-	return;
+-}/*}}}*/
+-
+ /*Finite Element Analysis*/
+ void           SeaiceAnalysis::Core(FemModel* femmodel){/*{{{*/
+ 	_error_("not implemented");
+@@ -311,108 +311,9 @@
+ 	delete gauss;
+ 	return pe;
+ }/*}}}*/
+-void SeaiceAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+-	   _error_("not implemented yet");
+-}/*}}}*/
+-void SeaiceAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+-	_error_("Not implemented yet");
+-}/*}}}*/
+-void SeaiceAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           SeaiceAnalysis::CreateCTensor(IssmDouble* C,Element* element,Gauss* gauss){/*{{{*/
+ 
+ 	/*Intermediaries*/
+-	int* doflist=NULL;
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-	int numdof   = numnodes*2;
+-
+-	/*Fetch dof list and allocate solution vectors*/
+-	element->GetDofList(&doflist,SSAApproximationEnum,GsetEnum);
+-	IssmDouble* values    = xNew<IssmDouble>(numdof);
+-	IssmDouble* vx        = xNew<IssmDouble>(numnodes);
+-	IssmDouble* vy        = xNew<IssmDouble>(numnodes);
+-	IssmDouble* vel       = xNew<IssmDouble>(numnodes);
+-
+-	/*Use the dof list to index into the solution vector: */
+-	for(int i=0;i<numdof;i++) values[i]=solution[doflist[i]];
+-
+-	/*Ok, we have vx and vy in values, fill in vx and vy arrays: */
+-	for(int i=0;i<numnodes;i++){
+-		vx[i]=values[i*2+0];
+-		vy[i]=values[i*2+1];
+-		if(xIsNan<IssmDouble>(vx[i])) _error_("NaN found in solution vector");
+-		if(xIsNan<IssmDouble>(vy[i])) _error_("NaN found in solution vector");
+-	}
+-
+-	/*Compute vel*/
+-	for(int i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i]);
+-
+-	/*Add vx and vy as inputs to the tria element: */
+-	element->AddInput(VxEnum,vx,element->GetElementType());
+-	element->AddInput(VyEnum,vy,element->GetElementType());
+-	element->AddInput(VelEnum,vel,element->GetElementType());
+-
+-	/*Free ressources:*/
+-	xDelete<IssmDouble>(vel);
+-	xDelete<IssmDouble>(vy);
+-	xDelete<IssmDouble>(vx);
+-	xDelete<IssmDouble>(values);
+-	xDelete<int>(doflist);
+-}/*}}}*/
+-void SeaiceAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+-
+-	/*Intermediaries*/
+-	IssmDouble          c_min;
+-	Vector<IssmDouble>* mask        = NULL;
+-	IssmDouble*         serial_mask = NULL;
+-
+-	/*Get minimum concentration allowed*/
+-	femmodel->parameters->FindParam(&c_min,SeaiceMinConcentrationEnum);
+-
+-	/*Step 1: update mask of active nodes*/
+-	mask=new Vector<IssmDouble>(femmodel->nodes->NumberOfNodes(SeaiceAnalysisEnum));
+-	for (int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-
+-		/*Get current concentration of element and decide whether it is an active element*/
+-		int    numnodes            = element->GetNumberOfNodes();
+-		Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input);
+-		if(concentration_input->Max()>c_min){
+-			for(int in=0;in<numnodes;in++) mask->SetValue(element->nodes[in]->Sid(),1.,INS_VAL);
+-		}
+-	}
+-
+-	/*Assemble and serialize*/
+-	mask->Assemble();
+-	serial_mask=mask->ToMPISerial();
+-	delete mask;
+-
+-	/*Update node activation accordingly*/
+-	int counter =0;
+-	for(int i=0;i<femmodel->nodes->Size();i++){
+-		Node* node=xDynamicCast<Node*>(femmodel->nodes->GetObjectByOffset(i));
+-		if(node->InAnalysis(SeaiceAnalysisEnum)){
+-			if(serial_mask[node->Sid()]==1.){
+-				node->Activate();
+-				counter++;
+-			}
+-			else{
+-				node->Deactivate();
+-			}
+-		}
+-	}
+-	xDelete<IssmDouble>(serial_mask);
+-
+-	/*Display number of active nodes*/
+-	int sum_counter;
+-	ISSM_MPI_Reduce(&counter,&sum_counter,1,ISSM_MPI_INT,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+-	if(VerboseSolution()) _printf0_("   Number of active nodes: "<< sum_counter <<"\n");
+-}/*}}}*/
+-
+-/*Intermediary functions*/
+-void SeaiceAnalysis::CreateCTensor(IssmDouble* C,Element* element,Gauss* gauss){/*{{{*/
+-
+-	/*Intermediaries*/
+ 	IssmDouble D[3][3];
+ 	IssmDouble damage,concentration;
+ 
+@@ -448,7 +349,7 @@
+ 		}
+ 	}
+ }/*}}}*/
+-void SeaiceAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           SeaiceAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
+ 	 * For node i, Bi can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -481,7 +382,7 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(dbasis);
+ }/*}}}*/
+-void SeaiceAnalysis::GetM(IssmDouble* M,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           SeaiceAnalysis::GetM(IssmDouble* M,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute M  matrix. M=[M1 M2 M3] where Mi is of size 3*NDOF2. 
+ 	 * For node i, Mi can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -506,122 +407,55 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(basis);
+ }/*}}}*/
+-void SeaiceAnalysis::UpdateDamageAndStress(FemModel* femmodel){/*{{{*/
+-	/* The damage variable is updated as a function of the actual elastic deformation
+-	 * In both cases, a Coulombic enveloppe is used, define by the cohesion C, tan(phi) and tract_coef.
+-	 * In both cases, a maximal compressive strength is fixed at compr_max
+-	 * The enveloppe is defined in N/m^2.
+-	 * The coeficients of the internal stress are then multiplied by the ice thickness to be used in the vertical integrated momentiom equation.
+-	 */
++void           SeaiceAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++	   _error_("not implemented yet");
++}/*}}}*/
++void           SeaiceAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++	_error_("Not implemented yet");
++}/*}}}*/
++void           SeaiceAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+-	/* Mohr-Coulomb criterion calculation
+-	 * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-	 *                                                                   
+-	 *                            sigma_s                                
+-	 *        Mohr.Coulomb branch     |                                  
+-	 *                     \          |                                  
+-	 *                      * |       |                                  
+-	 *                        *       |   cohesion (C=cfix+calea)        
+-	 *                        | *     |  /                               
+-	 *                        |   *   | /    tract                       
+-	 *                        |     * |/    /                            
+-	 *             -comp_max  |       *    /                             
+-	 *                      \ |       | * /                              
+-	 *                       \|      0| | *                              
+-	 *             -------------------------*------------ sigma_n        
+-	 *                        |       | | *                              
+-	 *                        |       | *                                
+-	 *                        |       *                                  
+-	 *                        |     * |                                  
+-	 *                        |   *   |                                  
+-	 *                        | *     |                                  
+-	 *                        *       |                                  
+-	 *                      * |       |                                  
+-	 *                    *           |                                  
+-	 *                                |                                  
+-	 *                                |                                  
+-	 *                                                                   
+-	 * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-	 */
++	/*Intermediaries*/
++	int* doflist=NULL;
+ 
+-	/*Intermediaties*/
+-	IssmDouble sigma_xx,sigma_yy,sigma_xy,sigma_s,sigma_n,sigma_target;
+-	IssmDouble compression_coef,traction_coef,cohesion,tan_phi;
+-	IssmDouble traction,compression_max;
+-	IssmDouble damage_test,damage_new,damage,tmp;
++	/*Fetch number of nodes and dof for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++	int numdof   = numnodes*2;
+ 
+-	/*Loop over the elements of this partition and update accordingly*/
+-	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
++	/*Fetch dof list and allocate solution vectors*/
++	element->GetDofList(&doflist,SSAApproximationEnum,GsetEnum);
++	IssmDouble* values    = xNew<IssmDouble>(numdof);
++	IssmDouble* vx        = xNew<IssmDouble>(numnodes);
++	IssmDouble* vy        = xNew<IssmDouble>(numnodes);
++	IssmDouble* vel       = xNew<IssmDouble>(numnodes);
+ 
+-		/*Get Mohr-Coulomb parameters*/
+-		compression_coef = element->GetMaterialParameter(MaterialsCompressionCoefEnum);
+-		traction_coef    = element->GetMaterialParameter(MaterialsTractionCoefEnum);
+-		cohesion         = element->GetMaterialParameter(MaterialsCohesionEnum); //C
+-		tan_phi          = element->GetMaterialParameter(MaterialsInternalFrictionCoefEnum); //mu = tan(phi)
++	/*Use the dof list to index into the solution vector: */
++	for(int i=0;i<numdof;i++) values[i]=solution[doflist[i]];
+ 
+-		/*Get current stress state*/
+-		Input*   sigma_xx_input = element->GetInput(StressTensorPredictorxxEnum); _assert_(sigma_xx_input);
+-		Input*   sigma_yy_input = element->GetInput(StressTensorPredictoryyEnum); _assert_(sigma_yy_input);
+-		Input*   sigma_xy_input = element->GetInput(StressTensorPredictorxyEnum); _assert_(sigma_xy_input);
+-		sigma_xx_input->GetInputAverage(&sigma_xx);
+-		sigma_yy_input->GetInputAverage(&sigma_yy);
+-		sigma_xy_input->GetInputAverage(&sigma_xy);
++	/*Ok, we have vx and vy in values, fill in vx and vy arrays: */
++	for(int i=0;i<numnodes;i++){
++		vx[i]=values[i*2+0];
++		vy[i]=values[i*2+1];
++		if(xIsNan<IssmDouble>(vx[i])) _error_("NaN found in solution vector");
++		if(xIsNan<IssmDouble>(vy[i])) _error_("NaN found in solution vector");
++	}
+ 
+-		/* Compute the invariants of the elastic deformation and instantaneous deformation rate */
+-		sigma_s=sqrt(pow((sigma_xx-sigma_yy)/2.,2)+pow(sigma_xy,2));
+-		sigma_n=(sigma_xx+sigma_yy)/2.;
++	/*Compute vel*/
++	for(int i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i]);
+ 
+-		/* same maximal tensile strength */
+-		traction=traction_coef*cohesion/tan_phi;
+-		compression_max=compression_coef*cohesion;
++	/*Add vx and vy as inputs to the tria element: */
++	element->AddInput(VxEnum,vx,element->GetElementType());
++	element->AddInput(VyEnum,vy,element->GetElementType());
++	element->AddInput(VelEnum,vel,element->GetElementType());
+ 
+-		/* estimate the internal constraints using the current elastic deformation */
+-		Input* damage_input    = element->GetInput(DamageEnum); _assert_(damage_input);
+-		damage_input->GetInputAverage(&damage);
+-		damage_test = damage;
+-		damage_new  = damage;
+-		if(sigma_n>traction || sigma_n<-compression_max){
+-			if(sigma_n>traction){
+-				sigma_target=traction;
+-			}
+-			else{
+-				sigma_target=-compression_max;
+-			}
+-
+-			tmp=1.-sigma_target/sigma_n*(1.-damage);
+-			if(tmp<1. && tmp>damage_new){
+-				damage_test=((damage_test>tmp)?(damage_test):(tmp)); /* max(damage_test,tmp); */
+-			}
+-		}
+-		if(sigma_s>cohesion-sigma_n*tan_phi){
+-			tmp=1.0-cohesion/(sigma_s+sigma_n*tan_phi)*(1-damage);
+-			if(tmp<1. && tmp>damage_new){
+-				damage_test=((damage_test>tmp)?(damage_test):(tmp)); /*max(damage_test,tmp); */
+-			}
+-		}
+-
+-		/* The damage variable is changed */
+-		damage_new=damage_test;
+-		element->AddInput(DamageEnum,&damage_new,P0Enum);
+-
+-		/* Recompute the internal stress*/
+-		if(damage<1.){
+-			sigma_xx = (1.-damage_new)/(1.-damage)*sigma_xx;
+-			sigma_yy = (1.-damage_new)/(1.-damage)*sigma_yy;
+-			sigma_xy = (1.-damage_new)/(1.-damage)*sigma_xy;
+-		}
+-		else{
+-			sigma_xx = 0.;
+-			sigma_yy = 0.;
+-			sigma_xy = 0.;
+-		}
+-		element->AddInput(StressTensorxxEnum,&sigma_xx,P0Enum);
+-		element->AddInput(StressTensoryyEnum,&sigma_yy,P0Enum);
+-		element->AddInput(StressTensorxyEnum,&sigma_xy,P0Enum);
+-	}
++	/*Free ressources:*/
++	xDelete<IssmDouble>(vel);
++	xDelete<IssmDouble>(vy);
++	xDelete<IssmDouble>(vx);
++	xDelete<IssmDouble>(values);
++	xDelete<int>(doflist);
+ }/*}}}*/
+-void SeaiceAnalysis::PostProcess(FemModel* femmodel){/*{{{*/
++void           SeaiceAnalysis::PostProcess(FemModel* femmodel){/*{{{*/
+ 
+ 	/*Intermediaties*/
+ 	IssmDouble *xyz_list = NULL;
+@@ -769,3 +603,167 @@
+ 	}
+ 
+ }/*}}}*/
++void           SeaiceAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++
++	/*Intermediaries*/
++	IssmDouble          c_min;
++	Vector<IssmDouble>* mask        = NULL;
++	IssmDouble*         serial_mask = NULL;
++
++	/*Get minimum concentration allowed*/
++	femmodel->parameters->FindParam(&c_min,SeaiceMinConcentrationEnum);
++
++	/*Step 1: update mask of active nodes*/
++	mask=new Vector<IssmDouble>(femmodel->nodes->NumberOfNodes(SeaiceAnalysisEnum));
++	for (int i=0;i<femmodel->elements->Size();i++){
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
++
++		/*Get current concentration of element and decide whether it is an active element*/
++		int    numnodes            = element->GetNumberOfNodes();
++		Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input);
++		if(concentration_input->Max()>c_min){
++			for(int in=0;in<numnodes;in++) mask->SetValue(element->nodes[in]->Sid(),1.,INS_VAL);
++		}
++	}
++
++	/*Assemble and serialize*/
++	mask->Assemble();
++	serial_mask=mask->ToMPISerial();
++	delete mask;
++
++	/*Update node activation accordingly*/
++	int counter =0;
++	for(int i=0;i<femmodel->nodes->Size();i++){
++		Node* node=xDynamicCast<Node*>(femmodel->nodes->GetObjectByOffset(i));
++		if(node->InAnalysis(SeaiceAnalysisEnum)){
++			if(serial_mask[node->Sid()]==1.){
++				node->Activate();
++				counter++;
++			}
++			else{
++				node->Deactivate();
++			}
++		}
++	}
++	xDelete<IssmDouble>(serial_mask);
++
++	/*Display number of active nodes*/
++	int sum_counter;
++	ISSM_MPI_Reduce(&counter,&sum_counter,1,ISSM_MPI_INT,ISSM_MPI_SUM,0,IssmComm::GetComm() );
++	if(VerboseSolution()) _printf0_("   Number of active nodes: "<< sum_counter <<"\n");
++}/*}}}*/
++void           SeaiceAnalysis::UpdateDamageAndStress(FemModel* femmodel){/*{{{*/
++	/* The damage variable is updated as a function of the actual elastic deformation
++	 * In both cases, a Coulombic enveloppe is used, define by the cohesion C, tan(phi) and tract_coef.
++	 * In both cases, a maximal compressive strength is fixed at compr_max
++	 * The enveloppe is defined in N/m^2.
++	 * The coeficients of the internal stress are then multiplied by the ice thickness to be used in the vertical integrated momentiom equation.
++	 */
++
++	/* Mohr-Coulomb criterion calculation
++	 * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
++	 *                                                                   
++	 *                            sigma_s                                
++	 *        Mohr.Coulomb branch     |                                  
++	 *                     \          |                                  
++	 *                      * |       |                                  
++	 *                        *       |   cohesion (C=cfix+calea)        
++	 *                        | *     |  /                               
++	 *                        |   *   | /    tract                       
++	 *                        |     * |/    /                            
++	 *             -comp_max  |       *    /                             
++	 *                      \ |       | * /                              
++	 *                       \|      0| | *                              
++	 *             -------------------------*------------ sigma_n        
++	 *                        |       | | *                              
++	 *                        |       | *                                
++	 *                        |       *                                  
++	 *                        |     * |                                  
++	 *                        |   *   |                                  
++	 *                        | *     |                                  
++	 *                        *       |                                  
++	 *                      * |       |                                  
++	 *                    *           |                                  
++	 *                                |                                  
++	 *                                |                                  
++	 *                                                                   
++	 * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
++	 */
++
++	/*Intermediaties*/
++	IssmDouble sigma_xx,sigma_yy,sigma_xy,sigma_s,sigma_n,sigma_target;
++	IssmDouble compression_coef,traction_coef,cohesion,tan_phi;
++	IssmDouble traction,compression_max;
++	IssmDouble damage_test,damage_new,damage,tmp;
++
++	/*Loop over the elements of this partition and update accordingly*/
++	for(int i=0;i<femmodel->elements->Size();i++){
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
++
++		/*Get Mohr-Coulomb parameters*/
++		compression_coef = element->GetMaterialParameter(MaterialsCompressionCoefEnum);
++		traction_coef    = element->GetMaterialParameter(MaterialsTractionCoefEnum);
++		cohesion         = element->GetMaterialParameter(MaterialsCohesionEnum); //C
++		tan_phi          = element->GetMaterialParameter(MaterialsInternalFrictionCoefEnum); //mu = tan(phi)
++
++		/*Get current stress state*/
++		Input*   sigma_xx_input = element->GetInput(StressTensorPredictorxxEnum); _assert_(sigma_xx_input);
++		Input*   sigma_yy_input = element->GetInput(StressTensorPredictoryyEnum); _assert_(sigma_yy_input);
++		Input*   sigma_xy_input = element->GetInput(StressTensorPredictorxyEnum); _assert_(sigma_xy_input);
++		sigma_xx_input->GetInputAverage(&sigma_xx);
++		sigma_yy_input->GetInputAverage(&sigma_yy);
++		sigma_xy_input->GetInputAverage(&sigma_xy);
++
++		/* Compute the invariants of the elastic deformation and instantaneous deformation rate */
++		sigma_s=sqrt(pow((sigma_xx-sigma_yy)/2.,2)+pow(sigma_xy,2));
++		sigma_n=(sigma_xx+sigma_yy)/2.;
++
++		/* same maximal tensile strength */
++		traction=traction_coef*cohesion/tan_phi;
++		compression_max=compression_coef*cohesion;
++
++		/* estimate the internal constraints using the current elastic deformation */
++		Input* damage_input    = element->GetInput(DamageEnum); _assert_(damage_input);
++		damage_input->GetInputAverage(&damage);
++		damage_test = damage;
++		damage_new  = damage;
++		if(sigma_n>traction || sigma_n<-compression_max){
++			if(sigma_n>traction){
++				sigma_target=traction;
++			}
++			else{
++				sigma_target=-compression_max;
++			}
++
++			tmp=1.-sigma_target/sigma_n*(1.-damage);
++			if(tmp<1. && tmp>damage_new){
++				damage_test=((damage_test>tmp)?(damage_test):(tmp)); /* max(damage_test,tmp); */
++			}
++		}
++		if(sigma_s>cohesion-sigma_n*tan_phi){
++			tmp=1.0-cohesion/(sigma_s+sigma_n*tan_phi)*(1-damage);
++			if(tmp<1. && tmp>damage_new){
++				damage_test=((damage_test>tmp)?(damage_test):(tmp)); /*max(damage_test,tmp); */
++			}
++		}
++
++		/* The damage variable is changed */
++		damage_new=damage_test;
++		element->AddInput(DamageEnum,&damage_new,P0Enum);
++
++		/* Recompute the internal stress*/
++		if(damage<1.){
++			sigma_xx = (1.-damage_new)/(1.-damage)*sigma_xx;
++			sigma_yy = (1.-damage_new)/(1.-damage)*sigma_yy;
++			sigma_xy = (1.-damage_new)/(1.-damage)*sigma_xy;
++		}
++		else{
++			sigma_xx = 0.;
++			sigma_yy = 0.;
++			sigma_xy = 0.;
++		}
++		element->AddInput(StressTensorxxEnum,&sigma_xx,P0Enum);
++		element->AddInput(StressTensoryyEnum,&sigma_yy,P0Enum);
++		element->AddInput(StressTensorxyEnum,&sigma_xy,P0Enum);
++	}
++}/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/MeshdeformationAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/MeshdeformationAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/MeshdeformationAnalysis.h	(revision 18930)
+@@ -12,12 +12,12 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+@@ -25,9 +25,9 @@
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.h	(revision 18930)
+@@ -13,52 +13,47 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+-		void           Core(FemModel* femmodel);
+-		ElementVector* CreateDVector(Element* element);
+-		ElementMatrix* CreateJacobianMatrix(Element* element);
+-		ElementMatrix* CreateKMatrix(Element* element);
+-		ElementMatrix* CreateKMatrixVolume(Element* element);
+-		ElementMatrix* CreateKMatrixShelf(Element* element);
+-		ElementVector* CreatePVector(Element* element);
+-		ElementVector* CreatePVectorVolume(Element* element);
+-		ElementVector* CreatePVectorSheet(Element* element);
+-		ElementVector* CreatePVectorShelf(Element* element);
+-		void GetBConduct(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBAdvec(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBAdvecprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
+-
+-		/*Modules*/
+-		static void PostProcessing(FemModel* femmodel);
+-		static void ComputeBasalMeltingrate(FemModel* femmodel);
+-		static void ComputeBasalMeltingrate(Element* element);
+-		static void DrainWaterfraction(FemModel* femmodel);
+-		static void DrainWaterfractionIcecolumn(Element* element);
+-		static void DrainWaterfraction(Element* element, IssmDouble* pdrainrate_element);
+-		static void UpdateBasalConstraints(FemModel* femmodel);
+-		static void ApplyBasalConstraints(IssmDouble* serial_spc,Element* element);
+-		static void GetBasalConstraints(Vector<IssmDouble>* vec_spc,Element* element);
+-		static void GetBasalConstraintsTransient(Vector<IssmDouble>* vec_spc,Element* element);
+-		static void GetBasalConstraintsSteadystate(Vector<IssmDouble>* vec_spc,Element* element);
+-		static int GetThermalBasalCondition(Element* element, IssmDouble enthalpy, IssmDouble enthalpy_up, IssmDouble pressure, IssmDouble pressure_up, IssmDouble watercolumn, IssmDouble meltingrate);
+-		static IssmDouble GetWetIceConductivity(Element* element, IssmDouble enthalpy, IssmDouble pressure);
+-
+-
+-		/*Intermediaries*/
++		static void       ApplyBasalConstraints(IssmDouble* serial_spc,Element* element);
++		static void       ComputeBasalMeltingrate(FemModel* femmodel);
++		static void       ComputeBasalMeltingrate(Element* element);
++		void              Core(FemModel* femmodel);
++		ElementVector*    CreateDVector(Element* element);
++		ElementMatrix*    CreateJacobianMatrix(Element* element);
++		ElementMatrix*    CreateKMatrix(Element* element);
++		ElementMatrix*    CreateKMatrixVolume(Element* element);
++		ElementMatrix*    CreateKMatrixShelf(Element* element);
++		ElementVector*    CreatePVector(Element* element);
++		ElementVector*    CreatePVectorVolume(Element* element);
++		ElementVector*    CreatePVectorSheet(Element* element);
++		ElementVector*    CreatePVectorShelf(Element* element);
++		static void       DrainWaterfraction(FemModel* femmodel);
++		static void       DrainWaterfraction(Element* element, IssmDouble* pdrainrate_element);
++		static void       DrainWaterfractionIcecolumn(Element* element);
+ 		static IssmDouble EnthalpyDiffusionParameter(Element* element,IssmDouble enthalpy,IssmDouble pressure);
+ 		static IssmDouble EnthalpyDiffusionParameterVolume(Element* element,int enthalpy_enum);
++		void              GetBAdvec(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void              GetBAdvecprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		static void       GetBasalConstraints(Vector<IssmDouble>* vec_spc,Element* element);
++		static void       GetBasalConstraintsSteadystate(Vector<IssmDouble>* vec_spc,Element* element);
++		static void       GetBasalConstraintsTransient(Vector<IssmDouble>* vec_spc,Element* element);
++		void              GetBConduct(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void              GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		static int        GetThermalBasalCondition(Element* element, IssmDouble enthalpy, IssmDouble enthalpy_up, IssmDouble pressure, IssmDouble pressure_up, IssmDouble watercolumn, IssmDouble meltingrate);
++		static IssmDouble GetWetIceConductivity(Element* element, IssmDouble enthalpy, IssmDouble pressure);
++		void              GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void              InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		static void       PostProcessing(FemModel* femmodel);
+ 		static IssmDouble PureIceEnthalpy(Element* element,IssmDouble pressure);
+ 		static IssmDouble TMeltingPoint(Element* element,IssmDouble pressure);
++		static void       UpdateBasalConstraints(FemModel* femmodel);
++		void              UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/MeltingAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/MeltingAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/MeltingAnalysis.cpp	(revision 18930)
+@@ -5,11 +5,37 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
++void MeltingAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++	/*No Constraints*/
++}/*}}}*/
++void MeltingAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++
++	/*if 2d: Error*/
++	if(iomodel->domaintype==Domain2DhorizontalEnum) _error_("2d meshes not supported yet");
++
++	//create penalties for nodes: no node can have a temperature over the melting point
++	iomodel->FetchData(1,MeshVertexonbaseEnum);
++	CreateSingleNodeToElementConnectivity(iomodel);
++
++	for(int i=0;i<iomodel->numberofvertices;i++){
++		if(iomodel->my_vertices[i]){
++			if (reCast<int>(iomodel->Data(MeshVertexonbaseEnum)[i])){
++				loads->AddObject(new Pengrid(iomodel->loadcounter+i+1,i,iomodel,MeltingAnalysisEnum));
++			}
++		}
++	}
++	iomodel->DeleteData(1,MeshVertexonbaseEnum);
++
++}/*}}}*/
++void MeltingAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++
++	if(iomodel->domaintype==Domain3DEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++	::CreateNodes(nodes,iomodel,MeltingAnalysisEnum,P1Enum);
++	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++}/*}}}*/
+ int  MeltingAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+ 	return 1;
+ }/*}}}*/
+-void MeltingAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-}/*}}}*/
+ void MeltingAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	int frictionlaw;
+@@ -38,35 +64,9 @@
+ 	}
+ 	iomodel->FetchDataToInput(elements,PressureEnum);
+ }/*}}}*/
+-void MeltingAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-
+-	if(iomodel->domaintype==Domain3DEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-	::CreateNodes(nodes,iomodel,MeltingAnalysisEnum,P1Enum);
+-	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++void MeltingAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ }/*}}}*/
+-void MeltingAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+-	/*No Constraints*/
+-}/*}}}*/
+-void MeltingAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+ 
+-	/*if 2d: Error*/
+-	if(iomodel->domaintype==Domain2DhorizontalEnum) _error_("2d meshes not supported yet");
+-
+-	//create penalties for nodes: no node can have a temperature over the melting point
+-	iomodel->FetchData(1,MeshVertexonbaseEnum);
+-	CreateSingleNodeToElementConnectivity(iomodel);
+-
+-	for(int i=0;i<iomodel->numberofvertices;i++){
+-		if(iomodel->my_vertices[i]){
+-			if (reCast<int>(iomodel->Data(MeshVertexonbaseEnum)[i])){
+-				loads->AddObject(new Pengrid(iomodel->loadcounter+i+1,i,iomodel,MeltingAnalysisEnum));
+-			}
+-		}
+-	}
+-	iomodel->DeleteData(1,MeshVertexonbaseEnum);
+-
+-}/*}}}*/
+-
+ /*Finite Element Analysis*/
+ void           MeltingAnalysis::Core(FemModel* femmodel){/*{{{*/
+ 	_error_("not implemented");
+@@ -125,16 +125,16 @@
+ ElementVector* MeltingAnalysis::CreatePVector(Element* element){/*{{{*/
+ 	return NULL;
+ }/*}}}*/
+-void MeltingAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           MeltingAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void MeltingAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           MeltingAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void MeltingAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           MeltingAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 	element->InputUpdateFromSolutionOneDof(solution,BasalforcingsGroundediceMeltingRateEnum);
+ }/*}}}*/
+-void MeltingAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           MeltingAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.h	(revision 18930)
+@@ -12,27 +12,25 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+ 		ElementVector* CreateDVector(Element* element);
++		void           CreateHydrologyWaterVelocityInput(Element* element);
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
+-
+-		/*Intermediaries*/
+-		void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void CreateHydrologyWaterVelocityInput(Element* element);
++		void           GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/SmoothAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SmoothAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/SmoothAnalysis.cpp	(revision 18930)
+@@ -5,11 +5,18 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
++void SmoothAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++}/*}}}*/
++void SmoothAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++}/*}}}*/
++void SmoothAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++
++	::CreateNodes(nodes,iomodel,SmoothAnalysisEnum,P1Enum);
++
++}/*}}}*/
+ int  SmoothAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+ 	return 1;
+ }/*}}}*/
+-void SmoothAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-}/*}}}*/
+ void SmoothAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	/*Update elements: */
+@@ -22,15 +29,8 @@
+ 		}
+ 	}
+ }/*}}}*/
+-void SmoothAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-
+-	::CreateNodes(nodes,iomodel,SmoothAnalysisEnum,P1Enum);
+-
++void SmoothAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ }/*}}}*/
+-void SmoothAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+-}/*}}}*/
+-void SmoothAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+-}/*}}}*/
+ 
+ /*Finite Element Analysis*/
+ void           SmoothAnalysis::Core(FemModel* femmodel){/*{{{*/
+@@ -204,13 +204,13 @@
+ 	delete gauss;
+ 	return pe;
+ }/*}}}*/
+-void SmoothAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           SmoothAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void SmoothAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           SmoothAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void SmoothAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           SmoothAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 	int inputenum,domaintype,elementtype;
+ 
+ 	element->FindParam(&inputenum,InputToSmoothEnum);
+@@ -222,7 +222,7 @@
+ 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+ 	}
+ }/*}}}*/
+-void SmoothAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           SmoothAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h	(revision 18930)
+@@ -12,47 +12,47 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+ 		ElementVector* CreateDVector(Element* element);
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
++		ElementMatrix* CreateKMatrixFS(Element* element);
++		ElementMatrix* CreateKMatrixHO(Element* element);
++		ElementMatrix* CreateKMatrixL1L2(Element* element);
+ 		ElementMatrix* CreateKMatrixSSA(Element* element);
+-		ElementMatrix* CreateKMatrixL1L2(Element* element);
+-		ElementMatrix* CreateKMatrixHO(Element* element);
+-		ElementMatrix* CreateKMatrixFS(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		ElementVector* CreatePVectorSSA(Element* element);
++		ElementVector* CreatePVectorFS(Element* element);
+ 		ElementVector* CreatePVectorL1L2(Element* element);
+ 		ElementVector* CreatePVectorHO(Element* element);
+-		ElementVector* CreatePVectorFS(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void GradientJDragGradient(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJBbarGradient(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJDragL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJDragFS(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJBbarSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJBbarFS(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJBSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJBHO(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJBFS(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJDSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
+-		void InputUpdateFromSolutionHoriz(IssmDouble* solution,Element* element);
+-		void InputUpdateFromSolutionFS(IssmDouble* solution,Element* element);
++		ElementVector* CreatePVectorSSA(Element* element);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           GradientJBbarFS(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJBbarGradient(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJBbarSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJBFS(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJBHO(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJBSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJDragFS(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJDragGradient(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJDragL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJDSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           InputUpdateFromSolutionFS(IssmDouble* solution,Element* element);
++		void           InputUpdateFromSolutionHoriz(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.h	(revision 18930)
+@@ -12,12 +12,12 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+@@ -25,9 +25,9 @@
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.cpp	(revision 18930)
+@@ -5,22 +5,22 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processor*/
+-int  AdjointBalancethicknessAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+-	return 1;
+-}/*}}}*/
+-void AdjointBalancethicknessAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++void AdjointBalancethicknessAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+ 	_error_("not implemented yet");
+ }/*}}}*/
+-void AdjointBalancethicknessAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
++void AdjointBalancethicknessAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+ 	_error_("not implemented yet");
+ }/*}}}*/
+ void AdjointBalancethicknessAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 	_error_("not implemented yet");
+ }/*}}}*/
+-void AdjointBalancethicknessAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++int  AdjointBalancethicknessAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
++	return 1;
++}/*}}}*/
++void AdjointBalancethicknessAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 	_error_("not implemented yet");
+ }/*}}}*/
+-void AdjointBalancethicknessAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++void AdjointBalancethicknessAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ 	_error_("not implemented yet");
+ }/*}}}*/
+ 
+@@ -146,10 +146,10 @@
+ 	delete gauss;
+ 	return pe;
+ }/*}}}*/
+-void AdjointBalancethicknessAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           AdjointBalancethicknessAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	_error_("not implemented yet");
+ }/*}}}*/
+-void AdjointBalancethicknessAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           AdjointBalancethicknessAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	/*The gradient of the cost function is calculated in 2 parts.
+ 	 *
+ 	 * dJ    \partial J   \partial lambda^T(KU-F)
+@@ -195,8 +195,32 @@
+ 	xDelete<int>(responses);
+ 
+ }/*}}}*/
+-void AdjointBalancethicknessAnalysis::GradientJVx(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++void           AdjointBalancethicknessAnalysis::GradientJDhDt(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
++	/*Fetch number of vertices for this finite element*/
++	int numvertices = element->GetNumberOfVertices();
++
++	/*Initialize some vectors*/
++	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
++	IssmDouble* lambda        = xNew<IssmDouble>(numvertices);
++	int*        vertexpidlist = xNew<int>(numvertices);
++
++	/*Retrieve all inputs we will be needing: */
++	element->GradientIndexing(&vertexpidlist[0],control_index);
++	element->GetInputListOnVertices(lambda,AdjointEnum);
++	for(int i=0;i<numvertices;i++){
++		ge[i]=-lambda[i];
++		_assert_(!xIsNan<IssmDouble>(ge[i]));
++	}
++	gradient->SetValues(numvertices,vertexpidlist,ge,INS_VAL);
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(ge);
++	xDelete<IssmDouble>(lambda);
++	xDelete<int>(vertexpidlist);
++}/*}}}*/
++void           AdjointBalancethicknessAnalysis::GradientJVx(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++
+ 	/*Intermediaries*/
+ 	IssmDouble thickness,Jdet,Dlambda[3],dp[3];
+ 	IssmDouble *xyz_list= NULL;
+@@ -242,7 +266,7 @@
+ 	xDelete<int>(vertexpidlist);
+ 	delete gauss;
+ }/*}}}*/
+-void AdjointBalancethicknessAnalysis::GradientJVy(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++void           AdjointBalancethicknessAnalysis::GradientJVy(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+ 	/*Intermediaries*/
+ 	IssmDouble thickness,Jdet,Dlambda[3],dp[3];
+@@ -289,32 +313,8 @@
+ 	xDelete<int>(vertexpidlist);
+ 	delete gauss;
+ }/*}}}*/
+-void AdjointBalancethicknessAnalysis::GradientJDhDt(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++void           AdjointBalancethicknessAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+-	/*Fetch number of vertices for this finite element*/
+-	int numvertices = element->GetNumberOfVertices();
+-
+-	/*Initialize some vectors*/
+-	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
+-	IssmDouble* lambda        = xNew<IssmDouble>(numvertices);
+-	int*        vertexpidlist = xNew<int>(numvertices);
+-
+-	/*Retrieve all inputs we will be needing: */
+-	element->GradientIndexing(&vertexpidlist[0],control_index);
+-	element->GetInputListOnVertices(lambda,AdjointEnum);
+-	for(int i=0;i<numvertices;i++){
+-		ge[i]=-lambda[i];
+-		_assert_(!xIsNan<IssmDouble>(ge[i]));
+-	}
+-	gradient->SetValues(numvertices,vertexpidlist,ge,INS_VAL);
+-
+-	/*Clean up and return*/
+-	xDelete<IssmDouble>(ge);
+-	xDelete<IssmDouble>(lambda);
+-	xDelete<int>(vertexpidlist);
+-}/*}}}*/
+-void AdjointBalancethicknessAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+-
+ 	int domaintype;
+ 	element->FindParam(&domaintype,DomainTypeEnum);
+ 	switch(domaintype){
+@@ -327,7 +327,7 @@
+ 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+ 	}
+ }/*}}}*/
+-void AdjointBalancethicknessAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           AdjointBalancethicknessAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.cpp	(revision 18930)
+@@ -5,11 +5,37 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
++void L2ProjectionEPLAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++
++	/*No constraints*/
++}/*}}}*/
++void L2ProjectionEPLAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++
++	/*No loads*/
++}/*}}}*/
++void L2ProjectionEPLAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++	/*Now, do we really want DC?*/
++	int  hydrology_model;
++	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
++	if(hydrology_model!=HydrologydcEnum) return;
++
++	/*Do we want an efficient layer*/
++	bool isefficientlayer;
++	iomodel->Constant(&isefficientlayer,HydrologydcIsefficientlayerEnum);
++	if(!isefficientlayer) return;
++
++	if(iomodel->domaintype==Domain3DEnum){
++		iomodel->FetchData(1,MeshVertexonbaseEnum);
++	}
++	else if(iomodel->domaintype==Domain2DverticalEnum){
++		iomodel->FetchData(1,MeshVertexonbaseEnum);
++	}
++	::CreateNodes(nodes,iomodel,L2ProjectionEPLAnalysisEnum,P1Enum);
++	iomodel->DeleteData(1,MeshVertexonbaseEnum);
++}/*}}}*/
+ int  L2ProjectionEPLAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+ 	return 1;
+ }/*}}}*/
+-void L2ProjectionEPLAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-}/*}}}*/
+ void L2ProjectionEPLAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	bool   isefficientlayer;
+@@ -40,35 +66,9 @@
+ 		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
+ 	}
+ }/*}}}*/
+-void L2ProjectionEPLAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-	/*Now, do we really want DC?*/
+-	int  hydrology_model;
+-	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
+-	if(hydrology_model!=HydrologydcEnum) return;
+-
+-	/*Do we want an efficient layer*/
+-	bool isefficientlayer;
+-	iomodel->Constant(&isefficientlayer,HydrologydcIsefficientlayerEnum);
+-	if(!isefficientlayer) return;
+-
+-	if(iomodel->domaintype==Domain3DEnum){
+-		iomodel->FetchData(1,MeshVertexonbaseEnum);
+-	}
+-	else if(iomodel->domaintype==Domain2DverticalEnum){
+-		iomodel->FetchData(1,MeshVertexonbaseEnum);
+-	}
+-	::CreateNodes(nodes,iomodel,L2ProjectionEPLAnalysisEnum,P1Enum);
+-	iomodel->DeleteData(1,MeshVertexonbaseEnum);
++void L2ProjectionEPLAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ }/*}}}*/
+-void L2ProjectionEPLAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+ 
+-	/*No constraints*/
+-}/*}}}*/
+-void L2ProjectionEPLAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+-
+-	/*No loads*/
+-}/*}}}*/
+-
+ /*Finite Element Analysis*/
+ void           L2ProjectionEPLAnalysis::Core(FemModel* femmodel){/*{{{*/
+ 	_error_("not implemented");
+@@ -225,13 +225,13 @@
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 	return pe;
+ }/*}}}*/
+-void L2ProjectionEPLAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           L2ProjectionEPLAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void L2ProjectionEPLAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           L2ProjectionEPLAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void L2ProjectionEPLAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           L2ProjectionEPLAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 	int inputenum,domaintype;
+ 
+ 	element->FindParam(&inputenum,InputToL2ProjectEnum);
+@@ -249,7 +249,7 @@
+ 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+ 	}
+ }/*}}}*/
+-void L2ProjectionEPLAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           L2ProjectionEPLAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18930)
+@@ -5,27 +5,116 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
+-int  MasstransportAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+-	return 1;
++void MasstransportAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++
++	/*Fetch parameters: */
++	int stabilization;
++	iomodel->Constant(&stabilization,MasstransportStabilizationEnum);
++
++	/*Do not add constraints in DG,  they are weakly imposed*/
++	if(stabilization!=3){
++		IoModelToConstraintsx(constraints,iomodel,MasstransportSpcthicknessEnum,MasstransportAnalysisEnum,P1Enum);
++	}
++
++	/*FCT, constraints are imposed using penalties*/
++	if(stabilization==4){
++		constraints->ActivatePenaltyMethod(MasstransportAnalysisEnum);
++	}
+ }/*}}}*/
+-void MasstransportAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++void MasstransportAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+ 
+-	int     numoutputs;
+-	char**  requestedoutputs = NULL;
++	/*Intermediaries*/
++	int element;
++	int penpair_ids[2];
++	int count=0;
++	int stabilization;
++	int numvertex_pairing;
+ 
+-	parameters->AddObject(iomodel->CopyConstantObject(FlowequationIsFSEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(MasstransportIsfreesurfaceEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(MasstransportHydrostaticAdjustmentEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(MasstransportStabilizationEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(MasstransportMinThicknessEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(MasstransportPenaltyFactorEnum));
++	/*Fetch parameters: */
++	iomodel->Constant(&stabilization,MasstransportStabilizationEnum);
+ 
+-	iomodel->FetchData(&requestedoutputs,&numoutputs,MasstransportRequestedOutputsEnum);
+-	parameters->AddObject(new IntParam(MasstransportNumRequestedOutputsEnum,numoutputs));
+-	if(numoutputs)parameters->AddObject(new StringArrayParam(MasstransportRequestedOutputsEnum,requestedoutputs,numoutputs));
+-	iomodel->DeleteData(&requestedoutputs,numoutputs,MasstransportRequestedOutputsEnum);
++	/*Loads only in DG*/
++	if (stabilization==3){
+ 
++		/*Get faces and elements*/
++		CreateFaces(iomodel);
++		iomodel->FetchData(1,ThicknessEnum);
++
++		/*First load data:*/
++		for(int i=0;i<iomodel->numberoffaces;i++){
++
++			/*Get left and right elements*/
++			element=iomodel->faces[4*i+2]-1; //faces are [node1 node2 elem1 elem2]
++
++			/*Now, if this element is not in the partition, pass: */
++			if(!iomodel->my_elements[element]) continue;
++
++			/* Add load */
++			loads->AddObject(new Numericalflux(iomodel->loadcounter+i+1,i,i,iomodel,MasstransportAnalysisEnum));
++		}
++
++		/*Free data: */
++		iomodel->DeleteData(1,ThicknessEnum);
++	}
++
++	/*Create Penpair for vertex_pairing: */
++	IssmDouble *vertex_pairing=NULL;
++	IssmDouble *nodeonbase=NULL;
++	iomodel->FetchData(&vertex_pairing,&numvertex_pairing,NULL,MasstransportVertexPairingEnum);
++	if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(&nodeonbase,NULL,NULL,MeshVertexonbaseEnum);
++
++	for(int i=0;i<numvertex_pairing;i++){
++
++		if(iomodel->my_vertices[reCast<int>(vertex_pairing[2*i+0])-1]){
++
++			/*In debugging mode, check that the second node is in the same cpu*/
++			_assert_(iomodel->my_vertices[reCast<int>(vertex_pairing[2*i+1])-1]);
++
++			/*Skip if one of the two is not on the bed*/
++			if(iomodel->domaintype!=Domain2DhorizontalEnum){
++				if(!(reCast<bool>(nodeonbase[reCast<int>(vertex_pairing[2*i+0])-1])) || !(reCast<bool>(nodeonbase[reCast<int>(vertex_pairing[2*i+1])-1]))) continue;
++			}
++
++			/*Get node ids*/
++			penpair_ids[0]=iomodel->nodecounter+reCast<int>(vertex_pairing[2*i+0]);
++			penpair_ids[1]=iomodel->nodecounter+reCast<int>(vertex_pairing[2*i+1]);
++
++			/*Create Load*/
++			loads->AddObject(new Penpair(
++							iomodel->loadcounter+count+1,
++							&penpair_ids[0],
++							MasstransportAnalysisEnum));
++			count++;
++		}
++	}
++
++	/*free ressources: */
++	iomodel->DeleteData(vertex_pairing,MasstransportVertexPairingEnum);
++	iomodel->DeleteData(nodeonbase,MeshVertexonbaseEnum);
++
+ }/*}}}*/
++void MasstransportAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++
++	/*Fetch parameters: */
++	int  stabilization;
++	iomodel->Constant(&stabilization,MasstransportStabilizationEnum);
++
++	/*Check in 3d*/
++	if(stabilization==3 && iomodel->domaintype==Domain3DEnum) _error_("DG 3d not implemented yet");
++
++	/*Create Nodes either DG or CG depending on stabilization*/
++	if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++	if(stabilization!=3){
++		::CreateNodes(nodes,iomodel,MasstransportAnalysisEnum,P1Enum);
++	}
++	else{
++		::CreateNodes(nodes,iomodel,MasstransportAnalysisEnum,P1DGEnum);
++	}
++	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++}/*}}}*/
++int  MasstransportAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
++	return 1;
++}/*}}}*/
+ void MasstransportAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	int    stabilization,finiteelement,smb_model;
+@@ -125,114 +214,25 @@
+ 	}
+ 
+ }/*}}}*/
+-void MasstransportAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++void MasstransportAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ 
+-	/*Fetch parameters: */
+-	int  stabilization;
+-	iomodel->Constant(&stabilization,MasstransportStabilizationEnum);
++	int     numoutputs;
++	char**  requestedoutputs = NULL;
+ 
+-	/*Check in 3d*/
+-	if(stabilization==3 && iomodel->domaintype==Domain3DEnum) _error_("DG 3d not implemented yet");
++	parameters->AddObject(iomodel->CopyConstantObject(FlowequationIsFSEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(MasstransportIsfreesurfaceEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(MasstransportHydrostaticAdjustmentEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(MasstransportStabilizationEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(MasstransportMinThicknessEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(MasstransportPenaltyFactorEnum));
+ 
+-	/*Create Nodes either DG or CG depending on stabilization*/
+-	if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-	if(stabilization!=3){
+-		::CreateNodes(nodes,iomodel,MasstransportAnalysisEnum,P1Enum);
+-	}
+-	else{
+-		::CreateNodes(nodes,iomodel,MasstransportAnalysisEnum,P1DGEnum);
+-	}
+-	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-}/*}}}*/
+-void MasstransportAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++	iomodel->FetchData(&requestedoutputs,&numoutputs,MasstransportRequestedOutputsEnum);
++	parameters->AddObject(new IntParam(MasstransportNumRequestedOutputsEnum,numoutputs));
++	if(numoutputs)parameters->AddObject(new StringArrayParam(MasstransportRequestedOutputsEnum,requestedoutputs,numoutputs));
++	iomodel->DeleteData(&requestedoutputs,numoutputs,MasstransportRequestedOutputsEnum);
+ 
+-	/*Fetch parameters: */
+-	int stabilization;
+-	iomodel->Constant(&stabilization,MasstransportStabilizationEnum);
+-
+-	/*Do not add constraints in DG,  they are weakly imposed*/
+-	if(stabilization!=3){
+-		IoModelToConstraintsx(constraints,iomodel,MasstransportSpcthicknessEnum,MasstransportAnalysisEnum,P1Enum);
+-	}
+-
+-	/*FCT, constraints are imposed using penalties*/
+-	if(stabilization==4){
+-		constraints->ActivatePenaltyMethod(MasstransportAnalysisEnum);
+-	}
+ }/*}}}*/
+-void MasstransportAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+ 
+-	/*Intermediaries*/
+-	int element;
+-	int penpair_ids[2];
+-	int count=0;
+-	int stabilization;
+-	int numvertex_pairing;
+-
+-	/*Fetch parameters: */
+-	iomodel->Constant(&stabilization,MasstransportStabilizationEnum);
+-
+-	/*Loads only in DG*/
+-	if (stabilization==3){
+-
+-		/*Get faces and elements*/
+-		CreateFaces(iomodel);
+-		iomodel->FetchData(1,ThicknessEnum);
+-
+-		/*First load data:*/
+-		for(int i=0;i<iomodel->numberoffaces;i++){
+-
+-			/*Get left and right elements*/
+-			element=iomodel->faces[4*i+2]-1; //faces are [node1 node2 elem1 elem2]
+-
+-			/*Now, if this element is not in the partition, pass: */
+-			if(!iomodel->my_elements[element]) continue;
+-
+-			/* Add load */
+-			loads->AddObject(new Numericalflux(iomodel->loadcounter+i+1,i,i,iomodel,MasstransportAnalysisEnum));
+-		}
+-
+-		/*Free data: */
+-		iomodel->DeleteData(1,ThicknessEnum);
+-	}
+-
+-	/*Create Penpair for vertex_pairing: */
+-	IssmDouble *vertex_pairing=NULL;
+-	IssmDouble *nodeonbase=NULL;
+-	iomodel->FetchData(&vertex_pairing,&numvertex_pairing,NULL,MasstransportVertexPairingEnum);
+-	if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(&nodeonbase,NULL,NULL,MeshVertexonbaseEnum);
+-
+-	for(int i=0;i<numvertex_pairing;i++){
+-
+-		if(iomodel->my_vertices[reCast<int>(vertex_pairing[2*i+0])-1]){
+-
+-			/*In debugging mode, check that the second node is in the same cpu*/
+-			_assert_(iomodel->my_vertices[reCast<int>(vertex_pairing[2*i+1])-1]);
+-
+-			/*Skip if one of the two is not on the bed*/
+-			if(iomodel->domaintype!=Domain2DhorizontalEnum){
+-				if(!(reCast<bool>(nodeonbase[reCast<int>(vertex_pairing[2*i+0])-1])) || !(reCast<bool>(nodeonbase[reCast<int>(vertex_pairing[2*i+1])-1]))) continue;
+-			}
+-
+-			/*Get node ids*/
+-			penpair_ids[0]=iomodel->nodecounter+reCast<int>(vertex_pairing[2*i+0]);
+-			penpair_ids[1]=iomodel->nodecounter+reCast<int>(vertex_pairing[2*i+1]);
+-
+-			/*Create Load*/
+-			loads->AddObject(new Penpair(
+-							iomodel->loadcounter+count+1,
+-							&penpair_ids[0],
+-							MasstransportAnalysisEnum));
+-			count++;
+-		}
+-	}
+-
+-	/*free ressources: */
+-	iomodel->DeleteData(vertex_pairing,MasstransportVertexPairingEnum);
+-	iomodel->DeleteData(nodeonbase,MeshVertexonbaseEnum);
+-
+-}/*}}}*/
+-
+ /*Finite Element Analysis*/
+ void           MasstransportAnalysis::Core(FemModel* femmodel){/*{{{*/
+ 	_error_("not implemented");
+@@ -624,7 +624,7 @@
+ 	delete gauss;
+ 	return pe;
+ }/*}}}*/
+-void MasstransportAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           MasstransportAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
+ 	 * For node i, Bi can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -652,7 +652,7 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(basis);
+ }/*}}}*/
+-void MasstransportAnalysis::GetBprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           MasstransportAnalysis::GetBprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 
+ 	 * For node i, Bi' can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -681,13 +681,13 @@
+ 	xDelete<IssmDouble>(dbasis);
+ 
+ }/*}}}*/
+-void MasstransportAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           MasstransportAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	element->GetSolutionFromInputsOneDof(solution,ThicknessEnum);
+ }/*}}}*/
+-void MasstransportAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           MasstransportAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void MasstransportAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           MasstransportAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	int        i,hydroadjustment,domaintype;
+ 	int*       doflist=NULL;
+@@ -771,7 +771,7 @@
+ 	xDelete<int>(doflist);
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ }/*}}}*/
+-void MasstransportAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           MasstransportAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 
+ 	bool islevelset;
+ 	femmodel->parameters->FindParam(&islevelset,TransientIslevelsetEnum);
+@@ -782,51 +782,59 @@
+ }/*}}}*/
+ 
+ /*Flux Correction Transport*/
+-void           MasstransportAnalysis::LumpedMassMatrix(Vector<IssmDouble>** pMlff,FemModel* femmodel){/*{{{*/
++ElementMatrix* MasstransportAnalysis::CreateFctKMatrix(Element* element){/*{{{*/
+ 
+-	/*Intermediaries*/
+-	int  configuration_type;
++	/* Check if ice in element */
++	if(!element->IsIceInElement()) return NULL;
+ 
+-	/*Initialize Lumped mass matrix (actually we just save its diagonal)*/
+-	femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
+-	int fsize      = femmodel->nodes->NumberOfDofs(configuration_type,FsetEnum);
+-	int flocalsize = femmodel->nodes->NumberOfDofsLocal(configuration_type,FsetEnum);
+-	Vector<IssmDouble>* Mlff = new Vector<IssmDouble>(flocalsize,fsize);
++	/*Intermediaries */
++	IssmDouble Jdet;
++	IssmDouble vx,vy;
++	IssmDouble* xyz_list = NULL;
+ 
+-	/*Create and assemble matrix*/
+-	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element*       element = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-		ElementMatrix* MLe     = this->CreateMassMatrix(element);
+-		if(MLe){
+-			MLe->Lump();
+-			MLe->AddDiagonalToGlobal(Mlff);
+-		}
+-		delete MLe;
+-	}
+-	Mlff->Assemble();
++	/*Fetch number of nodes and dof for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++	int dim      = 2;
+ 
+-	/*Assign output pointer*/
+-	*pMlff=Mlff;
+-}/*}}}*/
+-void           MasstransportAnalysis::MassMatrix(Matrix<IssmDouble>** pMff,FemModel* femmodel){/*{{{*/
++	/*Initialize Element vector and other vectors*/
++	ElementMatrix* Ke     = element->NewElementMatrix();
++	IssmDouble*    B      = xNew<IssmDouble>(dim*numnodes);
++	IssmDouble*    Bprime = xNew<IssmDouble>(dim*numnodes);
++	IssmDouble*    D      = xNewZeroInit<IssmDouble>(dim*dim);
+ 
+-	/*Initialize Mass matrix*/
+-	Matrix<IssmDouble> *Mff = NULL;
+-	AllocateSystemMatricesx(&Mff,NULL,NULL,NULL,femmodel);
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinates(&xyz_list);
++	Input* vxaverage_input=element->GetInput(VxEnum); _assert_(vxaverage_input);
++	Input* vyaverage_input=element->GetInput(VyEnum); _assert_(vyaverage_input);
+ 
+-	/*Create and assemble matrix*/
+-	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element*       element = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-		ElementMatrix* MLe     = this->CreateMassMatrix(element);
+-		if(MLe){
+-			MLe->AddToGlobal(Mff);
+-		}
+-		delete MLe;
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGauss(2);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		GetB(B,element,dim,xyz_list,gauss);
++		GetBprime(Bprime,element,dim,xyz_list,gauss);
++		vxaverage_input->GetInputValue(&vx,gauss);
++		vyaverage_input->GetInputValue(&vy,gauss);
++
++		D[0*dim+0] = -gauss->weight*vx*Jdet;
++		D[1*dim+1] = -gauss->weight*vy*Jdet;
++
++		TripleMultiply(B,dim,numnodes,1,
++					D,dim,dim,0,
++					Bprime,dim,numnodes,0,
++					&Ke->values[0],1);
++
+ 	}
+-	Mff->Assemble();
+ 
+-	/*Assign output pointer*/
+-	*pMff=Mff;
++	/*Clean up and return*/
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(B);
++	xDelete<IssmDouble>(Bprime);
++	xDelete<IssmDouble>(D);
++	delete gauss;
++	return Ke;
+ }/*}}}*/
+ ElementMatrix* MasstransportAnalysis::CreateMassMatrix(Element* element){/*{{{*/
+ 
+@@ -896,57 +904,49 @@
+ 		delete Kfs;
+ 	}
+ }/*}}}*/
+-ElementMatrix* MasstransportAnalysis::CreateFctKMatrix(Element* element){/*{{{*/
++void           MasstransportAnalysis::LumpedMassMatrix(Vector<IssmDouble>** pMlff,FemModel* femmodel){/*{{{*/
+ 
+-	/* Check if ice in element */
+-	if(!element->IsIceInElement()) return NULL;
++	/*Intermediaries*/
++	int  configuration_type;
+ 
+-	/*Intermediaries */
+-	IssmDouble Jdet;
+-	IssmDouble vx,vy;
+-	IssmDouble* xyz_list = NULL;
++	/*Initialize Lumped mass matrix (actually we just save its diagonal)*/
++	femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
++	int fsize      = femmodel->nodes->NumberOfDofs(configuration_type,FsetEnum);
++	int flocalsize = femmodel->nodes->NumberOfDofsLocal(configuration_type,FsetEnum);
++	Vector<IssmDouble>* Mlff = new Vector<IssmDouble>(flocalsize,fsize);
+ 
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-	int dim      = 2;
++	/*Create and assemble matrix*/
++	for(int i=0;i<femmodel->elements->Size();i++){
++		Element*       element = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		ElementMatrix* MLe     = this->CreateMassMatrix(element);
++		if(MLe){
++			MLe->Lump();
++			MLe->AddDiagonalToGlobal(Mlff);
++		}
++		delete MLe;
++	}
++	Mlff->Assemble();
+ 
+-	/*Initialize Element vector and other vectors*/
+-	ElementMatrix* Ke     = element->NewElementMatrix();
+-	IssmDouble*    B      = xNew<IssmDouble>(dim*numnodes);
+-	IssmDouble*    Bprime = xNew<IssmDouble>(dim*numnodes);
+-	IssmDouble*    D      = xNewZeroInit<IssmDouble>(dim*dim);
++	/*Assign output pointer*/
++	*pMlff=Mlff;
++}/*}}}*/
++void           MasstransportAnalysis::MassMatrix(Matrix<IssmDouble>** pMff,FemModel* femmodel){/*{{{*/
+ 
+-	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinates(&xyz_list);
+-	Input* vxaverage_input=element->GetInput(VxEnum); _assert_(vxaverage_input);
+-	Input* vyaverage_input=element->GetInput(VyEnum); _assert_(vyaverage_input);
++	/*Initialize Mass matrix*/
++	Matrix<IssmDouble> *Mff = NULL;
++	AllocateSystemMatricesx(&Mff,NULL,NULL,NULL,femmodel);
+ 
+-	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=element->NewGauss(2);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		GetB(B,element,dim,xyz_list,gauss);
+-		GetBprime(Bprime,element,dim,xyz_list,gauss);
+-		vxaverage_input->GetInputValue(&vx,gauss);
+-		vyaverage_input->GetInputValue(&vy,gauss);
+-
+-		D[0*dim+0] = -gauss->weight*vx*Jdet;
+-		D[1*dim+1] = -gauss->weight*vy*Jdet;
+-
+-		TripleMultiply(B,dim,numnodes,1,
+-					D,dim,dim,0,
+-					Bprime,dim,numnodes,0,
+-					&Ke->values[0],1);
+-
++	/*Create and assemble matrix*/
++	for(int i=0;i<femmodel->elements->Size();i++){
++		Element*       element = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		ElementMatrix* MLe     = this->CreateMassMatrix(element);
++		if(MLe){
++			MLe->AddToGlobal(Mff);
++		}
++		delete MLe;
+ 	}
++	Mff->Assemble();
+ 
+-	/*Clean up and return*/
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(B);
+-	xDelete<IssmDouble>(Bprime);
+-	xDelete<IssmDouble>(D);
+-	delete gauss;
+-	return Ke;
++	/*Assign output pointer*/
++	*pMff=Mff;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.h	(revision 18930)
+@@ -12,12 +12,12 @@
+ 	
+ public:
+ 	/*Model processing*/
++	void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++	void CreateLoads(Loads* loads, IoModel* iomodel);
++	void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 	int  DofsPerNode(int** doflist,int domaintype,int approximation);
++	void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 	void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-	void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-	void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-	void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-	void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 	/*Finite element Analysis*/
+ 	void           Core(FemModel* femmodel);
+@@ -25,18 +25,16 @@
+ 	ElementMatrix* CreateJacobianMatrix(Element* element);
+ 	ElementMatrix* CreateKMatrix(Element* element);
+ 	ElementVector* CreatePVector(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-	void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-	void UpdateConstraints(FemModel* femmodel);
+-	void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-	void GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-	
+-	/* Other */
+-	void SetReinitSPCs(FemModel* femmodel);
+-	void SetDistanceOnIntersectedElements(FemModel* femmodel);
+-	void SetDistanceToZeroLevelsetElement(Vector<IssmDouble>* vec_dist, Element* element);
+-	IssmDouble GetDistanceToStraight(IssmDouble* q, IssmDouble* s0, IssmDouble* s1);
+-	bool ReinitConvergence(Vector<IssmDouble>* lsfg,Vector<IssmDouble>* lsfg_old,IssmDouble reltol);
++	void           GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++	void           GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++	IssmDouble     GetDistanceToStraight(IssmDouble* q, IssmDouble* s0, IssmDouble* s1);
++	void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++	void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++	void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++	bool           ReinitConvergence(Vector<IssmDouble>* lsfg,Vector<IssmDouble>* lsfg_old,IssmDouble reltol);
++	void           SetDistanceOnIntersectedElements(FemModel* femmodel);
++	void           SetDistanceToZeroLevelsetElement(Vector<IssmDouble>* vec_dist, Element* element);
++	void           SetReinitSPCs(FemModel* femmodel);
++	void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp	(revision 18930)
+@@ -5,22 +5,22 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processor*/
+-int  AdjointBalancethickness2Analysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+-	return 1;
+-}/*}}}*/
+-void AdjointBalancethickness2Analysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++void AdjointBalancethickness2Analysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+ 	_error_("not implemented yet");
+ }/*}}}*/
+-void AdjointBalancethickness2Analysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
++void AdjointBalancethickness2Analysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+ 	_error_("not implemented yet");
+ }/*}}}*/
+ void AdjointBalancethickness2Analysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 	_error_("not implemented yet");
+ }/*}}}*/
+-void AdjointBalancethickness2Analysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++int  AdjointBalancethickness2Analysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
++	return 1;
++}/*}}}*/
++void AdjointBalancethickness2Analysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 	_error_("not implemented yet");
+ }/*}}}*/
+-void AdjointBalancethickness2Analysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++void AdjointBalancethickness2Analysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ 	_error_("not implemented yet");
+ }/*}}}*/
+ 
+@@ -105,10 +105,10 @@
+ 	return pe;
+ 
+ }/*}}}*/
+-void AdjointBalancethickness2Analysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           AdjointBalancethickness2Analysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	_error_("not implemented yet");
+ }/*}}}*/
+-void AdjointBalancethickness2Analysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           AdjointBalancethickness2Analysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	/*The gradient of the cost function is calculated in 2 parts.
+ 	 *
+ 	 * dJ    \partial J   \partial lambda^T(KU-F)
+@@ -145,10 +145,10 @@
+ 	xDelete<int>(responses);
+ 
+ }/*}}}*/
+-void AdjointBalancethickness2Analysis::GradientJOmega(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++void           AdjointBalancethickness2Analysis::GradientJdHdt(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+ 	/*Intermediaries*/
+-	IssmDouble dlambda[2],ds[2],D0,omega,Jdet; 
++	IssmDouble lambda,Jdet; 
+ 	IssmDouble *xyz_list= NULL;
+ 
+ 	/*Fetch number of vertices for this finite element*/
+@@ -163,9 +163,6 @@
+ 	element->GetVerticesCoordinates(&xyz_list);
+ 	element->GradientIndexing(&vertexpidlist[0],control_index);
+ 	Input* adjoint_input = element->GetInput(AdjointEnum);            _assert_(adjoint_input);
+-	Input* s_input       = element->GetInput(SurfaceEnum);            _assert_(s_input);
+-	Input* D0_input      = element->GetInput(BalancethicknessD0Enum); _assert_(D0_input);
+-	Input* omega_input   = element->GetInput(BalancethicknessOmegaEnum); _assert_(omega_input);
+ 
+ 	Gauss* gauss=element->NewGauss(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+@@ -174,14 +171,11 @@
+ 		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+ 		element->NodalFunctionsP1(basis,gauss);
+ 
+-		D0_input->GetInputValue(&D0,gauss);
+-		omega_input->GetInputValue(&omega,gauss);
+-		adjoint_input->GetInputDerivativeValue(&dlambda[0],xyz_list,gauss);
+-		s_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);
++		adjoint_input->GetInputValue(&lambda,gauss);
+ 
+ 		/*Build gradient vector (actually -dJ/da): */
+ 		for(int i=0;i<numvertices;i++){
+-			ge[i]+= -Jdet*gauss->weight*basis[i]*exp(omega)*D0*(ds[0]*dlambda[0] + ds[1]*dlambda[1]);
++			ge[i]+= -Jdet*gauss->weight*basis[i]*lambda;
+ 			_assert_(!xIsNan<IssmDouble>(ge[i]));
+ 		}
+ 	}
+@@ -194,10 +188,10 @@
+ 	xDelete<int>(vertexpidlist);
+ 	delete gauss;
+ }/*}}}*/
+-void AdjointBalancethickness2Analysis::GradientJdHdt(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++void           AdjointBalancethickness2Analysis::GradientJOmega(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+ 	/*Intermediaries*/
+-	IssmDouble lambda,Jdet; 
++	IssmDouble dlambda[2],ds[2],D0,omega,Jdet; 
+ 	IssmDouble *xyz_list= NULL;
+ 
+ 	/*Fetch number of vertices for this finite element*/
+@@ -212,6 +206,9 @@
+ 	element->GetVerticesCoordinates(&xyz_list);
+ 	element->GradientIndexing(&vertexpidlist[0],control_index);
+ 	Input* adjoint_input = element->GetInput(AdjointEnum);            _assert_(adjoint_input);
++	Input* s_input       = element->GetInput(SurfaceEnum);            _assert_(s_input);
++	Input* D0_input      = element->GetInput(BalancethicknessD0Enum); _assert_(D0_input);
++	Input* omega_input   = element->GetInput(BalancethicknessOmegaEnum); _assert_(omega_input);
+ 
+ 	Gauss* gauss=element->NewGauss(2);
+ 	for(int ig=gauss->begin();ig<gauss->end();ig++){
+@@ -220,11 +217,14 @@
+ 		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+ 		element->NodalFunctionsP1(basis,gauss);
+ 
+-		adjoint_input->GetInputValue(&lambda,gauss);
++		D0_input->GetInputValue(&D0,gauss);
++		omega_input->GetInputValue(&omega,gauss);
++		adjoint_input->GetInputDerivativeValue(&dlambda[0],xyz_list,gauss);
++		s_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);
+ 
+ 		/*Build gradient vector (actually -dJ/da): */
+ 		for(int i=0;i<numvertices;i++){
+-			ge[i]+= -Jdet*gauss->weight*basis[i]*lambda;
++			ge[i]+= -Jdet*gauss->weight*basis[i]*exp(omega)*D0*(ds[0]*dlambda[0] + ds[1]*dlambda[1]);
+ 			_assert_(!xIsNan<IssmDouble>(ge[i]));
+ 		}
+ 	}
+@@ -237,10 +237,10 @@
+ 	xDelete<int>(vertexpidlist);
+ 	delete gauss;
+ }/*}}}*/
+-void AdjointBalancethickness2Analysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           AdjointBalancethickness2Analysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 	element->InputUpdateFromSolutionOneDof(solution,AdjointEnum);
+ }/*}}}*/
+-void AdjointBalancethickness2Analysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           AdjointBalancethickness2Analysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.cpp	(revision 18930)
+@@ -5,22 +5,36 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
+-int  HydrologyShreveAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+-	return 1;
++void HydrologyShreveAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++
++	/*retrieve some parameters: */
++	int          hydrology_model;
++	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
++
++	if(hydrology_model!=HydrologyshreveEnum) return;
++
++	IoModelToConstraintsx(constraints,iomodel,HydrologyshreveSpcwatercolumnEnum,HydrologyShreveAnalysisEnum,P1Enum);
++
+ }/*}}}*/
+-void HydrologyShreveAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++void HydrologyShreveAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++	/*No loads*/
++}/*}}}*/
++void HydrologyShreveAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 
+-	/*retrieve some parameters: */
++	/*Fetch parameters: */
+ 	int  hydrology_model;
+ 	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
+ 
+ 	/*Now, do we really want Shreve?*/
+ 	if(hydrology_model!=HydrologyshreveEnum) return;
+ 
+-	parameters->AddObject(new IntParam(HydrologyModelEnum,hydrology_model));
+-	parameters->AddObject(iomodel->CopyConstantObject(HydrologyshreveStabilizationEnum));
+-
++	if(iomodel->domaintype==Domain3DEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++	::CreateNodes(nodes,iomodel,HydrologyShreveAnalysisEnum,P1Enum);
++	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+ }/*}}}*/
++int  HydrologyShreveAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
++	return 1;
++}/*}}}*/
+ void HydrologyShreveAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	/*Fetch data needed: */
+@@ -54,33 +68,19 @@
+ 
+ 	elements->InputDuplicate(WatercolumnEnum,WaterColumnOldEnum);
+ }/*}}}*/
+-void HydrologyShreveAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++void HydrologyShreveAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ 
+-	/*Fetch parameters: */
++	/*retrieve some parameters: */
+ 	int  hydrology_model;
+ 	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
+ 
+ 	/*Now, do we really want Shreve?*/
+ 	if(hydrology_model!=HydrologyshreveEnum) return;
+ 
+-	if(iomodel->domaintype==Domain3DEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-	::CreateNodes(nodes,iomodel,HydrologyShreveAnalysisEnum,P1Enum);
+-	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-}/*}}}*/
+-void HydrologyShreveAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++	parameters->AddObject(new IntParam(HydrologyModelEnum,hydrology_model));
++	parameters->AddObject(iomodel->CopyConstantObject(HydrologyshreveStabilizationEnum));
+ 
+-	/*retrieve some parameters: */
+-	int          hydrology_model;
+-	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
+-
+-	if(hydrology_model!=HydrologyshreveEnum) return;
+-
+-	IoModelToConstraintsx(constraints,iomodel,HydrologyshreveSpcwatercolumnEnum,HydrologyShreveAnalysisEnum,P1Enum);
+-
+ }/*}}}*/
+-void HydrologyShreveAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+-	/*No loads*/
+-}/*}}}*/
+ 
+ /*Finite Element Analysis*/
+ void           HydrologyShreveAnalysis::Core(FemModel* femmodel){/*{{{*/
+@@ -90,6 +90,50 @@
+ 	/*Default, return NULL*/
+ 	return NULL;
+ }/*}}}*/
++void           HydrologyShreveAnalysis::CreateHydrologyWaterVelocityInput(Element* element){/*{{{*/
++
++	/*Intermediaries*/
++	IssmDouble dsdx,dsdy,dbdx,dbdy,w;
++
++	/*Retrieve all inputs and parameters*/
++	IssmDouble  rho_ice   = element->GetMaterialParameter(MaterialsRhoIceEnum);
++	IssmDouble  rho_water = element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
++	IssmDouble  g         = element->GetMaterialParameter(ConstantsGEnum);
++	IssmDouble  mu_water  = element->GetMaterialParameter(MaterialsMuWaterEnum);
++	Input* surfaceslopex_input = element->GetInput(SurfaceSlopeXEnum); _assert_(surfaceslopex_input);
++	Input* surfaceslopey_input = element->GetInput(SurfaceSlopeYEnum); _assert_(surfaceslopey_input);
++	Input* bedslopex_input     = element->GetInput(BedSlopeXEnum);     _assert_(bedslopex_input);
++	Input* bedslopey_input     = element->GetInput(BedSlopeYEnum);     _assert_(bedslopey_input);
++	Input* watercolumn_input   = element->GetInput(WatercolumnEnum);   _assert_(watercolumn_input);
++
++	/*Fetch number of vertices and allocate output*/
++	int numvertices = element->GetNumberOfVertices();
++	IssmDouble* vx  = xNew<IssmDouble>(numvertices);
++	IssmDouble* vy  = xNew<IssmDouble>(numvertices);
++
++	Gauss* gauss=element->NewGauss();
++	for(int iv=0;iv<numvertices;iv++){
++		gauss->GaussVertex(iv);
++		surfaceslopex_input->GetInputValue(&dsdx,gauss);
++		surfaceslopey_input->GetInputValue(&dsdy,gauss);
++		bedslopex_input->GetInputValue(&dbdx,gauss);
++		bedslopey_input->GetInputValue(&dbdy,gauss);
++		watercolumn_input->GetInputValue(&w,gauss);
++
++		/* Water velocity x and y components */
++		vx[iv]= - w*w/(12 * mu_water)*(rho_ice*g*dsdx+(rho_water-rho_ice)*g*dbdx);
++		vy[iv]= - w*w/(12 * mu_water)*(rho_ice*g*dsdy+(rho_water-rho_ice)*g*dbdy);
++	}
++
++	/*clean-up*/
++	delete gauss;
++
++	/*Add to inputs*/
++	element->AddInput(HydrologyWaterVxEnum,vx,P1Enum);
++	element->AddInput(HydrologyWaterVyEnum,vy,P1Enum);
++	xDelete<IssmDouble>(vx);
++	xDelete<IssmDouble>(vy);
++}/*}}}*/
+ ElementMatrix* HydrologyShreveAnalysis::CreateJacobianMatrix(Element* element){/*{{{*/
+ _error_("Not implemented");
+ }/*}}}*/
+@@ -233,7 +277,7 @@
+ 	delete gauss;
+ 	return pe;
+ }/*}}}*/
+-void HydrologyShreveAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           HydrologyShreveAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
+ 	 * For node i, Bi can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -260,7 +304,7 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(basis);
+ }/*}}}*/
+-void HydrologyShreveAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           HydrologyShreveAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 
+ 	 * For node i, Bi' can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -288,13 +332,13 @@
+ 	xDelete<IssmDouble>(dbasis);
+ 
+ }/*}}}*/
+-void HydrologyShreveAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           HydrologyShreveAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	element->GetSolutionFromInputsOneDof(solution,WatercolumnEnum);
+ }/*}}}*/
+-void HydrologyShreveAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           HydrologyShreveAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void HydrologyShreveAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           HydrologyShreveAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	/*Intermediary*/
+ 	int* doflist = NULL;
+@@ -320,59 +364,12 @@
+ 	xDelete<IssmDouble>(values);
+ 	xDelete<int>(doflist);
+ }/*}}}*/
+-void HydrologyShreveAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           HydrologyShreveAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+ }/*}}}*/
+ 
+-/*Intermediaries*/
+-void HydrologyShreveAnalysis::CreateHydrologyWaterVelocityInput(Element* element){/*{{{*/
+ 
+-	/*Intermediaries*/
+-	IssmDouble dsdx,dsdy,dbdx,dbdy,w;
+-
+-	/*Retrieve all inputs and parameters*/
+-	IssmDouble  rho_ice   = element->GetMaterialParameter(MaterialsRhoIceEnum);
+-	IssmDouble  rho_water = element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
+-	IssmDouble  g         = element->GetMaterialParameter(ConstantsGEnum);
+-	IssmDouble  mu_water  = element->GetMaterialParameter(MaterialsMuWaterEnum);
+-	Input* surfaceslopex_input = element->GetInput(SurfaceSlopeXEnum); _assert_(surfaceslopex_input);
+-	Input* surfaceslopey_input = element->GetInput(SurfaceSlopeYEnum); _assert_(surfaceslopey_input);
+-	Input* bedslopex_input     = element->GetInput(BedSlopeXEnum);     _assert_(bedslopex_input);
+-	Input* bedslopey_input     = element->GetInput(BedSlopeYEnum);     _assert_(bedslopey_input);
+-	Input* watercolumn_input   = element->GetInput(WatercolumnEnum);   _assert_(watercolumn_input);
+-
+-	/*Fetch number of vertices and allocate output*/
+-	int numvertices = element->GetNumberOfVertices();
+-	IssmDouble* vx  = xNew<IssmDouble>(numvertices);
+-	IssmDouble* vy  = xNew<IssmDouble>(numvertices);
+-
+-	Gauss* gauss=element->NewGauss();
+-	for(int iv=0;iv<numvertices;iv++){
+-		gauss->GaussVertex(iv);
+-		surfaceslopex_input->GetInputValue(&dsdx,gauss);
+-		surfaceslopey_input->GetInputValue(&dsdy,gauss);
+-		bedslopex_input->GetInputValue(&dbdx,gauss);
+-		bedslopey_input->GetInputValue(&dbdy,gauss);
+-		watercolumn_input->GetInputValue(&w,gauss);
+-
+-		/* Water velocity x and y components */
+-		vx[iv]= - w*w/(12 * mu_water)*(rho_ice*g*dsdx+(rho_water-rho_ice)*g*dbdx);
+-		vy[iv]= - w*w/(12 * mu_water)*(rho_ice*g*dsdy+(rho_water-rho_ice)*g*dbdy);
+-	}
+-
+-	/*clean-up*/
+-	delete gauss;
+-
+-	/*Add to inputs*/
+-	element->AddInput(HydrologyWaterVxEnum,vx,P1Enum);
+-	element->AddInput(HydrologyWaterVyEnum,vy,P1Enum);
+-	xDelete<IssmDouble>(vx);
+-	xDelete<IssmDouble>(vy);
+-}/*}}}*/
+-
+-
+-
+ /*Needed changes to switch to the Johnson formulation*//*{{{*/
+ /*All the changes are to be done in the velocity computation.
+ 	The new velocity needs some new parameter that should be introduce in the hydrologyshreve class:
+Index: ../trunk-jpl/src/c/analyses/BalancevelocityAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/BalancevelocityAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/BalancevelocityAnalysis.cpp	(revision 18930)
+@@ -5,11 +5,26 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
++void BalancevelocityAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++
++	/*No constraints for now*/
++	//IoModelToConstraintsx(constraints,iomodel,BalancethicknessSpcthicknessEnum,BalancevelocityAnalysisEnum,P1Enum);
++}/*}}}*/
++void BalancevelocityAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++
++	/*No loads*/
++}/*}}}*/
++void BalancevelocityAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++
++	/*Check in 3d*/
++	if(iomodel->domaintype==Domain3DEnum) _error_("DG 3d not implemented yet");
++
++	/*First fetch data: */
++	::CreateNodes(nodes,iomodel,BalancevelocityAnalysisEnum,P1Enum);
++}/*}}}*/
+ int  BalancevelocityAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+ 	return 1;
+ }/*}}}*/
+-void BalancevelocityAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-}/*}}}*/
+ void BalancevelocityAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	/*Update elements: */
+@@ -37,24 +52,9 @@
+ 		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
+ 	}
+ }/*}}}*/
+-void BalancevelocityAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-
+-	/*Check in 3d*/
+-	if(iomodel->domaintype==Domain3DEnum) _error_("DG 3d not implemented yet");
+-
+-	/*First fetch data: */
+-	::CreateNodes(nodes,iomodel,BalancevelocityAnalysisEnum,P1Enum);
++void BalancevelocityAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ }/*}}}*/
+-void BalancevelocityAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+ 
+-	/*No constraints for now*/
+-	//IoModelToConstraintsx(constraints,iomodel,BalancethicknessSpcthicknessEnum,BalancevelocityAnalysisEnum,P1Enum);
+-}/*}}}*/
+-void BalancevelocityAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+-
+-	/*No loads*/
+-}/*}}}*/
+-
+ /*Finite Element Analysis*/
+ void           BalancevelocityAnalysis::Core(FemModel* femmodel){/*{{{*/
+ 	_error_("not implemented");
+@@ -237,13 +237,13 @@
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 	return pe;
+ }/*}}}*/
+-void BalancevelocityAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           BalancevelocityAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void BalancevelocityAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           BalancevelocityAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void BalancevelocityAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           BalancevelocityAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	int domaintype;
+ 	element->FindParam(&domaintype,DomainTypeEnum);
+@@ -257,7 +257,7 @@
+ 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+ 	}
+ }/*}}}*/
+-void BalancevelocityAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           BalancevelocityAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp	(revision 18930)
+@@ -5,11 +5,28 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
++void L2ProjectionBaseAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++
++	/*No constraints*/
++}/*}}}*/
++void L2ProjectionBaseAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++
++	/*No loads*/
++}/*}}}*/
++void L2ProjectionBaseAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++
++	if(iomodel->domaintype==Domain3DEnum){
++		iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++	}
++	else if(iomodel->domaintype==Domain2DverticalEnum){
++		iomodel->FetchData(1,MeshVertexonbaseEnum);
++	}
++	::CreateNodes(nodes,iomodel,L2ProjectionBaseAnalysisEnum,P1Enum);
++	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++}/*}}}*/
+ int  L2ProjectionBaseAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+ 	return 1;
+ }/*}}}*/
+-void L2ProjectionBaseAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-}/*}}}*/
+ void L2ProjectionBaseAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	/*Update elements: */
+@@ -30,26 +47,9 @@
+ 		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
+ 	}
+ }/*}}}*/
+-void L2ProjectionBaseAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-
+-	if(iomodel->domaintype==Domain3DEnum){
+-		iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-	}
+-	else if(iomodel->domaintype==Domain2DverticalEnum){
+-		iomodel->FetchData(1,MeshVertexonbaseEnum);
+-	}
+-	::CreateNodes(nodes,iomodel,L2ProjectionBaseAnalysisEnum,P1Enum);
+-	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++void L2ProjectionBaseAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ }/*}}}*/
+-void L2ProjectionBaseAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+ 
+-	/*No constraints*/
+-}/*}}}*/
+-void L2ProjectionBaseAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+-
+-	/*No loads*/
+-}/*}}}*/
+-
+ /*Finite Element Analysis*/
+ void           L2ProjectionBaseAnalysis::Core(FemModel* femmodel){/*{{{*/
+ 	_error_("not implemented");
+@@ -195,13 +195,13 @@
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 	return pe;
+ }/*}}}*/
+-void L2ProjectionBaseAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           L2ProjectionBaseAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void L2ProjectionBaseAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           L2ProjectionBaseAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void L2ProjectionBaseAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           L2ProjectionBaseAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	int inputenum,domaintype,elementtype;
+ 
+@@ -224,7 +224,7 @@
+ 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+ 	}
+ }/*}}}*/
+-void L2ProjectionBaseAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           L2ProjectionBaseAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.h	(revision 18930)
+@@ -12,12 +12,12 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+@@ -25,12 +25,12 @@
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void GradientJVx(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJVy(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJDhDt(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           GradientJDhDt(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJVx(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJVy(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.cpp	(revision 18930)
+@@ -9,12 +9,21 @@
+ #include "../modules/GetVectorFromInputsx/GetVectorFromInputsx.h"
+ 
+ /*Model processing*/
++void LsfReinitializationAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++	/* Do nothing for now */
++}/*}}}*/
++void LsfReinitializationAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++	/* Do nothing for now */
++}/*}}}*/
++void LsfReinitializationAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++	int finiteelement=P1Enum;
++	if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++	::CreateNodes(nodes,iomodel,LsfReinitializationAnalysisEnum,finiteelement);
++	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++}/*}}}*/
+ int  LsfReinitializationAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+ 	return 1;
+ }/*}}}*/
+-void LsfReinitializationAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-	/* Do nothing for now */
+-}/*}}}*/
+ void LsfReinitializationAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 	int    finiteelement;
+ 
+@@ -33,21 +42,12 @@
+ 
+ 	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
+ }/*}}}*/
+-void LsfReinitializationAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-	int finiteelement=P1Enum;
+-	if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-	::CreateNodes(nodes,iomodel,LsfReinitializationAnalysisEnum,finiteelement);
+-	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-}/*}}}*/
+-void LsfReinitializationAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++void LsfReinitializationAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ 	/* Do nothing for now */
+ }/*}}}*/
+-void LsfReinitializationAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+-	/* Do nothing for now */
+-}/*}}}*/
+ 
+ /*Finite element Analysis*/
+-void  LsfReinitializationAnalysis::Core(FemModel* femmodel){/*{{{*/
++void           LsfReinitializationAnalysis::Core(FemModel* femmodel){/*{{{*/
+ 
+ 	/*parameters: */
+ 	bool save_results;
+@@ -248,62 +248,7 @@
+ 	xDelete<IssmDouble>(normal);
+ 	return pe;
+ 	}/*}}}*/
+-void LsfReinitializationAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+-
+-	IssmDouble   lsf;
+-	int          dim;
+-	int*         doflist = NULL;
+-
+-	/*Get some parameters*/
+-	element->FindParam(&dim,DomainDimensionEnum);
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-
+-	/*Fetch dof list and allocate solution vector*/
+-	element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
+-	IssmDouble* values = xNew<IssmDouble>(numnodes);
+-
+-	/*Get inputs*/
+-	Input* lsf_input=element->GetInput(MaskIceLevelsetEnum); _assert_(lsf_input);
+-
+-	Gauss* gauss=element->NewGauss();
+-	for(int i=0;i<numnodes;i++){
+-		gauss->GaussNode(element->FiniteElement(),i);
+-
+-		lsf_input->GetInputValue(&lsf,gauss);
+-		values[i]=lsf;
+-	}
+-
+-	solution->SetValues(numnodes,doflist,values,INS_VAL);
+-
+-	/*Free ressources:*/
+-	delete gauss;
+-	xDelete<IssmDouble>(values);
+-	xDelete<int>(doflist);
+-
+-}/*}}}*/
+-void LsfReinitializationAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+-	_error_("Not implemented yet");
+-}/*}}}*/
+-void LsfReinitializationAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+-
+-	int domaintype;
+-	element->FindParam(&domaintype,DomainTypeEnum);
+-	switch(domaintype){
+-		case Domain2DhorizontalEnum:
+-			element->InputUpdateFromSolutionOneDof(solution,MaskIceLevelsetEnum);
+-			break;
+-		case Domain3DEnum:
+-			element->InputUpdateFromSolutionOneDofCollapsed(solution,MaskIceLevelsetEnum);
+-			break;
+-		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+-	}
+-}/*}}}*/
+-void LsfReinitializationAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+-	/* Do nothing for now */
+-}/*}}}*/
+-void LsfReinitializationAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           LsfReinitializationAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
+ 	 * For node i, Bi can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -330,7 +275,7 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(basis);
+ }/*}}}*/
+-void LsfReinitializationAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           LsfReinitializationAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 
+ 	 * For node i, Bi' can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -358,47 +303,109 @@
+ 	xDelete<IssmDouble>(dbasis);
+ 
+ }/*}}}*/
++IssmDouble     LsfReinitializationAnalysis::GetDistanceToStraight(IssmDouble* q, IssmDouble* s0, IssmDouble* s1){/*{{{*/
++	// returns distance d of point q to straight going through points s0, s1
++	// d=|a x b|/|b|
++	// with a=q-s0, b=s1-s0
++	
++	/* Intermediaries */
++	const int dim=2;
++	int i;
++	IssmDouble a[dim], b[dim];
++	IssmDouble norm_b;
+ 
+-/* Other */
+-void LsfReinitializationAnalysis::SetReinitSPCs(FemModel* femmodel){/*{{{*/
++	for(i=0;i<dim;i++){
++		a[i]=q[i]-s0[i];
++		b[i]=s1[i]-s0[i];
++	}
++	
++	norm_b=0.;
++	for(i=0;i<dim;i++)
++		norm_b+=b[i]*b[i];
++	norm_b=sqrt(norm_b);
++	_assert_(norm_b>0.);
+ 
+-	int i,k, numnodes;
+-	Element* element;
+-	Node* node;
++	return fabs(a[0]*b[1]-a[1]*b[0])/norm_b;
++}/*}}}*/
++void           LsfReinitializationAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 
+-	/* deactivate all spcs */
+-	for(i=0;i<femmodel->elements->Size();i++){
+-		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-		for(k=0;k<element->GetNumberOfNodes();k++){
+-			node=element->GetNode(k);
+-			if(node->IsActive()){
+-				node->DofInFSet(0); 
+-			}
+-		}
++	IssmDouble   lsf;
++	int          dim;
++	int*         doflist = NULL;
++
++	/*Get some parameters*/
++	element->FindParam(&dim,DomainDimensionEnum);
++
++	/*Fetch number of nodes and dof for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++
++	/*Fetch dof list and allocate solution vector*/
++	element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
++	IssmDouble* values = xNew<IssmDouble>(numnodes);
++
++	/*Get inputs*/
++	Input* lsf_input=element->GetInput(MaskIceLevelsetEnum); _assert_(lsf_input);
++
++	Gauss* gauss=element->NewGauss();
++	for(int i=0;i<numnodes;i++){
++		gauss->GaussNode(element->FiniteElement(),i);
++
++		lsf_input->GetInputValue(&lsf,gauss);
++		values[i]=lsf;
+ 	}
+ 
+-	SetDistanceOnIntersectedElements(femmodel);
++	solution->SetValues(numnodes,doflist,values,INS_VAL);
+ 
+-	/* reactivate spcs on elements intersected by zero levelset */
+-	for(i=0;i<femmodel->elements->Size();i++){
+-		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-		if(element->IsZeroLevelset(MaskIceLevelsetEnum)){
+-			/*iterate over nodes and set spc */
+-			numnodes=element->GetNumberOfNodes();
+-			IssmDouble* lsf = xNew<IssmDouble>(numnodes);
+-			element->GetInputListOnNodes(&lsf[0],MaskIceLevelsetEnum);
+-			for(k=0;k<numnodes;k++){
+-				node=element->GetNode(k);
+-				if(node->IsActive()){
+-					node->ApplyConstraint(0,lsf[k]);
+-				}
+-			}
+-			xDelete<IssmDouble>(lsf);
+-		}
++	/*Free ressources:*/
++	delete gauss;
++	xDelete<IssmDouble>(values);
++	xDelete<int>(doflist);
++
++}/*}}}*/
++void           LsfReinitializationAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++	_error_("Not implemented yet");
++}/*}}}*/
++void           LsfReinitializationAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++
++	int domaintype;
++	element->FindParam(&domaintype,DomainTypeEnum);
++	switch(domaintype){
++		case Domain2DhorizontalEnum:
++			element->InputUpdateFromSolutionOneDof(solution,MaskIceLevelsetEnum);
++			break;
++		case Domain3DEnum:
++			element->InputUpdateFromSolutionOneDofCollapsed(solution,MaskIceLevelsetEnum);
++			break;
++		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+ 	}
++}/*}}}*/
++bool           LsfReinitializationAnalysis::ReinitConvergence(Vector<IssmDouble>* lsfg,Vector<IssmDouble>* lsfg_old,IssmDouble reltol){/*{{{*/
+ 
++	/*Output*/
++	bool converged = true;
++
++	/*Intermediary*/
++	Vector<IssmDouble>* dlsfg    = NULL;
++	IssmDouble          norm_dlsf,norm_lsf;
++
++	/*compute norm(du)/norm(u)*/
++	dlsfg=lsfg_old->Duplicate(); lsfg_old->Copy(dlsfg); dlsfg->AYPX(lsfg,-1.0);
++	norm_dlsf=dlsfg->Norm(NORM_TWO); norm_lsf=lsfg_old->Norm(NORM_TWO);
++	if (xIsNan<IssmDouble>(norm_dlsf) || xIsNan<IssmDouble>(norm_lsf)) _error_("convergence criterion is NaN!");
++	if((norm_dlsf/norm_lsf)<reltol){
++		if(VerboseConvergence()) _printf0_("\n"<<setw(50)<<left<<"   Velocity convergence: norm(du)/norm(u)"<<norm_dlsf/norm_lsf*100<<" < "<<reltol*100<<" %\n");
++	}
++	else{ 
++		if(VerboseConvergence()) _printf0_("\n"<<setw(50)<<left<<"   Velocity convergence: norm(du)/norm(u)"<<norm_dlsf/norm_lsf*100<<" > "<<reltol*100<<" %\n");
++		converged=false;
++	}
++
++	/*Cleanup*/
++	delete dlsfg;
++
++	return converged;
+ }/*}}}*/
+-void LsfReinitializationAnalysis::SetDistanceOnIntersectedElements(FemModel* femmodel){/*{{{*/
++void           LsfReinitializationAnalysis::SetDistanceOnIntersectedElements(FemModel* femmodel){/*{{{*/
+ 
+ 	/* Intermediaries */
+ 	int i;
+@@ -450,7 +457,7 @@
+ 	delete dist_zerolevelset;
+ 
+ }/*}}}*/
+-void LsfReinitializationAnalysis::SetDistanceToZeroLevelsetElement(Vector<IssmDouble>* vec_signed_dist, Element* element){/*{{{*/
++void           LsfReinitializationAnalysis::SetDistanceToZeroLevelsetElement(Vector<IssmDouble>* vec_signed_dist, Element* element){/*{{{*/
+ 
+ 	if(!element->IsZeroLevelset(MaskIceLevelsetEnum))
+ 		return;
+@@ -509,53 +516,44 @@
+ 	xDelete<IssmDouble>(v);
+ 
+ }/*}}}*/
+-IssmDouble LsfReinitializationAnalysis::GetDistanceToStraight(IssmDouble* q, IssmDouble* s0, IssmDouble* s1){/*{{{*/
+-	// returns distance d of point q to straight going through points s0, s1
+-	// d=|a x b|/|b|
+-	// with a=q-s0, b=s1-s0
+-	
+-	/* Intermediaries */
+-	const int dim=2;
+-	int i;
+-	IssmDouble a[dim], b[dim];
+-	IssmDouble norm_b;
++void           LsfReinitializationAnalysis::SetReinitSPCs(FemModel* femmodel){/*{{{*/
+ 
+-	for(i=0;i<dim;i++){
+-		a[i]=q[i]-s0[i];
+-		b[i]=s1[i]-s0[i];
++	int i,k, numnodes;
++	Element* element;
++	Node* node;
++
++	/* deactivate all spcs */
++	for(i=0;i<femmodel->elements->Size();i++){
++		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		for(k=0;k<element->GetNumberOfNodes();k++){
++			node=element->GetNode(k);
++			if(node->IsActive()){
++				node->DofInFSet(0); 
++			}
++		}
+ 	}
+-	
+-	norm_b=0.;
+-	for(i=0;i<dim;i++)
+-		norm_b+=b[i]*b[i];
+-	norm_b=sqrt(norm_b);
+-	_assert_(norm_b>0.);
+ 
+-	return fabs(a[0]*b[1]-a[1]*b[0])/norm_b;
+-}/*}}}*/
+-bool LsfReinitializationAnalysis::ReinitConvergence(Vector<IssmDouble>* lsfg,Vector<IssmDouble>* lsfg_old,IssmDouble reltol){/*{{{*/
++	SetDistanceOnIntersectedElements(femmodel);
+ 
+-	/*Output*/
+-	bool converged = true;
+-
+-	/*Intermediary*/
+-	Vector<IssmDouble>* dlsfg    = NULL;
+-	IssmDouble          norm_dlsf,norm_lsf;
+-
+-	/*compute norm(du)/norm(u)*/
+-	dlsfg=lsfg_old->Duplicate(); lsfg_old->Copy(dlsfg); dlsfg->AYPX(lsfg,-1.0);
+-	norm_dlsf=dlsfg->Norm(NORM_TWO); norm_lsf=lsfg_old->Norm(NORM_TWO);
+-	if (xIsNan<IssmDouble>(norm_dlsf) || xIsNan<IssmDouble>(norm_lsf)) _error_("convergence criterion is NaN!");
+-	if((norm_dlsf/norm_lsf)<reltol){
+-		if(VerboseConvergence()) _printf0_("\n"<<setw(50)<<left<<"   Velocity convergence: norm(du)/norm(u)"<<norm_dlsf/norm_lsf*100<<" < "<<reltol*100<<" %\n");
++	/* reactivate spcs on elements intersected by zero levelset */
++	for(i=0;i<femmodel->elements->Size();i++){
++		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		if(element->IsZeroLevelset(MaskIceLevelsetEnum)){
++			/*iterate over nodes and set spc */
++			numnodes=element->GetNumberOfNodes();
++			IssmDouble* lsf = xNew<IssmDouble>(numnodes);
++			element->GetInputListOnNodes(&lsf[0],MaskIceLevelsetEnum);
++			for(k=0;k<numnodes;k++){
++				node=element->GetNode(k);
++				if(node->IsActive()){
++					node->ApplyConstraint(0,lsf[k]);
++				}
++			}
++			xDelete<IssmDouble>(lsf);
++		}
+ 	}
+-	else{ 
+-		if(VerboseConvergence()) _printf0_("\n"<<setw(50)<<left<<"   Velocity convergence: norm(du)/norm(u)"<<norm_dlsf/norm_lsf*100<<" > "<<reltol*100<<" %\n");
+-		converged=false;
+-	}
+ 
+-	/*Cleanup*/
+-	delete dlsfg;
+-
+-	return converged;
+ }/*}}}*/
++void           LsfReinitializationAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++	/* Do nothing for now */
++}/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/MasstransportAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/MasstransportAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/MasstransportAnalysis.h	(revision 18930)
+@@ -12,12 +12,12 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+@@ -29,18 +29,18 @@
+ 		ElementVector* CreatePVector(Element* element);
+ 		ElementVector* CreatePVectorCG(Element* element);
+ 		ElementVector* CreatePVectorDG(Element* element);
+-		void GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ 
+ 		/*FCT*/
++		ElementMatrix* CreateFctKMatrix(Element* element);
++		ElementMatrix* CreateMassMatrix(Element* element);
++		void           FctKMatrix(Matrix<IssmDouble>** pKff,Matrix<IssmDouble>** pKfs,FemModel* femmodel);
+ 		void           LumpedMassMatrix(Vector<IssmDouble>** pMLff,FemModel* femmodel);
+ 		void           MassMatrix(Matrix<IssmDouble>** pMff,FemModel* femmodel);
+-		void           FctKMatrix(Matrix<IssmDouble>** pKff,Matrix<IssmDouble>** pKfs,FemModel* femmodel);
+-		ElementMatrix* CreateMassMatrix(Element* element);
+-		ElementMatrix* CreateFctKMatrix(Element* element);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp	(revision 18930)
+@@ -6,49 +6,61 @@
+ #include "../solutionsequences/solutionsequences.h"
+ 
+ /*Model processing*/
+-int  StressbalanceSIAAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+-	return 2;
+-}/*}}}*/
+-void StressbalanceSIAAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++void StressbalanceSIAAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+ 
+-	/*No specific parameters*/
++	/*Intermediary*/
++	int        count;
++	IssmDouble yts;
++	bool       isSIA;
+ 
+-}/*}}}*/
+-void StressbalanceSIAAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+-
+-	/*Fetch data needed: */
+-	bool   isSIA;
+-	bool   islevelset;
++	/*Fetch parameters: */
++	iomodel->Constant(&yts,ConstantsYtsEnum);
+ 	iomodel->Constant(&isSIA,FlowequationIsSIAEnum);
+-	iomodel->Constant(&islevelset,TransientIslevelsetEnum);
+ 
+-	/*Now, is the flag SIA on? otherwise, do nothing: */
+-	if (!isSIA)return;
++	/*Now, is the flag isSIA on? otherwise, do nothing: */
++	if (!isSIA) return;
+ 
+-	iomodel->FetchData(1,FlowequationElementEquationEnum);
++	/*Fetch data: */
++	iomodel->FetchData(3,StressbalanceSpcvxEnum,StressbalanceSpcvyEnum,FlowequationVertexEquationEnum);
+ 
+-	/*Update elements: */
+-	int counter=0;
+-	for(int i=0;i<iomodel->numberofelements;i++){
+-		if(iomodel->my_elements[i]){
+-			Element* element=(Element*)elements->GetObjectByOffset(counter);
+-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+-			counter++;
++	/*Initialize conunter*/
++	count=0;
++
++	/*vx and vy are spc'd if we are not on nodeonSIA: */
++	for(int i=0;i<iomodel->numberofvertices;i++){
++		/*keep only this partition's nodes:*/
++		if((iomodel->my_vertices[i])){
++			if (reCast<int,IssmDouble>(iomodel->Data(FlowequationVertexEquationEnum)[i])!=SIAApproximationEnum){
++
++				constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,0,0,StressbalanceSIAAnalysisEnum));
++				count++;
++
++				constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,0,StressbalanceSIAAnalysisEnum));
++				count++;
++			}
++			else{
++				if (!xIsNan<IssmDouble>(iomodel->Data(StressbalanceSpcvxEnum)[i])){
++					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,0,iomodel->Data(StressbalanceSpcvxEnum)[i]/yts,StressbalanceSIAAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
++					count++;
++				}
++
++				if (!xIsNan<IssmDouble>(iomodel->Data(StressbalanceSpcvyEnum)[i])){
++					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,iomodel->Data(StressbalanceSpcvyEnum)[i]/yts,StressbalanceSIAAnalysisEnum)); //add count'th spc, on node i+1, setting dof 2 to vy
++					count++;
++				}
++			}
+ 		}
+ 	}
+ 
+-	iomodel->FetchDataToInput(elements,ThicknessEnum);
+-	iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
+-	iomodel->FetchDataToInput(elements,MaskGroundediceLevelsetEnum);
+-	if(islevelset){
+-		iomodel->FetchDataToInput(elements,IceMaskNodeActivationEnum);
+-		if(iomodel->domaintype!=Domain2DhorizontalEnum)
+-			iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum); // required for updating active nodes
+-	}
++	/*Free data: */
++	iomodel->DeleteData(3,StressbalanceSpcvxEnum,StressbalanceSpcvyEnum,FlowequationVertexEquationEnum);
+ 
+-	/*Free data: */
+-	iomodel->DeleteData(1,FlowequationElementEquationEnum);
+ }/*}}}*/
++void StressbalanceSIAAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++
++	/*No loads*/
++
++}/*}}}*/
+ void StressbalanceSIAAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 
+ 	/*Intermediaries*/
+@@ -88,59 +100,47 @@
+ 				FlowequationVertexEquationEnum,StressbalanceReferentialEnum);
+ 
+ }/*}}}*/
+-void StressbalanceSIAAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++int  StressbalanceSIAAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
++	return 2;
++}/*}}}*/
++void StressbalanceSIAAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+-	/*Intermediary*/
+-	int        count;
+-	IssmDouble yts;
+-	bool       isSIA;
+-
+-	/*Fetch parameters: */
+-	iomodel->Constant(&yts,ConstantsYtsEnum);
++	/*Fetch data needed: */
++	bool   isSIA;
++	bool   islevelset;
+ 	iomodel->Constant(&isSIA,FlowequationIsSIAEnum);
++	iomodel->Constant(&islevelset,TransientIslevelsetEnum);
+ 
+-	/*Now, is the flag isSIA on? otherwise, do nothing: */
+-	if (!isSIA) return;
++	/*Now, is the flag SIA on? otherwise, do nothing: */
++	if (!isSIA)return;
+ 
+-	/*Fetch data: */
+-	iomodel->FetchData(3,StressbalanceSpcvxEnum,StressbalanceSpcvyEnum,FlowequationVertexEquationEnum);
++	iomodel->FetchData(1,FlowequationElementEquationEnum);
+ 
+-	/*Initialize conunter*/
+-	count=0;
+-
+-	/*vx and vy are spc'd if we are not on nodeonSIA: */
+-	for(int i=0;i<iomodel->numberofvertices;i++){
+-		/*keep only this partition's nodes:*/
+-		if((iomodel->my_vertices[i])){
+-			if (reCast<int,IssmDouble>(iomodel->Data(FlowequationVertexEquationEnum)[i])!=SIAApproximationEnum){
+-
+-				constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,0,0,StressbalanceSIAAnalysisEnum));
+-				count++;
+-
+-				constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,0,StressbalanceSIAAnalysisEnum));
+-				count++;
+-			}
+-			else{
+-				if (!xIsNan<IssmDouble>(iomodel->Data(StressbalanceSpcvxEnum)[i])){
+-					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,0,iomodel->Data(StressbalanceSpcvxEnum)[i]/yts,StressbalanceSIAAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
+-					count++;
+-				}
+-
+-				if (!xIsNan<IssmDouble>(iomodel->Data(StressbalanceSpcvyEnum)[i])){
+-					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,iomodel->Data(StressbalanceSpcvyEnum)[i]/yts,StressbalanceSIAAnalysisEnum)); //add count'th spc, on node i+1, setting dof 2 to vy
+-					count++;
+-				}
+-			}
++	/*Update elements: */
++	int counter=0;
++	for(int i=0;i<iomodel->numberofelements;i++){
++		if(iomodel->my_elements[i]){
++			Element* element=(Element*)elements->GetObjectByOffset(counter);
++			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
++			counter++;
+ 		}
+ 	}
+ 
++	iomodel->FetchDataToInput(elements,ThicknessEnum);
++	iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
++	iomodel->FetchDataToInput(elements,MaskGroundediceLevelsetEnum);
++	if(islevelset){
++		iomodel->FetchDataToInput(elements,IceMaskNodeActivationEnum);
++		if(iomodel->domaintype!=Domain2DhorizontalEnum)
++			iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum); // required for updating active nodes
++	}
++
+ 	/*Free data: */
+-	iomodel->DeleteData(3,StressbalanceSpcvxEnum,StressbalanceSpcvyEnum,FlowequationVertexEquationEnum);
+-
++	iomodel->DeleteData(1,FlowequationElementEquationEnum);
+ }/*}}}*/
+-void StressbalanceSIAAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++void StressbalanceSIAAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ 
+-	/*No loads*/
++	/*No specific parameters*/
+ 
+ }/*}}}*/
+ 
+@@ -460,7 +460,7 @@
+ 	return pe;
+ 
+ }/*}}}*/
+-void StressbalanceSIAAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           StressbalanceSIAAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 
+ 	IssmDouble vx,vy;
+ 	int       *doflist = NULL;
+@@ -493,10 +493,10 @@
+ 	xDelete<int>(doflist);
+ 	xDelete<IssmDouble>(values);
+ }/*}}}*/
+-void StressbalanceSIAAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           StressbalanceSIAAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void StressbalanceSIAAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           StressbalanceSIAAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	int         i,domaintype;
+ 	IssmDouble  rho_ice,g;
+@@ -580,7 +580,7 @@
+ 	xDelete<IssmDouble>(xyz_list);
+ 	xDelete<int>(doflist);
+ }/*}}}*/
+-void StressbalanceSIAAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           StressbalanceSIAAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 
+ 	bool islevelset;
+ 	femmodel->parameters->FindParam(&islevelset,TransientIslevelsetEnum);
+Index: ../trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.h	(revision 18930)
+@@ -12,28 +12,26 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
++		void           CreateDamageFInputExp(Element* element);
++		void           CreateDamageFInputPralong(Element* element);
+ 		ElementVector* CreateDVector(Element* element);
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
+-
+-		/*Intermediaries*/
+-		void CreateDamageFInputPralong(Element* element);
+-		void CreateDamageFInputExp(Element* element);
++		void           GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.h	(revision 18930)
+@@ -12,25 +12,23 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+ 		ElementVector* CreateDVector(Element* element);
++		void           CreateD0(Element* element);
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
+-
+-		/*Specifics*/
+-		void CreateD0(Element* element);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/ThermalAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/ThermalAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/ThermalAnalysis.cpp	(revision 18930)
+@@ -5,33 +5,45 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
+-int  ThermalAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+-	return 1;
++void ThermalAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++
++	/*Only 3d mesh supported*/
++	int finiteelement = P1Enum;
++	if(iomodel->domaintype==Domain3DEnum){
++		IoModelToConstraintsx(constraints,iomodel,ThermalSpctemperatureEnum,ThermalAnalysisEnum,finiteelement);
++	}
++
+ }/*}}}*/
+-void ThermalAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++void ThermalAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+ 
+-	int     numoutputs;
+-	char**  requestedoutputs = NULL;
++	if(iomodel->domaintype==Domain2DhorizontalEnum) _error_("2d meshes not supported yet");
+ 
+-	parameters->AddObject(iomodel->CopyConstantObject(ThermalMaxiterEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(ThermalStabilizationEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(ThermalPenaltyFactorEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(ThermalPenaltyThresholdEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(ThermalPenaltyLockEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(ThermalIsenthalpyEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(ThermalIsdynamicbasalspcEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(FrictionLawEnum));
++	/*create penalties for nodes: no node can have a temperature over the melting point*/
++	iomodel->FetchData(1,ThermalSpctemperatureEnum);
++	CreateSingleNodeToElementConnectivity(iomodel);
+ 
+-	iomodel->FetchData(&requestedoutputs,&numoutputs,ThermalRequestedOutputsEnum);
+-	parameters->AddObject(new IntParam(ThermalNumRequestedOutputsEnum,numoutputs));
+-	if(numoutputs)parameters->AddObject(new StringArrayParam(ThermalRequestedOutputsEnum,requestedoutputs,numoutputs));
+-	iomodel->DeleteData(&requestedoutputs,numoutputs,ThermalRequestedOutputsEnum);
++	for(int i=0;i<iomodel->numberofvertices;i++){
+ 
+-	/*Deal with friction parameters*/
+-	int frictionlaw;
+-	iomodel->Constant(&frictionlaw,FrictionLawEnum);
+-	if(frictionlaw==4 || frictionlaw==6) parameters->AddObject(iomodel->CopyConstantObject(FrictionGammaEnum));
++		/*keep only this partition's nodes:*/
++		if(iomodel->my_vertices[i]){
++			if (xIsNan<IssmDouble>(iomodel->Data(ThermalSpctemperatureEnum)[i])){ //No penalty applied on spc nodes!
++				loads->AddObject(new Pengrid(iomodel->loadcounter+i+1,i,iomodel,ThermalAnalysisEnum));
++			}
++		}
++	}
++	iomodel->DeleteData(1,ThermalSpctemperatureEnum);
++
+ }/*}}}*/
++void ThermalAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++
++	int finiteelement = P1Enum;
++	if(iomodel->domaintype==Domain3DEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++	::CreateNodes(nodes,iomodel,ThermalAnalysisEnum,finiteelement);
++	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++}/*}}}*/
++int  ThermalAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
++	return 1;
++}/*}}}*/
+ void ThermalAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	int frictionlaw;
+@@ -121,41 +133,29 @@
+ 			_error_("not supported");
+ 	}
+ }/*}}}*/
+-void ThermalAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++void ThermalAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ 
+-	int finiteelement = P1Enum;
+-	if(iomodel->domaintype==Domain3DEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-	::CreateNodes(nodes,iomodel,ThermalAnalysisEnum,finiteelement);
+-	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-}/*}}}*/
+-void ThermalAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++	int     numoutputs;
++	char**  requestedoutputs = NULL;
+ 
+-	/*Only 3d mesh supported*/
+-	int finiteelement = P1Enum;
+-	if(iomodel->domaintype==Domain3DEnum){
+-		IoModelToConstraintsx(constraints,iomodel,ThermalSpctemperatureEnum,ThermalAnalysisEnum,finiteelement);
+-	}
++	parameters->AddObject(iomodel->CopyConstantObject(ThermalMaxiterEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(ThermalStabilizationEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(ThermalPenaltyFactorEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(ThermalPenaltyThresholdEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(ThermalPenaltyLockEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(ThermalIsenthalpyEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(ThermalIsdynamicbasalspcEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(FrictionLawEnum));
+ 
+-}/*}}}*/
+-void ThermalAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++	iomodel->FetchData(&requestedoutputs,&numoutputs,ThermalRequestedOutputsEnum);
++	parameters->AddObject(new IntParam(ThermalNumRequestedOutputsEnum,numoutputs));
++	if(numoutputs)parameters->AddObject(new StringArrayParam(ThermalRequestedOutputsEnum,requestedoutputs,numoutputs));
++	iomodel->DeleteData(&requestedoutputs,numoutputs,ThermalRequestedOutputsEnum);
+ 
+-	if(iomodel->domaintype==Domain2DhorizontalEnum) _error_("2d meshes not supported yet");
+-
+-	/*create penalties for nodes: no node can have a temperature over the melting point*/
+-	iomodel->FetchData(1,ThermalSpctemperatureEnum);
+-	CreateSingleNodeToElementConnectivity(iomodel);
+-
+-	for(int i=0;i<iomodel->numberofvertices;i++){
+-
+-		/*keep only this partition's nodes:*/
+-		if(iomodel->my_vertices[i]){
+-			if (xIsNan<IssmDouble>(iomodel->Data(ThermalSpctemperatureEnum)[i])){ //No penalty applied on spc nodes!
+-				loads->AddObject(new Pengrid(iomodel->loadcounter+i+1,i,iomodel,ThermalAnalysisEnum));
+-			}
+-		}
+-	}
+-	iomodel->DeleteData(1,ThermalSpctemperatureEnum);
+-
++	/*Deal with friction parameters*/
++	int frictionlaw;
++	iomodel->Constant(&frictionlaw,FrictionLawEnum);
++	if(frictionlaw==4 || frictionlaw==6) parameters->AddObject(iomodel->CopyConstantObject(FrictionGammaEnum));
+ }/*}}}*/
+ 
+ /*Finite Element Analysis*/
+@@ -184,6 +184,60 @@
+ 	delete Ke2;
+ 	return Ke;
+ }/*}}}*/
++ElementMatrix* ThermalAnalysis::CreateKMatrixShelf(Element* element){/*{{{*/
++
++	/* Check if ice in element */
++	if(!element->IsIceInElement()) return NULL;
++
++	/*Initialize Element matrix and return if necessary*/
++	if(!element->IsOnBase() || !element->IsFloating()) return NULL;
++
++	IssmDouble  dt,Jdet,D;
++	IssmDouble *xyz_list_base = NULL;
++
++	/*Get basal element*/
++	if(!element->IsOnBase() || !element->IsFloating()) return NULL;
++
++	/*Fetch number of nodes for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++
++	/*Initialize vectors*/
++	ElementMatrix* Ke    = element->NewElementMatrix();
++	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
++
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinatesBase(&xyz_list_base);
++	element->FindParam(&dt,TimesteppingTimeStepEnum);
++	IssmDouble  gravity             = element->GetMaterialParameter(ConstantsGEnum);
++	IssmDouble  rho_water           = element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
++	IssmDouble  rho_ice             = element->GetMaterialParameter(MaterialsRhoIceEnum);
++	IssmDouble  heatcapacity        = element->GetMaterialParameter(MaterialsHeatcapacityEnum);
++	IssmDouble  mixed_layer_capacity= element->GetMaterialParameter(MaterialsMixedLayerCapacityEnum);
++	IssmDouble  thermal_exchange_vel= element->GetMaterialParameter(MaterialsThermalExchangeVelocityEnum);
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGaussBase(2);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
++		element->NodalFunctions(basis,gauss);
++
++		D=gauss->weight*Jdet*rho_water*mixed_layer_capacity*thermal_exchange_vel/(heatcapacity*rho_ice);
++		if(reCast<bool,IssmDouble>(dt)) D=dt*D;
++		TripleMultiply(basis,numnodes,1,0,
++					&D,1,1,0,
++					basis,1,numnodes,0,
++					&Ke->values[0],1);
++
++	}
++
++	/*Clean up and return*/
++	delete gauss;
++	xDelete<IssmDouble>(basis);
++	xDelete<IssmDouble>(xyz_list_base);
++	return Ke;
++}/*}}}*/
+ ElementMatrix* ThermalAnalysis::CreateKMatrixVolume(Element* element){/*{{{*/
+ 
+ 	/* Check if ice in element */
+@@ -317,60 +371,6 @@
+ 	delete gauss;
+ 	return Ke;
+ }/*}}}*/
+-ElementMatrix* ThermalAnalysis::CreateKMatrixShelf(Element* element){/*{{{*/
+-
+-	/* Check if ice in element */
+-	if(!element->IsIceInElement()) return NULL;
+-
+-	/*Initialize Element matrix and return if necessary*/
+-	if(!element->IsOnBase() || !element->IsFloating()) return NULL;
+-
+-	IssmDouble  dt,Jdet,D;
+-	IssmDouble *xyz_list_base = NULL;
+-
+-	/*Get basal element*/
+-	if(!element->IsOnBase() || !element->IsFloating()) return NULL;
+-
+-	/*Fetch number of nodes for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-
+-	/*Initialize vectors*/
+-	ElementMatrix* Ke    = element->NewElementMatrix();
+-	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
+-
+-	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinatesBase(&xyz_list_base);
+-	element->FindParam(&dt,TimesteppingTimeStepEnum);
+-	IssmDouble  gravity             = element->GetMaterialParameter(ConstantsGEnum);
+-	IssmDouble  rho_water           = element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
+-	IssmDouble  rho_ice             = element->GetMaterialParameter(MaterialsRhoIceEnum);
+-	IssmDouble  heatcapacity        = element->GetMaterialParameter(MaterialsHeatcapacityEnum);
+-	IssmDouble  mixed_layer_capacity= element->GetMaterialParameter(MaterialsMixedLayerCapacityEnum);
+-	IssmDouble  thermal_exchange_vel= element->GetMaterialParameter(MaterialsThermalExchangeVelocityEnum);
+-
+-	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=element->NewGaussBase(2);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
+-		element->NodalFunctions(basis,gauss);
+-
+-		D=gauss->weight*Jdet*rho_water*mixed_layer_capacity*thermal_exchange_vel/(heatcapacity*rho_ice);
+-		if(reCast<bool,IssmDouble>(dt)) D=dt*D;
+-		TripleMultiply(basis,numnodes,1,0,
+-					&D,1,1,0,
+-					basis,1,numnodes,0,
+-					&Ke->values[0],1);
+-
+-	}
+-
+-	/*Clean up and return*/
+-	delete gauss;
+-	xDelete<IssmDouble>(basis);
+-	xDelete<IssmDouble>(xyz_list_base);
+-	return Ke;
+-}/*}}}*/
+ ElementVector* ThermalAnalysis::CreatePVector(Element* element){/*{{{*/
+ 	
+ 	/* Check if ice in element */
+@@ -388,88 +388,6 @@
+ 	delete pe3;
+ 	return pe;
+ }/*}}}*/
+-ElementVector* ThermalAnalysis::CreatePVectorVolume(Element* element){/*{{{*/
+-
+-	/* Check if ice in element */
+-	if(!element->IsIceInElement()) return NULL;
+-
+-	/*Intermediaries*/
+-	int         stabilization;
+-	IssmDouble  Jdet,phi,dt;
+-	IssmDouble  temperature;
+-	IssmDouble  tau_parameter,diameter;
+-	IssmDouble  u,v,w;
+-	IssmDouble  scalar_def,scalar_transient;
+-	IssmDouble* xyz_list = NULL;
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-
+-	/*Initialize Element vector*/
+-	ElementVector* pe     = element->NewElementVector();
+-	IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
+-	IssmDouble*    dbasis = xNew<IssmDouble>(3*numnodes);
+-
+-	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinates(&xyz_list);
+-	IssmDouble  rho_ice             = element->GetMaterialParameter(MaterialsRhoIceEnum);
+-	IssmDouble  heatcapacity        = element->GetMaterialParameter(MaterialsHeatcapacityEnum);
+-	IssmDouble  thermalconductivity = element->GetMaterialParameter(MaterialsThermalconductivityEnum);
+-	IssmDouble  kappa = thermalconductivity/(rho_ice*heatcapacity);
+-	element->FindParam(&dt,TimesteppingTimeStepEnum);
+-	element->FindParam(&stabilization,ThermalStabilizationEnum);
+-	Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input);
+-	Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input);
+-	Input* vz_input=element->GetInput(VzEnum); _assert_(vz_input);
+-	Input* temperature_input = NULL;
+-	if(reCast<bool,IssmDouble>(dt)){temperature_input = element->GetInput(TemperatureEnum); _assert_(temperature_input);}
+-	if(stabilization==2) diameter=element->MinEdgeLength(xyz_list);
+-
+-	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=element->NewGauss(3);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-		gauss->GaussPoint(ig);
+-
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		element->NodalFunctions(basis,gauss);
+-		element->ViscousHeating(&phi,xyz_list,gauss,vx_input,vy_input,vz_input);
+-
+-		scalar_def=phi/(rho_ice*heatcapacity)*Jdet*gauss->weight;
+-		if(reCast<bool,IssmDouble>(dt)) scalar_def=scalar_def*dt;
+-
+-		for(int i=0;i<numnodes;i++) pe->values[i]+=scalar_def*basis[i];
+-
+-		/* Build transient now */
+-		if(reCast<bool,IssmDouble>(dt)){
+-			temperature_input->GetInputValue(&temperature, gauss);
+-			scalar_transient=temperature*Jdet*gauss->weight;
+-			for(int i=0;i<numnodes;i++) pe->values[i]+=scalar_transient*basis[i];
+-		}
+-
+-		if(stabilization==2){
+-			element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+-
+-			vx_input->GetInputValue(&u,gauss);
+-			vy_input->GetInputValue(&v,gauss);
+-			vz_input->GetInputValue(&w,gauss);
+-
+-			tau_parameter=element->StabilizationParameter(u,v,w,diameter,kappa);
+-
+-			for(int i=0;i<numnodes;i++) pe->values[i]+=tau_parameter*scalar_def*(u*dbasis[0*numnodes+i]+v*dbasis[1*numnodes+i]+w*dbasis[2*numnodes+i]);
+-			if(reCast<bool,IssmDouble>(dt)){
+-				for(int i=0;i<numnodes;i++) pe->values[i]+=tau_parameter*scalar_transient*(u*dbasis[0*numnodes+i]+v*dbasis[1*numnodes+i]+w*dbasis[2*numnodes+i]);
+-			}
+-		}
+-	}
+-
+-	/*Clean up and return*/
+-	xDelete<IssmDouble>(basis);
+-	xDelete<IssmDouble>(dbasis);
+-	xDelete<IssmDouble>(xyz_list);
+-	delete gauss;
+-	return pe;
+-
+-}/*}}}*/
+ ElementVector* ThermalAnalysis::CreatePVectorSheet(Element* element){/*{{{*/
+ 
+ 	/* Check if ice in element */
+@@ -584,39 +502,89 @@
+ 	xDelete<IssmDouble>(xyz_list_base);
+ 	return pe;
+ }/*}}}*/
+-void ThermalAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+-	element->GetSolutionFromInputsOneDof(solution,TemperatureEnum);
+-}/*}}}*/
+-void ThermalAnalysis::GetBConduct(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+-	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1. 
+-	 * For node i, Bi' can be expressed in the actual coordinate system
+-	 * by: 
+-	 *       Bi_conduct=[ dh/dx ]
+-	 *                  [ dh/dy ]
+-	 *                  [ dh/dz ]
+-	 * where h is the interpolation function for node i.
+-	 *
+-	 * We assume B has been allocated already, of size: 3x(NDOF1*numnodes)
+-	 */
++ElementVector* ThermalAnalysis::CreatePVectorVolume(Element* element){/*{{{*/
+ 
+-	/*Fetch number of nodes for this finite element*/
++	/* Check if ice in element */
++	if(!element->IsIceInElement()) return NULL;
++
++	/*Intermediaries*/
++	int         stabilization;
++	IssmDouble  Jdet,phi,dt;
++	IssmDouble  temperature;
++	IssmDouble  tau_parameter,diameter;
++	IssmDouble  u,v,w;
++	IssmDouble  scalar_def,scalar_transient;
++	IssmDouble* xyz_list = NULL;
++
++	/*Fetch number of nodes and dof for this finite element*/
+ 	int numnodes = element->GetNumberOfNodes();
+ 
+-	/*Get nodal functions derivatives*/
+-	IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
+-	element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
++	/*Initialize Element vector*/
++	ElementVector* pe     = element->NewElementVector();
++	IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
++	IssmDouble*    dbasis = xNew<IssmDouble>(3*numnodes);
+ 
+-	/*Build B: */
+-	for(int i=0;i<numnodes;i++){
+-		B[numnodes*0+i] = dbasis[0*numnodes+i];
+-		B[numnodes*1+i] = dbasis[1*numnodes+i];
+-		B[numnodes*2+i] = dbasis[2*numnodes+i];
++	/*Retrieve all inputs and parameters*/
++	element->GetVerticesCoordinates(&xyz_list);
++	IssmDouble  rho_ice             = element->GetMaterialParameter(MaterialsRhoIceEnum);
++	IssmDouble  heatcapacity        = element->GetMaterialParameter(MaterialsHeatcapacityEnum);
++	IssmDouble  thermalconductivity = element->GetMaterialParameter(MaterialsThermalconductivityEnum);
++	IssmDouble  kappa = thermalconductivity/(rho_ice*heatcapacity);
++	element->FindParam(&dt,TimesteppingTimeStepEnum);
++	element->FindParam(&stabilization,ThermalStabilizationEnum);
++	Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input);
++	Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input);
++	Input* vz_input=element->GetInput(VzEnum); _assert_(vz_input);
++	Input* temperature_input = NULL;
++	if(reCast<bool,IssmDouble>(dt)){temperature_input = element->GetInput(TemperatureEnum); _assert_(temperature_input);}
++	if(stabilization==2) diameter=element->MinEdgeLength(xyz_list);
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGauss(3);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		element->NodalFunctions(basis,gauss);
++		element->ViscousHeating(&phi,xyz_list,gauss,vx_input,vy_input,vz_input);
++
++		scalar_def=phi/(rho_ice*heatcapacity)*Jdet*gauss->weight;
++		if(reCast<bool,IssmDouble>(dt)) scalar_def=scalar_def*dt;
++
++		for(int i=0;i<numnodes;i++) pe->values[i]+=scalar_def*basis[i];
++
++		/* Build transient now */
++		if(reCast<bool,IssmDouble>(dt)){
++			temperature_input->GetInputValue(&temperature, gauss);
++			scalar_transient=temperature*Jdet*gauss->weight;
++			for(int i=0;i<numnodes;i++) pe->values[i]+=scalar_transient*basis[i];
++		}
++
++		if(stabilization==2){
++			element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
++
++			vx_input->GetInputValue(&u,gauss);
++			vy_input->GetInputValue(&v,gauss);
++			vz_input->GetInputValue(&w,gauss);
++
++			tau_parameter=element->StabilizationParameter(u,v,w,diameter,kappa);
++
++			for(int i=0;i<numnodes;i++) pe->values[i]+=tau_parameter*scalar_def*(u*dbasis[0*numnodes+i]+v*dbasis[1*numnodes+i]+w*dbasis[2*numnodes+i]);
++			if(reCast<bool,IssmDouble>(dt)){
++				for(int i=0;i<numnodes;i++) pe->values[i]+=tau_parameter*scalar_transient*(u*dbasis[0*numnodes+i]+v*dbasis[1*numnodes+i]+w*dbasis[2*numnodes+i]);
++			}
++		}
+ 	}
+ 
+-	/*Clean-up*/
++	/*Clean up and return*/
++	xDelete<IssmDouble>(basis);
+ 	xDelete<IssmDouble>(dbasis);
++	xDelete<IssmDouble>(xyz_list);
++	delete gauss;
++	return pe;
++
+ }/*}}}*/
+-void ThermalAnalysis::GetBAdvec(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           ThermalAnalysis::GetBAdvec(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1. 
+ 	 * For node i, Bi' can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -645,7 +613,7 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(basis);
+ }/*}}}*/
+-void ThermalAnalysis::GetBAdvecprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           ThermalAnalysis::GetBAdvecprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1. 
+ 	 * For node i, Bi' can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -674,10 +642,42 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(dbasis);
+ }/*}}}*/
+-void ThermalAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           ThermalAnalysis::GetBConduct(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1. 
++	 * For node i, Bi' can be expressed in the actual coordinate system
++	 * by: 
++	 *       Bi_conduct=[ dh/dx ]
++	 *                  [ dh/dy ]
++	 *                  [ dh/dz ]
++	 * where h is the interpolation function for node i.
++	 *
++	 * We assume B has been allocated already, of size: 3x(NDOF1*numnodes)
++	 */
++
++	/*Fetch number of nodes for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++
++	/*Get nodal functions derivatives*/
++	IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
++	element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
++
++	/*Build B: */
++	for(int i=0;i<numnodes;i++){
++		B[numnodes*0+i] = dbasis[0*numnodes+i];
++		B[numnodes*1+i] = dbasis[1*numnodes+i];
++		B[numnodes*2+i] = dbasis[2*numnodes+i];
++	}
++
++	/*Clean-up*/
++	xDelete<IssmDouble>(dbasis);
++}/*}}}*/
++void           ThermalAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++	element->GetSolutionFromInputsOneDof(solution,TemperatureEnum);
++}/*}}}*/
++void           ThermalAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void ThermalAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           ThermalAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	bool        converged;
+ 	int         i,rheology_law;
+@@ -757,7 +757,7 @@
+ 	xDelete<IssmDouble>(xyz_list);
+ 	xDelete<int>(doflist);
+ }/*}}}*/
+-void ThermalAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           ThermalAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 
+ 	bool islevelset;
+ 	femmodel->parameters->FindParam(&islevelset,TransientIslevelsetEnum);
+Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h	(revision 18930)
+@@ -12,12 +12,12 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+@@ -25,11 +25,11 @@
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void GradientJOmega(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void GradientJdHdt(Element* element,Vector<IssmDouble>* gradient,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           GradientJdHdt(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJOmega(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/BalancethicknessAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/BalancethicknessAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/BalancethicknessAnalysis.h	(revision 18930)
+@@ -12,12 +12,12 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+@@ -29,11 +29,11 @@
+ 		ElementVector* CreatePVector(Element* element);
+ 		ElementVector* CreatePVectorCG(Element* element);
+ 		ElementVector* CreatePVectorDG(Element* element);
+-		void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/BalancevelocityAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/BalancevelocityAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/BalancevelocityAnalysis.h	(revision 18930)
+@@ -12,12 +12,12 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+@@ -25,9 +25,9 @@
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp	(revision 18930)
+@@ -5,14 +5,27 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
++void UzawaPressureAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++	return;
++}/*}}}*/
++void UzawaPressureAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++	return;
++}/*}}}*/
++void UzawaPressureAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++
++	int finiteelement;
++	int fe_FS;
++
++	iomodel->Constant(&fe_FS,FlowequationFeFSEnum);
++	if(fe_FS==LATaylorHoodEnum) finiteelement = P1Enum;
++	else if(fe_FS==LACrouzeixRaviartEnum) finiteelement = P1DGEnum;
++	else _error_("solution not supported yet");
++
++	::CreateNodes(nodes,iomodel,UzawaPressureAnalysisEnum,finiteelement);
++}/*}}}*/
+ int  UzawaPressureAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+ 	return 1;
+ }/*}}}*/
+-void UzawaPressureAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-
+-	parameters->AddObject(iomodel->CopyConstantObject(AugmentedLagrangianRhopEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(AugmentedLagrangianRholambdaEnum));
+-}/*}}}*/
+ void UzawaPressureAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	/*Update elements: */
+@@ -39,24 +52,11 @@
+ 	iomodel->FetchDataToInput(elements,PressureEnum,0.);
+ 	InputUpdateFromConstantx(elements,0.,SigmaNNEnum);
+ }/*}}}*/
+-void UzawaPressureAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++void UzawaPressureAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ 
+-	int finiteelement;
+-	int fe_FS;
+-
+-	iomodel->Constant(&fe_FS,FlowequationFeFSEnum);
+-	if(fe_FS==LATaylorHoodEnum) finiteelement = P1Enum;
+-	else if(fe_FS==LACrouzeixRaviartEnum) finiteelement = P1DGEnum;
+-	else _error_("solution not supported yet");
+-
+-	::CreateNodes(nodes,iomodel,UzawaPressureAnalysisEnum,finiteelement);
++	parameters->AddObject(iomodel->CopyConstantObject(AugmentedLagrangianRhopEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(AugmentedLagrangianRholambdaEnum));
+ }/*}}}*/
+-void UzawaPressureAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+-	return;
+-}/*}}}*/
+-void UzawaPressureAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+-	return;
+-}/*}}}*/
+ 
+ /*Finite Element Analysis*/
+ void           UzawaPressureAnalysis::Core(FemModel* femmodel){/*{{{*/
+@@ -163,7 +163,7 @@
+ 	xDelete<IssmDouble>(dvz);
+ 	return pe;
+ }/*}}}*/
+-void UzawaPressureAnalysis::GetM(IssmDouble* M,Element* element,Gauss* gauss){/*{{{*/
++void           UzawaPressureAnalysis::GetM(IssmDouble* M,Element* element,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. M=[M1 M2 M3] */
+ 
+ 	/*Fetch number of nodes for this finite element*/
+@@ -181,13 +181,13 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(basis);
+ }/*}}}*/
+-void UzawaPressureAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           UzawaPressureAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	_error_("not implemented yet");
+ }/*}}}*/
+-void UzawaPressureAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           UzawaPressureAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void UzawaPressureAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           UzawaPressureAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	int        dim;
+ 	int        *doflist       = NULL;
+@@ -296,7 +296,7 @@
+ 	xDelete<IssmDouble>(pressure);
+ 	xDelete<int>(doflist);
+ }/*}}}*/
+-void UzawaPressureAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           UzawaPressureAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 18930)
+@@ -5,11 +5,24 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
++void Balancethickness2Analysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++
++
++	int finiteelement = P1Enum;
++	IoModelToConstraintsx(constraints,iomodel,BalancethicknessSpcthicknessEnum,Balancethickness2AnalysisEnum,finiteelement);
++
++}/*}}}*/
++void Balancethickness2Analysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++
++}/*}}}*/
++void Balancethickness2Analysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++
++	int finiteelement = P1Enum;
++	::CreateNodes(nodes,iomodel,Balancethickness2AnalysisEnum,finiteelement);
++}/*}}}*/
+ int  Balancethickness2Analysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+ 	return 1;
+ }/*}}}*/
+-void Balancethickness2Analysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-}/*}}}*/
+ void Balancethickness2Analysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	/*Finite element type*/
+@@ -37,22 +50,9 @@
+ 	}
+ 
+ }/*}}}*/
+-void Balancethickness2Analysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-
+-	int finiteelement = P1Enum;
+-	::CreateNodes(nodes,iomodel,Balancethickness2AnalysisEnum,finiteelement);
++void Balancethickness2Analysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ }/*}}}*/
+-void Balancethickness2Analysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+ 
+-
+-	int finiteelement = P1Enum;
+-	IoModelToConstraintsx(constraints,iomodel,BalancethicknessSpcthicknessEnum,Balancethickness2AnalysisEnum,finiteelement);
+-
+-}/*}}}*/
+-void Balancethickness2Analysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+-
+-}/*}}}*/
+-
+ /*Finite Element Analysis*/
+ void           Balancethickness2Analysis::Core(FemModel* femmodel){/*{{{*/
+ 	_error_("not implemented yet");
+@@ -61,6 +61,70 @@
+ 	/*Default, return NULL*/
+ 	return NULL;
+ }/*}}}*/
++void           Balancethickness2Analysis::CreateD0(Element* element){/*{{{*/
++
++	/*Intermediaries */
++	IssmDouble       Gamma,h,mu0,ds[2],Cmu,B,k,s,b,normds;
++	const int        n = 3;
++	const IssmDouble Hstar = 500.;
++	const IssmDouble Lstar = 500.e+3;
++	IssmDouble *xyz_list  = NULL;
++
++	/*Fetch number of vertices and allocate output*/
++	int  numnodes = element->GetNumberOfNodes();
++	IssmDouble* D0     = xNew<IssmDouble>(numnodes);
++
++	/*retrieve what we need: */
++	element->GetVerticesCoordinates(&xyz_list);
++	Input* surfaceslopex_input = element->GetInput(SurfaceSlopeXEnum);
++	Input* surfaceslopey_input = element->GetInput(SurfaceSlopeYEnum);
++	Input* surface_input       = element->GetInput(SurfaceEnum);            _assert_(surface_input);
++	Input* B_input             = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);
++	IssmDouble rhog            = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum);
++
++	/*Calculate damage evolution source term: */
++	Gauss* gauss=element->NewGauss();
++	for (int i=0;i<numnodes;i++){
++		gauss->GaussNode(element->GetElementType(),i);
++		
++		B_input->GetInputValue(&B,gauss);
++		if(surfaceslopex_input && surfaceslopey_input){
++			surfaceslopex_input->GetInputValue(&ds[0],gauss);
++			surfaceslopey_input->GetInputValue(&ds[1],gauss);
++		}
++		else{
++			surface_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);
++		}
++
++		/*check slopes*/
++		normds = sqrt(ds[0]*ds[0]+ds[1]*ds[1]);
++		if (normds==0.){
++			_error_("surface slope is zero");
++		}
++		if(normds<1.e-5){
++			ds[0] = ds[0]/normds*1.e+5;
++			ds[1] = ds[1]/normds*1.e+5;
++			normds = 1.e-5;
++		}
++
++		mu0   = pow(2.,(1-3*n)/(2.*n)) * B;
++		Gamma = pow(rhog,n) * pow(Hstar,2*(n+1)) * pow(Hstar/Lstar,2*(n+1)) * 1./pow(mu0,n);
++
++		D0[i] = Gamma*pow(ds[0]*ds[0]+ds[1]*ds[1],(n-1)/2)/(n+2);
++	}
++
++	/*Add input*/
++	element->AddInput(BalancethicknessD0Enum,D0,element->GetElementType());
++	//if(surfaceslopex_input && surfaceslopey_input){
++	//	element->DeleteInput(SurfaceSlopeXEnum);
++	//	element->DeleteInput(SurfaceSlopeYEnum);
++	//}
++	
++	/*Clean up and return*/
++	xDelete<IssmDouble>(D0);
++	xDelete<IssmDouble>(xyz_list);
++	delete gauss;
++}/*}}}*/
+ ElementMatrix* Balancethickness2Analysis::CreateJacobianMatrix(Element* element){/*{{{*/
+ _error_("Not implemented");
+ }/*}}}*/
+@@ -150,13 +214,13 @@
+ 	delete gauss;
+ 	return pe;
+ }/*}}}*/
+-void Balancethickness2Analysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           Balancethickness2Analysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 		element->GetSolutionFromInputsOneDof(solution,SurfaceEnum);
+ }/*}}}*/
+-void Balancethickness2Analysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           Balancethickness2Analysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void Balancethickness2Analysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           Balancethickness2Analysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	/*Intermediaries*/
+ 	IssmDouble  ds[2],s,b,D;
+@@ -210,73 +274,7 @@
+ 	xDelete<IssmDouble>(vel_list);
+ 	xDelete<IssmDouble>(xyz_list);
+ }/*}}}*/
+-void Balancethickness2Analysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           Balancethickness2Analysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+ }/*}}}*/
+-
+-/*Specifics*/
+-void Balancethickness2Analysis::CreateD0(Element* element){/*{{{*/
+-
+-	/*Intermediaries */
+-	IssmDouble       Gamma,h,mu0,ds[2],Cmu,B,k,s,b,normds;
+-	const int        n = 3;
+-	const IssmDouble Hstar = 500.;
+-	const IssmDouble Lstar = 500.e+3;
+-	IssmDouble *xyz_list  = NULL;
+-
+-	/*Fetch number of vertices and allocate output*/
+-	int  numnodes = element->GetNumberOfNodes();
+-	IssmDouble* D0     = xNew<IssmDouble>(numnodes);
+-
+-	/*retrieve what we need: */
+-	element->GetVerticesCoordinates(&xyz_list);
+-	Input* surfaceslopex_input = element->GetInput(SurfaceSlopeXEnum);
+-	Input* surfaceslopey_input = element->GetInput(SurfaceSlopeYEnum);
+-	Input* surface_input       = element->GetInput(SurfaceEnum);            _assert_(surface_input);
+-	Input* B_input             = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);
+-	IssmDouble rhog            = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum);
+-
+-	/*Calculate damage evolution source term: */
+-	Gauss* gauss=element->NewGauss();
+-	for (int i=0;i<numnodes;i++){
+-		gauss->GaussNode(element->GetElementType(),i);
+-		
+-		B_input->GetInputValue(&B,gauss);
+-		if(surfaceslopex_input && surfaceslopey_input){
+-			surfaceslopex_input->GetInputValue(&ds[0],gauss);
+-			surfaceslopey_input->GetInputValue(&ds[1],gauss);
+-		}
+-		else{
+-			surface_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);
+-		}
+-
+-		/*check slopes*/
+-		normds = sqrt(ds[0]*ds[0]+ds[1]*ds[1]);
+-		if (normds==0.){
+-			_error_("surface slope is zero");
+-		}
+-		if(normds<1.e-5){
+-			ds[0] = ds[0]/normds*1.e+5;
+-			ds[1] = ds[1]/normds*1.e+5;
+-			normds = 1.e-5;
+-		}
+-
+-		mu0   = pow(2.,(1-3*n)/(2.*n)) * B;
+-		Gamma = pow(rhog,n) * pow(Hstar,2*(n+1)) * pow(Hstar/Lstar,2*(n+1)) * 1./pow(mu0,n);
+-
+-		D0[i] = Gamma*pow(ds[0]*ds[0]+ds[1]*ds[1],(n-1)/2)/(n+2);
+-	}
+-
+-	/*Add input*/
+-	element->AddInput(BalancethicknessD0Enum,D0,element->GetElementType());
+-	//if(surfaceslopex_input && surfaceslopey_input){
+-	//	element->DeleteInput(SurfaceSlopeXEnum);
+-	//	element->DeleteInput(SurfaceSlopeYEnum);
+-	//}
+-	
+-	/*Clean up and return*/
+-	xDelete<IssmDouble>(D0);
+-	xDelete<IssmDouble>(xyz_list);
+-	delete gauss;
+-}/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp	(revision 18930)
+@@ -5,9 +5,60 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
++void DamageEvolutionAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++
++	int finiteelement;
++	iomodel->Constant(&finiteelement,DamageElementinterpEnum);
++
++	IoModelToConstraintsx(constraints,iomodel,DamageSpcdamageEnum,DamageEvolutionAnalysisEnum,finiteelement);
++
++}/*}}}*/
++void DamageEvolutionAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++
++	/*Nothing for now*/
++
++}/*}}}*/
++void DamageEvolutionAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++
++	int finiteelement;
++
++	iomodel->Constant(&finiteelement,DamageElementinterpEnum);
++	::CreateNodes(nodes,iomodel,DamageEvolutionAnalysisEnum,finiteelement);
++}/*}}}*/
+ int  DamageEvolutionAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+ 	return 1;
+ }/*}}}*/
++void DamageEvolutionAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
++
++	int finiteelement;
++	bool   islevelset;
++
++	iomodel->Constant(&finiteelement,DamageElementinterpEnum);
++	iomodel->Constant(&islevelset,TransientIslevelsetEnum);
++
++	/*Update elements: */
++	int counter=0;
++	for(int i=0;i<iomodel->numberofelements;i++){
++		if(iomodel->my_elements[i]){
++			Element* element=(Element*)elements->GetObjectByOffset(counter);
++			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
++			counter++;
++		}
++	}
++
++	/*What input do I need to run my damage evolution model?*/
++	iomodel->FetchDataToInput(elements,VxEnum);
++	iomodel->FetchDataToInput(elements,VyEnum);
++	if(iomodel->domaintype==Domain3DEnum) iomodel->FetchDataToInput(elements,VzEnum);
++	iomodel->FetchDataToInput(elements,DamageDEnum);
++	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
++	iomodel->FetchDataToInput(elements,PressureEnum);
++
++	if(islevelset){
++		iomodel->FetchDataToInput(elements,IceMaskNodeActivationEnum);
++	}
++
++}/*}}}*/
+ void DamageEvolutionAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ 
+ 	/*Intermediaries*/
+@@ -44,61 +95,216 @@
+ 	}
+ 
+ }/*}}}*/
+-void DamageEvolutionAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+-	int finiteelement;
+-	bool   islevelset;
++/*Finite Element Analysis*/
++void           DamageEvolutionAnalysis::Core(FemModel* femmodel){/*{{{*/
++	_error_("not implemented");
++}/*}}}*/
++void           DamageEvolutionAnalysis::CreateDamageFInputExp(Element* element){/*{{{*/
+ 
+-	iomodel->Constant(&finiteelement,DamageElementinterpEnum);
+-	iomodel->Constant(&islevelset,TransientIslevelsetEnum);
++	/*Intermediaries */
++	IssmDouble epsf,stress_threshold,eps0;
++	IssmDouble damage,B,n,epseff;
++	IssmDouble eps_xx,eps_yy,eps_xy,eps1,eps2,epstmp;
++	int domaintype,damagelaw;
+ 
+-	/*Update elements: */
+-	int counter=0;
+-	for(int i=0;i<iomodel->numberofelements;i++){
+-		if(iomodel->my_elements[i]){
+-			Element* element=(Element*)elements->GetObjectByOffset(counter);
+-			element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
+-			counter++;
+-		}
++	/*Fetch number of vertices and allocate output*/
++	int numnodes = element->GetNumberOfNodes();
++	IssmDouble* f   = xNew<IssmDouble>(numnodes);
++
++	/*retrieve parameters:*/
++	element->FindParam(&epsf,DamageC1Enum);
++	element->FindParam(&stress_threshold,DamageStressThresholdEnum);
++	element->FindParam(&domaintype,DomainTypeEnum);
++	element->FindParam(&damagelaw,DamageLawEnum);
++
++	/*Compute stress tensor: */
++	element->ComputeStrainRate();
++
++	/*retrieve what we need: */
++	Input* eps_xx_input  = element->GetInput(StrainRatexxEnum);     _assert_(eps_xx_input);
++	Input* eps_xy_input  = element->GetInput(StrainRatexyEnum);     _assert_(eps_xy_input);
++	Input* eps_yy_input  = element->GetInput(StrainRateyyEnum);     _assert_(eps_yy_input);
++	Input*  n_input=element->GetInput(MaterialsRheologyNEnum); _assert_(n_input);
++	Input* damage_input = NULL;
++	Input* B_input = NULL;
++	if(domaintype==Domain2DhorizontalEnum){
++		damage_input = element->GetInput(DamageDbarEnum); 	_assert_(damage_input);
++		B_input=element->GetInput(MaterialsRheologyBbarEnum); _assert_(B_input);
+ 	}
++	else{
++		damage_input = element->GetInput(DamageDEnum);   _assert_(damage_input);
++		B_input=element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);
++	}
+ 
+-	/*What input do I need to run my damage evolution model?*/
+-	iomodel->FetchDataToInput(elements,VxEnum);
+-	iomodel->FetchDataToInput(elements,VyEnum);
+-	if(iomodel->domaintype==Domain3DEnum) iomodel->FetchDataToInput(elements,VzEnum);
+-	iomodel->FetchDataToInput(elements,DamageDEnum);
+-	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
+-	iomodel->FetchDataToInput(elements,PressureEnum);
++	/*Calculate damage evolution source term: */
++	Gauss* gauss=element->NewGauss();
++	for (int i=0;i<numnodes;i++){
++		gauss->GaussNode(element->GetElementType(),i);
++		
++		eps_xx_input->GetInputValue(&eps_xx,gauss);
++		eps_xy_input->GetInputValue(&eps_xy,gauss);
++		eps_yy_input->GetInputValue(&eps_yy,gauss);
++		B_input->GetInputValue(&B,gauss);
++		n_input->GetInputValue(&n,gauss);
++		damage_input->GetInputValue(&damage,gauss);
++	
++		/*Calculate principal effective strain rates*/
++		eps1=(eps_xx+eps_yy)/2.+sqrt(pow((eps_xx-eps_yy)/2.,2)+pow(eps_xy,2));
++		eps2=(eps_xx+eps_yy)/2.-sqrt(pow((eps_xx-eps_yy)/2.,2)+pow(eps_xy,2));
++		if(fabs(eps2)>fabs(eps1)){epstmp=eps2; eps2=eps1; eps1=epstmp;}
+ 
+-	if(islevelset){
+-		iomodel->FetchDataToInput(elements,IceMaskNodeActivationEnum);
++		/*Calculate effective strain rate and threshold strain rate*/
++		epseff=1./sqrt(2.)*sqrt(eps1*eps1-eps1*eps2+eps2*eps2);
++		eps0=pow(stress_threshold/B,n);
++
++		if(epseff>eps0){
++			f[i]=1.-pow(eps0/epseff,1./n)*exp(-(epseff-eps0)/(epsf-eps0))-damage;
++		}
++		else f[i]=0;
+ 	}
+ 
++	/*Add input*/
++	element->AddInput(DamageFEnum,f,element->GetElementType());
++	
++	/*Clean up and return*/
++	xDelete<IssmDouble>(f);
++	delete gauss;
+ }/*}}}*/
+-void DamageEvolutionAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++void           DamageEvolutionAnalysis::CreateDamageFInputPralong(Element* element){/*{{{*/
+ 
+-	int finiteelement;
++	/*Intermediaries */
++	IssmDouble c1,c2,c3,healing,stress_threshold;
++	IssmDouble s_xx,s_xy,s_xz,s_yy,s_yz,s_zz,s1,s2,s3,stmp;
++	IssmDouble J2s,Chi,Psi,PosPsi,NegPsi;
++	IssmDouble damage,tau_xx,tau_xy,tau_xz,tau_yy,tau_yz,tau_zz,stressMaxPrincipal;
++	int equivstress,domaintype,damagelaw,dim;
+ 
+-	iomodel->Constant(&finiteelement,DamageElementinterpEnum);
+-	::CreateNodes(nodes,iomodel,DamageEvolutionAnalysisEnum,finiteelement);
+-}/*}}}*/
+-void DamageEvolutionAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++	/*Fetch number of vertices and allocate output*/
++	int numnodes = element->GetNumberOfNodes();
++	IssmDouble* f   = xNew<IssmDouble>(numnodes);
+ 
+-	int finiteelement;
+-	iomodel->Constant(&finiteelement,DamageElementinterpEnum);
++	/*retrieve parameters:*/
++	element->FindParam(&c1,DamageC1Enum);
++	element->FindParam(&c2,DamageC2Enum);
++	element->FindParam(&c3,DamageC3Enum);
++	element->FindParam(&healing,DamageHealingEnum);
++	element->FindParam(&stress_threshold,DamageStressThresholdEnum);
++	element->FindParam(&domaintype,DomainTypeEnum);
++	element->FindParam(&damagelaw,DamageLawEnum);
+ 
+-	IoModelToConstraintsx(constraints,iomodel,DamageSpcdamageEnum,DamageEvolutionAnalysisEnum,finiteelement);
++	/*Get problem dimension*/
++	switch(domaintype){
++		case Domain2DhorizontalEnum: dim = 2; break;
++		case Domain3DEnum:           dim = 3; break;
++		default: _error_("not implemented");
++	}
++	/*Compute stress tensor and Stress Max Principal: */
++	element->ComputeDeviatoricStressTensor();
++	if(dim==3){
++		/*Only works in 3d because the pressure is defined*/
++		element->StressMaxPrincipalCreateInput();
++	}
++	/*retrieve what we need: */
++	Input* tau_xx_input  = element->GetInput(DeviatoricStressxxEnum);     _assert_(tau_xx_input);
++	Input* tau_xy_input  = element->GetInput(DeviatoricStressxyEnum);     _assert_(tau_xy_input);
++	Input* tau_yy_input  = element->GetInput(DeviatoricStressyyEnum);     _assert_(tau_yy_input);
++	Input* tau_xz_input  = NULL;
++	Input* tau_yz_input  = NULL;
++	Input* tau_zz_input  = NULL;
++	Input* stressMaxPrincipal_input = NULL;
++	if(dim==3){
++		tau_xz_input  = element->GetInput(DeviatoricStressxzEnum);     _assert_(tau_xz_input);
++		tau_yz_input  = element->GetInput(DeviatoricStressyzEnum);     _assert_(tau_yz_input);
++		tau_zz_input  = element->GetInput(DeviatoricStresszzEnum);     _assert_(tau_zz_input);
++		stressMaxPrincipal_input = element->GetInput(StressMaxPrincipalEnum); _assert_(stressMaxPrincipal_input);
++	}
++	Input* damage_input = NULL;
++	if(domaintype==Domain2DhorizontalEnum){
++		damage_input = element->GetInput(DamageDbarEnum); 	_assert_(damage_input);
++	}
++	else{
++		damage_input = element->GetInput(DamageDEnum);   _assert_(damage_input);
++	}
+ 
+-}/*}}}*/
+-void DamageEvolutionAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++	/*retrieve the desired type of equivalent stress*/
++	element->FindParam(&equivstress,DamageEquivStressEnum);
+ 
+-	/*Nothing for now*/
++	/*Calculate damage evolution source term: */
++	Gauss* gauss=element->NewGauss();
++	for (int i=0;i<numnodes;i++){
++		gauss->GaussNode(element->GetElementType(),i);
++		
++		damage_input->GetInputValue(&damage,gauss);
++		tau_xx_input->GetInputValue(&tau_xx,gauss);
++		tau_xy_input->GetInputValue(&tau_xy,gauss);
++		tau_yy_input->GetInputValue(&tau_yy,gauss);
++		if(dim==3){
++			tau_xz_input->GetInputValue(&tau_xz,gauss);
++			tau_yz_input->GetInputValue(&tau_yz,gauss);
++			tau_zz_input->GetInputValue(&tau_zz,gauss);
++		}
++		/*Calculate effective stress components*/
++		s_xx=tau_xx/(1.-damage);
++		s_xy=tau_xy/(1.-damage);
++		s_yy=tau_yy/(1.-damage);
++		if(dim==3){
++			s_xz=tau_xz/(1.-damage);
++			s_yz=tau_yz/(1.-damage);
++			s_zz=tau_zz/(1.-damage);
++		}
++		/*Calculate principal effective stresses*/
++		if(dim==2){
++			s1=(s_xx+s_yy)/2.+sqrt(pow((s_xx-s_yy)/2.,2)+pow(s_xy,2));
++			s2=(s_xx+s_yy)/2.-sqrt(pow((s_xx-s_yy)/2.,2)+pow(s_xy,2));
++			if(fabs(s2)>fabs(s1)){stmp=s2; s2=s1; s1=stmp;}
+ 
+-}/*}}}*/
++			if(equivstress==0){ /* von Mises */
++				Chi=sqrt(s1*s1-s1*s2+s2*s2);
++			}
++			else if(equivstress==1){ /* max principal stress */
++				Chi=s1;
++			}
++			Psi=Chi-stress_threshold;
++			NegPsi=max(-Chi,0.); /* healing only for compressive stresses */
+ 
+-/*Finite Element Analysis*/
+-void           DamageEvolutionAnalysis::Core(FemModel* femmodel){/*{{{*/
+-	_error_("not implemented");
++			if(damagelaw==1){
++				PosPsi=max(Psi,0.);
++				f[i]= c1*(pow(PosPsi,c2) - healing*pow(NegPsi,c2))*pow((1./(1.-damage)),c3);
++			}
++			else if(damagelaw==2){
++				PosPsi=max(Psi,1.);
++				f[i]= c1*(pow(log10(PosPsi),c2) - healing*pow(NegPsi,c2))*pow((1./(1.-damage)),c3);
++			}
++			else _error_("damage law not supported");
++		}
++		else{
++			if(equivstress==1){/* max principal stress */
++				stressMaxPrincipal_input->GetInputValue(&stressMaxPrincipal,gauss);
++				Chi=stressMaxPrincipal/(1.-damage);
++			}
++			else if(equivstress==0){/* von Mises */
++				Chi=sqrt(((s_xx-s_yy)*(s_xx-s_yy)+(s_yy-s_zz)*(s_yy-s_zz)+(s_zz-s_xx)*(s_zz-s_xx)+6.*(s_xy*s_xy+s_yz*s_yz+s_xz*s_xz))/2.);
++			}
++			Psi=Chi-stress_threshold;
++			NegPsi=max(-Chi,0.); /* healing only for compressive stresses */
++			if(damagelaw==1){
++				PosPsi=max(Psi,0.);
++				f[i]= c1*(pow(PosPsi,c2) - healing*pow(NegPsi,c2))*pow((1./(1.-damage)),c3);
++			}
++			else if(damagelaw==2){
++				PosPsi=max(Psi,1.);
++				f[i]= c1*(pow(log10(PosPsi),c2) - healing*pow(NegPsi,c2))*pow((1./(1.-damage)),c3);
++			}
++			else _error_("damage law not supported");
++		}
++	}
++	/*Add input*/
++	element->AddInput(DamageFEnum,f,element->GetElementType());
++	
++	/*Clean up and return*/
++	xDelete<IssmDouble>(f);
++	delete gauss;
+ }/*}}}*/
+ ElementVector* DamageEvolutionAnalysis::CreateDVector(Element* element){/*{{{*/
+ 	/*Default, return NULL*/
+@@ -341,7 +547,7 @@
+ 	delete gauss;
+ 	return pe;
+ }/*}}}*/
+-void DamageEvolutionAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           DamageEvolutionAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
+ 	 * For node i, Bi can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -369,7 +575,7 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(basis);
+ }/*}}}*/
+-void DamageEvolutionAnalysis::GetBprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++void           DamageEvolutionAnalysis::GetBprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 
+ 	 * For node i, Bi' can be expressed in the actual coordinate system
+ 	 * by: 
+@@ -398,13 +604,13 @@
+ 	xDelete<IssmDouble>(dbasis);
+ 
+ }/*}}}*/
+-void DamageEvolutionAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           DamageEvolutionAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void DamageEvolutionAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           DamageEvolutionAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void DamageEvolutionAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           DamageEvolutionAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	int domaintype;
+ 	IssmDouble  max_damage;
+@@ -444,7 +650,7 @@
+ 	xDelete<IssmDouble>(newdamage);
+ 	xDelete<int>(doflist);
+ }/*}}}*/
+-void DamageEvolutionAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           DamageEvolutionAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	bool islevelset;
+ 	femmodel->parameters->FindParam(&islevelset,TransientIslevelsetEnum);
+@@ -453,211 +659,3 @@
+ 	}
+ 	return;
+ }/*}}}*/
+-
+-/*Intermediaries*/
+-void DamageEvolutionAnalysis::CreateDamageFInputPralong(Element* element){/*{{{*/
+-
+-	/*Intermediaries */
+-	IssmDouble c1,c2,c3,healing,stress_threshold;
+-	IssmDouble s_xx,s_xy,s_xz,s_yy,s_yz,s_zz,s1,s2,s3,stmp;
+-	IssmDouble J2s,Chi,Psi,PosPsi,NegPsi;
+-	IssmDouble damage,tau_xx,tau_xy,tau_xz,tau_yy,tau_yz,tau_zz,stressMaxPrincipal;
+-	int equivstress,domaintype,damagelaw,dim;
+-
+-	/*Fetch number of vertices and allocate output*/
+-	int numnodes = element->GetNumberOfNodes();
+-	IssmDouble* f   = xNew<IssmDouble>(numnodes);
+-
+-	/*retrieve parameters:*/
+-	element->FindParam(&c1,DamageC1Enum);
+-	element->FindParam(&c2,DamageC2Enum);
+-	element->FindParam(&c3,DamageC3Enum);
+-	element->FindParam(&healing,DamageHealingEnum);
+-	element->FindParam(&stress_threshold,DamageStressThresholdEnum);
+-	element->FindParam(&domaintype,DomainTypeEnum);
+-	element->FindParam(&damagelaw,DamageLawEnum);
+-
+-	/*Get problem dimension*/
+-	switch(domaintype){
+-		case Domain2DhorizontalEnum: dim = 2; break;
+-		case Domain3DEnum:           dim = 3; break;
+-		default: _error_("not implemented");
+-	}
+-	/*Compute stress tensor and Stress Max Principal: */
+-	element->ComputeDeviatoricStressTensor();
+-	if(dim==3){
+-		/*Only works in 3d because the pressure is defined*/
+-		element->StressMaxPrincipalCreateInput();
+-	}
+-	/*retrieve what we need: */
+-	Input* tau_xx_input  = element->GetInput(DeviatoricStressxxEnum);     _assert_(tau_xx_input);
+-	Input* tau_xy_input  = element->GetInput(DeviatoricStressxyEnum);     _assert_(tau_xy_input);
+-	Input* tau_yy_input  = element->GetInput(DeviatoricStressyyEnum);     _assert_(tau_yy_input);
+-	Input* tau_xz_input  = NULL;
+-	Input* tau_yz_input  = NULL;
+-	Input* tau_zz_input  = NULL;
+-	Input* stressMaxPrincipal_input = NULL;
+-	if(dim==3){
+-		tau_xz_input  = element->GetInput(DeviatoricStressxzEnum);     _assert_(tau_xz_input);
+-		tau_yz_input  = element->GetInput(DeviatoricStressyzEnum);     _assert_(tau_yz_input);
+-		tau_zz_input  = element->GetInput(DeviatoricStresszzEnum);     _assert_(tau_zz_input);
+-		stressMaxPrincipal_input = element->GetInput(StressMaxPrincipalEnum); _assert_(stressMaxPrincipal_input);
+-	}
+-	Input* damage_input = NULL;
+-	if(domaintype==Domain2DhorizontalEnum){
+-		damage_input = element->GetInput(DamageDbarEnum); 	_assert_(damage_input);
+-	}
+-	else{
+-		damage_input = element->GetInput(DamageDEnum);   _assert_(damage_input);
+-	}
+-
+-	/*retrieve the desired type of equivalent stress*/
+-	element->FindParam(&equivstress,DamageEquivStressEnum);
+-
+-	/*Calculate damage evolution source term: */
+-	Gauss* gauss=element->NewGauss();
+-	for (int i=0;i<numnodes;i++){
+-		gauss->GaussNode(element->GetElementType(),i);
+-		
+-		damage_input->GetInputValue(&damage,gauss);
+-		tau_xx_input->GetInputValue(&tau_xx,gauss);
+-		tau_xy_input->GetInputValue(&tau_xy,gauss);
+-		tau_yy_input->GetInputValue(&tau_yy,gauss);
+-		if(dim==3){
+-			tau_xz_input->GetInputValue(&tau_xz,gauss);
+-			tau_yz_input->GetInputValue(&tau_yz,gauss);
+-			tau_zz_input->GetInputValue(&tau_zz,gauss);
+-		}
+-		/*Calculate effective stress components*/
+-		s_xx=tau_xx/(1.-damage);
+-		s_xy=tau_xy/(1.-damage);
+-		s_yy=tau_yy/(1.-damage);
+-		if(dim==3){
+-			s_xz=tau_xz/(1.-damage);
+-			s_yz=tau_yz/(1.-damage);
+-			s_zz=tau_zz/(1.-damage);
+-		}
+-		/*Calculate principal effective stresses*/
+-		if(dim==2){
+-			s1=(s_xx+s_yy)/2.+sqrt(pow((s_xx-s_yy)/2.,2)+pow(s_xy,2));
+-			s2=(s_xx+s_yy)/2.-sqrt(pow((s_xx-s_yy)/2.,2)+pow(s_xy,2));
+-			if(fabs(s2)>fabs(s1)){stmp=s2; s2=s1; s1=stmp;}
+-
+-			if(equivstress==0){ /* von Mises */
+-				Chi=sqrt(s1*s1-s1*s2+s2*s2);
+-			}
+-			else if(equivstress==1){ /* max principal stress */
+-				Chi=s1;
+-			}
+-			Psi=Chi-stress_threshold;
+-			NegPsi=max(-Chi,0.); /* healing only for compressive stresses */
+-
+-			if(damagelaw==1){
+-				PosPsi=max(Psi,0.);
+-				f[i]= c1*(pow(PosPsi,c2) - healing*pow(NegPsi,c2))*pow((1./(1.-damage)),c3);
+-			}
+-			else if(damagelaw==2){
+-				PosPsi=max(Psi,1.);
+-				f[i]= c1*(pow(log10(PosPsi),c2) - healing*pow(NegPsi,c2))*pow((1./(1.-damage)),c3);
+-			}
+-			else _error_("damage law not supported");
+-		}
+-		else{
+-			if(equivstress==1){/* max principal stress */
+-				stressMaxPrincipal_input->GetInputValue(&stressMaxPrincipal,gauss);
+-				Chi=stressMaxPrincipal/(1.-damage);
+-			}
+-			else if(equivstress==0){/* von Mises */
+-				Chi=sqrt(((s_xx-s_yy)*(s_xx-s_yy)+(s_yy-s_zz)*(s_yy-s_zz)+(s_zz-s_xx)*(s_zz-s_xx)+6.*(s_xy*s_xy+s_yz*s_yz+s_xz*s_xz))/2.);
+-			}
+-			Psi=Chi-stress_threshold;
+-			NegPsi=max(-Chi,0.); /* healing only for compressive stresses */
+-			if(damagelaw==1){
+-				PosPsi=max(Psi,0.);
+-				f[i]= c1*(pow(PosPsi,c2) - healing*pow(NegPsi,c2))*pow((1./(1.-damage)),c3);
+-			}
+-			else if(damagelaw==2){
+-				PosPsi=max(Psi,1.);
+-				f[i]= c1*(pow(log10(PosPsi),c2) - healing*pow(NegPsi,c2))*pow((1./(1.-damage)),c3);
+-			}
+-			else _error_("damage law not supported");
+-		}
+-	}
+-	/*Add input*/
+-	element->AddInput(DamageFEnum,f,element->GetElementType());
+-	
+-	/*Clean up and return*/
+-	xDelete<IssmDouble>(f);
+-	delete gauss;
+-}/*}}}*/
+-void DamageEvolutionAnalysis::CreateDamageFInputExp(Element* element){/*{{{*/
+-
+-	/*Intermediaries */
+-	IssmDouble epsf,stress_threshold,eps0;
+-	IssmDouble damage,B,n,epseff;
+-	IssmDouble eps_xx,eps_yy,eps_xy,eps1,eps2,epstmp;
+-	int domaintype,damagelaw;
+-
+-	/*Fetch number of vertices and allocate output*/
+-	int numnodes = element->GetNumberOfNodes();
+-	IssmDouble* f   = xNew<IssmDouble>(numnodes);
+-
+-	/*retrieve parameters:*/
+-	element->FindParam(&epsf,DamageC1Enum);
+-	element->FindParam(&stress_threshold,DamageStressThresholdEnum);
+-	element->FindParam(&domaintype,DomainTypeEnum);
+-	element->FindParam(&damagelaw,DamageLawEnum);
+-
+-	/*Compute stress tensor: */
+-	element->ComputeStrainRate();
+-
+-	/*retrieve what we need: */
+-	Input* eps_xx_input  = element->GetInput(StrainRatexxEnum);     _assert_(eps_xx_input);
+-	Input* eps_xy_input  = element->GetInput(StrainRatexyEnum);     _assert_(eps_xy_input);
+-	Input* eps_yy_input  = element->GetInput(StrainRateyyEnum);     _assert_(eps_yy_input);
+-	Input*  n_input=element->GetInput(MaterialsRheologyNEnum); _assert_(n_input);
+-	Input* damage_input = NULL;
+-	Input* B_input = NULL;
+-	if(domaintype==Domain2DhorizontalEnum){
+-		damage_input = element->GetInput(DamageDbarEnum); 	_assert_(damage_input);
+-		B_input=element->GetInput(MaterialsRheologyBbarEnum); _assert_(B_input);
+-	}
+-	else{
+-		damage_input = element->GetInput(DamageDEnum);   _assert_(damage_input);
+-		B_input=element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);
+-	}
+-
+-	/*Calculate damage evolution source term: */
+-	Gauss* gauss=element->NewGauss();
+-	for (int i=0;i<numnodes;i++){
+-		gauss->GaussNode(element->GetElementType(),i);
+-		
+-		eps_xx_input->GetInputValue(&eps_xx,gauss);
+-		eps_xy_input->GetInputValue(&eps_xy,gauss);
+-		eps_yy_input->GetInputValue(&eps_yy,gauss);
+-		B_input->GetInputValue(&B,gauss);
+-		n_input->GetInputValue(&n,gauss);
+-		damage_input->GetInputValue(&damage,gauss);
+-	
+-		/*Calculate principal effective strain rates*/
+-		eps1=(eps_xx+eps_yy)/2.+sqrt(pow((eps_xx-eps_yy)/2.,2)+pow(eps_xy,2));
+-		eps2=(eps_xx+eps_yy)/2.-sqrt(pow((eps_xx-eps_yy)/2.,2)+pow(eps_xy,2));
+-		if(fabs(eps2)>fabs(eps1)){epstmp=eps2; eps2=eps1; eps1=epstmp;}
+-
+-		/*Calculate effective strain rate and threshold strain rate*/
+-		epseff=1./sqrt(2.)*sqrt(eps1*eps1-eps1*eps2+eps2*eps2);
+-		eps0=pow(stress_threshold/B,n);
+-
+-		if(epseff>eps0){
+-			f[i]=1.-pow(eps0/epseff,1./n)*exp(-(epseff-eps0)/(epsf-eps0))-damage;
+-		}
+-		else f[i]=0;
+-	}
+-
+-	/*Add input*/
+-	element->AddInput(DamageFEnum,f,element->GetElementType());
+-	
+-	/*Clean up and return*/
+-	xDelete<IssmDouble>(f);
+-	delete gauss;
+-}/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/MeshdeformationAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/MeshdeformationAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/MeshdeformationAnalysis.cpp	(revision 18930)
+@@ -5,22 +5,22 @@
+ #include "../modules/modules.h"
+ 
+ /*Model processing*/
+-int  MeshdeformationAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+-	_error_("not implemented");
+-}/*}}}*/
+-void MeshdeformationAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++void MeshdeformationAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void MeshdeformationAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
++void MeshdeformationAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+ void MeshdeformationAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void MeshdeformationAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
++int  MeshdeformationAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
++	_error_("not implemented");
++}/*}}}*/
++void MeshdeformationAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void MeshdeformationAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++void MeshdeformationAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+ 
+@@ -41,16 +41,16 @@
+ ElementVector* MeshdeformationAnalysis::CreatePVector(Element* element){/*{{{*/
+ _error_("not implemented yet");
+ }/*}}}*/
+-void MeshdeformationAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++void           MeshdeformationAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	   _error_("not implemented yet");
+ }/*}}}*/
+-void MeshdeformationAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++void           MeshdeformationAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
+-void MeshdeformationAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
++void           MeshdeformationAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 	_error_("not implemented yet");
+ }/*}}}*/
+-void MeshdeformationAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++void           MeshdeformationAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+ }/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 18930)
+@@ -6,31 +6,104 @@
+ #include "../solutionsequences/solutionsequences.h"
+ 
+ /*Model processing*/
+-int  EnthalpyAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+-	return 1;
+-}/*}}}*/
+-void EnthalpyAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++void EnthalpyAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+ 
+-	int     numoutputs;
+-	char**  requestedoutputs = NULL;
++	/*Intermediary*/
++	int        count;
++	int        M,N;
++	bool       spcpresent = false;
++	IssmDouble heatcapacity;
++	IssmDouble referencetemperature;
+ 
+-	parameters->AddObject(iomodel->CopyConstantObject(ThermalStabilizationEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(ThermalMaxiterEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(ThermalReltolEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(ThermalIsenthalpyEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(ThermalIsdynamicbasalspcEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(FrictionLawEnum));
++	/*Output*/
++	IssmDouble *spcvector  = NULL;
++	IssmDouble* times=NULL;
++	IssmDouble* values=NULL;
+ 
+-	iomodel->FetchData(&requestedoutputs,&numoutputs,ThermalRequestedOutputsEnum);
+-	parameters->AddObject(new IntParam(ThermalNumRequestedOutputsEnum,numoutputs));
+-	if(numoutputs)parameters->AddObject(new StringArrayParam(ThermalRequestedOutputsEnum,requestedoutputs,numoutputs));
+-	iomodel->DeleteData(&requestedoutputs,numoutputs,ThermalRequestedOutputsEnum);
++	/*Fetch parameters: */
++	iomodel->Constant(&heatcapacity,MaterialsHeatcapacityEnum);
++	iomodel->Constant(&referencetemperature,ConstantsReferencetemperatureEnum);
+ 
+-	/*Deal with friction parameters*/
+-	int frictionlaw;
+-	iomodel->Constant(&frictionlaw,FrictionLawEnum);
+-	if(frictionlaw==4 || frictionlaw==6) parameters->AddObject(iomodel->CopyConstantObject(FrictionGammaEnum));
++	/*return if 2d mesh*/
++	if(iomodel->domaintype==Domain2DhorizontalEnum) return;
++
++	/*Fetch data: */
++	iomodel->FetchData(&spcvector,&M,&N,ThermalSpctemperatureEnum);
++
++	//FIX ME: SHOULD USE IOMODELCREATECONSTRAINTS 
++	/*Transient or static?:*/
++	if(M==iomodel->numberofvertices){
++		/*static: just create Constraints objects*/
++		count=0;
++
++		for(int i=0;i<iomodel->numberofvertices;i++){
++			/*keep only this partition's nodes:*/
++			if((iomodel->my_vertices[i])){
++
++				if (!xIsNan<IssmDouble>(spcvector[i])){
++
++					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,0,heatcapacity*(spcvector[i]-referencetemperature),EnthalpyAnalysisEnum));
++					count++;
++
++				}
++			}
++		}
++	}
++	else if (M==(iomodel->numberofvertices+1)){
++		/*transient: create transient SpcTransient objects. Same logic, except we need to retrieve 
++		 * various times and values to initialize an SpcTransient object: */
++		count=0;
++
++		/*figure out times: */
++		times=xNew<IssmDouble>(N);
++		for(int j=0;j<N;j++){
++			times[j]=spcvector[(M-1)*N+j];
++		}
++
++		/*Create constraints from x,y,z: */
++		for(int i=0;i<iomodel->numberofvertices;i++){
++
++			/*keep only this partition's nodes:*/
++			if((iomodel->my_vertices[i])){
++
++				/*figure out times and values: */
++				values=xNew<IssmDouble>(N);
++				spcpresent=false;
++				for(int j=0;j<N;j++){
++					values[j]=heatcapacity*(spcvector[i*N+j]-referencetemperature);
++					if(!xIsNan<IssmDouble>(values[j]))spcpresent=true; //NaN means no spc by default
++				}
++
++				if(spcpresent){
++					constraints->AddObject(new SpcTransient(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,0,N,times,values,EnthalpyAnalysisEnum));
++					count++;
++				}
++				xDelete<IssmDouble>(values);
++			}
++		}
++	}
++	else{
++		_error_("Size of field " << EnumToStringx(ThermalSpctemperatureEnum) << " not supported");
++	}
++
++	/*Free ressources:*/
++	iomodel->DeleteData(spcvector,ThermalSpctemperatureEnum);
++	xDelete<IssmDouble>(times);
++	xDelete<IssmDouble>(values);
+ }/*}}}*/
++void EnthalpyAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
++
++	/*No loads */
++}/*}}}*/
++void EnthalpyAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++
++	if(iomodel->domaintype==Domain3DEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++	::CreateNodes(nodes,iomodel,EnthalpyAnalysisEnum,P1Enum);
++	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++}/*}}}*/
++int  EnthalpyAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
++	return 1;
++}/*}}}*/
+ void EnthalpyAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	bool dakota_analysis,islevelset,isenthalpy;
+@@ -131,104 +204,245 @@
+ 	/*Free data: */
+ 	iomodel->DeleteData(3,TemperatureEnum,WaterfractionEnum,PressureEnum);
+ }/*}}}*/
+-void EnthalpyAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
++void EnthalpyAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ 
+-	if(iomodel->domaintype==Domain3DEnum) iomodel->FetchData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+-	::CreateNodes(nodes,iomodel,EnthalpyAnalysisEnum,P1Enum);
+-	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
++	int     numoutputs;
++	char**  requestedoutputs = NULL;
++
++	parameters->AddObject(iomodel->CopyConstantObject(ThermalStabilizationEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(ThermalMaxiterEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(ThermalReltolEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(ThermalIsenthalpyEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(ThermalIsdynamicbasalspcEnum));
++	parameters->AddObject(iomodel->CopyConstantObject(FrictionLawEnum));
++
++	iomodel->FetchData(&requestedoutputs,&numoutputs,ThermalRequestedOutputsEnum);
++	parameters->AddObject(new IntParam(ThermalNumRequestedOutputsEnum,numoutputs));
++	if(numoutputs)parameters->AddObject(new StringArrayParam(ThermalRequestedOutputsEnum,requestedoutputs,numoutputs));
++	iomodel->DeleteData(&requestedoutputs,numoutputs,ThermalRequestedOutputsEnum);
++
++	/*Deal with friction parameters*/
++	int frictionlaw;
++	iomodel->Constant(&frictionlaw,FrictionLawEnum);
++	if(frictionlaw==4 || frictionlaw==6) parameters->AddObject(iomodel->CopyConstantObject(FrictionGammaEnum));
+ }/*}}}*/
+-void EnthalpyAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+ 
+-	/*Intermediary*/
+-	int        count;
+-	int        M,N;
+-	bool       spcpresent = false;
+-	IssmDouble heatcapacity;
+-	IssmDouble referencetemperature;
++/*Finite Element Analysis*/
++void           EnthalpyAnalysis::ApplyBasalConstraints(IssmDouble* serial_spc,Element* element){/*{{{*/
+ 
+-	/*Output*/
+-	IssmDouble *spcvector  = NULL;
+-	IssmDouble* times=NULL;
+-	IssmDouble* values=NULL;
++	/* Check if ice in element */
++	if(!element->IsIceInElement()) return;
+ 
+-	/*Fetch parameters: */
+-	iomodel->Constant(&heatcapacity,MaterialsHeatcapacityEnum);
+-	iomodel->Constant(&referencetemperature,ConstantsReferencetemperatureEnum);
++	/* Only update Constraints at the base of grounded ice*/
++	if(!(element->IsOnBase()) || element->IsFloating()) return;
+ 
+-	/*return if 2d mesh*/
+-	if(iomodel->domaintype==Domain2DhorizontalEnum) return;
++	/*Intermediary*/
++	bool        isdynamicbasalspc;
++	int         numindices;
++	int        *indices = NULL;
++	Node*       node = NULL;
++	IssmDouble	pressure;
+ 
+-	/*Fetch data: */
+-	iomodel->FetchData(&spcvector,&M,&N,ThermalSpctemperatureEnum);
++	/*Check wether dynamic basal boundary conditions are activated */
++	element->FindParam(&isdynamicbasalspc,ThermalIsdynamicbasalspcEnum);
++	if(!isdynamicbasalspc) return;
+ 
+-	//FIX ME: SHOULD USE IOMODELCREATECONSTRAINTS 
+-	/*Transient or static?:*/
+-	if(M==iomodel->numberofvertices){
+-		/*static: just create Constraints objects*/
+-		count=0;
++	/*Get parameters and inputs: */
++	Input* pressure_input		 = element->GetInput(PressureEnum);							 _assert_(pressure_input);
+ 
+-		for(int i=0;i<iomodel->numberofvertices;i++){
+-			/*keep only this partition's nodes:*/
+-			if((iomodel->my_vertices[i])){
++	/*Fetch indices of basal & surface nodes for this finite element*/
++	Penta *penta =  (Penta *) element; // TODO: add Basal-/SurfaceNodeIndices to element.h, and change this to Element*
++	penta->BasalNodeIndices(&numindices,&indices,element->GetElementType());
+ 
+-				if (!xIsNan<IssmDouble>(spcvector[i])){
++	GaussPenta* gauss=new GaussPenta();
++	for(int i=0;i<numindices;i++){
++		gauss->GaussNode(element->GetElementType(),indices[i]);
+ 
+-					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,0,heatcapacity*(spcvector[i]-referencetemperature),EnthalpyAnalysisEnum));
+-					count++;
++		pressure_input->GetInputValue(&pressure,gauss);
+ 
+-				}
+-			}
++		/*apply or release spc*/
++		node=element->GetNode(indices[i]);
++		if(serial_spc[node->Sid()]==1.){
++			pressure_input->GetInputValue(&pressure, gauss);
++			node->ApplyConstraint(0,PureIceEnthalpy(element,pressure));
+ 		}
++		else			
++			node->DofInFSet(0);
+ 	}
+-	else if (M==(iomodel->numberofvertices+1)){
+-		/*transient: create transient SpcTransient objects. Same logic, except we need to retrieve 
+-		 * various times and values to initialize an SpcTransient object: */
+-		count=0;
+ 
+-		/*figure out times: */
+-		times=xNew<IssmDouble>(N);
+-		for(int j=0;j<N;j++){
+-			times[j]=spcvector[(M-1)*N+j];
+-		}
++	/*Free ressources:*/
++	xDelete<int>(indices);
++	delete gauss;
++}/*}}}*/
++void           EnthalpyAnalysis::ComputeBasalMeltingrate(FemModel* femmodel){/*{{{*/
++	/*Compute basal melting rates: */
++	for(int i=0;i<femmodel->elements->Size();i++){
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		ComputeBasalMeltingrate(element);
++	}
++}/*}}}*/
++void           EnthalpyAnalysis::ComputeBasalMeltingrate(Element* element){/*{{{*/
++	/*Calculate the basal melt rates of the enthalpy model after Aschwanden 2012*/
++	/* melting rate is positive when melting, negative when refreezing*/
+ 
+-		/*Create constraints from x,y,z: */
+-		for(int i=0;i<iomodel->numberofvertices;i++){
++	/* Check if ice in element */
++	if(!element->IsIceInElement()) return;
+ 
+-			/*keep only this partition's nodes:*/
+-			if((iomodel->my_vertices[i])){
++	/* Only compute melt rates at the base of grounded ice*/
++	if(!element->IsOnBase() || element->IsFloating()) return;
+ 
+-				/*figure out times and values: */
+-				values=xNew<IssmDouble>(N);
+-				spcpresent=false;
+-				for(int j=0;j<N;j++){
+-					values[j]=heatcapacity*(spcvector[i*N+j]-referencetemperature);
+-					if(!xIsNan<IssmDouble>(values[j]))spcpresent=true; //NaN means no spc by default
+-				}
++	/* Intermediaries */
++	bool			converged;
++	const int   dim=3;
++	int         i,is,state;
++	int			vertexdown,vertexup,numvertices,numsegments;
++	int			enthalpy_enum;
++	IssmDouble  vec_heatflux[dim],normal_base[dim],d1enthalpy[dim],d1pressure[dim];
++	IssmDouble  basalfriction,alpha2,geothermalflux,heatflux;
++	IssmDouble  dt,yts;
++	IssmDouble  melting_overshoot,lambda;
++	IssmDouble  vx,vy,vz;
++	IssmDouble *xyz_list      = NULL;
++	IssmDouble *xyz_list_base = NULL;
++	int        *pairindices   = NULL;
+ 
+-				if(spcpresent){
+-					constraints->AddObject(new SpcTransient(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,0,N,times,values,EnthalpyAnalysisEnum));
+-					count++;
+-				}
+-				xDelete<IssmDouble>(values);
++	/*Fetch parameters*/
++	element->GetVerticesCoordinates(&xyz_list);
++	element->GetVerticesCoordinatesBase(&xyz_list_base);
++	element->GetInputValue(&converged,ConvergedEnum);
++	element->FindParam(&dt,TimesteppingTimeStepEnum);
++	element->FindParam(&yts, ConstantsYtsEnum);
++
++	if(dt==0. && !converged) enthalpy_enum=EnthalpyPicardEnum;
++	else enthalpy_enum=EnthalpyEnum;
++
++	IssmDouble latentheat = element->GetMaterialParameter(MaterialsLatentheatEnum);
++	IssmDouble rho_ice    = element->GetMaterialParameter(MaterialsRhoIceEnum);
++	IssmDouble rho_water  = element->GetMaterialParameter(MaterialsRhoFreshwaterEnum);
++	IssmDouble beta		 = element->GetMaterialParameter(MaterialsBetaEnum);
++	IssmDouble kappa		 = EnthalpyDiffusionParameterVolume(element,enthalpy_enum);     _assert_(kappa>=0.);
++	IssmDouble kappa_mix;
++
++	/*retrieve inputs*/
++	Input* enthalpy_input         = element->GetInput(enthalpy_enum);                    _assert_(enthalpy_input);
++	Input* pressure_input			= element->GetInput(PressureEnum);							 _assert_(pressure_input);
++	Input* geothermalflux_input   = element->GetInput(BasalforcingsGeothermalfluxEnum); _assert_(geothermalflux_input);
++	Input* vx_input               = element->GetInput(VxEnum);                          _assert_(vx_input);
++	Input* vy_input               = element->GetInput(VyEnum);                          _assert_(vy_input);
++	Input* vz_input               = element->GetInput(VzEnum);                          _assert_(vz_input);
++
++	/*Build friction element, needed later: */
++	Friction* friction=new Friction(element,dim);
++
++	/******** MELTING RATES  ************************************//*{{{*/
++	element->NormalBase(&normal_base[0],xyz_list_base);
++	element->VerticalSegmentIndices(&pairindices,&numsegments);
++	IssmDouble* meltingrate_enthalpy = xNew<IssmDouble>(numsegments);
++	IssmDouble* heating = xNew<IssmDouble>(numsegments);	
++
++	numvertices=element->GetNumberOfVertices();
++	IssmDouble* enthalpies = xNew<IssmDouble>(numvertices);
++	IssmDouble* pressures = xNew<IssmDouble>(numvertices);
++	IssmDouble* watercolumns = xNew<IssmDouble>(numvertices);
++	IssmDouble* basalmeltingrates = xNew<IssmDouble>(numvertices);
++	element->GetInputListOnVertices(enthalpies,enthalpy_enum);
++	element->GetInputListOnVertices(pressures,PressureEnum);
++	element->GetInputListOnVertices(watercolumns,WatercolumnEnum);
++	element->GetInputListOnVertices(basalmeltingrates,BasalforcingsGroundediceMeltingRateEnum);
++
++	Gauss* gauss=element->NewGauss();
++	for(is=0;is<numsegments;is++){
++		vertexdown = pairindices[is*2+0];
++		vertexup   = pairindices[is*2+1];
++		gauss->GaussVertex(vertexdown);
++
++		state=GetThermalBasalCondition(element, enthalpies[vertexdown], enthalpies[vertexup], pressures[vertexdown], pressures[vertexup], watercolumns[vertexdown], basalmeltingrates[vertexdown]);
++		switch (state) {
++			case 0:
++				// cold, dry base: apply basal surface forcing
++				for(i=0;i<3;i++) vec_heatflux[i]=0.;
++				break;
++			case 1: case 2: case 3: 
++				// case 1 : cold, wet base: keep at pressure melting point 
++				// case 2: temperate, thin refreezing base: release spc
++				// case 3: temperate, thin melting base: set spc
++				enthalpy_input->GetInputDerivativeValue(&d1enthalpy[0],xyz_list,gauss);
++				for(i=0;i<3;i++) vec_heatflux[i]=-kappa*d1enthalpy[i];
++				break;
++			case 4:
++				// temperate, thick melting base: set grad H*n=0
++				kappa_mix=GetWetIceConductivity(element, enthalpies[vertexdown], pressures[vertexdown]);
++				pressure_input->GetInputDerivativeValue(&d1pressure[0],xyz_list,gauss);
++				for(i=0;i<3;i++) vec_heatflux[i]=kappa_mix*beta*d1pressure[i];
++				break;
++			default:
++				_printf0_("	unknown thermal basal state found!");
++		}
++		if(state==0) meltingrate_enthalpy[is]=0.;
++		else{
++			/*heat flux along normal*/
++			heatflux=0.;
++			for(i=0;i<3;i++) heatflux+=(vec_heatflux[i])*normal_base[i];
++
++			/*basal friction*/
++			friction->GetAlpha2(&alpha2,gauss);
++			vx_input->GetInputValue(&vx,gauss);		vy_input->GetInputValue(&vy,gauss);		vz_input->GetInputValue(&vz,gauss);
++			basalfriction=alpha2*(vx*vx + vy*vy + vz*vz);
++			geothermalflux_input->GetInputValue(&geothermalflux,gauss);
++			/* -Mb= Fb-(q-q_geo)/((1-w)*L*rho), and (1-w)*rho=rho_ice, cf Aschwanden 2012, eqs.1, 2, 66*/
++			heating[is]=(heatflux+basalfriction+geothermalflux);
++			meltingrate_enthalpy[is]=heating[is]/(latentheat*rho_ice); // m/s water equivalent
++		}
++	}/*}}}*/
++
++	/******** UPDATE MELTINGRATES AND WATERCOLUMN **************//*{{{*/
++	for(is=0;is<numsegments;is++){
++		vertexdown = pairindices[is*2+0];
++		vertexup   = pairindices[is*2+1];
++		if(dt!=0.){
++			if(watercolumns[vertexdown]+meltingrate_enthalpy[is]*dt<0.){	// prevent too much freeze on			
++				lambda = -watercolumns[vertexdown]/(dt*meltingrate_enthalpy[is]); _assert_(lambda>=0.); _assert_(lambda<1.);
++				watercolumns[vertexdown]=0.;
++				basalmeltingrates[vertexdown]=lambda*meltingrate_enthalpy[is]; // restrict freeze on only to size of watercolumn
++				enthalpies[vertexdown]+=(1.-lambda)*dt/yts*meltingrate_enthalpy[is]*latentheat*rho_ice; // use rest of energy to cool down base: dE=L*m, m=(1-lambda)*meltingrate*rho_ice
+ 			}
++			else{
++				basalmeltingrates[vertexdown]=meltingrate_enthalpy[is];
++				watercolumns[vertexdown]+=dt*meltingrate_enthalpy[is]; 
++			}
+ 		}
++		else{
++			basalmeltingrates[vertexdown]=meltingrate_enthalpy[is];
++			if(watercolumns[vertexdown]+meltingrate_enthalpy[is]<0.)
++				watercolumns[vertexdown]=0.;
++			else
++				watercolumns[vertexdown]+=meltingrate_enthalpy[is];
++		}	
++		basalmeltingrates[vertexdown]*=rho_water/rho_ice; // convert meltingrate from water to ice equivalent
++		_assert_(watercolumns[vertexdown]>=0.);
++	}/*}}}*/
++
++	/*feed updated variables back into model*/
++	if(dt!=0.){
++		element->AddInput(enthalpy_enum,enthalpies,P1Enum); //TODO: distinguis for steadystate and transient run
++		element->AddInput(WatercolumnEnum,watercolumns,P1Enum);
+ 	}
+-	else{
+-		_error_("Size of field " << EnumToStringx(ThermalSpctemperatureEnum) << " not supported");
+-	}
++	element->AddInput(BasalforcingsGroundediceMeltingRateEnum,basalmeltingrates,P1Enum);
+ 
+-	/*Free ressources:*/
+-	iomodel->DeleteData(spcvector,ThermalSpctemperatureEnum);
+-	xDelete<IssmDouble>(times);
+-	xDelete<IssmDouble>(values);
++	/*Clean up and return*/
++	delete gauss;
++	delete friction;
++	xDelete<int>(pairindices);
++	xDelete<IssmDouble>(enthalpies);
++	xDelete<IssmDouble>(pressures);
++	xDelete<IssmDouble>(watercolumns);
++	xDelete<IssmDouble>(basalmeltingrates);
++	xDelete<IssmDouble>(meltingrate_enthalpy);
++	xDelete<IssmDouble>(heating);
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(xyz_list_base);
+ }/*}}}*/
+-void EnthalpyAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+-
+-	/*No loads */
+-}/*}}}*/
+-
+-/*Finite Element Analysis*/
+-void EnthalpyAnalysis::Core(FemModel* femmodel){/*{{{*/
++void           EnthalpyAnalysis::Core(FemModel* femmodel){/*{{{*/
+ 	if(VerboseSolution()) _printf0_("   computing enthalpy\n");
+ 	femmodel->SetCurrentConfiguration(EnthalpyAnalysisEnum);
+ 	solutionsequence_thermal_nonlinear(femmodel);
+@@ -740,386 +954,76 @@
+ 	xDelete<IssmDouble>(xyz_list_base);
+ 	return pe;
+ }/*}}}*/
+-void EnthalpyAnalysis::GetBConduct(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+-	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1. 
+-	 * For node i, Bi' can be expressed in the actual coordinate system
+-	 * by: 
+-	 *       Bi_conduct=[ dh/dx ]
+-	 *                  [ dh/dy ]
+-	 *                  [ dh/dz ]
+-	 * where h is the interpolation function for node i.
+-	 *
+-	 * We assume B has been allocated already, of size: 3x(NDOF1*numnodes)
+-	 */
+-
+-	/*Fetch number of nodes for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-
+-	/*Get nodal functions derivatives*/
+-	IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
+-	element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+-
+-	/*Build B: */
+-	for(int i=0;i<numnodes;i++){
+-		B[numnodes*0+i] = dbasis[0*numnodes+i];
+-		B[numnodes*1+i] = dbasis[1*numnodes+i];
+-		B[numnodes*2+i] = dbasis[2*numnodes+i];
+-	}
+-
+-	/*Clean-up*/
+-	xDelete<IssmDouble>(dbasis);
+-}/*}}}*/
+-void EnthalpyAnalysis::GetBAdvec(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+-	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1. 
+-	 * For node i, Bi' can be expressed in the actual coordinate system
+-	 * by: 
+-	 *       Bi_advec =[ h ]
+-	 *                 [ h ]
+-	 *                 [ h ]
+-	 * where h is the interpolation function for node i.
+-	 *
+-	 * We assume B has been allocated already, of size: 3x(NDOF1*NUMNODESP1)
+-	 */
+-
+-	/*Fetch number of nodes for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-
+-	/*Get nodal functions*/
+-	IssmDouble* basis=xNew<IssmDouble>(numnodes);
+-	element->NodalFunctions(basis,gauss);
+-
+-	/*Build B: */
+-	for(int i=0;i<numnodes;i++){
+-		B[numnodes*0+i] = basis[i];
+-		B[numnodes*1+i] = basis[i];
+-		B[numnodes*2+i] = basis[i];
+-	}
+-
+-	/*Clean-up*/
+-	xDelete<IssmDouble>(basis);
+-}/*}}}*/
+-void EnthalpyAnalysis::GetBAdvecprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+-	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1. 
+-	 * For node i, Bi' can be expressed in the actual coordinate system
+-	 * by: 
+-	 *       Biprime_advec=[ dh/dx ]
+-	 *                     [ dh/dy ]
+-	 *                     [ dh/dz ]
+-	 * where h is the interpolation function for node i.
+-	 *
+-	 * We assume B has been allocated already, of size: 3x(NDOF1*numnodes)
+-	 */
+-
+-	/*Fetch number of nodes for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-
+-	/*Get nodal functions derivatives*/
+-	IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
+-	element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+-
+-	/*Build B: */
+-	for(int i=0;i<numnodes;i++){
+-		B[numnodes*0+i] = dbasis[0*numnodes+i];
+-		B[numnodes*1+i] = dbasis[1*numnodes+i];
+-		B[numnodes*2+i] = dbasis[2*numnodes+i];
+-	}
+-
+-	/*Clean-up*/
+-	xDelete<IssmDouble>(dbasis);
+-}/*}}}*/
+-void EnthalpyAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+-	element->GetSolutionFromInputsOneDof(solution,EnthalpyEnum);
+-}/*}}}*/
+-void EnthalpyAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+-	_error_("Not implemented yet");
+-}/*}}}*/
+-void EnthalpyAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+-
+-	bool        converged;
+-	int         i,rheology_law;
+-	IssmDouble  B_average,s_average,T_average=0.,P_average=0.;
+-	int        *doflist   = NULL;
+-	IssmDouble *xyz_list  = NULL;
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes    = element->GetNumberOfNodes();
+-
+-	/*Fetch dof list and allocate solution vector*/
+-	element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
+-	IssmDouble* values        = xNew<IssmDouble>(numnodes);
+-	IssmDouble* pressure      = xNew<IssmDouble>(numnodes);
+-	IssmDouble* surface       = xNew<IssmDouble>(numnodes);
+-	IssmDouble* B             = xNew<IssmDouble>(numnodes);
+-	IssmDouble* temperature   = xNew<IssmDouble>(numnodes);
+-	IssmDouble* waterfraction = xNew<IssmDouble>(numnodes);
+-
+-	/*Use the dof list to index into the solution vector: */
+-	for(i=0;i<numnodes;i++){
+-		values[i]=solution[doflist[i]];
+-
+-		/*Check solution*/
+-		if(xIsNan<IssmDouble>(values[i])) _error_("NaN found in solution vector");
+-	}
+-
+-	/*Get all inputs and parameters*/
+-	element->GetInputValue(&converged,ConvergedEnum);
+-	element->GetInputListOnNodes(&pressure[0],PressureEnum);
+-	if(converged){
+-		for(i=0;i<numnodes;i++){
+-			element->EnthalpyToThermal(&temperature[i],&waterfraction[i],values[i],pressure[i]);
+-			if(waterfraction[i]<0.) _error_("Negative water fraction found in solution vector");
+-			//if(waterfraction[i]>1.) _error_("Water fraction >1 found in solution vector");
+-		}
+-		element->AddInput(EnthalpyEnum,values,element->GetElementType());
+-		element->AddInput(WaterfractionEnum,waterfraction,element->GetElementType());
+-		element->AddInput(TemperatureEnum,temperature,element->GetElementType());
+-
+-		/*Update Rheology only if converged (we must make sure that the temperature is below melting point
+-		 * otherwise the rheology could be negative*/
+-		element->FindParam(&rheology_law,MaterialsRheologyLawEnum);
+-		element->GetInputListOnNodes(&surface[0],SurfaceEnum);
+-		switch(rheology_law){
+-			case NoneEnum:
+-				/*Do nothing: B is not temperature dependent*/
+-				break;
+-			case CuffeyEnum:
+-				for(i=0;i<numnodes;i++) B[i]=Cuffey(temperature[i]);
+-				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
+-				break;
+-			case PatersonEnum:
+-				for(i=0;i<numnodes;i++) B[i]=Paterson(temperature[i]);
+-				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
+-				break;
+-			case ArrheniusEnum:
+-				element->GetVerticesCoordinates(&xyz_list);
+-				for(i=0;i<numnodes;i++) B[i]=Arrhenius(temperature[i],surface[i]-xyz_list[i*3+2],element->GetMaterialParameter(MaterialsRheologyNEnum));
+-				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
+-				break;
+-			case LliboutryDuvalEnum:
+-				for(i=0;i<numnodes;i++) B[i]=LliboutryDuval(values[i],pressure[i],element->GetMaterialParameter(MaterialsRheologyNEnum),element->GetMaterialParameter(MaterialsBetaEnum),element->GetMaterialParameter(ConstantsReferencetemperatureEnum),element->GetMaterialParameter(MaterialsHeatcapacityEnum),element->GetMaterialParameter(MaterialsLatentheatEnum)); 
+-				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType()); 
+-				break; 
+-			default: _error_("Rheology law " << EnumToStringx(rheology_law) << " not supported yet");
+-		}
+-	}
+-	else{
+-		element->AddInput(EnthalpyPicardEnum,values,element->GetElementType());
+-	}
+-
+-	/*Free ressources:*/
+-	xDelete<IssmDouble>(values);
+-	xDelete<IssmDouble>(pressure);
+-	xDelete<IssmDouble>(surface);
+-	xDelete<IssmDouble>(B);
+-	xDelete<IssmDouble>(temperature);
+-	xDelete<IssmDouble>(waterfraction);
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<int>(doflist);
+-}/*}}}*/
+-void EnthalpyAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+-
+-	bool islevelset;
+-	femmodel->parameters->FindParam(&islevelset,TransientIslevelsetEnum);
+-	if(islevelset){
+-		SetActiveNodesLSMx(femmodel);
+-	}
+-	return;
+-}/*}}}*/
+-
+-/*Modules*/
+-void EnthalpyAnalysis::PostProcessing(FemModel* femmodel){/*{{{*/
+-
+-	/*Intermediaries*/
+-	bool computebasalmeltingrates=true;
+-	bool drainicecolumn=true;
+-	bool isdynamicbasalspc;
+-	IssmDouble dt;
+-
+-	femmodel->parameters->FindParam(&isdynamicbasalspc,ThermalIsdynamicbasalspcEnum);
+-	femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
+-
+-	//TODO: use dt to decide what to do
+-	if(drainicecolumn)	DrainWaterfraction(femmodel);
+-	if(computebasalmeltingrates)	ComputeBasalMeltingrate(femmodel);
+-	if(isdynamicbasalspc)	UpdateBasalConstraints(femmodel);
+-
+-}/*}}}*/
+-void EnthalpyAnalysis::ComputeBasalMeltingrate(FemModel* femmodel){/*{{{*/
+-	/*Compute basal melting rates: */
++void           EnthalpyAnalysis::DrainWaterfraction(FemModel* femmodel){/*{{{*/
++	/*Drain excess water fraction in ice column: */
+ 	for(int i=0;i<femmodel->elements->Size();i++){
+ 		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-		ComputeBasalMeltingrate(element);
++		DrainWaterfractionIcecolumn(element);
+ 	}
+ }/*}}}*/
+-void EnthalpyAnalysis::ComputeBasalMeltingrate(Element* element){/*{{{*/
+-	/*Calculate the basal melt rates of the enthalpy model after Aschwanden 2012*/
+-	/* melting rate is positive when melting, negative when refreezing*/
++void           EnthalpyAnalysis::DrainWaterfraction(Element* element, IssmDouble* pdrainrate_element){/*{{{*/
+ 
+ 	/* Check if ice in element */
+ 	if(!element->IsIceInElement()) return;
+ 
+-	/* Only compute melt rates at the base of grounded ice*/
+-	if(!element->IsOnBase() || element->IsFloating()) return;
++	/*Intermediaries*/
++	int iv,is,vertexdown,vertexup,numsegments;	
++	IssmDouble dt, height_element;
++	IssmDouble rho_water, rho_ice;
++	int numvertices = element->GetNumberOfVertices();
+ 
+-	/* Intermediaries */
+-	bool			converged;
+-	const int   dim=3;
+-	int         i,is,state;
+-	int			vertexdown,vertexup,numvertices,numsegments;
+-	int			enthalpy_enum;
+-	IssmDouble  vec_heatflux[dim],normal_base[dim],d1enthalpy[dim],d1pressure[dim];
+-	IssmDouble  basalfriction,alpha2,geothermalflux,heatflux;
+-	IssmDouble  dt,yts;
+-	IssmDouble  melting_overshoot,lambda;
+-	IssmDouble  vx,vy,vz;
+-	IssmDouble *xyz_list      = NULL;
+-	IssmDouble *xyz_list_base = NULL;
++	IssmDouble* xyz_list = NULL;
++	IssmDouble* enthalpies = xNew<IssmDouble>(numvertices);
++	IssmDouble* pressures = xNew<IssmDouble>(numvertices);
++	IssmDouble* temperatures = xNew<IssmDouble>(numvertices);
++	IssmDouble* waterfractions = xNew<IssmDouble>(numvertices);
++	IssmDouble* deltawaterfractions = xNew<IssmDouble>(numvertices);
+ 	int        *pairindices   = NULL;
++	
++	rho_ice=element->GetMaterialParameter(MaterialsRhoIceEnum);
++	rho_water=element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
+ 
+-	/*Fetch parameters*/
+ 	element->GetVerticesCoordinates(&xyz_list);
+-	element->GetVerticesCoordinatesBase(&xyz_list_base);
+-	element->GetInputValue(&converged,ConvergedEnum);
++	element->GetInputListOnVertices(enthalpies,EnthalpyEnum);
++	element->GetInputListOnVertices(pressures,PressureEnum);
++
+ 	element->FindParam(&dt,TimesteppingTimeStepEnum);
+-	element->FindParam(&yts, ConstantsYtsEnum);
++	for(iv=0;iv<numvertices;iv++){ 
++		element->EnthalpyToThermal(&temperatures[iv],&waterfractions[iv], enthalpies[iv],pressures[iv]); 
++		deltawaterfractions[iv]=DrainageFunctionWaterfraction(waterfractions[iv], dt);
++	}
++	
++	/*drain waterfraction, feed updated variables back into model*/
++	for(iv=0;iv<numvertices;iv++){
++		if(reCast<bool,IssmDouble>(dt))
++			waterfractions[iv]-=deltawaterfractions[iv]*dt;
++		else
++			waterfractions[iv]-=deltawaterfractions[iv];
++		element->ThermalToEnthalpy(&enthalpies[iv], temperatures[iv], waterfractions[iv], pressures[iv]);
++	}
++	element->AddInput(EnthalpyEnum,enthalpies,P1Enum);
++  	element->AddInput(WaterfractionEnum,waterfractions,P1Enum);
+ 
+-	if(dt==0. && !converged) enthalpy_enum=EnthalpyPicardEnum;
+-	else enthalpy_enum=EnthalpyEnum;
+-
+-	IssmDouble latentheat = element->GetMaterialParameter(MaterialsLatentheatEnum);
+-	IssmDouble rho_ice    = element->GetMaterialParameter(MaterialsRhoIceEnum);
+-	IssmDouble rho_water  = element->GetMaterialParameter(MaterialsRhoFreshwaterEnum);
+-	IssmDouble beta		 = element->GetMaterialParameter(MaterialsBetaEnum);
+-	IssmDouble kappa		 = EnthalpyDiffusionParameterVolume(element,enthalpy_enum);     _assert_(kappa>=0.);
+-	IssmDouble kappa_mix;
+-
+-	/*retrieve inputs*/
+-	Input* enthalpy_input         = element->GetInput(enthalpy_enum);                    _assert_(enthalpy_input);
+-	Input* pressure_input			= element->GetInput(PressureEnum);							 _assert_(pressure_input);
+-	Input* geothermalflux_input   = element->GetInput(BasalforcingsGeothermalfluxEnum); _assert_(geothermalflux_input);
+-	Input* vx_input               = element->GetInput(VxEnum);                          _assert_(vx_input);
+-	Input* vy_input               = element->GetInput(VyEnum);                          _assert_(vy_input);
+-	Input* vz_input               = element->GetInput(VzEnum);                          _assert_(vz_input);
+-
+-	/*Build friction element, needed later: */
+-	Friction* friction=new Friction(element,dim);
+-
+-	/******** MELTING RATES  ************************************//*{{{*/
+-	element->NormalBase(&normal_base[0],xyz_list_base);
++	/*return meltwater column equivalent to drained water*/
+ 	element->VerticalSegmentIndices(&pairindices,&numsegments);
+-	IssmDouble* meltingrate_enthalpy = xNew<IssmDouble>(numsegments);
+-	IssmDouble* heating = xNew<IssmDouble>(numsegments);	
+-
+-	numvertices=element->GetNumberOfVertices();
+-	IssmDouble* enthalpies = xNew<IssmDouble>(numvertices);
+-	IssmDouble* pressures = xNew<IssmDouble>(numvertices);
+-	IssmDouble* watercolumns = xNew<IssmDouble>(numvertices);
+-	IssmDouble* basalmeltingrates = xNew<IssmDouble>(numvertices);
+-	element->GetInputListOnVertices(enthalpies,enthalpy_enum);
+-	element->GetInputListOnVertices(pressures,PressureEnum);
+-	element->GetInputListOnVertices(watercolumns,WatercolumnEnum);
+-	element->GetInputListOnVertices(basalmeltingrates,BasalforcingsGroundediceMeltingRateEnum);
+-
+-	Gauss* gauss=element->NewGauss();
+ 	for(is=0;is<numsegments;is++){
+ 		vertexdown = pairindices[is*2+0];
+ 		vertexup   = pairindices[is*2+1];
+-		gauss->GaussVertex(vertexdown);
+-
+-		state=GetThermalBasalCondition(element, enthalpies[vertexdown], enthalpies[vertexup], pressures[vertexdown], pressures[vertexup], watercolumns[vertexdown], basalmeltingrates[vertexdown]);
+-		switch (state) {
+-			case 0:
+-				// cold, dry base: apply basal surface forcing
+-				for(i=0;i<3;i++) vec_heatflux[i]=0.;
+-				break;
+-			case 1: case 2: case 3: 
+-				// case 1 : cold, wet base: keep at pressure melting point 
+-				// case 2: temperate, thin refreezing base: release spc
+-				// case 3: temperate, thin melting base: set spc
+-				enthalpy_input->GetInputDerivativeValue(&d1enthalpy[0],xyz_list,gauss);
+-				for(i=0;i<3;i++) vec_heatflux[i]=-kappa*d1enthalpy[i];
+-				break;
+-			case 4:
+-				// temperate, thick melting base: set grad H*n=0
+-				kappa_mix=GetWetIceConductivity(element, enthalpies[vertexdown], pressures[vertexdown]);
+-				pressure_input->GetInputDerivativeValue(&d1pressure[0],xyz_list,gauss);
+-				for(i=0;i<3;i++) vec_heatflux[i]=kappa_mix*beta*d1pressure[i];
+-				break;
+-			default:
+-				_printf0_("	unknown thermal basal state found!");
+-		}
+-		if(state==0) meltingrate_enthalpy[is]=0.;
+-		else{
+-			/*heat flux along normal*/
+-			heatflux=0.;
+-			for(i=0;i<3;i++) heatflux+=(vec_heatflux[i])*normal_base[i];
+-
+-			/*basal friction*/
+-			friction->GetAlpha2(&alpha2,gauss);
+-			vx_input->GetInputValue(&vx,gauss);		vy_input->GetInputValue(&vy,gauss);		vz_input->GetInputValue(&vz,gauss);
+-			basalfriction=alpha2*(vx*vx + vy*vy + vz*vz);
+-			geothermalflux_input->GetInputValue(&geothermalflux,gauss);
+-			/* -Mb= Fb-(q-q_geo)/((1-w)*L*rho), and (1-w)*rho=rho_ice, cf Aschwanden 2012, eqs.1, 2, 66*/
+-			heating[is]=(heatflux+basalfriction+geothermalflux);
+-			meltingrate_enthalpy[is]=heating[is]/(latentheat*rho_ice); // m/s water equivalent
+-		}
+-	}/*}}}*/
+-
+-	/******** UPDATE MELTINGRATES AND WATERCOLUMN **************//*{{{*/
+-	for(is=0;is<numsegments;is++){
+-		vertexdown = pairindices[is*2+0];
+-		vertexup   = pairindices[is*2+1];
+-		if(dt!=0.){
+-			if(watercolumns[vertexdown]+meltingrate_enthalpy[is]*dt<0.){	// prevent too much freeze on			
+-				lambda = -watercolumns[vertexdown]/(dt*meltingrate_enthalpy[is]); _assert_(lambda>=0.); _assert_(lambda<1.);
+-				watercolumns[vertexdown]=0.;
+-				basalmeltingrates[vertexdown]=lambda*meltingrate_enthalpy[is]; // restrict freeze on only to size of watercolumn
+-				enthalpies[vertexdown]+=(1.-lambda)*dt/yts*meltingrate_enthalpy[is]*latentheat*rho_ice; // use rest of energy to cool down base: dE=L*m, m=(1-lambda)*meltingrate*rho_ice
+-			}
+-			else{
+-				basalmeltingrates[vertexdown]=meltingrate_enthalpy[is];
+-				watercolumns[vertexdown]+=dt*meltingrate_enthalpy[is]; 
+-			}
+-		}
+-		else{
+-			basalmeltingrates[vertexdown]=meltingrate_enthalpy[is];
+-			if(watercolumns[vertexdown]+meltingrate_enthalpy[is]<0.)
+-				watercolumns[vertexdown]=0.;
+-			else
+-				watercolumns[vertexdown]+=meltingrate_enthalpy[is];
+-		}	
+-		basalmeltingrates[vertexdown]*=rho_water/rho_ice; // convert meltingrate from water to ice equivalent
+-		_assert_(watercolumns[vertexdown]>=0.);
+-	}/*}}}*/
+-
+-	/*feed updated variables back into model*/
+-	if(dt!=0.){
+-		element->AddInput(enthalpy_enum,enthalpies,P1Enum); //TODO: distinguis for steadystate and transient run
+-		element->AddInput(WatercolumnEnum,watercolumns,P1Enum);
++		height_element=fabs(xyz_list[vertexup*3+2]-xyz_list[vertexdown*3+2]);
++		pdrainrate_element[is]=(deltawaterfractions[vertexdown]+deltawaterfractions[vertexup])/2.*height_element; // return water equivalent of drainage
++		_assert_(pdrainrate_element[is]>=0.);
+ 	}
+-	element->AddInput(BasalforcingsGroundediceMeltingRateEnum,basalmeltingrates,P1Enum);
+ 
+ 	/*Clean up and return*/
+-	delete gauss;
+-	delete friction;
+ 	xDelete<int>(pairindices);
++	xDelete<IssmDouble>(xyz_list);
+ 	xDelete<IssmDouble>(enthalpies);
+ 	xDelete<IssmDouble>(pressures);
+-	xDelete<IssmDouble>(watercolumns);
+-	xDelete<IssmDouble>(basalmeltingrates);
+-	xDelete<IssmDouble>(meltingrate_enthalpy);
+-	xDelete<IssmDouble>(heating);
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(xyz_list_base);
++	xDelete<IssmDouble>(temperatures);
++	xDelete<IssmDouble>(waterfractions);
++	xDelete<IssmDouble>(deltawaterfractions);
+ }/*}}}*/
+-void EnthalpyAnalysis::DrainWaterfraction(FemModel* femmodel){/*{{{*/
+-	/*Drain excess water fraction in ice column: */
+-	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-		DrainWaterfractionIcecolumn(element);
+-	}
+-}/*}}}*/
+-void EnthalpyAnalysis::DrainWaterfractionIcecolumn(Element* element){/*{{{*/
++void           EnthalpyAnalysis::DrainWaterfractionIcecolumn(Element* element){/*{{{*/
+ 
+ 	/* Check if ice in element */
+ 	if(!element->IsIceInElement()) return;
+@@ -1160,144 +1064,133 @@
+ 	xDelete<IssmDouble>(drainrate_element);
+ 	xDelete<IssmDouble>(watercolumn);
+ }/*}}}*/
+-void EnthalpyAnalysis::DrainWaterfraction(Element* element, IssmDouble* pdrainrate_element){/*{{{*/
++IssmDouble     EnthalpyAnalysis::EnthalpyDiffusionParameter(Element* element,IssmDouble enthalpy,IssmDouble pressure){/*{{{*/
+ 
+-	/* Check if ice in element */
+-	if(!element->IsIceInElement()) return;
++	IssmDouble heatcapacity             = element->GetMaterialParameter(MaterialsHeatcapacityEnum);
++	IssmDouble temperateiceconductivity = element->GetMaterialParameter(MaterialsTemperateiceconductivityEnum);
++	IssmDouble thermalconductivity      = element->GetMaterialParameter(MaterialsThermalconductivityEnum);
+ 
+-	/*Intermediaries*/
+-	int iv,is,vertexdown,vertexup,numsegments;	
+-	IssmDouble dt, height_element;
+-	IssmDouble rho_water, rho_ice;
+-	int numvertices = element->GetNumberOfVertices();
++	if(enthalpy < PureIceEnthalpy(element,pressure)){
++		return thermalconductivity/heatcapacity;
++	}
++	else{
++		return temperateiceconductivity/heatcapacity;
++	}
++}/*}}}*/
++IssmDouble     EnthalpyAnalysis::EnthalpyDiffusionParameterVolume(Element* element,int enthalpy_enum){/*{{{*/
+ 
+-	IssmDouble* xyz_list = NULL;
+-	IssmDouble* enthalpies = xNew<IssmDouble>(numvertices);
+-	IssmDouble* pressures = xNew<IssmDouble>(numvertices);
+-	IssmDouble* temperatures = xNew<IssmDouble>(numvertices);
+-	IssmDouble* waterfractions = xNew<IssmDouble>(numvertices);
+-	IssmDouble* deltawaterfractions = xNew<IssmDouble>(numvertices);
+-	int        *pairindices   = NULL;
+-	
+-	rho_ice=element->GetMaterialParameter(MaterialsRhoIceEnum);
+-	rho_water=element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
++	int         iv;
++	IssmDouble  lambda;                   /* fraction of cold ice    */
++	IssmDouble  kappa,kappa_c,kappa_t; /* enthalpy conductivities */
++	IssmDouble  Hc,Ht;
+ 
+-	element->GetVerticesCoordinates(&xyz_list);
+-	element->GetInputListOnVertices(enthalpies,EnthalpyEnum);
++	/*Get pressures and enthalpies on vertices*/
++	int         numvertices = element->GetNumberOfVertices();
++	IssmDouble* pressures   = xNew<IssmDouble>(numvertices);
++	IssmDouble* enthalpies  = xNew<IssmDouble>(numvertices);
++	IssmDouble* PIE         = xNew<IssmDouble>(numvertices);
++	IssmDouble* dHpmp       = xNew<IssmDouble>(numvertices);
+ 	element->GetInputListOnVertices(pressures,PressureEnum);
++	element->GetInputListOnVertices(enthalpies,enthalpy_enum);
++	for(iv=0;iv<numvertices;iv++){
++		PIE[iv]   = PureIceEnthalpy(element,pressures[iv]);
++		dHpmp[iv] = enthalpies[iv]-PIE[iv];
++	}
+ 
+-	element->FindParam(&dt,TimesteppingTimeStepEnum);
+-	for(iv=0;iv<numvertices;iv++){ 
+-		element->EnthalpyToThermal(&temperatures[iv],&waterfractions[iv], enthalpies[iv],pressures[iv]); 
+-		deltawaterfractions[iv]=DrainageFunctionWaterfraction(waterfractions[iv], dt);
++	bool allequalsign = true;
++	if(dHpmp[0]<0.){
++		for(iv=1; iv<numvertices;iv++) allequalsign=(allequalsign && (dHpmp[iv]<0.));
+ 	}
+-	
+-	/*drain waterfraction, feed updated variables back into model*/
+-	for(iv=0;iv<numvertices;iv++){
+-		if(reCast<bool,IssmDouble>(dt))
+-			waterfractions[iv]-=deltawaterfractions[iv]*dt;
+-		else
+-			waterfractions[iv]-=deltawaterfractions[iv];
+-		element->ThermalToEnthalpy(&enthalpies[iv], temperatures[iv], waterfractions[iv], pressures[iv]);
++	else{
++		for(iv=1; iv<numvertices;iv++) allequalsign=(allequalsign && (dHpmp[iv]>=0.));
+ 	}
+-	element->AddInput(EnthalpyEnum,enthalpies,P1Enum);
+-  	element->AddInput(WaterfractionEnum,waterfractions,P1Enum);
+ 
+-	/*return meltwater column equivalent to drained water*/
+-	element->VerticalSegmentIndices(&pairindices,&numsegments);
+-	for(is=0;is<numsegments;is++){
+-		vertexdown = pairindices[is*2+0];
+-		vertexup   = pairindices[is*2+1];
+-		height_element=fabs(xyz_list[vertexup*3+2]-xyz_list[vertexdown*3+2]);
+-		pdrainrate_element[is]=(deltawaterfractions[vertexdown]+deltawaterfractions[vertexup])/2.*height_element; // return water equivalent of drainage
+-		_assert_(pdrainrate_element[is]>=0.);
++	if(allequalsign){
++		kappa = EnthalpyDiffusionParameter(element,enthalpies[0],pressures[0]);
+ 	}
++	else{
++		/* return harmonic mean of thermal conductivities, weighted by fraction of cold/temperate ice,
++			cf Patankar 1980, pp44 */
++		kappa_c = EnthalpyDiffusionParameter(element,PureIceEnthalpy(element,0.)-1.,0.);
++		kappa_t = EnthalpyDiffusionParameter(element,PureIceEnthalpy(element,0.)+1.,0.);
++		Hc=0.; Ht=0.;
++		for(iv=0; iv<numvertices;iv++){
++			if(enthalpies[iv]<PIE[iv])
++			 Hc+=(PIE[iv]-enthalpies[iv]);
++			else
++			 Ht+=(enthalpies[iv]-PIE[iv]);
++		}
++		_assert_((Hc+Ht)>0.);
++		lambda = Hc/(Hc+Ht);
++		kappa  = kappa_c*kappa_t/(lambda*kappa_t+(1.-lambda)*kappa_c); // ==(lambda/kappa_c + (1.-lambda)/kappa_t)^-1
++	}	
+ 
+ 	/*Clean up and return*/
+-	xDelete<int>(pairindices);
+-	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(PIE);
++	xDelete<IssmDouble>(dHpmp);
++	xDelete<IssmDouble>(pressures);
+ 	xDelete<IssmDouble>(enthalpies);
+-	xDelete<IssmDouble>(pressures);
+-	xDelete<IssmDouble>(temperatures);
+-	xDelete<IssmDouble>(waterfractions);
+-	xDelete<IssmDouble>(deltawaterfractions);
++	return kappa;
+ }/*}}}*/
+-void EnthalpyAnalysis::UpdateBasalConstraints(FemModel* femmodel){/*{{{*/
++void           EnthalpyAnalysis::GetBAdvec(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1. 
++	 * For node i, Bi' can be expressed in the actual coordinate system
++	 * by: 
++	 *       Bi_advec =[ h ]
++	 *                 [ h ]
++	 *                 [ h ]
++	 * where h is the interpolation function for node i.
++	 *
++	 * We assume B has been allocated already, of size: 3x(NDOF1*NUMNODESP1)
++	 */
+ 
+-	/*Update basal dirichlet BCs for enthalpy: */
+-	Vector<IssmDouble>* spc           = NULL;
+-	IssmDouble*         serial_spc    = NULL;
++	/*Fetch number of nodes for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
+ 
+-	spc=new Vector<IssmDouble>(femmodel->nodes->NumberOfNodes(EnthalpyAnalysisEnum));
+-	/*First create a vector to figure out what elements should be constrained*/
+-	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-		GetBasalConstraints(spc,element);
+-	}
++	/*Get nodal functions*/
++	IssmDouble* basis=xNew<IssmDouble>(numnodes);
++	element->NodalFunctions(basis,gauss);
+ 
+-	/*Assemble and serialize*/
+-	spc->Assemble();
+-	serial_spc=spc->ToMPISerial();
+-	delete spc;
+-
+-	/*Then update basal constraints nodes accordingly*/
+-	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-		ApplyBasalConstraints(serial_spc,element);
++	/*Build B: */
++	for(int i=0;i<numnodes;i++){
++		B[numnodes*0+i] = basis[i];
++		B[numnodes*1+i] = basis[i];
++		B[numnodes*2+i] = basis[i];
+ 	}
+ 
+-	femmodel->UpdateConstraintsx();
+-
+-	/*Delete*/
+-	xDelete<IssmDouble>(serial_spc);
++	/*Clean-up*/
++	xDelete<IssmDouble>(basis);
+ }/*}}}*/
+-void EnthalpyAnalysis::ApplyBasalConstraints(IssmDouble* serial_spc,Element* element){/*{{{*/
++void           EnthalpyAnalysis::GetBAdvecprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1. 
++	 * For node i, Bi' can be expressed in the actual coordinate system
++	 * by: 
++	 *       Biprime_advec=[ dh/dx ]
++	 *                     [ dh/dy ]
++	 *                     [ dh/dz ]
++	 * where h is the interpolation function for node i.
++	 *
++	 * We assume B has been allocated already, of size: 3x(NDOF1*numnodes)
++	 */
+ 
+-	/* Check if ice in element */
+-	if(!element->IsIceInElement()) return;
++	/*Fetch number of nodes for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
+ 
+-	/* Only update Constraints at the base of grounded ice*/
+-	if(!(element->IsOnBase()) || element->IsFloating()) return;
++	/*Get nodal functions derivatives*/
++	IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
++	element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+ 
+-	/*Intermediary*/
+-	bool        isdynamicbasalspc;
+-	int         numindices;
+-	int        *indices = NULL;
+-	Node*       node = NULL;
+-	IssmDouble	pressure;
+-
+-	/*Check wether dynamic basal boundary conditions are activated */
+-	element->FindParam(&isdynamicbasalspc,ThermalIsdynamicbasalspcEnum);
+-	if(!isdynamicbasalspc) return;
+-
+-	/*Get parameters and inputs: */
+-	Input* pressure_input		 = element->GetInput(PressureEnum);							 _assert_(pressure_input);
+-
+-	/*Fetch indices of basal & surface nodes for this finite element*/
+-	Penta *penta =  (Penta *) element; // TODO: add Basal-/SurfaceNodeIndices to element.h, and change this to Element*
+-	penta->BasalNodeIndices(&numindices,&indices,element->GetElementType());
+-
+-	GaussPenta* gauss=new GaussPenta();
+-	for(int i=0;i<numindices;i++){
+-		gauss->GaussNode(element->GetElementType(),indices[i]);
+-
+-		pressure_input->GetInputValue(&pressure,gauss);
+-
+-		/*apply or release spc*/
+-		node=element->GetNode(indices[i]);
+-		if(serial_spc[node->Sid()]==1.){
+-			pressure_input->GetInputValue(&pressure, gauss);
+-			node->ApplyConstraint(0,PureIceEnthalpy(element,pressure));
+-		}
+-		else			
+-			node->DofInFSet(0);
++	/*Build B: */
++	for(int i=0;i<numnodes;i++){
++		B[numnodes*0+i] = dbasis[0*numnodes+i];
++		B[numnodes*1+i] = dbasis[1*numnodes+i];
++		B[numnodes*2+i] = dbasis[2*numnodes+i];
+ 	}
+ 
+-	/*Free ressources:*/
+-	xDelete<int>(indices);
+-	delete gauss;
++	/*Clean-up*/
++	xDelete<IssmDouble>(dbasis);
+ }/*}}}*/
+-void EnthalpyAnalysis::GetBasalConstraints(Vector<IssmDouble>* vec_spc,Element* element){/*{{{*/
++void           EnthalpyAnalysis::GetBasalConstraints(Vector<IssmDouble>* vec_spc,Element* element){/*{{{*/
+ 
+ 	/* Check if ice in element */
+ 	if(!element->IsIceInElement()) return;
+@@ -1321,7 +1214,7 @@
+ 		GetBasalConstraintsTransient(vec_spc,element);
+ 	}
+ }/*}}}*/
+-void EnthalpyAnalysis::GetBasalConstraintsTransient(Vector<IssmDouble>* vec_spc,Element* element){/*{{{*/
++void           EnthalpyAnalysis::GetBasalConstraintsSteadystate(Vector<IssmDouble>* vec_spc,Element* element){/*{{{*/
+ 
+ 	/* Check if ice in element */
+ 	if(!element->IsIceInElement()) return;
+@@ -1335,7 +1228,7 @@
+ 	IssmDouble	enthalpy, enthalpyup, pressure, pressureup, watercolumn, meltingrate;
+ 
+ 	/*Get parameters and inputs: */
+-	Input* enthalpy_input       = element->GetInput(EnthalpyEnum);                    _assert_(enthalpy_input); //TODO: check EnthalpyPicard?
++	Input* enthalpy_input		 = element->GetInput(EnthalpyPicardEnum);					 _assert_(enthalpy_input);
+ 	Input* pressure_input		 = element->GetInput(PressureEnum);							 _assert_(pressure_input);
+ 	Input* watercolumn_input	 = element->GetInput(WatercolumnEnum);							 _assert_(watercolumn_input);
+ 	Input* meltingrate_input	 = element->GetInput(BasalforcingsGroundediceMeltingRateEnum);							 _assert_(meltingrate_input);
+@@ -1347,11 +1240,10 @@
+ 
+ 	GaussPenta* gauss=new GaussPenta();
+ 	GaussPenta* gaussup=new GaussPenta();
+-
+ 	for(int i=0;i<numindices;i++){
+ 		gauss->GaussNode(element->GetElementType(),indices[i]);
+ 		gaussup->GaussNode(element->GetElementType(),indicesup[i]);
+-		
++
+ 		enthalpy_input->GetInputValue(&enthalpy,gauss);
+ 		enthalpy_input->GetInputValue(&enthalpyup,gaussup);
+ 		pressure_input->GetInputValue(&pressure,gauss);
+@@ -1360,7 +1252,6 @@
+ 		meltingrate_input->GetInputValue(&meltingrate,gauss);
+ 
+ 		state=GetThermalBasalCondition(element, enthalpy, enthalpyup, pressure, pressureup, watercolumn, meltingrate);
+-
+ 		switch (state) {
+ 			case 0:
+ 				// cold, dry base: apply basal surface forcing
+@@ -1379,13 +1270,12 @@
+ 				vec_spc->SetValue(element->nodes[i]->Sid(),1.,INS_VAL);
+ 				break;
+ 			case 4:
+-				// temperate, thick melting base: set grad H*n=0
+-				vec_spc->SetValue(element->nodes[i]->Sid(),0.,INS_VAL);
++				// temperate, thick melting base: s
++				vec_spc->SetValue(element->nodes[i]->Sid(),1.,INS_VAL);
+ 				break;
+ 			default:
+ 				_printf0_("	unknown thermal basal state found!");
+ 		}
+-
+ 	}
+ 
+ 	/*Free ressources:*/
+@@ -1394,7 +1284,7 @@
+ 	delete gauss;
+ 	delete gaussup;
+ }/*}}}*/
+-void EnthalpyAnalysis::GetBasalConstraintsSteadystate(Vector<IssmDouble>* vec_spc,Element* element){/*{{{*/
++void           EnthalpyAnalysis::GetBasalConstraintsTransient(Vector<IssmDouble>* vec_spc,Element* element){/*{{{*/
+ 
+ 	/* Check if ice in element */
+ 	if(!element->IsIceInElement()) return;
+@@ -1408,7 +1298,7 @@
+ 	IssmDouble	enthalpy, enthalpyup, pressure, pressureup, watercolumn, meltingrate;
+ 
+ 	/*Get parameters and inputs: */
+-	Input* enthalpy_input		 = element->GetInput(EnthalpyPicardEnum);					 _assert_(enthalpy_input);
++	Input* enthalpy_input       = element->GetInput(EnthalpyEnum);                    _assert_(enthalpy_input); //TODO: check EnthalpyPicard?
+ 	Input* pressure_input		 = element->GetInput(PressureEnum);							 _assert_(pressure_input);
+ 	Input* watercolumn_input	 = element->GetInput(WatercolumnEnum);							 _assert_(watercolumn_input);
+ 	Input* meltingrate_input	 = element->GetInput(BasalforcingsGroundediceMeltingRateEnum);							 _assert_(meltingrate_input);
+@@ -1420,10 +1310,11 @@
+ 
+ 	GaussPenta* gauss=new GaussPenta();
+ 	GaussPenta* gaussup=new GaussPenta();
++
+ 	for(int i=0;i<numindices;i++){
+ 		gauss->GaussNode(element->GetElementType(),indices[i]);
+ 		gaussup->GaussNode(element->GetElementType(),indicesup[i]);
+-
++		
+ 		enthalpy_input->GetInputValue(&enthalpy,gauss);
+ 		enthalpy_input->GetInputValue(&enthalpyup,gaussup);
+ 		pressure_input->GetInputValue(&pressure,gauss);
+@@ -1432,6 +1323,7 @@
+ 		meltingrate_input->GetInputValue(&meltingrate,gauss);
+ 
+ 		state=GetThermalBasalCondition(element, enthalpy, enthalpyup, pressure, pressureup, watercolumn, meltingrate);
++
+ 		switch (state) {
+ 			case 0:
+ 				// cold, dry base: apply basal surface forcing
+@@ -1450,12 +1342,13 @@
+ 				vec_spc->SetValue(element->nodes[i]->Sid(),1.,INS_VAL);
+ 				break;
+ 			case 4:
+-				// temperate, thick melting base: s
+-				vec_spc->SetValue(element->nodes[i]->Sid(),1.,INS_VAL);
++				// temperate, thick melting base: set grad H*n=0
++				vec_spc->SetValue(element->nodes[i]->Sid(),0.,INS_VAL);
+ 				break;
+ 			default:
+ 				_printf0_("	unknown thermal basal state found!");
+ 		}
++
+ 	}
+ 
+ 	/*Free ressources:*/
+@@ -1464,8 +1357,40 @@
+ 	delete gauss;
+ 	delete gaussup;
+ }/*}}}*/
+-int EnthalpyAnalysis::GetThermalBasalCondition(Element* element, IssmDouble enthalpy, IssmDouble enthalpyup, IssmDouble pressure, IssmDouble pressureup, IssmDouble watercolumn, IssmDouble meltingrate){/*{{{*/
++void           EnthalpyAnalysis::GetBConduct(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
++	/*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1. 
++	 * For node i, Bi' can be expressed in the actual coordinate system
++	 * by: 
++	 *       Bi_conduct=[ dh/dx ]
++	 *                  [ dh/dy ]
++	 *                  [ dh/dz ]
++	 * where h is the interpolation function for node i.
++	 *
++	 * We assume B has been allocated already, of size: 3x(NDOF1*numnodes)
++	 */
+ 
++	/*Fetch number of nodes for this finite element*/
++	int numnodes = element->GetNumberOfNodes();
++
++	/*Get nodal functions derivatives*/
++	IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
++	element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
++
++	/*Build B: */
++	for(int i=0;i<numnodes;i++){
++		B[numnodes*0+i] = dbasis[0*numnodes+i];
++		B[numnodes*1+i] = dbasis[1*numnodes+i];
++		B[numnodes*2+i] = dbasis[2*numnodes+i];
++	}
++
++	/*Clean-up*/
++	xDelete<IssmDouble>(dbasis);
++}/*}}}*/
++void           EnthalpyAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
++	element->GetSolutionFromInputsOneDof(solution,EnthalpyEnum);
++}/*}}}*/
++int            EnthalpyAnalysis::GetThermalBasalCondition(Element* element, IssmDouble enthalpy, IssmDouble enthalpyup, IssmDouble pressure, IssmDouble pressureup, IssmDouble watercolumn, IssmDouble meltingrate){/*{{{*/
++
+ 	/* Check if ice in element */
+ 	if(!element->IsIceInElement()) return -1;
+ 
+@@ -1494,7 +1419,7 @@
+ 	_assert_(state>=0);
+ 	return state;
+ }/*}}}*/
+-IssmDouble EnthalpyAnalysis::GetWetIceConductivity(Element* element, IssmDouble enthalpy, IssmDouble pressure){/*{{{*/
++IssmDouble     EnthalpyAnalysis::GetWetIceConductivity(Element* element, IssmDouble enthalpy, IssmDouble pressure){/*{{{*/
+ 
+ 	IssmDouble temperature, waterfraction;
+ 	IssmDouble kappa_w = 0.6; // thermal conductivity of water (in W/m/K)
+@@ -1503,87 +1428,158 @@
+ 
+ 	return (1.-waterfraction)*kappa_i + waterfraction*kappa_w;
+ }/*}}}*/
++void           EnthalpyAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
++	_error_("Not implemented yet");
++}/*}}}*/
++void           EnthalpyAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+-/*Intermediaries*/
+-IssmDouble EnthalpyAnalysis::EnthalpyDiffusionParameter(Element* element,IssmDouble enthalpy,IssmDouble pressure){/*{{{*/
++	bool        converged;
++	int         i,rheology_law;
++	IssmDouble  B_average,s_average,T_average=0.,P_average=0.;
++	int        *doflist   = NULL;
++	IssmDouble *xyz_list  = NULL;
+ 
+-	IssmDouble heatcapacity             = element->GetMaterialParameter(MaterialsHeatcapacityEnum);
+-	IssmDouble temperateiceconductivity = element->GetMaterialParameter(MaterialsTemperateiceconductivityEnum);
+-	IssmDouble thermalconductivity      = element->GetMaterialParameter(MaterialsThermalconductivityEnum);
++	/*Fetch number of nodes and dof for this finite element*/
++	int numnodes    = element->GetNumberOfNodes();
+ 
+-	if(enthalpy < PureIceEnthalpy(element,pressure)){
+-		return thermalconductivity/heatcapacity;
+-	}
+-	else{
+-		return temperateiceconductivity/heatcapacity;
+-	}
+-}/*}}}*/
+-IssmDouble EnthalpyAnalysis::EnthalpyDiffusionParameterVolume(Element* element,int enthalpy_enum){/*{{{*/
++	/*Fetch dof list and allocate solution vector*/
++	element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
++	IssmDouble* values        = xNew<IssmDouble>(numnodes);
++	IssmDouble* pressure      = xNew<IssmDouble>(numnodes);
++	IssmDouble* surface       = xNew<IssmDouble>(numnodes);
++	IssmDouble* B             = xNew<IssmDouble>(numnodes);
++	IssmDouble* temperature   = xNew<IssmDouble>(numnodes);
++	IssmDouble* waterfraction = xNew<IssmDouble>(numnodes);
+ 
+-	int         iv;
+-	IssmDouble  lambda;                   /* fraction of cold ice    */
+-	IssmDouble  kappa,kappa_c,kappa_t; /* enthalpy conductivities */
+-	IssmDouble  Hc,Ht;
++	/*Use the dof list to index into the solution vector: */
++	for(i=0;i<numnodes;i++){
++		values[i]=solution[doflist[i]];
+ 
+-	/*Get pressures and enthalpies on vertices*/
+-	int         numvertices = element->GetNumberOfVertices();
+-	IssmDouble* pressures   = xNew<IssmDouble>(numvertices);
+-	IssmDouble* enthalpies  = xNew<IssmDouble>(numvertices);
+-	IssmDouble* PIE         = xNew<IssmDouble>(numvertices);
+-	IssmDouble* dHpmp       = xNew<IssmDouble>(numvertices);
+-	element->GetInputListOnVertices(pressures,PressureEnum);
+-	element->GetInputListOnVertices(enthalpies,enthalpy_enum);
+-	for(iv=0;iv<numvertices;iv++){
+-		PIE[iv]   = PureIceEnthalpy(element,pressures[iv]);
+-		dHpmp[iv] = enthalpies[iv]-PIE[iv];
++		/*Check solution*/
++		if(xIsNan<IssmDouble>(values[i])) _error_("NaN found in solution vector");
+ 	}
+ 
+-	bool allequalsign = true;
+-	if(dHpmp[0]<0.){
+-		for(iv=1; iv<numvertices;iv++) allequalsign=(allequalsign && (dHpmp[iv]<0.));
++	/*Get all inputs and parameters*/
++	element->GetInputValue(&converged,ConvergedEnum);
++	element->GetInputListOnNodes(&pressure[0],PressureEnum);
++	if(converged){
++		for(i=0;i<numnodes;i++){
++			element->EnthalpyToThermal(&temperature[i],&waterfraction[i],values[i],pressure[i]);
++			if(waterfraction[i]<0.) _error_("Negative water fraction found in solution vector");
++			//if(waterfraction[i]>1.) _error_("Water fraction >1 found in solution vector");
++		}
++		element->AddInput(EnthalpyEnum,values,element->GetElementType());
++		element->AddInput(WaterfractionEnum,waterfraction,element->GetElementType());
++		element->AddInput(TemperatureEnum,temperature,element->GetElementType());
++
++		/*Update Rheology only if converged (we must make sure that the temperature is below melting point
++		 * otherwise the rheology could be negative*/
++		element->FindParam(&rheology_law,MaterialsRheologyLawEnum);
++		element->GetInputListOnNodes(&surface[0],SurfaceEnum);
++		switch(rheology_law){
++			case NoneEnum:
++				/*Do nothing: B is not temperature dependent*/
++				break;
++			case CuffeyEnum:
++				for(i=0;i<numnodes;i++) B[i]=Cuffey(temperature[i]);
++				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
++				break;
++			case PatersonEnum:
++				for(i=0;i<numnodes;i++) B[i]=Paterson(temperature[i]);
++				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
++				break;
++			case ArrheniusEnum:
++				element->GetVerticesCoordinates(&xyz_list);
++				for(i=0;i<numnodes;i++) B[i]=Arrhenius(temperature[i],surface[i]-xyz_list[i*3+2],element->GetMaterialParameter(MaterialsRheologyNEnum));
++				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType());
++				break;
++			case LliboutryDuvalEnum:
++				for(i=0;i<numnodes;i++) B[i]=LliboutryDuval(values[i],pressure[i],element->GetMaterialParameter(MaterialsRheologyNEnum),element->GetMaterialParameter(MaterialsBetaEnum),element->GetMaterialParameter(ConstantsReferencetemperatureEnum),element->GetMaterialParameter(MaterialsHeatcapacityEnum),element->GetMaterialParameter(MaterialsLatentheatEnum)); 
++				element->AddInput(MaterialsRheologyBEnum,&B[0],element->GetElementType()); 
++				break; 
++			default: _error_("Rheology law " << EnumToStringx(rheology_law) << " not supported yet");
++		}
+ 	}
+ 	else{
+-		for(iv=1; iv<numvertices;iv++) allequalsign=(allequalsign && (dHpmp[iv]>=0.));
++		element->AddInput(EnthalpyPicardEnum,values,element->GetElementType());
+ 	}
+ 
+-	if(allequalsign){
+-		kappa = EnthalpyDiffusionParameter(element,enthalpies[0],pressures[0]);
+-	}
+-	else{
+-		/* return harmonic mean of thermal conductivities, weighted by fraction of cold/temperate ice,
+-			cf Patankar 1980, pp44 */
+-		kappa_c = EnthalpyDiffusionParameter(element,PureIceEnthalpy(element,0.)-1.,0.);
+-		kappa_t = EnthalpyDiffusionParameter(element,PureIceEnthalpy(element,0.)+1.,0.);
+-		Hc=0.; Ht=0.;
+-		for(iv=0; iv<numvertices;iv++){
+-			if(enthalpies[iv]<PIE[iv])
+-			 Hc+=(PIE[iv]-enthalpies[iv]);
+-			else
+-			 Ht+=(enthalpies[iv]-PIE[iv]);
+-		}
+-		_assert_((Hc+Ht)>0.);
+-		lambda = Hc/(Hc+Ht);
+-		kappa  = kappa_c*kappa_t/(lambda*kappa_t+(1.-lambda)*kappa_c); // ==(lambda/kappa_c + (1.-lambda)/kappa_t)^-1
+-	}	
++	/*Free ressources:*/
++	xDelete<IssmDouble>(values);
++	xDelete<IssmDouble>(pressure);
++	xDelete<IssmDouble>(surface);
++	xDelete<IssmDouble>(B);
++	xDelete<IssmDouble>(temperature);
++	xDelete<IssmDouble>(waterfraction);
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<int>(doflist);
++}/*}}}*/
++void           EnthalpyAnalysis::PostProcessing(FemModel* femmodel){/*{{{*/
+ 
+-	/*Clean up and return*/
+-	xDelete<IssmDouble>(PIE);
+-	xDelete<IssmDouble>(dHpmp);
+-	xDelete<IssmDouble>(pressures);
+-	xDelete<IssmDouble>(enthalpies);
+-	return kappa;
++	/*Intermediaries*/
++	bool computebasalmeltingrates=true;
++	bool drainicecolumn=true;
++	bool isdynamicbasalspc;
++	IssmDouble dt;
++
++	femmodel->parameters->FindParam(&isdynamicbasalspc,ThermalIsdynamicbasalspcEnum);
++	femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
++
++	//TODO: use dt to decide what to do
++	if(drainicecolumn)	DrainWaterfraction(femmodel);
++	if(computebasalmeltingrates)	ComputeBasalMeltingrate(femmodel);
++	if(isdynamicbasalspc)	UpdateBasalConstraints(femmodel);
++
+ }/*}}}*/
+-IssmDouble EnthalpyAnalysis::PureIceEnthalpy(Element* element,IssmDouble pressure){/*{{{*/
++IssmDouble     EnthalpyAnalysis::PureIceEnthalpy(Element* element,IssmDouble pressure){/*{{{*/
+ 
+ 	IssmDouble heatcapacity         = element->GetMaterialParameter(MaterialsHeatcapacityEnum);
+ 	IssmDouble referencetemperature = element->GetMaterialParameter(ConstantsReferencetemperatureEnum);
+ 
+ 	return heatcapacity*(TMeltingPoint(element,pressure)-referencetemperature);
+ }/*}}}*/
+-IssmDouble EnthalpyAnalysis::TMeltingPoint(Element* element,IssmDouble pressure){/*{{{*/
++IssmDouble     EnthalpyAnalysis::TMeltingPoint(Element* element,IssmDouble pressure){/*{{{*/
+ 
+ 	IssmDouble meltingpoint = element->GetMaterialParameter(MaterialsMeltingpointEnum);
+ 	IssmDouble beta         = element->GetMaterialParameter(MaterialsBetaEnum);
+ 
+ 	return meltingpoint-beta*pressure;
+ }/*}}}*/
++void           EnthalpyAnalysis::UpdateBasalConstraints(FemModel* femmodel){/*{{{*/
++
++	/*Update basal dirichlet BCs for enthalpy: */
++	Vector<IssmDouble>* spc           = NULL;
++	IssmDouble*         serial_spc    = NULL;
++
++	spc=new Vector<IssmDouble>(femmodel->nodes->NumberOfNodes(EnthalpyAnalysisEnum));
++	/*First create a vector to figure out what elements should be constrained*/
++	for(int i=0;i<femmodel->elements->Size();i++){
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		GetBasalConstraints(spc,element);
++	}
++
++	/*Assemble and serialize*/
++	spc->Assemble();
++	serial_spc=spc->ToMPISerial();
++	delete spc;
++
++	/*Then update basal constraints nodes accordingly*/
++	for(int i=0;i<femmodel->elements->Size();i++){
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		ApplyBasalConstraints(serial_spc,element);
++	}
++
++	femmodel->UpdateConstraintsx();
++
++	/*Delete*/
++	xDelete<IssmDouble>(serial_spc);
++}/*}}}*/
++void           EnthalpyAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
++
++	bool islevelset;
++	femmodel->parameters->FindParam(&islevelset,TransientIslevelsetEnum);
++	if(islevelset){
++		SetActiveNodesLSMx(femmodel);
++	}
++	return;
++}/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.h	(revision 18930)
+@@ -12,12 +12,12 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+@@ -25,14 +25,14 @@
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
+-		void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void SetDistanceOnIntersectedElements(FemModel* femmodel);
+-		void SetDistanceToZeroLevelsetElement(Vector<IssmDouble>* vec_signed_dist, Element* element);
+-		IssmDouble GetDistanceToStraight(IssmDouble* q, IssmDouble* s0, IssmDouble* s1);
++		void           GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		IssmDouble     GetDistanceToStraight(IssmDouble* q, IssmDouble* s0, IssmDouble* s1);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           SetDistanceOnIntersectedElements(FemModel* femmodel);
++		void           SetDistanceToZeroLevelsetElement(Vector<IssmDouble>* vec_signed_dist, Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
+Index: ../trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.h	(revision 18929)
++++ ../trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.h	(revision 18930)
+@@ -12,28 +12,28 @@
+ 
+ 	public:
+ 		/*Model processing*/
++		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
++		void CreateLoads(Loads* loads, IoModel* iomodel);
++		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+ 		int  DofsPerNode(int** doflist,int domaintype,int approximation);
++		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+ 		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+ 
+ 		/*Finite element Analysis*/
+ 		void           Core(FemModel* femmodel);
+ 		ElementVector* CreateDVector(Element* element);
+ 		ElementMatrix* CreateJacobianMatrix(Element* element);
+ 		ElementMatrix* CreateKMatrix(Element* element);
++		ElementMatrix* CreateKMatrixSurface(Element* element);
+ 		ElementMatrix* CreateKMatrixVolume(Element* element);
+-		ElementMatrix* CreateKMatrixSurface(Element* element);
+ 		ElementVector* CreatePVector(Element* element);
++		ElementVector* CreatePVectorBase(Element* element);
+ 		ElementVector* CreatePVectorVolume(Element* element);
+-		ElementVector* CreatePVectorBase(Element* element);
+-		void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetBprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void UpdateConstraints(FemModel* femmodel);
++		void           GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetBprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
++		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
++		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
++		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
++		void           UpdateConstraints(FemModel* femmodel);
+ };
+ #endif
Index: /issm/oecreview/Archive/18296-19100/ISSM-18930-18931.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18930-18931.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18930-18931.diff	(revision 19102)
@@ -0,0 +1,437 @@
+Index: ../trunk-jpl/src/c/classes/Constraints/SpcDynamic.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/SpcDynamic.h	(revision 18930)
++++ ../trunk-jpl/src/c/classes/Constraints/SpcDynamic.h	(revision 18931)
+@@ -29,21 +29,21 @@
+ 		~SpcDynamic();
+ 
+ 		/*Object virtual functions definitions*/
++		Object *copy();
++		void    DeepEcho();
+ 		void    Echo();
+-		void    DeepEcho();
+ 		int     Id();
+ 		int     ObjectEnum();
+-		Object *copy();
+ 
+ 		/*Constraint virtual functions definitions*/
++		void ActivatePenaltyMethod(void);
+ 		void ConstrainNode(Nodes* nodes,Parameters* parameters);
+ 		bool InAnalysis(int analysis_type);
+-		void ActivatePenaltyMethod(void);
+ 		void PenaltyDofAndValue(int* dof,IssmDouble* value,Nodes* nodes,Parameters* parameters){_error_("not implemented yet");};
+ 
+ 		/*SpcDynamic management*/
++		int        GetDof();
+ 		int        GetNodeId();
+-		int        GetDof();
+ 		IssmDouble GetValue();
+ 		void       SetDynamicConstraint(Nodes  *nodes,IssmDouble *yg_serial);
+ 
+Index: ../trunk-jpl/src/c/classes/Constraints/SpcTransient.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/SpcTransient.h	(revision 18930)
++++ ../trunk-jpl/src/c/classes/Constraints/SpcTransient.h	(revision 18931)
+@@ -30,21 +30,21 @@
+ 		~SpcTransient();
+ 		/*}}}*/
+ 		/*Object virtual functions definitions:{{{ */
+-		void  Echo();
+-		void  DeepEcho();
+-		int   Id(); 
+-		int   ObjectEnum();
+ 		Object* copy();
++		void    DeepEcho();
++		void    Echo();
++		int     Id(); 
++		int     ObjectEnum();
+ 		/*}}}*/
+ 		/*Constraint virtual functions definitions: {{{*/
+-		void ActivatePenaltyMethod(void);
++		void   ActivatePenaltyMethod(void);
+ 		void   ConstrainNode(Nodes* nodes,Parameters* parameters);
+ 		bool   InAnalysis(int analysis_type);
+ 		void   PenaltyDofAndValue(int* dof,IssmDouble* value,Nodes* nodes,Parameters* parameters);
+ 		/*}}}*/
+ 		/*SpcTransient management:{{{ */
+-		int    GetNodeId();
+-		int    GetDof();
++		int        GetDof();
++		int        GetNodeId();
+ 		IssmDouble GetValue();
+ 		/*}}}*/
+ 
+Index: ../trunk-jpl/src/c/classes/Constraints/Constraints.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/Constraints.cpp	(revision 18930)
++++ ../trunk-jpl/src/c/classes/Constraints/Constraints.cpp	(revision 18931)
+@@ -19,8 +19,19 @@
+ /*}}}*/
+ 
+ /*Numerics: */
+-int Constraints::NumberOfConstraints(void){/*{{{*/
++void Constraints::ActivatePenaltyMethod(int in_analysis){/*{{{*/
+ 
++	for(int i=0;i<this->Size();i++){
++		Constraint* constraint=(Constraint*)this->GetObjectByOffset(i);
++		if(constraint->InAnalysis(in_analysis)){
++			constraint->ActivatePenaltyMethod();
++		}
++	}
++
++}
++/*}}}*/
++int  Constraints::NumberOfConstraints(void){/*{{{*/
++
+ 	int localconstraints;
+ 	int numberofconstraints;
+ 
+@@ -34,14 +45,3 @@
+ 	return numberofconstraints;
+ }
+ /*}}}*/
+-void Constraints::ActivatePenaltyMethod(int in_analysis){/*{{{*/
+-
+-	for(int i=0;i<this->Size();i++){
+-		Constraint* constraint=(Constraint*)this->GetObjectByOffset(i);
+-		if(constraint->InAnalysis(in_analysis)){
+-			constraint->ActivatePenaltyMethod();
+-		}
+-	}
+-
+-}
+-/*}}}*/
+Index: ../trunk-jpl/src/c/classes/Constraints/Constraint.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/Constraint.h	(revision 18930)
++++ ../trunk-jpl/src/c/classes/Constraints/Constraint.h	(revision 18931)
+@@ -19,10 +19,10 @@
+ 	public: 
+ 
+ 		virtual      ~Constraint(){};
++		virtual void ActivatePenaltyMethod(void)=0;
+ 		virtual void ConstrainNode(Nodes* nodes,Parameters* parameters)=0;
++		virtual bool InAnalysis(int analysis_type)=0;
+ 		virtual void PenaltyDofAndValue(int* dof,IssmDouble* value,Nodes* nodes,Parameters* parameters)=0;
+-		virtual bool InAnalysis(int analysis_type)=0;
+-		virtual void ActivatePenaltyMethod(void)=0;
+ 
+ };
+ #endif
+Index: ../trunk-jpl/src/c/classes/Constraints/SpcDynamic.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/SpcDynamic.cpp	(revision 18930)
++++ ../trunk-jpl/src/c/classes/Constraints/SpcDynamic.cpp	(revision 18931)
+@@ -36,8 +36,28 @@
+ /*}}}*/
+ 
+ /*Object virtual functions definitions:*/
+-void SpcDynamic::Echo(void){/*{{{*/
++Object* SpcDynamic::copy() {/*{{{*/
+ 
++	SpcDynamic* spcdyn = new SpcDynamic(*this); 
++
++	spcdyn->sid=this->sid;
++	spcdyn->nodeid=this->nodeid;
++	spcdyn->dof=this->dof;
++	spcdyn->value=this->value;
++	spcdyn->analysis_type=this->analysis_type;
++	spcdyn->isset=this->isset;
++
++	return (Object*) spcdyn;
++}
++/*}}}*/
++void    SpcDynamic::DeepEcho(void){/*{{{*/
++
++	this->Echo();
++	return;
++}		
++/*}}}*/
++void    SpcDynamic::Echo(void){/*{{{*/
++
+ 	_printf_("SpcDynamic:\n");
+ 	_printf_("   sid: " << sid << "\n");
+ 	_printf_("   nodeid: " << nodeid << "\n");
+@@ -48,45 +68,20 @@
+ 	return;
+ }
+ /*}}}*/
+-void SpcDynamic::DeepEcho(void){/*{{{*/
+-
+-	this->Echo();
+-	return;
+-}		
++int     SpcDynamic::Id(void){ return sid; }/*{{{*/
+ /*}}}*/
+-int SpcDynamic::Id(void){ return sid; }/*{{{*/
+-/*}}}*/
+-int SpcDynamic::ObjectEnum(void){/*{{{*/
++int     SpcDynamic::ObjectEnum(void){/*{{{*/
+ 
+ 	return SpcDynamicEnum;
+ 
+ }
+ /*}}}*/
+-Object* SpcDynamic::copy() {/*{{{*/
+ 
+-	SpcDynamic* spcdyn = new SpcDynamic(*this); 
+-
+-	spcdyn->sid=this->sid;
+-	spcdyn->nodeid=this->nodeid;
+-	spcdyn->dof=this->dof;
+-	spcdyn->value=this->value;
+-	spcdyn->analysis_type=this->analysis_type;
+-	spcdyn->isset=this->isset;
+-
+-	return (Object*) spcdyn;
+-}
+-/*}}}*/
+-
+ /*Constraint virtual functions definitions: */
+ void SpcDynamic::ActivatePenaltyMethod(void){/*{{{*/
+ 	this->penalty = true;
+ }
+ /*}}}*/
+-bool SpcDynamic::InAnalysis(int in_analysis_type){/*{{{*/
+-	if (in_analysis_type==this->analysis_type) return true;
+-	else return false;
+-}
+-/*}}}*/
+ void SpcDynamic::ConstrainNode(Nodes* nodes,Parameters* parameters){/*{{{*/
+ 
+ 	Node* node=NULL;
+@@ -102,13 +97,18 @@
+ 	}
+ }
+ /*}}}*/
++bool SpcDynamic::InAnalysis(int in_analysis_type){/*{{{*/
++	if (in_analysis_type==this->analysis_type) return true;
++	else return false;
++}
++/*}}}*/
+ 
+ /*SpcDynamic functions*/
+-int SpcDynamic::GetDof(){/*{{{*/
++int        SpcDynamic::GetDof(){/*{{{*/
+ 	return dof;
+ }
+ /*}}}*/
+-int   SpcDynamic::GetNodeId(){/*{{{*/
++int        SpcDynamic::GetNodeId(){/*{{{*/
+ 
+ 	return nodeid;
+ }
+@@ -119,7 +119,7 @@
+ 	return value;
+ }
+ /*}}}*/
+-void SpcDynamic::SetDynamicConstraint(Nodes* nodes,IssmDouble* yg_serial){/*{{{*/
++void       SpcDynamic::SetDynamicConstraint(Nodes* nodes,IssmDouble* yg_serial){/*{{{*/
+ 
+ 	int pos;
+ 
+Index: ../trunk-jpl/src/c/classes/Constraints/Constraints.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/Constraints.h	(revision 18930)
++++ ../trunk-jpl/src/c/classes/Constraints/Constraints.h	(revision 18931)
+@@ -26,8 +26,8 @@
+ 		/*}}}*/
+ 
+ 		/*numerics*/
++		void ActivatePenaltyMethod(int in_analysis);
+ 		int  NumberOfConstraints(void);
+-		void ActivatePenaltyMethod(int in_analysis);
+ 
+ };
+ 
+Index: ../trunk-jpl/src/c/classes/Constraints/SpcStatic.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/SpcStatic.cpp	(revision 18930)
++++ ../trunk-jpl/src/c/classes/Constraints/SpcStatic.cpp	(revision 18931)
+@@ -35,8 +35,21 @@
+ /*}}}*/
+ 
+ /*Object virtual functions definitions:*/
+-void SpcStatic::Echo(void){/*{{{*/
++Object* SpcStatic::copy() {/*{{{*/
++	
++	SpcStatic* spcstat = new SpcStatic(*this); 
+ 
++	spcstat->sid=this->sid;
++	spcstat->nodeid=this->nodeid;
++	spcstat->dof=this->dof;
++	spcstat->value=this->value;
++	spcstat->analysis_type=this->analysis_type;
++
++	return (Object*) spcstat;
++}
++/*}}}*/
++void    SpcStatic::DeepEcho(void){/*{{{*/
++
+ 	_printf_("SpcStatic:\n");
+ 	_printf_("   sid: " << sid << "\n");
+ 	_printf_("   nodeid: " << nodeid << "\n");
+@@ -44,9 +57,9 @@
+ 	_printf_("   value: " << value << "\n");
+ 	_printf_("   analysis_type: " << EnumToStringx(analysis_type) << "\n");
+ 	return;
+-}
++}		
+ /*}}}*/
+-void SpcStatic::DeepEcho(void){/*{{{*/
++void    SpcStatic::Echo(void){/*{{{*/
+ 
+ 	_printf_("SpcStatic:\n");
+ 	_printf_("   sid: " << sid << "\n");
+@@ -55,40 +68,22 @@
+ 	_printf_("   value: " << value << "\n");
+ 	_printf_("   analysis_type: " << EnumToStringx(analysis_type) << "\n");
+ 	return;
+-}		
++}
+ /*}}}*/
+-int SpcStatic::Id(void){ return sid; }/*{{{*/
++int     SpcStatic::Id(void){ return sid; }/*{{{*/
+ /*}}}*/
+-int SpcStatic::ObjectEnum(void){/*{{{*/
++int     SpcStatic::ObjectEnum(void){/*{{{*/
+ 
+ 	return SpcStaticEnum;
+ 
+ }
+ /*}}}*/
+-Object* SpcStatic::copy() {/*{{{*/
+-	
+-	SpcStatic* spcstat = new SpcStatic(*this); 
+ 
+-	spcstat->sid=this->sid;
+-	spcstat->nodeid=this->nodeid;
+-	spcstat->dof=this->dof;
+-	spcstat->value=this->value;
+-	spcstat->analysis_type=this->analysis_type;
+-
+-	return (Object*) spcstat;
+-}
+-/*}}}*/
+-
+ /*Constraint virtual functions definitions: */
+ void SpcStatic::ActivatePenaltyMethod(void){/*{{{*/
+ 	   this->penalty = true;
+ }
+ /*}}}*/
+-bool SpcStatic::InAnalysis(int in_analysis_type){/*{{{*/
+-	if (in_analysis_type==this->analysis_type) return true;
+-	else return false;
+-}
+-/*}}}*/
+ void SpcStatic::ConstrainNode(Nodes* nodes,Parameters* parameters){/*{{{*/
+ 
+ 	Node* node=NULL;
+@@ -102,13 +97,18 @@
+ 	}
+ }
+ /*}}}*/
++bool SpcStatic::InAnalysis(int in_analysis_type){/*{{{*/
++	if (in_analysis_type==this->analysis_type) return true;
++	else return false;
++}
++/*}}}*/
+ 
+ /*SpcStatic functions*/
+-int SpcStatic::GetDof(){/*{{{*/
++int        SpcStatic::GetDof(){/*{{{*/
+ 	return dof;
+ }
+ /*}}}*/
+-int   SpcStatic::GetNodeId(){/*{{{*/
++int        SpcStatic::GetNodeId(){/*{{{*/
+ 
+ 	return nodeid;
+ }
+Index: ../trunk-jpl/src/c/classes/Constraints/SpcTransient.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/SpcTransient.cpp	(revision 18930)
++++ ../trunk-jpl/src/c/classes/Constraints/SpcTransient.cpp	(revision 18931)
+@@ -50,7 +50,15 @@
+ /*}}}*/
+ 
+ /*Object virtual functions definitions:*/
+-void SpcTransient::Echo(void){/*{{{*/
++Object* SpcTransient::copy() {/*{{{*/
++	return new SpcTransient(sid,nodeid,dof,nsteps,times,values,analysis_type);
++}
++/*}}}*/
++void    SpcTransient::DeepEcho(void){/*{{{*/
++	this->Echo();
++}		
++/*}}}*/
++void    SpcTransient::Echo(void){/*{{{*/
+ 
+ 	int i;
+ 	_printf_("SpcTransient:\n");
+@@ -66,36 +74,22 @@
+ 	return;
+ }
+ /*}}}*/
+-void SpcTransient::DeepEcho(void){/*{{{*/
+-	this->Echo();
+-}		
+-/*}}}*/
+-int  SpcTransient::Id(void){/*{{{*/
++int     SpcTransient::Id(void){/*{{{*/
+ 	return sid;
+ }
+ /*}}}*/
+-int SpcTransient::ObjectEnum(void){/*{{{*/
++int     SpcTransient::ObjectEnum(void){/*{{{*/
+ 
+ 	return SpcTransientEnum;
+ 
+ }
+ /*}}}*/
+-Object* SpcTransient::copy() {/*{{{*/
+-	return new SpcTransient(sid,nodeid,dof,nsteps,times,values,analysis_type);
+-}
+-/*}}}*/
+ 
+ /*Constraint virtual functions definitions:*/
+ void SpcTransient::ActivatePenaltyMethod(void){/*{{{*/
+ 	   this->penalty = true;
+ }
+ /*}}}*/
+-bool SpcTransient::InAnalysis(int in_analysis_type){/*{{{*/
+-
+-	if (in_analysis_type==this->analysis_type) return true;
+-	else return false;
+-}
+-/*}}}*/
+ void SpcTransient::ConstrainNode(Nodes* nodes,Parameters* parameters){/*{{{*/
+ 
+ 	Node       *node  = NULL;
+@@ -144,6 +138,12 @@
+ 	}
+ }
+ /*}}}*/
++bool SpcTransient::InAnalysis(int in_analysis_type){/*{{{*/
++
++	if (in_analysis_type==this->analysis_type) return true;
++	else return false;
++}
++/*}}}*/
+ void SpcTransient::PenaltyDofAndValue(int* pdof,IssmDouble* pvalue,Nodes* nodes,Parameters* parameters){/*{{{*/
+ 
+ 	if(!this->penalty) _error_("cannot return dof and value for non penalty constraint");
+@@ -202,11 +202,11 @@
+ /*}}}*/
+ 
+ /*SpcTransient functions*/
+-int SpcTransient::GetDof(){/*{{{*/
++int        SpcTransient::GetDof(){/*{{{*/
+ 	return dof;
+ }
+ /*}}}*/
+-int   SpcTransient::GetNodeId(){/*{{{*/
++int        SpcTransient::GetNodeId(){/*{{{*/
+ 
+ 	return nodeid;
+ }
Index: /issm/oecreview/Archive/18296-19100/ISSM-18931-18932.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18931-18932.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18931-18932.diff	(revision 19102)
@@ -0,0 +1,72 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2015.0.090-mpt.2.11r13.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2015.0.090-mpt.2.11r13.sh	(revision 0)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2015.0.090-mpt.2.11r13.sh	(revision 18932)
+@@ -0,0 +1,60 @@
++#!/bin/bash
++set -eu
++
++#Some cleanup
++rm -rf install petsc-3.5.2 src
++mkdir install src
++
++#Download from ISSM server
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
++
++#Untar and move petsc to install directory
++tar -zxvf  petsc-3.5.2.tar.gz
++mv petsc-3.5.2/* src/
++rm -rf petsc-3.5.2
++
++#configure
++cd src
++./config/configure.py \
++	--prefix="$ISSM_DIR/externalpackages/petsc/install" \
++	--PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
++	--with-blas-lapack-dir="/nasa/intel/Compiler/2015.0.090/composer_xe_2015.0.090/mkl/" \
++	--with-mpi-lib="/nasa/sgi/mpt/2.11r13/lib/libmpi.so" \
++	--with-mpi-include="/nasa/sgi/mpt/2.11r13/include" \
++	--known-mpi-shared-libraries=1 \
++	--with-debugging=0 \
++	--with-valgrind=0 \
++	--with-x=0 \
++	--with-ssl=0 \
++	--with-batch=1  \
++	--with-shared-libraries=1 \
++	--download-metis=1 \
++	--download-parmetis=1 \
++	--download-mumps=1 \
++	--download-scalapack=1 \
++	--download-fblaslapack=1 \
++	--COPTFLAGS="-lmpi -O3" \
++	--FOPTFLAGS="-lmpi -O3" \
++	--CXXOPTFLAGS="-lmpi -O3"
++
++#prepare script to reconfigure petsc
++cat > script.queue << EOF
++#PBS -S /bin/bash
++#PBS -l select=1:ncpus=1:model=wes 
++#PBS -l walltime=200 
++#PBS -W group_list=s1010
++#PBS -m e 
++
++. /usr/share/modules/init/bash 
++module load comp-intel/2015.0.090
++module load mpi-sgi/mpt.2.11r13
++
++export PATH="$PATH:." 
++export MPI_GROUP_MAX=64 
++mpiexec -np 1 ./conftest-arch-linux2-c-opt
++EOF
++
++#print instructions
++echo "== Now: cd src/ "
++echo "== qsub -q devel script.queue "
++echo "== Then run reconfigure script generated by PETSc and follow instructions"
+
+Property changes on: ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2015.0.090-mpt.2.11r13.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18932-18933.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18932-18933.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18932-18933.diff	(revision 19102)
@@ -0,0 +1,29 @@
+Index: ../trunk-jpl/configs/config-linux64-pleiades-intel2015.0.090-mpt.2.11r13.sh
+===================================================================
+--- ../trunk-jpl/configs/config-linux64-pleiades-intel2015.0.090-mpt.2.11r13.sh	(revision 0)
++++ ../trunk-jpl/configs/config-linux64-pleiades-intel2015.0.090-mpt.2.11r13.sh	(revision 18933)
+@@ -0,0 +1,17 @@
++#!/bin/csh
++./configure \
++	--prefix=$ISSM_DIR \
++	--without-kriging \
++	--with-matlab-dir="$ISSM_DIR/externalpackages/matlab/install" \
++	--with-petsc-dir="$ISSM_DIR/externalpackages/petsc/install" \
++	--with-triangle-dir="$ISSM_DIR/externalpackages/triangle/install" \
++	--with-mpi-include="/nasa/sgi/mpt/2.11r13/include" \
++	--with-mpi-libflags="-L/nasa/sgi/mpt/2.11r13/ -lmpi" \
++	--with-mkl-dir="/nasa/intel/Compiler/2015.0.090/composer_xe_2015.0.090/mkl/" \
++	--with-metis-dir="$ISSM_DIR/externalpackages/petsc/install" \
++	--with-mumps-dir="$ISSM_DIR/externalpackages/petsc/install" \
++	--with-scalapack-dir="$ISSM_DIR/externalpackages/petsc/install" \
++	--with-hypre-dir="$ISSM_DIR/externalpackages/petsc/install" \
++	--with-graphics-lib="/usr/lib64/libX11.so" \
++	--with-cxxoptflags="-g -O2" \
++	--with-vendor="intel-pleiades"
+
+Property changes on: ../trunk-jpl/configs/config-linux64-pleiades-intel2015.0.090-mpt.2.11r13.sh
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
Index: /issm/oecreview/Archive/18296-19100/ISSM-18933-18934.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18933-18934.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18933-18934.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh	(revision 18933)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh	(revision 18934)
+@@ -22,7 +22,7 @@
+ ./config/configure.py \
+  --prefix="$ISSM_DIR/externalpackages/petsc/install" \
+  --PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
+- --with-mpi-dir="/data/apps/mpi/openmpi-1.6.0/gcc/4.7.3/" \
++ --with-mpi-dir="/data/apps/mpi/openmpi-1.8.3/gcc/4.8.3/" \
+  --known-mpi-shared-libraries=1 \
+  --with-debugging=0 \
+  --with-valgrind=0 \
Index: /issm/oecreview/Archive/18296-19100/ISSM-18934-18935.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18934-18935.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18934-18935.diff	(revision 19102)
@@ -0,0 +1,23 @@
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/Autodiff/CreateParametersAutodiff.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/Autodiff/CreateParametersAutodiff.cpp	(revision 18934)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/Autodiff/CreateParametersAutodiff.cpp	(revision 18935)
+@@ -114,11 +114,6 @@
+ 		/*Don't forget to copy  iomodel->independent_objects to parameters: */
+ 		parameters->AddObject(new DataSetParam(AutodiffIndependentObjectsEnum,iomodel->independent_objects));
+ 		/*}}}*/
+-
+-		#endif
+-	}
+-
+-	#ifdef _HAVE_ADOLC_
+ 		/*initialize a placeholder to store solver pointers: {{{*/
+ 		GenericParam<Adolc_edf> *theAdolcEDF_p=new GenericParam<Adolc_edf>(AdolcParamEnum);
+ 
+@@ -158,5 +153,5 @@
+ 		xDelete<char>(options);
+ 		/*}}}*/
+ 	#endif
+-
++	}
+ }
Index: /issm/oecreview/Archive/18296-19100/ISSM-18935-18936.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18935-18936.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18935-18936.diff	(revision 19102)
@@ -0,0 +1,45 @@
+Index: ../trunk-jpl/src/c/classes/IndependentObject.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/IndependentObject.cpp	(revision 18935)
++++ ../trunk-jpl/src/c/classes/IndependentObject.cpp	(revision 18936)
+@@ -73,7 +73,7 @@
+ 
+ 	int my_rank;
+ 	FILE* fid=NULL;
+-	int Xcount;
++	int Xcount=0;
+ 
+ 	/*recover my_rank:*/
+ 	my_rank=IssmComm::GetRank();
+@@ -165,10 +165,10 @@
+ 				/*Now, before we even broadcast this to other nodes, declare the whole matrix as a independent variable!
+ 				 If we have been supplied an X vector, use it instead of what we just read: */
+ 				if(X){
+-					for (int i=0;i<M*N;++i) matrix[i]<<=X[Xcount+i];  /*we use the <<= ADOLC overloaded operator to declare the independency*/
++					for (int i=0;i<M*N;i++) matrix[i]<<=X[Xcount+i];  /*<<= ADOLC overloaded operator to declare independent*/
+ 				}
+ 				else{
+-					for (int i=0;i<M*N;++i) matrix[i]<<=buffer[i];  /*we use the <<= ADOLC overloaded operator to declare the independency*/
++					for (int i=0;i<M*N;i++) matrix[i]<<=buffer[i];
+ 				}
+ 			}
+ 			ISSM_MPI_Bcast(matrix,M*N,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 
+@@ -203,17 +203,13 @@
+ /*}}}*/
+ void IndependentObject::FillIndependents(IssmDouble** data, IssmDouble* xp){/*{{{*/
+ 
+-	int i;
+-
+ 	/*Branch according to the type of variable: */
+ 	if(type==0){ /*scalar:*/
+ 		xp[0]=*(data[name]);
+ 	}
+ 	else if(type==1){ /* vector:*/
+ 		IssmDouble* values=data[name];
+-		for(i=0;i<this->numberofindependents;i++){
+-			xp[i]=values[i];
+-		}
++		for(int i=0;i<this->numberofindependents;i++) xp[i]=values[i];
+ 	}
+ 	else _error_("should not have a type of " << type);
+ }
Index: /issm/oecreview/Archive/18296-19100/ISSM-18936-18937.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18936-18937.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18936-18937.diff	(revision 19102)
@@ -0,0 +1,26 @@
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18936)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18937)
+@@ -198,8 +198,10 @@
+ 	pfclose(toolkitsoptionsfid,toolkitsfilename);
+ 
+ 	/*Open output file once for all and add output file descriptor to parameters*/
+-	output_fid=pfopen(outputfilename,"wb");
+-	this->parameters->SetParam(output_fid,OutputFilePointerEnum);
++	if(!trace){
++		output_fid=pfopen(outputfilename,"wb");
++		this->parameters->SetParam(output_fid,OutputFilePointerEnum);
++	}
+ 	
+ 	/*Now save all of these file names into parameters, you never know when you might need them: */
+ 	this->parameters->AddObject(new StringParam(ToolkitsFileNameEnum,toolkitsfilename));
+@@ -324,7 +326,7 @@
+ 	/*Figure out which solution core we are going to run with the current solution type: */
+ 	WrapperCorePointerFromSolutionEnum(&solutioncore,this->parameters,solution_type);
+ 
+-	/*run solutoin core: */
++	/*run solution core: */
+ 	profiler->Tag(StartCore);   
+ 	solutioncore(this); 
+ 	profiler->Tag(FinishCore);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18937-18938.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18937-18938.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18937-18938.diff	(revision 19102)
@@ -0,0 +1,17 @@
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18937)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18938)
+@@ -198,10 +198,8 @@
+ 	pfclose(toolkitsoptionsfid,toolkitsfilename);
+ 
+ 	/*Open output file once for all and add output file descriptor to parameters*/
+-	if(!trace){
+-		output_fid=pfopen(outputfilename,"wb");
+-		this->parameters->SetParam(output_fid,OutputFilePointerEnum);
+-	}
++	output_fid=pfopen(outputfilename,"wb");
++	this->parameters->SetParam(output_fid,OutputFilePointerEnum);
+ 	
+ 	/*Now save all of these file names into parameters, you never know when you might need them: */
+ 	this->parameters->AddObject(new StringParam(ToolkitsFileNameEnum,toolkitsfilename));
Index: /issm/oecreview/Archive/18296-19100/ISSM-18938-18939.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18938-18939.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18938-18939.diff	(revision 19102)
@@ -0,0 +1,51 @@
+Index: ../trunk-jpl/src/c/cores/ad_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/ad_core.cpp	(revision 18938)
++++ ../trunk-jpl/src/c/cores/ad_core.cpp	(revision 18939)
+@@ -27,7 +27,7 @@
+ 	int     num_independents=0;
+ 	bool    isautodiff       = false;
+ 	char   *driver           = NULL;
+-	size_t  tape_stats[11];
++	size_t  tape_stats[15];
+ 
+ 	/*state variables: */
+ 	IssmDouble *axp = NULL;
+@@ -44,18 +44,6 @@
+ 
+ 			/*First, stop tracing: */
+ 			trace_off();
+-		
+-			/*retrieve parameters: */
+-			femmodel->parameters->FindParam(&num_dependents,AutodiffNumDependentsEnum);
+-			femmodel->parameters->FindParam(&num_independents,AutodiffNumIndependentsEnum);
+-	
+-			/*if no dependents, no point in running a driver: */
+-			if(!(num_dependents*num_independents)) return;
+-
+-			/*for adolc to run in parallel, we 0 out on rank~=0:*/
+-			if (my_rank!=0){
+-				num_dependents=0; num_independents=0;
+-			}
+ 			
+ 			/*Print tape statistics so that user can kill this run if something is off already:*/
+ 			if(VerboseAutodiff()){ /*{{{*/
+@@ -100,6 +88,18 @@
+ 				delete [] sstats;
+ 			} /*}}}*/
+ 
++			/*retrieve parameters: */
++			femmodel->parameters->FindParam(&num_dependents,AutodiffNumDependentsEnum);
++			femmodel->parameters->FindParam(&num_independents,AutodiffNumIndependentsEnum);
++	
++			/*if no dependents, no point in running a driver: */
++			if(!(num_dependents*num_independents)) return;
++
++			/*for adolc to run in parallel, we 0 out on rank~=0:*/
++			if (my_rank!=0){
++				num_dependents=0; num_independents=0;
++			}
++			
+ 			/*retrieve state variable: */
+ 			femmodel->parameters->FindParam(&axp,&dummy,AutodiffXpEnum);
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18939-18940.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18939-18940.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18939-18940.diff	(revision 19102)
@@ -0,0 +1,54 @@
+Index: ../trunk-jpl/src/c/cores/adgradient_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/adgradient_core.cpp	(revision 18939)
++++ ../trunk-jpl/src/c/cores/adgradient_core.cpp	(revision 18940)
+@@ -52,6 +52,49 @@
+ 
+ 			/*First, stop tracing: */
+ 			trace_off();
++			
++			if(VerboseAutodiff()){ /*{{{*/
++				size_t  tape_stats[15];
++				tapestats(my_rank,tape_stats); //reading of tape statistics
++				int commSize=IssmComm::GetSize();
++				int *sstats=new int[7];
++				sstats[0]=tape_stats[NUM_OPERATIONS];
++				sstats[1]=tape_stats[OP_FILE_ACCESS];
++				sstats[2]=tape_stats[NUM_LOCATIONS];
++				sstats[3]=tape_stats[LOC_FILE_ACCESS];
++				sstats[4]=tape_stats[NUM_VALUES];
++				sstats[5]=tape_stats[VAL_FILE_ACCESS];
++				sstats[6]=tape_stats[TAY_STACK_SIZE];
++				int *rstats=NULL;
++				if (my_rank==0) rstats=new int[commSize*7];
++				ISSM_MPI_Gather(sstats,7,ISSM_MPI_INT,rstats,7,ISSM_MPI_INT,0,IssmComm::GetComm());
++				if (my_rank==0) {
++					int offset=50;
++					int rOffset=(commSize/10)+1;
++					_printf_("   ADOLC statistics: \n");
++					_printf_("     "<<setw(offset)<<left<<"#independents: " <<setw(12)<<right<<tape_stats[NUM_INDEPENDENTS] << "\n");
++					_printf_("     "<<setw(offset)<<left<<"#dependents: " <<setw(12)<<right<<tape_stats[NUM_DEPENDENTS] << "\n");
++					_printf_("     "<<setw(offset)<<left<<"max #live active variables: " <<setw(12)<<right<<tape_stats[NUM_MAX_LIVES] << "\n");
++					_printf_("     operations: entry size "<< sizeof(unsigned char) << " Bytes \n");
++					_printf_("     "<<setw(offset)<<left<<"  #entries in buffer (AutodiffObufsizeEnum) " <<setw(12)<<right<<tape_stats[OP_BUFFER_SIZE] << "\n");
++					for (int r=0;r<commSize;++r)
++					_printf_("       ["<<setw(rOffset)<<right<<r<<"]"<<setw(offset-rOffset-4)<<left<<" #entries total" <<setw(12)<<right<<rstats[r*7+0] << (rstats[r*7+1]?" ->file":"") << "\n");
++					_printf_("     locations: entry size " << sizeof(locint) << " Bytes\n");
++					_printf_("     "<<setw(offset)<<left<<"  #entries in buffer (AutodiffLbufsizeEnum) " <<setw(12)<<right<<tape_stats[LOC_BUFFER_SIZE] << "\n");
++					for (int r=0;r<commSize;++r)
++					_printf_("       ["<<setw(rOffset)<<right<<r<<"]"<<setw(offset-rOffset-4)<<left<<" #entries total" <<setw(12)<<right<<rstats[r*7+2] << (rstats[r*7+3]?" ->file":"") << "\n");
++					_printf_("     constant values: entry size " << sizeof(double) << " Bytes\n");
++					_printf_("     "<<setw(offset)<<left<<"  #entries in buffer (AutodiffCbufsizeEnum) " <<setw(12)<<right<<tape_stats[VAL_BUFFER_SIZE] << "\n");
++					for (int r=0;r<commSize;++r)
++					_printf_("       ["<<setw(rOffset)<<right<<r<<"]"<<setw(offset-rOffset-4)<<left<<" #entries total" <<setw(12)<<right<<rstats[r*7+4] << (rstats[r*7+5]?" ->file":"") << "\n");
++					_printf_("     Taylor stack: entry size " << sizeof(revreal) << " Bytes\n");
++					_printf_("     "<<setw(offset)<<left<<"  #entries in buffer (AutodiffTbufsizeEnum) " <<setw(12)<<right<<tape_stats[TAY_BUFFER_SIZE] << "\n");
++					for (int r=0;r<commSize;++r)
++					_printf_("       ["<<setw(rOffset)<<right<<r<<"]"<<setw(offset-rOffset-4)<<left<<" #entries total" <<setw(12)<<right<<rstats[r*7+6] << (rstats[r*7+6]>tape_stats[TAY_BUFFER_SIZE]?" ->file":"") << "\n");
++					delete []rstats;
++			}
++			delete [] sstats;
++		} /*}}}*/
+ 		
+ 			/*retrieve parameters: */
+ 			femmodel->parameters->FindParam(&num_dependents,AutodiffNumDependentsEnum);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18940-18941.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18940-18941.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18940-18941.diff	(revision 19102)
@@ -0,0 +1,24 @@
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 18940)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 18941)
+@@ -27,7 +27,7 @@
+ 				/*Deal with mass flux gates:{{{ */
+ 				
+ 				/*massfluxatgate variables: */
+-				int          numgates;
++				int          temp,numgates;
+ 				char       **gatenames               = NULL;
+ 				int        *gatedefinitionenums      = NULL;
+ 				IssmDouble **gatesegments            = NULL;
+@@ -36,8 +36,8 @@
+ 
+ 				/*Fetch segments and names: */
+ 				iomodel->FetchMultipleData(&gatenames,&numgates,MassfluxatgateNameEnum);
+-				iomodel->FetchMultipleData(&gatedefinitionenums,&numgates,MassfluxatgateDefinitionenumEnum);
+-				iomodel->FetchMultipleData(&gatesegments,&gatesegments_M,NULL,&numgates,MassfluxatgateSegmentsEnum);
++				iomodel->FetchMultipleData(&gatedefinitionenums,&temp,MassfluxatgateDefinitionenumEnum); _assert_(temp==numgates);
++				iomodel->FetchMultipleData(&gatesegments,&gatesegments_M,NULL,&temp,MassfluxatgateSegmentsEnum);_assert_(temp==numgates); 
+ 
+ 				for(j=0;j<numgates;j++){
+ 					output_definitions->AddObject(new Massfluxatgate<IssmDouble>(gatenames[j],gatedefinitionenums[j],gatesegments_M[j],gatesegments[j]));
Index: /issm/oecreview/Archive/18296-19100/ISSM-18941-18942.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18941-18942.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18941-18942.diff	(revision 19102)
@@ -0,0 +1,304 @@
+Index: ../trunk-jpl/src/c/cores/controlad_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/controlad_core.cpp	(revision 18941)
++++ ../trunk-jpl/src/c/cores/controlad_core.cpp	(revision 18942)
+@@ -24,33 +24,30 @@
+ 
+ /*Cost function prototype*/
+ void simulad(long* indic,long* n,double* X,double* pf,double* G,long izs[1],float rzs[1],void* dzs);
++FemModel* presimulad(int* pintn, double** pX, FemModel* femmodel);
++void postsimulad(long* indic,long* n,double* X,double* pf,double* G,long izs[1],float rzs[1],void* dzs);
+ /*}}}*/
+ void controlad_core(FemModel* femmodel){ /*{{{*/
+ 
+ 	/*Intermediaries*/
++	FemModel*    femmodelad=NULL;
+ 	int          i;
+ 	long         omode;
+ 	IssmPDouble  f,dxmin,gttol;
+ 	IssmDouble   dxmind,gttold; 
+ 	int          maxsteps,maxiter;
+-	int          intn,numberofvertices,num_controls,solution_type;
+-	IssmDouble  *scaling_factors = NULL;
++	int          intn,solution_type;
+ 	IssmPDouble  *X  = NULL;
+ 	IssmDouble   *Xd  = NULL;
+-	IssmDouble   *Gd  = NULL;
+ 	IssmPDouble  *G  = NULL;
+-	bool onsid=true;
+ 
+ 	/*Recover some parameters*/
+ 	femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
+-	femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
+ 	femmodel->parameters->FindParam(&maxsteps,InversionMaxstepsEnum);
+ 	femmodel->parameters->FindParam(&maxiter,InversionMaxiterEnum);
+ 	femmodel->parameters->FindParam(&dxmind,InversionDxminEnum); dxmin=reCast<IssmPDouble>(dxmind);
+ 	femmodel->parameters->FindParam(&gttold,InversionGttolEnum); gttol=reCast<IssmPDouble>(gttold);
+-	femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
+ 	femmodel->parameters->SetParam(false,SaveResultsEnum);
+-	numberofvertices=femmodel->vertices->NumberOfVertices();
+ 
+ 	/*Initialize M1QN3 parameters*/
+ 	if(VerboseControl())_printf0_("   Initialize M1QN3 parameters\n");
+@@ -70,29 +67,13 @@
+ 	long niter = long(maxsteps); /*Maximum number of iterations*/
+ 	long nsim  = long(maxiter);/*Maximum number of function calls*/
+ 
+-	/*Get initial guess*/
+-	Vector<IssmDouble> *Xad = NULL;
+-	GetVectorFromControlInputsx(&Xad,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value",onsid);
+-	Xd = Xad->ToMPISerial();
+-	Xad->GetSize(&intn);
+-	X=xNew<IssmPDouble>(intn);
+-	for(i=0;i<intn;i++) X[i]=reCast<IssmPDouble>(Xd[i]);
+-	delete Xad;
+-	_assert_(intn==numberofvertices*num_controls);
+-	
+-	/*Get problem dimension and initialize gradient and initial guess*/
++	/*Run the first part of simulad, in order to get things started!:*/
++	femmodelad=presimulad(&intn,&X,femmodel);
++
++	/*Get problem dimension and initialize gradient: */
+ 	long n = long(intn);
+ 	G = xNew<IssmPDouble>(n);
+-	Gd = xNew<IssmDouble>(n);
+ 
+-	/*Scale control for M1QN3*/
+-	for(int i=0;i<numberofvertices;i++){
+-		for(int c=0;c<num_controls;c++){
+-			int index = num_controls*i+c;
+-			X[index] = X[index]/reCast<IssmPDouble>(scaling_factors[c]);
+-		}
+-	}
+-
+ 	/*Allocate m1qn3 working arrays (see doc)*/
+ 	long      m   = 100;
+ 	long      ndz = 4*n+m*(2*n+1);
+@@ -103,8 +84,8 @@
+ 	_printf0_("Cost function f(x)   | Gradient norm |g(x)| |  List of contributions\n");
+ 	_printf0_("____________________________________________________________________\n");
+ 
+-	//first run before firing up the control optimization
+-	simulad(&indic,&n,X,&f,G,izs,rzs,(void*)femmodel);
++	//run post simular phase, to fire up the control optimization
++	postsimulad(&indic,&n,X,&f,G,izs,rzs,(void*)femmodelad); 
+ 	double f1=f;
+ 
+ 	m1qn3_(costfuncion,prosca,&ctonbe_,&ctcabe_,
+@@ -124,20 +105,6 @@
+ 		default: _printf0_("   Unknown end condition\n");
+ 	}
+ 	
+-	/*Constrain solution vector*/
+-	IssmDouble  *XL = NULL;
+-	IssmDouble  *XU = NULL;
+-	GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound",onsid);
+-	GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound",onsid);
+-	for(int i=0;i<numberofvertices;i++){
+-		for(int c=0;c<num_controls;c++){
+-			int index = num_controls*i+c;
+-			X[index] = X[index]*reCast<IssmPDouble>(scaling_factors[c]);
+-			if(X[index]>XU[index]) X[index]=reCast<IssmPDouble>(XU[index]);
+-			if(X[index]<XL[index]) X[index]=reCast<IssmPDouble>(XL[index]);
+-		}
+-	}
+-
+ 	/*Save results:*/
+ 	femmodel->results->AddObject(new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,AutodiffJacobianEnum,G,n,1,1,0.0));
+ 	femmodel->results->AddObject(new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,AutodiffXpEnum,X,intn,1,1,0.0));
+@@ -146,8 +113,125 @@
+ 	xDelete<double>(G);
+ 	xDelete<double>(X);
+ 	xDelete<double>(dz);
+-	xDelete<IssmDouble>(scaling_factors);
+ }/*}}}*/
++FemModel* presimulad(int* pintn, double** pX, FemModel* femmodel){ /*{{{*/
++
++	/*Intermediaries:*/
++	char* rootpath=NULL;
++	char* inputfilename=NULL;
++	char* outputfilename=NULL;
++	char* toolkitsfilename=NULL;
++	char* lockfilename=NULL;
++	int         solution_type;
++	IssmDouble    pfd;
++	IssmDouble*   Xd=NULL;
++	int           intn;
++	IssmPDouble*   X=NULL;
++	int            i;
++	
++	/*Now things get complicated. The femmodel we recovered did not initialize an AD trace, so we can't compute gradients with it. We are going to recreate 
++	 *a new femmodel, identical in all aspects to the first one, with trace on though, which will allow us to run the forward mode and get the gradient 
++	 in one run of the solution core. So first recover the filenames required for the FemModel constructor, then call a new ad tailored constructor:*/
++	femmodel->parameters->FindParam(&rootpath,RootPathEnum);
++	femmodel->parameters->FindParam(&inputfilename,InputFileNameEnum);
++	femmodel->parameters->FindParam(&outputfilename,OutputFileNameEnum);
++	femmodel->parameters->FindParam(&toolkitsfilename,ToolkitsFileNameEnum);
++	femmodel->parameters->FindParam(&lockfilename,LockFileNameEnum);
++
++	femmodel=new FemModel(rootpath, inputfilename, outputfilename, toolkitsfilename, lockfilename, femmodel->comm, femmodel->solution_type,NULL);
++
++	
++	/*Get initial guess:*/
++	femmodel->parameters->FindParam(&Xd,&intn,AutodiffXpEnum);
++	X=xNew<IssmPDouble>(intn); for(i=0;i<intn;i++) X[i]=reCast<IssmPDouble>(Xd[i]); 
++
++	xDelete<char>(rootpath);
++	xDelete<char>(inputfilename);
++	xDelete<char>(outputfilename);
++	xDelete<char>(toolkitsfilename);
++	xDelete<char>(lockfilename);
++	xDelete<IssmDouble>(Xd);
++
++	*pintn=intn;
++	*pX=X;
++
++	return femmodel;
++
++} /*}}}*/
++void postsimulad(long* indic,long* n,double* X,double* pf,double* G,long izs[1],float rzs[1],void* dzs){ /*{{{*/
++
++	/*Intermediaries:*/
++	char* rootpath=NULL;
++	char* inputfilename=NULL;
++	char* outputfilename=NULL;
++	char* toolkitsfilename=NULL;
++	char* lockfilename=NULL;
++	IssmPDouble* G2=NULL;
++	int         solution_type;
++	FemModel   *femmodel  =  NULL;
++	IssmDouble    pfd;
++	int            i;
++	
++	/*Recover Femmodel*/
++	femmodel  = (FemModel*)dzs;
++
++	/*Recover number of cost functions responses*/
++	int num_responses;
++	femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum);
++
++	/*Recover some parameters*/
++	femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
++
++	/*Compute solution:*/
++	void (*solutioncore)(FemModel*)=NULL;
++	CorePointerFromSolutionEnum(&solutioncore,femmodel->parameters,solution_type);
++	solutioncore(femmodel);
++
++	/*Compute objective function*/
++	IssmDouble* Jlist = NULL;
++	femmodel->CostFunctionx(&pfd,&Jlist,NULL); *pf=reCast<IssmPDouble>(pfd);
++	_printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<"  |  ");
++	
++	/*Compute gradient using AD. Gradient is in the results after the ad_core is called*/
++	adgradient_core(femmodel); 
++
++	if(IssmComm::GetRank()==0){
++		IssmPDouble* G_temp=NULL;
++		GenericExternalResult<IssmPDouble*>* gradient=(GenericExternalResult<IssmPDouble*>*)femmodel->results->FindResult(AutodiffJacobianEnum); _assert_(gradient);
++		G_temp=gradient->GetValues();
++		/*copy onto G2, to avoid a leak: */
++		G2=xNew<IssmPDouble>(*n); 
++		xMemCpy<IssmPDouble>(G2,G_temp,*n);
++	}
++	else G2=xNew<IssmPDouble>(*n);
++
++	/*MPI broadcast results:*/
++	ISSM_MPI_Bcast(G2,*n,ISSM_MPI_PDOUBLE,0,IssmComm::GetComm());
++	
++	/*Send gradient to m1qn3 core: */
++	for(long i=0;i<*n;i++) G[i] = G2[i];
++	
++	/*Constrain X and G*/
++	IssmDouble  Gnorm = 0.;
++	for(long i=0;i<*n;i++) Gnorm += G[i]*G[i];
++	Gnorm = sqrt(Gnorm);
++
++	/*Print info*/
++	_printf0_("       "<<setw(12)<<setprecision(7)<<Gnorm<<" |");
++	for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(12)<<setprecision(7)<<Jlist[i]);
++	_printf0_("\n");
++
++	/*Clean-up and return*/
++	xDelete<IssmDouble>(Jlist);
++	xDelete<IssmPDouble>(G2);
++	
++	xDelete<char>(rootpath);
++	xDelete<char>(inputfilename);
++	xDelete<char>(outputfilename);
++	xDelete<char>(toolkitsfilename);
++	xDelete<char>(lockfilename);
++
++} /*}}}*/
+ void simulad(long* indic,long* n,double* X,double* pf,double* G,long izs[1],float rzs[1],void* dzs){ /*{{{*/
+ 
+ 	/*Intermediaries:*/
+@@ -157,9 +241,6 @@
+ 	char* toolkitsfilename=NULL;
+ 	char* lockfilename=NULL;
+ 	IssmPDouble* G2=NULL;
+-	bool onsid=true;
+-	IssmDouble  *XL = NULL;
+-	IssmDouble  *XU = NULL;
+ 	int         solution_type;
+ 	FemModel   *femmodel  =  NULL;
+ 	FemModel   *femmodelad  = NULL;
+@@ -170,25 +251,9 @@
+ 	femmodel  = (FemModel*)dzs;
+ 
+ 	/*Recover number of cost functions responses*/
+-	int num_responses,num_controls,numberofvertices;
+-	IssmDouble* scaling_factors = NULL;
++	int num_responses;
+ 	femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum);
+-	femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
+-	femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
+-	numberofvertices=femmodel->vertices->NumberOfVertices();
+ 
+-	/*Constrain input vector*/
+-	GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound",onsid);
+-	GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound",onsid);
+-	for(int i=0;i<numberofvertices;i++){
+-		for(int c=0;c<num_controls;c++){
+-			int index = num_controls*i+c;
+-			X[index] = X[index]*reCast<IssmPDouble>(scaling_factors[c]);
+-			if(X[index]>reCast<IssmPDouble>(XU[index])) X[index]=reCast<IssmPDouble>(XU[index]);
+-			if(X[index]<reCast<IssmPDouble>(XL[index])) X[index]=reCast<IssmPDouble>(XL[index]);
+-		}
+-	}
+-
+ 	/*Now things get complicated. The femmodel we recovered did not initialize an AD trace, so we can't compute gradients with it. We are going to recreate 
+ 	 *a new femmodel, identical in all aspects to the first one, with trace on though, which will allow us to run the forward mode and get the gradient 
+ 	 in one run of the solution core. So first recover the filenames required for the FemModel constructor, then call a new ad tailored constructor:*/
+@@ -233,18 +298,9 @@
+ 	/*Send gradient to m1qn3 core: */
+ 	for(long i=0;i<*n;i++) G[i] = G2[i];
+ 	
+-	/*Constrain X and G*/
++	/*Recover Gnorm: */
+ 	IssmDouble  Gnorm = 0.;
+-	for(int i=0;i<numberofvertices;i++){
+-		for(int c=0;c<num_controls;c++){
+-			int index = num_controls*i+c;
+-			if(X[index]>=XU[index]) G[index]=0.;
+-			if(X[index]<=XL[index]) G[index]=0.;
+-			G[index] = G[index]*reCast<IssmPDouble>(scaling_factors[c]);
+-			X[index] = X[index]/reCast<IssmPDouble>(scaling_factors[c]);
+-			Gnorm += G[index]*G[index];
+-		}
+-	}
++	for(int i=0;i<*n;i++) Gnorm += G[i]*G[i];
+ 	Gnorm = sqrt(Gnorm);
+ 
+ 	/*Print info*/
+@@ -254,10 +310,7 @@
+ 
+ 	/*Clean-up and return*/
+ 	xDelete<IssmDouble>(Jlist);
+-	xDelete<IssmDouble>(XU);
+-	xDelete<IssmDouble>(XL);
+ 	xDelete<IssmPDouble>(G2);
+-	xDelete<IssmDouble>(scaling_factors);
+ 	
+ 	xDelete<char>(rootpath);
+ 	xDelete<char>(inputfilename);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18942-18943.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18942-18943.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18942-18943.diff	(revision 19102)
@@ -0,0 +1,14 @@
+Index: ../trunk-jpl
+===================================================================
+--- ../trunk-jpl	(revision 18942)
++++ ../trunk-jpl	(revision 18943)
+
+Property changes on: ../trunk-jpl
+___________________________________________________________________
+Modified: svn:ignore
+## -1,3 +1,5 ##
++build-fw
++build-ad
+ nightlylog
+ configure.sh
+ par
Index: /issm/oecreview/Archive/18296-19100/ISSM-18943-18944.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18943-18944.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18943-18944.diff	(revision 19102)
@@ -0,0 +1,145 @@
+Index: ../trunk-jpl/test/NightlyRun/test101.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test101.m	(revision 18943)
++++ ../trunk-jpl/test/NightlyRun/test101.m	(revision 18944)
+@@ -7,12 +7,12 @@
+ %output
+ md.stressbalance.requested_outputs={'default','DeviatoricStressxx','DeviatoricStressyy','DeviatoricStressxy','MassFlux1','MassFlux2','MassFlux3','MassFlux4','MassFlux5','MassFlux6'};
+ md.outputdefinition.definitions={...
+-	massfluxatgate('name','MassFlux1','profilename',['../Exp/MassFlux1.exp'],'definitionenum',Outputdefinition1Enum),...
+-	massfluxatgate('name','MassFlux2','profilename',['../Exp/MassFlux2.exp'],'definitionenum',Outputdefinition2Enum),...
+-	massfluxatgate('name','MassFlux3','profilename',['../Exp/MassFlux3.exp'],'definitionenum',Outputdefinition3Enum),...
+-	massfluxatgate('name','MassFlux4','profilename',['../Exp/MassFlux4.exp'],'definitionenum',Outputdefinition4Enum),...
+-	massfluxatgate('name','MassFlux5','profilename',['../Exp/MassFlux5.exp'],'definitionenum',Outputdefinition5Enum),...
+-	massfluxatgate('name','MassFlux6','profilename',['../Exp/MassFlux6.exp'],'definitionenum',Outputdefinition6Enum)...
++	massfluxatgate('name','MassFlux1','profilename',['../Exp/MassFlux1.exp'],'definitionenum',Outputdefinition1Enum()),...
++	massfluxatgate('name','MassFlux2','profilename',['../Exp/MassFlux2.exp'],'definitionenum',Outputdefinition2Enum()),...
++	massfluxatgate('name','MassFlux3','profilename',['../Exp/MassFlux3.exp'],'definitionenum',Outputdefinition3Enum()),...
++	massfluxatgate('name','MassFlux4','profilename',['../Exp/MassFlux4.exp'],'definitionenum',Outputdefinition4Enum()),...
++	massfluxatgate('name','MassFlux5','profilename',['../Exp/MassFlux5.exp'],'definitionenum',Outputdefinition5Enum()),...
++	massfluxatgate('name','MassFlux6','profilename',['../Exp/MassFlux6.exp'],'definitionenum',Outputdefinition6Enum())...
+ 	};
+ 
+ md=solve(md,StressbalanceSolutionEnum());
+Index: ../trunk-jpl/test/NightlyRun/test101.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test101.py	(revision 18943)
++++ ../trunk-jpl/test/NightlyRun/test101.py	(revision 18944)
+@@ -18,12 +18,12 @@
+ #outputs
+ md.stressbalance.requested_outputs=['default','DeviatoricStressxx','DeviatoricStressyy','DeviatoricStressxy','MassFlux1','MassFlux2','MassFlux3','MassFlux4','MassFlux5','MassFlux6']
+ md.outputdefinition.definitions=[
+-		massfluxatgate('MassFlux1','../Exp/MassFlux1.exp'),
+-		massfluxatgate('MassFlux2','../Exp/MassFlux2.exp'),
+-		massfluxatgate('MassFlux3','../Exp/MassFlux3.exp'),
+-		massfluxatgate('MassFlux4','../Exp/MassFlux4.exp'),
+-		massfluxatgate('MassFlux5','../Exp/MassFlux5.exp'),
+-		massfluxatgate('MassFlux6','../Exp/MassFlux6.exp')
++		massfluxatgate('name','MassFlux1','profilename','../Exp/MassFlux1.exp','definitionenum',Outputdefinition1Enum()),
++		massfluxatgate('name','MassFlux2','profilename','../Exp/MassFlux2.exp','definitionenum',Outputdefinition2Enum()),
++		massfluxatgate('name','MassFlux3','profilename','../Exp/MassFlux3.exp','definitionenum',Outputdefinition3Enum()),
++		massfluxatgate('name','MassFlux4','profilename','../Exp/MassFlux4.exp','definitionenum',Outputdefinition4Enum()),
++		massfluxatgate('name','MassFlux5','profilename','../Exp/MassFlux5.exp','definitionenum',Outputdefinition5Enum()),
++		massfluxatgate('name','MassFlux6','profilename','../Exp/MassFlux6.exp','definitionenum',Outputdefinition6Enum())
+ 		]
+ 
+ md=solve(md,StressbalanceSolutionEnum())
+Index: ../trunk-jpl/src/m/classes/massfluxatgate.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/massfluxatgate.m	(revision 18943)
++++ ../trunk-jpl/src/m/classes/massfluxatgate.m	(revision 18944)
+@@ -7,12 +7,12 @@
+ classdef massfluxatgate
+ 	properties (SetAccess=public)  
+ 		%massfluxatgate 
+-		name                = '';
+-		definitionenum     = NaN; %enum that identifies this output definition uniquely, from Outputdefinition[1-10]Enum
+-		profilename            = ''; 
++		name            = '';
++		definitionenum  = 0;
++		profilename     = ''; 
+ 	end
+ 	properties (SetAccess=private)  
+-		segments            = NaN;
++		segments        = NaN;
+ 	end
+ 	methods
+ 		function obj = massfluxatgate(varargin) % {{{
+@@ -39,7 +39,7 @@
+ 				error('massfluxatgate error message: ''profilename'' field should be a string!');
+ 			end
+ 			
+-			md = checkfield(md,'fieldname','obj.definitionenum','field',obj.definitionenum,'values',[Outputdefinition1Enum,Outputdefinition2Enum,Outputdefinition3Enum,Outputdefinition4Enum,Outputdefinition5Enum,Outputdefinition6Enum,Outputdefinition7Enum,Outputdefinition8Enum,Outputdefinition9Enum,Outputdefinition10Enum]);
++			md = checkfield(md,'field',obj.definitionenum,'values',[Outputdefinition1Enum(),Outputdefinition2Enum(),Outputdefinition3Enum(),Outputdefinition4Enum(),Outputdefinition5Enum(),Outputdefinition6Enum(),Outputdefinition7Enum(),Outputdefinition8Enum(),Outputdefinition9Enum(),Outputdefinition10Enum()]);
+ 
+ 			%check the profilename points to a file!: 
+ 			if exist(obj.profilename,'file')~=2,
+@@ -51,6 +51,7 @@
+ 
+ 			fielddisplay(obj,'name','identifier for this massfluxatgate response');
+ 			fielddisplay(obj,'profilename','name of file (shapefile or argus file) defining a profile (or gate)');
++			fielddisplay(obj,'definitionenum','enum that identifies this output definition uniquely, from Outputdefinition[1-10]Enum');
+ 			
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+Index: ../trunk-jpl/src/m/classes/massfluxatgate.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/massfluxatgate.py	(revision 18943)
++++ ../trunk-jpl/src/m/classes/massfluxatgate.py	(revision 18944)
+@@ -1,5 +1,6 @@
+ from fielddisplay import fielddisplay
+ from EnumDefinitions import *
++from pairoptions import pairoptions
+ from checkfield import checkfield
+ from WriteData import WriteData
+ from MeshProfileIntersection import MeshProfileIntersection
+@@ -13,16 +14,28 @@
+ 		  massfluxatgate=massfluxatgate('GateName','PathToExpFile')
+ 	"""
+ 
+-	def __init__(self,name,profilename): # {{{
+-		self.name           = name
+-		self.profilename    = profilename
+-		self.segments       = float('NaN')
++	def __init__(self,*args): # {{{
+ 
++		self.name            = ''
++		self.definitionenum  = 0
++		self.profilename     = ''
++		self.segments        = float('NaN')
++
++		#set defaults
++		self.setdefaultparameters()
++
++		#use provided options to change fields
++		options=pairoptions(*args)
++
++		#OK get other fields
++		self=options.AssignObjectFields(self)
++
+ 		#}}}
+ 	def __repr__(self): # {{{
+ 
+ 		string="   Massfluxatgate:"
+ 		string="%s\n%s"%(string,fielddisplay(self,'name','identifier for this massfluxatgate response'))
++		string="%s\n%s"%(string,fielddisplay(self,'definitionenum','enum that identifies this output definition uniquely, from Outputdefinition[1-10]Enum'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'profilename','name of file (shapefile or argus file) defining a profile (or gate)'))
+ 		return string
+ 		#}}}
+@@ -36,6 +49,8 @@
+ 			
+ 		if  not isinstance(self.profilename, basestring):
+ 			raise RuntimeError("massfluxatgate error message: 'profilename' field should be a string!") 
++
++			md = checkfield(md,'field',self.definitionenum,'values',[Outputdefinition1Enum(),Outputdefinition2Enum(),Outputdefinition3Enum(),Outputdefinition4Enum(),Outputdefinition5Enum(),Outputdefinition6Enum(),Outputdefinition7Enum(),Outputdefinition8Enum(),Outputdefinition9Enum(),Outputdefinition10Enum()])
+ 		
+ 		#check the profilename points to a file!: 
+ 		if not os.path.isfile(self.profilename):
+@@ -50,6 +65,7 @@
+ 
+ 		#ok, marshall name and segments: 
+ 		WriteData(fid,'object',self,'fieldname','name','format','String')
++		WriteData(fid,'object',self,'fieldname','definitionenum','format','Integer')
+ 		WriteData(fid,'object',self,'fieldname','segments','format','DoubleMat','mattype',1)
+ 
+ 	# }}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18944-18945.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18944-18945.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18944-18945.diff	(revision 19102)
@@ -0,0 +1,144 @@
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18944)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18945)
+@@ -697,6 +697,10 @@
+ 	MisfitWeightsEnumEnum,
+ 	SurfaceObservationEnum,
+ 	WeightsSurfaceObservationEnum,
++	VxObsEnum,
++	WeightsVxObsEnum,
++	VyObsEnum,
++	WeightsVyObsEnum,
+ 	/*}}}*/
+ 	/*Responses{{{*/
+ 	MinVelEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18944)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18945)
+@@ -682,6 +682,10 @@
+ 		case MisfitWeightsEnumEnum : return "MisfitWeightsEnum";
+ 		case SurfaceObservationEnum : return "SurfaceObservation";
+ 		case WeightsSurfaceObservationEnum : return "WeightsSurfaceObservation";
++		case VxObsEnum : return "VxObs";
++		case WeightsVxObsEnum : return "WeightsVxObs";
++		case VyObsEnum : return "VyObs";
++		case WeightsVyObsEnum : return "WeightsVyObs";
+ 		case MinVelEnum : return "MinVel";
+ 		case MaxVelEnum : return "MaxVel";
+ 		case MinVxEnum : return "MinVx";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18944)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18945)
+@@ -697,6 +697,10 @@
+ 	      else if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
+ 	      else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
+ 	      else if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
++	      else if (strcmp(name,"VxObs")==0) return VxObsEnum;
++	      else if (strcmp(name,"WeightsVxObs")==0) return WeightsVxObsEnum;
++	      else if (strcmp(name,"VyObs")==0) return VyObsEnum;
++	      else if (strcmp(name,"WeightsVyObs")==0) return WeightsVyObsEnum;
+ 	      else if (strcmp(name,"MinVel")==0) return MinVelEnum;
+ 	      else if (strcmp(name,"MaxVel")==0) return MaxVelEnum;
+ 	      else if (strcmp(name,"MinVx")==0) return MinVxEnum;
+@@ -747,14 +751,14 @@
+ 	      else if (strcmp(name,"Nodal")==0) return NodalEnum;
+ 	      else if (strcmp(name,"OldGradient")==0) return OldGradientEnum;
+ 	      else if (strcmp(name,"OutputFilePointer")==0) return OutputFilePointerEnum;
+-	      else if (strcmp(name,"ToolkitsFileName")==0) return ToolkitsFileNameEnum;
++         else stage=7;
++   }
++   if(stage==7){
++	      if (strcmp(name,"ToolkitsFileName")==0) return ToolkitsFileNameEnum;
+ 	      else if (strcmp(name,"RootPath")==0) return RootPathEnum;
+ 	      else if (strcmp(name,"OutputFileName")==0) return OutputFileNameEnum;
+ 	      else if (strcmp(name,"InputFileName")==0) return InputFileNameEnum;
+-         else stage=7;
+-   }
+-   if(stage==7){
+-	      if (strcmp(name,"LockFileName")==0) return LockFileNameEnum;
++	      else if (strcmp(name,"LockFileName")==0) return LockFileNameEnum;
+ 	      else if (strcmp(name,"ToolkitsOptionsAnalyses")==0) return ToolkitsOptionsAnalysesEnum;
+ 	      else if (strcmp(name,"ToolkitsOptionsStrings")==0) return ToolkitsOptionsStringsEnum;
+ 	      else if (strcmp(name,"QmuErrName")==0) return QmuErrNameEnum;
+Index: ../trunk-jpl/src/m/enum/WeightsVxObsEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/WeightsVxObsEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/WeightsVxObsEnum.m	(revision 18945)
+@@ -0,0 +1,11 @@
++function macro=WeightsVxObsEnum()
++%WEIGHTSVXOBSENUM - Enum of WeightsVxObs
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=WeightsVxObsEnum()
++
++macro=StringToEnum('WeightsVxObs');
+Index: ../trunk-jpl/src/m/enum/VxObsEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/VxObsEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/VxObsEnum.m	(revision 18945)
+@@ -0,0 +1,11 @@
++function macro=VxObsEnum()
++%VXOBSENUM - Enum of VxObs
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=VxObsEnum()
++
++macro=StringToEnum('VxObs');
+Index: ../trunk-jpl/src/m/enum/WeightsVyObsEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/WeightsVyObsEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/WeightsVyObsEnum.m	(revision 18945)
+@@ -0,0 +1,11 @@
++function macro=WeightsVyObsEnum()
++%WEIGHTSVYOBSENUM - Enum of WeightsVyObs
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=WeightsVyObsEnum()
++
++macro=StringToEnum('WeightsVyObs');
+Index: ../trunk-jpl/src/m/enum/VyObsEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/VyObsEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/VyObsEnum.m	(revision 18945)
+@@ -0,0 +1,11 @@
++function macro=VyObsEnum()
++%VYOBSENUM - Enum of VyObs
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=VyObsEnum()
++
++macro=StringToEnum('VyObs');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18944)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18945)
+@@ -674,6 +674,10 @@
+ def MisfitWeightsEnumEnum(): return StringToEnum("MisfitWeightsEnum")[0]
+ def SurfaceObservationEnum(): return StringToEnum("SurfaceObservation")[0]
+ def WeightsSurfaceObservationEnum(): return StringToEnum("WeightsSurfaceObservation")[0]
++def VxObsEnum(): return StringToEnum("VxObs")[0]
++def WeightsVxObsEnum(): return StringToEnum("WeightsVxObs")[0]
++def VyObsEnum(): return StringToEnum("VyObs")[0]
++def WeightsVyObsEnum(): return StringToEnum("WeightsVyObs")[0]
+ def MinVelEnum(): return StringToEnum("MinVel")[0]
+ def MaxVelEnum(): return StringToEnum("MaxVel")[0]
+ def MinVxEnum(): return StringToEnum("MinVx")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18945-18946.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18945-18946.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18945-18946.diff	(revision 19102)
@@ -0,0 +1,755 @@
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/NodesPartitioning.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/NodesPartitioning.cpp	(revision 18945)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/NodesPartitioning.cpp	(revision 18946)
+@@ -82,47 +82,49 @@
+ 	/*Get faces and elements*/
+ 	CreateFaces(iomodel);
+ 
+-	/*!All elements have been partitioned above, only create elements for this CPU: */
+-	for(int i=0;i<iomodel->numberoffaces;i++){
++	if(iomodel->domaintype==Domain2DhorizontalEnum){
++		/*!All elements have been partitioned above, only create elements for this CPU: */
++		for(int i=0;i<iomodel->numberoffaces;i++){
+ 
+-		/*Get left and right elements*/
+-		e1=iomodel->faces[4*i+2]-1; //faces are [node1 node2 elem1 elem2]
+-		e2=iomodel->faces[4*i+3]-1; //faces are [node1 node2 elem1 elem2]
++			/*Get left and right elements*/
++			e1=iomodel->faces[4*i+2]-1; //faces are [node1 node2 elem1 elem2]
++			e2=iomodel->faces[4*i+3]-1; //faces are [node1 node2 elem1 elem2]
+ 
+-		/* 1) If the element e1 is in the current partition
+-		 * 2) and if the face of the element is shared by another element (internal face)
+-		 * 3) and if this element is not in the same partition:
+-		 * we must clone the nodes on this partition so that the loads (Numericalflux)
+-		 * will have access to their properties (dofs,...)*/
+-		if(my_elements[e1] && e2!=-2 && !my_elements[e2]){
++			/* 1) If the element e1 is in the current partition
++			 * 2) and if the face of the element is shared by another element (internal face)
++			 * 3) and if this element is not in the same partition:
++			 * we must clone the nodes on this partition so that the loads (Numericalflux)
++			 * will have access to their properties (dofs,...)*/
++			if(my_elements[e1] && e2!=-2 && !my_elements[e2]){
+ 
+-			/*1: Get vertices ids*/
+-			i1=iomodel->faces[4*i+0];
+-			i2=iomodel->faces[4*i+1];
++				/*1: Get vertices ids*/
++				i1=iomodel->faces[4*i+0];
++				i2=iomodel->faces[4*i+1];
+ 
+-			/*2: Get the column where these ids are located in the index*/
+-			pos=UNDEF;
+-			for(int j=0;j<3;j++){
+-				if(iomodel->elements[3*e2+j]==i1) pos=j;
+-			}
++				/*2: Get the column where these ids are located in the index*/
++				pos=UNDEF;
++				for(int j=0;j<3;j++){
++					if(iomodel->elements[3*e2+j]==i1) pos=j;
++				}
+ 
+-			/*3: We have the id of the elements and the position of the vertices in the index
+-			 * we can now create the corresponding nodes:*/
+-			if(pos==0){
+-				my_nodes[e2*3+0]=true;
+-				my_nodes[e2*3+2]=true;
++				/*3: We have the id of the elements and the position of the vertices in the index
++				 * we can now create the corresponding nodes:*/
++				if(pos==0){
++					my_nodes[e2*3+0]=true;
++					my_nodes[e2*3+2]=true;
++				}
++				else if(pos==1){
++					my_nodes[e2*3+1]=true;
++					my_nodes[e2*3+0]=true;
++				}
++				else if(pos==2){
++					my_nodes[e2*3+2]=true;
++					my_nodes[e2*3+1]=true;
++				}
++				else{
++					_error_("Problem in faces creation");
++				}
+ 			}
+-			else if(pos==1){
+-				my_nodes[e2*3+1]=true;
+-				my_nodes[e2*3+0]=true;
+-			}
+-			else if(pos==2){
+-				my_nodes[e2*3+2]=true;
+-				my_nodes[e2*3+1]=true;
+-			}
+-			else{
+-				_error_("Problem in faces creation");
+-			}
+ 		}
+ 	}
+ 
+Index: ../trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 18945)
++++ ../trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 18946)
+@@ -84,8 +84,8 @@
+ 		element->GetInputListOnVertices(s,SurfaceEnum);
+ 
+ 		/*Get material parameters :*/
+-		rho_ice=element->matpar->GetRhoIce();
+-		rho_water=element->matpar->GetRhoFreshwater();
++		rho_ice=element->matpar->GetMaterialParameter(MaterialsRhoIceEnum);
++		rho_water=element->matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
+ 
+ 		// loop over all vertices
+ 		for(v=0;v<numvertices;v++){
+Index: ../trunk-jpl/src/c/classes/Materials/Matice.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Matice.cpp	(revision 18945)
++++ ../trunk-jpl/src/c/classes/Materials/Matice.cpp	(revision 18946)
+@@ -63,32 +63,8 @@
+ /*}}}*/
+ 
+ /*Object virtual functions definitions:*/
+-void Matice::Echo(void){/*{{{*/
++Object*   Matice::copy() {/*{{{*/
+ 
+-	_printf_("Matice:\n");
+-	_printf_("   mid: " << mid << "\n");
+-	_printf_("   element:\n");
+-	helement->Echo();
+-}
+-/*}}}*/
+-void Matice::DeepEcho(void){/*{{{*/
+-
+-	_printf_("Matice:\n");
+-	_printf_("   mid: " << mid << "\n");
+-	_printf_("   element:\n");
+-	helement->Echo();
+-}		
+-/*}}}*/
+-int    Matice::Id(void){ return mid; }/*{{{*/
+-/*}}}*/
+-int Matice::ObjectEnum(void){/*{{{*/
+-
+-	return MaticeEnum;
+-
+-}
+-/*}}}*/
+-Object* Matice::copy() {/*{{{*/
+-
+ 	/*Output*/
+ 	Matice* matice=NULL;
+ 
+@@ -121,7 +97,31 @@
+ 	return matice;
+ }
+ /*}}}*/
++void      Matice::DeepEcho(void){/*{{{*/
+ 
++	_printf_("Matice:\n");
++	_printf_("   mid: " << mid << "\n");
++	_printf_("   element:\n");
++	helement->Echo();
++}		
++/*}}}*/
++void      Matice::Echo(void){/*{{{*/
++
++	_printf_("Matice:\n");
++	_printf_("   mid: " << mid << "\n");
++	_printf_("   element:\n");
++	helement->Echo();
++}
++/*}}}*/
++int       Matice::Id(void){ return mid; }/*{{{*/
++/*}}}*/
++int       Matice::ObjectEnum(void){/*{{{*/
++
++	return MaticeEnum;
++
++}
++/*}}}*/
++
+ /*Matice management*/
+ void  Matice::Configure(Elements* elementsin){/*{{{*/
+ 
+Index: ../trunk-jpl/src/c/classes/Materials/Material.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Material.h	(revision 18945)
++++ ../trunk-jpl/src/c/classes/Materials/Material.h	(revision 18946)
+@@ -24,21 +24,21 @@
+ 		/*Numerics*/
+ 		virtual Material*  copy2(Element* element)=0;
+ 		virtual void       Configure(Elements* elements)=0;
++		virtual IssmDouble GetA()=0;
++		virtual IssmDouble GetAbar()=0;
++		virtual IssmDouble GetB()=0;
++		virtual IssmDouble GetBbar()=0;
++		virtual IssmDouble GetD()=0;
++		virtual IssmDouble GetDbar()=0;
++		virtual IssmDouble GetN()=0;
+ 		virtual void       GetViscosity(IssmDouble* pviscosity,IssmDouble epseff)=0;
+-		virtual void       GetViscosity_B(IssmDouble* pviscosity,IssmDouble epseff)=0;
+-		virtual void       GetViscosity_D(IssmDouble* pviscosity,IssmDouble epseff)=0;
+ 		virtual void       GetViscosityBar(IssmDouble* pviscosity,IssmDouble epseff)=0;
+ 		virtual void       GetViscosityComplement(IssmDouble* pviscosity_complement, IssmDouble* pepsilon)=0;
+ 		virtual void       GetViscosityDComplement(IssmDouble* pviscosity_complement, IssmDouble* pepsilon)=0;
+ 		virtual void       GetViscosityDerivativeEpsSquare(IssmDouble* pmu_prime, IssmDouble* pepsilon)=0;
++		virtual void       GetViscosity_B(IssmDouble* pviscosity,IssmDouble epseff)=0;
++		virtual void       GetViscosity_D(IssmDouble* pviscosity,IssmDouble epseff)=0;
+ 		virtual void       GetViscosity2dDerivativeEpsSquare(IssmDouble* pmu_prime, IssmDouble* pepsilon)=0;
+-		virtual IssmDouble GetA()=0;
+-		virtual IssmDouble GetAbar()=0;
+-		virtual IssmDouble GetB()=0;
+-		virtual IssmDouble GetBbar()=0;
+-		virtual IssmDouble GetN()=0;
+-		virtual IssmDouble GetD()=0;
+-		virtual IssmDouble GetDbar()=0;
+ 		virtual bool       IsDamage()=0;
+ 		virtual void       ResetHooks()=0;
+ 
+Index: ../trunk-jpl/src/c/classes/Materials/Matpar.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 18945)
++++ ../trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 18946)
+@@ -303,107 +303,31 @@
+ /*}}}*/
+ 
+ /*Matpar management: */
+-void  Matpar::Configure(Elements* elementsin){/*{{{*/
++void       Matpar::Configure(Elements* elementsin){/*{{{*/
+ 
+ 	/*nothing done yet!*/
+ 
+ }
+ /*}}}*/
+-IssmDouble Matpar::GetMaterialParameter(int enum_in){/*{{{*/
++void       Matpar::EnthalpyToThermal(IssmDouble* ptemperature,IssmDouble* pwaterfraction,IssmDouble enthalpy,IssmDouble pressure){/*{{{*/
+ 
+-	switch(enum_in){
+-		case MaterialsRhoIceEnum:                    return this->rho_ice;
+-		case MaterialsRhoSeawaterEnum:                  return this->rho_water;
+-		case MaterialsRhoFreshwaterEnum:             return this->rho_freshwater;
+-		case MaterialsMuWaterEnum:                   return this->mu_water;
+-		case MaterialsHeatcapacityEnum:              return this->heatcapacity;
+-		case MaterialsThermalconductivityEnum:       return this->thermalconductivity;
+-		case MaterialsTemperateiceconductivityEnum:  return this->temperateiceconductivity;
+-		case MaterialsLatentheatEnum:                return this->latentheat;
+-		case MaterialsBetaEnum:                      return this->beta;
+-		case MaterialsMeltingpointEnum:              return this->meltingpoint;
+-		case ConstantsReferencetemperatureEnum:      return this->referencetemperature;
+-		case MaterialsMixedLayerCapacityEnum:        return this->mixed_layer_capacity;
+-		case MaterialsThermalExchangeVelocityEnum:   return this->thermal_exchange_velocity;
+-		case HydrologydcSedimentPorosityEnum:        return this->sediment_porosity;
+-		case HydrologydcSedimentThicknessEnum:       return this->sediment_thickness;
+-		case HydrologydcSedimentCompressibilityEnum: return this->sediment_compressibility;
+-		case HydrologydcEplPorosityEnum:             return this->epl_porosity;
+-		case HydrologydcEplCompressibilityEnum:      return this->epl_compressibility;
+-		case HydrologydcEplConductivityEnum:         return this->epl_conductivity;
+-		case HydrologydcEplInitialThicknessEnum:     return this->epl_init_thickness;
+-		case HydrologydcEplColapseThicknessEnum:     return this->epl_colapse_thickness;
+-		case HydrologydcEplMaxThicknessEnum:         return this->epl_max_thickness;
+-		case HydrologydcWaterCompressibilityEnum:    return this->water_compressibility;
+-		case ConstantsGEnum:                         return this->g;
+-		case MaterialsPoissonEnum:                   return this->poisson;
+-		case MaterialsYoungModulusEnum:              return this->young_modulus;
+-		case MaterialsRidgingExponentEnum:				return this->ridging_exponent;
+-		case MaterialsCohesionEnum:		            return this->cohesion;
+-		case MaterialsInternalFrictionCoefEnum:		return this->internal_friction_coef;
+-		case MaterialsCompressionCoefEnum:				return this->compression_coef;
+-		case MaterialsTractionCoefEnum:					return this->traction_coef;
+-		case ConstantsOmegaEnum:							return this->omega;
+-		case MaterialsTimeRelaxationStressEnum:		return this->time_relaxation_stress;
+-		case MaterialsTimeRelaxationDamageEnum:		return this->time_relaxation_damage;
+-		default: _error_("Enum "<<EnumToStringx(enum_in)<<" not supported yet");
++	/*Ouput*/
++	IssmDouble temperature,waterfraction;
++
++	if(enthalpy<PureIceEnthalpy(pressure)){
++		temperature=referencetemperature+enthalpy/heatcapacity;
++		waterfraction=0.;
+ 	}
++	else{
++		temperature=TMeltingPoint(pressure);
++		waterfraction=(enthalpy-PureIceEnthalpy(pressure))/latentheat;
++	}
+ 
++	/*Assign output pointers:*/
++	*pwaterfraction=waterfraction;
++	*ptemperature=temperature;
+ }
+ /*}}}*/
+-IssmDouble Matpar::GetBeta(){/*{{{*/
+-	return beta;
+-}
+-/*}}}*/
+-IssmDouble Matpar::GetG(){/*{{{*/
+-	return g;
+-}
+-/*}}}*/
+-IssmDouble Matpar::GetMeltingPoint(){/*{{{*/
+-	return meltingpoint;
+-}
+-/*}}}*/
+-IssmDouble Matpar::GetRhoIce(){/*{{{*/
+-
+-	return rho_ice;
+-}
+-/*}}}*/
+-IssmDouble Matpar::GetRhoWater(){/*{{{*/
+-	return rho_water;
+-}
+-/*}}}*/
+-IssmDouble Matpar::GetRhoFreshwater(){/*{{{*/
+-	return rho_freshwater;
+-}
+-/*}}}*/
+-IssmDouble Matpar::GetDesFac(){/*{{{*/
+-	return desfac;
+-}
+-/*}}}*/
+-IssmDouble Matpar::GetS0p(){/*{{{*/
+-	return s0p;
+-}
+-/*}}}*/
+-IssmDouble Matpar::GetS0t(){/*{{{*/
+-	return s0t;
+-}
+-/*}}}*/
+-IssmDouble Matpar::GetRlaps(){/*{{{*/
+-	return rlaps;
+-}
+-/*}}}*/
+-IssmDouble Matpar::GetRlapslgm(){/*{{{*/
+-	return rlapslgm;
+-}
+-/*}}}*/
+-IssmDouble Matpar::TMeltingPoint(IssmDouble pressure){/*{{{*/
+-	return meltingpoint-beta*pressure;
+-}
+-/*}}}*/
+-IssmDouble Matpar::PureIceEnthalpy(IssmDouble pressure){/*{{{*/
+-	return heatcapacity*(TMeltingPoint(pressure)-referencetemperature);
+-}
+-/*}}}*/
+ IssmDouble Matpar::GetEnthalpyDiffusionParameter(IssmDouble enthalpy,IssmDouble pressure){/*{{{*/
+ 	if (enthalpy<PureIceEnthalpy(pressure))
+ 		return thermalconductivity/heatcapacity;
+@@ -457,27 +381,69 @@
+ 	return kappa;
+ }
+ /*}}}*/
+-void Matpar::EnthalpyToThermal(IssmDouble* ptemperature,IssmDouble* pwaterfraction,IssmDouble enthalpy,IssmDouble pressure){/*{{{*/
++IssmDouble Matpar::GetMaterialParameter(int enum_in){/*{{{*/
+ 
+-	/*Ouput*/
+-	IssmDouble temperature,waterfraction;
+-
+-	if(enthalpy<PureIceEnthalpy(pressure)){
+-		temperature=referencetemperature+enthalpy/heatcapacity;
+-		waterfraction=0.;
++	switch(enum_in){
++		case MaterialsRhoIceEnum:                    return this->rho_ice;
++		case MaterialsRhoSeawaterEnum:               return this->rho_water;
++		case MaterialsRhoFreshwaterEnum:             return this->rho_freshwater;
++		case MaterialsMuWaterEnum:                   return this->mu_water;
++		case MaterialsHeatcapacityEnum:              return this->heatcapacity;
++		case MaterialsThermalconductivityEnum:       return this->thermalconductivity;
++		case MaterialsTemperateiceconductivityEnum:  return this->temperateiceconductivity;
++		case MaterialsLatentheatEnum:                return this->latentheat;
++		case MaterialsBetaEnum:                      return this->beta;
++		case MaterialsMeltingpointEnum:              return this->meltingpoint;
++		case ConstantsReferencetemperatureEnum:      return this->referencetemperature;
++		case MaterialsMixedLayerCapacityEnum:        return this->mixed_layer_capacity;
++		case MaterialsThermalExchangeVelocityEnum:   return this->thermal_exchange_velocity;
++		case HydrologydcSedimentPorosityEnum:        return this->sediment_porosity;
++		case HydrologydcSedimentThicknessEnum:       return this->sediment_thickness;
++		case HydrologydcSedimentCompressibilityEnum: return this->sediment_compressibility;
++		case HydrologydcEplPorosityEnum:             return this->epl_porosity;
++		case HydrologydcEplCompressibilityEnum:      return this->epl_compressibility;
++		case HydrologydcEplConductivityEnum:         return this->epl_conductivity;
++		case HydrologydcEplInitialThicknessEnum:     return this->epl_init_thickness;
++		case HydrologydcEplColapseThicknessEnum:     return this->epl_colapse_thickness;
++		case HydrologydcEplMaxThicknessEnum:         return this->epl_max_thickness;
++		case HydrologydcWaterCompressibilityEnum:    return this->water_compressibility;
++		case ConstantsGEnum:                         return this->g;
++		case MaterialsPoissonEnum:                   return this->poisson;
++		case MaterialsYoungModulusEnum:              return this->young_modulus;
++		case MaterialsRidgingExponentEnum:				return this->ridging_exponent;
++		case MaterialsCohesionEnum:		            return this->cohesion;
++		case MaterialsInternalFrictionCoefEnum:		return this->internal_friction_coef;
++		case MaterialsCompressionCoefEnum:				return this->compression_coef;
++		case MaterialsTractionCoefEnum:					return this->traction_coef;
++		case SurfaceforcingsDesfacEnum:              return this->desfac;
++		case SurfaceforcingsS0pEnum:                 return this->s0p;
++		case SurfaceforcingsS0tEnum:                 return this->s0t;
++		case SurfaceforcingsRlapsEnum:               return this->rlaps;
++		case SurfaceforcingsRlapslgmEnum:            return this->rlapslgm;
++		case MaterialsLithosphereShearModulusEnum:   return this->lithosphere_shear_modulus;
++		case MaterialsLithosphereDensityEnum:        return this->lithosphere_density;
++		case MaterialsMantleDensityEnum:             return this->mantle_density;
++		case MaterialsMantleShearModulusEnum:        return this->mantle_shear_modulus;
++		case ConstantsOmegaEnum:							return this->omega;
++		case MaterialsTimeRelaxationStressEnum:		return this->time_relaxation_stress;
++		case MaterialsTimeRelaxationDamageEnum:		return this->time_relaxation_damage;
++		default: _error_("Enum "<<EnumToStringx(enum_in)<<" not supported yet");
+ 	}
+-	else{
+-		temperature=TMeltingPoint(pressure);
+-		waterfraction=(enthalpy-PureIceEnthalpy(pressure))/latentheat;
+-	}
+ 
+-	/*Assign output pointers:*/
+-	*pwaterfraction=waterfraction;
+-	*ptemperature=temperature;
+ }
+ /*}}}*/
+-void Matpar::ThermalToEnthalpy(IssmDouble * penthalpy,IssmDouble temperature,IssmDouble waterfraction,IssmDouble pressure){/*{{{*/
++IssmDouble Matpar::PureIceEnthalpy(IssmDouble pressure){/*{{{*/
++	return heatcapacity*(TMeltingPoint(pressure)-referencetemperature);
++}
++/*}}}*/
++void       Matpar::ResetHooks(){/*{{{*/
+ 
++	//Nothing to be done
++	return;
++}
++/*}}}*/
++void       Matpar::ThermalToEnthalpy(IssmDouble * penthalpy,IssmDouble temperature,IssmDouble waterfraction,IssmDouble pressure){/*{{{*/
++
+ 	/*Ouput*/
+ 	IssmDouble enthalpy;
+ 
+@@ -492,25 +458,7 @@
+ 	*penthalpy=enthalpy;
+ }
+ /*}}}*/
+-IssmDouble Matpar::GetLithosphereShearModulus(){		 /*{{{*/
+-	return lithosphere_shear_modulus;			 
+-}		 
+-/*}}}*/ 
+-IssmDouble Matpar::GetLithosphereDensity(){		 /*{{{*/
+-	return lithosphere_density;			 
+-}		 
+-/*}}}*/ 
+-IssmDouble Matpar::GetMantleDensity(){		 /*{{{*/
+-	return mantle_density;			 
+-}		 
+-/*}}}*/ 
+-IssmDouble Matpar::GetMantleShearModulus(){		 /*{{{*/
+-	return mantle_shear_modulus;			 
+-}		 
+-/*}}}*/ 
+-void  Matpar::ResetHooks(){/*{{{*/
+-
+-	//Nothing to be done
+-	return;
++IssmDouble Matpar::TMeltingPoint(IssmDouble pressure){/*{{{*/
++	return meltingpoint-beta*pressure;
+ }
+ /*}}}*/
+Index: ../trunk-jpl/src/c/classes/Materials/Matpar.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Matpar.h	(revision 18945)
++++ ../trunk-jpl/src/c/classes/Materials/Matpar.h	(revision 18946)
+@@ -109,28 +109,13 @@
+ 		void       ResetHooks();
+ 		/*}}}*/
+ 		/*Numerics: {{{*/
+-		IssmDouble GetG();
+-		IssmDouble GetRhoIce();
+-		IssmDouble GetRhoWater();
+-		IssmDouble GetRhoFreshwater();
+-		IssmDouble GetBeta();
+-		IssmDouble GetMeltingPoint();
+-		IssmDouble TMeltingPoint(IssmDouble pressure);
+-		IssmDouble PureIceEnthalpy(IssmDouble pressure);
++		void       EnthalpyToThermal(IssmDouble* ptemperature,IssmDouble* pwaterfraction,IssmDouble enthalpy,IssmDouble pressure);
+ 		IssmDouble GetEnthalpyDiffusionParameter(IssmDouble enthalpy,IssmDouble pressure);
+ 		IssmDouble GetEnthalpyDiffusionParameterVolume(int numvertices,IssmDouble* enthalpy,IssmDouble* pressure);
+-		IssmDouble GetLithosphereShearModulus();
+-		IssmDouble GetLithosphereDensity();
+-		IssmDouble GetMantleShearModulus();
+-		IssmDouble GetMantleDensity();
+-		void       EnthalpyToThermal(IssmDouble* ptemperature,IssmDouble* pwaterfraction,IssmDouble enthalpy,IssmDouble pressure);
++		IssmDouble GetMaterialParameter(int in_enum); 
++		IssmDouble PureIceEnthalpy(IssmDouble pressure);
+ 		void       ThermalToEnthalpy(IssmDouble* penthalpy,IssmDouble temperature,IssmDouble waterfraction,IssmDouble pressure);
+-		IssmDouble GetDesFac();
+-		IssmDouble GetS0p(); 
+-		IssmDouble GetS0t(); 
+-		IssmDouble GetRlaps(); 
+-		IssmDouble GetRlapslgm(); 
+-		IssmDouble GetMaterialParameter(int in_enum); 
++		IssmDouble TMeltingPoint(IssmDouble pressure);
+ 		/*}}}*/
+ 
+ };
+Index: ../trunk-jpl/src/c/classes/Loads/Pengrid.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Pengrid.cpp	(revision 18945)
++++ ../trunk-jpl/src/c/classes/Loads/Pengrid.cpp	(revision 18946)
+@@ -575,7 +575,7 @@
+ 	parameters->FindParam(&penalty_factor,ThermalPenaltyFactorEnum);
+ 
+ 	/*Compute pressure melting point*/
+-	t_pmp=matpar->GetMeltingPoint()-matpar->GetBeta()*pressure;
++	t_pmp=matpar->GetMaterialParameter(MaterialsMeltingpointEnum)-matpar->GetMaterialParameter(MaterialsBetaEnum)*pressure;
+ 
+ 	/*Add penalty load*/
+ 	if (temperature<t_pmp){ //If T<Tpmp, there must be no melting. Therefore, melting should be  constrained to 0 when T<Tpmp, instead of using spcs, use penalties
+@@ -650,7 +650,7 @@
+ 	parameters->FindParam(&penalty_factor,ThermalPenaltyFactorEnum);
+ 
+ 	/*Compute pressure melting point*/
+-	t_pmp=matpar->GetMeltingPoint()-matpar->GetBeta()*pressure;
++	t_pmp=matpar->GetMaterialParameter(MaterialsMeltingpointEnum)-matpar->GetMaterialParameter(MaterialsBetaEnum)*pressure;
+ 
+ 	/*Add penalty load
+ 	  This time, the penalty must have the same value as the one used for the thermal computation
+@@ -685,7 +685,7 @@
+ 	parameters->FindParam(&penalty_factor,ThermalPenaltyFactorEnum);
+ 
+ 	/*Compute pressure melting point*/
+-	t_pmp=matpar->GetMeltingPoint()-matpar->GetBeta()*pressure;
++	t_pmp=matpar->GetMaterialParameter(MaterialsMeltingpointEnum)-matpar->GetMaterialParameter(MaterialsBetaEnum)*pressure;
+ 
+ 	pe->values[0]=kmax*pow(10.,penalty_factor)*t_pmp;
+ 
+Index: ../trunk-jpl/src/c/classes/Loads/Riftfront.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Riftfront.cpp	(revision 18945)
++++ ../trunk-jpl/src/c/classes/Loads/Riftfront.cpp	(revision 18946)
+@@ -504,9 +504,9 @@
+ 	ElementVector* pe=new ElementVector(nodes,NUMVERTICES,this->parameters);
+ 
+ 	/*Get some inputs: */
+-	rho_ice=matpar->GetRhoIce();
+-	rho_water=matpar->GetRhoWater();
+-	gravity=matpar->GetG();
++	rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
++	rho_water=matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
++	gravity=matpar->GetMaterialParameter(ConstantsGEnum);
+ 	tria1->GetInputValue(&h[0],nodes[0],ThicknessEnum);
+ 	tria2->GetInputValue(&h[1],nodes[1],ThicknessEnum);
+ 	if (h[0]!=h[1])_error_("different thicknesses not supported for rift fronts");
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18945)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18946)
+@@ -757,9 +757,9 @@
+ 			sigma_nn = sigma_xx*bed_normal[0]*bed_normal[0] + sigma_yy*bed_normal[1]*bed_normal[1] + 2.*sigma_xy*bed_normal[0]*bed_normal[1];
+ 
+ 			/*Compute water pressure*/
+-			IssmDouble rho_ice   = matpar->GetRhoIce();
+-			IssmDouble rho_water = matpar->GetRhoWater();
+-			IssmDouble gravity   = matpar->GetG();
++			IssmDouble rho_ice   = matpar->GetMaterialParameter(MaterialsRhoIceEnum);
++			IssmDouble rho_water = matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
++			IssmDouble gravity   = matpar->GetMaterialParameter(ConstantsGEnum);
+ 			water_pressure=gravity*rho_water*base;
+ 
+ 			/*Compare basal stress to water pressure and determine whether it should ground*/
+@@ -1351,8 +1351,8 @@
+ 
+ 	if(!IsIceInElement() || IsFloating())return 0;
+ 
+-	rho_ice=matpar->GetRhoIce();
+-	rho_water=matpar->GetRhoWater();
++	rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
++	rho_water=matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
+ 	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+ 
+ 	/*First calculate the area of the base (cross section triangle)
+@@ -1769,7 +1769,7 @@
+ 	thickness_input=this->GetInput(ThicknessEnum); _assert_(thickness_input);
+ 	
+ 	/*Retrieve material parameters: */
+-	rho_ice=matpar->GetRhoIce();
++	rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
+ 
+ 	/*Retrieve values of the levelset defining the masscon: */
+ 	values = xNew<IssmDouble>(NUMVERTICES);
+@@ -1812,7 +1812,7 @@
+ 	GaussTria* gauss_2=NULL;
+ 
+ 	/*Get material parameters :*/
+-	rho_ice=matpar->GetRhoIce();
++	rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
+ 
+ 	/*First off, check that this segment belongs to this element: */
+ 	if (segment_id!=this->id)_error_("error message: segment with id " << segment_id << " does not belong to element with id:" << this->id);
+@@ -1875,7 +1875,7 @@
+ 	GaussTria* gauss_2=NULL;
+ 
+ 	/*Get material parameters :*/
+-	rho_ice=matpar->GetRhoIce();
++	rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
+ 
+ 	/*First off, check that this segment belongs to this element: */
+ 	if (reCast<int>(*(segment+4))!=this->id)_error_("error message: segment with id " << reCast<int>(*(segment+4)) << " does not belong to element with id:" << this->id);
+@@ -2251,15 +2251,15 @@
+   GetInputListOnVertices(&s[0],SurfaceEnum);
+ 
+   /*Get material parameters :*/
+-  rho_ice=matpar->GetRhoIce();
+-  rho_water=matpar->GetRhoFreshwater();
++  rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
++  rho_water=matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
+ 
+   /*Get other pdd parameters*/
+-  desfac=matpar->GetDesFac();
+-  s0p=matpar->GetS0p();
+-  s0t=matpar->GetS0t();
+-  rlaps=matpar->GetRlaps();
+-  rlapslgm=matpar->GetRlapslgm();
++  desfac=matpar->GetMaterialParameter(SurfaceforcingsDesfacEnum);
++  s0p=matpar->GetMaterialParameter(SurfaceforcingsS0pEnum);
++  s0t=matpar->GetMaterialParameter(SurfaceforcingsS0tEnum);
++  rlaps=matpar->GetMaterialParameter(SurfaceforcingsRlapsEnum);
++  rlapslgm=matpar->GetMaterialParameter(SurfaceforcingsRlapslgmEnum);
+      
+    /*measure the surface mass balance*/
+    for (int iv = 0; iv<NUMVERTICES; iv++){
+@@ -2284,8 +2284,8 @@
+ 	IssmDouble  rho_water,rho_ice,density;
+ 
+ 	/*material parameters: */
+-	rho_water=matpar->GetRhoWater();
+-	rho_ice=matpar->GetRhoIce();
++	rho_water=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
++	rho_ice=matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
+ 	density=rho_ice/rho_water;
+ 	GetInputListOnVertices(&h[0],ThicknessEnum);
+ 	GetInputListOnVertices(&r[0],BedEnum);
+@@ -2707,7 +2707,7 @@
+ 	IssmDouble xyz_list[NUMVERTICES][3];
+ 
+ 	/*Get material parameters :*/
+-	rho_ice=matpar->GetRhoIce();
++	rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
+ 
+    if(!IsIceInElement())return 0;
+ 
+@@ -3100,11 +3100,11 @@
+ 	this->parameters->FindParam(&currenttime,TimeEnum);
+ 
+ 	/*recover material parameters: */
+-	lithosphere_shear_modulus=matpar->GetLithosphereShearModulus();
+-	lithosphere_density=matpar->GetLithosphereDensity();
+-	mantle_shear_modulus=matpar->GetMantleShearModulus();
+-	mantle_density=matpar->GetMantleDensity();
+-	rho_ice=matpar->GetRhoIce();
++	lithosphere_shear_modulus=matpar->GetMaterialParameter(MaterialsLithosphereShearModulusEnum);
++	lithosphere_density=matpar->GetMaterialParameter(MaterialsLithosphereDensityEnum);
++	mantle_shear_modulus=matpar->GetMaterialParameter(MaterialsMantleShearModulusEnum);
++	mantle_density=matpar->GetMaterialParameter(MaterialsMantleDensityEnum);
++	rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
+ 
+ 	/*pull thickness averages: */
+ 	thickness_input=inputs->GetInput(ThicknessEnum); 
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18945)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18946)
+@@ -251,8 +251,8 @@
+ 	}
+ 
+ 	/*recovre material parameters: */
+-	rho_ice=matpar->GetRhoIce();
+-	gravity=matpar->GetG();
++	rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
++	gravity=matpar->GetMaterialParameter(ConstantsGEnum);
+ 
+ 	/* Get node coordinates and dof list: */
+ 	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+@@ -696,9 +696,9 @@
+ 			  + 2.*sigma_xy*bed_normal[0]*bed_normal[1] + 2.*sigma_xz*bed_normal[0]*bed_normal[2] + 2.*sigma_yz*bed_normal[1]*bed_normal[2];
+ 
+ 			/*Compute water pressure*/
+-			IssmDouble rho_ice   = matpar->GetRhoIce();
+-			IssmDouble rho_water = matpar->GetRhoWater();
+-			IssmDouble gravity   = matpar->GetG();
++			IssmDouble rho_ice   = matpar->GetMaterialParameter(MaterialsRhoIceEnum);
++			IssmDouble rho_water = matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
++			IssmDouble gravity   = matpar->GetMaterialParameter(ConstantsGEnum);
+ 			water_pressure=gravity*rho_water*base;
+ 
+ 			/*Compare basal stress to water pressure and determine whether it should ground*/
+@@ -1176,8 +1176,8 @@
+ 
+ 	if(!IsIceInElement() || IsFloating() || !IsOnBase())return 0;
+ 
+-	rho_ice=matpar->GetRhoIce();
+-	rho_water=matpar->GetRhoWater();
++	rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
++	rho_water=matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
+ 	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+ 
+ 	/*First calculate the area of the base (cross section triangle)
+@@ -2048,15 +2048,15 @@
+   GetInputListOnVertices(&s[0],SurfaceEnum);
+ 
+   /*Get material parameters :*/
+-  rho_ice=matpar->GetRhoIce();
+-  rho_water=matpar->GetRhoFreshwater();
++  rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
++  rho_water=matpar->GetMaterialParameter(MaterialsRhoFreshwaterEnum);
+ 
+   /*Get other pdd parameters*/
+-  desfac=matpar->GetDesFac();
+-  s0p=matpar->GetS0p();
+-  s0t=matpar->GetS0t();
+-  rlaps=matpar->GetRlaps();
+-  rlapslgm=matpar->GetRlapslgm();
++  desfac=matpar->GetMaterialParameter(SurfaceforcingsDesfacEnum);
++  s0p=matpar->GetMaterialParameter(SurfaceforcingsS0pEnum);
++  s0t=matpar->GetMaterialParameter(SurfaceforcingsS0tEnum);
++  rlaps=matpar->GetMaterialParameter(SurfaceforcingsRlapsEnum);
++  rlapslgm=matpar->GetMaterialParameter(SurfaceforcingsRlapslgmEnum);
+ 
+    /*measure the surface mass balance*/
+    for (int iv = 0; iv < NUMVERTICES; iv++){
+@@ -2082,8 +2082,8 @@
+ 	IssmDouble  rho_water,rho_ice,density;
+ 
+ 	/*material parameters: */
+-	rho_water=matpar->GetRhoWater();
+-	rho_ice=matpar->GetRhoIce();
++	rho_water=matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
++	rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
+ 	density=rho_ice/rho_water;
+ 	GetInputListOnVertices(&h[0],ThicknessEnum);
+ 	GetInputListOnVertices(&r[0],BedEnum);
+@@ -2640,7 +2640,7 @@
+ 	IssmDouble xyz_list[NUMVERTICES][3];
+ 
+ 	/*Get material parameters :*/
+-	rho_ice=matpar->GetRhoIce();
++	rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
+ 
+ 	if(!IsIceInElement() || !IsOnSurface()) return 0.;
+ 
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18945)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18946)
+@@ -1225,8 +1225,8 @@
+ 	GetInputListOnVertices(&b[0],BaseEnum);
+ 	GetInputListOnVertices(&r[0],BedEnum);
+ 	GetInputListOnVertices(&phi[0],MaskGroundediceLevelsetEnum);
+-	rho_water   = matpar->GetRhoWater();
+-	rho_ice     = matpar->GetRhoIce();
++	rho_water   = matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
++	rho_ice     = matpar->GetMaterialParameter(MaterialsRhoIceEnum);
+ 	density     = rho_ice/rho_water;
+ 
+ 	/*go through vertices, and update inputs, considering them to be TriaVertex type: */
+@@ -2053,7 +2053,7 @@
+ 	surface_input->GetInputValue(&s,gauss);
+ 	surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss);
+ 	z=this->GetZcoord(xyz_list,gauss);
+-	tau_perp = matpar->GetRhoIce() * matpar->GetG() * fabs(s-z)*sqrt(slope[0]*slope[0]+slope[1]*slope[1]);
++	tau_perp = matpar->GetMaterialParameter(MaterialsRhoIceEnum) * matpar->GetMaterialParameter(ConstantsGEnum) * fabs(s-z)*sqrt(slope[0]*slope[0]+slope[1]*slope[1]);
+ 
+ 	/* Get eps_b*/
+ 	this->StrainRateHO(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18946-18947.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18946-18947.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18946-18947.diff	(revision 19102)
@@ -0,0 +1,15 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18946)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18947)
+@@ -3252,8 +3252,8 @@
+ 					if (this->IsFloating()){
+ 						/*hydrostatic equilibrium: */
+ 						IssmDouble rho_ice,rho_water,di;
+-						rho_ice   = this->matpar->GetRhoIce();
+-						rho_water = this->matpar->GetRhoWater();
++						rho_ice   = this->matpar->GetMaterialParameter(MaterialsRhoIceEnum);
++						rho_water = this->matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
+ 						di        = rho_ice/rho_water;
+ 
+ 						/*build new thickness: */
Index: /issm/oecreview/Archive/18296-19100/ISSM-18947-18948.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18947-18948.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18947-18948.diff	(revision 19102)
@@ -0,0 +1,15 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18947)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18948)
+@@ -3380,8 +3380,8 @@
+ 					if (this->IsFloating()){
+ 						/*hydrostatic equilibrium: */
+ 						IssmDouble rho_ice,rho_water,di;
+-						rho_ice=this->matpar->GetRhoIce();
+-						rho_water=this->matpar->GetRhoWater();
++						rho_ice=this->matpar->GetMaterialParameter(MaterialsRhoIceEnum);
++						rho_water=this->matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
+ 
+ 						di=rho_ice/rho_water;
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18948-18949.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18948-18949.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18948-18949.diff	(revision 19102)
@@ -0,0 +1,37 @@
+Index: ../trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 18948)
++++ ../trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 18949)
+@@ -85,7 +85,7 @@
+ 
+ 		/*Get material parameters :*/
+ 		rho_ice=element->matpar->GetMaterialParameter(MaterialsRhoIceEnum);
+-		rho_water=element->matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
++		rho_water=element->matpar->GetMaterialParameter(MaterialsRhoFreshwaterEnum);
+ 
+ 		// loop over all vertices
+ 		for(v=0;v<numvertices;v++){
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18948)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18949)
+@@ -2252,7 +2252,7 @@
+ 
+   /*Get material parameters :*/
+   rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
+-  rho_water=matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
++  rho_water=matpar->GetMaterialParameter(MaterialsRhoFreshwaterEnum);
+ 
+   /*Get other pdd parameters*/
+   desfac=matpar->GetMaterialParameter(SurfaceforcingsDesfacEnum);
+@@ -2284,8 +2284,8 @@
+ 	IssmDouble  rho_water,rho_ice,density;
+ 
+ 	/*material parameters: */
+-	rho_water=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
+-	rho_ice=matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
++	rho_water=matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
++	rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
+ 	density=rho_ice/rho_water;
+ 	GetInputListOnVertices(&h[0],ThicknessEnum);
+ 	GetInputListOnVertices(&r[0],BedEnum);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18949-18950.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18949-18950.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18949-18950.diff	(revision 19102)
@@ -0,0 +1,1362 @@
+Index: ../trunk-jpl/m4/analyses.m4
+===================================================================
+--- ../trunk-jpl/m4/analyses.m4	(revision 18949)
++++ ../trunk-jpl/m4/analyses.m4	(revision 18950)
+@@ -10,862 +10,466 @@
+ [
+ 
+ dnl with-AdjointBalancethickness{{{
+-
+ AC_ARG_WITH([AdjointBalancethickness],
+-
+ 	AS_HELP_STRING([--with-AdjointBalancethickness = YES], [compile with AdjointBalancethickness capabilities (default is yes)]),
+-
+ 	[ADJOINTBALANCETHICKNESS=$withval],[ADJOINTBALANCETHICKNESS=yes])
+-
+ AC_MSG_CHECKING(for AdjointBalancethickness capability compilation)
+ 
+-
+ HAVE_ADJOINTBALANCETHICKNESS=no 
+-
+ if test "x$ADJOINTBALANCETHICKNESS" = "xyes"; then
+-
+ 	HAVE_ADJOINTBALANCETHICKNESS=yes
+-
+ 	AC_DEFINE([_HAVE_ADJOINTBALANCETHICKNESS_],[1],[with AdjointBalancethicknesscapability])
+-
+ fi
+-
+ AM_CONDITIONAL([ADJOINTBALANCETHICKNESS], [test x$HAVE_ADJOINTBALANCETHICKNESS = xyes])
+-
+ AC_MSG_RESULT($HAVE_ADJOINTBALANCETHICKNESS)
+-
+ dnl }}}
+ dnl with-AdjointBalancethickness2{{{
+-
+ AC_ARG_WITH([AdjointBalancethickness2],
+-
+ 	AS_HELP_STRING([--with-AdjointBalancethickness2 = YES], [compile with AdjointBalancethickness2 capabilities (default is yes)]),
+-
+ 	[ADJOINTBALANCETHICKNESS2=$withval],[ADJOINTBALANCETHICKNESS2=yes])
+-
+ AC_MSG_CHECKING(for AdjointBalancethickness2 capability compilation)
+ 
+-
+ HAVE_ADJOINTBALANCETHICKNESS2=no 
+-
+ if test "x$ADJOINTBALANCETHICKNESS2" = "xyes"; then
+-
+ 	HAVE_ADJOINTBALANCETHICKNESS2=yes
+-
+ 	AC_DEFINE([_HAVE_ADJOINTBALANCETHICKNESS2_],[1],[with AdjointBalancethickness2capability])
+-
+ fi
+-
+ AM_CONDITIONAL([ADJOINTBALANCETHICKNESS2], [test x$HAVE_ADJOINTBALANCETHICKNESS2 = xyes])
+-
+ AC_MSG_RESULT($HAVE_ADJOINTBALANCETHICKNESS2)
+-
+ dnl }}}
+ dnl with-AdjointHoriz{{{
+-
+ AC_ARG_WITH([AdjointHoriz],
+-
+ 	AS_HELP_STRING([--with-AdjointHoriz = YES], [compile with AdjointHoriz capabilities (default is yes)]),
+-
+ 	[ADJOINTHORIZ=$withval],[ADJOINTHORIZ=yes])
+-
+ AC_MSG_CHECKING(for AdjointHoriz capability compilation)
+ 
+-
+ HAVE_ADJOINTHORIZ=no 
+-
+ if test "x$ADJOINTHORIZ" = "xyes"; then
+-
+ 	HAVE_ADJOINTHORIZ=yes
+-
+ 	AC_DEFINE([_HAVE_ADJOINTHORIZ_],[1],[with AdjointHorizcapability])
+-
+ fi
+-
+ AM_CONDITIONAL([ADJOINTHORIZ], [test x$HAVE_ADJOINTHORIZ = xyes])
+-
+ AC_MSG_RESULT($HAVE_ADJOINTHORIZ)
+-
+ dnl }}}
+ dnl with-Balancethickness{{{
+-
+ AC_ARG_WITH([Balancethickness],
+-
+ 	AS_HELP_STRING([--with-Balancethickness = YES], [compile with Balancethickness capabilities (default is yes)]),
+-
+ 	[BALANCETHICKNESS=$withval],[BALANCETHICKNESS=yes])
+-
+ AC_MSG_CHECKING(for Balancethickness capability compilation)
+ 
+-
+ HAVE_BALANCETHICKNESS=no 
+-
+ if test "x$BALANCETHICKNESS" = "xyes"; then
+-
+ 	HAVE_BALANCETHICKNESS=yes
+-
+ 	AC_DEFINE([_HAVE_BALANCETHICKNESS_],[1],[with Balancethicknesscapability])
+-
+ fi
+-
+ AM_CONDITIONAL([BALANCETHICKNESS], [test x$HAVE_BALANCETHICKNESS = xyes])
+-
+ AC_MSG_RESULT($HAVE_BALANCETHICKNESS)
+-
+ dnl }}}
+ dnl with-Balancethickness2{{{
+-
+ AC_ARG_WITH([Balancethickness2],
+-
+ 	AS_HELP_STRING([--with-Balancethickness2 = YES], [compile with Balancethickness2 capabilities (default is yes)]),
+-
+ 	[BALANCETHICKNESS2=$withval],[BALANCETHICKNESS2=yes])
+-
+ AC_MSG_CHECKING(for Balancethickness2 capability compilation)
+ 
+-
+ HAVE_BALANCETHICKNESS2=no 
+-
+ if test "x$BALANCETHICKNESS2" = "xyes"; then
+-
+ 	HAVE_BALANCETHICKNESS2=yes
+-
+ 	AC_DEFINE([_HAVE_BALANCETHICKNESS2_],[1],[with Balancethickness2capability])
+-
+ fi
+-
+ AM_CONDITIONAL([BALANCETHICKNESS2], [test x$HAVE_BALANCETHICKNESS2 = xyes])
+-
+ AC_MSG_RESULT($HAVE_BALANCETHICKNESS2)
+-
+ dnl }}}
+ dnl with-BalancethicknessSoft{{{
+-
+ AC_ARG_WITH([BalancethicknessSoft],
+-
+ 	AS_HELP_STRING([--with-BalancethicknessSoft = YES], [compile with BalancethicknessSoft capabilities (default is yes)]),
+-
+ 	[BALANCETHICKNESSSOFT=$withval],[BALANCETHICKNESSSOFT=yes])
+-
+ AC_MSG_CHECKING(for BalancethicknessSoft capability compilation)
+ 
+-
+ HAVE_BALANCETHICKNESSSOFT=no 
+-
+ if test "x$BALANCETHICKNESSSOFT" = "xyes"; then
+-
+ 	HAVE_BALANCETHICKNESSSOFT=yes
+-
+ 	AC_DEFINE([_HAVE_BALANCETHICKNESSSOFT_],[1],[with BalancethicknessSoftcapability])
+-
+ fi
+-
+ AM_CONDITIONAL([BALANCETHICKNESSSOFT], [test x$HAVE_BALANCETHICKNESSSOFT = xyes])
+-
+ AC_MSG_RESULT($HAVE_BALANCETHICKNESSSOFT)
+-
+ dnl }}}
+ dnl with-Balancevelocity{{{
+-
+ AC_ARG_WITH([Balancevelocity],
+-
+ 	AS_HELP_STRING([--with-Balancevelocity = YES], [compile with Balancevelocity capabilities (default is yes)]),
+-
+ 	[BALANCEVELOCITY=$withval],[BALANCEVELOCITY=yes])
+-
+ AC_MSG_CHECKING(for Balancevelocity capability compilation)
+ 
+-
+ HAVE_BALANCEVELOCITY=no 
+-
+ if test "x$BALANCEVELOCITY" = "xyes"; then
+-
+ 	HAVE_BALANCEVELOCITY=yes
+-
+ 	AC_DEFINE([_HAVE_BALANCEVELOCITY_],[1],[with Balancevelocitycapability])
+-
+ fi
+-
+ AM_CONDITIONAL([BALANCEVELOCITY], [test x$HAVE_BALANCEVELOCITY = xyes])
+-
+ AC_MSG_RESULT($HAVE_BALANCEVELOCITY)
+-
+ dnl }}}
+ dnl with-L2ProjectionEPL{{{
+-
+ AC_ARG_WITH([L2ProjectionEPL],
+-
+ 	AS_HELP_STRING([--with-L2ProjectionEPL = YES], [compile with L2ProjectionEPL capabilities (default is yes)]),
+-
+ 	[L2PROJECTIONEPL=$withval],[L2PROJECTIONEPL=yes])
+-
+ AC_MSG_CHECKING(for L2ProjectionEPL capability compilation)
+ 
+-
+ HAVE_L2PROJECTIONEPL=no 
+-
+ if test "x$L2PROJECTIONEPL" = "xyes"; then
+-
+ 	HAVE_L2PROJECTIONEPL=yes
+-
+ 	AC_DEFINE([_HAVE_L2PROJECTIONEPL_],[1],[with L2ProjectionEPLcapability])
+-
+ fi
+-
+ AM_CONDITIONAL([L2PROJECTIONEPL], [test x$HAVE_L2PROJECTIONEPL = xyes])
+-
+ AC_MSG_RESULT($HAVE_L2PROJECTIONEPL)
+-
+ dnl }}}
+ dnl with-L2ProjectionBase{{{
+-
+ AC_ARG_WITH([L2ProjectionBase],
+-
+ 	AS_HELP_STRING([--with-L2ProjectionBase = YES], [compile with L2ProjectionBase capabilities (default is yes)]),
+-
+ 	[L2PROJECTIONBASE=$withval],[L2PROJECTIONBASE=yes])
+-
+ AC_MSG_CHECKING(for L2ProjectionBase capability compilation)
+ 
+-
+ HAVE_L2PROJECTIONBASE=no 
+-
+ if test "x$L2PROJECTIONBASE" = "xyes"; then
+-
+ 	HAVE_L2PROJECTIONBASE=yes
+-
+ 	AC_DEFINE([_HAVE_L2PROJECTIONBASE_],[1],[with L2ProjectionBasecapability])
+-
+ fi
+-
+ AM_CONDITIONAL([L2PROJECTIONBASE], [test x$HAVE_L2PROJECTIONBASE = xyes])
+-
+ AC_MSG_RESULT($HAVE_L2PROJECTIONBASE)
+-
+ dnl }}}
+ dnl with-DamageEvolution{{{
+-
+ AC_ARG_WITH([DamageEvolution],
+-
+ 	AS_HELP_STRING([--with-DamageEvolution = YES], [compile with DamageEvolution capabilities (default is yes)]),
+-
+ 	[DAMAGEEVOLUTION=$withval],[DAMAGEEVOLUTION=yes])
+-
+ AC_MSG_CHECKING(for DamageEvolution capability compilation)
+ 
+-
+ HAVE_DAMAGEEVOLUTION=no 
+-
+ if test "x$DAMAGEEVOLUTION" = "xyes"; then
+-
+ 	HAVE_DAMAGEEVOLUTION=yes
+-
+ 	AC_DEFINE([_HAVE_DAMAGEEVOLUTION_],[1],[with DamageEvolutioncapability])
+-
+ fi
+-
+ AM_CONDITIONAL([DAMAGEEVOLUTION], [test x$HAVE_DAMAGEEVOLUTION = xyes])
+-
+ AC_MSG_RESULT($HAVE_DAMAGEEVOLUTION)
+-
+ dnl }}}
+ dnl with-Stressbalance{{{
+-
+ AC_ARG_WITH([Stressbalance],
+-
+ 	AS_HELP_STRING([--with-Stressbalance = YES], [compile with Stressbalance capabilities (default is yes)]),
+-
+ 	[STRESSBALANCE=$withval],[STRESSBALANCE=yes])
+-
+ AC_MSG_CHECKING(for Stressbalance capability compilation)
+ 
+-
+ HAVE_STRESSBALANCE=no 
+-
+ if test "x$STRESSBALANCE" = "xyes"; then
+-
+ 	HAVE_STRESSBALANCE=yes
+-
+ 	AC_DEFINE([_HAVE_STRESSBALANCE_],[1],[with Stressbalancecapability])
+-
+ fi
+-
+ AM_CONDITIONAL([STRESSBALANCE], [test x$HAVE_STRESSBALANCE = xyes])
+-
+ AC_MSG_RESULT($HAVE_STRESSBALANCE)
+-
+ dnl }}}
+ dnl with-StressbalanceSIA{{{
+-
+ AC_ARG_WITH([StressbalanceSIA],
+-
+ 	AS_HELP_STRING([--with-StressbalanceSIA = YES], [compile with StressbalanceSIA capabilities (default is yes)]),
+-
+ 	[STRESSBALANCESIA=$withval],[STRESSBALANCESIA=yes])
+-
+ AC_MSG_CHECKING(for StressbalanceSIA capability compilation)
+ 
+-
+ HAVE_STRESSBALANCESIA=no 
+-
+ if test "x$STRESSBALANCESIA" = "xyes"; then
+-
+ 	HAVE_STRESSBALANCESIA=yes
+-
+ 	AC_DEFINE([_HAVE_STRESSBALANCESIA_],[1],[with StressbalanceSIAcapability])
+-
+ fi
+-
+ AM_CONDITIONAL([STRESSBALANCESIA], [test x$HAVE_STRESSBALANCESIA = xyes])
+-
+ AC_MSG_RESULT($HAVE_STRESSBALANCESIA)
+-
+ dnl }}}
+ dnl with-StressbalanceVertical{{{
+-
+ AC_ARG_WITH([StressbalanceVertical],
+-
+ 	AS_HELP_STRING([--with-StressbalanceVertical = YES], [compile with StressbalanceVertical capabilities (default is yes)]),
+-
+ 	[STRESSBALANCEVERTICAL=$withval],[STRESSBALANCEVERTICAL=yes])
+-
+ AC_MSG_CHECKING(for StressbalanceVertical capability compilation)
+ 
+-
+ HAVE_STRESSBALANCEVERTICAL=no 
+-
+ if test "x$STRESSBALANCEVERTICAL" = "xyes"; then
+-
+ 	HAVE_STRESSBALANCEVERTICAL=yes
+-
+ 	AC_DEFINE([_HAVE_STRESSBALANCEVERTICAL_],[1],[with StressbalanceVerticalcapability])
+-
+ fi
+-
+ AM_CONDITIONAL([STRESSBALANCEVERTICAL], [test x$HAVE_STRESSBALANCEVERTICAL = xyes])
+-
+ AC_MSG_RESULT($HAVE_STRESSBALANCEVERTICAL)
+-
+ dnl }}}
+ dnl with-Enthalpy{{{
+-
+ AC_ARG_WITH([Enthalpy],
+-
+ 	AS_HELP_STRING([--with-Enthalpy = YES], [compile with Enthalpy capabilities (default is yes)]),
+-
+ 	[ENTHALPY=$withval],[ENTHALPY=yes])
+-
+ AC_MSG_CHECKING(for Enthalpy capability compilation)
+ 
+-
+ HAVE_ENTHALPY=no 
+-
+ if test "x$ENTHALPY" = "xyes"; then
+-
+ 	HAVE_ENTHALPY=yes
+-
+ 	AC_DEFINE([_HAVE_ENTHALPY_],[1],[with Enthalpycapability])
+-
+ fi
+-
+ AM_CONDITIONAL([ENTHALPY], [test x$HAVE_ENTHALPY = xyes])
+-
+ AC_MSG_RESULT($HAVE_ENTHALPY)
+-
+ dnl }}}
+ dnl with-HydrologyShreve{{{
+-
+ AC_ARG_WITH([HydrologyShreve],
+-
+ 	AS_HELP_STRING([--with-HydrologyShreve = YES], [compile with HydrologyShreve capabilities (default is yes)]),
+-
+ 	[HYDROLOGYSHREVE=$withval],[HYDROLOGYSHREVE=yes])
+-
+ AC_MSG_CHECKING(for HydrologyShreve capability compilation)
+ 
+-
+ HAVE_HYDROLOGYSHREVE=no 
+-
+ if test "x$HYDROLOGYSHREVE" = "xyes"; then
+-
+ 	HAVE_HYDROLOGYSHREVE=yes
+-
+ 	AC_DEFINE([_HAVE_HYDROLOGYSHREVE_],[1],[with HydrologyShrevecapability])
+-
+ fi
+-
+ AM_CONDITIONAL([HYDROLOGYSHREVE], [test x$HAVE_HYDROLOGYSHREVE = xyes])
+-
+ AC_MSG_RESULT($HAVE_HYDROLOGYSHREVE)
+-
+ dnl }}}
+ dnl with-HydrologyDCInefficient{{{
+-
+ AC_ARG_WITH([HydrologyDCInefficient],
+-
+ 	AS_HELP_STRING([--with-HydrologyDCInefficient = YES], [compile with HydrologyDCInefficient capabilities (default is yes)]),
+-
+ 	[HYDROLOGYDCINEFFICIENT=$withval],[HYDROLOGYDCINEFFICIENT=yes])
+-
+ AC_MSG_CHECKING(for HydrologyDCInefficient capability compilation)
+ 
+-
+ HAVE_HYDROLOGYDCINEFFICIENT=no 
+-
+ if test "x$HYDROLOGYDCINEFFICIENT" = "xyes"; then
+-
+ 	HAVE_HYDROLOGYDCINEFFICIENT=yes
+-
+ 	AC_DEFINE([_HAVE_HYDROLOGYDCINEFFICIENT_],[1],[with HydrologyDCInefficientcapability])
+-
+ fi
+-
+ AM_CONDITIONAL([HYDROLOGYDCINEFFICIENT], [test x$HAVE_HYDROLOGYDCINEFFICIENT = xyes])
+-
+ AC_MSG_RESULT($HAVE_HYDROLOGYDCINEFFICIENT)
+-
+ dnl }}}
+ dnl with-HydrologyDCEfficient{{{
+-
+ AC_ARG_WITH([HydrologyDCEfficient],
+-
+ 	AS_HELP_STRING([--with-HydrologyDCEfficient = YES], [compile with HydrologyDCEfficient capabilities (default is yes)]),
+-
+ 	[HYDROLOGYDCEFFICIENT=$withval],[HYDROLOGYDCEFFICIENT=yes])
+-
+ AC_MSG_CHECKING(for HydrologyDCEfficient capability compilation)
+ 
+-
+ HAVE_HYDROLOGYDCEFFICIENT=no 
+-
+ if test "x$HYDROLOGYDCEFFICIENT" = "xyes"; then
+-
+ 	HAVE_HYDROLOGYDCEFFICIENT=yes
+-
+ 	AC_DEFINE([_HAVE_HYDROLOGYDCEFFICIENT_],[1],[with HydrologyDCEfficientcapability])
+-
+ fi
+-
+ AM_CONDITIONAL([HYDROLOGYDCEFFICIENT], [test x$HAVE_HYDROLOGYDCEFFICIENT = xyes])
+-
+ AC_MSG_RESULT($HAVE_HYDROLOGYDCEFFICIENT)
+-
+ dnl }}}
+ dnl with-Melting{{{
+-
+ AC_ARG_WITH([Melting],
+-
+ 	AS_HELP_STRING([--with-Melting = YES], [compile with Melting capabilities (default is yes)]),
+-
+ 	[MELTING=$withval],[MELTING=yes])
+-
+ AC_MSG_CHECKING(for Melting capability compilation)
+ 
+-
+ HAVE_MELTING=no 
+-
+ if test "x$MELTING" = "xyes"; then
+-
+ 	HAVE_MELTING=yes
+-
+ 	AC_DEFINE([_HAVE_MELTING_],[1],[with Meltingcapability])
+-
+ fi
+-
+ AM_CONDITIONAL([MELTING], [test x$HAVE_MELTING = xyes])
+-
+ AC_MSG_RESULT($HAVE_MELTING)
+-
+ dnl }}}
+ dnl with-Masstransport{{{
+-
+ AC_ARG_WITH([Masstransport],
+-
+ 	AS_HELP_STRING([--with-Masstransport = YES], [compile with Masstransport capabilities (default is yes)]),
+-
+ 	[MASSTRANSPORT=$withval],[MASSTRANSPORT=yes])
+-
+ AC_MSG_CHECKING(for Masstransport capability compilation)
+ 
+-
+ HAVE_MASSTRANSPORT=no 
+-
+ if test "x$MASSTRANSPORT" = "xyes"; then
+-
+ 	HAVE_MASSTRANSPORT=yes
+-
+ 	AC_DEFINE([_HAVE_MASSTRANSPORT_],[1],[with Masstransportcapability])
+-
+ fi
+-
+ AM_CONDITIONAL([MASSTRANSPORT], [test x$HAVE_MASSTRANSPORT = xyes])
+-
+ AC_MSG_RESULT($HAVE_MASSTRANSPORT)
+-
+ dnl }}}
+ dnl with-FreeSurfaceBase{{{
+-
+ AC_ARG_WITH([FreeSurfaceBase],
+-
+ 	AS_HELP_STRING([--with-FreeSurfaceBase = YES], [compile with FreeSurfaceBase capabilities (default is yes)]),
+-
+ 	[FREESURFACEBASE=$withval],[FREESURFACEBASE=yes])
+-
+ AC_MSG_CHECKING(for FreeSurfaceBase capability compilation)
+ 
+-
+ HAVE_FREESURFACEBASE=no 
+-
+ if test "x$FREESURFACEBASE" = "xyes"; then
+-
+ 	HAVE_FREESURFACEBASE=yes
+-
+ 	AC_DEFINE([_HAVE_FREESURFACEBASE_],[1],[with FreeSurfaceBasecapability])
+-
+ fi
+-
+ AM_CONDITIONAL([FREESURFACEBASE], [test x$HAVE_FREESURFACEBASE = xyes])
+-
+ AC_MSG_RESULT($HAVE_FREESURFACEBASE)
+-
+ dnl }}}
+ dnl with-FreeSurfaceTop{{{
+-
+ AC_ARG_WITH([FreeSurfaceTop],
+-
+ 	AS_HELP_STRING([--with-FreeSurfaceTop = YES], [compile with FreeSurfaceTop capabilities (default is yes)]),
+-
+ 	[FREESURFACETOP=$withval],[FREESURFACETOP=yes])
+-
+ AC_MSG_CHECKING(for FreeSurfaceTop capability compilation)
+ 
+-
+ HAVE_FREESURFACETOP=no 
+-
+ if test "x$FREESURFACETOP" = "xyes"; then
+-
+ 	HAVE_FREESURFACETOP=yes
+-
+ 	AC_DEFINE([_HAVE_FREESURFACETOP_],[1],[with FreeSurfaceTopcapability])
+-
+ fi
+-
+ AM_CONDITIONAL([FREESURFACETOP], [test x$HAVE_FREESURFACETOP = xyes])
+-
+ AC_MSG_RESULT($HAVE_FREESURFACETOP)
+-
+ dnl }}}
+ dnl with-ExtrudeFromBase{{{
+-
+ AC_ARG_WITH([ExtrudeFromBase],
+-
+ 	AS_HELP_STRING([--with-ExtrudeFromBase = YES], [compile with ExtrudeFromBase capabilities (default is yes)]),
+-
+ 	[EXTRUDEFROMBASE=$withval],[EXTRUDEFROMBASE=yes])
+-
+ AC_MSG_CHECKING(for ExtrudeFromBase capability compilation)
+ 
+-
+ HAVE_EXTRUDEFROMBASE=no 
+-
+ if test "x$EXTRUDEFROMBASE" = "xyes"; then
+-
+ 	HAVE_EXTRUDEFROMBASE=yes
+-
+ 	AC_DEFINE([_HAVE_EXTRUDEFROMBASE_],[1],[with ExtrudeFromBasecapability])
+-
+ fi
+-
+ AM_CONDITIONAL([EXTRUDEFROMBASE], [test x$HAVE_EXTRUDEFROMBASE = xyes])
+-
+ AC_MSG_RESULT($HAVE_EXTRUDEFROMBASE)
+-
+ dnl }}}
+ dnl with-ExtrudeFromTop{{{
+-
+ AC_ARG_WITH([ExtrudeFromTop],
+-
+ 	AS_HELP_STRING([--with-ExtrudeFromTop = YES], [compile with ExtrudeFromTop capabilities (default is yes)]),
+-
+ 	[EXTRUDEFROMTOP=$withval],[EXTRUDEFROMTOP=yes])
+-
+ AC_MSG_CHECKING(for ExtrudeFromTop capability compilation)
+ 
+-
+ HAVE_EXTRUDEFROMTOP=no 
+-
+ if test "x$EXTRUDEFROMTOP" = "xyes"; then
+-
+ 	HAVE_EXTRUDEFROMTOP=yes
+-
+ 	AC_DEFINE([_HAVE_EXTRUDEFROMTOP_],[1],[with ExtrudeFromTopcapability])
+-
+ fi
+-
+ AM_CONDITIONAL([EXTRUDEFROMTOP], [test x$HAVE_EXTRUDEFROMTOP = xyes])
+-
+ AC_MSG_RESULT($HAVE_EXTRUDEFROMTOP)
+-
+ dnl }}}
+ dnl with-DepthAverage{{{
+-
+ AC_ARG_WITH([DepthAverage],
+-
+ 	AS_HELP_STRING([--with-DepthAverage = YES], [compile with DepthAverage capabilities (default is yes)]),
+-
+ 	[DEPTHAVERAGE=$withval],[DEPTHAVERAGE=yes])
+-
+ AC_MSG_CHECKING(for DepthAverage capability compilation)
+ 
+-
+ HAVE_DEPTHAVERAGE=no 
+-
+ if test "x$DEPTHAVERAGE" = "xyes"; then
+-
+ 	HAVE_DEPTHAVERAGE=yes
+-
+ 	AC_DEFINE([_HAVE_DEPTHAVERAGE_],[1],[with DepthAveragecapability])
+-
+ fi
+-
+ AM_CONDITIONAL([DEPTHAVERAGE], [test x$HAVE_DEPTHAVERAGE = xyes])
+-
+ AC_MSG_RESULT($HAVE_DEPTHAVERAGE)
+-
+ dnl }}}
+ dnl with-Smooth{{{
+-
+ AC_ARG_WITH([Smooth],
+-
+ 	AS_HELP_STRING([--with-Smooth = YES], [compile with Smooth capabilities (default is yes)]),
+-
+ 	[SMOOTH=$withval],[SMOOTH=yes])
+-
+ AC_MSG_CHECKING(for Smooth capability compilation)
+ 
+-
+ HAVE_SMOOTH=no 
+-
+ if test "x$SMOOTH" = "xyes"; then
+-
+ 	HAVE_SMOOTH=yes
+-
+ 	AC_DEFINE([_HAVE_SMOOTH_],[1],[with Smoothcapability])
+-
+ fi
+-
+ AM_CONDITIONAL([SMOOTH], [test x$HAVE_SMOOTH = xyes])
+-
+ AC_MSG_RESULT($HAVE_SMOOTH)
+-
+ dnl }}}
+ dnl with-Thermal{{{
+-
+ AC_ARG_WITH([Thermal],
+-
+ 	AS_HELP_STRING([--with-Thermal = YES], [compile with Thermal capabilities (default is yes)]),
+-
+ 	[THERMAL=$withval],[THERMAL=yes])
+-
+ AC_MSG_CHECKING(for Thermal capability compilation)
+ 
+-
+ HAVE_THERMAL=no 
+-
+ if test "x$THERMAL" = "xyes"; then
+-
+ 	HAVE_THERMAL=yes
+-
+ 	AC_DEFINE([_HAVE_THERMAL_],[1],[with Thermalcapability])
+-
+ fi
+-
+ AM_CONDITIONAL([THERMAL], [test x$HAVE_THERMAL = xyes])
+-
+ AC_MSG_RESULT($HAVE_THERMAL)
+-
+ dnl }}}
+ dnl with-UzawaPressure{{{
+-
+ AC_ARG_WITH([UzawaPressure],
+-
+ 	AS_HELP_STRING([--with-UzawaPressure = YES], [compile with UzawaPressure capabilities (default is yes)]),
+-
+ 	[UZAWAPRESSURE=$withval],[UZAWAPRESSURE=yes])
+-
+ AC_MSG_CHECKING(for UzawaPressure capability compilation)
+ 
+-
+ HAVE_UZAWAPRESSURE=no 
+-
+ if test "x$UZAWAPRESSURE" = "xyes"; then
+-
+ 	HAVE_UZAWAPRESSURE=yes
+-
+ 	AC_DEFINE([_HAVE_UZAWAPRESSURE_],[1],[with UzawaPressurecapability])
+-
+ fi
+-
+ AM_CONDITIONAL([UZAWAPRESSURE], [test x$HAVE_UZAWAPRESSURE = xyes])
+-
+ AC_MSG_RESULT($HAVE_UZAWAPRESSURE)
+-
+ dnl }}}
+ dnl with-Gia{{{
+-
+ AC_ARG_WITH([Gia],
+-
+ 	AS_HELP_STRING([--with-Gia = YES], [compile with Gia capabilities (default is yes)]),
+-
+ 	[GIA=$withval],[GIA=yes])
+-
+ AC_MSG_CHECKING(for Gia capability compilation)
+ 
+-
+ HAVE_GIA=no 
+-
+ if test "x$GIA" = "xyes"; then
+-
+ 	HAVE_GIA=yes
+-
+ 	AC_DEFINE([_HAVE_GIA_],[1],[with Giacapability])
+-
+ fi
+-
+ AM_CONDITIONAL([GIA], [test x$HAVE_GIA = xyes])
+-
+ AC_MSG_RESULT($HAVE_GIA)
+-
+ dnl }}}
+ dnl with-Seaice{{{
+-
+ AC_ARG_WITH([Seaice],
+-
+ 	AS_HELP_STRING([--with-Seaice = YES], [compile with Seaice capabilities (default is yes)]),
+-
+ 	[SEAICE=$withval],[SEAICE=yes])
+-
+ AC_MSG_CHECKING(for Seaice capability compilation)
+ 
+-
+ HAVE_SEAICE=no 
+-
+ if test "x$SEAICE" = "xyes"; then
+-
+ 	HAVE_SEAICE=yes
+-
+ 	AC_DEFINE([_HAVE_SEAICE_],[1],[with Seaicecapability])
+-
+ fi
+-
+ AM_CONDITIONAL([SEAICE], [test x$HAVE_SEAICE = xyes])
+-
+ AC_MSG_RESULT($HAVE_SEAICE)
+-
+ dnl }}}
+ dnl with-Meshdeformation{{{
+-
+ AC_ARG_WITH([Meshdeformation],
+-
+ 	AS_HELP_STRING([--with-Meshdeformation = YES], [compile with Meshdeformation capabilities (default is yes)]),
+-
+ 	[MESHDEFORMATION=$withval],[MESHDEFORMATION=yes])
+-
+ AC_MSG_CHECKING(for Meshdeformation capability compilation)
+ 
+-
+ HAVE_MESHDEFORMATION=no 
+-
+ if test "x$MESHDEFORMATION" = "xyes"; then
+-
+ 	HAVE_MESHDEFORMATION=yes
+-
+ 	AC_DEFINE([_HAVE_MESHDEFORMATION_],[1],[with Meshdeformationcapability])
+-
+ fi
+-
+ AM_CONDITIONAL([MESHDEFORMATION], [test x$HAVE_MESHDEFORMATION = xyes])
+-
+ AC_MSG_RESULT($HAVE_MESHDEFORMATION)
+-
+ dnl }}}
+ dnl with-Levelset{{{
+-
+ AC_ARG_WITH([Levelset],
+-
+ 	AS_HELP_STRING([--with-Levelset = YES], [compile with Levelset capabilities (default is yes)]),
+-
+ 	[LEVELSET=$withval],[LEVELSET=yes])
+-
+ AC_MSG_CHECKING(for Levelset capability compilation)
+ 
+-
+ HAVE_LEVELSET=no 
+-
+ if test "x$LEVELSET" = "xyes"; then
+-
+ 	HAVE_LEVELSET=yes
+-
+ 	AC_DEFINE([_HAVE_LEVELSET_],[1],[with Levelsetcapability])
+-
+ fi
+-
+ AM_CONDITIONAL([LEVELSET], [test x$HAVE_LEVELSET = xyes])
+-
+ AC_MSG_RESULT($HAVE_LEVELSET)
+-
+ dnl }}}
+ dnl with-Extrapolation{{{
+-
+ AC_ARG_WITH([Extrapolation],
+-
+ 	AS_HELP_STRING([--with-Extrapolation = YES], [compile with Extrapolation capabilities (default is yes)]),
+-
+ 	[EXTRAPOLATION=$withval],[EXTRAPOLATION=yes])
+-
+ AC_MSG_CHECKING(for Extrapolation capability compilation)
+ 
+-
+ HAVE_EXTRAPOLATION=no 
+-
+ if test "x$EXTRAPOLATION" = "xyes"; then
+-
+ 	HAVE_EXTRAPOLATION=yes
+-
+ 	AC_DEFINE([_HAVE_EXTRAPOLATION_],[1],[with Extrapolationcapability])
+-
+ fi
+-
+ AM_CONDITIONAL([EXTRAPOLATION], [test x$HAVE_EXTRAPOLATION = xyes])
+-
+ AC_MSG_RESULT($HAVE_EXTRAPOLATION)
+-
+ dnl }}}
+ dnl with-LsfReinitialization{{{
+-
+ AC_ARG_WITH([LsfReinitialization],
+-
+ 	AS_HELP_STRING([--with-LsfReinitialization = YES], [compile with LsfReinitialization capabilities (default is yes)]),
+-
+ 	[LSFREINITIALIZATION=$withval],[LSFREINITIALIZATION=yes])
+-
+ AC_MSG_CHECKING(for LsfReinitialization capability compilation)
+ 
+-
+ HAVE_LSFREINITIALIZATION=no 
+-
+ if test "x$LSFREINITIALIZATION" = "xyes"; then
+-
+ 	HAVE_LSFREINITIALIZATION=yes
+-
+ 	AC_DEFINE([_HAVE_LSFREINITIALIZATION_],[1],[with LsfReinitializationcapability])
+-
+ fi
+-
+ AM_CONDITIONAL([LSFREINITIALIZATION], [test x$HAVE_LSFREINITIALIZATION = xyes])
+-
+ AC_MSG_RESULT($HAVE_LSFREINITIALIZATION)
+-
+ dnl }}}
+ 
+ ])
+Index: ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18949)
++++ ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18950)
+@@ -183,6 +183,7 @@
+ 				iomodel->FetchDataToInput(elements,SurfaceforcingsTemperaturesLgmEnum);
+ 				iomodel->FetchDataToInput(elements,SurfaceforcingsTemperaturesPresentdayEnum);
+ 				iomodel->FetchDataToInput(elements,SurfaceforcingsPrecipitationsPresentdayEnum);
++				iomodel->FetchDataToInput(elements,SurfaceforcingsPrecipitationsLgmEnum);
+ 			}
+ 			else{
+ 				iomodel->FetchDataToInput(elements,SurfaceforcingsPrecipitationEnum);
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18949)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18950)
+@@ -341,6 +341,7 @@
+ 	SurfaceforcingsDelta18oSurfaceEnum,
+ 	SurfaceforcingsIsdelta18oEnum,
+ 	SurfaceforcingsPrecipitationsPresentdayEnum,
++	SurfaceforcingsPrecipitationsLgmEnum,
+ 	SurfaceforcingsTemperaturesPresentdayEnum,
+ 	SurfaceforcingsTemperaturesLgmEnum,
+ 	SurfaceforcingsPrecipitationEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18949)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18950)
+@@ -347,6 +347,7 @@
+ 		case SurfaceforcingsDelta18oSurfaceEnum : return "SurfaceforcingsDelta18oSurface";
+ 		case SurfaceforcingsIsdelta18oEnum : return "SurfaceforcingsIsdelta18o";
+ 		case SurfaceforcingsPrecipitationsPresentdayEnum : return "SurfaceforcingsPrecipitationsPresentday";
++		case SurfaceforcingsPrecipitationsLgmEnum : return "SurfaceforcingsPrecipitationsLgm";
+ 		case SurfaceforcingsTemperaturesPresentdayEnum : return "SurfaceforcingsTemperaturesPresentday";
+ 		case SurfaceforcingsTemperaturesLgmEnum : return "SurfaceforcingsTemperaturesLgm";
+ 		case SurfaceforcingsPrecipitationEnum : return "SurfaceforcingsPrecipitation";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18949)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18950)
+@@ -353,6 +353,7 @@
+ 	      else if (strcmp(name,"SurfaceforcingsDelta18oSurface")==0) return SurfaceforcingsDelta18oSurfaceEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsIsdelta18o")==0) return SurfaceforcingsIsdelta18oEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsPrecipitationsPresentday")==0) return SurfaceforcingsPrecipitationsPresentdayEnum;
++	      else if (strcmp(name,"SurfaceforcingsPrecipitationsLgm")==0) return SurfaceforcingsPrecipitationsLgmEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsTemperaturesPresentday")==0) return SurfaceforcingsTemperaturesPresentdayEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsTemperaturesLgm")==0) return SurfaceforcingsTemperaturesLgmEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsPrecipitation")==0) return SurfaceforcingsPrecipitationEnum;
+@@ -381,11 +382,11 @@
+ 	      else if (strcmp(name,"SurfaceforcingsIspdd")==0) return SurfaceforcingsIspddEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsIssmbgradients")==0) return SurfaceforcingsIssmbgradientsEnum;
+ 	      else if (strcmp(name,"SolutionType")==0) return SolutionTypeEnum;
+-	      else if (strcmp(name,"AnalysisType")==0) return AnalysisTypeEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"ConfigurationType")==0) return ConfigurationTypeEnum;
++	      if (strcmp(name,"AnalysisType")==0) return AnalysisTypeEnum;
++	      else if (strcmp(name,"ConfigurationType")==0) return ConfigurationTypeEnum;
+ 	      else if (strcmp(name,"AdjointBalancethicknessAnalysis")==0) return AdjointBalancethicknessAnalysisEnum;
+ 	      else if (strcmp(name,"AdjointBalancethickness2Analysis")==0) return AdjointBalancethickness2AnalysisEnum;
+ 	      else if (strcmp(name,"AdjointHorizAnalysis")==0) return AdjointHorizAnalysisEnum;
+@@ -504,11 +505,11 @@
+ 	      else if (strcmp(name,"MassconLevelset")==0) return MassconLevelsetEnum;
+ 	      else if (strcmp(name,"Massconaxpby")==0) return MassconaxpbyEnum;
+ 	      else if (strcmp(name,"MassconaxpbyName")==0) return MassconaxpbyNameEnum;
+-	      else if (strcmp(name,"MassconaxpbyDefinitionenum")==0) return MassconaxpbyDefinitionenumEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"MassconaxpbyNamex")==0) return MassconaxpbyNamexEnum;
++	      if (strcmp(name,"MassconaxpbyDefinitionenum")==0) return MassconaxpbyDefinitionenumEnum;
++	      else if (strcmp(name,"MassconaxpbyNamex")==0) return MassconaxpbyNamexEnum;
+ 	      else if (strcmp(name,"MassconaxpbyNamey")==0) return MassconaxpbyNameyEnum;
+ 	      else if (strcmp(name,"MassconaxpbyAlpha")==0) return MassconaxpbyAlphaEnum;
+ 	      else if (strcmp(name,"MassconaxpbyBeta")==0) return MassconaxpbyBetaEnum;
+@@ -627,11 +628,11 @@
+ 	      else if (strcmp(name,"StrainRate")==0) return StrainRateEnum;
+ 	      else if (strcmp(name,"StrainRatexx")==0) return StrainRatexxEnum;
+ 	      else if (strcmp(name,"StrainRatexy")==0) return StrainRatexyEnum;
+-	      else if (strcmp(name,"StrainRatexz")==0) return StrainRatexzEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"StrainRateyy")==0) return StrainRateyyEnum;
++	      if (strcmp(name,"StrainRatexz")==0) return StrainRatexzEnum;
++	      else if (strcmp(name,"StrainRateyy")==0) return StrainRateyyEnum;
+ 	      else if (strcmp(name,"StrainRateyz")==0) return StrainRateyzEnum;
+ 	      else if (strcmp(name,"StrainRatezz")==0) return StrainRatezzEnum;
+ 	      else if (strcmp(name,"Divergence")==0) return DivergenceEnum;
+@@ -750,11 +751,11 @@
+ 	      else if (strcmp(name,"Intersect")==0) return IntersectEnum;
+ 	      else if (strcmp(name,"Nodal")==0) return NodalEnum;
+ 	      else if (strcmp(name,"OldGradient")==0) return OldGradientEnum;
+-	      else if (strcmp(name,"OutputFilePointer")==0) return OutputFilePointerEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"ToolkitsFileName")==0) return ToolkitsFileNameEnum;
++	      if (strcmp(name,"OutputFilePointer")==0) return OutputFilePointerEnum;
++	      else if (strcmp(name,"ToolkitsFileName")==0) return ToolkitsFileNameEnum;
+ 	      else if (strcmp(name,"RootPath")==0) return RootPathEnum;
+ 	      else if (strcmp(name,"OutputFileName")==0) return OutputFileNameEnum;
+ 	      else if (strcmp(name,"InputFileName")==0) return InputFileNameEnum;
+Index: ../trunk-jpl/src/c/shared/Elements/elements.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Elements/elements.h	(revision 18949)
++++ ../trunk-jpl/src/c/shared/Elements/elements.h	(revision 18950)
+@@ -14,8 +14,9 @@
+ // IssmDouble LliboutryDuval(IssmDouble temperature, IssmDouble waterfraction, IssmDouble depth,IssmDouble n);
+ IssmDouble PddSurfaceMassBlance(IssmDouble* monthlytemperatures,  IssmDouble* monthlyprec,
+ 				IssmDouble* TemperaturesLgm, IssmDouble* TemperaturesPresentday,
++				IssmDouble* PrecipitationsLgm, IssmDouble* PrecipitationsPresentday,
+ 				IssmDouble* pdds, IssmDouble* pds,IssmDouble signorm, IssmDouble yts,
+-				IssmDouble h, IssmDouble s, IssmDouble rho_ice,IssmDouble rho_water, IssmDouble desfac,
++				IssmDouble h, IssmDouble s, IssmDouble desfac,
+ 				IssmDouble s0t,IssmDouble s0p, IssmDouble rlaps, IssmDouble rlapslgm,
+ 				IssmDouble PfacTime,IssmDouble TdiffTime,IssmDouble sealevTime);
+ void ComputeDelta18oTemperaturePrecipitation(IssmDouble Delta18oSurfacePresent, IssmDouble Delta18oSurfaceLgm, IssmDouble Delta18oSurfaceTime,
+Index: ../trunk-jpl/src/c/shared/Elements/ComputeDelta18oTemperaturePrecipitation.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Elements/ComputeDelta18oTemperaturePrecipitation.cpp	(revision 18949)
++++ ../trunk-jpl/src/c/shared/Elements/ComputeDelta18oTemperaturePrecipitation.cpp	(revision 18950)
+@@ -16,9 +16,12 @@
+   IssmDouble delta18oLapseRate=-6.2*pow(10.,-3);
+   IssmDouble glacialindex; // used to vary present day temperature
+ 
+-  glacialindex = 0.;//(Delta18oTime-Delta18oPresent-delta18oLapseRate*(Delta18oSurfaceTime-Delta18oSurfacePresent))
+-  //  /(Delta18oLgm-Delta18oPresent-delta18oLapseRate*(Delta18oSurfaceLgm-Delta18oSurfacePresent));
++  // CURENTLY THE TEMPERATURE COMPUTED HERE ARE NOT USED.
++  // Tdiff is used isnstead in PddSurfaceMassBalance.cpp to get the interpolated temperature
+ 
++  glacialindex = (Delta18oTime-Delta18oPresent-delta18oLapseRate*(Delta18oSurfaceTime-Delta18oSurfacePresent))
++    /(Delta18oLgm-Delta18oPresent-delta18oLapseRate*(Delta18oSurfaceLgm-Delta18oSurfacePresent)); // Tarasov 2004 paper
++
+   for (int imonth = 0; imonth<12; imonth++){
+     monthlytemperaturestmp[imonth] = glacialindex*TemperaturesLgm[imonth] + (1.-glacialindex)*TemperaturesPresentday[imonth];
+     //monthlyprectmp[imonth] = 1.5*pow(2,((monthlytemperaturestmp[imonth]-273.15-0)/10)); //equation from rob's paper
+Index: ../trunk-jpl/src/c/shared/Elements/PddSurfaceMassBalance.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Elements/PddSurfaceMassBalance.cpp	(revision 18949)
++++ ../trunk-jpl/src/c/shared/Elements/PddSurfaceMassBalance.cpp	(revision 18950)
+@@ -7,12 +7,16 @@
+ 
+ IssmDouble PddSurfaceMassBlance(IssmDouble* monthlytemperatures, IssmDouble* monthlyprec, 
+ 				IssmDouble* TemperaturesLgm, IssmDouble* TemperaturesPresentday,
++				IssmDouble* PrecipitationsLgm, IssmDouble* PrecipitationsPresentday,
+ 				IssmDouble* pdds, IssmDouble* pds, IssmDouble signorm, 
+-				IssmDouble yts, IssmDouble h, IssmDouble s, IssmDouble rho_ice, 
+-				IssmDouble rho_water, IssmDouble desfac, IssmDouble s0t,
++				IssmDouble yts, IssmDouble h, IssmDouble s, IssmDouble desfac, 
++				IssmDouble s0t,
+ 				IssmDouble s0p, IssmDouble rlaps, IssmDouble rlapslgm, 
+ 				IssmDouble PfacTime,IssmDouble TdiffTime,IssmDouble sealevTime){ 
+ 
++  // CURENTLY monthlytemperatures and monthlyprec ARE NOT USED HERE.
++  // THEY ARE REPLACE BY tdiffh No usage of deltO18 anymore
++
+   // output:
+   IssmDouble B;    // surface mass balance, melt+accumulation
+   int    iqj,imonth;
+@@ -23,18 +27,18 @@
+   IssmDouble prect; // total precipitation during 1 year taking into account des. ef.
+   IssmDouble water; //water=rain + snowmelt 
+   IssmDouble runoff; //meltwater only, does not include rain 
+-  IssmDouble sconv; //rhow_rain/rhoi / 12 months
+ 
+   //IssmDouble  sealev=0.;         // degrees per meter. 7.5 lev's 99 paper, 9 Marshall 99 paper
+   //IssmDouble  Pfac=0.5,Tdiff=0.5;
+   IssmDouble  rtlaps;
+   // IssmDouble lapser=6.5         // lapse rate
+-  // IssmDouble desfac = 0.5;      // desert elevation factor
++  // IssmDouble desfac = 0.3;      // desert elevation factor
+   // IssmDouble s0p=0.;            // should be set to elevation from precip source
+   // IssmDouble s0t=0.;         // should be set to elevation from temperature source
+   IssmDouble tdiffh;  
+   IssmDouble st;             // elevation between altitude of the temp record and current altitude
+   IssmDouble sp;             // elevation between altitude of the prec record and current altitude
++  IssmDouble deselcut=1.0;
+ 
+   // PDD and PD constants and variables
+   IssmDouble siglim;          // sigma limit for the integration which is equal to 2.5 sigmanorm
+@@ -44,10 +48,11 @@
+   IssmDouble DT = 0.02;
+   IssmDouble pddt, pd; // pd: snow/precip fraction, precipitation falling as snow
+ 
+-  IssmDouble q, qmpt; // q is desert/elev. fact, hnpfac is huybrect fact, and pd is normal dist.
+-  IssmDouble qm = 0.;        // snow part of the precipitation 
+-  IssmDouble qmt = 0.;       // precipitation without desertification effect adjustment
+-  IssmDouble qmp = 0.;       // desertification taken into account
++  IssmDouble premt;     // monthly precipitation (m of ice equivalent)
++  IssmDouble q, qmpt;   // q is desert/elev. fact, hnpfac is huybrect fact, and pd is normal dist.
++  IssmDouble qm = 0.;   // snow part of the precipitation 
++  IssmDouble qmt = 0.;  // precipitation without desertification effect adjustment
++  IssmDouble qmp = 0.;  // desertification taken into account
+   IssmDouble pdd = 0.;     
+   IssmDouble frzndd = 0.;  
+ 
+@@ -67,7 +72,6 @@
+   IssmDouble fsupT=0.5,  fsupndd=0.5;  // Tsurf mode factors for supice
+   IssmDouble pddtj, hmx2;
+ 
+-  sconv=(rho_water/rho_ice)/12.; //rhow_rain/rhoi / 12 months
+ 
+   /*PDD constant*/
+   siglim = 2.5*signorm; 
+@@ -97,19 +101,21 @@
+ 	pd = 0.;}
+ 
+       /******exp des/elev precip reduction*******/
+-      sp=(s-s0p)/1000.; // deselev effect is wrt chng in topo
++      sp=(s-s0p)/1000.-deselcut; // deselev effect is wrt chng in topo
+       if (sp>0.0){q = exp(-desfac*sp);}
+       else {q = 1.0;}
+ 
+-      qmt= qmt + monthlyprec[imonth]*sconv;  //*sconv to convert in m of ice equivalent per month
+-      qmpt= q*monthlyprec[imonth]*sconv;           
++      premt =min(1.5, PrecipitationsPresentday[imonth] * pow(PrecipitationsLgm[imonth],PfacTime));   // [m/month]
++
++      qmt= qmt + premt;  
++      qmpt= q*premt;           
+       qmp= qmp + qmpt;
+       qm= qm + qmpt*pd;
+ 
+       /*********compute PDD************/
+       // ndd(month)=-(tstar-pdd(month)) since ndd+pdd gives expectation of
+       // gaussian=T_m, so ndd=-(Tsurf-pdd)
+-      if (iqj>5 &&  iqj<9){ Tsum=Tsum+tstar;} 
++      if (iqj>5 && iqj<9){ Tsum=Tsum+tstar;} 
+ 
+       if (tstar >= siglim) {pdd = pdd + tstar*deltm;}
+       else if (tstar> -siglim){
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18949)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18950)
+@@ -2214,15 +2214,25 @@
+    IssmDouble agd[NUMVERTICES];             // surface mass balance
+    IssmDouble monthlytemperatures[NUMVERTICES][12],monthlyprec[NUMVERTICES][12];
+    IssmDouble TemperaturesPresentday[NUMVERTICES][12],TemperaturesLgm[NUMVERTICES][12];
++   IssmDouble PrecipitationsPresentday[NUMVERTICES][12],PrecipitationsLgm[NUMVERTICES][12];
+    IssmDouble h[NUMVERTICES],s[NUMVERTICES];
+    IssmDouble rho_water,rho_ice,desfac,s0p,s0t,rlaps,rlapslgm;
+    IssmDouble PfacTime,TdiffTime,sealevTime;
++   IssmDouble sconv; //rhow_rain/rhoi / 12 months
++   
++   /*Get material parameters :*/
++   rho_ice=matpar->GetRhoIce();
++   rho_water=matpar->GetRhoFreshwater();
+ 
++   sconv=(rho_water/rho_ice)/12.; //to convert monbthly prec in m of ice equivalent per month
++
+    /*Recover monthly temperatures and precipitation and Present day and LGm ones*/
+    Input*     input=inputs->GetInput(SurfaceforcingsMonthlytemperaturesEnum); _assert_(input);
+    Input*     input2=inputs->GetInput(SurfaceforcingsPrecipitationEnum); _assert_(input2);
+    Input*     input3=inputs->GetInput(SurfaceforcingsTemperaturesPresentdayEnum);    _assert_(input3);
+    Input*     input4=inputs->GetInput(SurfaceforcingsTemperaturesLgmEnum);          _assert_(input4);
++   Input*     input5=inputs->GetInput(SurfaceforcingsPrecipitationsPresentdayEnum);  _assert_(input5);
++   Input*     input6=inputs->GetInput(SurfaceforcingsPrecipitationsLgmEnum);   _assert_(input6);
+    GaussTria* gauss=new GaussTria();
+    IssmDouble time,yts;
+    this->parameters->FindParam(&time,TimeEnum);
+@@ -2233,11 +2243,15 @@
+        input->GetInputValue(&monthlytemperatures[iv][month],gauss,time+month/12.*yts);
+        monthlytemperatures[iv][month]=monthlytemperatures[iv][month]-273.15; // conversion from Kelvin to celcius
+        input2->GetInputValue(&monthlyprec[iv][month],gauss,time+month/12.*yts);
+-       monthlyprec[iv][month]=monthlyprec[iv][month]*yts; // convertion in m/y
++       monthlyprec[iv][month]=monthlyprec[iv][month]*sconv*yts; // convertion in m/y
+        input3->GetInputValue(&TemperaturesPresentday[iv][month],gauss,month/12.*yts);
+        TemperaturesPresentday[iv][month]=TemperaturesPresentday[iv][month]-273.15; // conversion from Kelvin to celcius
+        input4->GetInputValue(&TemperaturesLgm[iv][month],gauss,month/12.*yts);
+        TemperaturesLgm[iv][month]=TemperaturesLgm[iv][month]-273.15; // conversion from Kelvin to celcius
++       input5->GetInputValue(&PrecipitationsPresentday[iv][month],gauss,month/12.*yts);
++       PrecipitationsPresentday[iv][month]=PrecipitationsPresentday[iv][month]; 
++       input6->GetInputValue(&PrecipitationsLgm[iv][month],gauss,month/12.*yts);
++       PrecipitationsLgm[iv][month]=PrecipitationsLgm[iv][month];  
+      }
+    }
+ 
+@@ -2250,10 +2264,6 @@
+   GetInputListOnVertices(&h[0],ThicknessEnum);
+   GetInputListOnVertices(&s[0],SurfaceEnum);
+ 
+-  /*Get material parameters :*/
+-  rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
+-  rho_water=matpar->GetMaterialParameter(MaterialsRhoFreshwaterEnum);
+-
+   /*Get other pdd parameters*/
+   desfac=matpar->GetMaterialParameter(SurfaceforcingsDesfacEnum);
+   s0p=matpar->GetMaterialParameter(SurfaceforcingsS0pEnum);
+@@ -2265,7 +2275,8 @@
+    for (int iv = 0; iv<NUMVERTICES; iv++){
+      agd[iv]=PddSurfaceMassBlance(&monthlytemperatures[iv][0], &monthlyprec[iv][0],
+ 				  &TemperaturesLgm[iv][0], &TemperaturesPresentday[iv][0], 
+-				  pdds, pds, signorm, yts, h[iv], s[iv], rho_ice, rho_water, 
++				  &PrecipitationsLgm[iv][0], &PrecipitationsPresentday[iv][0], 
++				  pdds, pds, signorm, yts, h[iv], s[iv],
+ 				  desfac, s0t, s0p,rlaps,rlapslgm,PfacTime,TdiffTime,sealevTime);
+    }
+ 
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18949)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18950)
+@@ -2011,30 +2011,45 @@
+    IssmDouble agd[NUMVERTICES];             // surface mass balance
+    IssmDouble monthlytemperatures[NUMVERTICES][12],monthlyprec[NUMVERTICES][12];
+    IssmDouble TemperaturesPresentday[NUMVERTICES][12],TemperaturesLgm[NUMVERTICES][12];
++   IssmDouble PrecipitationsPresentday[NUMVERTICES][12],PrecipitationsLgm[NUMVERTICES][12];
+    IssmDouble h[NUMVERTICES],s[NUMVERTICES];
+    IssmDouble rho_water,rho_ice,desfac,s0p,s0t,rlaps,rlapslgm;
+    IssmDouble PfacTime,TdiffTime,sealevTime;
++   IssmDouble sconv; //rhow_rain/rhoi / 12 months
+ 
++   /*Get material parameters :*/
++   rho_ice=matpar->GetRhoIce();
++   rho_water=matpar->GetRhoFreshwater();
++
++   sconv=(rho_water/rho_ice)/12.; //to convert monbthly prec in m of ice equivalent per month
++
+    /*Recover monthly temperatures and precipitation*/
+    Input*     input=inputs->GetInput(SurfaceforcingsMonthlytemperaturesEnum); _assert_(input);
+    Input*     input2=inputs->GetInput(SurfaceforcingsPrecipitationEnum); _assert_(input2);
+    Input*     input3=inputs->GetInput(SurfaceforcingsTemperaturesPresentdayEnum);  _assert_(input3);
+    Input*     input4=inputs->GetInput(SurfaceforcingsTemperaturesLgmEnum);   _assert_(input4);
++   Input*     input5=inputs->GetInput(SurfaceforcingsPrecipitationsPresentdayEnum);  _assert_(input5);
++   Input*     input6=inputs->GetInput(SurfaceforcingsPrecipitationsLgmEnum);   _assert_(input6);
+    GaussPenta* gauss=new GaussPenta();
+    IssmDouble time,yts;
+    this->parameters->FindParam(&time,TimeEnum);
+    this->parameters->FindParam(&yts,ConstantsYtsEnum);
++   
+    for(int month=0;month<12;month++) {
+      for(int iv=0;iv<NUMVERTICES;iv++) {
+        gauss->GaussVertex(iv);
+        input->GetInputValue(&monthlytemperatures[iv][month],gauss,time+month/12.*yts);
+        monthlytemperatures[iv][month]=monthlytemperatures[iv][month]-273.15; // conversion from Kelvin to celcius
+        input2->GetInputValue(&monthlyprec[iv][month],gauss,time+month/12.*yts);
+-       monthlyprec[iv][month]=monthlyprec[iv][month]*yts; // convertion to m/yr
++       monthlyprec[iv][month]=monthlyprec[iv][month]*sconv; // convertion to m/yr
+        input3->GetInputValue(&TemperaturesPresentday[iv][month],gauss,month/12.*yts);
+        TemperaturesPresentday[iv][month]=TemperaturesPresentday[iv][month]-273.15; // conversion from Kelvin to celcius
+        input4->GetInputValue(&TemperaturesLgm[iv][month],gauss,month/12.*yts);
+        TemperaturesLgm[iv][month]=TemperaturesLgm[iv][month]-273.15; // conversion from Kelvin to celcius
++       input5->GetInputValue(&PrecipitationsPresentday[iv][month],gauss,month/12.*yts);
++       PrecipitationsPresentday[iv][month]=PrecipitationsPresentday[iv][month]; 
++       input6->GetInputValue(&PrecipitationsLgm[iv][month],gauss,month/12.*yts);
++       PrecipitationsLgm[iv][month]=PrecipitationsLgm[iv][month];  
+      }
+    } 
+ 
+@@ -2045,12 +2060,8 @@
+ 
+   /*Recover info at the vertices: */
+   GetInputListOnVertices(&h[0],ThicknessEnum);
+-  GetInputListOnVertices(&s[0],SurfaceEnum);
++  GetInputListOnVertices(&s[0],SurfaceEnum); 
+ 
+-  /*Get material parameters :*/
+-  rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
+-  rho_water=matpar->GetMaterialParameter(MaterialsRhoFreshwaterEnum);
+-
+   /*Get other pdd parameters*/
+   desfac=matpar->GetMaterialParameter(SurfaceforcingsDesfacEnum);
+   s0p=matpar->GetMaterialParameter(SurfaceforcingsS0pEnum);
+@@ -2062,7 +2073,8 @@
+    for (int iv = 0; iv < NUMVERTICES; iv++){
+      agd[iv]=PddSurfaceMassBlance(&monthlytemperatures[iv][0], &monthlyprec[iv][0],  
+ 				  &TemperaturesLgm[iv][0], &TemperaturesPresentday[iv][0], 
+-				  pdds,pds, signorm, yts, h[iv], s[iv], rho_ice, rho_water,
++				  &PrecipitationsLgm[iv][0], &PrecipitationsPresentday[iv][0], 
++				  pdds,pds, signorm, yts, h[iv], s[iv],
+ 				  desfac, s0t, s0p,rlaps,rlapslgm,PfacTime,TdiffTime,sealevTime);
+    }
+ 
+Index: ../trunk-jpl/src/m/plot/processmesh.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/processmesh.m	(revision 18949)
++++ ../trunk-jpl/src/m/plot/processmesh.m	(revision 18950)
+@@ -20,16 +20,15 @@
+ 	return;
+ end
+ 
+-%first load x,y, etc ... to speed up plot
+-if ~strcmpi(getfieldvalue(options,'coord','xy'),'latlon'),
+-	x=md.mesh.x;
+-	if isprop(md.mesh,'x2d'), x2d=md.mesh.x2d; end
+-	y=md.mesh.y;
+-	if isprop(md.mesh,'y2d'), y2d=md.mesh.y2d; end
+-else
+-	x=md.mesh.long;
+-	y=md.mesh.lat;
+-end
++	if ~strcmpi(getfieldvalue(options,'coord','xy'),'latlon'),
++		x=md.mesh.x;
++		x2d=md.mesh.x2d; %if isprop(md.mesh,'x2d'), x2d=md.mesh.x2d; end
++		y=md.mesh.y;
++		y2d=md.mesh.y2d; %if isprop(md.mesh,'y2d'), y2d=md.mesh.y2d; end
++	else
++		x=md.mesh.long;
++		y=md.mesh.lat;
++	end
+ 
+ if isprop(md.mesh,'z'),
+ 	z=md.mesh.z;
+@@ -41,8 +40,8 @@
+ 	z=md.(z);
+ end
+ 
+-if isprop(md.mesh,'elements2d'), elements2d=md.mesh.elements2d; end
+-elements=md.mesh.elements;
++	elements2d=md.mesh.elements2d;%if isprop(md.mesh,'elements2d'), elements2d=md.mesh.elements2d; end
++	elements=md.mesh.elements;
+ 
+ %is it a 2d plot?
+ if md.mesh.dimension()==2,
+Index: ../trunk-jpl/src/m/classes/SMBpdd.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBpdd.m	(revision 18949)
++++ ../trunk-jpl/src/m/classes/SMBpdd.m	(revision 18950)
+@@ -10,17 +10,18 @@
+ 		desfac                    = 0;
+ 		s0p                       = 0;
+ 		s0t                       = 0;
+-      rlaps                     = 0;
+-      rlapslgm                  = 0;                
+-      Pfac                      = NaN;
+-      Tdiff                     = NaN;
+-      sealev                    = NaN;
++                rlaps                     = 0;
++                rlapslgm                  = 0;                
++                Pfac                      = NaN;
++                Tdiff                     = NaN;
++                sealev                    = NaN;
+ 		isdelta18o                = 0;
+ 		delta18o                  = NaN;
+ 		delta18o_surface          = NaN;
+ 		temperatures_presentday   = NaN;
+ 		temperatures_lgm          = NaN;
+ 		precipitations_presentday = NaN;
++		precipitations_lgm        = NaN;
+ 	end
+ 	methods
+ 		function obj = SMBpdd(varargin) % {{{
+@@ -38,6 +39,7 @@
+ 			if(self.isdelta18o),self.temperatures_lgm=project3d(md,'vector',self.temperatures_lgm,'type','node');end
+ 			if(self.isdelta18o),self.temperatures_presentday=project3d(md,'vector',self.temperatures_presentday,'type','node');end
+ 			if(self.isdelta18o),self.precipitations_presentday=project3d(md,'vector',self.precipitations_presentday,'type','node');end
++			if(self.isdelta18o),self.precipitations_lgm=project3d(md,'vector',self.precipitations_lgm,'type','node');end
+ 
+ 
+ 		end % }}}
+@@ -79,6 +81,7 @@
+ 					md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
+ 					md = checkfield(md,'fieldname','surfaceforcings.temperatures_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1);
+ 					md = checkfield(md,'fieldname','surfaceforcings.precipitations_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
++					md = checkfield(md,'fieldname','surfaceforcings.precipitations_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1);
+ 				end
+ 			end
+ 		end % }}}
+@@ -95,11 +98,12 @@
+ 			fielddisplay(obj,'Pfac','time interpolation parameter for precipitation, 1D(year)');
+ 			fielddisplay(obj,'Tdiff','time interpolation parameter for temperature, 1D(year)');
+ 			fielddisplay(obj,'sealev','sea level [m], 1D(year)');
+-			fielddisplay(obj,'monthlytemperatures','monthly surface temperatures [K], required if pdd is activated and delta18o not activated');
+-			fielddisplay(obj,'precipitation','surface precipitation [m/yr water eq]');
++			fielddisplay(obj,'monthlytemperatures',['CURRENTLY NOT USED monthly surface temperatures [K], required if pdd is activated and delta18o not activated']);
++			fielddisplay(obj,'precipitation',['CURRENTLY NOT USED monthly surface precipitation [m/yr water eq]']);
+ 			fielddisplay(obj,'temperatures_presentday','monthly present day surface temperatures [K], required if pdd is activated and delta18o activated');
+ 			fielddisplay(obj,'temperatures_lgm','monthly LGM surface temperatures [K], required if pdd is activated and delta18o activated');
+ 			fielddisplay(obj,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if pdd is activated and delta18o activated');
++			fielddisplay(obj,'precipitations_lgm','monthly surface precipitation [m/yr water eq], required if pdd is activated and delta18o activated');
+ 			fielddisplay(obj,'delta18o','delta18o, required if pdd is activated and delta18o activated');
+ 			fielddisplay(obj,'delta18o_surface','surface elevation of the delta18o site, required if pdd is activated and delta18o activated');
+ 
+@@ -124,6 +128,7 @@
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1);
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_lgm','format','DoubleMat','mattype',1);
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitations_presentday','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitations_lgm','format','DoubleMat','mattype',1);
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','delta18o_surface','format','DoubleMat','mattype',1);
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','delta18o','format','DoubleMat','mattype',1);
+ 			else
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18949)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18950)
+@@ -339,6 +339,7 @@
+ def SurfaceforcingsDelta18oSurfaceEnum(): return StringToEnum("SurfaceforcingsDelta18oSurface")[0]
+ def SurfaceforcingsIsdelta18oEnum(): return StringToEnum("SurfaceforcingsIsdelta18o")[0]
+ def SurfaceforcingsPrecipitationsPresentdayEnum(): return StringToEnum("SurfaceforcingsPrecipitationsPresentday")[0]
++def SurfaceforcingsPrecipitationsLgmEnum(): return StringToEnum("SurfaceforcingsPrecipitationsLgm")[0]
+ def SurfaceforcingsTemperaturesPresentdayEnum(): return StringToEnum("SurfaceforcingsTemperaturesPresentday")[0]
+ def SurfaceforcingsTemperaturesLgmEnum(): return StringToEnum("SurfaceforcingsTemperaturesLgm")[0]
+ def SurfaceforcingsPrecipitationEnum(): return StringToEnum("SurfaceforcingsPrecipitation")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18950-18951.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18950-18951.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18950-18951.diff	(revision 19102)
@@ -0,0 +1,34 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18950)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18951)
+@@ -2221,8 +2221,10 @@
+    IssmDouble sconv; //rhow_rain/rhoi / 12 months
+    
+    /*Get material parameters :*/
+-   rho_ice=matpar->GetRhoIce();
+-   rho_water=matpar->GetRhoFreshwater();
++   rho_water=matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
++   rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
++   //rho_ice=matpar->GetRhoIce();
++   //rho_water=matpar->GetRhoFreshwater();
+ 
+    sconv=(rho_water/rho_ice)/12.; //to convert monbthly prec in m of ice equivalent per month
+ 
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18950)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18951)
+@@ -2018,8 +2018,10 @@
+    IssmDouble sconv; //rhow_rain/rhoi / 12 months
+ 
+    /*Get material parameters :*/
+-   rho_ice=matpar->GetRhoIce();
+-   rho_water=matpar->GetRhoFreshwater();
++   rho_water=matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
++   rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
++   //rho_ice=matpar->GetRhoIce();
++   //rho_water=matpar->GetRhoFreshwater();
+ 
+    sconv=(rho_water/rho_ice)/12.; //to convert monbthly prec in m of ice equivalent per month
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18951-18952.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18951-18952.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18951-18952.diff	(revision 19102)
@@ -0,0 +1,40 @@
+Index: ../trunk-jpl/src/m/plot/processmesh.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/processmesh.m	(revision 18951)
++++ ../trunk-jpl/src/m/plot/processmesh.m	(revision 18952)
+@@ -20,15 +20,15 @@
+ 	return;
+ end
+ 
+-	if ~strcmpi(getfieldvalue(options,'coord','xy'),'latlon'),
+-		x=md.mesh.x;
+-		x2d=md.mesh.x2d; %if isprop(md.mesh,'x2d'), x2d=md.mesh.x2d; end
+-		y=md.mesh.y;
+-		y2d=md.mesh.y2d; %if isprop(md.mesh,'y2d'), y2d=md.mesh.y2d; end
+-	else
+-		x=md.mesh.long;
+-		y=md.mesh.lat;
+-	end
++if ~strcmpi(getfieldvalue(options,'coord','xy'),'latlon'),
++	x=md.mesh.x;
++	if isprop(md.mesh,'x2d'), x2d=md.mesh.x2d; end
++	y=md.mesh.y;
++	if isprop(md.mesh,'y2d'), y2d=md.mesh.y2d; end
++else
++	x=md.mesh.long;
++	y=md.mesh.lat;
++end
+ 
+ if isprop(md.mesh,'z'),
+ 	z=md.mesh.z;
+@@ -40,8 +40,8 @@
+ 	z=md.(z);
+ end
+ 
+-	elements2d=md.mesh.elements2d;%if isprop(md.mesh,'elements2d'), elements2d=md.mesh.elements2d; end
+-	elements=md.mesh.elements;
++if isprop(md.mesh,'elements2d'), elements2d=md.mesh.elements2d; end
++elements=md.mesh.elements;
+ 
+ %is it a 2d plot?
+ if md.mesh.dimension()==2,
Index: /issm/oecreview/Archive/18296-19100/ISSM-18952-18953.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18952-18953.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18952-18953.diff	(revision 19102)
@@ -0,0 +1,719 @@
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18952)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18953)
+@@ -63,6 +63,10 @@
+ 				iomodel->FetchDataToInput(elements,CalvinglevermannCoeffEnum);
+ 				iomodel->FetchDataToInput(elements,CalvinglevermannMeltingrateEnum);
+ 				break;
++			case CalvingPiEnum:
++				iomodel->FetchDataToInput(elements,CalvingpiCoeffEnum);
++				iomodel->FetchDataToInput(elements,CalvingpiMeltingrateEnum);
++				break;
+ 			default:
+ 				_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
+ 		}
+@@ -207,6 +211,22 @@
+ 				}
+ 				meltingrate_input = basalelement->GetInput(CalvinglevermannMeltingrateEnum);     _assert_(meltingrate_input);
+ 				break;
++			case CalvingPiEnum:
++				if(domaintype==Domain2DhorizontalEnum){
++					calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
++					calvingratey_input=basalelement->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
++				}
++				else{
++					if(dim==1){
++						calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
++					}
++					if(dim==2){
++						calvingratex_input=basalelement->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
++						calvingratey_input=basalelement->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
++					}
++				}
++				meltingrate_input = basalelement->GetInput(CalvingpiMeltingrateEnum);     _assert_(meltingrate_input);
++				break;
+ 			default:
+ 				_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
+ 		}
+@@ -261,6 +281,7 @@
+ 					 }
+ 
+ 					break;
++
+ 				case CalvingLevermannEnum:
+ 					calvingratex_input->GetInputValue(&c[0],gauss); // in 3D case, add mesh velocity 
+ 					if(dim==2) calvingratey_input->GetInputValue(&c[1],gauss);
+@@ -273,6 +294,20 @@
+ 					for(i=0;i<dim;i++) m[i]=meltingrate*c[i]/norm_calving;
+ 					
+ 					break;
++
++				case CalvingPiEnum:
++					calvingratex_input->GetInputValue(&c[0],gauss); // in 3D case, add mesh velocity
++					if(dim==2) calvingratey_input->GetInputValue(&c[1],gauss);
++					meltingrate_input->GetInputValue(&meltingrate,gauss);
++
++					norm_calving=0.;
++					for(i=0;i<dim;i++) norm_calving+=pow(c[i],2);
++					norm_calving=sqrt(norm_calving)+1.e-14;
++
++					for(i=0;i<dim;i++) m[i]=meltingrate*c[i]/norm_calving;
++
++					break;
++
+ 				default:
+ 					_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
+ 			}
+@@ -348,7 +383,6 @@
+ 	xDelete<IssmDouble>(v);
+ 	xDelete<IssmDouble>(w);
+ 	xDelete<IssmDouble>(c);
+-	xDelete<IssmDouble>(m);
+ 	xDelete<IssmDouble>(dlsf);
+ 	delete gauss;
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18952)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18953)
+@@ -214,10 +214,13 @@
+ 	CalvingCalvingrateEnum,
+ 	CalvingMeltingrateEnum,
+ 	CalvingLevermannEnum,
++	CalvingPiEnum,
+ 	DefaultCalvingEnum,
+ 	CalvingRequestedOutputsEnum,
+ 	CalvinglevermannCoeffEnum,
+ 	CalvinglevermannMeltingrateEnum,
++	CalvingpiCoeffEnum,
++	CalvingpiMeltingrateEnum,
+ 	CalvingratexEnum,
+ 	CalvingrateyEnum,
+ 	CalvingratexAverageEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18952)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18953)
+@@ -222,10 +222,13 @@
+ 		case CalvingCalvingrateEnum : return "CalvingCalvingrate";
+ 		case CalvingMeltingrateEnum : return "CalvingMeltingrate";
+ 		case CalvingLevermannEnum : return "CalvingLevermann";
++		case CalvingPiEnum : return "CalvingPi";
+ 		case DefaultCalvingEnum : return "DefaultCalving";
+ 		case CalvingRequestedOutputsEnum : return "CalvingRequestedOutputs";
+ 		case CalvinglevermannCoeffEnum : return "CalvinglevermannCoeff";
+ 		case CalvinglevermannMeltingrateEnum : return "CalvinglevermannMeltingrate";
++		case CalvingpiCoeffEnum : return "CalvingpiCoeff";
++		case CalvingpiMeltingrateEnum : return "CalvingpiMeltingrate";
+ 		case CalvingratexEnum : return "Calvingratex";
+ 		case CalvingrateyEnum : return "Calvingratey";
+ 		case CalvingratexAverageEnum : return "CalvingratexAverage";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18952)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18953)
+@@ -225,10 +225,13 @@
+ 	      else if (strcmp(name,"CalvingCalvingrate")==0) return CalvingCalvingrateEnum;
+ 	      else if (strcmp(name,"CalvingMeltingrate")==0) return CalvingMeltingrateEnum;
+ 	      else if (strcmp(name,"CalvingLevermann")==0) return CalvingLevermannEnum;
++	      else if (strcmp(name,"CalvingPi")==0) return CalvingPiEnum;
+ 	      else if (strcmp(name,"DefaultCalving")==0) return DefaultCalvingEnum;
+ 	      else if (strcmp(name,"CalvingRequestedOutputs")==0) return CalvingRequestedOutputsEnum;
+ 	      else if (strcmp(name,"CalvinglevermannCoeff")==0) return CalvinglevermannCoeffEnum;
+ 	      else if (strcmp(name,"CalvinglevermannMeltingrate")==0) return CalvinglevermannMeltingrateEnum;
++	      else if (strcmp(name,"CalvingpiCoeff")==0) return CalvingpiCoeffEnum;
++	      else if (strcmp(name,"CalvingpiMeltingrate")==0) return CalvingpiMeltingrateEnum;
+ 	      else if (strcmp(name,"Calvingratex")==0) return CalvingratexEnum;
+ 	      else if (strcmp(name,"Calvingratey")==0) return CalvingrateyEnum;
+ 	      else if (strcmp(name,"CalvingratexAverage")==0) return CalvingratexAverageEnum;
+@@ -256,13 +259,13 @@
+ 	      else if (strcmp(name,"MeshNumberofvertices2d")==0) return MeshNumberofvertices2dEnum;
+ 	      else if (strcmp(name,"MeshNumberofvertices")==0) return MeshNumberofverticesEnum;
+ 	      else if (strcmp(name,"MeshUpperelements")==0) return MeshUpperelementsEnum;
+-	      else if (strcmp(name,"MeshVertexonbase")==0) return MeshVertexonbaseEnum;
+-	      else if (strcmp(name,"MeshVertexonsurface")==0) return MeshVertexonsurfaceEnum;
+-	      else if (strcmp(name,"MeshVertexonboundary")==0) return MeshVertexonboundaryEnum;
+          else stage=3;
+    }
+    if(stage==3){
+-	      if (strcmp(name,"MeshX")==0) return MeshXEnum;
++	      if (strcmp(name,"MeshVertexonbase")==0) return MeshVertexonbaseEnum;
++	      else if (strcmp(name,"MeshVertexonsurface")==0) return MeshVertexonsurfaceEnum;
++	      else if (strcmp(name,"MeshVertexonboundary")==0) return MeshVertexonboundaryEnum;
++	      else if (strcmp(name,"MeshX")==0) return MeshXEnum;
+ 	      else if (strcmp(name,"MeshY")==0) return MeshYEnum;
+ 	      else if (strcmp(name,"MeshZ")==0) return MeshZEnum;
+ 	      else if (strcmp(name,"MeshElementtype")==0) return MeshElementtypeEnum;
+@@ -379,13 +382,13 @@
+ 	      else if (strcmp(name,"SMBmeltcomponents")==0) return SMBmeltcomponentsEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsMelt")==0) return SurfaceforcingsMeltEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsRefreeze")==0) return SurfaceforcingsRefreezeEnum;
+-	      else if (strcmp(name,"SurfaceforcingsIspdd")==0) return SurfaceforcingsIspddEnum;
+-	      else if (strcmp(name,"SurfaceforcingsIssmbgradients")==0) return SurfaceforcingsIssmbgradientsEnum;
+-	      else if (strcmp(name,"SolutionType")==0) return SolutionTypeEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"AnalysisType")==0) return AnalysisTypeEnum;
++	      if (strcmp(name,"SurfaceforcingsIspdd")==0) return SurfaceforcingsIspddEnum;
++	      else if (strcmp(name,"SurfaceforcingsIssmbgradients")==0) return SurfaceforcingsIssmbgradientsEnum;
++	      else if (strcmp(name,"SolutionType")==0) return SolutionTypeEnum;
++	      else if (strcmp(name,"AnalysisType")==0) return AnalysisTypeEnum;
+ 	      else if (strcmp(name,"ConfigurationType")==0) return ConfigurationTypeEnum;
+ 	      else if (strcmp(name,"AdjointBalancethicknessAnalysis")==0) return AdjointBalancethicknessAnalysisEnum;
+ 	      else if (strcmp(name,"AdjointBalancethickness2Analysis")==0) return AdjointBalancethickness2AnalysisEnum;
+@@ -502,13 +505,13 @@
+ 	      else if (strcmp(name,"Masscon")==0) return MassconEnum;
+ 	      else if (strcmp(name,"MassconName")==0) return MassconNameEnum;
+ 	      else if (strcmp(name,"MassconDefinitionenum")==0) return MassconDefinitionenumEnum;
+-	      else if (strcmp(name,"MassconLevelset")==0) return MassconLevelsetEnum;
+-	      else if (strcmp(name,"Massconaxpby")==0) return MassconaxpbyEnum;
+-	      else if (strcmp(name,"MassconaxpbyName")==0) return MassconaxpbyNameEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"MassconaxpbyDefinitionenum")==0) return MassconaxpbyDefinitionenumEnum;
++	      if (strcmp(name,"MassconLevelset")==0) return MassconLevelsetEnum;
++	      else if (strcmp(name,"Massconaxpby")==0) return MassconaxpbyEnum;
++	      else if (strcmp(name,"MassconaxpbyName")==0) return MassconaxpbyNameEnum;
++	      else if (strcmp(name,"MassconaxpbyDefinitionenum")==0) return MassconaxpbyDefinitionenumEnum;
+ 	      else if (strcmp(name,"MassconaxpbyNamex")==0) return MassconaxpbyNamexEnum;
+ 	      else if (strcmp(name,"MassconaxpbyNamey")==0) return MassconaxpbyNameyEnum;
+ 	      else if (strcmp(name,"MassconaxpbyAlpha")==0) return MassconaxpbyAlphaEnum;
+@@ -625,13 +628,13 @@
+ 	      else if (strcmp(name,"DeviatoricStressyy")==0) return DeviatoricStressyyEnum;
+ 	      else if (strcmp(name,"DeviatoricStressyz")==0) return DeviatoricStressyzEnum;
+ 	      else if (strcmp(name,"DeviatoricStresszz")==0) return DeviatoricStresszzEnum;
+-	      else if (strcmp(name,"StrainRate")==0) return StrainRateEnum;
+-	      else if (strcmp(name,"StrainRatexx")==0) return StrainRatexxEnum;
+-	      else if (strcmp(name,"StrainRatexy")==0) return StrainRatexyEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"StrainRatexz")==0) return StrainRatexzEnum;
++	      if (strcmp(name,"StrainRate")==0) return StrainRateEnum;
++	      else if (strcmp(name,"StrainRatexx")==0) return StrainRatexxEnum;
++	      else if (strcmp(name,"StrainRatexy")==0) return StrainRatexyEnum;
++	      else if (strcmp(name,"StrainRatexz")==0) return StrainRatexzEnum;
+ 	      else if (strcmp(name,"StrainRateyy")==0) return StrainRateyyEnum;
+ 	      else if (strcmp(name,"StrainRateyz")==0) return StrainRateyzEnum;
+ 	      else if (strcmp(name,"StrainRatezz")==0) return StrainRatezzEnum;
+@@ -748,13 +751,13 @@
+ 	      else if (strcmp(name,"Gset")==0) return GsetEnum;
+ 	      else if (strcmp(name,"Index")==0) return IndexEnum;
+ 	      else if (strcmp(name,"Indexed")==0) return IndexedEnum;
+-	      else if (strcmp(name,"Intersect")==0) return IntersectEnum;
+-	      else if (strcmp(name,"Nodal")==0) return NodalEnum;
+-	      else if (strcmp(name,"OldGradient")==0) return OldGradientEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"OutputFilePointer")==0) return OutputFilePointerEnum;
++	      if (strcmp(name,"Intersect")==0) return IntersectEnum;
++	      else if (strcmp(name,"Nodal")==0) return NodalEnum;
++	      else if (strcmp(name,"OldGradient")==0) return OldGradientEnum;
++	      else if (strcmp(name,"OutputFilePointer")==0) return OutputFilePointerEnum;
+ 	      else if (strcmp(name,"ToolkitsFileName")==0) return ToolkitsFileNameEnum;
+ 	      else if (strcmp(name,"RootPath")==0) return RootPathEnum;
+ 	      else if (strcmp(name,"OutputFileName")==0) return OutputFileNameEnum;
+Index: ../trunk-jpl/src/c/cores/transient_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/transient_core.cpp	(revision 18952)
++++ ../trunk-jpl/src/c/cores/transient_core.cpp	(revision 18953)
+@@ -108,6 +108,11 @@
+ 				femmodel->StrainRateperpendicularx();
+ 				femmodel->CalvingRateLevermannx();
+ 			}
++			if(iscalving && calvinglaw==CalvingPiEnum){
++				if(VerboseSolution()) _printf0_("   computing calving rate\n");
++				femmodel->StrainRateparallelx();
++				femmodel->CalvingRatePix();
++			}
+ 			if(VerboseSolution()) _printf0_("   computing movement of ice boundaries\n");
+ 			/* smoothen slope of lsf for computation of normal on ice domain*/
+ 			levelsetfunctionslope_core(femmodel);
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18952)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18953)
+@@ -1734,6 +1734,14 @@
+ 							   }
+ }
+ /*}}}*/
++void FemModel::CalvingRatePix(){/*{{{*/
++
++	   for(int i=0;i<elements->Size();i++){
++			      Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++					      element->CalvingRatePi();
++							   }
++}
++/*}}}*/
+ void FemModel::StrainRateparallelx(){/*{{{*/
+ 
+ 	   for(int i=0;i<elements->Size();i++){
+Index: ../trunk-jpl/src/c/classes/Elements/Element.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18952)
++++ ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18953)
+@@ -169,6 +169,7 @@
+ 		virtual void       AddInput(int input_enum, IssmDouble* values, int interpolation_enum)=0;
+ 		virtual void       AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part)=0;
+ 		virtual void	    CalvingRateLevermann(void)=0;
++		virtual void       CalvingRatePi(void)=0;
+ 		virtual IssmDouble CharacteristicLength(void)=0;
+ 		virtual void       ComputeBasalStress(Vector<IssmDouble>* sigma_b)=0;
+ 		virtual void       ComputeDeviatoricStressTensor(void)=0;
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18952)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18953)
+@@ -233,8 +233,8 @@
+ 		if(calvingrate[iv]<0){
+ 			calvingrate[iv]=0;
+ 		}
+-		calvingratex[iv]=calvingrate[iv]*vx/(vel+1.e-6);
+-		calvingratey[iv]=calvingrate[iv]*vy/(vel+1.e-6);
++		calvingratex[iv]=calvingrate[iv]*vx/(sqrt(vel)+1.e-14);
++		calvingratey[iv]=calvingrate[iv]*vy/(sqrt(vel)+1.e-14);
+ 	}
+ 
+ 	/*Add input*/
+@@ -247,6 +247,84 @@
+ 
+ }
+ /*}}}*/
++void       Tria::CalvingRatePi(){/*{{{*/
++
++	IssmDouble  xyz_list[NUMVERTICES][3];
++	GaussTria* gauss=NULL;
++	IssmDouble  vx,vy,vel;
++	IssmDouble  strainparallel;
++	IssmDouble  sxx;
++	IssmDouble  sxy;
++	IssmDouble  syy;
++	IssmDouble  sigVM;
++	IssmDouble  thickness;
++	IssmDouble  base;
++	IssmDouble  hAB;
++	IssmDouble  propcoeff;
++	IssmDouble  calvingratex[NUMVERTICES];
++	IssmDouble  calvingratey[NUMVERTICES];
++	IssmDouble  calvingrate[NUMVERTICES];
++
++
++	/* Get node coordinates and dof list: */
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++
++	/*Retrieve all inputs and parameters we will need*/
++	Input* vx_input=inputs->GetInput(VxEnum);                                                    _assert_(vx_input);
++	Input* vy_input=inputs->GetInput(VyEnum);                                                    _assert_(vy_input);
++	Input* strainparallel_input=inputs->GetInput(StrainRateparallelEnum);                        _assert_(strainparallel_input);
++	Input* sxx_input=inputs->GetInput(DeviatoricStressxxEnum);                                   _assert_(sxx_input);
++	Input* sxy_input=inputs->GetInput(DeviatoricStressxyEnum);                                   _assert_(sxy_input);
++	Input* syy_input=inputs->GetInput(DeviatoricStressyyEnum);                                   _assert_(syy_input);
++	Input* thickness_input=inputs->GetInput(ThicknessEnum);                                      _assert_(thickness_input);
++	Input* base_input=inputs->GetInput(BaseEnum);                                                _assert_(base_input);
++	Input* picoeff_input=inputs->GetInput(CalvingpiCoeffEnum);                                   _assert_(picoeff_input);
++
++
++
++	/* Start looping on the number of vertices: */
++	gauss=new GaussTria();
++	for (int iv=0;iv<NUMVERTICES;iv++){
++		gauss->GaussVertex(iv);
++
++		/* Get the value we need*/
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		vel=vx*vx+vy*vy;
++		strainparallel_input->GetInputValue(&strainparallel,gauss);
++		sxx_input->GetInputValue(&sxx,gauss);
++		sxy_input->GetInputValue(&sxy,gauss);
++		syy_input->GetInputValue(&syy,gauss);
++		thickness_input->GetInputValue(&thickness,gauss);
++		base_input->GetInputValue(&base,gauss);
++		picoeff_input->GetInputValue(&propcoeff,gauss);
++
++		/* Computing sigma Von Mises*/
++		sigVM=sqrt(sxx*sxx+syy*syy+3*sxy*sxy-sxx*syy);
++
++		/* Computing heigth above buoyancy*/
++		hAB=thickness+1028/920*base;
++
++		/*Calving rate for Pi criterion proportionnal to the product of the strain rate along the ice flow direction and the Von Mises stress and the square of the glacier width (hardcoded) divided by the height above buoyancy and the max of the ice velocity power 3 and the ice density (ignored here)*/
++
++		calvingrate[iv]=propcoeff*strainparallel*sigVM*25.e6/hAB/1e9;
++		if(calvingrate[iv]<0){
++			calvingrate[iv]=0;
++		}
++		calvingratex[iv]=calvingrate[iv]*vx/(sqrt(vel)+1.e-14);
++		calvingratey[iv]=calvingrate[iv]*vy/(sqrt(vel)+1.e-14);
++	}
++
++	/*Add input*/
++	this->inputs->AddInput(new TriaInput(CalvingratexEnum,&calvingratex[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(CalvingrateyEnum,&calvingratey[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(CalvingCalvingrateEnum,&calvingrate[0],P1Enum));
++
++	/*Clean up and return*/
++	delete gauss;
++
++}
++/*}}}*/
+ IssmDouble Tria::CharacteristicLength(void){/*{{{*/
+ 
+ 	return sqrt(2*this->GetArea());
+@@ -2583,7 +2661,7 @@
+ 		strainxy=epsilon[2];
+ 
+ 		/*strainparallel= Strain rate along the ice flow direction */
+-		strainparallel[iv]=(vx*vx*(strainxx)+vy*vy*(strainyy)+2*vy*vx*strainxy)/(vel+1.e-6);
++		strainparallel[iv]=(vx*vx*(strainxx)+vy*vy*(strainyy)+2*vy*vx*strainxy)/(vel+1.e-14);
+ 	}
+ 
+ 	/*Add input*/
+@@ -2629,7 +2707,7 @@
+ 		strainxy=epsilon[2];
+ 
+ 		/*strainperpendicular= Strain rate perpendicular to the ice flow direction */
+-		strainperpendicular[iv]=(vx*vx*(strainyy)+vy*vy*(strainxx)-2*vy*vx*strainxy)/(vel+1.e-6);
++		strainperpendicular[iv]=(vx*vx*(strainyy)+vy*vy*(strainxx)-2*vy*vx*strainxy)/(vel+1.e-14);
+ 	}
+ 
+ 	/*Add input*/
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18952)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18953)
+@@ -57,6 +57,7 @@
+ 		void        ComputeSigmaNN();
+ 		void        ComputeStressTensor();
+ 		void        ComputeSurfaceNormalVelocity();
++		void			CalvingRatePi();
+ 		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters);
+ 		void        ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index);
+ 		void        ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum);
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18952)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18953)
+@@ -200,8 +200,8 @@
+ 		if(calvingrate[iv]<0){
+ 			calvingrate[iv]=0;
+ 		}
+-		calvingratex[iv]=calvingrate[iv]*vx/(vel+1.e-6);
+-		calvingratey[iv]=calvingrate[iv]*vy/(vel+1.e-6);
++		calvingratex[iv]=calvingrate[iv]*vx/(sqrt(vel)+1.e-14);
++		calvingratey[iv]=calvingrate[iv]*vy/(sqrt(vel)+1.e-14);
+ 	}
+ 
+ 	/*Add input*/
+@@ -214,6 +214,81 @@
+ 
+ }
+ /*}}}*/
++void       Penta::CalvingRatePi(){/*{{{*/
++
++	IssmDouble  xyz_list[NUMVERTICES][3];
++	GaussPenta* gauss=NULL;
++	IssmDouble  vx,vy,vel;
++	IssmDouble  strainparallel;
++	IssmDouble  sxx;
++	IssmDouble  sxy;
++	IssmDouble  syy;
++	IssmDouble  sigVM;
++	IssmDouble  thickness;
++	IssmDouble  base;
++	IssmDouble  hAB;
++	IssmDouble  propcoeff;
++	IssmDouble  calvingratex[NUMVERTICES];
++	IssmDouble  calvingratey[NUMVERTICES];
++	IssmDouble  calvingrate[NUMVERTICES];
++
++
++	/* Get node coordinates and dof list: */
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++
++	/*Retrieve all inputs and parameters we will need*/
++	Input* vx_input=inputs->GetInput(VxEnum);                                                    _assert_(vx_input);
++	Input* vy_input=inputs->GetInput(VyEnum);                                                    _assert_(vy_input);
++	Input* strainparallel_input=inputs->GetInput(StrainRateparallelEnum);                        _assert_(strainparallel_input);
++	Input* sxx_input=inputs->GetInput(DeviatoricStressxxEnum);                                   _assert_(sxx_input);
++	Input* sxy_input=inputs->GetInput(DeviatoricStressxyEnum);                                   _assert_(sxy_input);
++	Input* syy_input=inputs->GetInput(DeviatoricStressyyEnum);                                   _assert_(syy_input);
++	Input* thickness_input=inputs->GetInput(ThicknessEnum);                                      _assert_(thickness_input);
++	Input* base_input=inputs->GetInput(BaseEnum);                                                _assert_(base_input);
++	Input* picoeff_input=inputs->GetInput(CalvingpiCoeffEnum);                                   _assert_(picoeff_input);
++
++	/* Start looping on the number of vertices: */
++	gauss=new GaussPenta();
++	for (int iv=0;iv<NUMVERTICES;iv++){
++		gauss->GaussVertex(iv);
++
++		/* Get the value we need*/
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		vel=vx*vx+vy*vy;
++		strainparallel_input->GetInputValue(&strainparallel,gauss);
++		sxx_input->GetInputValue(&sxx,gauss);
++		sxy_input->GetInputValue(&sxy,gauss);
++		syy_input->GetInputValue(&syy,gauss);
++		thickness_input->GetInputValue(&thickness,gauss);
++		base_input->GetInputValue(&base,gauss);
++		picoeff_input->GetInputValue(&propcoeff,gauss);
++
++		/* Computing sigma Von Mises*/
++		sigVM=sqrt(sxx*sxx+syy*syy+3*sxy*sxy-sxx*syy);
++
++		/* Computing heigth above buoyancy*/
++		hAB=thickness+1028/920*base;
++
++		/*Calving rate for Pi criterion proportionnal to the product of the strain rate along the ice flow direction and the Von Mises stress and the square of the glacier width (hardcoded) divided by the height above buoyancy and the max of the ice velocity power 3 and the ice density (ignored here)*/
++		calvingrate[iv]=propcoeff*strainparallel*sigVM*25.e6/hAB/1e9;
++		if(calvingrate[iv]<0){
++			calvingrate[iv]=0;
++		}
++		calvingratex[iv]=calvingrate[iv]*vx/(sqrt(vel)+1.e-6);
++		calvingratey[iv]=calvingrate[iv]*vy/(sqrt(vel)+1.e-6);
++	}
++
++	/*Add input*/
++	this->inputs->AddInput(new PentaInput(CalvingratexEnum,&calvingratex[0],P1Enum));
++	this->inputs->AddInput(new PentaInput(CalvingrateyEnum,&calvingratey[0],P1Enum));
++	this->inputs->AddInput(new PentaInput(CalvingCalvingrateEnum,&calvingrate[0],P1Enum));
++
++	/*Clean up and return*/
++	delete gauss;
++
++}
++/*}}}*/
+ void       Penta::ComputeBasalStress(Vector<IssmDouble>* sigma_b){/*{{{*/
+ 
+ 	int         i,j;
+@@ -2432,7 +2507,7 @@
+ 		strainxy=epsilon[3];
+ 
+ 		/*strainparallel= Strain rate along the ice flow direction */
+-		strainparallel[iv]=(vx*vx*(strainxx)+vy*vy*(strainyy)+2*vy*vx*strainxy)/(vel+1.e-6);
++		strainparallel[iv]=(vx*vx*(strainxx)+vy*vy*(strainyy)+2*vy*vx*strainxy)/(vel+1.e-14);
+ 	}
+ 
+ 	/*Add input*/
+@@ -2479,7 +2554,7 @@
+ 		strainxy=epsilon[3];
+ 
+ 		/*strainperpendicular= Strain rate perpendicular to the ice flow direction */
+-		strainperpendicular[iv]=(vx*vx*(strainyy)+vy*vy*(strainxx)-2*vy*vx*strainxy)/(vel+1.e-6);
++		strainperpendicular[iv]=(vx*vx*(strainyy)+vy*vy*(strainxx)-2*vy*vx*strainxy)/(vel+1.e-14);
+ 	}
+ 
+ 	/*Add input*/
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18952)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18953)
+@@ -48,6 +48,7 @@
+ 		void           AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part);
+ 		IssmDouble     CharacteristicLength(void){_error_("not implemented yet");};
+ 		void           CalvingRateLevermann();
++		void           CalvingRatePi();
+ 		void           ComputeBasalStress(Vector<IssmDouble>* sigma_b);
+ 		void           ComputeDeviatoricStressTensor();
+ 		void           ComputeSigmaNN(){_error_("not implemented yet");};
+Index: ../trunk-jpl/src/c/classes/Elements/Seg.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18952)
++++ ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18953)
+@@ -48,6 +48,7 @@
+ 		void        ComputeDeviatoricStressTensor(){_error_("not implemented yet");};
+ 		void        ComputeSigmaNN(){_error_("not implemented yet");};
+ 		void        ComputeStressTensor(){_error_("not implemented yet");};
++		void        CalvingRatePi(void){_error_("not implemented yet");};
+ 		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters){_error_("not implemented yet");};
+ 		void        ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){_error_("not implemented yet");};
+ 		void        ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum){_error_("not implemented yet");};
+Index: ../trunk-jpl/src/c/classes/Elements/Tetra.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18952)
++++ ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18953)
+@@ -48,6 +48,7 @@
+ 		void        ComputeSigmaNN(){_error_("not implemented yet");};
+ 		void        ComputeStressTensor(){_error_("not implemented yet");};
+ 		void        ComputeDeviatoricStressTensor(){_error_("not implemented yet");};
++		void        CalvingRatePi(void){_error_("not implemented yet");};
+ 		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters);
+ 		void        ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){_error_("not implemented yet");};
+ 		void        ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum){_error_("not implemented yet");};
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18952)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18953)
+@@ -1368,7 +1368,18 @@
+ 			case CalvingCalvingrateEnum:
+ 				this->StrainRateparallel();
+ 				this->StrainRateperpendicular();
+-				this->CalvingRateLevermann();
++				int calvinglaw;
++				this->FindParam(&calvinglaw,CalvingLawEnum);
++				switch(calvinglaw){
++					         case CalvingLevermannEnum:
++									this->CalvingRateLevermann();
++									break;
++								case CalvingPiEnum:
++									this->CalvingRatePi();
++									break;
++								default:
++									_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
++				}
+ 				input=this->inputs->GetInput(output_enum);
+ 				break;
+ 			case StrainRateparallelEnum:
+Index: ../trunk-jpl/src/c/classes/FemModel.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.h	(revision 18952)
++++ ../trunk-jpl/src/c/classes/FemModel.h	(revision 18953)
+@@ -85,6 +85,7 @@
+ 		void StrainRateparallelx();
+ 		void StrainRateperpendicularx();
+ 		void CalvingRateLevermannx();
++		void CalvingRatePix();
+ 		#ifdef  _HAVE_DAKOTA_
+ 		void DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses);
+ 		#endif
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 18952)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 18953)
+@@ -835,6 +835,7 @@
+ 			% Calving variables
+ 			if isa(md.calving,'calving'),md.calving.calvingrate=project3d(md,'vector',md.calving.calvingrate,'type','node');end;
+ 			if isa(md.calving,'calvinglevermann'),md.calving.coeff=project3d(md,'vector',md.calving.coeff,'type','node');end;
++			if isa(md.calving,'calvingpi'),md.calving.coeff=project3d(md,'vector',md.calving.coeff,'type','node');end;
+ 
+ 			% Hydrologydc variables
+ 			if isa(md.hydrology,'hydrologydc');
+Index: ../trunk-jpl/src/m/classes/calvingpi.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvingpi.m	(revision 0)
++++ ../trunk-jpl/src/m/classes/calvingpi.m	(revision 18953)
+@@ -0,0 +1,53 @@
++%CALVINGPI class definition
++%
++%   Usage:
++%      calvingpi=calvingpi();
++
++classdef calvingpi
++	properties (SetAccess=public) 
++		 coeff       = NaN;
++		 meltingrate = NaN;
++	end
++	methods
++		function obj = calvingpi(varargin) % {{{
++			switch nargin
++				case 0
++					obj=setdefaultparameters(obj);
++				case 1
++					inputstruct=varargin{1};
++					list1 = properties('calvingpi');
++					list2 = fieldnames(inputstruct);
++					for i=1:length(list1)
++						fieldname = list1{i};
++						if ismember(fieldname,list2),
++							obj.(fieldname) = inputstruct.(fieldname);
++						end
++					end
++				otherwise
++					error('constructor not supported');
++			end
++		end % }}}
++		function obj = setdefaultparameters(obj) % {{{
++			%Proportionality coefficient in Pi model
++			obj.coeff=2e13;
++		end % }}}
++		function md = checkconsistency(obj,md,solution,analyses) % {{{
++			%Early return
++			if (solution~=TransientSolutionEnum() | md.transient.iscalving==0), return; end
++			md = checkfield(md,'fieldname','calving.coeff','>',0,'size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','calving.meltingrate','NaN',1,'size',[md.mesh.numberofvertices 1],'>=',0);
++		end % }}}
++		function disp(obj) % {{{
++			disp(sprintf('   Calving Pi parameters:'));
++			fielddisplay(obj,'coeff','proportionality coefficient in Pi model');
++			fielddisplay(obj,'meltingrate','melting rate at given location [m/a]');
++
++		end % }}}
++		function marshall(obj,md,fid) % {{{
++			yts=365.0*24.0*3600.0;
++			WriteData(fid,'enum',CalvingLawEnum(),'data',CalvingPiEnum(),'format','Integer');
++			WriteData(fid,'enum',CalvingpiCoeffEnum(),'data',obj.coeff,'format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'fieldname','meltingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts);
++		end % }}}
++	end
++end
+Index: ../trunk-jpl/src/m/enum/CalvingpiCoeffEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingpiCoeffEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvingpiCoeffEnum.m	(revision 18953)
+@@ -0,0 +1,11 @@
++function macro=CalvingpiCoeffEnum()
++%CALVINGPICOEFFENUM - Enum of CalvingpiCoeff
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvingpiCoeffEnum()
++
++macro=StringToEnum('CalvingpiCoeff');
+Index: ../trunk-jpl/src/m/enum/CalvingPiEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingPiEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvingPiEnum.m	(revision 18953)
+@@ -0,0 +1,11 @@
++function macro=CalvingPiEnum()
++%CALVINGPIENUM - Enum of CalvingPi
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvingPiEnum()
++
++macro=StringToEnum('CalvingPi');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18952)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18953)
+@@ -214,10 +214,13 @@
+ def CalvingCalvingrateEnum(): return StringToEnum("CalvingCalvingrate")[0]
+ def CalvingMeltingrateEnum(): return StringToEnum("CalvingMeltingrate")[0]
+ def CalvingLevermannEnum(): return StringToEnum("CalvingLevermann")[0]
++def CalvingPiEnum(): return StringToEnum("CalvingPi")[0]
+ def DefaultCalvingEnum(): return StringToEnum("DefaultCalving")[0]
+ def CalvingRequestedOutputsEnum(): return StringToEnum("CalvingRequestedOutputs")[0]
+ def CalvinglevermannCoeffEnum(): return StringToEnum("CalvinglevermannCoeff")[0]
+ def CalvinglevermannMeltingrateEnum(): return StringToEnum("CalvinglevermannMeltingrate")[0]
++def CalvingpiCoeffEnum(): return StringToEnum("CalvingpiCoeff")[0]
++def CalvingpiMeltingrateEnum(): return StringToEnum("CalvingpiMeltingrate")[0]
+ def CalvingratexEnum(): return StringToEnum("Calvingratex")[0]
+ def CalvingrateyEnum(): return StringToEnum("Calvingratey")[0]
+ def CalvingratexAverageEnum(): return StringToEnum("CalvingratexAverage")[0]
+Index: ../trunk-jpl/src/m/enum/CalvingpiMeltingrateEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingpiMeltingrateEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvingpiMeltingrateEnum.m	(revision 18953)
+@@ -0,0 +1,11 @@
++function macro=CalvingpiMeltingrateEnum()
++%CALVINGPIMELTINGRATEENUM - Enum of CalvingpiMeltingrate
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvingpiMeltingrateEnum()
++
++macro=StringToEnum('CalvingpiMeltingrate');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18953-18954.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18953-18954.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18953-18954.diff	(revision 19102)
@@ -0,0 +1,4 @@
+Index: ../trunk-jpl/test/Archives/Archive806.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
Index: /issm/oecreview/Archive/18296-19100/ISSM-18954-18955.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18954-18955.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18954-18955.diff	(revision 19102)
@@ -0,0 +1,31 @@
+Index: ../trunk-jpl/src/m/classes/calving.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/calving.py	(revision 18954)
++++ ../trunk-jpl/src/m/classes/calving.py	(revision 18955)
+@@ -37,8 +37,9 @@
+ 		if (solution!=TransientSolutionEnum()) or (not md.transient.iscalving):
+ 			return md
+ 
+-		md = checkfield(md,'fieldname','calving.calvingrate','NaN',1,'size',[md.mesh.numberofvertices],'>=',0)
+-		md = checkfield(md,'fieldname','calving.meltingrate','NaN',1,'size',[md.mesh.numberofvertices],'>=',0)
++		md = checkfield(md,'fieldname','calving.calvingrate[1:md.mesh.numberofvertices,:]','>=',0,'forcing',1,'NaN',1);
++		md = checkfield(md,'fieldname','calving.meltingrate[1:md.mesh.numberofvertices,:]','>=',0,'forcing',1,'NaN',1);
++
+ 		return md
+ 	# }}}
+ 	def marshall(self,md,fid):    # {{{
+Index: ../trunk-jpl/src/m/classes/calving.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calving.m	(revision 18954)
++++ ../trunk-jpl/src/m/classes/calving.m	(revision 18955)
+@@ -59,8 +59,8 @@
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+ 			%Early return
+ 			if (solution~=TransientSolutionEnum() | md.transient.iscalving==0), return; end
+-			md = checkfield(md,'fieldname','calving.calvingrate','NaN',1,'size',[md.mesh.numberofvertices 1],'>=',0);
+-			md = checkfield(md,'fieldname','calving.meltingrate','NaN',1,'size',[md.mesh.numberofvertices 1],'>=',0);
++			md = checkfield(md,'fieldname','calving.calvingrate(1:md.mesh.numberofvertices,:)','>=',0,'forcing',1,'NaN',1);
++			md = checkfield(md,'fieldname','calving.meltingrate(1:md.mesh.numberofvertices,:)','>=',0,'forcing',1,'NaN',1);
+ 		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   Calving parameters:'));
Index: /issm/oecreview/Archive/18296-19100/ISSM-18955-18956.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18955-18956.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18955-18956.diff	(revision 19102)
@@ -0,0 +1,141 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18955)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18956)
+@@ -878,6 +878,39 @@
+ 	return (x2*y3 - y2*x3 + x1*y2 - y1*x2 + x3*y1 - y3*x1)/2;
+ }
+ /*}}}*/
++IssmDouble Tria::GetAreaIce(void){/*{{{*/
++
++	/*return area of element covered by ice*/
++	/*Intermediaries*/
++	int numiceverts;
++	IssmDouble area_fraction;
++	IssmDouble s[2]; // s:fraction of intersected triangle edges that lie inside ice
++	int* indices=NULL;
++
++	this->GetLevelsetIntersection(&indices, &numiceverts, s, MaskIceLevelsetEnum, 0.);
++
++	switch (numiceverts){
++		case 0: // no vertex has ice: element is ice free
++			area_fraction=0.;
++			break;
++		case 1: // one vertex has ice: get area of triangle
++			area_fraction=s[0]*s[1];
++			break;
++		case 2: // two vertices have ice: get area of quadrangle
++			area_fraction=s[0]+s[1]-s[0]*s[1];
++			break;
++		case NUMVERTICES: // all vertices have ice: return triangle area
++			area_fraction=1.;
++			break;
++		default:
++			_error_("Wrong number of ice vertices in Tria::GetAreaIce!");
++			break;
++	}
++	_assert_((area_fraction>=0.) && (area_fraction<=1.));
++
++	xDelete<int>(indices);
++	return area_fraction*this->GetArea();
++}/*}}}*/
+ void       Tria::GetAreaCoordinates(IssmDouble* area_coordinates,IssmDouble* xyz_zero,IssmDouble* xyz_list,int numpoints){/*{{{*/
+ 	/*Computeportion of the element that is grounded*/ 
+ 
+@@ -1183,6 +1216,82 @@
+ 
+ 	xDelete<int>(indicesfront);
+ }/*}}}*/
++void			Tria::GetLevelsetIntersection(int** pindices, int* pnumiceverts, IssmDouble* fraction, int levelset_enum, IssmDouble level){/*{{{*/
++	
++	/* GetLevelsetIntersection computes: 
++	 * 1. indices of element, sorted in [iceverts, noiceverts] in counterclockwise fashion,
++	 * 2. fraction of intersected triangle edges intersected by levelset, lying below level*/
++
++	/*Intermediaries*/
++	int i, numiceverts, numnoiceverts;
++	int ind0, ind1, lastindex;
++	int indices_ice[NUMVERTICES],indices_noice[NUMVERTICES];
++	IssmDouble lsf[NUMVERTICES];
++	int* indices = xNew<int>(NUMVERTICES);
++
++	/*Retrieve all inputs and parameters*/
++	GetInputListOnVertices(&lsf[0],levelset_enum);
++
++	/* Determine distribution of ice over element.
++	 * Exploit: ice/no-ice parts are connected, so find starting vertex of segment*/
++	lastindex=0;
++	for(i=0;i<NUMVERTICES;i++){ // go backwards along vertices, and check for sign change
++		ind0=(NUMVERTICES-i)%NUMVERTICES;
++		ind1=(ind0-1+NUMVERTICES)%NUMVERTICES;
++		if((lsf[ind0]-level)*(lsf[ind1]-level)<=0.){ // levelset has been crossed, find last index belonging to segment
++			if(lsf[ind1]==level) //if levelset intersects 2nd vertex, choose this vertex as last
++				lastindex=ind1;
++			else
++				lastindex=ind0;
++			break;
++		}
++	}
++
++	numiceverts=0;
++	numnoiceverts=0;
++	for(i=0;i<NUMVERTICES;i++){
++		ind0=(lastindex+i)%NUMVERTICES;
++		if(lsf[i]<=level){
++			indices_ice[numiceverts]=i;
++			numiceverts++;
++		}
++		else{
++			indices_noice[numnoiceverts]=i;
++			numnoiceverts++;
++		}
++	}
++	//merge indices 
++	for(i=0;i<numiceverts;i++){indices[i]=indices_ice[i];}
++	for(i=0;i<numnoiceverts;i++){indices[numiceverts+i]=indices_noice[i];}
++
++	switch (numiceverts){
++		case 0: // no vertex has ice: element is ice free, no intersection
++			for(i=0;i<2;i++)
++				fraction[i]=0.;
++			break;
++		case 1: // one vertex has ice:
++			for(i=0;i<2;i++){
++				fraction[i]=(level-lsf[indices[0]])/(lsf[indices[numiceverts+i]]-lsf[indices[0]]);
++			}
++			break;
++		case 2: // two vertices have ice: get area of quadrangle
++			for(i=0;i<2;i++){
++				fraction[i]=(level-lsf[indices[i]])/(lsf[indices[numiceverts]]-lsf[indices[i]]);
++			}
++			break;
++		case NUMVERTICES: // all vertices have ice: return triangle area
++			for(i=0;i<2;i++)
++				fraction[i]=1.;
++			break;
++		default:
++			_error_("Wrong number of ice vertices in Tria::GetLevelsetIntersection!");
++			break;
++	}
++
++	*pindices=indices;
++	*pnumiceverts=numiceverts;
++}
++/*}}}*/
+ void       Tria::GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* gl){/*{{{*/
+ 	
+ 	/*Computeportion of the element that has a positive levelset*/ 
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18955)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18956)
+@@ -142,7 +142,9 @@
+ 		void           AddBasalInput(int input_enum, IssmDouble* values, int interpolation_enum);
+ 		void           AddInput(int input_enum, IssmDouble* values, int interpolation_enum);
+ 		IssmDouble     GetArea(void);
++		IssmDouble 	GetAreaIce(void);
+ 		void           GetAreaCoordinates(IssmDouble *area_coordinates,IssmDouble* xyz_zero,IssmDouble* xyz_list,int numpoints);
++		void		GetLevelsetIntersection(int** pindices, int* pnumiceverts, IssmDouble* fraction, int levelset_enum, IssmDouble level);
+ 		int            GetElementType(void);
+ 		void           GetInputValue(IssmDouble* pvalue,Node* node,int enumtype);
+ 		void           GetMaterialInputValue(IssmDouble* pvalue,Node* node,int enumtype);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18956-18957.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18956-18957.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18956-18957.diff	(revision 19102)
@@ -0,0 +1,92 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18956)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18957)
+@@ -1503,29 +1503,72 @@
+ /*}}}*/
+ IssmDouble Tria::IceVolume(void){/*{{{*/
+ 
+-	/*The volume of a troncated prism is base * 1/3 sum(length of edges)*/
+-	IssmDouble base,surface,bed;
+-	IssmDouble xyz_list[NUMVERTICES][3];
++	/*The volume of a truncated prism is area_base * 1/numedges sum(length of edges)*/
+ 
+-	if(!IsIceInElement())return 0;
++	/*Intermediaries*/
++	int i, numiceverts;
++	IssmDouble area_base,surface,base,Haverage;
++	IssmDouble Haux[NUMVERTICES], surfaces[NUMVERTICES], bases[NUMVERTICES];
++	IssmDouble s[2]; // s:fraction of intersected triangle edges, that lies inside ice
++	int* indices=NULL;
++	IssmDouble* H=NULL;
+ 
+-	/*First get back the area of the base*/
+-	base=this->GetArea();
++	if(!IsIceInElement())return 0.;
+ 
+-	/*Now get the average height*/
+-	Input* surface_input = inputs->GetInput(SurfaceEnum); _assert_(surface_input);
+-	Input* base_input     = inputs->GetInput(BaseEnum);     _assert_(base_input);
+-	surface_input->GetInputAverage(&surface);
+-	base_input->GetInputAverage(&bed);
+-
+-	/*Return: */
+ 	int domaintype;
+ 	parameters->FindParam(&domaintype,DomainTypeEnum);
++
++	if(IsIcefront()){
++		area_base=this->GetAreaIce();
++		//Assumption: linear ice thickness profile on element. 
++		//Hence ice thickness at intersection of levelset function with triangle edge is linear interpolation of ice thickness at vertices.
++		this->GetLevelsetIntersection(&indices, &numiceverts, s, MaskIceLevelsetEnum, 0.);
++		GetInputListOnVertices(&surfaces[0],SurfaceEnum);
++		GetInputListOnVertices(&bases[0],BaseEnum);
++		for(i=0;i<NUMVERTICES;i++) Haux[i]= surfaces[indices[i]]-bases[indices[i]]; //sort thicknesses in ice/noice
++		int numthk=numiceverts+2;
++		H=xNew<IssmDouble>(numthk);
++		switch(numiceverts){
++			case 1: // average over triangle 
++				H[0]=Haux[0];
++				H[1]=Haux[0]+s[0]*(Haux[1]-Haux[0]);
++				H[2]=Haux[0]+s[1]*(Haux[2]-Haux[0]);
++				break;
++			case 2: // average over quadrangle
++				H[0]=Haux[0];
++				H[1]=Haux[1];
++				H[2]=Haux[0]+s[0]*(Haux[2]-Haux[0]);
++				H[3]=Haux[1]+s[1]*(Haux[2]-Haux[1]);
++				break;
++			default:
++				_error_("Number of ice covered vertices wrong in Tria::IceVolume()");
++				break;
++		}
++		Haverage=0.;
++		for(i=0;i<numthk;i++)	Haverage+=H[i];
++		Haverage/=IssmDouble(numthk);
++	}
++	else{
++		/*First get back the area of the base*/
++		area_base=this->GetArea();
++
++		/*Now get the average height*/
++		Input* surface_input = inputs->GetInput(SurfaceEnum); _assert_(surface_input);
++		Input* base_input     = inputs->GetInput(BaseEnum);     _assert_(base_input);
++		surface_input->GetInputAverage(&surface);
++		base_input->GetInputAverage(&base);
++		Haverage=surface-base;
++	}
++
++	/*Cleanup & return: */
++	xDelete<int>(indices);
++	xDelete<IssmDouble>(H);
++
+ 	if(domaintype==Domain2DverticalEnum){
+-	  return base;
++	  return area_base;
+ 	}
+ 	else{
+-	  return base*(surface-bed);
++	  return area_base*Haverage;
+ 	}
+ }
+ /*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18957-18958.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18957-18958.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18957-18958.diff	(revision 19102)
@@ -0,0 +1,153 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18957)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18958)
+@@ -1274,7 +1274,7 @@
+ 				fraction[i]=(level-lsf[indices[0]])/(lsf[indices[numiceverts+i]]-lsf[indices[0]]);
+ 			}
+ 			break;
+-		case 2: // two vertices have ice: get area of quadrangle
++		case 2: // two vertices have ice: fraction is computed from first ice vertex to last in CCW fashion
+ 			for(i=0;i<2;i++){
+ 				fraction[i]=(level-lsf[indices[i]])/(lsf[indices[numiceverts]]-lsf[indices[i]]);
+ 			}
+@@ -3196,97 +3196,53 @@
+ }
+ /*}}}*/
+ void       Tria::ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum){/*{{{*/
++	/* Return coordinates where levelset intersects element edges.
++	 * Attention: In case that no intersection exists, NULL pointer is returned.*/
+ 
+-	int         normal_orientation=0;
+-	IssmDouble  s1,s2;
+-	IssmDouble  levelset[NUMVERTICES];
++	/*Intermediaries*/
++	const int dim=3;
++	int numiceverts;
++	int i, n, e, counter;
++	IssmDouble s[2];
++	int* indices=NULL;
++	IssmDouble* xyz_zero=NULL;
+ 
+-	/*Recover parameters and values*/
+-	IssmDouble* xyz_zero = xNew<IssmDouble>(2*3);
+-	GetInputListOnVertices(&levelset[0],levelsetenum);
+-
+-	if(levelset[0]*levelset[1]>0.){ //Nodes 0 and 1 are similar, so points must be found on segment 0-2 and 1-2
+-		/*Portion of the segments*/
+-		s1=levelset[2]/(levelset[2]-levelset[1]);
+-		s2=levelset[2]/(levelset[2]-levelset[0]);
+-
+-		if(levelset[2]<0.) normal_orientation=1; //orientation of quadrangle depending on distribution of levelsetfunction
+-		/*New point 1*/
+-		xyz_zero[3*normal_orientation+0]=xyz_list[2*3+0]+s1*(xyz_list[1*3+0]-xyz_list[2*3+0]);
+-		xyz_zero[3*normal_orientation+1]=xyz_list[2*3+1]+s1*(xyz_list[1*3+1]-xyz_list[2*3+1]);
+-		xyz_zero[3*normal_orientation+2]=xyz_list[2*3+2]+s1*(xyz_list[1*3+2]-xyz_list[2*3+2]);
+-
+-		/*New point 0*/
+-		xyz_zero[3*(1-normal_orientation)+0]=xyz_list[2*3+0]+s2*(xyz_list[0*3+0]-xyz_list[2*3+0]);
+-		xyz_zero[3*(1-normal_orientation)+1]=xyz_list[2*3+1]+s2*(xyz_list[0*3+1]-xyz_list[2*3+1]);
+-		xyz_zero[3*(1-normal_orientation)+2]=xyz_list[2*3+2]+s2*(xyz_list[0*3+2]-xyz_list[2*3+2]);
++	this->GetLevelsetIntersection(&indices, &numiceverts, s, MaskIceLevelsetEnum, 0.);
++	
++	//TODO: check if for 2 iceverts front segment is oriented in CCW way
++	
++	if(numiceverts>0) xyz_zero=xNew<IssmDouble>(2*dim);
++	if((numiceverts>0)&&(numiceverts<NUMVERTICES)){
++		counter=0;
++		for(i=0;i<numiceverts;i++){	// iterate over ice vertices
++			for(n=numiceverts;n<NUMVERTICES;n++){ // iterate over no-ice vertices
++				for(e=0;e<dim;e++){ // spatial direction
++					int ind_ice		=dim*indices[i]+e;
++					int ind_noice	=dim*indices[n]+e;
++					int ind			=dim*counter+e;
++					xyz_zero[ind]=xyz_list[ind_ice]+s[counter]*(xyz_list[ind_noice]-xyz_list[ind_ice]);
++				}
++				counter++;
++			}
++		}
+ 	}
+-	else if(levelset[1]*levelset[2]>0.){ //Nodes 1 and 2 are similar, so points must be found on segment 0-1 and 0-2
+-		/*Portion of the segments*/
+-		s1=levelset[0]/(levelset[0]-levelset[2]);
+-		s2=levelset[0]/(levelset[0]-levelset[1]);
+-
+-		if(levelset[0]<0.) normal_orientation=1;
+-		/*New point 1*/
+-		xyz_zero[3*normal_orientation+0]=xyz_list[0*3+0]+s1*(xyz_list[2*3+0]-xyz_list[0*3+0]);
+-		xyz_zero[3*normal_orientation+1]=xyz_list[0*3+1]+s1*(xyz_list[2*3+1]-xyz_list[0*3+1]);
+-		xyz_zero[3*normal_orientation+2]=xyz_list[0*3+2]+s1*(xyz_list[2*3+2]-xyz_list[0*3+2]);
+-
+-		/*New point 2*/
+-		xyz_zero[3*(1-normal_orientation)+0]=xyz_list[0*3+0]+s2*(xyz_list[1*3+0]-xyz_list[0*3+0]);
+-		xyz_zero[3*(1-normal_orientation)+1]=xyz_list[0*3+1]+s2*(xyz_list[1*3+1]-xyz_list[0*3+1]);
+-		xyz_zero[3*(1-normal_orientation)+2]=xyz_list[0*3+2]+s2*(xyz_list[1*3+2]-xyz_list[0*3+2]);
++	else if(numiceverts==NUMVERTICES){ //NUMVERTICES ice vertices: calving front lies on element edge
++		IssmDouble lsf[NUMVERTICES];
++		this->GetInputListOnVertices(&lsf[0],MaskIceLevelsetEnum);
++		counter=0;
++		for(i=0;i<NUMVERTICES;i++){
++			if(lsf[indices[i]]==0.){
++				for(e=0;e<dim;e++)	xyz_zero[dim*counter+e]=xyz_list[dim*indices[i]+e];
++				counter++;
++			}
++			if(counter==2) break;
++		}
+ 	}
+-	else if(levelset[0]*levelset[2]>0.){ //Nodes 0 and 2 are similar, so points must be found on segment 1-0 and 1-2
+-		/*Portion of the segments*/
+-		s1=levelset[1]/(levelset[1]-levelset[0]);
+-		s2=levelset[1]/(levelset[1]-levelset[2]);
++	_assert_(counter==2);
+ 
+-		if(levelset[1]<0.) normal_orientation=1;
+-		/*New point 0*/
+-		xyz_zero[3*normal_orientation+0]=xyz_list[1*3+0]+s1*(xyz_list[0*3+0]-xyz_list[1*3+0]);
+-		xyz_zero[3*normal_orientation+1]=xyz_list[1*3+1]+s1*(xyz_list[0*3+1]-xyz_list[1*3+1]);
+-		xyz_zero[3*normal_orientation+2]=xyz_list[1*3+2]+s1*(xyz_list[0*3+2]-xyz_list[1*3+2]);
+-
+-		/*New point 2*/
+-		xyz_zero[3*(1-normal_orientation)+0]=xyz_list[1*3+0]+s2*(xyz_list[2*3+0]-xyz_list[1*3+0]);
+-		xyz_zero[3*(1-normal_orientation)+1]=xyz_list[1*3+1]+s2*(xyz_list[2*3+1]-xyz_list[1*3+1]);
+-		xyz_zero[3*(1-normal_orientation)+2]=xyz_list[1*3+2]+s2*(xyz_list[2*3+2]-xyz_list[1*3+2]);
+-	}
+-	else if(levelset[0]==0. && levelset[1]==0.){ //front is on point 0 and 1
+-		xyz_zero[3*0+0]=xyz_list[0*3+0];
+-		xyz_zero[3*0+1]=xyz_list[0*3+1];
+-		xyz_zero[3*0+2]=xyz_list[0*3+2];
+-
+-		/*New point 2*/
+-		xyz_zero[3*1+0]=xyz_list[1*3+0];
+-		xyz_zero[3*1+1]=xyz_list[1*3+1];
+-		xyz_zero[3*1+2]=xyz_list[1*3+2];
+-	}
+-	else if(levelset[0]==0. && levelset[2]==0.){ //front is on point 0 and 1
+-		xyz_zero[3*0+0]=xyz_list[2*3+0];
+-		xyz_zero[3*0+1]=xyz_list[2*3+1];
+-		xyz_zero[3*0+2]=xyz_list[2*3+2];
+-
+-		/*New point 2*/
+-		xyz_zero[3*1+0]=xyz_list[0*3+0];
+-		xyz_zero[3*1+1]=xyz_list[0*3+1];
+-		xyz_zero[3*1+2]=xyz_list[0*3+2];
+-	}
+-	else if(levelset[1]==0. && levelset[2]==0.){ //front is on point 0 and 1
+-		xyz_zero[3*0+0]=xyz_list[1*3+0];
+-		xyz_zero[3*0+1]=xyz_list[1*3+1];
+-		xyz_zero[3*0+2]=xyz_list[1*3+2];
+-
+-		/*New point 2*/
+-		xyz_zero[3*1+0]=xyz_list[2*3+0];
+-		xyz_zero[3*1+1]=xyz_list[2*3+1];
+-		xyz_zero[3*1+2]=xyz_list[2*3+2];
+-	}
+-	else _error_("Case not covered");
+-
+-	/*Assign output pointer*/
+-	*pxyz_zero= xyz_zero;
++	/*Cleanup & return*/
++	xDelete<int>(indices);
++	*pxyz_zero=xyz_zero;
+ }
+ /*}}}*/
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18958-18959.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18958-18959.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18958-18959.diff	(revision 19102)
@@ -0,0 +1,62 @@
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18958)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 18959)
+@@ -104,8 +104,8 @@
+ 
+ 	if(save_results){
+ 		if(VerboseSolution()) _printf0_("   saving results\n");
+-		int outputs = MaskIceLevelsetEnum;
+-		femmodel->RequestedOutputsx(&femmodel->results,&outputs,1);
++		int outputs[2] = {MaskIceLevelsetEnum, CalvingCalvingrateEnum};
++		femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],2);
+ 	}
+ }/*}}}*/
+ ElementVector* LevelsetAnalysis::CreateDVector(Element* element){/*{{{*/
+Index: ../trunk-jpl/src/c/cores/transient_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/transient_core.cpp	(revision 18958)
++++ ../trunk-jpl/src/c/cores/transient_core.cpp	(revision 18959)
+@@ -119,8 +119,8 @@
+ 
+ 			/* extrapolate velocities onto domain with no ice */
+ 			Analysis* extanalysis = new ExtrapolationAnalysis();
+-			const int nvars=2;
+-			int vars[nvars] = {VxEnum, VyEnum};
++			const int nvars=3;
++			int vars[nvars] = {VxEnum, VyEnum, ThicknessEnum};
+ 			for(int iv=0;iv<nvars;iv++){
+ 				femmodel->parameters->SetParam(vars[iv],ExtrapolationVariableEnum); 
+ 				extanalysis->Core(femmodel);
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18958)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 18959)
+@@ -1370,15 +1370,18 @@
+ 				this->StrainRateperpendicular();
+ 				int calvinglaw;
+ 				this->FindParam(&calvinglaw,CalvingLawEnum);
+-				switch(calvinglaw){
+-					         case CalvingLevermannEnum:
+-									this->CalvingRateLevermann();
+-									break;
+-								case CalvingPiEnum:
+-									this->CalvingRatePi();
+-									break;
+-								default:
+-									_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
++					switch(calvinglaw){
++						case DefaultCalvingEnum:
++							//do nothing
++							break;
++						case CalvingLevermannEnum:
++							this->CalvingRateLevermann();
++							break;
++						case CalvingPiEnum:
++							this->CalvingRatePi();
++							break;
++						default:
++							_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
+ 				}
+ 				input=this->inputs->GetInput(output_enum);
+ 				break;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18959-18960.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18959-18960.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18959-18960.diff	(revision 19102)
@@ -0,0 +1,28 @@
+Index: ../trunk-jpl/src/m/solve/parseresultsfromdisk.py
+===================================================================
+--- ../trunk-jpl/src/m/solve/parseresultsfromdisk.py	(revision 18959)
++++ ../trunk-jpl/src/m/solve/parseresultsfromdisk.py	(revision 18960)
+@@ -183,7 +183,10 @@
+ 			field = field/10.**12.*yts #(GigaTon/year)
+ 		elif m.strcmp(fieldname,'SurfaceforcingsMassBalance'):
+ 			field = field*yts
++		elif m.strcmp(fieldname,'CalvingCalvingrate'):
++			field = field*yts
+ 
++
+ 		result=OrderedDict()
+ 		result['fieldname']=fieldname
+ 		result['time']=time
+Index: ../trunk-jpl/src/m/solve/parseresultsfromdisk.m
+===================================================================
+--- ../trunk-jpl/src/m/solve/parseresultsfromdisk.m	(revision 18959)
++++ ../trunk-jpl/src/m/solve/parseresultsfromdisk.m	(revision 18960)
+@@ -183,6 +183,8 @@
+ 		field = field/10.^12*yts; %(GigaTon/year)
+ 	elseif strcmp(fieldname,'SurfaceforcingsMassBalance'),
+ 		field = field*yts;
++	elseif strcmp(fieldname,'CalvingCalvingrate'),
++		field = field*yts;
+ 	end
+ 
+ 	result.fieldname=fieldname;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18960-18961.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18960-18961.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18960-18961.diff	(revision 19102)
@@ -0,0 +1,27 @@
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 18960)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 18961)
+@@ -834,6 +834,7 @@
+ 
+ 			% Calving variables
+ 			if isa(md.calving,'calving'),md.calving.calvingrate=project3d(md,'vector',md.calving.calvingrate,'type','node');end;
++			if ~isnan(md.calving.meltingrate),md.calving.meltingrate=project3d(md,'vector',md.calving.meltingrate,'type','node');end;
+ 			if isa(md.calving,'calvinglevermann'),md.calving.coeff=project3d(md,'vector',md.calving.coeff,'type','node');end;
+ 			if isa(md.calving,'calvingpi'),md.calving.coeff=project3d(md,'vector',md.calving.coeff,'type','node');end;
+ 
+Index: ../trunk-jpl/src/m/classes/model.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.py	(revision 18960)
++++ ../trunk-jpl/src/m/classes/model.py	(revision 18961)
+@@ -668,6 +668,10 @@
+ 			md.calving.calvingrate=project3d(md,'vector',md.calving.calvingrate,'type','node')
+ 		if isinstance(md.calving,calvinglevermann):
+ 			md.calving.coeff=project3d(md,'vector',md.calving.coeff,'type','node')
++		if isinstance(md.calving,calvingpi):
++			md.calving.coeff=project3d(md,'vector',md.calving.coeff,'type','node')
++		if not numpy.any(numpy.isnan(md.calving.meltingrate)):
++			md.calving.meltingrate=project3d(md,'vector',md.calving.meltingrate,'type','node')
+ 
+ 		# Hydrologydc variables
+ 		if hasattr(md.hydrology,'hydrologydc'):
Index: /issm/oecreview/Archive/18296-19100/ISSM-18961-18962.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18961-18962.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18961-18962.diff	(revision 19102)
@@ -0,0 +1,124 @@
+Index: ../trunk-jpl/test/Par/ValleyGlacierShelf.par
+===================================================================
+--- ../trunk-jpl/test/Par/ValleyGlacierShelf.par	(revision 18961)
++++ ../trunk-jpl/test/Par/ValleyGlacierShelf.par	(revision 18962)
+@@ -75,6 +75,7 @@
+ 
+ %Masstransport;
+ md.calving.calvingrate = 0.*ones(md.mesh.numberofvertices,1);
++md.calving.meltingrate = 0.*ones(md.mesh.numberofvertices,1);
+ md.masstransport.stabilization = 1.;
+ 
+ %Numerical parameters
+Index: ../trunk-jpl/test/Par/ValleyGlacierShelf.py
+===================================================================
+--- ../trunk-jpl/test/Par/ValleyGlacierShelf.py	(revision 18961)
++++ ../trunk-jpl/test/Par/ValleyGlacierShelf.py	(revision 18962)
+@@ -82,6 +82,7 @@
+ 
+ #Masstransport
+ md.calving.calvingrate=0.*numpy.ones((md.mesh.numberofvertices,1))
++md.calving.meltingrate=0.*numpy.ones((md.mesh.numberofvertices,1))
+ md.masstransport.stabilization=1.
+ 
+ #Numerical parameters
+Index: ../trunk-jpl/test/NightlyRun/test801.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test801.m	(revision 18961)
++++ ../trunk-jpl/test/NightlyRun/test801.m	(revision 18962)
+@@ -7,6 +7,7 @@
+ %Transient;
+ md.transient.isstressbalance=1;
+ md.transient.islevelset=1;
++md.transient.iscalving=1;
+ md.transient.ismasstransport=1;
+ md.transient.isthermal=0;
+ md.transient.isgroundingline=1;
+Index: ../trunk-jpl/test/NightlyRun/test803.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test803.py	(revision 18961)
++++ ../trunk-jpl/test/NightlyRun/test803.py	(revision 18962)
+@@ -24,6 +24,7 @@
+ #Transient
+ md.transient.isstressbalance=True
+ md.transient.islevelset=True
++md.transient.iscalving=True
+ md.transient.ismasstransport=True
+ md.transient.isthermal=True
+ md.transient.isgroundingline=True
+Index: ../trunk-jpl/test/NightlyRun/test802.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test802.m	(revision 18961)
++++ ../trunk-jpl/test/NightlyRun/test802.m	(revision 18962)
+@@ -12,6 +12,7 @@
+ %Transient
+ md.transient.isstressbalance=1;
+ md.transient.islevelset=1;
++md.transient.iscalving=1;
+ md.transient.ismasstransport=1;
+ md.transient.isthermal=1;
+ md.transient.isgroundingline=1;
+Index: ../trunk-jpl/test/NightlyRun/test803.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test803.m	(revision 18961)
++++ ../trunk-jpl/test/NightlyRun/test803.m	(revision 18962)
+@@ -14,6 +14,7 @@
+ %Transient
+ md.transient.isstressbalance=1;
+ md.transient.islevelset=1;
++md.transient.iscalving=1;
+ md.transient.ismasstransport=1;
+ md.transient.isthermal=1;
+ md.transient.isgroundingline=1;
+Index: ../trunk-jpl/test/NightlyRun/test801.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test801.py	(revision 18961)
++++ ../trunk-jpl/test/NightlyRun/test801.py	(revision 18962)
+@@ -17,6 +17,7 @@
+ #Transient
+ md.transient.isstressbalance=True
+ md.transient.islevelset=True
++md.transient.iscalving=True
+ md.transient.ismasstransport=True
+ md.transient.isthermal=False
+ md.transient.isgroundingline=True
+Index: ../trunk-jpl/test/NightlyRun/test802.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test802.py	(revision 18961)
++++ ../trunk-jpl/test/NightlyRun/test802.py	(revision 18962)
+@@ -22,6 +22,7 @@
+ #Transient
+ md.transient.isstressbalance=True
+ md.transient.islevelset=True
++md.transient.iscalving=True
+ md.transient.ismasstransport=True
+ md.transient.isthermal=True
+ md.transient.isgroundingline=True
+Index: ../trunk-jpl/test/Archives/Archive807.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive802.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive803.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive804.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive805.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive806.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive801.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
Index: /issm/oecreview/Archive/18296-19100/ISSM-18962-18963.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18962-18963.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18962-18963.diff	(revision 19102)
@@ -0,0 +1,23 @@
+Index: ../trunk-jpl/src/m/classes/model.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.py	(revision 18962)
++++ ../trunk-jpl/src/m/classes/model.py	(revision 18963)
+@@ -16,6 +16,7 @@
+ from matice import matice
+ from calving import calving
+ from calvinglevermann import calvinglevermann
++#from calvingpi import calvingpi
+ from damage import damage
+ from friction import friction
+ from flowequation import flowequation
+@@ -668,8 +669,8 @@
+ 			md.calving.calvingrate=project3d(md,'vector',md.calving.calvingrate,'type','node')
+ 		if isinstance(md.calving,calvinglevermann):
+ 			md.calving.coeff=project3d(md,'vector',md.calving.coeff,'type','node')
+-		if isinstance(md.calving,calvingpi):
+-			md.calving.coeff=project3d(md,'vector',md.calving.coeff,'type','node')
++		#if isinstance(md.calving,calvingpi):
++		#	md.calving.coeff=project3d(md,'vector',md.calving.coeff,'type','node')
+ 		if not numpy.any(numpy.isnan(md.calving.meltingrate)):
+ 			md.calving.meltingrate=project3d(md,'vector',md.calving.meltingrate,'type','node')
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18963-18964.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18963-18964.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18963-18964.diff	(revision 19102)
@@ -0,0 +1,68 @@
+Index: ../trunk-jpl/test/NightlyRun/test806.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test806.py	(revision 18963)
++++ ../trunk-jpl/test/NightlyRun/test806.py	(revision 18964)
+@@ -48,9 +48,9 @@
+ field_names     =['Vx1','Vy1','Vel1','Pressure1','Thickness1','Surface1','MaskIceLevelset1','StrainRateparallel1','StrainRateperpendicular1','CalvingCalvingrate1',\
+ 		'Vx2','Vy2','Vel2','Pressure2','Thickness2','Surface2','MaskIceLevelset2','StrainRateparallel2','StrainRateperpendicular2','CalvingCalvingrate2',\
+ 		'Vx3','Vy3','Vel3','Pressure3','Thickness3','Surface3','MaskIceLevelset3','StrainRateparallel3','StrainRateperpendicular3','CalvingCalvingrate3']
+-field_tolerances=[1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,\
+-		2e-13,2e-13,2e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,\
+-		2e-13,2e-13,2e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13]
++field_tolerances=[1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,\
++		2e-11,2e-11,2e-11,1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,\
++		2e-11,2e-11,2e-11,1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,1e-11]
+ field_values=[\
+ 	md.results.TransientSolution[0].Vx,\
+ 	md.results.TransientSolution[0].Vy,\
+Index: ../trunk-jpl/test/NightlyRun/test806.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test806.m	(revision 18963)
++++ ../trunk-jpl/test/NightlyRun/test806.m	(revision 18964)
+@@ -35,9 +35,9 @@
+ field_names     ={'Vx1','Vy1','Vel1','Pressure1','Thickness1','Surface1','MaskIceLevelset1','StrainRateparallel1','StrainRateperpendicular1','CalvingCalvingrate1'...
+ 		'Vx2','Vy2','Vel2','Pressure2','Thickness2','Surface2','MaskIceLevelset2','StrainRateparallel2','StrainRateperpendicular2','CalvingCalvingrate2'...
+ 		'Vx3','Vy3','Vel3','Pressure3','Thickness3','Surface3','MaskIceLevelset3','StrainRateparallel3','StrainRateperpendicular3','CalvingCalvingrate3'};
+-field_tolerances={1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,...
+-		2e-13,2e-13,2e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,...
+-		2e-13,2e-13,2e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13};
++field_tolerances={1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,...
++		2e-11,2e-11,2e-11,1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,...
++		2e-11,2e-11,2e-11,1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,1e-11};
+ field_values={...
+ 	md.results.TransientSolution(1).Vx,...
+ 	md.results.TransientSolution(1).Vy,...
+Index: ../trunk-jpl/test/NightlyRun/test807.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test807.m	(revision 18963)
++++ ../trunk-jpl/test/NightlyRun/test807.m	(revision 18964)
+@@ -32,9 +32,9 @@
+ field_names     ={'Vx1','Vy1','Vel1','Pressure1','Thickness1','Surface1','MaskIceLevelset1'...
+ 		'Vx2','Vy2','Vel2','Pressure2','Thickness2','Surface2','MaskIceLevelset2'...
+ 		'Vx3','Vy3','Vel3','Pressure3','Thickness3','Surface3','MaskIceLevelset3'};
+-field_tolerances={1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,...
+-		2e-13,2e-13,2e-13,1e-13,1e-13,1e-13,1e-13,...
+-		2e-13,2e-13,2e-13,1e-13,1e-13,1e-13,1e-11};
++field_tolerances={1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,...
++		2e-11,2e-11,2e-11,1e-11,1e-11,1e-11,1e-11,...
++		2e-11,2e-11,2e-11,1e-11,1e-11,1e-11,1e-11};
+ field_values={...
+ 	md.results.TransientSolution(1).Vx,...
+ 	md.results.TransientSolution(1).Vy,...
+Index: ../trunk-jpl/test/NightlyRun/test807.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test807.py	(revision 18963)
++++ ../trunk-jpl/test/NightlyRun/test807.py	(revision 18964)
+@@ -45,9 +45,9 @@
+ field_names     =['Vx1','Vy1','Vel1','Pressure1','Thickness1','Surface1','MaskIceLevelset1',\
+ 		'Vx2','Vy2','Vel2','Pressure2','Thickness2','Surface2','MaskIceLevelset2',\
+ 		'Vx3','Vy3','Vel3','Pressure3','Thickness3','Surface3','MaskIceLevelset3']
+-field_tolerances=[1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,\
+-		2e-13,2e-13,2e-13,1e-13,1e-13,1e-13,1e-13,\
+-		2e-13,2e-13,2e-13,1e-13,1e-13,1e-13,1e-11]
++field_tolerances=[1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,1e-11,\
++		2e-11,2e-11,2e-11,1e-11,1e-11,1e-11,1e-11,\
++		2e-11,2e-11,2e-11,1e-11,1e-11,1e-11,1e-11]
+ field_values=[\
+ 	md.results.TransientSolution[0].Vx,\
+ 	md.results.TransientSolution[0].Vy,\
Index: /issm/oecreview/Archive/18296-19100/ISSM-18964-18965.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18964-18965.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18964-18965.diff	(revision 19102)
@@ -0,0 +1,15 @@
+Index: ../trunk-jpl/src/m/classes/calving.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/calving.py	(revision 18964)
++++ ../trunk-jpl/src/m/classes/calving.py	(revision 18965)
+@@ -37,8 +37,8 @@
+ 		if (solution!=TransientSolutionEnum()) or (not md.transient.iscalving):
+ 			return md
+ 
+-		md = checkfield(md,'fieldname','calving.calvingrate[1:md.mesh.numberofvertices,:]','>=',0,'forcing',1,'NaN',1);
+-		md = checkfield(md,'fieldname','calving.meltingrate[1:md.mesh.numberofvertices,:]','>=',0,'forcing',1,'NaN',1);
++		md = checkfield(md,'fieldname','calving.calvingrate','>=',0,'forcing',1,'NaN',1);
++		md = checkfield(md,'fieldname','calving.meltingrate','>=',0,'forcing',1,'NaN',1);
+ 
+ 		return md
+ 	# }}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18965-18966.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18965-18966.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18965-18966.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/c/classes/Constraints/SpcTransient.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Constraints/SpcTransient.cpp	(revision 18965)
++++ ../trunk-jpl/src/c/classes/Constraints/SpcTransient.cpp	(revision 18966)
+@@ -131,7 +131,6 @@
+ 
+ 		/*Apply or relax constraint: */
+ 		if(xIsNan<IssmDouble>(value)){
+-			printf("-------------- file: SpcTransient.cpp line: %i\n",__LINE__); 
+ 			node->RelaxConstraint(dof);
+ 		}
+ 		else node->ApplyConstraint(dof,value);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18966-18967.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18966-18967.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18966-18967.diff	(revision 19102)
@@ -0,0 +1,20 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18966)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18967)
+@@ -11,6 +11,7 @@
+ 
+ #include <stdio.h>
+ #include <string.h>
++#include <math.h>
+ #include "../classes.h"
+ #include "../../shared/shared.h"
+ #ifdef _HAVE_GIA_
+@@ -311,6 +312,7 @@
+ 		if(calvingrate[iv]<0){
+ 			calvingrate[iv]=0;
+ 		}
++		calvingrate[iv]=pow(calvingrate[iv],0.3);
+ 		calvingratex[iv]=calvingrate[iv]*vx/(sqrt(vel)+1.e-14);
+ 		calvingratey[iv]=calvingrate[iv]*vy/(sqrt(vel)+1.e-14);
+ 	}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18967-18968.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18967-18968.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18967-18968.diff	(revision 19102)
@@ -0,0 +1,1594 @@
+Index: ../trunk-jpl/test/NightlyRun/test236.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test236.py	(revision 18967)
++++ ../trunk-jpl/test/NightlyRun/test236.py	(revision 18968)
+@@ -15,6 +15,7 @@
+ # Use of ispdd and isdelta18o methods
+ md.surfaceforcings = SMBpdd();
+ md.surfaceforcings.isdelta18o=1
++md.surfaceforcings.ismungsm=0
+ 
+ # Add temperature, precipitation and delta18o needed to measure the surface mass balance
+ # creating delta18o
+@@ -49,14 +50,20 @@
+ for imonth in xrange(0,12):
+     md.surfaceforcings.precipitations_presentday[0:md.mesh.numberofvertices,imonth]=-0.4*10**(-6)*md.mesh.y+0.5
+     md.surfaceforcings.precipitations_presentday[md.mesh.numberofvertices,imonth]=((float(imonth)+1.)/12.)
++    md.surfaceforcings.precipitations_lgm[0:md.mesh.numberofvertices,imonth]=-0.4*10**(-6)*md.mesh.y+0.5
++    md.surfaceforcings.precipitations_lgm[md.mesh.numberofvertices,imonth]=((float(imonth)+1.)/12.)
+ 
++# Interpolation factors
++md.surfaceforcings.Tdiff[1,1:md.timestepping.final_time]=0.5;
++md.surfaceforcings.sealev[1,1:md.timestepping.final_time]=0.5;
++# Year of each data point
++md.surfaceforcings.Tdiff[2,1:md.timestepping.final_time]=1:1:md.timestepping.final_time;
++md.surfaceforcings.sealev[2,1:md.timestepping.final_time]=1:1:md.timestepping.final_time;
++
+ # time steps and resolution
+ md.timestepping.time_step=20.
+ md.timestepping.final_time=60.
+ 
+-md.surfaceforcings.Pfac=[1,1]
+-md.surfaceforcings.Tdiff=[1,1]
+-md.surfaceforcings.sealev=[1,1]
+ 
+ # 
+ md.transient.requested_outputs=['default','SurfaceforcingsMonthlytemperatures']
+Index: ../trunk-jpl/test/NightlyRun/test237.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test237.py	(revision 18967)
++++ ../trunk-jpl/test/NightlyRun/test237.py	(revision 18968)
+@@ -11,20 +11,21 @@
+ 
+ md=triangle(model(),'../Exp/Square.exp',600000)    #180000
+ md=setmask(md,'all','')
++md=parameterize(md,'../Par/SquareShelf.py')
+ 
+ # Use of ispdd and isdelta18o methods
+ md.surfaceforcings = SMBpdd();
+-md.surfaceforcings.isdelta18o=1
++md.surfaceforcings.isdelta18o=0
++md.surfaceforcings.ismungsm=1
+ 
+-md=parameterize(md,'../Par/SquareShelf.py')
+ 
+-# Add temperature, precipitation and delta18o needed to measure the surface mass balance
+-# creating delta18o
+-delta18o=numpy.loadtxt('../Data/delta18o.data')
+-md.surfaceforcings.delta18o=delta18o
+-# creating delta18oSurface
+-md.surfaceforcings.delta18o_surface = numpy.zeros((2,numpy.size(delta18o,axis=1)))
+-md.surfaceforcings.delta18o_surface[1,:] = delta18o[1,:]
++# # Add temperature, precipitation and delta18o needed to measure the surface mass balance
++# # creating delta18o
++# delta18o=numpy.loadtxt('../Data/delta18o.data')
++# md.surfaceforcings.delta18o=delta18o
++# # creating delta18oSurface
++# md.surfaceforcings.delta18o_surface = numpy.zeros((2,numpy.size(delta18o,axis=1)))
++# md.surfaceforcings.delta18o_surface[1,:] = delta18o[1,:]
+ 
+ # creating Present day and lgm temperatures
+ # Same temperature over the all region:
+@@ -51,16 +52,23 @@
+ for imonth in xrange(0,12):
+     md.surfaceforcings.precipitations_presentday[0:md.mesh.numberofvertices,imonth]=-0.4*10**(-6)*md.mesh.y+0.5
+     md.surfaceforcings.precipitations_presentday[md.mesh.numberofvertices,imonth]=((float(imonth)+1.)/12.)
++    md.surfaceforcings.precipitations_lgm[0:md.mesh.numberofvertices,imonth]=-0.4*10**(-6)*md.mesh.y+0.5
++    md.surfaceforcings.precipitations_lgm[md.mesh.numberofvertices,imonth]=((float(imonth)+1.)/12.)
+ 
++# Interpolation factors
++md.surfaceforcings.Pfac[1,1:md.timestepping.final_time]=0.5;
++md.surfaceforcings.Tdiff[1,1:md.timestepping.final_time]=0.5;
++md.surfaceforcings.sealev[1,1:md.timestepping.final_time]=0.5;
++# Year of each data point
++md.surfaceforcings.Pfac[2,1:md.timestepping.final_time]=1:1:md.timestepping.final_time;
++md.surfaceforcings.Tdiff[2,1:md.timestepping.final_time]=1:1:md.timestepping.final_time;
++md.surfaceforcings.sealev[2,1:md.timestepping.final_time]=1:1:md.timestepping.final_time;
++
+ # time steps and resolution
+ md.timestepping.time_step=20.
+ md.settings.output_frequency=1
+ md.timestepping.final_time=60.
+ 
+-md.surfaceforcings.Pfac=[1,1]
+-md.surfaceforcings.Tdiff=[1,1]
+-md.surfaceforcings.sealev=[1,1]
+-
+ #
+ md.transient.requested_outputs=['default','SurfaceforcingsMonthlytemperatures']
+ md.extrude(3,1.)
+Index: ../trunk-jpl/test/NightlyRun/test236.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test236.m	(revision 18967)
++++ ../trunk-jpl/test/NightlyRun/test236.m	(revision 18968)
+@@ -2,12 +2,18 @@
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+ 
++%md.verbose=verbose('all');
++
+ % Use of ispdd and isdelta18o methods
+ md.surfaceforcings = SMBpdd();
+ md.surfaceforcings.isdelta18o=1;
++md.surfaceforcings.ismungsm=0;
+ 
++%md.surfaceforcings.precipitation(1:md.mesh.numberofvertices,1:12)=0;
++%md.surfaceforcings.monthlytemperatures(1:md.mesh.numberofvertices,1:12)=273;
++
+ % Add temperature, precipitation and delta18o needed to measure the surface mass balance
+-% creating delta18o
++%  creating delta18o
+ load '../Data/delta18o.data'
+ md.surfaceforcings.delta18o=delta18o;
+ % creating delta18oSurface
+@@ -25,7 +31,8 @@
+     md.surfaceforcings.temperatures_lgm(md.mesh.numberofvertices+1,imonth+1)=((imonth+1)/12);
+ end
+ 
+-% creating initialization and spc temperatures initialization and spc
++% creating initialization and spc temperatures initialization and
++% spc
+ md.thermal.spctemperature=mean(md.surfaceforcings.temperatures_lgm(1:md.mesh.numberofvertices,1:12),2); %-10*ones(md.mesh.numberofvertices,1);
+ md.thermal.spctemperature=repmat(md.thermal.spctemperature,1,md.timestepping.final_time/md.timestepping.time_step);
+ itemp=0:md.timestepping.time_step:md.timestepping.final_time-md.timestepping.time_step;
+@@ -36,21 +43,28 @@
+ % creating precipitation
+ for imonth=0:11
+     md.surfaceforcings.precipitations_presentday(1:md.mesh.numberofvertices,imonth+1)=-0.4*10^(-6)*md.mesh.y+0.5;
++    md.surfaceforcings.precipitations_lgm(1:md.mesh.numberofvertices,imonth+1)=-0.4*10^(-6)*md.mesh.y+0.5;
++    % Time for the last line:
+     md.surfaceforcings.precipitations_presentday(md.mesh.numberofvertices+1,imonth+1)=((imonth+1)/12);
++    md.surfaceforcings.precipitations_lgm(md.mesh.numberofvertices+1,imonth+1)=((imonth+1)/12);
+ end
+ 
++% Interpolation factors
++md.surfaceforcings.Tdiff(1,1:md.timestepping.final_time)=0.5;
++md.surfaceforcings.sealev(1,1:md.timestepping.final_time)=0.5;
++% Year of each data point
++md.surfaceforcings.Tdiff(2,1:md.timestepping.final_time)=1:1:md.timestepping.final_time;
++md.surfaceforcings.sealev(2,1:md.timestepping.final_time)=1:1:md.timestepping.final_time;
++
+ % time steps and resolution
+ md.timestepping.time_step=20;
++md.settings.output_frequency=1;
+ md.timestepping.final_time=60;
+ 
+-md.surfaceforcings.Pfac=[1;1];
+-md.surfaceforcings.Tdiff=[1;1];
+-md.surfaceforcings.sealev=[1;1];
+-
+ % 
+ md.transient.requested_outputs={'default','SurfaceforcingsMonthlytemperatures'};
+ md=setflowequation(md,'SSA','all');
+-md.cluster=generic('name',oshostname(),'np',3);
++md.cluster=generic('name',oshostname(),'np',1); % 3 for the cluster
+ md=solve(md,TransientSolutionEnum());
+ 
+ %Fields and tolerances to track changes
+Index: ../trunk-jpl/test/NightlyRun/test237.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test237.m	(revision 18967)
++++ ../trunk-jpl/test/NightlyRun/test237.m	(revision 18968)
+@@ -1,19 +1,27 @@
+ md=triangle(model(),'../Exp/Square.exp',600000.);%180000
+ md=setmask(md,'all','');
++md=parameterize(md,'../Par/SquareShelf.par');
+ 
+-% Use of ispdd and isdelta18o methods
++%md.verbose=verbose('all');
++
++% Use of ispdd methods
+ md.surfaceforcings = SMBpdd();
+-md.surfaceforcings.isdelta18o=1;
++md.surfaceforcings.isdelta18o=0;
++md.surfaceforcings.ismungsm=1;
+ 
+-md=parameterize(md,'../Par/SquareShelf.par');
++if md.surfaceforcings.isdelta18o==0 & md.surfaceforcings.ismungsm==0
++    md.surfaceforcings.precipitation=zeros(md.mesh.numberofvertices,1);
++    md.surfaceforcings.monthlytemperatures=273*ones(md.mesh.numberofvertices,1);
++end
++    
+ 
+ % Add temperature, precipitation and delta18o needed to measure the surface mass balance
+-% creating delta18o
+-load '../Data/delta18o.data'
+-md.surfaceforcings.delta18o=delta18o;
+-% creating delta18oSurface
+-md.surfaceforcings.delta18o_surface(1,1:(length(delta18o))) = 0;
+-md.surfaceforcings.delta18o_surface(2,:) = delta18o(2,:);
++% % creating delta18o
++% load '../Data/delta18o.data'
++% md.surfaceforcings.delta18o=delta18o;
++% % creating delta18oSurface
++% md.surfaceforcings.delta18o_surface(1,1:(length(delta18o))) = 0;
++% md.surfaceforcings.delta18o_surface(2,:) = delta18o(2,:);
+ 
+ % creating Present day and lgm temperatures
+ % Same temperature over the all region:
+@@ -37,12 +45,19 @@
+ % creating precipitation
+ for imonth=0:11
+     md.surfaceforcings.precipitations_presentday(1:md.mesh.numberofvertices,imonth+1)=-0.4*10^(-6)*md.mesh.y+0.5;
++    md.surfaceforcings.precipitations_lgm(1:md.mesh.numberofvertices,imonth+1)=-0.4*10^(-6)*md.mesh.y+0.5;
++    % Time for the last line:
+     md.surfaceforcings.precipitations_presentday(md.mesh.numberofvertices+1,imonth+1)=((imonth+1)/12);
++    md.surfaceforcings.precipitations_lgm(md.mesh.numberofvertices+1,imonth+1)=((imonth+1)/12);
+ end
+ 
+-md.surfaceforcings.Pfac=[1;1];
+-md.surfaceforcings.Tdiff=[1;1];
+-md.surfaceforcings.sealev=[1;1];
++md.surfaceforcings.Pfac(1,1:md.timestepping.final_time)=0.5;
++md.surfaceforcings.Tdiff(1,1:md.timestepping.final_time)=0.5;
++md.surfaceforcings.sealev(1,1:md.timestepping.final_time)=0.5;
++% Year of each data point
++md.surfaceforcings.Pfac(2,1:md.timestepping.final_time)=1:1:md.timestepping.final_time;
++md.surfaceforcings.Tdiff(2,1:md.timestepping.final_time)=1:1:md.timestepping.final_time;
++md.surfaceforcings.sealev(2,1:md.timestepping.final_time)=1:1:md.timestepping.final_time;
+ 
+ % time steps and resolution
+ md.timestepping.time_step=20;
+@@ -51,10 +66,11 @@
+ 
+ %
+ md.transient.requested_outputs={'default','SurfaceforcingsMonthlytemperatures'};
+-md=extrude(md,3,1.);
++md=extrude(md,3,1);
++
+ md=setflowequation(md,'SSA','all');
+-md.cluster=generic('name',oshostname(),'np',1);
+-md=solve(md,TransientSolutionEnum());
++md.cluster=generic('name',oshostname(),'np',1); % 3 for the cluster
++md=solve(md,TransientSolutionEnum);
+ 
+ %Fields and tolerances to track changes
+ field_names     ={'Vx1','Vy1','Vz1','Vel1','Pressure1','Bed1','Surface1','Thickness1','Temperature1','BasalforcingsGroundediceMeltingRate1', ...
+Index: ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18967)
++++ ../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18968)
+@@ -119,7 +119,7 @@
+ 
+ 	int    stabilization,finiteelement,smb_model;
+ 	bool   dakota_analysis;
+-	bool   isdelta18o;
++	bool   isdelta18o,ismungsm;
+ 	bool   isgroundingline;
+ 	bool   islevelset;
+ 
+@@ -178,17 +178,19 @@
+ 			break;
+ 		case SMBpddEnum:
+ 			iomodel->Constant(&isdelta18o,SurfaceforcingsIsdelta18oEnum);
++			iomodel->Constant(&ismungsm,SurfaceforcingsIsmungsmEnum);
+ 			iomodel->FetchDataToInput(elements,ThermalSpctemperatureEnum);
+-			if(isdelta18o){
++			if(isdelta18o || ismungsm){
+ 				iomodel->FetchDataToInput(elements,SurfaceforcingsTemperaturesLgmEnum);
+ 				iomodel->FetchDataToInput(elements,SurfaceforcingsTemperaturesPresentdayEnum);
+ 				iomodel->FetchDataToInput(elements,SurfaceforcingsPrecipitationsPresentdayEnum);
+ 				iomodel->FetchDataToInput(elements,SurfaceforcingsPrecipitationsLgmEnum);
+ 			}
+ 			else{
+-				iomodel->FetchDataToInput(elements,SurfaceforcingsPrecipitationEnum);
++			        iomodel->FetchDataToInput(elements,SurfaceforcingsPrecipitationEnum);
+ 				iomodel->FetchDataToInput(elements,SurfaceforcingsMonthlytemperaturesEnum);
+ 			}
++
+ 			break;
+ 		case SMBgradientsEnum:
+ 			iomodel->FetchDataToInput(elements,SurfaceforcingsHrefEnum);
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18967)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18968)
+@@ -343,6 +343,7 @@
+ 	SurfaceforcingsDelta18oEnum,
+ 	SurfaceforcingsDelta18oSurfaceEnum,
+ 	SurfaceforcingsIsdelta18oEnum,
++	SurfaceforcingsIsmungsmEnum,
+ 	SurfaceforcingsPrecipitationsPresentdayEnum,
+ 	SurfaceforcingsPrecipitationsLgmEnum,
+ 	SurfaceforcingsTemperaturesPresentdayEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18967)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18968)
+@@ -349,6 +349,7 @@
+ 		case SurfaceforcingsDelta18oEnum : return "SurfaceforcingsDelta18o";
+ 		case SurfaceforcingsDelta18oSurfaceEnum : return "SurfaceforcingsDelta18oSurface";
+ 		case SurfaceforcingsIsdelta18oEnum : return "SurfaceforcingsIsdelta18o";
++		case SurfaceforcingsIsmungsmEnum : return "SurfaceforcingsIsmungsm";
+ 		case SurfaceforcingsPrecipitationsPresentdayEnum : return "SurfaceforcingsPrecipitationsPresentday";
+ 		case SurfaceforcingsPrecipitationsLgmEnum : return "SurfaceforcingsPrecipitationsLgm";
+ 		case SurfaceforcingsTemperaturesPresentdayEnum : return "SurfaceforcingsTemperaturesPresentday";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18967)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18968)
+@@ -355,6 +355,7 @@
+ 	      else if (strcmp(name,"SurfaceforcingsDelta18o")==0) return SurfaceforcingsDelta18oEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsDelta18oSurface")==0) return SurfaceforcingsDelta18oSurfaceEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsIsdelta18o")==0) return SurfaceforcingsIsdelta18oEnum;
++	      else if (strcmp(name,"SurfaceforcingsIsmungsm")==0) return SurfaceforcingsIsmungsmEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsPrecipitationsPresentday")==0) return SurfaceforcingsPrecipitationsPresentdayEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsPrecipitationsLgm")==0) return SurfaceforcingsPrecipitationsLgmEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsTemperaturesPresentday")==0) return SurfaceforcingsTemperaturesPresentdayEnum;
+@@ -381,11 +382,11 @@
+ 	      else if (strcmp(name,"SurfaceforcingsRunoff")==0) return SurfaceforcingsRunoffEnum;
+ 	      else if (strcmp(name,"SMBmeltcomponents")==0) return SMBmeltcomponentsEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsMelt")==0) return SurfaceforcingsMeltEnum;
+-	      else if (strcmp(name,"SurfaceforcingsRefreeze")==0) return SurfaceforcingsRefreezeEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"SurfaceforcingsIspdd")==0) return SurfaceforcingsIspddEnum;
++	      if (strcmp(name,"SurfaceforcingsRefreeze")==0) return SurfaceforcingsRefreezeEnum;
++	      else if (strcmp(name,"SurfaceforcingsIspdd")==0) return SurfaceforcingsIspddEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsIssmbgradients")==0) return SurfaceforcingsIssmbgradientsEnum;
+ 	      else if (strcmp(name,"SolutionType")==0) return SolutionTypeEnum;
+ 	      else if (strcmp(name,"AnalysisType")==0) return AnalysisTypeEnum;
+@@ -504,11 +505,11 @@
+ 	      else if (strcmp(name,"MatrixParam")==0) return MatrixParamEnum;
+ 	      else if (strcmp(name,"Masscon")==0) return MassconEnum;
+ 	      else if (strcmp(name,"MassconName")==0) return MassconNameEnum;
+-	      else if (strcmp(name,"MassconDefinitionenum")==0) return MassconDefinitionenumEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"MassconLevelset")==0) return MassconLevelsetEnum;
++	      if (strcmp(name,"MassconDefinitionenum")==0) return MassconDefinitionenumEnum;
++	      else if (strcmp(name,"MassconLevelset")==0) return MassconLevelsetEnum;
+ 	      else if (strcmp(name,"Massconaxpby")==0) return MassconaxpbyEnum;
+ 	      else if (strcmp(name,"MassconaxpbyName")==0) return MassconaxpbyNameEnum;
+ 	      else if (strcmp(name,"MassconaxpbyDefinitionenum")==0) return MassconaxpbyDefinitionenumEnum;
+@@ -627,11 +628,11 @@
+ 	      else if (strcmp(name,"DeviatoricStressxz")==0) return DeviatoricStressxzEnum;
+ 	      else if (strcmp(name,"DeviatoricStressyy")==0) return DeviatoricStressyyEnum;
+ 	      else if (strcmp(name,"DeviatoricStressyz")==0) return DeviatoricStressyzEnum;
+-	      else if (strcmp(name,"DeviatoricStresszz")==0) return DeviatoricStresszzEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"StrainRate")==0) return StrainRateEnum;
++	      if (strcmp(name,"DeviatoricStresszz")==0) return DeviatoricStresszzEnum;
++	      else if (strcmp(name,"StrainRate")==0) return StrainRateEnum;
+ 	      else if (strcmp(name,"StrainRatexx")==0) return StrainRatexxEnum;
+ 	      else if (strcmp(name,"StrainRatexy")==0) return StrainRatexyEnum;
+ 	      else if (strcmp(name,"StrainRatexz")==0) return StrainRatexzEnum;
+@@ -750,11 +751,11 @@
+ 	      else if (strcmp(name,"GroundinglineMigration")==0) return GroundinglineMigrationEnum;
+ 	      else if (strcmp(name,"Gset")==0) return GsetEnum;
+ 	      else if (strcmp(name,"Index")==0) return IndexEnum;
+-	      else if (strcmp(name,"Indexed")==0) return IndexedEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"Intersect")==0) return IntersectEnum;
++	      if (strcmp(name,"Indexed")==0) return IndexedEnum;
++	      else if (strcmp(name,"Intersect")==0) return IntersectEnum;
+ 	      else if (strcmp(name,"Nodal")==0) return NodalEnum;
+ 	      else if (strcmp(name,"OldGradient")==0) return OldGradientEnum;
+ 	      else if (strcmp(name,"OutputFilePointer")==0) return OutputFilePointerEnum;
+Index: ../trunk-jpl/src/c/shared/Elements/elements.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Elements/elements.h	(revision 18967)
++++ ../trunk-jpl/src/c/shared/Elements/elements.h	(revision 18968)
+@@ -12,18 +12,21 @@
+ IssmDouble Arrhenius(IssmDouble temperature,IssmDouble depth,IssmDouble n);
+ IssmDouble LliboutryDuval(IssmDouble enthalpy, IssmDouble pressure, IssmDouble n, IssmDouble betaCC, IssmDouble referencetemperature, IssmDouble heatcapacity, IssmDouble latentheat);
+ // IssmDouble LliboutryDuval(IssmDouble temperature, IssmDouble waterfraction, IssmDouble depth,IssmDouble n);
+-IssmDouble PddSurfaceMassBlance(IssmDouble* monthlytemperatures,  IssmDouble* monthlyprec,
+-				IssmDouble* TemperaturesLgm, IssmDouble* TemperaturesPresentday,
+-				IssmDouble* PrecipitationsLgm, IssmDouble* PrecipitationsPresentday,
+-				IssmDouble* pdds, IssmDouble* pds,IssmDouble signorm, IssmDouble yts,
+-				IssmDouble h, IssmDouble s, IssmDouble desfac,
+-				IssmDouble s0t,IssmDouble s0p, IssmDouble rlaps, IssmDouble rlapslgm,
+-				IssmDouble PfacTime,IssmDouble TdiffTime,IssmDouble sealevTime);
++IssmDouble PddSurfaceMassBalance(IssmDouble* monthlytemperatures,  IssmDouble* monthlyprec,
++				 IssmDouble* pdds, IssmDouble* pds,IssmDouble signorm, IssmDouble yts,
++				 IssmDouble h, IssmDouble s, IssmDouble desfac,IssmDouble s0t,
++				 IssmDouble s0p, IssmDouble rlaps, IssmDouble rlapslgm,
++				 IssmDouble TdiffTime,IssmDouble sealevTime,
++				 IssmDouble rho_water, IssmDouble rho_ice);
+ void ComputeDelta18oTemperaturePrecipitation(IssmDouble Delta18oSurfacePresent, IssmDouble Delta18oSurfaceLgm, IssmDouble Delta18oSurfaceTime,
+-				     IssmDouble Delta18oPresent, IssmDouble Delta18oLgm, IssmDouble Delta18oTime, 
+-				     IssmDouble* PrecipitationsPresentday,
+-				     IssmDouble* TemperaturesLgm, IssmDouble* TemperaturesPresentday, 
+-					  IssmDouble* monthlytemperaturesout, IssmDouble* monthlyprecout);
++					     IssmDouble Delta18oPresent, IssmDouble Delta18oLgm, IssmDouble Delta18oTime,
++					     IssmDouble* PrecipitationsPresentday,
++					     IssmDouble* TemperaturesLgm, IssmDouble* TemperaturesPresentday, 
++					     IssmDouble* monthlytemperaturesout, IssmDouble* monthlyprecout);
++void ComputeMungsmTemperaturePrecipitation(IssmDouble TdiffTime, IssmDouble PfacTime,
++					   IssmDouble* PrecipitationsLgm,IssmDouble* PrecipitationsPresentday,
++					   IssmDouble* TemperaturesLgm, IssmDouble* TemperaturesPresentday, 
++					   IssmDouble* monthlytemperaturesout, IssmDouble* monthlyprecout);
+ IssmDouble DrainageFunctionWaterfraction(IssmDouble waterfraction, IssmDouble dt=0.);
+ IssmDouble StressIntensityIntegralWeight(IssmDouble depth, IssmDouble water_depth, IssmDouble thickness);
+ 
+Index: ../trunk-jpl/src/c/shared/Elements/PddSurfaceMassBalance.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Elements/PddSurfaceMassBalance.cpp	(revision 18967)
++++ ../trunk-jpl/src/c/shared/Elements/PddSurfaceMassBalance.cpp	(revision 18968)
+@@ -1,22 +1,18 @@
+ /* file:  PddSurfaceMassBlance.cpp
+    Calculating the surface mass balance using the positive degree day method.
++   Updating the precipitation and temperature to the new elevation
+  */
+ 
+ #include "./elements.h"
+ #include "../Numerics/numerics.h"
+ 
+-IssmDouble PddSurfaceMassBlance(IssmDouble* monthlytemperatures, IssmDouble* monthlyprec, 
+-				IssmDouble* TemperaturesLgm, IssmDouble* TemperaturesPresentday,
+-				IssmDouble* PrecipitationsLgm, IssmDouble* PrecipitationsPresentday,
+-				IssmDouble* pdds, IssmDouble* pds, IssmDouble signorm, 
+-				IssmDouble yts, IssmDouble h, IssmDouble s, IssmDouble desfac, 
+-				IssmDouble s0t,
+-				IssmDouble s0p, IssmDouble rlaps, IssmDouble rlapslgm, 
+-				IssmDouble PfacTime,IssmDouble TdiffTime,IssmDouble sealevTime){ 
++IssmDouble PddSurfaceMassBalance(IssmDouble* monthlytemperatures, IssmDouble* monthlyprec,
++				 IssmDouble* pdds, IssmDouble* pds, IssmDouble signorm,
++				 IssmDouble yts, IssmDouble h, IssmDouble s, IssmDouble desfac,
++				 IssmDouble s0t,IssmDouble s0p, IssmDouble rlaps,IssmDouble rlapslgm,
++				 IssmDouble TdiffTime,IssmDouble sealevTime,
++				 IssmDouble rho_water,IssmDouble rho_ice){
+ 
+-  // CURENTLY monthlytemperatures and monthlyprec ARE NOT USED HERE.
+-  // THEY ARE REPLACE BY tdiffh No usage of deltO18 anymore
+-
+   // output:
+   IssmDouble B;    // surface mass balance, melt+accumulation
+   int    iqj,imonth;
+@@ -27,15 +23,15 @@
+   IssmDouble prect; // total precipitation during 1 year taking into account des. ef.
+   IssmDouble water; //water=rain + snowmelt 
+   IssmDouble runoff; //meltwater only, does not include rain 
++  IssmDouble sconv; //rhow_rain/rhoi / 12 months
+ 
+   //IssmDouble  sealev=0.;         // degrees per meter. 7.5 lev's 99 paper, 9 Marshall 99 paper
+   //IssmDouble  Pfac=0.5,Tdiff=0.5;
+-  IssmDouble  rtlaps;
++  IssmDouble rtlaps;
+   // IssmDouble lapser=6.5         // lapse rate
+   // IssmDouble desfac = 0.3;      // desert elevation factor
+   // IssmDouble s0p=0.;            // should be set to elevation from precip source
+   // IssmDouble s0t=0.;         // should be set to elevation from temperature source
+-  IssmDouble tdiffh;  
+   IssmDouble st;             // elevation between altitude of the temp record and current altitude
+   IssmDouble sp;             // elevation between altitude of the prec record and current altitude
+   IssmDouble deselcut=1.0;
+@@ -48,7 +44,6 @@
+   IssmDouble DT = 0.02;
+   IssmDouble pddt, pd; // pd: snow/precip fraction, precipitation falling as snow
+ 
+-  IssmDouble premt;     // monthly precipitation (m of ice equivalent)
+   IssmDouble q, qmpt;   // q is desert/elev. fact, hnpfac is huybrect fact, and pd is normal dist.
+   IssmDouble qm = 0.;   // snow part of the precipitation 
+   IssmDouble qmt = 0.;  // precipitation without desertification effect adjustment
+@@ -72,6 +67,7 @@
+   IssmDouble fsupT=0.5,  fsupndd=0.5;  // Tsurf mode factors for supice
+   IssmDouble pddtj, hmx2;
+ 
++  sconv=(rho_water/rho_ice)/12.; //rhow_rain/rhoi / 12 months
+ 
+   /*PDD constant*/
+   siglim = 2.5*signorm; 
+@@ -89,8 +85,8 @@
+     rtlaps=TdiffTime*rlapslgm + (1.-TdiffTime)*rlaps; // lapse rate
+     
+     /*********compute Surface temperature *******/
+-    tdiffh = TdiffTime*( TemperaturesLgm[imonth] - TemperaturesPresentday[imonth] );
+-    tstar = tdiffh + TemperaturesPresentday[imonth] - rtlaps *max(st,sealevTime*0.001);
++    monthlytemperatures[imonth]=monthlytemperatures[imonth] - rtlaps *max(st,sealevTime*0.001);
++    tstar = monthlytemperatures[imonth];
+     Tsurf = tstar*deltm+Tsurf;        
+ 
+       /*********compute PD ****************/
+@@ -105,10 +101,8 @@
+       if (sp>0.0){q = exp(-desfac*sp);}
+       else {q = 1.0;}
+ 
+-      premt =min(1.5, PrecipitationsPresentday[imonth] * pow(PrecipitationsLgm[imonth],PfacTime));   // [m/month]
+-
+-      qmt= qmt + premt;  
+-      qmpt= q*premt;           
++      qmt= qmt + monthlyprec[imonth]*sconv;  //*sconv to convert in m of ice equivalent per month  
++      qmpt= q*monthlyprec[imonth]*sconv;           
+       qmp= qmp + qmpt;
+       qm= qm + qmpt*pd;
+ 
+@@ -123,6 +117,10 @@
+ 	pdd = pdd + pddsig*deltm;
+ 	frzndd = frzndd - (tstar-pddsig)*deltm;}
+       else{frzndd = frzndd - tstar*deltm; }
++
++      /*Assign output pointer*/
++      *(monthlytemperatures+imonth) = monthlytemperatures[imonth];
++      *(monthlyprec+imonth) = monthlyprec[imonth];      
+   } // end of seasonal loop 
+   //******************************************************************
+ 
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 18967)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 18968)
+@@ -21,7 +21,7 @@
+ 	int         numoutputs,materialtype,smb_model,basalforcing_model;
+ 	char**      requestedoutputs = NULL;
+ 	IssmDouble  time;
+-	bool        isdelta18o;
++	bool        isdelta18o,ismungsm;
+ 
+ 	/*parameters for mass flux:*/
+ 	int          mass_flux_num_profiles     = 0;
+@@ -107,27 +107,31 @@
+ 			break;
+ 		case SMBpddEnum:
+ 			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsIsdelta18oEnum));
++			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsIsmungsmEnum));
+ 			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsDesfacEnum));
+ 			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsS0pEnum));
+ 			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsS0tEnum));
+ 			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsRlapsEnum));
+ 			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsRlapslgmEnum));
+ 			iomodel->Constant(&isdelta18o,SurfaceforcingsIsdelta18oEnum);
++			iomodel->Constant(&ismungsm,SurfaceforcingsIsmungsmEnum);
+ 
+-			iomodel->FetchData(&temp,&N,&M,SurfaceforcingsPfacEnum); _assert_(N==2);
+-			for(i=0;i<M;i++) temp[M+i]=temp[M+i];
+-			parameters->AddObject(new TransientParam(SurfaceforcingsPfacEnum,&temp[0],&temp[M],M));
+-			iomodel->DeleteData(temp,SurfaceforcingsPfacEnum);
++			if(ismungsm){
++			  iomodel->FetchData(&temp,&N,&M,SurfaceforcingsPfacEnum); _assert_(N==2);
++			  for(i=0;i<M;i++) temp[M+i]=temp[M+i];
++			  parameters->AddObject(new TransientParam(SurfaceforcingsPfacEnum,&temp[0],&temp[M],M));
++			  iomodel->DeleteData(temp,SurfaceforcingsPfacEnum);
+ 			
+-			iomodel->FetchData(&temp,&N,&M,SurfaceforcingsTdiffEnum); _assert_(N==2);
+-			for(i=0;i<M;i++) temp[M+i]=temp[M+i];
+-			parameters->AddObject(new TransientParam(SurfaceforcingsTdiffEnum,&temp[0],&temp[M],M));
+-			iomodel->DeleteData(temp,SurfaceforcingsTdiffEnum);
++			  iomodel->FetchData(&temp,&N,&M,SurfaceforcingsTdiffEnum); _assert_(N==2);
++			  for(i=0;i<M;i++) temp[M+i]=temp[M+i];
++			  parameters->AddObject(new TransientParam(SurfaceforcingsTdiffEnum,&temp[0],&temp[M],M));
++			  iomodel->DeleteData(temp,SurfaceforcingsTdiffEnum);
+ 
+-			iomodel->FetchData(&temp,&N,&M,SurfaceforcingsSealevEnum); _assert_(N==2);
+-			for(i=0;i<M;i++) temp[M+i]=temp[M+i];
+-			parameters->AddObject(new TransientParam(SurfaceforcingsSealevEnum,&temp[0],&temp[M],M));
+-			iomodel->DeleteData(temp,SurfaceforcingsSealevEnum);
++			  iomodel->FetchData(&temp,&N,&M,SurfaceforcingsSealevEnum); _assert_(N==2);
++			  for(i=0;i<M;i++) temp[M+i]=temp[M+i];
++			  parameters->AddObject(new TransientParam(SurfaceforcingsSealevEnum,&temp[0],&temp[M],M));
++			  iomodel->DeleteData(temp,SurfaceforcingsSealevEnum);
++			}
+ 
+ 			if(isdelta18o){
+ 				iomodel->Constant(&yts,ConstantsYtsEnum);
+Index: ../trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.h
+===================================================================
+--- ../trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.h	(revision 18967)
++++ ../trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.h	(revision 18968)
+@@ -11,6 +11,7 @@
+ void SurfaceMassBalancex(FemModel* femmodel);
+ void SmbGradientsx(FemModel* femmodel);
+ void Delta18oParameterizationx(FemModel* femmodel);
++void MungsmtpParameterizationx(FemModel* femmodel);
+ void PositiveDegreeDayx(FemModel* femmodel);
+ void SmbHenningx(FemModel* femmodel);
+ void SmbComponentsx(FemModel* femmodel);
+Index: ../trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 18967)
++++ ../trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 18968)
+@@ -10,7 +10,7 @@
+ 
+ 	/*Intermediaties*/
+ 	int  smb_model;
+-	bool isdelta18o;
++	bool isdelta18o,ismungsm;
+ 
+ 	/*First, get SMB model from parameters*/
+ 	femmodel->parameters->FindParam(&smb_model,SurfaceforcingsEnum);
+@@ -22,10 +22,15 @@
+ 			break;
+ 		case SMBpddEnum:
+ 			femmodel->parameters->FindParam(&isdelta18o,SurfaceforcingsIsdelta18oEnum);
++			femmodel->parameters->FindParam(&ismungsm,SurfaceforcingsIsmungsmEnum);
+ 			if(isdelta18o){
+-				if(VerboseSolution()) _printf0_("   call Delta18oParametrization module\n");
++				if(VerboseSolution()) _printf0_("   call Delta18oParameterization module\n");
+ 				Delta18oParameterizationx(femmodel);
+ 			} 
++			if(ismungsm){
++				if(VerboseSolution()) _printf0_("   call MungsmtpParameterization module\n");
++				MungsmtpParameterizationx(femmodel);
++			} 
+ 			if(VerboseSolution()) _printf0_("   call positive degree day module\n");
+ 			PositiveDegreeDayx(femmodel);
+ 			break;
+@@ -117,6 +122,14 @@
+ 	}
+ 
+ }/*}}}*/
++void MungsmtpParameterizationx(FemModel* femmodel){/*{{{*/
++
++	for(int i=0;i<femmodel->elements->Size();i++){
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		element->MungsmtpParameterization();
++	}
++
++}/*}}}*/
+ void PositiveDegreeDayx(FemModel* femmodel){/*{{{*/
+ 
+ 	// void PositiveDegreeDayx(hd,vTempsea,vPrec,agd,Tsurf,ni){
+@@ -143,6 +156,8 @@
+ 	IssmDouble PDup, PDCUT = 2.0;    // PDcut: rain/snow cutoff temperature (C)
+ 	IssmDouble tstar; // monthly mean surface temp
+ 
++	bool ismungsm;
++
+ 	IssmDouble *pdds    = NULL;
+ 	IssmDouble *pds     = NULL;
+ 	Element    *element = NULL;
+@@ -150,6 +165,9 @@
+ 	pdds=xNew<IssmDouble>(NPDMAX+1); 
+ 	pds=xNew<IssmDouble>(NPDCMAX+1); 
+ 
++	// Get ismungsm parameter
++	femmodel->parameters->FindParam(&ismungsm,SurfaceforcingsIsmungsmEnum);
++
+ 	/* initialize PDD (creation of a lookup table)*/
+ 	tstep    = 0.1;
+ 	tsint    = tstep*0.5;
+@@ -204,9 +222,8 @@
+ 
+ 	for(i=0;i<femmodel->elements->Size();i++){
+ 		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-		element->PositiveDegreeDay(pdds,pds,signorm);
++		element->PositiveDegreeDay(pdds,pds,signorm,ismungsm);
+ 	}
+-
+ 	/*free ressouces: */
+ 	xDelete<IssmDouble>(pdds);
+ 	xDelete<IssmDouble>(pds);
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 18967)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 18968)
+@@ -219,6 +219,7 @@
+ 					./shared/Elements/PrintArrays.cpp\
+ 					./shared/Elements/PddSurfaceMassBalance.cpp\
+ 					./shared/Elements/ComputeDelta18oTemperaturePrecipitation.cpp\
++					./shared/Elements/ComputeMungsmTemperaturePrecipitation.cpp\
+ 					./shared/Elements/DrainageFunctionWaterfraction.cpp\
+ 					./shared/String/sharedstring.h\
+ 					./shared/String/DescriptorIndex.cpp\
+Index: ../trunk-jpl/src/c/classes/Elements/Element.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18967)
++++ ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 18968)
+@@ -179,6 +179,7 @@
+ 		virtual void       ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index)=0;
+ 		virtual void       ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum)=0;
+ 		virtual void       Delta18oParameterization(void)=0;
++		virtual void       MungsmtpParameterization(void)=0;
+ 		virtual void       ElementResponse(IssmDouble* presponse,int response_enum)=0;
+ 		virtual void       ElementSizes(IssmDouble* phx,IssmDouble* phy,IssmDouble* phz)=0;
+ 		virtual int        FiniteElement(void)=0;
+@@ -250,7 +251,7 @@
+ 		virtual void       NormalTop(IssmDouble* normal,IssmDouble* xyz_list)=0;
+ 		virtual int        NumberofNodesPressure(void)=0;
+ 		virtual int        NumberofNodesVelocity(void)=0;
+-		virtual void       PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm)=0;
++		virtual void       PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm,bool ismungsm)=0;
+ 		virtual void       PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding)=0;
+ 		virtual int        PressureInterpolation()=0;
+ 		virtual void       ReduceMatrices(ElementMatrix* Ke,ElementVector* pe)=0;
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18967)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18968)
+@@ -608,7 +608,6 @@
+ 			input->GetInputValue(&TemperaturesPresentday[iv][month],gauss,month/12.*yts);
+ 			input2->GetInputValue(&TemperaturesLgm[iv][month],gauss,month/12.*yts);
+ 			input3->GetInputValue(&PrecipitationsPresentday[iv][month],gauss,month/12.*yts);
+-			PrecipitationsPresentday[iv][month]=PrecipitationsPresentday[iv][month]/yts; // converion in m/sec
+ 		}
+ 	}
+ 
+@@ -650,6 +649,69 @@
+ 	/*clean-up*/
+ 	delete gauss;
+ }
++void       Tria::MungsmtpParameterization(void){/*{{{*/
++	/*Are we on the base? If not, return*/
++	if(!IsOnBase()) return;
++
++	int        i;
++	IssmDouble monthlytemperatures[NUMVERTICES][12],monthlyprec[NUMVERTICES][12];
++	IssmDouble TemperaturesPresentday[NUMVERTICES][12],TemperaturesLgm[NUMVERTICES][12];
++	IssmDouble PrecipitationsPresentday[NUMVERTICES][12],PrecipitationsLgm[NUMVERTICES][12];
++	IssmDouble tmp[NUMVERTICES];
++	IssmDouble TdiffTime,PfacTime;
++	IssmDouble time,yts;
++	this->parameters->FindParam(&time,TimeEnum);
++	this->parameters->FindParam(&yts,ConstantsYtsEnum);
++
++	/*Recover present day temperature and precipitation*/
++	Input*     input=inputs->GetInput(SurfaceforcingsTemperaturesPresentdayEnum);    _assert_(input);
++	Input*     input2=inputs->GetInput(SurfaceforcingsTemperaturesLgmEnum);          _assert_(input2);
++	Input*     input3=inputs->GetInput(SurfaceforcingsPrecipitationsPresentdayEnum); _assert_(input3);
++	Input*     input4=inputs->GetInput(SurfaceforcingsPrecipitationsLgmEnum);        _assert_(input4);
++	GaussTria* gauss=new GaussTria();
++	for(int month=0;month<12;month++) {
++		for(int iv=0;iv<NUMVERTICES;iv++) {
++			gauss->GaussVertex(iv);
++			input->GetInputValue(&TemperaturesPresentday[iv][month],gauss,month/12.*yts);
++			input2->GetInputValue(&TemperaturesLgm[iv][month],gauss,month/12.*yts);
++			input3->GetInputValue(&PrecipitationsPresentday[iv][month],gauss,month/12.*yts);
++			input4->GetInputValue(&PrecipitationsLgm[iv][month],gauss,month/12.*yts);
++		}
++	}
++
++	/*Recover interpolation parameters at time t*/
++	this->parameters->FindParam(&TdiffTime,SurfaceforcingsTdiffEnum,time);
++	this->parameters->FindParam(&PfacTime,SurfaceforcingsPfacEnum,time);
++
++	/*Compute the temperature and precipitation*/
++	for(int iv=0;iv<NUMVERTICES;iv++){
++	  ComputeMungsmTemperaturePrecipitation(TdiffTime,PfacTime,
++					&PrecipitationsLgm[iv][0],&PrecipitationsPresentday[iv][0], 
++					&TemperaturesLgm[iv][0], &TemperaturesPresentday[iv][0], 
++					&monthlytemperatures[iv][0], &monthlyprec[iv][0]);
++	}
++
++	/*Update inputs*/ 
++	TransientInput* NewTemperatureInput = new TransientInput(SurfaceforcingsMonthlytemperaturesEnum);
++	TransientInput* NewPrecipitationInput = new TransientInput(SurfaceforcingsPrecipitationEnum);
++	for (int imonth=0;imonth<12;imonth++) {
++		for(i=0;i<NUMVERTICES;i++) tmp[i]=monthlytemperatures[i][imonth];
++		TriaInput* newmonthinput1 = new TriaInput(SurfaceforcingsMonthlytemperaturesEnum,&tmp[0],P1Enum);
++		NewTemperatureInput->AddTimeInput(newmonthinput1,time+imonth/12.*yts);
++
++		for(i=0;i<NUMVERTICES;i++) tmp[i]=monthlyprec[i][imonth];
++		TriaInput* newmonthinput2 = new TriaInput(SurfaceforcingsPrecipitationEnum,&tmp[0],P1Enum);
++		NewPrecipitationInput->AddTimeInput(newmonthinput2,time+imonth/12.*yts);
++	}
++	NewTemperatureInput->Configure(this->parameters);
++	NewPrecipitationInput->Configure(this->parameters);
++
++	this->inputs->AddInput(NewTemperatureInput);
++	this->inputs->AddInput(NewPrecipitationInput);
++
++	/*clean-up*/
++	delete gauss;
++}
+ /*}}}*/
+ int        Tria::EdgeOnBaseIndex(void){/*{{{*/
+ 
+@@ -2441,83 +2503,94 @@
+ 	return TriaRef::NumberofNodes(this->VelocityInterpolation());
+ }
+ /*}}}*/
+-void       Tria::PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm){/*{{{*/
+-
++void       Tria::PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm,bool ismungsm){/*{{{*/
++ 
++   int        i;
+    IssmDouble agd[NUMVERTICES];             // surface mass balance
+    IssmDouble monthlytemperatures[NUMVERTICES][12],monthlyprec[NUMVERTICES][12];
+-   IssmDouble TemperaturesPresentday[NUMVERTICES][12],TemperaturesLgm[NUMVERTICES][12];
+-   IssmDouble PrecipitationsPresentday[NUMVERTICES][12],PrecipitationsLgm[NUMVERTICES][12];
++   IssmDouble tmp[NUMVERTICES];
+    IssmDouble h[NUMVERTICES],s[NUMVERTICES];
+    IssmDouble rho_water,rho_ice,desfac,s0p,s0t,rlaps,rlapslgm;
+    IssmDouble PfacTime,TdiffTime,sealevTime;
+-   IssmDouble sconv; //rhow_rain/rhoi / 12 months
+    
+    /*Get material parameters :*/
+    rho_water=matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
+    rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
+-   //rho_ice=matpar->GetRhoIce();
+-   //rho_water=matpar->GetRhoFreshwater();
+ 
+-   sconv=(rho_water/rho_ice)/12.; //to convert monbthly prec in m of ice equivalent per month
++  /*Get some pdd parameters*/
++  desfac=matpar->GetMaterialParameter(SurfaceforcingsDesfacEnum);
++  s0p=matpar->GetMaterialParameter(SurfaceforcingsS0pEnum);
++  s0t=matpar->GetMaterialParameter(SurfaceforcingsS0tEnum);
++  rlaps=matpar->GetMaterialParameter(SurfaceforcingsRlapsEnum);
++  rlapslgm=matpar->GetMaterialParameter(SurfaceforcingsRlapslgmEnum);
+ 
+    /*Recover monthly temperatures and precipitation and Present day and LGm ones*/
+    Input*     input=inputs->GetInput(SurfaceforcingsMonthlytemperaturesEnum); _assert_(input);
+    Input*     input2=inputs->GetInput(SurfaceforcingsPrecipitationEnum); _assert_(input2);
+-   Input*     input3=inputs->GetInput(SurfaceforcingsTemperaturesPresentdayEnum);    _assert_(input3);
+-   Input*     input4=inputs->GetInput(SurfaceforcingsTemperaturesLgmEnum);          _assert_(input4);
+-   Input*     input5=inputs->GetInput(SurfaceforcingsPrecipitationsPresentdayEnum);  _assert_(input5);
+-   Input*     input6=inputs->GetInput(SurfaceforcingsPrecipitationsLgmEnum);   _assert_(input6);
+    GaussTria* gauss=new GaussTria();
+    IssmDouble time,yts;
+    this->parameters->FindParam(&time,TimeEnum);
+    this->parameters->FindParam(&yts,ConstantsYtsEnum);
++
++
+    for(int month=0;month<12;month++) {
+      for(int iv=0;iv<NUMVERTICES;iv++) {
+        gauss->GaussVertex(iv);
+        input->GetInputValue(&monthlytemperatures[iv][month],gauss,time+month/12.*yts);
+        monthlytemperatures[iv][month]=monthlytemperatures[iv][month]-273.15; // conversion from Kelvin to celcius
+        input2->GetInputValue(&monthlyprec[iv][month],gauss,time+month/12.*yts);
+-       monthlyprec[iv][month]=monthlyprec[iv][month]*sconv*yts; // convertion in m/y
+-       input3->GetInputValue(&TemperaturesPresentday[iv][month],gauss,month/12.*yts);
+-       TemperaturesPresentday[iv][month]=TemperaturesPresentday[iv][month]-273.15; // conversion from Kelvin to celcius
+-       input4->GetInputValue(&TemperaturesLgm[iv][month],gauss,month/12.*yts);
+-       TemperaturesLgm[iv][month]=TemperaturesLgm[iv][month]-273.15; // conversion from Kelvin to celcius
+-       input5->GetInputValue(&PrecipitationsPresentday[iv][month],gauss,month/12.*yts);
+-       PrecipitationsPresentday[iv][month]=PrecipitationsPresentday[iv][month]; 
+-       input6->GetInputValue(&PrecipitationsLgm[iv][month],gauss,month/12.*yts);
+-       PrecipitationsLgm[iv][month]=PrecipitationsLgm[iv][month];  
+      }
+    }
+ 
+-  /*Recover Pfac, Tdiff and sealev at time t:*/
+-  this->parameters->FindParam(&PfacTime,SurfaceforcingsPfacEnum,time);
+-  this->parameters->FindParam(&TdiffTime,SurfaceforcingsTdiffEnum,time);
+-  this->parameters->FindParam(&sealevTime,SurfaceforcingsSealevEnum,time);
++  /*Recover Pfac, Tdiff and sealev at time t:
++    This parameters are used to interpolate the temperature 
++    and precipitaton between PD and LGM when ismungsm==1 */ 
++  if (ismungsm==1){  
++    this->parameters->FindParam(&TdiffTime,SurfaceforcingsTdiffEnum,time);
++    this->parameters->FindParam(&sealevTime,SurfaceforcingsSealevEnum,time);
++  }
++  else {
++    TdiffTime=0;
++    sealevTime=0;  
++  }
+ 
+   /*Recover info at the vertices: */
+   GetInputListOnVertices(&h[0],ThicknessEnum);
+   GetInputListOnVertices(&s[0],SurfaceEnum);
+-
+-  /*Get other pdd parameters*/
+-  desfac=matpar->GetMaterialParameter(SurfaceforcingsDesfacEnum);
+-  s0p=matpar->GetMaterialParameter(SurfaceforcingsS0pEnum);
+-  s0t=matpar->GetMaterialParameter(SurfaceforcingsS0tEnum);
+-  rlaps=matpar->GetMaterialParameter(SurfaceforcingsRlapsEnum);
+-  rlapslgm=matpar->GetMaterialParameter(SurfaceforcingsRlapslgmEnum);
+      
+    /*measure the surface mass balance*/
+-   for (int iv = 0; iv<NUMVERTICES; iv++){
+-     agd[iv]=PddSurfaceMassBlance(&monthlytemperatures[iv][0], &monthlyprec[iv][0],
+-				  &TemperaturesLgm[iv][0], &TemperaturesPresentday[iv][0], 
+-				  &PrecipitationsLgm[iv][0], &PrecipitationsPresentday[iv][0], 
++  for (int iv = 0; iv<NUMVERTICES; iv++){
++     agd[iv]=PddSurfaceMassBalance(&monthlytemperatures[iv][0], &monthlyprec[iv][0],
+ 				  pdds, pds, signorm, yts, h[iv], s[iv],
+-				  desfac, s0t, s0p,rlaps,rlapslgm,PfacTime,TdiffTime,sealevTime);
++				  desfac, s0t, s0p,rlaps,rlapslgm,TdiffTime,sealevTime,
++				  rho_water,rho_ice);
+    }
+ 
+    /*Update inputs*/    
++   // TransientInput* NewTemperatureInput = new TransientInput(SurfaceforcingsMonthlytemperaturesEnum);
++   // TransientInput* NewPrecipitationInput = new TransientInput(SurfaceforcingsPrecipitationEnum);
++   // for (int imonth=0;imonth<12;imonth++) {
++   //   for(i=0;i<NUMVERTICES;i++) tmp[i]=monthlytemperatures[i][imonth];
++   //   TriaInput* newmonthinput1 = new TriaInput(SurfaceforcingsMonthlytemperaturesEnum,&tmp[0],P1Enum);
++   //   NewTemperatureInput->AddTimeInput(newmonthinput1,time+imonth/12.*yts);
++   // 
++   //   for(i=0;i<NUMVERTICES;i++) tmp[i]=monthlyprec[i][imonth];
++   //   TriaInput* newmonthinput2 = new TriaInput(SurfaceforcingsPrecipitationEnum,&tmp[0],P1Enum);
++   //   NewPrecipitationInput->AddTimeInput(newmonthinput2,time+imonth/12.*yts);
++   // }
++   // NewTemperatureInput->Configure(this->parameters);
++   // NewPrecipitationInput->Configure(this->parameters);
++
++
+    this->inputs->AddInput(new TriaInput(SurfaceforcingsMassBalanceEnum,&agd[0],P1Enum));
++   // this->inputs->AddInput(NewTemperatureInput);
++   // this->inputs->AddInput(NewPrecipitationInput);
+    // this->inputs->AddInput(new TriaVertexInput(ThermalSpcTemperatureEnum,&Tsurf[0]));
+ 
++   //this->InputExtrude(SurfaceforcingsMassBalanceEnum,-1);
++   // this->InputExtrude(SurfaceforcingsMonthlytemperaturesEnum,-1);
++   // this->InputExtrude(SurfaceforcingsPrecipitationEnum,-1);
++
+ 	/*clean-up*/
+ 	delete gauss;
+ }
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18967)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18968)
+@@ -62,6 +62,7 @@
+ 		void        ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index);
+ 		void        ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum);
+ 		void        Delta18oParameterization(void);
++		void        MungsmtpParameterization(void);
+ 		int         EdgeOnBaseIndex();
+ 		void        EdgeOnBaseIndices(int* pindex1,int* pindex);
+ 		int         EdgeOnSurfaceIndex();
+@@ -108,7 +109,7 @@
+ 		int         NodalValue(IssmDouble* pvalue, int index, int natureofdataenum);
+ 		int         NumberofNodesPressure(void);
+ 		int         NumberofNodesVelocity(void);
+-		void        PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm);
++		void        PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm,bool ismungsm);
+ 		void        PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding);
+ 		int         PressureInterpolation();
+ 		void        ReduceMatrices(ElementMatrix* Ke,ElementVector* pe);
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18967)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18968)
+@@ -607,7 +607,6 @@
+ 			input->GetInputValue(&TemperaturesPresentday[iv][month],gauss,month/12.*yts);
+ 			input2->GetInputValue(&TemperaturesLgm[iv][month],gauss,month/12.*yts);
+ 			input3->GetInputValue(&PrecipitationsPresentday[iv][month],gauss,month/12.*yts);
+-			PrecipitationsPresentday[iv][month]=PrecipitationsPresentday[iv][month]/yts; // converion in m/sec
+ 		}
+ 	}
+ 
+@@ -652,6 +651,72 @@
+ 	/*clean-up*/
+ 	delete gauss;
+ }
++void       Penta::MungsmtpParameterization(void){/*{{{*/
++	/*Are we on the base? If not, return*/
++	if(!IsOnBase()) return;
++
++	int        i;
++	IssmDouble monthlytemperatures[NUMVERTICES][12],monthlyprec[NUMVERTICES][12];
++	IssmDouble TemperaturesPresentday[NUMVERTICES][12],TemperaturesLgm[NUMVERTICES][12];
++	IssmDouble PrecipitationsPresentday[NUMVERTICES][12],PrecipitationsLgm[NUMVERTICES][12];
++	IssmDouble tmp[NUMVERTICES];
++	IssmDouble TdiffTime,PfacTime;
++	IssmDouble time,yts;
++	this->parameters->FindParam(&time,TimeEnum);
++	this->parameters->FindParam(&yts,ConstantsYtsEnum);
++
++	/*Recover present day temperature and precipitation*/
++	Input*     input=inputs->GetInput(SurfaceforcingsTemperaturesPresentdayEnum);    _assert_(input);
++	Input*     input2=inputs->GetInput(SurfaceforcingsTemperaturesLgmEnum);          _assert_(input2);
++	Input*     input3=inputs->GetInput(SurfaceforcingsPrecipitationsPresentdayEnum); _assert_(input3);
++	Input*     input4=inputs->GetInput(SurfaceforcingsPrecipitationsLgmEnum);        _assert_(input4);
++	GaussPenta* gauss=new GaussPenta();
++	for(int month=0;month<12;month++) {
++		for(int iv=0;iv<NUMVERTICES;iv++) {
++			gauss->GaussVertex(iv);
++			input->GetInputValue(&TemperaturesPresentday[iv][month],gauss,month/12.*yts);
++			input2->GetInputValue(&TemperaturesLgm[iv][month],gauss,month/12.*yts);
++			input3->GetInputValue(&PrecipitationsPresentday[iv][month],gauss,month/12.*yts);
++			input4->GetInputValue(&PrecipitationsLgm[iv][month],gauss,month/12.*yts);
++		}
++	}
++
++	/*Recover interpolation parameters at time t*/
++	this->parameters->FindParam(&TdiffTime,SurfaceforcingsTdiffEnum,time);
++	this->parameters->FindParam(&PfacTime,SurfaceforcingsPfacEnum,time);
++
++	/*Compute the temperature and precipitation*/
++	for(int iv=0;iv<NUMVERTICES;iv++){
++	  ComputeMungsmTemperaturePrecipitation(TdiffTime,PfacTime,
++					&PrecipitationsLgm[iv][0],&PrecipitationsPresentday[iv][0], 
++					&TemperaturesLgm[iv][0], &TemperaturesPresentday[iv][0], 
++					&monthlytemperatures[iv][0], &monthlyprec[iv][0]);
++	}
++
++	/*Update inputs*/ 
++	TransientInput* NewTemperatureInput = new TransientInput(SurfaceforcingsMonthlytemperaturesEnum);
++	TransientInput* NewPrecipitationInput = new TransientInput(SurfaceforcingsPrecipitationEnum);
++	for (int imonth=0;imonth<12;imonth++) {
++		for(i=0;i<NUMVERTICES;i++) tmp[i]=monthlytemperatures[i][imonth];
++		PentaInput* newmonthinput1 = new PentaInput(SurfaceforcingsMonthlytemperaturesEnum,&tmp[0],P1Enum);
++		NewTemperatureInput->AddTimeInput(newmonthinput1,time+imonth/12.*yts);
++	
++		for(i=0;i<NUMVERTICES;i++) tmp[i]=monthlyprec[i][imonth];
++		PentaInput* newmonthinput2 = new PentaInput(SurfaceforcingsPrecipitationEnum,&tmp[0],P1Enum);
++		NewPrecipitationInput->AddTimeInput(newmonthinput2,time+imonth/12.*yts);
++	}
++	NewTemperatureInput->Configure(this->parameters);
++	NewPrecipitationInput->Configure(this->parameters);
++
++	this->inputs->AddInput(NewTemperatureInput);
++	this->inputs->AddInput(NewPrecipitationInput);
++	
++	this->InputExtrude(SurfaceforcingsMonthlytemperaturesEnum,-1);
++	this->InputExtrude(SurfaceforcingsPrecipitationEnum,-1);
++
++	/*clean-up*/
++	delete gauss;
++}
+ /*}}}*/
+ void       Penta::ElementResponse(IssmDouble* presponse,int response_enum){/*{{{*/
+ 
+@@ -2081,32 +2146,30 @@
+ 
+ }
+ /*}}}*/
+-void       Penta::PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm){/*{{{*/
++void       Penta::PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm,bool ismungsm){/*{{{*/
+ 
++   int        i;
+    IssmDouble agd[NUMVERTICES];             // surface mass balance
+    IssmDouble monthlytemperatures[NUMVERTICES][12],monthlyprec[NUMVERTICES][12];
+-   IssmDouble TemperaturesPresentday[NUMVERTICES][12],TemperaturesLgm[NUMVERTICES][12];
+-   IssmDouble PrecipitationsPresentday[NUMVERTICES][12],PrecipitationsLgm[NUMVERTICES][12];
++   IssmDouble tmp[NUMVERTICES];
+    IssmDouble h[NUMVERTICES],s[NUMVERTICES];
+    IssmDouble rho_water,rho_ice,desfac,s0p,s0t,rlaps,rlapslgm;
+    IssmDouble PfacTime,TdiffTime,sealevTime;
+-   IssmDouble sconv; //rhow_rain/rhoi / 12 months
+ 
+    /*Get material parameters :*/
+    rho_water=matpar->GetMaterialParameter(MaterialsRhoSeawaterEnum);
+    rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
+-   //rho_ice=matpar->GetRhoIce();
+-   //rho_water=matpar->GetRhoFreshwater();
+ 
+-   sconv=(rho_water/rho_ice)/12.; //to convert monbthly prec in m of ice equivalent per month
++  /*Get some pdd parameters*/
++  desfac=matpar->GetMaterialParameter(SurfaceforcingsDesfacEnum);
++  s0p=matpar->GetMaterialParameter(SurfaceforcingsS0pEnum);
++  s0t=matpar->GetMaterialParameter(SurfaceforcingsS0tEnum);
++  rlaps=matpar->GetMaterialParameter(SurfaceforcingsRlapsEnum);
++  rlapslgm=matpar->GetMaterialParameter(SurfaceforcingsRlapslgmEnum);
+ 
+    /*Recover monthly temperatures and precipitation*/
+    Input*     input=inputs->GetInput(SurfaceforcingsMonthlytemperaturesEnum); _assert_(input);
+    Input*     input2=inputs->GetInput(SurfaceforcingsPrecipitationEnum); _assert_(input2);
+-   Input*     input3=inputs->GetInput(SurfaceforcingsTemperaturesPresentdayEnum);  _assert_(input3);
+-   Input*     input4=inputs->GetInput(SurfaceforcingsTemperaturesLgmEnum);   _assert_(input4);
+-   Input*     input5=inputs->GetInput(SurfaceforcingsPrecipitationsPresentdayEnum);  _assert_(input5);
+-   Input*     input6=inputs->GetInput(SurfaceforcingsPrecipitationsLgmEnum);   _assert_(input6);
+    GaussPenta* gauss=new GaussPenta();
+    IssmDouble time,yts;
+    this->parameters->FindParam(&time,TimeEnum);
+@@ -2118,50 +2181,61 @@
+        input->GetInputValue(&monthlytemperatures[iv][month],gauss,time+month/12.*yts);
+        monthlytemperatures[iv][month]=monthlytemperatures[iv][month]-273.15; // conversion from Kelvin to celcius
+        input2->GetInputValue(&monthlyprec[iv][month],gauss,time+month/12.*yts);
+-       monthlyprec[iv][month]=monthlyprec[iv][month]*sconv; // convertion to m/yr
+-       input3->GetInputValue(&TemperaturesPresentday[iv][month],gauss,month/12.*yts);
+-       TemperaturesPresentday[iv][month]=TemperaturesPresentday[iv][month]-273.15; // conversion from Kelvin to celcius
+-       input4->GetInputValue(&TemperaturesLgm[iv][month],gauss,month/12.*yts);
+-       TemperaturesLgm[iv][month]=TemperaturesLgm[iv][month]-273.15; // conversion from Kelvin to celcius
+-       input5->GetInputValue(&PrecipitationsPresentday[iv][month],gauss,month/12.*yts);
+-       PrecipitationsPresentday[iv][month]=PrecipitationsPresentday[iv][month]; 
+-       input6->GetInputValue(&PrecipitationsLgm[iv][month],gauss,month/12.*yts);
+-       PrecipitationsLgm[iv][month]=PrecipitationsLgm[iv][month];  
+      }
+    } 
+ 
+-  /*Recover Pfac, Tdiff and sealev at time t:*/
+-  this->parameters->FindParam(&PfacTime,SurfaceforcingsPfacEnum,time);
+-  this->parameters->FindParam(&TdiffTime,SurfaceforcingsTdiffEnum,time);
+-  this->parameters->FindParam(&sealevTime,SurfaceforcingsSealevEnum,time);
++  /*Recover Pfac, Tdiff and sealev at time t:
++    This parameters are used to interpolate the temperature 
++    and precipitaton between PD and LGM when ismungsm==1 */ 
++  if (ismungsm==1){  
++    this->parameters->FindParam(&TdiffTime,SurfaceforcingsTdiffEnum,time);
++    this->parameters->FindParam(&sealevTime,SurfaceforcingsSealevEnum,time);
++  }
++  else {
++    TdiffTime=0;
++    sealevTime=0;  
++  }
+ 
+   /*Recover info at the vertices: */
+   GetInputListOnVertices(&h[0],ThicknessEnum);
+   GetInputListOnVertices(&s[0],SurfaceEnum); 
+ 
+-  /*Get other pdd parameters*/
+-  desfac=matpar->GetMaterialParameter(SurfaceforcingsDesfacEnum);
+-  s0p=matpar->GetMaterialParameter(SurfaceforcingsS0pEnum);
+-  s0t=matpar->GetMaterialParameter(SurfaceforcingsS0tEnum);
+-  rlaps=matpar->GetMaterialParameter(SurfaceforcingsRlapsEnum);
+-  rlapslgm=matpar->GetMaterialParameter(SurfaceforcingsRlapslgmEnum);
+ 
+    /*measure the surface mass balance*/
+    for (int iv = 0; iv < NUMVERTICES; iv++){
+-     agd[iv]=PddSurfaceMassBlance(&monthlytemperatures[iv][0], &monthlyprec[iv][0],  
+-				  &TemperaturesLgm[iv][0], &TemperaturesPresentday[iv][0], 
+-				  &PrecipitationsLgm[iv][0], &PrecipitationsPresentday[iv][0], 
++     agd[iv]=PddSurfaceMassBalance(&monthlytemperatures[iv][0], &monthlyprec[iv][0],  
+ 				  pdds,pds, signorm, yts, h[iv], s[iv],
+-				  desfac, s0t, s0p,rlaps,rlapslgm,PfacTime,TdiffTime,sealevTime);
++				  desfac, s0t, s0p,rlaps,rlapslgm,TdiffTime,sealevTime,
++				  rho_water,rho_ice);
+    }
+ 
+    /*Update inputs*/    
++   // TransientInput* NewTemperatureInput = new TransientInput(SurfaceforcingsMonthlytemperaturesEnum);
++   // TransientInput* NewPrecipitationInput = new TransientInput(SurfaceforcingsPrecipitationEnum);
++   // for (int imonth=0;imonth<12;imonth++) {
++   //   for(i=0;i<NUMVERTICES;i++) tmp[i]=monthlytemperatures[i][imonth];
++   //   PentaInput* newmonthinput1 = new PentaInput(SurfaceforcingsMonthlytemperaturesEnum,&tmp[0],P1Enum);
++   //   NewTemperatureInput->AddTimeInput(newmonthinput1,time+imonth/12.*yts);
++   // 
++   //   for(i=0;i<NUMVERTICES;i++) tmp[i]=monthlyprec[i][imonth];
++   //   PentaInput* newmonthinput2 = new PentaInput(SurfaceforcingsPrecipitationEnum,&tmp[0],P1Enum);
++   //   NewPrecipitationInput->AddTimeInput(newmonthinput2,time+imonth/12.*yts);
++   // }
++   // NewTemperatureInput->Configure(this->parameters);
++   // NewPrecipitationInput->Configure(this->parameters);
++
++
++
+    this->inputs->AddInput(new PentaInput(SurfaceforcingsMassBalanceEnum,&agd[0],P1Enum));
+-   //this->inputs->AddInput(new PentaVertexInput(ThermalSpcTemperatureEnum,&Tsurf[0]));
+-   this->InputExtrude(SurfaceforcingsMassBalanceEnum,-1);
++   // this->inputs->AddInput(NewTemperatureInput);
++   // this->inputs->AddInput(NewPrecipitationInput);
++   // //this->inputs->AddInput(new PentaVertexInput(ThermalSpcTemperatureEnum,&Tsurf[0]));
++    this->InputExtrude(SurfaceforcingsMassBalanceEnum,-1);
++   // this->InputExtrude(SurfaceforcingsMonthlytemperaturesEnum,-1);
++   // this->InputExtrude(SurfaceforcingsPrecipitationEnum,-1);
+ 
+-	/*clean-up*/
+-	delete gauss;
++   /*clean-up*/
++   delete gauss;
+ }
+ /*}}}*/
+ void       Penta::PotentialUngrounding(Vector<IssmDouble>* potential_ungrounding){/*{{{*/
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18967)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18968)
+@@ -58,6 +58,7 @@
+ 		void           ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum);
+ 		ElementMatrix* CreateBasalMassMatrix(void);
+ 		void           Delta18oParameterization(void);
++		void           MungsmtpParameterization(void);
+ 		void           ElementResponse(IssmDouble* presponse,int response_enum);
+ 		void           ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz);
+ 		int            FiniteElement(void);
+@@ -136,7 +137,7 @@
+ 		int            NodalValue(IssmDouble* pvalue, int index, int natureofdataenum);
+ 		int            NumberofNodesPressure(void);
+ 		int            NumberofNodesVelocity(void);
+-		void           PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm);
++		void           PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm,bool ismungsm);
+ 		void           PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding);
+ 		int            PressureInterpolation();
+ 		void           ReduceMatrices(ElementMatrix* Ke,ElementVector* pe);
+Index: ../trunk-jpl/src/c/classes/Elements/Seg.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18967)
++++ ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18968)
+@@ -53,6 +53,7 @@
+ 		void        ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){_error_("not implemented yet");};
+ 		void        ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum){_error_("not implemented yet");};
+ 		void        Delta18oParameterization(void){_error_("not implemented yet");};
++		void        MungsmtpParameterization(void){_error_("not implemented yet");};
+ 		void        ElementResponse(IssmDouble* presponse,int response_enum){_error_("not implemented yet");};
+ 		void        ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz){_error_("not implemented yet");};
+ 		void        FSContactMigration(Vector<IssmDouble>* vertexgrounded,Vector<IssmDouble>* vertexfloating){_error_("not implemented yet");};
+@@ -128,7 +129,7 @@
+ 		void        NormalTop(IssmDouble* normal,IssmDouble* xyz_list){_error_("not implemented yet");};
+ 		int         NumberofNodesPressure(void){_error_("not implemented yet");};
+ 		int         NumberofNodesVelocity(void){_error_("not implemented yet");};
+-		void        PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm){_error_("not implemented yet");};
++		void        PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm,bool ismungsm){_error_("not implemented yet");};
+ 		void        PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding){_error_("not implemented yet");};
+ 		int         PressureInterpolation(void){_error_("not implemented yet");};
+ 		void        ReduceMatrices(ElementMatrix* Ke,ElementVector* pe){_error_("not implemented yet");};
+Index: ../trunk-jpl/src/c/classes/Elements/Tetra.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18967)
++++ ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18968)
+@@ -53,6 +53,7 @@
+ 		void        ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){_error_("not implemented yet");};
+ 		void        ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum){_error_("not implemented yet");};
+ 		void        Delta18oParameterization(void){_error_("not implemented yet");};
++		void        MungsmtpParameterization(void){_error_("not implemented yet");};
+ 		IssmDouble  DragCoefficientAbsGradient(void){_error_("not implemented yet");};
+ 		void        ElementResponse(IssmDouble* presponse,int response_enum){_error_("not implemented yet");};
+ 		void        ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz);
+@@ -134,7 +135,7 @@
+ 		void        NormalTop(IssmDouble* normal,IssmDouble* xyz_list);
+ 		int         NumberofNodesPressure(void);
+ 		int         NumberofNodesVelocity(void);
+-		void        PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm){_error_("not implemented yet");};
++		void        PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm,bool ismungsm){_error_("not implemented yet");};
+ 		void        PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding){_error_("not implemented yet");};
+ 		int         PressureInterpolation(void);
+ 		void        ResetFSBasalBoundaryCondition(void);
+Index: ../trunk-jpl/src/m/classes/SMBpdd.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBpdd.py	(revision 18967)
++++ ../trunk-jpl/src/m/classes/SMBpdd.py	(revision 18968)
+@@ -25,11 +25,13 @@
+ 		self.Tdiff                     = float('NaN')
+ 		self.sealev                    = float('NaN')
+ 		self.isdelta18o                = 0
++		self.ismungsm                  = 0
+ 		self.delta18o                  = float('NaN')
+ 		self.delta18o_surface          = float('NaN')
+ 		self.temperatures_presentday   = float('NaN')
+ 		self.temperatures_lgm          = float('NaN')
+ 		self.precipitations_presentday = float('NaN')
++		self.precipitations_lgm        = float('NaN')
+ 
+ 		#set defaults
+ 		self.setdefaultparameters()
+@@ -37,46 +39,63 @@
+ 	def __repr__(self): # {{{
+ 		string="   surface forcings parameters:"
+ 
+-		string="%s\n%s"%(string,fielddisplay(self,'precipitation','surface precipitation [m/yr water eq]'))
++		string="%s\n%s"%(string,fielddisplay(self,'isdelta18o','is temperature and precipitation delta18o parametrisation activated (0 or 1, default is 0)'))
++		string="%s\n%s"%(string,fielddisplay(self,'ismungsm','is temperature and precipitation mungsm parametrisation activated (0 or 1, default is 0)'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'desfac','desertification elevation factor (between 0 and 1, default is 0.5) [m]'))
+-		string="%s\n%s"%(string,fielddisplay(self,'isdelta18o','is temperature and precipitation delta18o parametrisation activated (0 or 1, default is 0)'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'s0p','should be set to elevation from precip source (between 0 and a few 1000s m, default is 0) [m]'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'s0t','should be set to elevation from temperature source (between 0 and a few 1000s m, default is 0) [m]'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'rlaps','present day lapse rate [degree/km]'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'rlapslgm','LGM lapse rate [degree/km]'))
+-		string="%s\n%s"%(string,fielddisplay(self,'Pfac','time interpolation parameter for precipitation, 1D (year)'))
+-		string="%s\n%s"%(string,fielddisplay(self,'Tdiff','time interpolation parameter for temperature, 1D (year)'))
+-		string="%s\n%s"%(string,fielddisplay(self,'sealev','sea level [m], 1D(year)'))
+-		string="%s\n%s"%(string,fielddisplay(self,'monthlytemperatures','monthly surface temperatures [K], required if pdd is activated and delta18o not activated'))
+-		string="%s\n%s"%(string,fielddisplay(self,'temperatures_presentday','monthly present day surface temperatures [K], required if pdd is activated and delta18o activated'))
+-		string="%s\n%s"%(string,fielddisplay(self,'temperatures_lgm','monthly LGM surface temperatures [K], required if pdd is activated and delta18o activated'))
+-		string="%s\n%s"%(string,fielddisplay(self,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if pdd is activated and delta18o activated'))
+-		string="%s\n%s"%(string,fielddisplay(self,'delta18o','delta18o, required if pdd is activated and delta18o activated'))
+-		string="%s\n%s"%(string,fielddisplay(self,'delta18o_surface','surface elevation of the delta18o site, required if pdd is activated and delta18o activated'))
+-
++		if not (self.isdelta18o and self.ismungsm):
++			string="%s\n%s"%(string,fielddisplay(self,'monthlytemperatures',['monthly surface temperatures [K], required if pdd is activated and delta18o not activated']))
++			string="%s\n%s"%(string,fielddisplay(self,'precipitation',['monthly surface precipitation [m/yr water eq], required if pdd is activated and delta18o or mungsm not activated']))
++			if self.isdelta18o:
++				string="%s\n%s"%(string,fielddisplay(self,'delta18o','delta18o, required if pdd is activated and delta18o activated'))
++				string="%s\n%s"%(string,fielddisplay(self,'delta18o_surface','surface elevation of the delta18o site, required if pdd is activated and delta18o activated'))
++				string="%s\n%s"%(string,fielddisplay(self,'temperatures_presentday','monthly present day surface temperatures [K], required if delta18o/mungsm is activated'))
++				string="%s\n%s"%(string,fielddisplay(self,'temperatures_lgm','monthly LGM surface temperatures [K], required if delta18o or mungsm is activated'))
++				string="%s\n%s"%(string,fielddisplay(self,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if delta18o or mungsm is activated'))
++				string="%s\n%s"%(string,fielddisplay(self,'precipitations_lgm','monthly surface precipitation [m/yr water eq], required if delta18o or mungsm is activated'))
++				string="%s\n%s"%(string,fielddisplay(self,'Tdiff','time interpolation parameter for temperature, 1D(year), required if mungsm is activated'))
++				string="%s\n%s"%(string,fielddisplay(self,'sealev','sea level [m], 1D(year), required if mungsm is activated'))
++			if self.ismungsm:
++				string="%s\n%s"%(string,fielddisplay(self,'temperatures_presentday','monthly present day surface temperatures [K], required if delta18o/mungsm is activated'))
++				string="%s\n%s"%(string,fielddisplay(self,'temperatures_lgm','monthly LGM surface temperatures [K], required if delta18o or mungsm is activated'))
++				string="%s\n%s"%(string,fielddisplay(self,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if delta18o or mungsm is activated'))
++				string="%s\n%s"%(string,fielddisplay(self,'precipitations_lgm','monthly surface precipitation [m/yr water eq], required if delta18o or mungsm is activated'))
++				string="%s\n%s"%(string,fielddisplay(self,'Pfac','time interpolation parameter for precipitation, 1D(year), required if mungsm is activated'))
++				string="%s\n%s"%(string,fielddisplay(self,'Tdiff','time interpolation parameter for temperature, 1D(year), required if mungsm is activated'))
++				string="%s\n%s"%(string,fielddisplay(self,'sealev','sea level [m], 1D(year), required if mungsm is activated'))
+ 		return string
+ 		#}}}
+ 	def extrude(self,md): # {{{
+ 
+-		self.precipitation=project3d(md,'vector',self.precipitation,'type','node');
+-		self.monthlytemperatures=project3d(md,'vector',self.monthlytemperatures,'type','node');
++		if not (self.isdelta18o and self.ismungsm):
++			self.precipitation=project3d(md,'vector',self.precipitation,'type','node')
++			self.monthlytemperatures=project3d(md,'vector',self.monthlytemperatures,'type','node')
+ 		if self.isdelta18o: self.temperatures_lgm=project3d(md,'vector',self.temperatures_lgm,'type','node')
+ 		if self.isdelta18o: self.temperatures_presentday=project3d(md,'vector',self.temperatures_presentday,'type','node')
+ 		if self.isdelta18o: self.precipitations_presentday=project3d(md,'vector',self.precipitations_presentday,'type','node')
++		if self.isdelta18o: self.precipitations_lgm=project3d(md,'vector',self.precipitations_lgm,'type','node')
++		if self.ismungsm: self.temperatures_lgm=project3d(md,'vector',self.temperatures_lgm,'type','node')
++		if self.ismungsm: self.temperatures_presentday=project3d(md,'vector',self.temperatures_presentday,'type','node')
++		if self.ismungsm: self.precipitations_presentday=project3d(md,'vector',self.precipitations_presentday,'type','node')
++		if self.ismungsm: self.precipitations_lgm=project3d(md,'vector',self.precipitations_lgm,'type','node')
+ 		return self
+ 	#}}}
+ 	def initialize(self,md): # {{{
+ 
+-		if numpy.all(numpy.isnan(self.precipitation)):
+-			self.precipitation=numpy.zeros((md.mesh.numberofvertices,1))
+-			print "      no SMBpdd.precipitation specified: values set as zero"
+-
+-		return self
++		# if numpy.all(numpy.isnan(self.precipitation)):
++		# 	self.precipitation=numpy.zeros((md.mesh.numberofvertices,1))
++		# 	print "      no SMBpdd.precipitation specified: values set as zero"
++		# 
++		# return self
+ 	#}}}
+ 	def setdefaultparameters(self): # {{{
+ 		  
+ 		#pdd method not used in default mode
+ 		self.isdelta18o = 0
++		self.ismungsm   = 0
+ 		self.desfac     = 0.5
+ 		self.s0p        = 0.
+ 		self.s0t        = 0.
+@@ -88,23 +107,32 @@
+ 	def checkconsistency(self,md,solution,analyses):    # {{{
+ 
+ 		if MasstransportAnalysisEnum() in analyses:
+-			md = checkfield(md,'fieldname','surfaceforcings.desfac','<=',1,'numel',[1]);
+-			md = checkfield(md,'fieldname','surfaceforcings.s0p','>=',0,'numel',[1]);
+-			md = checkfield(md,'fieldname','surfaceforcings.s0t','>=',0,'numel',[1]);
+-			md = checkfield(md,'fieldname','surfaceforcings.rlaps','>=',0,'numel',[1]);
+-			md = checkfield(md,'fieldname','surfaceforcings.rlapslgm','>=',0,'numel',[1]);
+-			md = checkfield(md,'fieldname','surfaceforcings.Pfac','NaN',1,'size',[2,numpy.nan]);
+-			md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1,'size',[2,numpy.nan]);
+-			md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1,'size',[2,numpy.nan]);
+-			if not self.isdelta18o:
+-				md = checkfield(md,'fieldname','surfaceforcings.monthlytemperatures','forcing',1,'NaN',1)
+-				md = checkfield(md,'fieldname','surfaceforcings.precipitation','forcing',1,'NaN',1)
+-			else:
++			md = checkfield(md,'fieldname','surfaceforcings.desfac','<=',1,'numel',[1])
++			md = checkfield(md,'fieldname','surfaceforcings.s0p','>=',0,'numel',[1])
++			md = checkfield(md,'fieldname','surfaceforcings.s0t','>=',0,'numel',[1])
++			md = checkfield(md,'fieldname','surfaceforcings.rlaps','>=',0,'numel',[1])
++			md = checkfield(md,'fieldname','surfaceforcings.rlapslgm','>=',0,'numel',[1])
++
++			if not (self.isdelta18o and self.ismungsm):
++				md = checkfield(md,'fieldname','surfaceforcings.monthlytemperatures','NaN',1)
++				md = checkfield(md,'fieldname','surfaceforcings.precipitation','NaN',1)
++			elif self.isdelta18o:
+ 				md = checkfield(md,'fieldname','surfaceforcings.delta18o','NaN',1)
+ 				md = checkfield(md,'fieldname','surfaceforcings.delta18o_surface','NaN',1)
+ 				md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1,12],'NaN',1)
+ 				md = checkfield(md,'fieldname','surfaceforcings.temperatures_lgm','size',[md.mesh.numberofvertices+1,12],'NaN',1)
+ 				md = checkfield(md,'fieldname','surfaceforcings.precipitations_presentday','size',[md.mesh.numberofvertices+1,12],'NaN',1)
++				md = checkfield(md,'fieldname','surfaceforcings.precipitations_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1)                                       
++				md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1,'size',[2,numpy.nan])
++				md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1,'size',[2,numpy.nan])
++			elif self.ismungsm:
++				md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1)
++				md = checkfield(md,'fieldname','surfaceforcings.temperatures_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1)
++				md = checkfield(md,'fieldname','surfaceforcings.precipitations_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1)
++				md = checkfield(md,'fieldname','surfaceforcings.precipitations_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1)                                       
++				md = checkfield(md,'fieldname','surfaceforcings.Pfac','NaN',1,'size',[2,numpy.nan])
++				md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1,'size',[2,numpy.nan])
++				md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1,'size',[2,numpy.nan])
+ 
+ 		return md
+ 	# }}}
+@@ -112,24 +140,34 @@
+ 
+ 		yts=365.0*24.0*3600.0
+ 
+-		WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBpddEnum(),'format','Integer');
++		WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBpddEnum(),'format','Integer')
+ 
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+ 		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','isdelta18o','format','Boolean')
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','desfac','format','Double');
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','s0p','format','Double');
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','s0t','format','Double');
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','rlaps','format','Double');
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','rlapslgm','format','Double');
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','Pfac','format','DoubleMat','mattype',1);
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1);
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1);
+-		if self.isdelta18o:
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','ismungsm','format','Boolean')
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','desfac','format','Double')
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','s0p','format','Double')
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','s0t','format','Double')
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','rlaps','format','Double')
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','rlapslgm','format','Double')
++
++		if not (self.isdelta18o and self.ismungsm):
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1)
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
++		elif self.isdelta18o:
+ 			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1)
+ 			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','temperatures_lgm','format','DoubleMat','mattype',1)
+ 			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitations_presentday','format','DoubleMat','mattype',1)
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitations_lgm','format','DoubleMat','mattype',1)
+ 			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','delta18o_surface','format','DoubleMat','mattype',1)
+ 			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','delta18o','format','DoubleMat','mattype',1)
+-		else:
+-			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1)
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1)			
++		elif self.ismungsm:
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1)
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','temperatures_lgm','format','DoubleMat','mattype',1)
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitations_presentday','format','DoubleMat','mattype',1)
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitations_lgm','format','DoubleMat','mattype',1)
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','Pfac','format','DoubleMat','mattype',1)
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1)
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1)
+ 	# }}}
+Index: ../trunk-jpl/src/m/classes/SMBpdd.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBpdd.m	(revision 18967)
++++ ../trunk-jpl/src/m/classes/SMBpdd.m	(revision 18968)
+@@ -16,6 +16,7 @@
+                 Tdiff                     = NaN;
+                 sealev                    = NaN;
+ 		isdelta18o                = 0;
++		ismungsm                  = 0;
+ 		delta18o                  = NaN;
+ 		delta18o_surface          = NaN;
+ 		temperatures_presentday   = NaN;
+@@ -33,27 +34,30 @@
+ 			end
+ 		end % }}}
+ 		function self = extrude(self,md) % {{{
+-
+-			self.precipitation=project3d(md,'vector',self.precipitation,'type','node');
+-			self.monthlytemperatures=project3d(md,'vector',self.monthlytemperatures,'type','node');
++			if(self.isdelta18o==0 & self.ismungsm==0),self.precipitation=project3d(md,'vector',self.precipitation,'type','node');end
++			if(self.isdelta18o==0 & self.ismungsm==0),self.monthlytemperatures=project3d(md,'vector',self.monthlytemperatures,'type','node');end
+ 			if(self.isdelta18o),self.temperatures_lgm=project3d(md,'vector',self.temperatures_lgm,'type','node');end
+ 			if(self.isdelta18o),self.temperatures_presentday=project3d(md,'vector',self.temperatures_presentday,'type','node');end
+ 			if(self.isdelta18o),self.precipitations_presentday=project3d(md,'vector',self.precipitations_presentday,'type','node');end
+ 			if(self.isdelta18o),self.precipitations_lgm=project3d(md,'vector',self.precipitations_lgm,'type','node');end
++			if(self.ismungsm),self.temperatures_lgm=project3d(md,'vector',self.temperatures_lgm,'type','node');end
++			if(self.ismungsm),self.temperatures_presentday=project3d(md,'vector',self.temperatures_presentday,'type','node');end
++			if(self.ismungsm),self.precipitations_presentday=project3d(md,'vector',self.precipitations_presentday,'type','node');end
++			if(self.ismungsm),self.precipitations_lgm=project3d(md,'vector',self.precipitations_lgm,'type','node');end
+ 
+-
+ 		end % }}}
+ 		function self = initialize(self,md) % {{{
++                    
++			% if isnan(self.precipitation),
++			% 	self.precipitation=zeros(md.mesh.numberofvertices,1);
++			% 	disp('      no SMBpdd.precipitation specified: values set as zero');
++			% end
+ 
+-			if isnan(self.precipitation),
+-				self.precipitation=zeros(md.mesh.numberofvertices,1);
+-				disp('      no SMBpdd.precipitation specified: values set as zero');
+-			end
+-
+ 		end % }}}
+ 		function obj = setdefaultparameters(obj) % {{{
+ 
+ 		  obj.isdelta18o = 0;
++		  obj.ismungsm   = 0;
+ 		  obj.desfac     = 0.5;
+ 		  obj.s0p        = 0;
+ 		  obj.s0t        = 0;
+@@ -69,44 +73,61 @@
+ 				md = checkfield(md,'fieldname','surfaceforcings.s0t','>=',0,'numel',1);
+ 				md = checkfield(md,'fieldname','surfaceforcings.rlaps','>=',0,'numel',1);
+ 				md = checkfield(md,'fieldname','surfaceforcings.rlapslgm','>=',0,'numel',1);
+-            md = checkfield(md,'fieldname','surfaceforcings.Pfac','NaN',1,'size',[2,NaN]);
+-            md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1,'size',[2,NaN]);
+-            md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1,'size',[2,NaN]);
+-				if(obj.isdelta18o==0)
+-					md = checkfield(md,'fieldname','surfaceforcings.monthlytemperatures','forcing',1,'NaN',1);
+-					md = checkfield(md,'fieldname','surfaceforcings.precipitation','forcing',1,'NaN',1);
+-				else
+-					md = checkfield(md,'fieldname','surfaceforcings.delta18o','NaN',1);
+-					md = checkfield(md,'fieldname','surfaceforcings.delta18o_surface','NaN',1);
+-					md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
+-					md = checkfield(md,'fieldname','surfaceforcings.temperatures_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1);
+-					md = checkfield(md,'fieldname','surfaceforcings.precipitations_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
+-					md = checkfield(md,'fieldname','surfaceforcings.precipitations_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1);
++				if(obj.isdelta18o==0 & obj.ismungsm==0)
++                                    md = checkfield(md,'fieldname','surfaceforcings.monthlytemperatures','forcing',1,'NaN',1);
++                                    md = checkfield(md,'fieldname','surfaceforcings.precipitation','forcing',1,'NaN',1);
++                                elseif(obj.isdelta18o==1) 
++                                    md = checkfield(md,'fieldname','surfaceforcings.delta18o','NaN',1);
++                                    md = checkfield(md,'fieldname','surfaceforcings.delta18o_surface','NaN',1);
++                                    md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
++                                    md = checkfield(md,'fieldname','surfaceforcings.temperatures_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1);
++                                    md = checkfield(md,'fieldname','surfaceforcings.precipitations_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
++                                    md = checkfield(md,'fieldname','surfaceforcings.precipitations_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1);                                       
++                                    md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1);
++                                    md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1);
++                                elseif(obj.ismungsm==1) 
++                                    md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
++                                    md = checkfield(md,'fieldname','surfaceforcings.temperatures_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1);
++                                    md = checkfield(md,'fieldname','surfaceforcings.precipitations_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
++                                    md = checkfield(md,'fieldname','surfaceforcings.precipitations_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1);                                       
++                                    md = checkfield(md,'fieldname','surfaceforcings.Pfac','NaN',1,'size',[2,NaN]);
++                                    md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1);
++                                    md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1);
+ 				end
+-			end
++                        end
+ 		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   surface forcings parameters:'));
+ 
+ 			disp(sprintf('\n   PDD and deltaO18 parameters:'));
+ 			fielddisplay(obj,'isdelta18o','is temperature and precipitation delta18o parametrisation activated (0 or 1, default is 0)');
++			fielddisplay(obj,'ismungsm','is temperature and precipitation mungsm parametrisation activated (0 or 1, default is 0)');
+ 			fielddisplay(obj,'desfac','desertification elevation factor (between 0 and 1, default is 0.5) [m]');
+ 			fielddisplay(obj,'s0p','should be set to elevation from precip source (between 0 and a few 1000s m, default is 0) [m]');
+ 			fielddisplay(obj,'s0t','should be set to elevation from temperature source (between 0 and a few 1000s m, default is 0) [m]');
+ 			fielddisplay(obj,'rlaps','present day lapse rate [degree/km]');
+ 			fielddisplay(obj,'rlapslgm','LGM lapse rate [degree/km]');
+-			fielddisplay(obj,'Pfac','time interpolation parameter for precipitation, 1D(year)');
+-			fielddisplay(obj,'Tdiff','time interpolation parameter for temperature, 1D(year)');
+-			fielddisplay(obj,'sealev','sea level [m], 1D(year)');
+-			fielddisplay(obj,'monthlytemperatures',['CURRENTLY NOT USED monthly surface temperatures [K], required if pdd is activated and delta18o not activated']);
+-			fielddisplay(obj,'precipitation',['CURRENTLY NOT USED monthly surface precipitation [m/yr water eq]']);
+-			fielddisplay(obj,'temperatures_presentday','monthly present day surface temperatures [K], required if pdd is activated and delta18o activated');
+-			fielddisplay(obj,'temperatures_lgm','monthly LGM surface temperatures [K], required if pdd is activated and delta18o activated');
+-			fielddisplay(obj,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if pdd is activated and delta18o activated');
+-			fielddisplay(obj,'precipitations_lgm','monthly surface precipitation [m/yr water eq], required if pdd is activated and delta18o activated');
+-			fielddisplay(obj,'delta18o','delta18o, required if pdd is activated and delta18o activated');
+-			fielddisplay(obj,'delta18o_surface','surface elevation of the delta18o site, required if pdd is activated and delta18o activated');
+-
++                        if(obj.isdelta18o==0 & obj.ismungsm==0)
++                            fielddisplay(obj,'monthlytemperatures',['monthly surface temperatures [K], required if pdd is activated and delta18o not activated']);
++                            fielddisplay(obj,'precipitation',['monthly surface precipitation [m/yr water eq], required if pdd is activated and delta18o or mungsm not activated']);
++                        elseif(obj.isdelta18o==1)
++                            fielddisplay(obj,'delta18o','delta18o, required if pdd is activated and delta18o activated');
++                            fielddisplay(obj,'delta18o_surface','surface elevation of the delta18o site, required if pdd is activated and delta18o activated');
++                            fielddisplay(obj,'temperatures_presentday','monthly present day surface temperatures [K], required if delta18o/mungsm is activated');
++                            fielddisplay(obj,'temperatures_lgm','monthly LGM surface temperatures [K], required if delta18o or mungsm is activated');
++                            fielddisplay(obj,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if delta18o or mungsm is activated');
++                            fielddisplay(obj,'precipitations_lgm','monthly surface precipitation [m/yr water eq], required if delta18o or mungsm is activated');
++                            fielddisplay(obj,'Tdiff','time interpolation parameter for temperature, 1D(year), required if mungsm is activated');
++                            fielddisplay(obj,'sealev','sea level [m], 1D(year), required if mungsm is activated');
++                        elseif(obj.ismungsm==1)
++                            fielddisplay(obj,'temperatures_presentday','monthly present day surface temperatures [K], required if delta18o/mungsm is activated');
++                            fielddisplay(obj,'temperatures_lgm','monthly LGM surface temperatures [K], required if delta18o or mungsm is activated');
++                            fielddisplay(obj,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if delta18o or mungsm is activated');
++                            fielddisplay(obj,'precipitations_lgm','monthly surface precipitation [m/yr water eq], required if delta18o or mungsm is activated');
++                            fielddisplay(obj,'Pfac','time interpolation parameter for precipitation, 1D(year), required if mungsm is activated');
++                            fielddisplay(obj,'Tdiff','time interpolation parameter for temperature, 1D(year), required if mungsm is activated');
++                            fielddisplay(obj,'sealev','sea level [m], 1D(year), required if mungsm is activated');
++                        end
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+ 
+@@ -114,25 +135,35 @@
+ 
+ 			WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBpddEnum(),'format','Integer');
+ 
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','isdelta18o','format','Boolean');
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','ismungsm','format','Boolean');
+ 			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','desfac','format','Double');
+ 			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','s0p','format','Double');
+ 			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','s0t','format','Double');
+ 			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','rlaps','format','Double');
+ 			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','rlapslgm','format','Double');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Pfac','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','isdelta18o','format','Boolean');
+-			if obj.isdelta18o
++
++                        if(obj.isdelta18o==0 & obj.ismungsm==0)
++                            %WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1);
++                            WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++                            WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
++			elseif obj.isdelta18o
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1);
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_lgm','format','DoubleMat','mattype',1);
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitations_presentday','format','DoubleMat','mattype',1);
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitations_lgm','format','DoubleMat','mattype',1);
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','delta18o_surface','format','DoubleMat','mattype',1);
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','delta18o','format','DoubleMat','mattype',1);
+-			else
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++                                WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1);
++                                WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1);
++			elseif obj.ismungsm
++				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_lgm','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitations_presentday','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitations_lgm','format','DoubleMat','mattype',1);
++                                WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Pfac','format','DoubleMat','mattype',1);
++                                WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1);
++                                WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1);
+ 			end
+ 		end % }}}
+ 	end
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18967)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18968)
+@@ -341,6 +341,7 @@
+ def SurfaceforcingsDelta18oEnum(): return StringToEnum("SurfaceforcingsDelta18o")[0]
+ def SurfaceforcingsDelta18oSurfaceEnum(): return StringToEnum("SurfaceforcingsDelta18oSurface")[0]
+ def SurfaceforcingsIsdelta18oEnum(): return StringToEnum("SurfaceforcingsIsdelta18o")[0]
++def SurfaceforcingsIsmungsmEnum(): return StringToEnum("SurfaceforcingsIsmungsm")[0]
+ def SurfaceforcingsPrecipitationsPresentdayEnum(): return StringToEnum("SurfaceforcingsPrecipitationsPresentday")[0]
+ def SurfaceforcingsPrecipitationsLgmEnum(): return StringToEnum("SurfaceforcingsPrecipitationsLgm")[0]
+ def SurfaceforcingsTemperaturesPresentdayEnum(): return StringToEnum("SurfaceforcingsTemperaturesPresentday")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18968-18969.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18968-18969.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18968-18969.diff	(revision 19102)
@@ -0,0 +1,68 @@
+Index: ../trunk-jpl/src/c/shared/Elements/ComputeMungsmTemperaturePrecipitation.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Elements/ComputeMungsmTemperaturePrecipitation.cpp	(revision 0)
++++ ../trunk-jpl/src/c/shared/Elements/ComputeMungsmTemperaturePrecipitation.cpp	(revision 18969)
+@@ -0,0 +1,31 @@
++/* file:  ComputeMungsmTemperaturePrecipitation.cpp
++   Compute the temperature and precipitation at time t from 
++   the data at present day and lgm.
++   The interpolation is done from some factors extracted from the MUNGSM
++ */
++
++#include "./elements.h"
++#include "../Numerics/numerics.h"
++
++void ComputeMungsmTemperaturePrecipitation(IssmDouble TdiffTime, IssmDouble PfacTime,
++					   IssmDouble* PrecipitationsLgm, IssmDouble* PrecipitationsPresentday,
++					   IssmDouble* TemperaturesLgm, IssmDouble* TemperaturesPresentday,
++					   IssmDouble* monthlytemperaturesout, IssmDouble* monthlyprecout){ 
++
++  IssmDouble monthlytemperaturestmp[12],monthlyprectmp[12];
++  IssmDouble tdiffh;  
++
++
++  for (int imonth = 0; imonth<12; imonth++){
++    tdiffh = TdiffTime*( TemperaturesLgm[imonth] - TemperaturesPresentday[imonth] );
++    monthlytemperaturestmp[imonth] = tdiffh + TemperaturesPresentday[imonth] ;
++
++    monthlyprectmp[imonth] =min(1.5, PrecipitationsPresentday[imonth] * pow(PrecipitationsLgm[imonth],PfacTime));   // [m/month]
++
++    /*Assign output pointer*/
++    *(monthlytemperaturesout+imonth) = monthlytemperaturestmp[imonth];
++    *(monthlyprecout+imonth) = monthlyprectmp[imonth];
++  }
++  // printf(" tempera %f\n",monthlytemperaturestmp[1]);
++}
++ 
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsPrecipitationsLgmEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsPrecipitationsLgmEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsPrecipitationsLgmEnum.m	(revision 18969)
+@@ -0,0 +1,11 @@
++function macro=SurfaceforcingsPrecipitationsLgmEnum()
++%SURFACEFORCINGSPRECIPITATIONSLGMENUM - Enum of SurfaceforcingsPrecipitationsLgm
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SurfaceforcingsPrecipitationsLgmEnum()
++
++macro=StringToEnum('SurfaceforcingsPrecipitationsLgm');
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsIsmungsmEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsIsmungsmEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsIsmungsmEnum.m	(revision 18969)
+@@ -0,0 +1,11 @@
++function macro=SurfaceforcingsIsmungsmEnum()
++%SURFACEFORCINGSISMUNGSMENUM - Enum of SurfaceforcingsIsmungsm
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=SurfaceforcingsIsmungsmEnum()
++
++macro=StringToEnum('SurfaceforcingsIsmungsm');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18969-18970.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18969-18970.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18969-18970.diff	(revision 19102)
@@ -0,0 +1,37 @@
+Index: ../trunk-jpl/src/m/classes/SMBpdd.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBpdd.py	(revision 18969)
++++ ../trunk-jpl/src/m/classes/SMBpdd.py	(revision 18970)
+@@ -89,10 +89,10 @@
+ 		# 	self.precipitation=numpy.zeros((md.mesh.numberofvertices,1))
+ 		# 	print "      no SMBpdd.precipitation specified: values set as zero"
+ 		# 
+-		# return self
++		 return self
+ 	#}}}
+ 	def setdefaultparameters(self): # {{{
+-		  
++
+ 		#pdd method not used in default mode
+ 		self.isdelta18o = 0
+ 		self.ismungsm   = 0
+@@ -122,14 +122,14 @@
+ 				md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1,12],'NaN',1)
+ 				md = checkfield(md,'fieldname','surfaceforcings.temperatures_lgm','size',[md.mesh.numberofvertices+1,12],'NaN',1)
+ 				md = checkfield(md,'fieldname','surfaceforcings.precipitations_presentday','size',[md.mesh.numberofvertices+1,12],'NaN',1)
+-				md = checkfield(md,'fieldname','surfaceforcings.precipitations_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1)                                       
++				md = checkfield(md,'fieldname','surfaceforcings.precipitations_lgm','size',[md.mesh.numberofvertices+1,12],'NaN',1)                                       
+ 				md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1,'size',[2,numpy.nan])
+ 				md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1,'size',[2,numpy.nan])
+ 			elif self.ismungsm:
+-				md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1)
+-				md = checkfield(md,'fieldname','surfaceforcings.temperatures_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1)
+-				md = checkfield(md,'fieldname','surfaceforcings.precipitations_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1)
+-				md = checkfield(md,'fieldname','surfaceforcings.precipitations_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1)                                       
++				md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1,12],'NaN',1)
++				md = checkfield(md,'fieldname','surfaceforcings.temperatures_lgm','size',[md.mesh.numberofvertices+1,12],'NaN',1)
++				md = checkfield(md,'fieldname','surfaceforcings.precipitations_presentday','size',[md.mesh.numberofvertices+1,12],'NaN',1)
++				md = checkfield(md,'fieldname','surfaceforcings.precipitations_lgm','size',[md.mesh.numberofvertices+1,12],'NaN',1)                                       
+ 				md = checkfield(md,'fieldname','surfaceforcings.Pfac','NaN',1,'size',[2,numpy.nan])
+ 				md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1,'size',[2,numpy.nan])
+ 				md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1,'size',[2,numpy.nan])
Index: /issm/oecreview/Archive/18296-19100/ISSM-18970-18971.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18970-18971.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18970-18971.diff	(revision 19102)
@@ -0,0 +1,28 @@
+Index: ../trunk-jpl/test/NightlyRun/test236.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test236.py	(revision 18970)
++++ ../trunk-jpl/test/NightlyRun/test236.py	(revision 18971)
+@@ -47,6 +47,7 @@
+ 
+ # creating precipitation
+ md.surfaceforcings.precipitations_presentday=numpy.zeros((md.mesh.numberofvertices+1,12))
++md.surfaceforcings.precipitations_lgm=numpy.zeros((md.mesh.numberofvertices+1,12))
+ for imonth in xrange(0,12):
+     md.surfaceforcings.precipitations_presentday[0:md.mesh.numberofvertices,imonth]=-0.4*10**(-6)*md.mesh.y+0.5
+     md.surfaceforcings.precipitations_presentday[md.mesh.numberofvertices,imonth]=((float(imonth)+1.)/12.)
+@@ -54,11 +55,11 @@
+     md.surfaceforcings.precipitations_lgm[md.mesh.numberofvertices,imonth]=((float(imonth)+1.)/12.)
+ 
+ # Interpolation factors
+-md.surfaceforcings.Tdiff[1,1:md.timestepping.final_time]=0.5;
+-md.surfaceforcings.sealev[1,1:md.timestepping.final_time]=0.5;
++md.surfaceforcings.Tdiff=0.5*numpy.ones((2,md.timestepping.final_time))
++md.surfaceforcings.sealev=0.5*numpy.ones((2,md.timestepping.final_time))
+ # Year of each data point
+-md.surfaceforcings.Tdiff[2,1:md.timestepping.final_time]=1:1:md.timestepping.final_time;
+-md.surfaceforcings.sealev[2,1:md.timestepping.final_time]=1:1:md.timestepping.final_time;
++md.surfaceforcings.Tdiff[1,1:md.timestepping.final_time]=numpy.arange(1.,md.timestepping.final_time)
++md.surfaceforcings.sealev[1,1:md.timestepping.final_time]=numpy.arange(1.,md.timestepping.final_time)
+ 
+ # time steps and resolution
+ md.timestepping.time_step=20.
Index: /issm/oecreview/Archive/18296-19100/ISSM-18971-18972.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18971-18972.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18971-18972.diff	(revision 19102)
@@ -0,0 +1,8 @@
+Index: ../trunk-jpl/test/Archives/Archive236.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/test/Archives/Archive237.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
Index: /issm/oecreview/Archive/18296-19100/ISSM-18972-18973.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18972-18973.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18972-18973.diff	(revision 19102)
@@ -0,0 +1,179 @@
+Index: ../trunk-jpl/test/NightlyRun/test332.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test332.py	(revision 0)
++++ ../trunk-jpl/test/NightlyRun/test332.py	(revision 18973)
+@@ -0,0 +1,46 @@
++import numpy
++from model import *
++from triangle import *
++from setmask import *
++from parameterize import *
++from transient import *
++from setflowequation import *
++from EnumDefinitions import *
++from solve import *
++from MatlabFuncs import *
++
++from generic import generic
++
++md=triangle(model(),'../Exp/Square.exp',100000.)
++md=setmask(md,'','')
++md=parameterize(md,'../Par/SquareSheetConstrained.py')
++
++md.transient=transient.setallnullparameters(md.transient)
++md.transient.ishydrology=True
++
++md=setflowequation(md,'SSA','all')
++md.cluster=generic('name',oshostname(),'np',1)
++md.hydrology=hydrologydc()
++md.hydrology=md.hydrology.initialize(md)
++
++md.hydrology.isefficientlayer=0
++md.hydrology.sedimentlimit_flag=1
++md.hydrology.sedimentlimit=8000.0
++md.initialization.sediment_head=numpy.zeros((md.mesh.numberofvertices,1))
++md.hydrology.spcsediment_head=float('NaN')*numpy.ones((md.mesh.numberofvertices,1))
++pos=numpy.nonzero(md.mesh.y==0.)[0]
++md.hydrology.spcsediment_head[pos]=0.0
++md.basalforcings.groundedice_melting_rate = 2.0*numpy.ones((md.mesh.numberofvertices,1))
++md.basalforcings.floatingice_melting_rate = 0.0*numpy.ones((md.mesh.numberofvertices,1))
++md.hydrology.sediment_transmitivity= 3.0*numpy.ones((md.mesh.numberofvertices,1))
++md.timestepping.time_step=0
++md.timestepping.final_time=1.0
++md=solve(md,HydrologySolutionEnum())
++
++#Fields and tolerances to track changes
++#you can also compare with an analitic solution, but it is exact
++#only if no limits are applied
++#analitic=(md.mesh.y.^2-2*md.mesh.y*1.0e6)*(-2.0/(2*md.constants.yts*md.hydrology.sediment_transmitivity))
++field_names     =['SedimentWaterHead','SedimentHeadResidual']
++field_tolerances=[1e-13, 3e-10]
++field_values=[md.results.HydrologySolution.SedimentHead,md.results.HydrologySolution.SedimentHeadResidual]
+Index: ../trunk-jpl/test/NightlyRun/test333.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test333.py	(revision 0)
++++ ../trunk-jpl/test/NightlyRun/test333.py	(revision 18973)
+@@ -0,0 +1,67 @@
++import numpy
++from model import *
++from triangle import *
++from setmask import *
++from parameterize import *
++from transient import *
++from setflowequation import *
++from EnumDefinitions import *
++from solve import *
++from MatlabFuncs import *
++
++from generic import generic
++
++md=triangle(model(),'../Exp/Square.exp',100000.)
++md=setmask(md,'','')
++md=parameterize(md,'../Par/SquareSheetConstrained.py')
++md.transient=transient.setallnullparameters(md.transient)
++md.transient.ishydrology=True
++md=setflowequation(md,'SSA','all')
++md.cluster=generic('name',oshostname(),'np',1)
++md.hydrology=hydrologydc()
++md.hydrology=md.hydrology.initialize(md)
++
++md.hydrology.isefficientlayer=1
++md.hydrology.sedimentlimit_flag=1
++md.hydrology.sedimentlimit=800.0
++md.initialization.sediment_head=numpy.zeros((md.mesh.numberofvertices,1))
++md.hydrology.spcsediment_head=float('NaN')*numpy.ones((md.mesh.numberofvertices,1))
++
++md.basalforcings.groundedice_melting_rate = 2.0*numpy.ones((md.mesh.numberofvertices,1))
++md.basalforcings.floatingice_melting_rate = 0.0*numpy.ones((md.mesh.numberofvertices,1))
++md.hydrology.sediment_transmitivity= 3.0*numpy.ones((md.mesh.numberofvertices,1))
++
++md.initialization.epl_head=numpy.zeros((md.mesh.numberofvertices,1))
++md.initialization.epl_thickness=numpy.ones((md.mesh.numberofvertices,1))
++md.hydrology.spcepl_head=float('NaN')*numpy.ones((md.mesh.numberofvertices,1))
++md.hydrology.mask_eplactive_node=numpy.zeros((md.mesh.numberofvertices,1))
++md.hydrology.epl_conductivity=30
++md.hydrology.epl_initial_thickness=1
++md.hydrology.epl_colapse_thickness=1.0e-3
++md.hydrology.epl_max_thickness=1
++md.timestepping.time_step=0.2
++md.timestepping.final_time=2.0
++
++md=solve(md,TransientSolutionEnum())
++
++field_names     =['SedimentWaterHead1','EplWaterHead1','SedimentHeadResidual1', \
++						'SedimentWaterHead4','EplWaterHead4','SedimentHeadResidual4', \
++						'SedimentWaterHead5','EplWaterHead5','SedimentHeadResidual5', \
++						'SedimentWaterHead9','EplWaterHead9','SedimentHeadResidual9']
++field_tolerances=[ \
++	1e-13, 1e-13, 1e-13, \
++	1e-13, 1e-13, 1e-13, \
++	1e-13, 5e-12, 8e-12, \
++	1e-13, 5e-12, 1e-11]
++field_values=[md.results.TransientSolution[0].SedimentHead, \
++							md.results.TransientSolution[0].EplHead, \
++							md.results.TransientSolution[0].SedimentHeadResidual, \
++							md.results.TransientSolution[3].SedimentHead, \
++							md.results.TransientSolution[3].EplHead, \
++							md.results.TransientSolution[3].SedimentHeadResidual, \
++							md.results.TransientSolution[4].SedimentHead, \
++							md.results.TransientSolution[4].EplHead, \
++							md.results.TransientSolution[4].SedimentHeadResidual, \
++							md.results.TransientSolution[8].SedimentHead, \
++							md.results.TransientSolution[8].EplHead, \
++							md.results.TransientSolution[8].SedimentHeadResidual]
+Index: ../trunk-jpl/test/NightlyRun/test3300.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3300.m	(revision 18972)
++++ ../trunk-jpl/test/NightlyRun/test3300.m	(revision 18973)
+@@ -21,32 +21,36 @@
+ md.hydrology.spcepl_head=NaN*ones(md.mesh.numberofvertices,1);
+ md.hydrology.mask_eplactive_node=0*ones(md.mesh.numberofvertices,1);
+ 
+-md.hydrology.epl_conductivity=1.5e-2;
++pos=find(md.mesh.y==0 & md.mesh.x<6.0e5 & md.mesh.x>4.0e5);
++md.hydrology.spcepl_head(pos)=0.0;
++
++
++md.hydrology.epl_conductivity=1000;
+ md.hydrology.epl_initial_thickness=1.0;
+-md.hydrology.epl_colapse_thickness=1.0e-6;
++md.hydrology.epl_colapse_thickness=1.0e-5;
+ md.hydrology.epl_max_thickness=5.0;
+ 
+ md.hydrology.transfer_flag=1.0;
+-md.hydrology.leakage_factor=3.9e-12;
++md.hydrology.leakage_factor=1.0e-1;
+ 
+-times=0:0.2:8.0;
++times=0:0.2:30.0;
+ md.basalforcings.groundedice_melting_rate=ones(md.mesh.numberofvertices+1,length(times));
+ 
+-for i=1:length(times)
+-	if(times(i)<=1.0)
+-		md.basalforcings.groundedice_melting_rate(:,i)=1.0;
+-	elseif(times(i)<=6.0)
+-		md.basalforcings.groundedice_melting_rate(:,i)=-0.2;
+-	else
+-		md.basalforcings.groundedice_melting_rate(:,i)=0.0;
+- end
+-end	
+-
++% for i=1:length(times)
++% 	if(times(i)<=1.0)
++% 		md.basalforcings.groundedice_melting_rate(:,i)=1.0;
++% 	elseif(times(i)<=6.0)
++% 		md.basalforcings.groundedice_melting_rate(:,i)=-0.2;
++% 	else
++% 		md.basalforcings.groundedice_melting_rate(:,i)=0.0;
++%  end
++% end	
++md.basalforcings.groundedice_melting_rate(:,:)=1.0;
+ md.basalforcings.groundedice_melting_rate(end,:)=times;
+ 
+ 
+ md.timestepping.time_step=0.2;
+-md.timestepping.final_time=8.0;
++md.timestepping.final_time=30.0;
+ 
+ md=solve(md,TransientSolutionEnum());
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18973-18974.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18973-18974.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18973-18974.diff	(revision 19102)
@@ -0,0 +1,56 @@
+Index: ../trunk-jpl/test/NightlyRun/test3300.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3300.m	(revision 18973)
++++ ../trunk-jpl/test/NightlyRun/test3300.m	(revision 18974)
+@@ -21,36 +21,32 @@
+ md.hydrology.spcepl_head=NaN*ones(md.mesh.numberofvertices,1);
+ md.hydrology.mask_eplactive_node=0*ones(md.mesh.numberofvertices,1);
+ 
+-pos=find(md.mesh.y==0 & md.mesh.x<6.0e5 & md.mesh.x>4.0e5);
+-md.hydrology.spcepl_head(pos)=0.0;
+-
+-
+-md.hydrology.epl_conductivity=1000;
++md.hydrology.epl_conductivity=1.5e-2;
+ md.hydrology.epl_initial_thickness=1.0;
+-md.hydrology.epl_colapse_thickness=1.0e-5;
++md.hydrology.epl_colapse_thickness=1.0e-6;
+ md.hydrology.epl_max_thickness=5.0;
+ 
+ md.hydrology.transfer_flag=1.0;
+-md.hydrology.leakage_factor=1.0e-1;
++md.hydrology.leakage_factor=3.9e-12;
+ 
+-times=0:0.2:30.0;
++times=0:0.2:8.0;
+ md.basalforcings.groundedice_melting_rate=ones(md.mesh.numberofvertices+1,length(times));
+ 
+-% for i=1:length(times)
+-% 	if(times(i)<=1.0)
+-% 		md.basalforcings.groundedice_melting_rate(:,i)=1.0;
+-% 	elseif(times(i)<=6.0)
+-% 		md.basalforcings.groundedice_melting_rate(:,i)=-0.2;
+-% 	else
+-% 		md.basalforcings.groundedice_melting_rate(:,i)=0.0;
+-%  end
+-% end	
+-md.basalforcings.groundedice_melting_rate(:,:)=1.0;
++for i=1:length(times)
++	if(times(i)<=1.0)
++		md.basalforcings.groundedice_melting_rate(:,i)=1.0;
++	elseif(times(i)<=6.0)
++		md.basalforcings.groundedice_melting_rate(:,i)=-0.2;
++	else
++		md.basalforcings.groundedice_melting_rate(:,i)=0.0;
++ end
++end	
++
+ md.basalforcings.groundedice_melting_rate(end,:)=times;
+ 
+ 
+ md.timestepping.time_step=0.2;
+-md.timestepping.final_time=30.0;
++md.timestepping.final_time=8.0;
+ 
+ md=solve(md,TransientSolutionEnum());
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18974-18975.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18974-18975.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18974-18975.diff	(revision 19102)
@@ -0,0 +1,412 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18974)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18975)
+@@ -23,19 +23,19 @@
+ 	/*Do we want an efficient layer*/
+ 	iomodel->Constant(&isefficientlayer,HydrologydcIsefficientlayerEnum);
+ 
++	/*If not return*/
+ 	if(!isefficientlayer) return;
++
++	/*If yes, initialize a flip flop counter*/
+ 	iomodel->FetchData(&eplflip_lock,HydrologydcEplflipLockEnum);
+- 
+ 	parameters->AddObject(new IntParam(HydrologydcEplflipLockEnum,eplflip_lock));
+ 	
+-	/*Nothing for now*/
+ }/*}}}*/
+ void HydrologyDCEfficientAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	bool   isefficientlayer;
+ 	int    hydrology_model;
+ 
+-
+ 	/*Now, do we really want DC?*/
+ 	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
+ 	if(hydrology_model!=HydrologydcEnum) return;
+@@ -60,9 +60,8 @@
+ 	iomodel->FetchDataToInput(elements,SedimentHeadEnum);
+ 	iomodel->FetchDataToInput(elements,HydrologydcEplInitialThicknessEnum);
+ 	iomodel->FetchDataToInput(elements,HydrologydcEplMaxThicknessEnum);
+-	iomodel->FetchDataToInput(elements,HydrologydcSedimentTransmitivityEnum);
+ 	iomodel->FetchDataToInput(elements,HydrologydcEplThicknessEnum);
+-	if(iomodel->domaintype!=Domain2DhorizontalEnum){
++		if(iomodel->domaintype!=Domain2DhorizontalEnum){
+ 		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum);
+ 		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
+ 	}
+@@ -84,6 +83,7 @@
+ 	::CreateNodes(nodes,iomodel,HydrologyDCEfficientAnalysisEnum,P1Enum);
+ 	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+ }/*}}}*/
++
+ void HydrologyDCEfficientAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+ 
+ 	/*Do we really want DC?*/
+@@ -97,8 +97,8 @@
+ 	if(!isefficientlayer) return;
+ 
+ 	IoModelToConstraintsx(constraints,iomodel,HydrologydcSpceplHeadEnum,HydrologyDCEfficientAnalysisEnum,P1Enum);
++}/*}}}*/
+ 
+-}/*}}}*/
+ void HydrologyDCEfficientAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+ 	/*Nothing for now*/
+ }/*}}}*/
+@@ -130,16 +130,16 @@
+ 	_error_("not implemented");
+ }/*}}}*/
+ 
+- ElementVector* HydrologyDCEfficientAnalysis::CreateDVector(Element* element){/*{{{*/
++ElementVector* HydrologyDCEfficientAnalysis::CreateDVector(Element* element){/*{{{*/
+ 	/*Default, return NULL*/
+ 	return NULL;
+ }/*}}}*/
+ 
+- ElementMatrix* HydrologyDCEfficientAnalysis::CreateJacobianMatrix(Element* element){/*{{{*/
++ElementMatrix* HydrologyDCEfficientAnalysis::CreateJacobianMatrix(Element* element){/*{{{*/
+ _error_("Not implemented");
+ }/*}}}*/
+ 
+- ElementMatrix* HydrologyDCEfficientAnalysis::CreateKMatrix(Element* element){/*{{{*/
++ElementMatrix* HydrologyDCEfficientAnalysis::CreateKMatrix(Element* element){/*{{{*/
+ 
+ 	/*Intermediaries*/
+ 	bool     active_element;
+@@ -243,8 +243,8 @@
+ 	delete gauss;
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 	return Ke;
++}/*}}}*/
+ 
+-}/*}}}*/
+ ElementVector* HydrologyDCEfficientAnalysis::CreatePVector(Element* element){/*{{{*/
+ 
+ 	/*Intermediaries*/
+@@ -347,12 +347,15 @@
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 	return pe;
+ }/*}}}*/
++
+ void HydrologyDCEfficientAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	element->GetSolutionFromInputsOneDof(solution,EplHeadEnum);
+ }/*}}}*/
++
+ void HydrologyDCEfficientAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
++
+ void HydrologyDCEfficientAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	bool active_element;
+@@ -375,7 +378,6 @@
+ 	/*Fetch number of nodes for this finite element*/
+ 	int numnodes = basalelement->GetNumberOfNodes();
+ 
+-
+ 	/*Fetch dof list and allocate solution vector*/
+ 	IssmDouble* sedhead     = xNew<IssmDouble>(numnodes);
+ 	IssmDouble* eplHeads    = xNew<IssmDouble>(numnodes);
+@@ -400,6 +402,7 @@
+ 	xDelete<int>(doflist);
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ } /*}}}*/
++
+ void HydrologyDCEfficientAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+@@ -414,6 +417,7 @@
+ 	IssmDouble water_compressibility = element->GetMaterialParameter(HydrologydcWaterCompressibilityEnum);
+ 	return rho_freshwater*g*epl_porosity*(water_compressibility+(epl_compressibility/epl_porosity));		 
+ }/*}}}*/
++
+ IssmDouble HydrologyDCEfficientAnalysis::SedimentStoring(Element* element){/*{{{*/
+ 	IssmDouble rho_freshwater           = element->GetMaterialParameter(MaterialsRhoFreshwaterEnum);
+ 	IssmDouble g                        = element->GetMaterialParameter(ConstantsGEnum);
+@@ -534,7 +538,7 @@
+ 		default:
+ 		_error_("not Implemented Yet");
+ 		}
+-			
++		
+ 		int         numnodes      = element->GetNumberOfNodes();
+ 		IssmDouble* thickness     = xNew<IssmDouble>(numnodes);
+ 		IssmDouble* eplhead       = xNew<IssmDouble>(numnodes);
+@@ -601,8 +605,8 @@
+ 		xDelete<IssmDouble>(ice_thickness);
+ 		xDelete<IssmDouble>(bed);
+ 	}
+-}
+-/*}}}*/
++}/*}}}*/
++
+ void HydrologyDCEfficientAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
+ 	 * For node i, Bi can be expressed in the actual coordinate system
+@@ -630,6 +634,7 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(dbasis);
+ }/*}}}*/
++
+ void  HydrologyDCEfficientAnalysis::HydrologyEPLGetMask(Vector<IssmDouble>* vec_mask, int* eplzigzag_counter, Element* element){
+ 
+ 	bool        active_element;
+@@ -654,7 +659,7 @@
+ 
+ 	/*Intermediaries*/
+ 
+-	int         penalty_lock;
++	int         eplflip_lock;
+ 	int         numnodes      =basalelement->GetNumberOfNodes();
+ 	IssmDouble* epl_thickness =xNew<IssmDouble>(numnodes);
+ 	IssmDouble* old_active    =xNew<IssmDouble>(numnodes);
+@@ -668,7 +673,7 @@
+ 	Input* active_element_input=basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input);
+ 	active_element_input->GetInputValue(&active_element);
+ 
+-	basalelement->parameters->FindParam(&penalty_lock,HydrologydcEplflipLockEnum); 
++	basalelement->parameters->FindParam(&eplflip_lock,HydrologydcEplflipLockEnum); 
+ 
+ 	basalelement-> GetInputListOnVertices(&old_active[0],HydrologydcMaskEplactiveNodeEnum);	
+ 	basalelement-> GetInputListOnVertices(&epl_thickness[0],HydrologydcEplThicknessEnum);	
+@@ -690,10 +695,11 @@
+ 		/*If mask was already one, keep one*/
+ 		else if(old_active[i]>0.){
+ 			vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+-			/*If epl thickness gets under 10-3 initial thickness, close the layer*/
++			/*If epl thickness gets under colapse thickness, close the layer*/
+ 			if(epl_thickness[i]<colapse_thick){
+ 				eplzigzag_counter[basalelement->nodes[i]->Lid()] ++;
+-				if(eplzigzag_counter[basalelement->nodes[i]->Lid()]<penalty_lock |penalty_lock==0){
++				/*Avoid flipfloping between open and closed states*/
++				if(eplzigzag_counter[basalelement->nodes[i]->Lid()]<eplflip_lock |eplflip_lock==0){
+ 					vec_mask->SetValue(basalelement->nodes[i]->Sid(),0.,INS_VAL);
+ 					epl_thickness[i]=init_thick;
+ 				}
+@@ -704,7 +710,6 @@
+ 		}
+ 		/*Increase of the efficient system is needed if the epl head reach the maximum value (sediment max value for now)*/
+ 		GetHydrologyDCInefficientHmax(&h_max,basalelement,basalelement->nodes[i]);
+-
+ 		if(eplhead[i]>=h_max && active_element){
+ 			for(j=0;j<numnodes;j++){
+ 				if(old_active[j]>0.){
+@@ -728,6 +733,7 @@
+ 	xDelete<IssmDouble>(residual);
+ }
+ /*}}}*/
++
+ void HydrologyDCEfficientAnalysis::HydrologyEPLGetActive(Vector<IssmDouble>* active_vec, Element* element){
+ 	/*Constants*/
+ 	int      domaintype;
+@@ -749,7 +755,8 @@
+ 	const int   numnodes = basalelement->GetNumberOfNodes();
+ 	IssmDouble  flag     = 0.;
+ 	IssmDouble* active   = xNew<IssmDouble>(numnodes);
+-		
++
++	/*Pass the activity mask from elements to nodes*/
+ 	basalelement->GetInputListOnVertices(&active[0],HydrologydcMaskEplactiveNodeEnum);
+ 	bool active_element;
+ 	Input* 	active_element_input=basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input);		
+@@ -757,11 +764,13 @@
+ 	
+ 	for(int i=0;i<numnodes;i++) flag+=active[i];
+ 
++	/*If any node is active all the node in the element are active*/
+ 	if(flag>0.){
+ 		for(int i=0;i<numnodes;i++){
+ 			active_vec->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+ 		}
+ 	}
++	/*If the element is active all its nodes are active*/
+ 	else if(active_element){
+ 		for(int i=0;i<numnodes;i++){
+ 			active_vec->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18974)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 18975)
+@@ -9,6 +9,7 @@
+ int  HydrologyDCInefficientAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+ 	return 1;
+ }/*}}}*/
++
+ void HydrologyDCInefficientAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+ 
+ 	int         hydrology_model;
+@@ -16,7 +17,6 @@
+ 	int         transfer_flag;
+ 	int         penalty_lock;
+ 	int         hydro_maxiter;
+-	/* int*        elementactive_counter =NULL; */
+ 	bool        isefficientlayer;
+ 	IssmDouble  sedimentlimit;
+ 	IssmDouble  penalty_factor;
+@@ -55,8 +55,8 @@
+ 	parameters->AddObject(new DoubleParam(HydrologydcRelTolEnum,rel_tol));
+ 	parameters->AddObject(new IntParam(HydrologydcPenaltyLockEnum,penalty_lock));
+ 	parameters->AddObject(new IntParam(HydrologydcMaxIterEnum,hydro_maxiter));
+-	
+ }/*}}}*/
++
+ void HydrologyDCInefficientAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+ 
+ 	bool   isefficientlayer;
+@@ -96,21 +96,9 @@
+ 
+ 	if(isefficientlayer){
+ 		iomodel->FetchDataToInput(elements,HydrologydcMaskEplactiveNodeEnum);
+-
+-		/* for(int i=0;i<elements->Size();i++){ */
+-		/* 	Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); */
+-		/* 	Input* node_mask_input = element->GetInput(HydrologydcMaskEplactiveNodeEnum); _assert_(node_mask_input); */
+-			
+-		/* 	if(node_mask_input->Max()>0.) { */
+-		/* 		element_active = true; */
+-		/* 	} */
+-		/* 	else{ */
+-		/* 		element_active = false; */
+-		/* 	} */
+-		/* 	element->AddInput(new BoolInput(HydrologydcMaskEplactiveEltEnum,element_active)); */
+-		/* } */
+ 	}
+ }/*}}}*/
++
+ void HydrologyDCInefficientAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+ 
+ 	/*Fetch parameters: */
+@@ -124,6 +112,7 @@
+ 	::CreateNodes(nodes,iomodel,HydrologyDCInefficientAnalysisEnum,P1Enum);
+ 	iomodel->DeleteData(2,MeshVertexonbaseEnum,MeshVertexonsurfaceEnum);
+ }/*}}}*/
++
+ void HydrologyDCInefficientAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+ 
+ 	/*retrieve some parameters: */
+@@ -133,6 +122,7 @@
+ 
+ 	IoModelToConstraintsx(constraints,iomodel,HydrologydcSpcsedimentHeadEnum,HydrologyDCInefficientAnalysisEnum,P1Enum);
+ }/*}}}*/
++
+ void HydrologyDCInefficientAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+ 
+ 	/*Fetch parameters: */
+@@ -164,13 +154,16 @@
+ void           HydrologyDCInefficientAnalysis::Core(FemModel* femmodel){/*{{{*/
+ 	_error_("not implemented");
+ }/*}}}*/
++
+ ElementVector* HydrologyDCInefficientAnalysis::CreateDVector(Element* element){/*{{{*/
+ 	/*Default, return NULL*/
+ 	return NULL;
+ }/*}}}*/
++
+ ElementMatrix* HydrologyDCInefficientAnalysis::CreateJacobianMatrix(Element* element){/*{{{*/
+ _error_("Not implemented");
+ }/*}}}*/
++
+ ElementMatrix* HydrologyDCInefficientAnalysis::CreateKMatrix(Element* element){/*{{{*/
+ 
+ 	/*Intermediaries*/
+@@ -274,6 +267,7 @@
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 	return Ke;
+ }/*}}}*/
++
+ ElementVector* HydrologyDCInefficientAnalysis::CreatePVector(Element* element){/*{{{*/
+ 
+ 	/*Intermediaries*/
+@@ -311,7 +305,6 @@
+ 	ElementVector* pe    = basalelement->NewElementVector();
+ 	IssmDouble*    basis = xNew<IssmDouble>(numnodes);
+ 
+-
+ 	/*Retrieve all inputs and parameters*/
+ 	basalelement->GetVerticesCoordinates(&xyz_list);
+ 	basalelement->FindParam(&dt,TimesteppingTimeStepEnum);
+@@ -341,9 +334,7 @@
+ 
+ 		/*Loading term*/
+ 		water_input->GetInputValue(&water_load,gauss);
+-
+ 		scalar = Jdet*gauss->weight*(water_load);
+-
+ 		if(dt!=0.) scalar = scalar*dt;
+ 		for(int i=0;i<numnodes;i++){
+ 			pe->values[i]+=scalar*basis[i];
+@@ -377,6 +368,7 @@
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ 	return pe;
+ }/*}}}*/
++
+ void HydrologyDCInefficientAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+ 	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
+ 	 * For node i, Bi can be expressed in the actual coordinate system
+@@ -404,12 +396,15 @@
+ 	/*Clean-up*/
+ 	xDelete<IssmDouble>(dbasis);
+ }/*}}}*/
++
+ void HydrologyDCInefficientAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+ 	element->GetSolutionFromInputsOneDof(solution,SedimentHeadEnum);
+ }/*}}}*/
++
+ void HydrologyDCInefficientAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+ 	_error_("Not implemented yet");
+ }/*}}}*/
++
+ void HydrologyDCInefficientAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+ 
+ 	int        domaintype;
+@@ -488,6 +483,7 @@
+ 	xDelete<int>(doflist);
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ }/*}}}*/
++
+ void HydrologyDCInefficientAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+ 	/*Default, do nothing*/
+ 	return;
+@@ -550,6 +546,7 @@
+ 	}
+ 	return h_max;
+ }/*}}}*/
++
+ void  HydrologyDCInefficientAnalysis::GetHydrologyDCInefficientHmax(IssmDouble* ph_max,Element* element, Node* innode){/*{{{*/
+ 	
+ 	int        hmax_flag;
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp	(revision 18974)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp	(revision 18975)
+@@ -126,14 +126,6 @@
+ 			}
+ 		
+ 			/*}}}*//*End of the sediment penalization loop*/
+-			/*Update EPL mask*/
+-			
+-			/*++++++This is probably useless+++++++*/
+-			/* if(isefficientlayer){ */
+-			/* 	inefanalysis->ElementizeEplMask(femmodel); */
+-			/* } */
+-			/*+++++++++++++*/
+-
+ 			sedconverged=false;
+ 			
+ 			/*Checking convegence on the value of the sediment head*/
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18974)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 18975)
+@@ -1978,10 +1978,5 @@
+ 	ISSM_MPI_Bcast(&sum_counter,1,ISSM_MPI_INT,0,IssmComm::GetComm());                
+ 	counter=sum_counter;
+ 	if(VerboseSolution()) _printf0_("   Number of active nodes L2 Projection: "<< counter <<"\n");
+-
+-	/*+++++++this is done in the solution sequence+++++++++++++++*/
+-	/*Update dof indexings*/
+-	//	this->UpdateConstraintsx();
+-	/*++++++++++++++++++++++++++*/
+ }
+ /*}}}*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18975-18976.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18975-18976.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18975-18976.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18975)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18976)
+@@ -1582,7 +1582,7 @@
+ 	int domaintype;
+ 	parameters->FindParam(&domaintype,DomainTypeEnum);
+ 
+-	if(IsIcefront()){
++	if(false && IsIcefront()){
+ 		area_base=this->GetAreaIce();
+ 		//Assumption: linear ice thickness profile on element. 
+ 		//Hence ice thickness at intersection of levelset function with triangle edge is linear interpolation of ice thickness at vertices.
Index: /issm/oecreview/Archive/18296-19100/ISSM-18976-18977.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18976-18977.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18976-18977.diff	(revision 19102)
@@ -0,0 +1,175 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh	(revision 18976)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh	(revision 18977)
+@@ -1,64 +0,0 @@
+-#!/bin/bash
+-set -eu
+-
+-#Some cleanup
+-rm -rf install petsc-3.5.2 src
+-mkdir install src
+-
+-#Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
+-
+-#Untar and move petsc to install directory
+-tar -zxvf  petsc-3.5.2.tar.gz
+-mv petsc-3.5.2/* src/
+-rm -rf petsc-3.5.2
+-
+-#configure
+-cd src
+-./config/configure.py \
+-  --prefix="$ISSM_DIR/externalpackages/petsc/install" \
+-  --PETSC_ARCH="$ISSM_ARCH" \
+-  --PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
+-  --with-batch=1  \
+-  --with-debugging=0 \
+-  --with-x=0 \
+-  --with-ssl=0 \
+-  --with-shared-libraries=1 \
+-  --known-mpi-shared-libraries=1 \
+-  --with-mpi=1 \
+-  --with-mpi-lib="/nasa/sgi/mpt/2.06rp16/lib/libmpi.so" \
+-  --with-mpi-include="/nasa/sgi/mpt/2.06rp16/include" \
+-  --with-blas-lapack-dir="/nasa/intel/Compiler/2012.0.032/composer_xe_2011_sp1/mkl/lib/intel64" \
+-  --download-scalapack=yes \
+-  --download-mumps=yes \
+-  --download-metis=yes \
+-  --download-parmetis=yes \
+-  --download-trilinos=yes \
+-  --download-euclid=yes \
+-  --download-hypre=yes \
+-  --COPTFLAGS="-lmpi -O3" \
+-  --FOPTFLAGS="-lmpi -O3" \
+-  --CXXOPTFLAGS="-lmpi -O3"
+-
+-#prepare script to reconfigure petsc
+-cat > script.queue << EOF
+-#PBS -S /bin/bash
+-#PBS -l select=1:ncpus=1:model=wes 
+-#PBS -l walltime=200 
+-#PBS -W group_list=s1010
+-#PBS -m e 
+-
+-. /usr/share/modules/init/bash 
+-module load comp-intel/2012.0.032
+-module load math/intel_mkl_64_10.0.011
+-module load mpi-sgi/mpt.2.06rp16
+-
+-export PATH="$PATH:." 
+-export MPI_GROUP_MAX=64 
+-mpiexec -np 1 ./conftest-linux-gnu-ia64-intel.py
+-EOF
+-
+-#print instructions
+-echo "== Now: cd src/ "
+-echo "== qsub -q devel script.queue "
+-echo "== Then run reconfigure script generated by PETSc and follow instructions"
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2015.0.090-mpt.2.11r13.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2015.0.090-mpt.2.11r13.sh	(revision 18976)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2015.0.090-mpt.2.11r13.sh	(revision 18977)
+@@ -1,60 +0,0 @@
+-#!/bin/bash
+-set -eu
+-
+-#Some cleanup
+-rm -rf install petsc-3.5.2 src
+-mkdir install src
+-
+-#Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
+-
+-#Untar and move petsc to install directory
+-tar -zxvf  petsc-3.5.2.tar.gz
+-mv petsc-3.5.2/* src/
+-rm -rf petsc-3.5.2
+-
+-#configure
+-cd src
+-./config/configure.py \
+-	--prefix="$ISSM_DIR/externalpackages/petsc/install" \
+-	--PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
+-	--with-blas-lapack-dir="/nasa/intel/Compiler/2015.0.090/composer_xe_2015.0.090/mkl/" \
+-	--with-mpi-lib="/nasa/sgi/mpt/2.11r13/lib/libmpi.so" \
+-	--with-mpi-include="/nasa/sgi/mpt/2.11r13/include" \
+-	--known-mpi-shared-libraries=1 \
+-	--with-debugging=0 \
+-	--with-valgrind=0 \
+-	--with-x=0 \
+-	--with-ssl=0 \
+-	--with-batch=1  \
+-	--with-shared-libraries=1 \
+-	--download-metis=1 \
+-	--download-parmetis=1 \
+-	--download-mumps=1 \
+-	--download-scalapack=1 \
+-	--download-fblaslapack=1 \
+-	--COPTFLAGS="-lmpi -O3" \
+-	--FOPTFLAGS="-lmpi -O3" \
+-	--CXXOPTFLAGS="-lmpi -O3"
+-
+-#prepare script to reconfigure petsc
+-cat > script.queue << EOF
+-#PBS -S /bin/bash
+-#PBS -l select=1:ncpus=1:model=wes 
+-#PBS -l walltime=200 
+-#PBS -W group_list=s1010
+-#PBS -m e 
+-
+-. /usr/share/modules/init/bash 
+-module load comp-intel/2015.0.090
+-module load mpi-sgi/mpt.2.11r13
+-
+-export PATH="$PATH:." 
+-export MPI_GROUP_MAX=64 
+-mpiexec -np 1 ./conftest-arch-linux2-c-opt
+-EOF
+-
+-#print instructions
+-echo "== Now: cd src/ "
+-echo "== qsub -q devel script.queue "
+-echo "== Then run reconfigure script generated by PETSc and follow instructions"
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh	(revision 18976)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh	(revision 18977)
+@@ -18,9 +18,9 @@
+ ./config/configure.py \
+ 	--prefix="$ISSM_DIR/externalpackages/petsc/install" \
+ 	--PETSC_DIR="$ISSM_DIR/externalpackages/petsc/src" \
+-	--with-blas-lapack-dir="/nasa/intel/mkl/10.0.011/" \
+-	--with-mpi-lib="/nasa/sgi/mpt/2.06rp16/lib/libmpi.so" \
+-	--with-mpi-include="/nasa/sgi/mpt/2.06rp16/include" \
++	--with-blas-lapack-dir="/nasa/intel/Compiler/2015.0.090/composer_xe_2015.0.090/mkl/" \
++	--with-mpi-lib="/nasa/sgi/mpt/2.11r13/lib/libmpi.so" \
++	--with-mpi-include="/nasa/sgi/mpt/2.11r13/include" \
+ 	--known-mpi-shared-libraries=1 \
+ 	--with-debugging=0 \
+ 	--with-valgrind=0 \
+@@ -32,10 +32,7 @@
+ 	--download-parmetis=1 \
+ 	--download-mumps=1 \
+ 	--download-scalapack=1 \
+-	--download-fblaslapack=1 \
+-	--COPTFLAGS="-lmpi -O3" \
+-	--FOPTFLAGS="-lmpi -O3" \
+-	--CXXOPTFLAGS="-lmpi -O3"
++	--download-fblaslapack=1
+ 
+ #prepare script to reconfigure petsc
+ cat > script.queue << EOF
+@@ -46,9 +43,8 @@
+ #PBS -m e 
+ 
+ . /usr/share/modules/init/bash 
+-module load comp-intel/11.1.046
+-module load math/intel_mkl_64_10.0.011
+-module load mpi-sgi/mpt.2.06rp16
++module load comp-intel/2015.0.090
++module load mpi-sgi/mpt.2.11r13
+ 
+ export PATH="$PATH:." 
+ export MPI_GROUP_MAX=64 
Index: /issm/oecreview/Archive/18296-19100/ISSM-18977-18978.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18977-18978.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18977-18978.diff	(revision 19102)
@@ -0,0 +1,94 @@
+Index: ../trunk-jpl/externalpackages/gslib/install.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/gslib/install.sh	(revision 18977)
++++ ../trunk-jpl/externalpackages/gslib/install.sh	(revision 18978)
+@@ -17,8 +17,8 @@
+ 
+ #Change compiler to gfortran
+ cd install
+-cat Makefile | sed -e "s/FC=g95/FC=gfortran/g" > Makefile.bak
++cat Makefile | sed -e "s/FC=g95/FC=ifort/g" > Makefile.bak
+ mv Makefile.bak Makefile
+-cat gslib/Makefile | sed -e "s/FC=g95/FC=gfortran/g" > Makefile.bak
++cat gslib/Makefile | sed -e "s/FC=g95/FC=ifort/g" > Makefile.bak
+ mv Makefile.bak gslib/Makefile
+ make 
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18977)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp	(revision 18978)
+@@ -43,10 +43,10 @@
+ 		for(int j=0; j<ncols; j++) {
+ 			_assert_(cols[j]==cols2[j]);
+ 			d = max(max(-vals[j],-vals2[j]),0.);
+-			MatSetValue(D,row,cols[j],(const double)d,INSERT_VALUES);
++			MatSetValue(D,row,cols[j],d,INSERT_VALUES);
+ 			if(cols[j]!=row) diagD -= d;
+ 		}
+-		MatSetValue(D,row,row,(const double)diagD,INSERT_VALUES);
++		MatSetValue(D,row,row,diagD,INSERT_VALUES);
+ 		MatRestoreRow(K       ,row,&ncols, (const int**)&cols, (const double**)&vals);
+ 		MatRestoreRow(K_transp,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+ 	}
+@@ -87,7 +87,7 @@
+ 				d += mi;
+ 			}
+ 			if(fabs(d)>dmax) dmax = fabs(d);
+-			MatSetValue(LHS,row,cols[j],(const double)d,INSERT_VALUES);
++			MatSetValue(LHS,row,cols[j],d,INSERT_VALUES);
+ 		}
+ 		MatRestoreRow(K,row,&ncols, (const int**)&cols, (const double**)&vals);
+ 		MatRestoreRow(D,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+@@ -106,7 +106,7 @@
+ 		if(constraint->InAnalysis(configuration_type)){
+ 			constraint->PenaltyDofAndValue(&dof,&d,femmodel->nodes,femmodel->parameters);
+ 			if(dof!=-1){
+-				MatSetValue(LHS,dof,dof,(const double)dmax,INSERT_VALUES);
++				MatSetValue(LHS,dof,dof,dmax,INSERT_VALUES);
+ 			}
+ 		}
+ 	}
+@@ -255,10 +255,10 @@
+ 		_assert_(Qi_minus <= 0.);
+ 		d = 1.;
+ 		if(Pi_plus!=0.) d = min(1.,Qi_plus/Pi_plus);
+-		VecSetValue(Ri_plus,row,(const double)d,INSERT_VALUES);
++		VecSetValue(Ri_plus,row,d,INSERT_VALUES);
+ 		d = 1.;
+ 		if(Pi_minus!=0.) d = min(1.,Qi_minus/Pi_minus);
+-		VecSetValue(Ri_minus,row,(const double)d,INSERT_VALUES);
++		VecSetValue(Ri_minus,row,d,INSERT_VALUES);
+ 
+ 		MatRestoreRow(Mc,row,&ncols, (const int**)&cols, (const double**)&vals);
+ 		MatRestoreRow(D ,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+@@ -310,7 +310,7 @@
+ 				d += min(Ri_minus[row],Ri_plus[cols[j]]) * f_ij;
+ 			}
+ 		}
+-		VecSetValue(Fbar,row,(const double)d,INSERT_VALUES);
++		VecSetValue(Fbar,row,d,INSERT_VALUES);
+ 		MatRestoreRow(Mc,row,&ncols, (const int**)&cols, (const double**)&vals);
+ 		MatRestoreRow(D ,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
+ 	}
+Index: ../trunk-jpl/configs/config-linux64-pleiades-intel2015.0.090-mpt.2.11r13.sh
+===================================================================
+--- ../trunk-jpl/configs/config-linux64-pleiades-intel2015.0.090-mpt.2.11r13.sh	(revision 18977)
++++ ../trunk-jpl/configs/config-linux64-pleiades-intel2015.0.090-mpt.2.11r13.sh	(revision 18978)
+@@ -2,7 +2,7 @@
+ ./configure \
+ 	--prefix=$ISSM_DIR \
+ 	--without-kriging \
+-	--with-matlab-dir="$ISSM_DIR/externalpackages/matlab/install" \
++	--with-wrappers=no \
+ 	--with-petsc-dir="$ISSM_DIR/externalpackages/petsc/install" \
+ 	--with-triangle-dir="$ISSM_DIR/externalpackages/triangle/install" \
+ 	--with-mpi-include="/nasa/sgi/mpt/2.11r13/include" \
+@@ -11,7 +11,5 @@
+ 	--with-metis-dir="$ISSM_DIR/externalpackages/petsc/install" \
+ 	--with-mumps-dir="$ISSM_DIR/externalpackages/petsc/install" \
+ 	--with-scalapack-dir="$ISSM_DIR/externalpackages/petsc/install" \
+-	--with-hypre-dir="$ISSM_DIR/externalpackages/petsc/install" \
+-	--with-graphics-lib="/usr/lib64/libX11.so" \
+-	--with-cxxoptflags="-g -O2" \
++	--with-cxxoptflags="-O3 -axAVX" \
+ 	--with-vendor="intel-pleiades"
Index: /issm/oecreview/Archive/18296-19100/ISSM-18978-18979.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18978-18979.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18978-18979.diff	(revision 19102)
@@ -0,0 +1,27 @@
+Index: ../trunk-jpl/src/m/classes/clusters/pfe.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/pfe.m	(revision 18978)
++++ ../trunk-jpl/src/m/classes/clusters/pfe.m	(revision 18979)
+@@ -128,9 +128,8 @@
+ 			 fprintf(fid,'#PBS -o %s.outlog \n',[cluster.executionpath '/' dirname '/' modelname]);
+ 			 fprintf(fid,'#PBS -e %s.errlog \n\n',[cluster.executionpath '/' dirname '/' modelname]);
+ 			 fprintf(fid,'. /usr/share/modules/init/bash\n\n');
+-			 fprintf(fid,'module load comp-intel/11.1.046\n');
+-			 fprintf(fid,'module load math/intel_mkl_64_10.0.011\n');
+-			 fprintf(fid,'module load mpi-sgi/mpt.2.06rp16\n');
++			 fprintf(fid,'module load comp-intel/2015.0.090\n');
++			 fprintf(fid,'module load mpi-sgi/mpt.2.11r13\n');
+ 			 fprintf(fid,'export PATH="$PATH:."\n\n');
+ 			 fprintf(fid,'export MPI_GROUP_MAX=64\n\n');
+ 			 fprintf(fid,'export ISSM_DIR="%s/../"\n',cluster.codepath); %FIXME
+@@ -183,8 +182,8 @@
+ 			 fprintf(fid,'#PBS -o %s.outlog \n',modelname);
+ 			 fprintf(fid,'#PBS -e %s.errlog \n\n',modelname);
+ 			 fprintf(fid,'. /usr/share/modules/init/bash\n\n');
+-			 fprintf(fid,'module load comp-intel/2013.1.117\n');
+-			 fprintf(fid,'module load mpi-sgi/mpt.2.06rp16\n');
++			 fprintf(fid,'module load comp-intel/2015.0.090\n');
++			 fprintf(fid,'module load mpi-sgi/mpt.2.11r13\n');
+ 			 fprintf(fid,'export PATH="$PATH:."\n');
+ 			 fprintf(fid,'export ISSM_DIR="%s/../"\n',cluster.codepath); %FIXME
+ 			 fprintf(fid,'source $ISSM_DIR/etc/environment.sh\n');       %FIXME
Index: /issm/oecreview/Archive/18296-19100/ISSM-18979-18980.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18979-18980.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18979-18980.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/m4/issm_options.m4
+===================================================================
+--- ../trunk-jpl/m4/issm_options.m4	(revision 18979)
++++ ../trunk-jpl/m4/issm_options.m4	(revision 18980)
+@@ -1253,7 +1253,7 @@
+ 	if test "x$HAVE_MKL" == "xyes"; then
+ 		MKLINCL=""
+ 		if test x$VENDOR = xintel-pleiades; then
+-			MKLLIB=-L"$MKL_ROOT -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread"
++			MKLLIB=-L"$MKL_ROOT -lmkl_core -lmkl_blas95_lp64 -lmkl_lapack95_lp64 -liomp5 -lpthread -lmkl_intel_thread -lmkl_intel_sp2dp"
+ 		elif test x$VENDOR = xintel-acenet; then
+ 			MKLLIB=-L"$MKL_ROOT -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -lm"
+ 		elif test x$VENDOR = xintel-gp; then
Index: /issm/oecreview/Archive/18296-19100/ISSM-18980-18981.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18980-18981.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18980-18981.diff	(revision 19102)
@@ -0,0 +1,168 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18980)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 18981)
+@@ -12,8 +12,8 @@
+ 
+ 	int         hydrology_model;
+ 	int         eplflip_lock;
++	int         eplthickcomp;
+ 	bool        isefficientlayer;
+-
+ 	/*retrieve some parameters: */
+ 	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
+ 
+@@ -29,6 +29,10 @@
+ 	/*If yes, initialize a flip flop counter*/
+ 	iomodel->FetchData(&eplflip_lock,HydrologydcEplflipLockEnum);
+ 	parameters->AddObject(new IntParam(HydrologydcEplflipLockEnum,eplflip_lock));
++
++	iomodel->FetchData(&eplthickcomp,HydrologydcEplThickCompEnum);
++	parameters->AddObject(new IntParam(HydrologydcEplThickCompEnum,eplthickcomp));
++
+ 	
+ }/*}}}*/
+ void HydrologyDCEfficientAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+@@ -516,16 +520,20 @@
+ void HydrologyDCEfficientAnalysis::ComputeEPLThickness(FemModel* femmodel){/*{{{*/
+ 
+ 	bool        active_element;
++	int         iseplthickcomp;
+ 	int         domaintype;
+ 	IssmDouble  dt,A,B;
+ 	IssmDouble  EPLgrad2;
+ 	IssmDouble  EPL_N;
+ 
++	
+ 	femmodel->parameters->FindParam(&domaintype,DomainTypeEnum);
+ 
+ 	for(int j=0;j<femmodel->elements->Size();j++){
+ 		
+ 		Element* element=(Element*)femmodel->elements->GetObjectByOffset(j);
++		element->parameters->FindParam(&iseplthickcomp,HydrologydcEplThickCompEnum);
++		if(iseplthickcomp==0) return;
+ 		
+ 		switch(domaintype){
+ 		case Domain2DhorizontalEnum:
+@@ -694,6 +702,7 @@
+ 
+ 		/*If mask was already one, keep one*/
+ 		else if(old_active[i]>0.){
++			
+ 			vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+ 			/*If epl thickness gets under colapse thickness, close the layer*/
+ 			if(epl_thickness[i]<colapse_thick){
+@@ -702,6 +711,7 @@
+ 				if(eplzigzag_counter[basalelement->nodes[i]->Lid()]<eplflip_lock |eplflip_lock==0){
+ 					vec_mask->SetValue(basalelement->nodes[i]->Sid(),0.,INS_VAL);
+ 					epl_thickness[i]=init_thick;
++					//If no more active nodes in the element probably colapse it two
+ 				}
+ 				else{
+ 					vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18980)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18981)
+@@ -130,6 +130,7 @@
+ 	HydrologydcEplMaxThicknessEnum,
+ 	HydrologydcEplThicknessEnum,
+ 	HydrologydcEplThicknessOldEnum,
++	HydrologydcEplThickCompEnum,
+ 	HydrologydcEplConductivityEnum,
+ 	HydrologydcIsefficientlayerEnum,
+ 	HydrologydcSedimentlimitFlagEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18980)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18981)
+@@ -138,6 +138,7 @@
+ 		case HydrologydcEplMaxThicknessEnum : return "HydrologydcEplMaxThickness";
+ 		case HydrologydcEplThicknessEnum : return "HydrologydcEplThickness";
+ 		case HydrologydcEplThicknessOldEnum : return "HydrologydcEplThicknessOld";
++		case HydrologydcEplThickCompEnum : return "HydrologydcEplThickComp";
+ 		case HydrologydcEplConductivityEnum : return "HydrologydcEplConductivity";
+ 		case HydrologydcIsefficientlayerEnum : return "HydrologydcIsefficientlayer";
+ 		case HydrologydcSedimentlimitFlagEnum : return "HydrologydcSedimentlimitFlag";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18980)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18981)
+@@ -141,6 +141,7 @@
+    if(stage==2){
+ 	      if (strcmp(name,"HydrologydcEplThickness")==0) return HydrologydcEplThicknessEnum;
+ 	      else if (strcmp(name,"HydrologydcEplThicknessOld")==0) return HydrologydcEplThicknessOldEnum;
++	      else if (strcmp(name,"HydrologydcEplThickComp")==0) return HydrologydcEplThickCompEnum;
+ 	      else if (strcmp(name,"HydrologydcEplConductivity")==0) return HydrologydcEplConductivityEnum;
+ 	      else if (strcmp(name,"HydrologydcIsefficientlayer")==0) return HydrologydcIsefficientlayerEnum;
+ 	      else if (strcmp(name,"HydrologydcSedimentlimitFlag")==0) return HydrologydcSedimentlimitFlagEnum;
+@@ -258,11 +259,11 @@
+ 	      else if (strcmp(name,"MeshNumberoflayers")==0) return MeshNumberoflayersEnum;
+ 	      else if (strcmp(name,"MeshNumberofvertices2d")==0) return MeshNumberofvertices2dEnum;
+ 	      else if (strcmp(name,"MeshNumberofvertices")==0) return MeshNumberofverticesEnum;
+-	      else if (strcmp(name,"MeshUpperelements")==0) return MeshUpperelementsEnum;
+          else stage=3;
+    }
+    if(stage==3){
+-	      if (strcmp(name,"MeshVertexonbase")==0) return MeshVertexonbaseEnum;
++	      if (strcmp(name,"MeshUpperelements")==0) return MeshUpperelementsEnum;
++	      else if (strcmp(name,"MeshVertexonbase")==0) return MeshVertexonbaseEnum;
+ 	      else if (strcmp(name,"MeshVertexonsurface")==0) return MeshVertexonsurfaceEnum;
+ 	      else if (strcmp(name,"MeshVertexonboundary")==0) return MeshVertexonboundaryEnum;
+ 	      else if (strcmp(name,"MeshX")==0) return MeshXEnum;
+@@ -381,11 +382,11 @@
+ 	      else if (strcmp(name,"SurfaceforcingsEvaporation")==0) return SurfaceforcingsEvaporationEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsRunoff")==0) return SurfaceforcingsRunoffEnum;
+ 	      else if (strcmp(name,"SMBmeltcomponents")==0) return SMBmeltcomponentsEnum;
+-	      else if (strcmp(name,"SurfaceforcingsMelt")==0) return SurfaceforcingsMeltEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"SurfaceforcingsRefreeze")==0) return SurfaceforcingsRefreezeEnum;
++	      if (strcmp(name,"SurfaceforcingsMelt")==0) return SurfaceforcingsMeltEnum;
++	      else if (strcmp(name,"SurfaceforcingsRefreeze")==0) return SurfaceforcingsRefreezeEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsIspdd")==0) return SurfaceforcingsIspddEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsIssmbgradients")==0) return SurfaceforcingsIssmbgradientsEnum;
+ 	      else if (strcmp(name,"SolutionType")==0) return SolutionTypeEnum;
+@@ -504,11 +505,11 @@
+ 	      else if (strcmp(name,"Profiler")==0) return ProfilerEnum;
+ 	      else if (strcmp(name,"MatrixParam")==0) return MatrixParamEnum;
+ 	      else if (strcmp(name,"Masscon")==0) return MassconEnum;
+-	      else if (strcmp(name,"MassconName")==0) return MassconNameEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"MassconDefinitionenum")==0) return MassconDefinitionenumEnum;
++	      if (strcmp(name,"MassconName")==0) return MassconNameEnum;
++	      else if (strcmp(name,"MassconDefinitionenum")==0) return MassconDefinitionenumEnum;
+ 	      else if (strcmp(name,"MassconLevelset")==0) return MassconLevelsetEnum;
+ 	      else if (strcmp(name,"Massconaxpby")==0) return MassconaxpbyEnum;
+ 	      else if (strcmp(name,"MassconaxpbyName")==0) return MassconaxpbyNameEnum;
+@@ -627,11 +628,11 @@
+ 	      else if (strcmp(name,"DeviatoricStressxy")==0) return DeviatoricStressxyEnum;
+ 	      else if (strcmp(name,"DeviatoricStressxz")==0) return DeviatoricStressxzEnum;
+ 	      else if (strcmp(name,"DeviatoricStressyy")==0) return DeviatoricStressyyEnum;
+-	      else if (strcmp(name,"DeviatoricStressyz")==0) return DeviatoricStressyzEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"DeviatoricStresszz")==0) return DeviatoricStresszzEnum;
++	      if (strcmp(name,"DeviatoricStressyz")==0) return DeviatoricStressyzEnum;
++	      else if (strcmp(name,"DeviatoricStresszz")==0) return DeviatoricStresszzEnum;
+ 	      else if (strcmp(name,"StrainRate")==0) return StrainRateEnum;
+ 	      else if (strcmp(name,"StrainRatexx")==0) return StrainRatexxEnum;
+ 	      else if (strcmp(name,"StrainRatexy")==0) return StrainRatexyEnum;
+@@ -750,11 +751,11 @@
+ 	      else if (strcmp(name,"Gradient")==0) return GradientEnum;
+ 	      else if (strcmp(name,"GroundinglineMigration")==0) return GroundinglineMigrationEnum;
+ 	      else if (strcmp(name,"Gset")==0) return GsetEnum;
+-	      else if (strcmp(name,"Index")==0) return IndexEnum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"Indexed")==0) return IndexedEnum;
++	      if (strcmp(name,"Index")==0) return IndexEnum;
++	      else if (strcmp(name,"Indexed")==0) return IndexedEnum;
+ 	      else if (strcmp(name,"Intersect")==0) return IntersectEnum;
+ 	      else if (strcmp(name,"Nodal")==0) return NodalEnum;
+ 	      else if (strcmp(name,"OldGradient")==0) return OldGradientEnum;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18981-18982.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18981-18982.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18981-18982.diff	(revision 19102)
@@ -0,0 +1,145 @@
+Index: ../trunk-jpl/src/m/classes/hydrologydc.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologydc.m	(revision 18981)
++++ ../trunk-jpl/src/m/classes/hydrologydc.m	(revision 18982)
+@@ -30,6 +30,7 @@
+ 		epl_porosity             = 0;
+ 		epl_initial_thickness    = 0;
+ 		epl_colapse_thickness    = 0;
++		epl_thick_comp           = 0;
+ 		epl_max_thickness        = 0;
+ 		epl_conductivity         = 0;
+ 		eplflip_lock             = 0;
+@@ -76,6 +77,7 @@
+ 			obj.epl_porosity             = 0.4;
+ 			obj.epl_initial_thickness    = 1.0;
+ 			obj.epl_colapse_thickness    = 1.0e-3;
++			obj.epl_thick_comp           = 1;
+ 			obj.epl_max_thickness        = 5.0;
+ 			obj.epl_conductivity         = 8.0e-02;
+ 			obj.eplflip_lock             = 0;
+@@ -117,6 +119,7 @@
+ 				md = checkfield(md,'fieldname','hydrology.epl_porosity','>',0,'numel',1);
+ 				md = checkfield(md,'fieldname','hydrology.epl_initial_thickness','>',0,'numel',1);
+ 				md = checkfield(md,'fieldname','hydrology.epl_colapse_thickness','>',0,'numel',1);
++				md = checkfield(md,'fieldname','hydrology.epl_thick_comp','numel',[1],'values',[0 1]);
+ 				md = checkfield(md,'fieldname','hydrology.epl_max_thickness','>',0,'numel',1);
+ 				md = checkfield(md,'fieldname','hydrology.epl_conductivity','>',0,'numel',1);
+ 				md = checkfield(md,'fieldname','hydrology.eplflip_lock','>=',0,'numel',1);
+@@ -166,6 +169,7 @@
+ 				fielddisplay(obj,'epl_porosity','epl [dimensionless]');
+ 				fielddisplay(obj,'epl_initial_thickness','epl initial thickness [m]');
+ 				fielddisplay(obj,'epl_colapse_thickness','epl colapsing thickness [m]');
++				fielddisplay(obj,'epl_thick_comp','epl thickness computation flag');
+ 				fielddisplay(obj,'epl_max_thickness','epl maximal thickness [m]');
+ 				fielddisplay(obj,'epl_conductivity','epl conductivity [m^2/s]');
+ 				fielddisplay(obj,'eplflip_lock','lock the epl activation to avoid fli-floping (default is 0, no stabilization)');
+@@ -205,6 +209,7 @@
+ 				WriteData(fid,'object',obj,'fieldname','epl_porosity','format','Double');			
+ 				WriteData(fid,'object',obj,'fieldname','epl_initial_thickness','format','Double');
+ 				WriteData(fid,'object',obj,'fieldname','epl_colapse_thickness','format','Double');
++				WriteData(fid,'object',obj,'fieldname','epl_thick_comp','format','Integer');
+ 				WriteData(fid,'object',obj,'fieldname','epl_max_thickness','format','Double');
+ 				WriteData(fid,'object',obj,'fieldname','epl_conductivity','format','Double');
+ 				WriteData(fid,'object',obj,'fieldname','eplflip_lock','format','Integer');
+Index: ../trunk-jpl/src/m/classes/hydrologydc.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 18981)
++++ ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 18982)
+@@ -38,6 +38,7 @@
+ 		self.epl_porosity             = 0
+ 		self.epl_initial_thickness    = 0
+ 		self.epl_colapse_thickness    = 0
++		self.epl_thick_comp           = 0
+ 		self.epl_max_thickness        = 0
+ 		self.epl_conductivity         = 0
+ 		self.eplflip_lock             = 0
+@@ -88,6 +89,7 @@
+ 			string="%s\n%s"%(string,fielddisplay(self,'epl_max_thickness','epl initial thickness [m]'))
+ 			string="%s\n%s"%(string,fielddisplay(self,'epl_initial_thickness','epl initial thickness [m]'))			
+ 			string="%s\n%s"%(string,fielddisplay(self,'epl_colapse_thickness','epl colapsing thickness [m]'))
++			string="%s\n%s"%(string,fielddisplay(self,'epl_thick_comp','epl thickness computation flag'))
+ 			string="%s\n%s"%(string,fielddisplay(self,'epl_conductivity','epl conductivity [m^2/s]'))
+ 			string="%s\n%s"%(string,fielddisplay(self,'eplflip_lock','lock epl activity to avoid flip-floping (default is 0, no stabilization)'))
+ 		return string
+@@ -115,6 +117,7 @@
+ 		self.epl_porosity             = 0.4
+ 		self.epl_initial_thickness    = 1.0
+ 		self.epl_colapse_thickness    = 1.0e-3
++		self.epl_thick_comp           = 1
+ 		self.epl_max_thickness        = 5.0
+ 		self.epl_conductivity         = 8.0e-02
+ 		self.eplflip_lock             = 0
+@@ -164,6 +167,7 @@
+ 			md = checkfield(md,'fieldname','hydrology.epl_max_thickness','numel',[1],'>',0.)
+ 			md = checkfield(md,'fieldname','hydrology.epl_initial_thickness','numel',[1],'>',0.)
+ 			md = checkfield(md,'fieldname','hydrology.epl_colapse_thickness','numel',[1],'>',0.)
++			md = checkfield(md,'fieldname','hydrology.epl_thick_comp','numel',[1],'values',[0 1])
+ 			md = checkfield(md,'fieldname','hydrology.eplflip_lock','>=',0.,'numel',[1])
+ 			if self.epl_colapse_thickness > self.epl_initial_thickness:
+ 				md.checkmessage('Colapsing thickness for EPL larger than initial thickness')
+@@ -199,7 +203,8 @@
+ 			WriteData(fid,'object',self,'fieldname','epl_porosity','format','Double')			
+ 			WriteData(fid,'object',self,'fieldname','epl_max_thickness','format','Double')
+ 			WriteData(fid,'object',self,'fieldname','epl_initial_thickness','format','Double')			
+-			WriteData(fid,'object',self,'fieldname','epl_colapse_thickness','format','Double')			
++			WriteData(fid,'object',self,'fieldname','epl_colapse_thickness','format','Double')
++			WriteData(fid,'object',self,'fieldname','epl_thick_comp','format','Integer')			
+ 			WriteData(fid,'object',self,'fieldname','epl_conductivity','format','Double')
+ 			WriteData(fid,'object',self,'fieldname','eplflip_lock','format','Integer')
+ 	# }}}
+Index: ../trunk-jpl/src/m/classes/model.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.py	(revision 18981)
++++ ../trunk-jpl/src/m/classes/model.py	(revision 18982)
+@@ -62,6 +62,13 @@
+ class model(object):
+ 	#properties
+ 	def __init__(self):#{{{
++
++		# classtype=model.properties
++				
++		# for classe in dict.keys(classtype):
++		# 	print classe
++		# 	self.__dict__[classe] = classtype[str(classe)]
++
+ 		self.mesh             = mesh2d()
+ 		self.mask             = mask()
+ 		self.geometry         = geometry()
+@@ -133,7 +140,7 @@
+ 		        'steadystate',\
+ 		        'transient',\
+ 		        'calving',\
+-                        'gia',\
++						'gia',\
+ 		        'autodiff',\
+ 		        'flaim',\
+ 		        'inversion',\
+Index: ../trunk-jpl/src/m/enum/HydrologydcEplThickCompEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/HydrologydcEplThickCompEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/HydrologydcEplThickCompEnum.m	(revision 18982)
+@@ -0,0 +1,11 @@
++function macro=HydrologydcEplThickCompEnum()
++%HYDROLOGYDCEPLTHICKCOMPENUM - Enum of HydrologydcEplThickComp
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=HydrologydcEplThickCompEnum()
++
++macro=StringToEnum('HydrologydcEplThickComp');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18981)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18982)
+@@ -130,6 +130,7 @@
+ def HydrologydcEplMaxThicknessEnum(): return StringToEnum("HydrologydcEplMaxThickness")[0]
+ def HydrologydcEplThicknessEnum(): return StringToEnum("HydrologydcEplThickness")[0]
+ def HydrologydcEplThicknessOldEnum(): return StringToEnum("HydrologydcEplThicknessOld")[0]
++def HydrologydcEplThickCompEnum(): return StringToEnum("HydrologydcEplThickComp")[0]
+ def HydrologydcEplConductivityEnum(): return StringToEnum("HydrologydcEplConductivity")[0]
+ def HydrologydcIsefficientlayerEnum(): return StringToEnum("HydrologydcIsefficientlayer")[0]
+ def HydrologydcSedimentlimitFlagEnum(): return StringToEnum("HydrologydcSedimentlimitFlag")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-18982-18983.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18982-18983.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18982-18983.diff	(revision 19102)
@@ -0,0 +1,48 @@
+Index: ../trunk-jpl/test/NightlyRun/test333.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test333.py	(revision 18982)
++++ ../trunk-jpl/test/NightlyRun/test333.py	(revision 18983)
+@@ -38,6 +38,7 @@
+ md.hydrology.epl_conductivity=30
+ md.hydrology.epl_initial_thickness=1
+ md.hydrology.epl_colapse_thickness=1.0e-3
++md.hydrology.epl_thick_comp=1
+ md.hydrology.epl_max_thickness=1
+ md.timestepping.time_step=0.2
+ md.timestepping.final_time=2.0
+Index: ../trunk-jpl/test/NightlyRun/test333.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test333.m	(revision 18982)
++++ ../trunk-jpl/test/NightlyRun/test333.m	(revision 18983)
+@@ -22,6 +22,7 @@
+ md.hydrology.mask_eplactive_node=0*ones(md.mesh.numberofvertices,1);
+ md.hydrology.epl_conductivity=30;
+ md.hydrology.epl_initial_thickness=1;
++md.hydrology.epl_thick_comp=1;
+ md.hydrology.epl_colapse_thickness=1.0e-3;
+ md.hydrology.epl_max_thickness=1;
+ md.timestepping.time_step=0.2;
+Index: ../trunk-jpl/test/NightlyRun/test3300.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3300.m	(revision 18982)
++++ ../trunk-jpl/test/NightlyRun/test3300.m	(revision 18983)
+@@ -24,6 +24,7 @@
+ md.hydrology.epl_conductivity=1.5e-2;
+ md.hydrology.epl_initial_thickness=1.0;
+ md.hydrology.epl_colapse_thickness=1.0e-6;
++md.hydrology.epl_thick_comp=1;
+ md.hydrology.epl_max_thickness=5.0;
+ 
+ md.hydrology.transfer_flag=1.0;
+Index: ../trunk-jpl/test/NightlyRun/test335.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test335.m	(revision 18982)
++++ ../trunk-jpl/test/NightlyRun/test335.m	(revision 18983)
+@@ -23,6 +23,7 @@
+ md.hydrology.epl_conductivity=30;
+ md.hydrology.epl_initial_thickness=1;
+ md.hydrology.epl_colapse_thickness=1.0e-3;
++md.hydrology.epl_thick_comp=1;
+ md.hydrology.epl_max_thickness=1;
+ md.timestepping.time_step=0.2;
+ md.timestepping.final_time=2.0;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18983-18984.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18983-18984.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18983-18984.diff	(revision 19102)
@@ -0,0 +1,152 @@
+Index: ../trunk-jpl/test/NightlyRun/test237.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test237.py	(revision 18983)
++++ ../trunk-jpl/test/NightlyRun/test237.py	(revision 18984)
+@@ -56,13 +56,13 @@
+     md.surfaceforcings.precipitations_lgm[md.mesh.numberofvertices,imonth]=((float(imonth)+1.)/12.)
+ 
+ # Interpolation factors
+-md.surfaceforcings.Pfac[1,1:md.timestepping.final_time]=0.5;
+-md.surfaceforcings.Tdiff[1,1:md.timestepping.final_time]=0.5;
+-md.surfaceforcings.sealev[1,1:md.timestepping.final_time]=0.5;
++md.surfaceforcings.Pfac=0.5*numpy.ones((2,md.timestepping.final_time))
++md.surfaceforcings.Tdiff=0.5*numpy.ones((2,md.timestepping.final_time))
++md.surfaceforcings.sealev=0.5*numpy.ones((2,md.timestepping.final_time))
+ # Year of each data point
+-md.surfaceforcings.Pfac[2,1:md.timestepping.final_time]=1:1:md.timestepping.final_time;
+-md.surfaceforcings.Tdiff[2,1:md.timestepping.final_time]=1:1:md.timestepping.final_time;
+-md.surfaceforcings.sealev[2,1:md.timestepping.final_time]=1:1:md.timestepping.final_time;
++md.surfaceforcings.Pfac[1,1:md.timestepping.final_time]=numpy.arange(1.,md.timestepping.final_time)
++md.surfaceforcings.Tdiff[1,1:md.timestepping.final_time]=numpy.arange(1.,md.timestepping.final_time)
++md.surfaceforcings.sealev[1,1:md.timestepping.final_time]=numpy.arange(1.,md.timestepping.final_time)
+ 
+ # time steps and resolution
+ md.timestepping.time_step=20.
+Index: ../trunk-jpl/src/m/classes/SMBpdd.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBpdd.py	(revision 18983)
++++ ../trunk-jpl/src/m/classes/SMBpdd.py	(revision 18984)
+@@ -113,7 +113,7 @@
+ 			md = checkfield(md,'fieldname','surfaceforcings.rlaps','>=',0,'numel',[1])
+ 			md = checkfield(md,'fieldname','surfaceforcings.rlapslgm','>=',0,'numel',[1])
+ 
+-			if not (self.isdelta18o and self.ismungsm):
++			if (self.isdelta18o==0 and self.ismungsm==0):
+ 				md = checkfield(md,'fieldname','surfaceforcings.monthlytemperatures','NaN',1)
+ 				md = checkfield(md,'fieldname','surfaceforcings.precipitation','NaN',1)
+ 			elif self.isdelta18o:
+@@ -150,7 +150,7 @@
+ 		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','rlaps','format','Double')
+ 		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','rlapslgm','format','Double')
+ 
+-		if not (self.isdelta18o and self.ismungsm):
++		if (self.isdelta18o==0 and self.ismungsm==0):
+ 			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1)
+ 			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+ 		elif self.isdelta18o:
+Index: ../trunk-jpl/src/m/classes/SMBpdd.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBpdd.m	(revision 18983)
++++ ../trunk-jpl/src/m/classes/SMBpdd.m	(revision 18984)
+@@ -10,11 +10,11 @@
+ 		desfac                    = 0;
+ 		s0p                       = 0;
+ 		s0t                       = 0;
+-                rlaps                     = 0;
+-                rlapslgm                  = 0;                
+-                Pfac                      = NaN;
+-                Tdiff                     = NaN;
+-                sealev                    = NaN;
++		rlaps                     = 0;
++		rlapslgm                  = 0;                
++		Pfac                      = NaN;
++		Tdiff                     = NaN;
++		sealev                    = NaN;
+ 		isdelta18o                = 0;
+ 		ismungsm                  = 0;
+ 		delta18o                  = NaN;
+@@ -74,27 +74,27 @@
+ 				md = checkfield(md,'fieldname','surfaceforcings.rlaps','>=',0,'numel',1);
+ 				md = checkfield(md,'fieldname','surfaceforcings.rlapslgm','>=',0,'numel',1);
+ 				if(obj.isdelta18o==0 & obj.ismungsm==0)
+-                                    md = checkfield(md,'fieldname','surfaceforcings.monthlytemperatures','forcing',1,'NaN',1);
+-                                    md = checkfield(md,'fieldname','surfaceforcings.precipitation','forcing',1,'NaN',1);
+-                                elseif(obj.isdelta18o==1) 
+-                                    md = checkfield(md,'fieldname','surfaceforcings.delta18o','NaN',1);
+-                                    md = checkfield(md,'fieldname','surfaceforcings.delta18o_surface','NaN',1);
+-                                    md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
+-                                    md = checkfield(md,'fieldname','surfaceforcings.temperatures_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1);
+-                                    md = checkfield(md,'fieldname','surfaceforcings.precipitations_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
+-                                    md = checkfield(md,'fieldname','surfaceforcings.precipitations_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1);                                       
+-                                    md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1);
+-                                    md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1);
+-                                elseif(obj.ismungsm==1) 
+-                                    md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
+-                                    md = checkfield(md,'fieldname','surfaceforcings.temperatures_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1);
+-                                    md = checkfield(md,'fieldname','surfaceforcings.precipitations_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
+-                                    md = checkfield(md,'fieldname','surfaceforcings.precipitations_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1);                                       
+-                                    md = checkfield(md,'fieldname','surfaceforcings.Pfac','NaN',1,'size',[2,NaN]);
+-                                    md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1);
+-                                    md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1);
++					md = checkfield(md,'fieldname','surfaceforcings.monthlytemperatures','forcing',1,'NaN',1);
++					md = checkfield(md,'fieldname','surfaceforcings.precipitation','forcing',1,'NaN',1);
++				elseif(obj.isdelta18o==1) 
++					md = checkfield(md,'fieldname','surfaceforcings.delta18o','NaN',1);
++					md = checkfield(md,'fieldname','surfaceforcings.delta18o_surface','NaN',1);
++					md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
++					md = checkfield(md,'fieldname','surfaceforcings.temperatures_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1);
++					md = checkfield(md,'fieldname','surfaceforcings.precipitations_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
++					md = checkfield(md,'fieldname','surfaceforcings.precipitations_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1);                                       
++					md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1);
++					md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1);
++				elseif(obj.ismungsm==1) 
++					md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
++					md = checkfield(md,'fieldname','surfaceforcings.temperatures_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1);
++					md = checkfield(md,'fieldname','surfaceforcings.precipitations_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
++					md = checkfield(md,'fieldname','surfaceforcings.precipitations_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1);                                       
++					md = checkfield(md,'fieldname','surfaceforcings.Pfac','NaN',1,'size',[2,NaN]);
++					md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1);
++					md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1);
+ 				end
+-                        end
++			end
+ 		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   surface forcings parameters:'));
+@@ -143,10 +143,10 @@
+ 			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','rlaps','format','Double');
+ 			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','rlapslgm','format','Double');
+ 
+-                        if(obj.isdelta18o==0 & obj.ismungsm==0)
+-                            %WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1);
+-                            WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
+-                            WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
++			if(obj.isdelta18o==0 & obj.ismungsm==0)
++				%WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+ 			elseif obj.isdelta18o
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1);
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_lgm','format','DoubleMat','mattype',1);
+@@ -154,16 +154,16 @@
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitations_lgm','format','DoubleMat','mattype',1);
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','delta18o_surface','format','DoubleMat','mattype',1);
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','delta18o','format','DoubleMat','mattype',1);
+-                                WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1);
+-                                WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1);
+ 			elseif obj.ismungsm
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1);
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_lgm','format','DoubleMat','mattype',1);
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitations_presentday','format','DoubleMat','mattype',1);
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitations_lgm','format','DoubleMat','mattype',1);
+-                                WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Pfac','format','DoubleMat','mattype',1);
+-                                WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1);
+-                                WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Pfac','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1);
+ 			end
+ 		end % }}}
+ 	end
Index: /issm/oecreview/Archive/18296-19100/ISSM-18984-18985.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18984-18985.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18984-18985.diff	(revision 19102)
@@ -0,0 +1,22 @@
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18984)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18985)
+@@ -134,7 +134,7 @@
+ 	/*This routine calculates the basal friction coefficient 
+ 		Based on Gagliardini 2007, needs a good effective pressure computation
+ 		Not tested so far so use at your own risks
+-	  alpha2= [vel^(1-n)/{(As)*(1+alpha*Chi^q)}]^(1/n)  with
++	  alpha2= NeffC[Chi/(1+alpha*Chi^q)]^(1/n)*1/vel  with
+ 		-Chi=|vel|/(C^n*Neff^n*As)
+ 		-alpha=(q-1)^(q-1)/q^q  **/
+ 
+@@ -190,7 +190,7 @@
+ 		alpha=(pow(q_exp-1,q_exp-1))/pow(q_exp,q_exp);
+ 	}
+ 	Chi=vmag/(pow(C_param,n)*pow(Neff,n)*As);
+-	alpha2=pow((pow(vmag,1.-n)/(As*(1+alpha*pow(Chi,q_exp)))),1./n);
++	alpha2= Neff * C_param * pow((Chi/(1 + alpha * pow(Chi,q))),1/n) * 1/vmag;
+ 	_assert_(!xIsNan<IssmDouble>(alpha2));
+ 	/*Assign output pointers:*/
+ 	*palpha2=alpha2;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18985-18986.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18985-18986.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18985-18986.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/classes/hydrologydc.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 18985)
++++ ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 18986)
+@@ -167,7 +167,7 @@
+ 			md = checkfield(md,'fieldname','hydrology.epl_max_thickness','numel',[1],'>',0.)
+ 			md = checkfield(md,'fieldname','hydrology.epl_initial_thickness','numel',[1],'>',0.)
+ 			md = checkfield(md,'fieldname','hydrology.epl_colapse_thickness','numel',[1],'>',0.)
+-			md = checkfield(md,'fieldname','hydrology.epl_thick_comp','numel',[1],'values',[0 1])
++			md = checkfield(md,'fieldname','hydrology.epl_thick_comp','numel',[1],'values',[0,1])
+ 			md = checkfield(md,'fieldname','hydrology.eplflip_lock','>=',0.,'numel',[1])
+ 			if self.epl_colapse_thickness > self.epl_initial_thickness:
+ 				md.checkmessage('Colapsing thickness for EPL larger than initial thickness')
Index: /issm/oecreview/Archive/18296-19100/ISSM-18986-18987.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18986-18987.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18986-18987.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/test/NightlyRun/test237.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test237.py	(revision 18986)
++++ ../trunk-jpl/test/NightlyRun/test237.py	(revision 18987)
+@@ -49,6 +49,7 @@
+ 
+ # creating precipitation
+ md.surfaceforcings.precipitations_presentday=numpy.zeros((md.mesh.numberofvertices+1,12))
++md.surfaceforcings.precipitations_lgm=numpy.zeros((md.mesh.numberofvertices+1,12))
+ for imonth in xrange(0,12):
+     md.surfaceforcings.precipitations_presentday[0:md.mesh.numberofvertices,imonth]=-0.4*10**(-6)*md.mesh.y+0.5
+     md.surfaceforcings.precipitations_presentday[md.mesh.numberofvertices,imonth]=((float(imonth)+1.)/12.)
Index: /issm/oecreview/Archive/18296-19100/ISSM-18987-18988.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18987-18988.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18987-18988.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18987)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18988)
+@@ -190,7 +190,7 @@
+ 		alpha=(pow(q_exp-1,q_exp-1))/pow(q_exp,q_exp);
+ 	}
+ 	Chi=vmag/(pow(C_param,n)*pow(Neff,n)*As);
+-	alpha2= Neff * C_param * pow((Chi/(1 + alpha * pow(Chi,q))),1/n) * 1/vmag;
++	alpha2= Neff * C_param * pow((Chi/(1 + alpha * pow(Chi,q_exp))),1/n) * 1/vmag;
+ 	_assert_(!xIsNan<IssmDouble>(alpha2));
+ 	/*Assign output pointers:*/
+ 	*palpha2=alpha2;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18988-18989.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18988-18989.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18988-18989.diff	(revision 19102)
@@ -0,0 +1,32 @@
+Index: ../trunk-jpl/test/NightlyRun/test701.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test701.m	(revision 18988)
++++ ../trunk-jpl/test/NightlyRun/test701.m	(revision 18989)
+@@ -37,9 +37,9 @@
+ %Misc
+ md=setflowequation(md,'FS','all');
+ md.stressbalance.abstol=NaN;
+-md.stressbalance.reltol=10^-16;
++%md.stressbalance.reltol=10^-16;
+ md.stressbalance.FSreconditioning=1;
+-md.stressbalance.maxiter=40;
++md.stressbalance.maxiter=20;
+ md.flowequation.augmented_lagrangian_r=10000;
+ md.miscellaneous.name = 'flowline';
+ md.verbose=verbose('convergence',true);
+@@ -49,9 +49,8 @@
+ field_names={};
+ field_tolerances={};
+ field_values={};
+-md.initialization.pressure=md.constants.g*md.materials.rho_ice*(md.geometry.surface-md.mesh.y);
+-for i={'LATaylorHood'}
+-%for i={'MINI','MINIcondensed','TaylorHood','XTaylorHood','LATaylorHood','CrouzeixRaviart','LACrouzeixRaviart'}
++%md.initialization.pressure=md.constants.g*md.materials.rho_ice*(md.geometry.surface-md.mesh.y);
++for i={'MINI','MINIcondensed','TaylorHood','XTaylorHood','LATaylorHood','CrouzeixRaviart','LACrouzeixRaviart'}
+ 	disp(' ');
+ 	disp(['====== Testing ' i{1} ' Full-Stokes Finite element =====']);
+ 	md.flowequation.fe_FS=i{1};
+Index: ../trunk-jpl/test/Archives/Archive701.nc
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
Index: /issm/oecreview/Archive/18296-19100/ISSM-18989-18990.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18989-18990.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18989-18990.diff	(revision 19102)
@@ -0,0 +1,17 @@
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18989)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18990)
+@@ -190,7 +190,11 @@
+ 		alpha=(pow(q_exp-1,q_exp-1))/pow(q_exp,q_exp);
+ 	}
+ 	Chi=vmag/(pow(C_param,n)*pow(Neff,n)*As);
+-	alpha2= Neff * C_param * pow((Chi/(1 + alpha * pow(Chi,q_exp))),1/n) * 1/vmag;
++
++
++	/*Check to prevent dividing by zero if vmag==0*/
++	if(vmag==0.) alpha2=0.;
++	else alpha2= Neff * C_param * pow((Chi/(1 + alpha * pow(Chi,q_exp))),1/n) * 1/vmag;
+ 	_assert_(!xIsNan<IssmDouble>(alpha2));
+ 	/*Assign output pointers:*/
+ 	*palpha2=alpha2;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18990-18991.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18990-18991.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18990-18991.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18990)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18991)
+@@ -194,6 +194,7 @@
+ 
+ 	/*Check to prevent dividing by zero if vmag==0*/
+ 	if(vmag==0.) alpha2=0.;
++	else if (Neff==0) alpha2=0.0;
+ 	else alpha2= Neff * C_param * pow((Chi/(1 + alpha * pow(Chi,q_exp))),1/n) * 1/vmag;
+ 	_assert_(!xIsNan<IssmDouble>(alpha2));
+ 	/*Assign output pointers:*/
Index: /issm/oecreview/Archive/18296-19100/ISSM-18991-18992.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18991-18992.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18991-18992.diff	(revision 19102)
@@ -0,0 +1,120 @@
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.h	(revision 18991)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.h	(revision 18992)
+@@ -29,6 +29,8 @@
+ 
+ 		void  Echo(void);
+ 		void  GetAlphaComplement(IssmDouble* alpha_complement,Gauss* gauss);
++		void  GetAlphaViscousComplement(IssmDouble* alpha_complement,Gauss* gauss);
++		void  GetAlphaHydroComplement(IssmDouble* alpha_complement,Gauss* gauss);
+ 		void  GetAlpha2(IssmDouble* palpha2,Gauss* gauss);
+ 		void  GetAlpha2Hydro(IssmDouble* palpha2,Gauss* gauss);
+ 		void  GetAlpha2Temp(IssmDouble* palpha2,Gauss* gauss);
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18991)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 18992)
+@@ -41,12 +41,25 @@
+ /*}}}*/
+ void Friction::GetAlphaComplement(IssmDouble* palpha_complement, Gauss* gauss){/*{{{*/
+ 
++	switch(this->law){
++		case 1:
++			GetAlphaViscousComplement(palpha_complement,gauss);
++			break;
++		case 3:
++			GetAlphaHydroComplement(palpha_complement,gauss);
++			break;
++	  default:
++			_error_("not supported");
++	}
++
++}/*}}}*/
++
++void Friction::GetAlphaViscousComplement(IssmDouble* palpha_complement, Gauss* gauss){/*{{{*/
++
+ 	/* FrictionGetAlpha2 computes alpha2= drag^2 * Neff ^r * vel ^s, with Neff=rho_ice*g*thickness+rho_ice*g*bed, r=q/p and s=1/p. 
+ 	 * FrictionGetAlphaComplement is used in control methods on drag, and it computes: 
+ 	 * alpha_complement= Neff ^r * vel ^s*/
+ 
+-	if(this->law!=1)_error_("not supported");
+-
+ 	/*diverse: */
+ 	IssmDouble  r,s;
+ 	IssmDouble  vx,vy,vz,vmag;
+@@ -103,6 +116,66 @@
+ 	*palpha_complement=alpha_complement;
+ }
+ /*}}}*/
++void Friction::GetAlphaHydroComplement(IssmDouble* palpha_complement, Gauss* gauss){/*{{{*/
++
++	/*diverse: */
++	IssmDouble  q_exp;
++	IssmDouble  C_param;
++	IssmDouble  As;
++	IssmDouble  Neff;
++	IssmDouble  n;
++	IssmDouble  alpha;
++	IssmDouble  Chi;
++	IssmDouble  vx,vy,vz,vmag;
++	IssmDouble  alpha_complement;
++
++	/*Recover parameters: */
++	element->GetInputValue(&q_exp,FrictionQEnum);
++	element->GetInputValue(&C_param,FrictionCEnum);
++	element->GetInputValue(&As,FrictionAsEnum);
++
++	element->GetInputValue(&Neff,gauss,FrictionEffectivePressureEnum);
++	element->GetInputValue(&n,gauss,MaterialsRheologyNEnum);
++
++	if(Neff<0)Neff=0;
++
++	//We need the velocity magnitude to evaluate the basal stress:
++	switch(dim){
++		case 1:
++			element->GetInputValue(&vx,gauss,VxEnum);
++			vmag=sqrt(vx*vx);
++			break;
++		case 2:
++			element->GetInputValue(&vx,gauss,VxEnum);
++			element->GetInputValue(&vy,gauss,VyEnum);
++			vmag=sqrt(vx*vx+vy*vy);
++			break;
++		case 3:
++			element->GetInputValue(&vx,gauss,VxEnum);
++			element->GetInputValue(&vy,gauss,VyEnum);
++			element->GetInputValue(&vz,gauss,VzEnum);
++			vmag=sqrt(vx*vx+vy*vy+vz*vz);
++			break;
++		default:
++			_error_("not supported");
++	}
++	if (q_exp==1){
++		alpha=1;
++	}
++	else{
++		alpha=(pow(q_exp-1,q_exp-1))/pow(q_exp,q_exp);
++	}
++	Chi=vmag/(pow(C_param,n)*pow(Neff,n)*As);
++
++	/*Check to prevent dividing by zero if vmag==0*/
++	if(vmag==0.) alpha_complement=0.;
++	else if(Neff==0.) alpha_complement=0.;
++	else alpha_complement=-(C_param*Neff/(vmag*n)) * pow((Chi/(alpha*pow(Chi,q_exp)+1)),((1-n)/n)) *(Chi/(As*(alpha*pow(Chi,q_exp)+1)))-(alpha*q_exp*pow(Chi,q_exp+1)/(As*(alpha*pow(Chi,q_exp)+1)));
++	_assert_(!xIsNan<IssmDouble>(alpha_complement));
++	/*Assign output pointers:*/
++	*palpha_complement=alpha_complement;
++}
++/*}}}*/
+ void Friction::GetAlpha2(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
+ 
+ 	switch(this->law){
+@@ -191,7 +264,6 @@
+ 	}
+ 	Chi=vmag/(pow(C_param,n)*pow(Neff,n)*As);
+ 
+-
+ 	/*Check to prevent dividing by zero if vmag==0*/
+ 	if(vmag==0.) alpha2=0.;
+ 	else if (Neff==0) alpha2=0.0;
Index: /issm/oecreview/Archive/18296-19100/ISSM-18992-18993.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18992-18993.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18992-18993.diff	(revision 19102)
@@ -0,0 +1,33 @@
+Index: ../trunk-jpl/src/m/inversions/supportedcontrols.m
+===================================================================
+--- ../trunk-jpl/src/m/inversions/supportedcontrols.m	(revision 0)
++++ ../trunk-jpl/src/m/inversions/supportedcontrols.m	(revision 18993)
+@@ -0,0 +1,13 @@
++function list = supportedcontrols(),
++
++	list = {...
++		'BalancethicknessThickeningRate',...
++		'FrictionCoefficient',...
++		'MaterialsRheologyBbar',...
++		'DamageDbar',...
++		'Vx',...
++		'Vy',...
++		'Thickness',...
++		'BalancethicknessOmega',...
++		'BalancethicknessApparentMassbalance',...
++		'MaterialsRheologyB'};
+Index: ../trunk-jpl/src/m/classes/inversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversion.m	(revision 18992)
++++ ../trunk-jpl/src/m/classes/inversion.m	(revision 18993)
+@@ -131,9 +131,7 @@
+ 
+ 			md = checkfield(md,'fieldname','inversion.iscontrol','values',[0 1]);
+ 			md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0 1]);
+-			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',...
+-				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'DamageDbar' 'Vx' 'Vy' 'Thickness',...
+-				'BalancethicknessOmega' 'BalancethicknessApparentMassbalance','MaterialsRheologyB'});
++			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',supportedcontrols());
+ 			md = checkfield(md,'fieldname','inversion.nsteps','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.maxiter_per_step','size',[md.inversion.nsteps 1],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.step_threshold','size',[md.inversion.nsteps 1]);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18993-18994.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18993-18994.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18993-18994.diff	(revision 19102)
@@ -0,0 +1,374 @@
+Index: ../trunk-jpl/src/m/inversions/marshallcostfunctions.m
+===================================================================
+--- ../trunk-jpl/src/m/inversions/marshallcostfunctions.m	(revision 0)
++++ ../trunk-jpl/src/m/inversions/marshallcostfunctions.m	(revision 18994)
+@@ -0,0 +1,15 @@
++function data = marshallcostfunctions(cost_functions)
++	pos=find(cost_functions==101); data(pos)=SurfaceAbsVelMisfitEnum();
++	pos=find(cost_functions==102); data(pos)=SurfaceRelVelMisfitEnum();
++	pos=find(cost_functions==103); data(pos)=SurfaceLogVelMisfitEnum();
++	pos=find(cost_functions==104); data(pos)=SurfaceLogVxVyMisfitEnum();
++	pos=find(cost_functions==105); data(pos)=SurfaceAverageVelMisfitEnum();
++	pos=find(cost_functions==201); data(pos)=ThicknessAbsMisfitEnum();
++	pos=find(cost_functions==501); data(pos)=DragCoefficientAbsGradientEnum();
++	pos=find(cost_functions==502); data(pos)=RheologyBbarAbsGradientEnum();
++	pos=find(cost_functions==503); data(pos)=ThicknessAbsGradientEnum();
++	pos=find(cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
++	pos=find(cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
++	pos=find(cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
++	pos=find(cost_functions==507); data(pos)=RheologyBAbsGradientEnum();
++	pos=find(cost_functions==601); data(pos)=SurfaceAbsMisfitEnum();
+Index: ../trunk-jpl/src/m/inversions/supportedcontrols.py
+===================================================================
+--- ../trunk-jpl/src/m/inversions/supportedcontrols.py	(revision 0)
++++ ../trunk-jpl/src/m/inversions/supportedcontrols.py	(revision 18994)
+@@ -0,0 +1,2 @@
++def supportedcontrols():
++	return ['BalancethicknessThickeningRate','FrictionCoefficient','MaterialsRheologyBbar','DamageDbar','Vx','Vy']
+Index: ../trunk-jpl/src/m/inversions/supportedcostfunctions.m
+===================================================================
+--- ../trunk-jpl/src/m/inversions/supportedcostfunctions.m	(revision 0)
++++ ../trunk-jpl/src/m/inversions/supportedcostfunctions.m	(revision 18994)
+@@ -0,0 +1,3 @@
++function list = supportedcostfunctions(),
++
++	list = [101:105 201 501:507 601:604];
+Index: ../trunk-jpl/src/m/inversions/marshallcostfunctions.py
+===================================================================
+--- ../trunk-jpl/src/m/inversions/marshallcostfunctions.py	(revision 0)
++++ ../trunk-jpl/src/m/inversions/marshallcostfunctions.py	(revision 18994)
+@@ -0,0 +1,33 @@
++import copy
++from EnumDefinitions import *
++
++def marshallcostfunctions(cost_functions):
++
++	#copy list first
++	data=copy.deepcopy(cost_functions)
++
++	#convert to  Enums
++	pos=[i for i,x in enumerate(cost_functions) if x==101];
++	for i in pos: data[i]=SurfaceAbsVelMisfitEnum()        
++	pos=[i for i,x in enumerate(cost_functions) if x==102];
++	for i in pos: data[i]=SurfaceRelVelMisfitEnum()        
++	pos=[i for i,x in enumerate(cost_functions) if x==103];
++	for i in pos: data[i]=SurfaceLogVelMisfitEnum()        
++	pos=[i for i,x in enumerate(cost_functions) if x==104];
++	for i in pos: data[i]=SurfaceLogVxVyMisfitEnum()       
++	pos=[i for i,x in enumerate(cost_functions) if x==105];
++	for i in pos: data[i]=SurfaceAverageVelMisfitEnum()    
++	pos=[i for i,x in enumerate(cost_functions) if x==201];
++	for i in pos: data[i]=ThicknessAbsMisfitEnum()         
++	pos=[i for i,x in enumerate(cost_functions) if x==501];
++	for i in pos: data[i]=DragCoefficientAbsGradientEnum() 
++	pos=[i for i,x in enumerate(cost_functions) if x==502];
++	for i in pos: data[i]=RheologyBbarAbsGradientEnum()    
++	pos=[i for i,x in enumerate(cost_functions) if x==503];
++	for i in pos: data[i]=ThicknessAbsGradientEnum()       
++	pos=[i for i,x in enumerate(cost_functions) if x==504];
++	for i in pos: data[i]=ThicknessAlongGradientEnum()     
++	pos=[i for i,x in enumerate(cost_functions) if x==505];
++	for i in pos: data[i]=ThicknessAcrossGradientEnum()    
++
++	return data
+Index: ../trunk-jpl/src/m/inversions/supportedcostfunctions.py
+===================================================================
+--- ../trunk-jpl/src/m/inversions/supportedcostfunctions.py	(revision 0)
++++ ../trunk-jpl/src/m/inversions/supportedcostfunctions.py	(revision 18994)
+@@ -0,0 +1,2 @@
++def supportedcostfunctions():
++	return [101,102,103,104,105,201,501,502,503,504,505]
+Index: ../trunk-jpl/src/m/classes/m1qn3inversion.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/m1qn3inversion.py	(revision 18993)
++++ ../trunk-jpl/src/m/classes/m1qn3inversion.py	(revision 18994)
+@@ -1,10 +1,12 @@
+ import numpy
+-import copy
+ from fielddisplay import fielddisplay
+ from EnumDefinitions import *
+ from StringToEnum import StringToEnum
+ from checkfield import checkfield
+ from WriteData import WriteData
++from supportedcontrols import supportedcontrols
++from supportedcostfunctions import supportedcostfunctions
++from marshallcostfunctions import marshallcostfunctions
+ 
+ class m1qn3inversion(object):
+ 	'''
+@@ -118,12 +120,12 @@
+ 
+ 		md = checkfield(md,'fieldname','inversion.iscontrol','values',[0,1])
+ 		md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0,1])
+-		md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',['BalancethicknessThickeningRate','FrictionCoefficient','MaterialsRheologyBbar','DamageDbar','Vx','Vy','Thickness'])
++		md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',supportedcontrols())
+ 		md = checkfield(md,'fieldname','inversion.maxsteps','numel',[1],'>=',0)
+ 		md = checkfield(md,'fieldname','inversion.maxiter','numel',[1],'>=',0)
+ 		md = checkfield(md,'fieldname','inversion.dxmin','numel',[1],'>',0.)
+ 		md = checkfield(md,'fieldname','inversion.gttol','numel',[1],'>',0.)
+-		md = checkfield(md,'fieldname','inversion.cost_functions','size',[num_costfunc],'values',[101,102,103,104,105,201,501,502,503,504,505])
++		md = checkfield(md,'fieldname','inversion.cost_functions','size',[num_costfunc],'values',supportedcostfunctions())
+ 		md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices,num_costfunc],'>=',0)
+ 		md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices,num_controls])
+ 		md = checkfield(md,'fieldname','inversion.max_parameters','size',[md.mesh.numberofvertices,num_controls])
+@@ -165,29 +167,7 @@
+ 
+ 		#process cost functions
+ 		num_cost_functions=numpy.size(self.cost_functions)
+-		data=copy.deepcopy(self.cost_functions)
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==101];
+-		for i in pos: data[i]=SurfaceAbsVelMisfitEnum()        
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==102];
+-		for i in pos: data[i]=SurfaceRelVelMisfitEnum()        
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==103];
+-		for i in pos: data[i]=SurfaceLogVelMisfitEnum()        
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==104];
+-		for i in pos: data[i]=SurfaceLogVxVyMisfitEnum()       
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==105];
+-		for i in pos: data[i]=SurfaceAverageVelMisfitEnum()    
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==201];
+-		for i in pos: data[i]=ThicknessAbsMisfitEnum()         
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==501];
+-		for i in pos: data[i]=DragCoefficientAbsGradientEnum() 
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==502];
+-		for i in pos: data[i]=RheologyBbarAbsGradientEnum()    
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==503];
+-		for i in pos: data[i]=ThicknessAbsGradientEnum()       
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==504];
+-		for i in pos: data[i]=ThicknessAlongGradientEnum()     
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==505];
+-		for i in pos: data[i]=ThicknessAcrossGradientEnum()    
++		data=marshallcostfunctions(self.cost_functions)
+ 		WriteData(fid,'data',numpy.array(data).reshape(1,-1),'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3)
+ 		WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer')
+ 	# }}}
+Index: ../trunk-jpl/src/m/classes/m1qn3inversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 18993)
++++ ../trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 18994)
+@@ -73,15 +73,13 @@
+ 
+ 			md = checkfield(md,'fieldname','inversion.iscontrol','values',[0 1]);
+ 			md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0 1]);
+-			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',...
+-				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'DamageDbar',...
+-				'Vx' 'Vy' 'Thickness' 'BalancethicknessOmega' 'BalancethicknessApparentMassbalance','MaterialsRheologyB'});
++			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',supportedcontrols());
+ 			md = checkfield(md,'fieldname','inversion.control_scaling_factors','size',[1 num_controls],'>',0,'NaN',1);
+ 			md = checkfield(md,'fieldname','inversion.maxsteps','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.maxiter','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.dxmin','numel',1,'>',0);
+ 			md = checkfield(md,'fieldname','inversion.gttol','numel',1,'>',0);
+-			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:507 601:604]);
++			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',supportedcostfunctions());
+ 			md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);
+ 			md = checkfield(md,'fieldname','inversion.max_parameters','size',[md.mesh.numberofvertices num_controls]);
+@@ -166,21 +164,7 @@
+ 
+ 			%process cost functions
+ 			num_cost_functions=size(obj.cost_functions,2);
+-			data=obj.cost_functions;
+-			pos=find(obj.cost_functions==101); data(pos)=SurfaceAbsVelMisfitEnum();
+-			pos=find(obj.cost_functions==102); data(pos)=SurfaceRelVelMisfitEnum();
+-			pos=find(obj.cost_functions==103); data(pos)=SurfaceLogVelMisfitEnum();
+-			pos=find(obj.cost_functions==104); data(pos)=SurfaceLogVxVyMisfitEnum();
+-			pos=find(obj.cost_functions==105); data(pos)=SurfaceAverageVelMisfitEnum();
+-			pos=find(obj.cost_functions==201); data(pos)=ThicknessAbsMisfitEnum();
+-			pos=find(obj.cost_functions==501); data(pos)=DragCoefficientAbsGradientEnum();
+-			pos=find(obj.cost_functions==502); data(pos)=RheologyBbarAbsGradientEnum();
+-			pos=find(obj.cost_functions==503); data(pos)=ThicknessAbsGradientEnum();
+-			pos=find(obj.cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
+-			pos=find(obj.cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
+-			pos=find(obj.cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
+-			pos=find(obj.cost_functions==507); data(pos)=RheologyBAbsGradientEnum();
+-			pos=find(obj.cost_functions==601); data(pos)=SurfaceAbsMisfitEnum();
++			data=marshallcostfunctions(obj.cost_functions);
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/inversionvalidation.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 18993)
++++ ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 18994)
+@@ -56,11 +56,9 @@
+ 
+ 			md = checkfield(md,'fieldname','inversion.iscontrol','values',[0 1]);
+ 			md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0 1]);
+-			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',...
+-				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'DamageDbar' 'Vx' 'Vy' 'Thickness',...
+-				'BalancethicknessOmega' 'BalancethicknessApparentMassbalance','MaterialsRheologyB'});
++			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',supportedcontrols());
+ 			md = checkfield(md,'fieldname','inversion.control_scaling_factors','size',[1 num_controls],'>',0,'NaN',1);
+-			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:507 601:604]);
++			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',supportedcostfunctions());
+ 			md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);
+ 			md = checkfield(md,'fieldname','inversion.max_parameters','size',[md.mesh.numberofvertices num_controls]);
+@@ -136,21 +134,7 @@
+ 
+ 			%process cost functions
+ 			num_cost_functions=size(obj.cost_functions,2);
+-			data=obj.cost_functions;
+-			pos=find(obj.cost_functions==101); data(pos)=SurfaceAbsVelMisfitEnum();
+-			pos=find(obj.cost_functions==102); data(pos)=SurfaceRelVelMisfitEnum();
+-			pos=find(obj.cost_functions==103); data(pos)=SurfaceLogVelMisfitEnum();
+-			pos=find(obj.cost_functions==104); data(pos)=SurfaceLogVxVyMisfitEnum();
+-			pos=find(obj.cost_functions==105); data(pos)=SurfaceAverageVelMisfitEnum();
+-			pos=find(obj.cost_functions==201); data(pos)=ThicknessAbsMisfitEnum();
+-			pos=find(obj.cost_functions==501); data(pos)=DragCoefficientAbsGradientEnum();
+-			pos=find(obj.cost_functions==502); data(pos)=RheologyBbarAbsGradientEnum();
+-			pos=find(obj.cost_functions==503); data(pos)=ThicknessAbsGradientEnum();
+-			pos=find(obj.cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
+-			pos=find(obj.cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
+-			pos=find(obj.cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
+-			pos=find(obj.cost_functions==507); data(pos)=RheologyBAbsGradientEnum();
+-			pos=find(obj.cost_functions==601); data(pos)=SurfaceAbsMisfitEnum();
++			data=marshallcostfunctions(obj.cost_functions);
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/inversion.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversion.py	(revision 18993)
++++ ../trunk-jpl/src/m/classes/inversion.py	(revision 18994)
+@@ -1,10 +1,12 @@
+ import numpy
+-import copy
+ from fielddisplay import fielddisplay
+ from EnumDefinitions import *
+ from StringToEnum import StringToEnum
+ from checkfield import checkfield
+ from WriteData import WriteData
++from supportedcontrols import supportedcontrols
++from supportedcostfunctions import supportedcostfunctions
++from marshallcostfunctions import marshallcostfunctions
+ 
+ class inversion(object):
+ 	"""
+@@ -118,11 +120,11 @@
+ 
+ 		md = checkfield(md,'fieldname','inversion.iscontrol','values',[0,1])
+ 		md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0,1])
+-		md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',['BalancethicknessThickeningRate','FrictionCoefficient','MaterialsRheologyBbar','DamageDbar','Vx','Vy'])
++		md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',supportedcontrols())
+ 		md = checkfield(md,'fieldname','inversion.nsteps','numel',[1],'>=',0)
+ 		md = checkfield(md,'fieldname','inversion.maxiter_per_step','size',[md.inversion.nsteps],'>=',0)
+ 		md = checkfield(md,'fieldname','inversion.step_threshold','size',[md.inversion.nsteps])
+-		md = checkfield(md,'fieldname','inversion.cost_functions','size',[num_costfunc],'values',[101,102,103,104,105,201,501,502,503,504,505])
++		md = checkfield(md,'fieldname','inversion.cost_functions','size',[num_costfunc],'values',supportedcostfunctions())
+ 		md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices,num_costfunc],'>=',0)
+ 		md = checkfield(md,'fieldname','inversion.gradient_scaling','size',[md.inversion.nsteps,num_controls])
+ 		md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices,num_controls])
+@@ -172,29 +174,7 @@
+ 
+ 		#process cost functions
+ 		num_cost_functions=numpy.size(self.cost_functions)
+-		data=copy.deepcopy(self.cost_functions)
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==101];
+-		for i in pos: data[i]=SurfaceAbsVelMisfitEnum()        
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==102];
+-		for i in pos: data[i]=SurfaceRelVelMisfitEnum()        
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==103];
+-		for i in pos: data[i]=SurfaceLogVelMisfitEnum()        
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==104];
+-		for i in pos: data[i]=SurfaceLogVxVyMisfitEnum()       
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==105];
+-		for i in pos: data[i]=SurfaceAverageVelMisfitEnum()    
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==201];
+-		for i in pos: data[i]=ThicknessAbsMisfitEnum()         
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==501];
+-		for i in pos: data[i]=DragCoefficientAbsGradientEnum() 
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==502];
+-		for i in pos: data[i]=RheologyBbarAbsGradientEnum()    
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==503];
+-		for i in pos: data[i]=ThicknessAbsGradientEnum()       
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==504];
+-		for i in pos: data[i]=ThicknessAlongGradientEnum()     
+-		pos=[i for i,x in enumerate(self.cost_functions) if x==505];
+-		for i in pos: data[i]=ThicknessAcrossGradientEnum()    
++		data=marshallcostfunctions(self.cost_functions)
+ 		WriteData(fid,'data',numpy.array(data).reshape(1,-1),'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3)
+ 		WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer')
+ 	# }}}
+Index: ../trunk-jpl/src/m/classes/taoinversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/taoinversion.m	(revision 18993)
++++ ../trunk-jpl/src/m/classes/taoinversion.m	(revision 18994)
+@@ -85,8 +85,7 @@
+ 
+ 			md = checkfield(md,'fieldname','inversion.iscontrol','values',[0 1]);
+ 			md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0 1]);
+-			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',...
+-				{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'MaterialsRheologyZbar' 'Vx' 'Vy' 'Thickness'});
++			md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',supportedcontrols());
+ 			md = checkfield(md,'fieldname','inversion.maxsteps','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.maxiter','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.fatol','numel',1,'>=',0);
+@@ -103,7 +102,7 @@
+ 				md = checkfield(md,'fieldname','inversion.algorithm','values',{'tao_blmvm','tao_cg','tao_lmvm'});
+ 			end
+ 
+-			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:506]);
++			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',supportedcostfunctions());
+ 			md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);
+ 			md = checkfield(md,'fieldname','inversion.max_parameters','size',[md.mesh.numberofvertices num_controls]);
+@@ -186,20 +185,7 @@
+ 
+ 			%process cost functions
+ 			num_cost_functions=size(obj.cost_functions,2);
+-			data=obj.cost_functions;
+-			pos=find(obj.cost_functions==101); data(pos)=SurfaceAbsVelMisfitEnum();
+-			pos=find(obj.cost_functions==102); data(pos)=SurfaceRelVelMisfitEnum();
+-			pos=find(obj.cost_functions==103); data(pos)=SurfaceLogVelMisfitEnum();
+-			pos=find(obj.cost_functions==104); data(pos)=SurfaceLogVxVyMisfitEnum();
+-			pos=find(obj.cost_functions==105); data(pos)=SurfaceAverageVelMisfitEnum();
+-			pos=find(obj.cost_functions==201); data(pos)=ThicknessAbsMisfitEnum();
+-			pos=find(obj.cost_functions==501); data(pos)=DragCoefficientAbsGradientEnum();
+-			pos=find(obj.cost_functions==502); data(pos)=RheologyBbarAbsGradientEnum();
+-			pos=find(obj.cost_functions==503); data(pos)=ThicknessAbsGradientEnum();
+-			pos=find(obj.cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
+-			pos=find(obj.cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
+-			pos=find(obj.cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
+-			pos=find(obj.cost_functions==507); data(pos)=Balancethickness2MisfitEnum();
++			data=marshallcostfunctions(obj.cost_functions);
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/inversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversion.m	(revision 18993)
++++ ../trunk-jpl/src/m/classes/inversion.m	(revision 18994)
+@@ -135,7 +135,7 @@
+ 			md = checkfield(md,'fieldname','inversion.nsteps','numel',1,'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.maxiter_per_step','size',[md.inversion.nsteps 1],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.step_threshold','size',[md.inversion.nsteps 1]);
+-			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:507 601:604]);
++			md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',supportedcostfunctions());
+ 			md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0);
+ 			md = checkfield(md,'fieldname','inversion.gradient_scaling','size',[md.inversion.nsteps num_controls]);
+ 			md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);
+@@ -226,21 +226,7 @@
+ 
+ 			%process cost functions
+ 			num_cost_functions=size(obj.cost_functions,2);
+-			data=obj.cost_functions;
+-			pos=find(obj.cost_functions==101); data(pos)=SurfaceAbsVelMisfitEnum();
+-			pos=find(obj.cost_functions==102); data(pos)=SurfaceRelVelMisfitEnum();
+-			pos=find(obj.cost_functions==103); data(pos)=SurfaceLogVelMisfitEnum();
+-			pos=find(obj.cost_functions==104); data(pos)=SurfaceLogVxVyMisfitEnum();
+-			pos=find(obj.cost_functions==105); data(pos)=SurfaceAverageVelMisfitEnum();
+-			pos=find(obj.cost_functions==201); data(pos)=ThicknessAbsMisfitEnum();
+-			pos=find(obj.cost_functions==501); data(pos)=DragCoefficientAbsGradientEnum();
+-			pos=find(obj.cost_functions==502); data(pos)=RheologyBbarAbsGradientEnum();
+-			pos=find(obj.cost_functions==503); data(pos)=ThicknessAbsGradientEnum();
+-			pos=find(obj.cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
+-			pos=find(obj.cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
+-			pos=find(obj.cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
+-			pos=find(obj.cost_functions==507); data(pos)=RheologyBAbsGradientEnum();
+-			pos=find(obj.cost_functions==601); data(pos)=SurfaceAbsMisfitEnum();
++			data=marshallcostfunctions(obj.cost_functions);
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+ 		end % }}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-18994-18995.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18994-18995.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18994-18995.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/test/NightlyRun/test511.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test511.py	(revision 18994)
++++ ../trunk-jpl/test/NightlyRun/test511.py	(revision 18995)
+@@ -33,7 +33,7 @@
+ md.inversion.vx_obs=md.initialization.vx
+ md.inversion.vy_obs=md.initialization.vy
+ 
+-md.cluster=generic('name',oshostname(),'np',3)
++md.cluster=generic('name',oshostname(),'np',1)
+ md=solve(md,StressbalanceSolutionEnum())
+ 
+ #Fields and tolerances to track changes
Index: /issm/oecreview/Archive/18296-19100/ISSM-18995-18996.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18995-18996.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18995-18996.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 18995)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 18996)
+@@ -97,6 +97,7 @@
+ 		}
+ 
+ 		xDelete<int>(control_type);
++		xDelete<int>(cm_responses);
+ 		xDelete<int>(maxiter);
+ 		xDelete<IssmDouble>(control_scaling_factors);
+ 		iomodel->DeleteData(cm_jump,InversionStepThresholdEnum);
Index: /issm/oecreview/Archive/18296-19100/ISSM-18996-18997.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18996-18997.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18996-18997.diff	(revision 19102)
@@ -0,0 +1,53 @@
+Index: ../trunk-jpl/src/m/exp/expdisp.m
+===================================================================
+--- ../trunk-jpl/src/m/exp/expdisp.m	(revision 18996)
++++ ../trunk-jpl/src/m/exp/expdisp.m	(revision 18997)
+@@ -12,6 +12,7 @@
+ %      - 'linewidth'  : line width (1,2,...)
+ %      - 'multiplier' : coordinate multiplier (10^3 if the plot is in km)
+ %      - 'title'      : do we add contour names to each contour
++%      - 'patch'      : do we want the contour to be filled
+ %
+ %   Example:
+ %      expdisp('Domain.exp','figure',1,'linestyle','--r','linewidth',2,'multiplier',10^3);
+@@ -23,6 +24,7 @@
+ unitmultiplier = getfieldvalue(options,'multiplier',1);
+ linewidth      = getfieldvalue(options,'linewidth',1);
+ linestyle      = getfieldvalue(options,'linestyle','-r');
++ispatch        = getfieldvalue(options,'patch',0);
+ 
+ %read file
+ domain=expread(domainoutline);
+@@ -36,18 +38,21 @@
+ for i=1:length(domain),		
+ 	if domain(i).nods==1
+ 		plot(domain(i).x*unitmultiplier,domain(i).y*unitmultiplier,'o','MarkerEdgeColor','k','MarkerFaceColor','r','MarkerSize',10);
+-	  if exist(options,'title')
++		if exist(options,'title')
+ 			text(domain(i).x*unitmultiplier,domain(i).y*unitmultiplier,domain(i).name,'BackgroundColor',[1. .0 .0]);
+-	  end
++		end
+ 	else
+-		if (isnumeric(linestyle))
+-			plot(domain(i).x*unitmultiplier,domain(i).y*unitmultiplier,'Color',linestyle,'linewidth',linewidth);
++		if ispatch,
++			patch(domain(i).x*unitmultiplier,domain(i).y*unitmultiplier,linestyle);
+ 		else
+-			plot(domain(i).x*unitmultiplier,domain(i).y*unitmultiplier,linestyle,'linewidth',linewidth);
+-	  end
+-	  if exist(options,'title')
+-		  text(domain(i).x(1)*unitmultiplier,domain(i).y(1)*unitmultiplier,domain(i).name,'BackgroundColor',[.7 .9 .7]);
+-	  end
+-  end
++			if (isnumeric(linestyle))
++				plot(domain(i).x*unitmultiplier,domain(i).y*unitmultiplier,'Color',linestyle,'linewidth',linewidth);
++			else
++				plot(domain(i).x*unitmultiplier,domain(i).y*unitmultiplier,linestyle,'linewidth',linewidth);
++			end
++		end
++		if exist(options,'title')
++			text(domain(i).x(1)*unitmultiplier,domain(i).y(1)*unitmultiplier,domain(i).name,'BackgroundColor',[.7 .9 .7]);
++		end
++	end
+ end
+-
Index: /issm/oecreview/Archive/18296-19100/ISSM-18997-18998.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18997-18998.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18997-18998.diff	(revision 19102)
@@ -0,0 +1,1541 @@
+Index: ../trunk-jpl/src/m/enum/Outputdefinition70Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition70Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition70Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition70Enum()
++%OUTPUTDEFINITION70ENUM - Enum of Outputdefinition70
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition70Enum()
++
++macro=StringToEnum('Outputdefinition70');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition17Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition17Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition17Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition17Enum()
++%OUTPUTDEFINITION17ENUM - Enum of Outputdefinition17
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition17Enum()
++
++macro=StringToEnum('Outputdefinition17');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition93Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition93Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition93Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition93Enum()
++%OUTPUTDEFINITION93ENUM - Enum of Outputdefinition93
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition93Enum()
++
++macro=StringToEnum('Outputdefinition93');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition26Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition26Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition26Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition26Enum()
++%OUTPUTDEFINITION26ENUM - Enum of Outputdefinition26
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition26Enum()
++
++macro=StringToEnum('Outputdefinition26');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition49Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition49Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition49Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition49Enum()
++%OUTPUTDEFINITION49ENUM - Enum of Outputdefinition49
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition49Enum()
++
++macro=StringToEnum('Outputdefinition49');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition12Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition12Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition12Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition12Enum()
++%OUTPUTDEFINITION12ENUM - Enum of Outputdefinition12
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition12Enum()
++
++macro=StringToEnum('Outputdefinition12');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition35Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition35Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition35Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition35Enum()
++%OUTPUTDEFINITION35ENUM - Enum of Outputdefinition35
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition35Enum()
++
++macro=StringToEnum('Outputdefinition35');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition58Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition58Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition58Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition58Enum()
++%OUTPUTDEFINITION58ENUM - Enum of Outputdefinition58
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition58Enum()
++
++macro=StringToEnum('Outputdefinition58');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition21Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition21Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition21Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition21Enum()
++%OUTPUTDEFINITION21ENUM - Enum of Outputdefinition21
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition21Enum()
++
++macro=StringToEnum('Outputdefinition21');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition44Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition44Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition44Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition44Enum()
++%OUTPUTDEFINITION44ENUM - Enum of Outputdefinition44
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition44Enum()
++
++macro=StringToEnum('Outputdefinition44');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition67Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition67Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition67Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition67Enum()
++%OUTPUTDEFINITION67ENUM - Enum of Outputdefinition67
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition67Enum()
++
++macro=StringToEnum('Outputdefinition67');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition30Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition30Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition30Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition30Enum()
++%OUTPUTDEFINITION30ENUM - Enum of Outputdefinition30
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition30Enum()
++
++macro=StringToEnum('Outputdefinition30');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition53Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition53Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition53Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition53Enum()
++%OUTPUTDEFINITION53ENUM - Enum of Outputdefinition53
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition53Enum()
++
++macro=StringToEnum('Outputdefinition53');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition76Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition76Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition76Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition76Enum()
++%OUTPUTDEFINITION76ENUM - Enum of Outputdefinition76
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition76Enum()
++
++macro=StringToEnum('Outputdefinition76');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition99Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition99Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition99Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition99Enum()
++%OUTPUTDEFINITION99ENUM - Enum of Outputdefinition99
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition99Enum()
++
++macro=StringToEnum('Outputdefinition99');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition62Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition62Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition62Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition62Enum()
++%OUTPUTDEFINITION62ENUM - Enum of Outputdefinition62
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition62Enum()
++
++macro=StringToEnum('Outputdefinition62');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition85Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition85Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition85Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition85Enum()
++%OUTPUTDEFINITION85ENUM - Enum of Outputdefinition85
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition85Enum()
++
++macro=StringToEnum('Outputdefinition85');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition71Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition71Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition71Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition71Enum()
++%OUTPUTDEFINITION71ENUM - Enum of Outputdefinition71
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition71Enum()
++
++macro=StringToEnum('Outputdefinition71');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition18Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition18Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition18Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition18Enum()
++%OUTPUTDEFINITION18ENUM - Enum of Outputdefinition18
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition18Enum()
++
++macro=StringToEnum('Outputdefinition18');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition94Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition94Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition94Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition94Enum()
++%OUTPUTDEFINITION94ENUM - Enum of Outputdefinition94
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition94Enum()
++
++macro=StringToEnum('Outputdefinition94');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition80Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition80Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition80Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition80Enum()
++%OUTPUTDEFINITION80ENUM - Enum of Outputdefinition80
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition80Enum()
++
++macro=StringToEnum('Outputdefinition80');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition27Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition27Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition27Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition27Enum()
++%OUTPUTDEFINITION27ENUM - Enum of Outputdefinition27
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition27Enum()
++
++macro=StringToEnum('Outputdefinition27');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition13Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition13Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition13Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition13Enum()
++%OUTPUTDEFINITION13ENUM - Enum of Outputdefinition13
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition13Enum()
++
++macro=StringToEnum('Outputdefinition13');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition36Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition36Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition36Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition36Enum()
++%OUTPUTDEFINITION36ENUM - Enum of Outputdefinition36
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition36Enum()
++
++macro=StringToEnum('Outputdefinition36');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition59Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition59Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition59Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition59Enum()
++%OUTPUTDEFINITION59ENUM - Enum of Outputdefinition59
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition59Enum()
++
++macro=StringToEnum('Outputdefinition59');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition22Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition22Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition22Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition22Enum()
++%OUTPUTDEFINITION22ENUM - Enum of Outputdefinition22
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition22Enum()
++
++macro=StringToEnum('Outputdefinition22');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition45Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition45Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition45Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition45Enum()
++%OUTPUTDEFINITION45ENUM - Enum of Outputdefinition45
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition45Enum()
++
++macro=StringToEnum('Outputdefinition45');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition68Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition68Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition68Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition68Enum()
++%OUTPUTDEFINITION68ENUM - Enum of Outputdefinition68
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition68Enum()
++
++macro=StringToEnum('Outputdefinition68');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition31Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition31Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition31Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition31Enum()
++%OUTPUTDEFINITION31ENUM - Enum of Outputdefinition31
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition31Enum()
++
++macro=StringToEnum('Outputdefinition31');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition54Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition54Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition54Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition54Enum()
++%OUTPUTDEFINITION54ENUM - Enum of Outputdefinition54
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition54Enum()
++
++macro=StringToEnum('Outputdefinition54');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition77Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition77Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition77Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition77Enum()
++%OUTPUTDEFINITION77ENUM - Enum of Outputdefinition77
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition77Enum()
++
++macro=StringToEnum('Outputdefinition77');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition40Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition40Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition40Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition40Enum()
++%OUTPUTDEFINITION40ENUM - Enum of Outputdefinition40
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition40Enum()
++
++macro=StringToEnum('Outputdefinition40');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition63Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition63Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition63Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition63Enum()
++%OUTPUTDEFINITION63ENUM - Enum of Outputdefinition63
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition63Enum()
++
++macro=StringToEnum('Outputdefinition63');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition86Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition86Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition86Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition86Enum()
++%OUTPUTDEFINITION86ENUM - Enum of Outputdefinition86
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition86Enum()
++
++macro=StringToEnum('Outputdefinition86');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition72Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition72Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition72Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition72Enum()
++%OUTPUTDEFINITION72ENUM - Enum of Outputdefinition72
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition72Enum()
++
++macro=StringToEnum('Outputdefinition72');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition19Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition19Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition19Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition19Enum()
++%OUTPUTDEFINITION19ENUM - Enum of Outputdefinition19
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition19Enum()
++
++macro=StringToEnum('Outputdefinition19');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition95Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition95Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition95Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition95Enum()
++%OUTPUTDEFINITION95ENUM - Enum of Outputdefinition95
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition95Enum()
++
++macro=StringToEnum('Outputdefinition95');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition81Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition81Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition81Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition81Enum()
++%OUTPUTDEFINITION81ENUM - Enum of Outputdefinition81
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition81Enum()
++
++macro=StringToEnum('Outputdefinition81');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition28Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition28Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition28Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition28Enum()
++%OUTPUTDEFINITION28ENUM - Enum of Outputdefinition28
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition28Enum()
++
++macro=StringToEnum('Outputdefinition28');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition14Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition14Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition14Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition14Enum()
++%OUTPUTDEFINITION14ENUM - Enum of Outputdefinition14
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition14Enum()
++
++macro=StringToEnum('Outputdefinition14');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition90Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition90Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition90Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition90Enum()
++%OUTPUTDEFINITION90ENUM - Enum of Outputdefinition90
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition90Enum()
++
++macro=StringToEnum('Outputdefinition90');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition37Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition37Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition37Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition37Enum()
++%OUTPUTDEFINITION37ENUM - Enum of Outputdefinition37
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition37Enum()
++
++macro=StringToEnum('Outputdefinition37');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition23Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition23Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition23Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition23Enum()
++%OUTPUTDEFINITION23ENUM - Enum of Outputdefinition23
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition23Enum()
++
++macro=StringToEnum('Outputdefinition23');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition46Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition46Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition46Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition46Enum()
++%OUTPUTDEFINITION46ENUM - Enum of Outputdefinition46
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition46Enum()
++
++macro=StringToEnum('Outputdefinition46');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition69Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition69Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition69Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition69Enum()
++%OUTPUTDEFINITION69ENUM - Enum of Outputdefinition69
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition69Enum()
++
++macro=StringToEnum('Outputdefinition69');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition32Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition32Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition32Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition32Enum()
++%OUTPUTDEFINITION32ENUM - Enum of Outputdefinition32
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition32Enum()
++
++macro=StringToEnum('Outputdefinition32');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition55Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition55Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition55Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition55Enum()
++%OUTPUTDEFINITION55ENUM - Enum of Outputdefinition55
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition55Enum()
++
++macro=StringToEnum('Outputdefinition55');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition78Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition78Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition78Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition78Enum()
++%OUTPUTDEFINITION78ENUM - Enum of Outputdefinition78
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition78Enum()
++
++macro=StringToEnum('Outputdefinition78');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition41Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition41Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition41Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition41Enum()
++%OUTPUTDEFINITION41ENUM - Enum of Outputdefinition41
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition41Enum()
++
++macro=StringToEnum('Outputdefinition41');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition64Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition64Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition64Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition64Enum()
++%OUTPUTDEFINITION64ENUM - Enum of Outputdefinition64
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition64Enum()
++
++macro=StringToEnum('Outputdefinition64');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition87Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition87Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition87Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition87Enum()
++%OUTPUTDEFINITION87ENUM - Enum of Outputdefinition87
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition87Enum()
++
++macro=StringToEnum('Outputdefinition87');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition50Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition50Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition50Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition50Enum()
++%OUTPUTDEFINITION50ENUM - Enum of Outputdefinition50
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition50Enum()
++
++macro=StringToEnum('Outputdefinition50');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition73Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition73Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition73Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition73Enum()
++%OUTPUTDEFINITION73ENUM - Enum of Outputdefinition73
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition73Enum()
++
++macro=StringToEnum('Outputdefinition73');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition96Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition96Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition96Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition96Enum()
++%OUTPUTDEFINITION96ENUM - Enum of Outputdefinition96
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition96Enum()
++
++macro=StringToEnum('Outputdefinition96');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition100Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition100Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition100Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition100Enum()
++%OUTPUTDEFINITION100ENUM - Enum of Outputdefinition100
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition100Enum()
++
++macro=StringToEnum('Outputdefinition100');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition82Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition82Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition82Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition82Enum()
++%OUTPUTDEFINITION82ENUM - Enum of Outputdefinition82
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition82Enum()
++
++macro=StringToEnum('Outputdefinition82');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition29Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition29Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition29Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition29Enum()
++%OUTPUTDEFINITION29ENUM - Enum of Outputdefinition29
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition29Enum()
++
++macro=StringToEnum('Outputdefinition29');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition15Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition15Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition15Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition15Enum()
++%OUTPUTDEFINITION15ENUM - Enum of Outputdefinition15
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition15Enum()
++
++macro=StringToEnum('Outputdefinition15');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition91Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition91Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition91Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition91Enum()
++%OUTPUTDEFINITION91ENUM - Enum of Outputdefinition91
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition91Enum()
++
++macro=StringToEnum('Outputdefinition91');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition38Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition38Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition38Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition38Enum()
++%OUTPUTDEFINITION38ENUM - Enum of Outputdefinition38
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition38Enum()
++
++macro=StringToEnum('Outputdefinition38');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition24Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition24Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition24Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition24Enum()
++%OUTPUTDEFINITION24ENUM - Enum of Outputdefinition24
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition24Enum()
++
++macro=StringToEnum('Outputdefinition24');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition47Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition47Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition47Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition47Enum()
++%OUTPUTDEFINITION47ENUM - Enum of Outputdefinition47
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition47Enum()
++
++macro=StringToEnum('Outputdefinition47');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition33Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition33Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition33Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition33Enum()
++%OUTPUTDEFINITION33ENUM - Enum of Outputdefinition33
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition33Enum()
++
++macro=StringToEnum('Outputdefinition33');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition56Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition56Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition56Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition56Enum()
++%OUTPUTDEFINITION56ENUM - Enum of Outputdefinition56
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition56Enum()
++
++macro=StringToEnum('Outputdefinition56');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition79Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition79Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition79Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition79Enum()
++%OUTPUTDEFINITION79ENUM - Enum of Outputdefinition79
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition79Enum()
++
++macro=StringToEnum('Outputdefinition79');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition42Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition42Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition42Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition42Enum()
++%OUTPUTDEFINITION42ENUM - Enum of Outputdefinition42
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition42Enum()
++
++macro=StringToEnum('Outputdefinition42');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition65Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition65Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition65Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition65Enum()
++%OUTPUTDEFINITION65ENUM - Enum of Outputdefinition65
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition65Enum()
++
++macro=StringToEnum('Outputdefinition65');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition88Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition88Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition88Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition88Enum()
++%OUTPUTDEFINITION88ENUM - Enum of Outputdefinition88
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition88Enum()
++
++macro=StringToEnum('Outputdefinition88');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition51Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition51Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition51Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition51Enum()
++%OUTPUTDEFINITION51ENUM - Enum of Outputdefinition51
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition51Enum()
++
++macro=StringToEnum('Outputdefinition51');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition74Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition74Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition74Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition74Enum()
++%OUTPUTDEFINITION74ENUM - Enum of Outputdefinition74
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition74Enum()
++
++macro=StringToEnum('Outputdefinition74');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition97Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition97Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition97Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition97Enum()
++%OUTPUTDEFINITION97ENUM - Enum of Outputdefinition97
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition97Enum()
++
++macro=StringToEnum('Outputdefinition97');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition60Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition60Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition60Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition60Enum()
++%OUTPUTDEFINITION60ENUM - Enum of Outputdefinition60
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition60Enum()
++
++macro=StringToEnum('Outputdefinition60');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition83Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition83Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition83Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition83Enum()
++%OUTPUTDEFINITION83ENUM - Enum of Outputdefinition83
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition83Enum()
++
++macro=StringToEnum('Outputdefinition83');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition16Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition16Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition16Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition16Enum()
++%OUTPUTDEFINITION16ENUM - Enum of Outputdefinition16
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition16Enum()
++
++macro=StringToEnum('Outputdefinition16');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition92Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition92Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition92Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition92Enum()
++%OUTPUTDEFINITION92ENUM - Enum of Outputdefinition92
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition92Enum()
++
++macro=StringToEnum('Outputdefinition92');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition39Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition39Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition39Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition39Enum()
++%OUTPUTDEFINITION39ENUM - Enum of Outputdefinition39
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition39Enum()
++
++macro=StringToEnum('Outputdefinition39');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18997)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 18998)
+@@ -665,6 +665,96 @@
+ def Outputdefinition8Enum(): return StringToEnum("Outputdefinition8")[0]
+ def Outputdefinition9Enum(): return StringToEnum("Outputdefinition9")[0]
+ def Outputdefinition10Enum(): return StringToEnum("Outputdefinition10")[0]
++def Outputdefinition11Enum(): return StringToEnum("Outputdefinition11")[0]
++def Outputdefinition12Enum(): return StringToEnum("Outputdefinition12")[0]
++def Outputdefinition13Enum(): return StringToEnum("Outputdefinition13")[0]
++def Outputdefinition14Enum(): return StringToEnum("Outputdefinition14")[0]
++def Outputdefinition15Enum(): return StringToEnum("Outputdefinition15")[0]
++def Outputdefinition16Enum(): return StringToEnum("Outputdefinition16")[0]
++def Outputdefinition17Enum(): return StringToEnum("Outputdefinition17")[0]
++def Outputdefinition18Enum(): return StringToEnum("Outputdefinition18")[0]
++def Outputdefinition19Enum(): return StringToEnum("Outputdefinition19")[0]
++def Outputdefinition20Enum(): return StringToEnum("Outputdefinition20")[0]
++def Outputdefinition21Enum(): return StringToEnum("Outputdefinition21")[0]
++def Outputdefinition22Enum(): return StringToEnum("Outputdefinition22")[0]
++def Outputdefinition23Enum(): return StringToEnum("Outputdefinition23")[0]
++def Outputdefinition24Enum(): return StringToEnum("Outputdefinition24")[0]
++def Outputdefinition25Enum(): return StringToEnum("Outputdefinition25")[0]
++def Outputdefinition26Enum(): return StringToEnum("Outputdefinition26")[0]
++def Outputdefinition27Enum(): return StringToEnum("Outputdefinition27")[0]
++def Outputdefinition28Enum(): return StringToEnum("Outputdefinition28")[0]
++def Outputdefinition29Enum(): return StringToEnum("Outputdefinition29")[0]
++def Outputdefinition30Enum(): return StringToEnum("Outputdefinition30")[0]
++def Outputdefinition31Enum(): return StringToEnum("Outputdefinition31")[0]
++def Outputdefinition32Enum(): return StringToEnum("Outputdefinition32")[0]
++def Outputdefinition33Enum(): return StringToEnum("Outputdefinition33")[0]
++def Outputdefinition34Enum(): return StringToEnum("Outputdefinition34")[0]
++def Outputdefinition35Enum(): return StringToEnum("Outputdefinition35")[0]
++def Outputdefinition36Enum(): return StringToEnum("Outputdefinition36")[0]
++def Outputdefinition37Enum(): return StringToEnum("Outputdefinition37")[0]
++def Outputdefinition38Enum(): return StringToEnum("Outputdefinition38")[0]
++def Outputdefinition39Enum(): return StringToEnum("Outputdefinition39")[0]
++def Outputdefinition40Enum(): return StringToEnum("Outputdefinition40")[0]
++def Outputdefinition41Enum(): return StringToEnum("Outputdefinition41")[0]
++def Outputdefinition42Enum(): return StringToEnum("Outputdefinition42")[0]
++def Outputdefinition43Enum(): return StringToEnum("Outputdefinition43")[0]
++def Outputdefinition44Enum(): return StringToEnum("Outputdefinition44")[0]
++def Outputdefinition45Enum(): return StringToEnum("Outputdefinition45")[0]
++def Outputdefinition46Enum(): return StringToEnum("Outputdefinition46")[0]
++def Outputdefinition47Enum(): return StringToEnum("Outputdefinition47")[0]
++def Outputdefinition48Enum(): return StringToEnum("Outputdefinition48")[0]
++def Outputdefinition49Enum(): return StringToEnum("Outputdefinition49")[0]
++def Outputdefinition50Enum(): return StringToEnum("Outputdefinition50")[0]
++def Outputdefinition51Enum(): return StringToEnum("Outputdefinition51")[0]
++def Outputdefinition52Enum(): return StringToEnum("Outputdefinition52")[0]
++def Outputdefinition53Enum(): return StringToEnum("Outputdefinition53")[0]
++def Outputdefinition54Enum(): return StringToEnum("Outputdefinition54")[0]
++def Outputdefinition55Enum(): return StringToEnum("Outputdefinition55")[0]
++def Outputdefinition56Enum(): return StringToEnum("Outputdefinition56")[0]
++def Outputdefinition57Enum(): return StringToEnum("Outputdefinition57")[0]
++def Outputdefinition58Enum(): return StringToEnum("Outputdefinition58")[0]
++def Outputdefinition59Enum(): return StringToEnum("Outputdefinition59")[0]
++def Outputdefinition60Enum(): return StringToEnum("Outputdefinition60")[0]
++def Outputdefinition61Enum(): return StringToEnum("Outputdefinition61")[0]
++def Outputdefinition62Enum(): return StringToEnum("Outputdefinition62")[0]
++def Outputdefinition63Enum(): return StringToEnum("Outputdefinition63")[0]
++def Outputdefinition64Enum(): return StringToEnum("Outputdefinition64")[0]
++def Outputdefinition65Enum(): return StringToEnum("Outputdefinition65")[0]
++def Outputdefinition66Enum(): return StringToEnum("Outputdefinition66")[0]
++def Outputdefinition67Enum(): return StringToEnum("Outputdefinition67")[0]
++def Outputdefinition68Enum(): return StringToEnum("Outputdefinition68")[0]
++def Outputdefinition69Enum(): return StringToEnum("Outputdefinition69")[0]
++def Outputdefinition70Enum(): return StringToEnum("Outputdefinition70")[0]
++def Outputdefinition71Enum(): return StringToEnum("Outputdefinition71")[0]
++def Outputdefinition72Enum(): return StringToEnum("Outputdefinition72")[0]
++def Outputdefinition73Enum(): return StringToEnum("Outputdefinition73")[0]
++def Outputdefinition74Enum(): return StringToEnum("Outputdefinition74")[0]
++def Outputdefinition75Enum(): return StringToEnum("Outputdefinition75")[0]
++def Outputdefinition76Enum(): return StringToEnum("Outputdefinition76")[0]
++def Outputdefinition77Enum(): return StringToEnum("Outputdefinition77")[0]
++def Outputdefinition78Enum(): return StringToEnum("Outputdefinition78")[0]
++def Outputdefinition79Enum(): return StringToEnum("Outputdefinition79")[0]
++def Outputdefinition80Enum(): return StringToEnum("Outputdefinition80")[0]
++def Outputdefinition81Enum(): return StringToEnum("Outputdefinition81")[0]
++def Outputdefinition82Enum(): return StringToEnum("Outputdefinition82")[0]
++def Outputdefinition83Enum(): return StringToEnum("Outputdefinition83")[0]
++def Outputdefinition84Enum(): return StringToEnum("Outputdefinition84")[0]
++def Outputdefinition85Enum(): return StringToEnum("Outputdefinition85")[0]
++def Outputdefinition86Enum(): return StringToEnum("Outputdefinition86")[0]
++def Outputdefinition87Enum(): return StringToEnum("Outputdefinition87")[0]
++def Outputdefinition88Enum(): return StringToEnum("Outputdefinition88")[0]
++def Outputdefinition89Enum(): return StringToEnum("Outputdefinition89")[0]
++def Outputdefinition90Enum(): return StringToEnum("Outputdefinition90")[0]
++def Outputdefinition91Enum(): return StringToEnum("Outputdefinition91")[0]
++def Outputdefinition92Enum(): return StringToEnum("Outputdefinition92")[0]
++def Outputdefinition93Enum(): return StringToEnum("Outputdefinition93")[0]
++def Outputdefinition94Enum(): return StringToEnum("Outputdefinition94")[0]
++def Outputdefinition95Enum(): return StringToEnum("Outputdefinition95")[0]
++def Outputdefinition96Enum(): return StringToEnum("Outputdefinition96")[0]
++def Outputdefinition97Enum(): return StringToEnum("Outputdefinition97")[0]
++def Outputdefinition98Enum(): return StringToEnum("Outputdefinition98")[0]
++def Outputdefinition99Enum(): return StringToEnum("Outputdefinition99")[0]
++def Outputdefinition100Enum(): return StringToEnum("Outputdefinition100")[0]
+ def OutputdefinitionListEnum(): return StringToEnum("OutputdefinitionList")[0]
+ def MassfluxatgateEnum(): return StringToEnum("Massfluxatgate")[0]
+ def MassfluxatgateNameEnum(): return StringToEnum("MassfluxatgateName")[0]
+Index: ../trunk-jpl/src/m/enum/Outputdefinition25Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition25Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition25Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition25Enum()
++%OUTPUTDEFINITION25ENUM - Enum of Outputdefinition25
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition25Enum()
++
++macro=StringToEnum('Outputdefinition25');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition48Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition48Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition48Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition48Enum()
++%OUTPUTDEFINITION48ENUM - Enum of Outputdefinition48
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition48Enum()
++
++macro=StringToEnum('Outputdefinition48');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition11Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition11Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition11Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition11Enum()
++%OUTPUTDEFINITION11ENUM - Enum of Outputdefinition11
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition11Enum()
++
++macro=StringToEnum('Outputdefinition11');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition34Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition34Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition34Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition34Enum()
++%OUTPUTDEFINITION34ENUM - Enum of Outputdefinition34
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition34Enum()
++
++macro=StringToEnum('Outputdefinition34');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition57Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition57Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition57Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition57Enum()
++%OUTPUTDEFINITION57ENUM - Enum of Outputdefinition57
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition57Enum()
++
++macro=StringToEnum('Outputdefinition57');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition20Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition20Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition20Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition20Enum()
++%OUTPUTDEFINITION20ENUM - Enum of Outputdefinition20
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition20Enum()
++
++macro=StringToEnum('Outputdefinition20');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition43Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition43Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition43Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition43Enum()
++%OUTPUTDEFINITION43ENUM - Enum of Outputdefinition43
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition43Enum()
++
++macro=StringToEnum('Outputdefinition43');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition66Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition66Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition66Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition66Enum()
++%OUTPUTDEFINITION66ENUM - Enum of Outputdefinition66
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition66Enum()
++
++macro=StringToEnum('Outputdefinition66');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition89Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition89Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition89Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition89Enum()
++%OUTPUTDEFINITION89ENUM - Enum of Outputdefinition89
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition89Enum()
++
++macro=StringToEnum('Outputdefinition89');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition52Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition52Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition52Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition52Enum()
++%OUTPUTDEFINITION52ENUM - Enum of Outputdefinition52
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition52Enum()
++
++macro=StringToEnum('Outputdefinition52');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition75Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition75Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition75Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition75Enum()
++%OUTPUTDEFINITION75ENUM - Enum of Outputdefinition75
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition75Enum()
++
++macro=StringToEnum('Outputdefinition75');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition98Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition98Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition98Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition98Enum()
++%OUTPUTDEFINITION98ENUM - Enum of Outputdefinition98
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition98Enum()
++
++macro=StringToEnum('Outputdefinition98');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition61Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition61Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition61Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition61Enum()
++%OUTPUTDEFINITION61ENUM - Enum of Outputdefinition61
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition61Enum()
++
++macro=StringToEnum('Outputdefinition61');
+Index: ../trunk-jpl/src/m/enum/Outputdefinition84Enum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/Outputdefinition84Enum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/Outputdefinition84Enum.m	(revision 18998)
+@@ -0,0 +1,11 @@
++function macro=Outputdefinition84Enum()
++%OUTPUTDEFINITION84ENUM - Enum of Outputdefinition84
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=Outputdefinition84Enum()
++
++macro=StringToEnum('Outputdefinition84');
Index: /issm/oecreview/Archive/18296-19100/ISSM-18998-18999.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18998-18999.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18998-18999.diff	(revision 19102)
@@ -0,0 +1,339 @@
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18998)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18999)
+@@ -688,6 +688,96 @@
+ 	Outputdefinition8Enum,
+ 	Outputdefinition9Enum,
+ 	Outputdefinition10Enum,
++	Outputdefinition11Enum,
++	Outputdefinition12Enum,
++	Outputdefinition13Enum,
++	Outputdefinition14Enum,
++	Outputdefinition15Enum,
++	Outputdefinition16Enum,
++	Outputdefinition17Enum,
++	Outputdefinition18Enum,
++	Outputdefinition19Enum,
++	Outputdefinition20Enum,
++	Outputdefinition21Enum,
++	Outputdefinition22Enum,
++	Outputdefinition23Enum,
++	Outputdefinition24Enum,
++	Outputdefinition25Enum,
++	Outputdefinition26Enum,
++	Outputdefinition27Enum,
++	Outputdefinition28Enum,
++	Outputdefinition29Enum,
++	Outputdefinition30Enum,
++	Outputdefinition31Enum,
++	Outputdefinition32Enum,
++	Outputdefinition33Enum,
++	Outputdefinition34Enum,
++	Outputdefinition35Enum,
++	Outputdefinition36Enum,
++	Outputdefinition37Enum,
++	Outputdefinition38Enum,
++	Outputdefinition39Enum,
++	Outputdefinition40Enum,
++	Outputdefinition41Enum,
++	Outputdefinition42Enum,
++	Outputdefinition43Enum,
++	Outputdefinition44Enum,
++	Outputdefinition45Enum,
++	Outputdefinition46Enum,
++	Outputdefinition47Enum,
++	Outputdefinition48Enum,
++	Outputdefinition49Enum,
++	Outputdefinition50Enum,
++	Outputdefinition51Enum,
++	Outputdefinition52Enum,
++	Outputdefinition53Enum,
++	Outputdefinition54Enum,
++	Outputdefinition55Enum,
++	Outputdefinition56Enum,
++	Outputdefinition57Enum,
++	Outputdefinition58Enum,
++	Outputdefinition59Enum,
++	Outputdefinition60Enum,
++	Outputdefinition61Enum,
++	Outputdefinition62Enum,
++	Outputdefinition63Enum,
++	Outputdefinition64Enum,
++	Outputdefinition65Enum,
++	Outputdefinition66Enum,
++	Outputdefinition67Enum,
++	Outputdefinition68Enum,
++	Outputdefinition69Enum,
++	Outputdefinition70Enum,
++	Outputdefinition71Enum,
++	Outputdefinition72Enum,
++	Outputdefinition73Enum,
++	Outputdefinition74Enum,
++	Outputdefinition75Enum,
++	Outputdefinition76Enum,
++	Outputdefinition77Enum,
++	Outputdefinition78Enum,
++	Outputdefinition79Enum,
++	Outputdefinition80Enum,
++	Outputdefinition81Enum,
++	Outputdefinition82Enum,
++	Outputdefinition83Enum,
++	Outputdefinition84Enum,
++	Outputdefinition85Enum,
++	Outputdefinition86Enum,
++	Outputdefinition87Enum,
++	Outputdefinition88Enum,
++	Outputdefinition89Enum,
++	Outputdefinition90Enum,
++	Outputdefinition91Enum,
++	Outputdefinition92Enum,
++	Outputdefinition93Enum,
++	Outputdefinition94Enum,
++	Outputdefinition95Enum,
++	Outputdefinition96Enum,
++	Outputdefinition97Enum,
++	Outputdefinition98Enum,
++	Outputdefinition99Enum,
++	Outputdefinition100Enum,   
+ 	OutputdefinitionListEnum,
+ 	MassfluxatgateEnum,
+ 	MassfluxatgateNameEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18998)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18999)
+@@ -673,6 +673,96 @@
+ 		case Outputdefinition8Enum : return "Outputdefinition8";
+ 		case Outputdefinition9Enum : return "Outputdefinition9";
+ 		case Outputdefinition10Enum : return "Outputdefinition10";
++		case Outputdefinition11Enum : return "Outputdefinition11";
++		case Outputdefinition12Enum : return "Outputdefinition12";
++		case Outputdefinition13Enum : return "Outputdefinition13";
++		case Outputdefinition14Enum : return "Outputdefinition14";
++		case Outputdefinition15Enum : return "Outputdefinition15";
++		case Outputdefinition16Enum : return "Outputdefinition16";
++		case Outputdefinition17Enum : return "Outputdefinition17";
++		case Outputdefinition18Enum : return "Outputdefinition18";
++		case Outputdefinition19Enum : return "Outputdefinition19";
++		case Outputdefinition20Enum : return "Outputdefinition20";
++		case Outputdefinition21Enum : return "Outputdefinition21";
++		case Outputdefinition22Enum : return "Outputdefinition22";
++		case Outputdefinition23Enum : return "Outputdefinition23";
++		case Outputdefinition24Enum : return "Outputdefinition24";
++		case Outputdefinition25Enum : return "Outputdefinition25";
++		case Outputdefinition26Enum : return "Outputdefinition26";
++		case Outputdefinition27Enum : return "Outputdefinition27";
++		case Outputdefinition28Enum : return "Outputdefinition28";
++		case Outputdefinition29Enum : return "Outputdefinition29";
++		case Outputdefinition30Enum : return "Outputdefinition30";
++		case Outputdefinition31Enum : return "Outputdefinition31";
++		case Outputdefinition32Enum : return "Outputdefinition32";
++		case Outputdefinition33Enum : return "Outputdefinition33";
++		case Outputdefinition34Enum : return "Outputdefinition34";
++		case Outputdefinition35Enum : return "Outputdefinition35";
++		case Outputdefinition36Enum : return "Outputdefinition36";
++		case Outputdefinition37Enum : return "Outputdefinition37";
++		case Outputdefinition38Enum : return "Outputdefinition38";
++		case Outputdefinition39Enum : return "Outputdefinition39";
++		case Outputdefinition40Enum : return "Outputdefinition40";
++		case Outputdefinition41Enum : return "Outputdefinition41";
++		case Outputdefinition42Enum : return "Outputdefinition42";
++		case Outputdefinition43Enum : return "Outputdefinition43";
++		case Outputdefinition44Enum : return "Outputdefinition44";
++		case Outputdefinition45Enum : return "Outputdefinition45";
++		case Outputdefinition46Enum : return "Outputdefinition46";
++		case Outputdefinition47Enum : return "Outputdefinition47";
++		case Outputdefinition48Enum : return "Outputdefinition48";
++		case Outputdefinition49Enum : return "Outputdefinition49";
++		case Outputdefinition50Enum : return "Outputdefinition50";
++		case Outputdefinition51Enum : return "Outputdefinition51";
++		case Outputdefinition52Enum : return "Outputdefinition52";
++		case Outputdefinition53Enum : return "Outputdefinition53";
++		case Outputdefinition54Enum : return "Outputdefinition54";
++		case Outputdefinition55Enum : return "Outputdefinition55";
++		case Outputdefinition56Enum : return "Outputdefinition56";
++		case Outputdefinition57Enum : return "Outputdefinition57";
++		case Outputdefinition58Enum : return "Outputdefinition58";
++		case Outputdefinition59Enum : return "Outputdefinition59";
++		case Outputdefinition60Enum : return "Outputdefinition60";
++		case Outputdefinition61Enum : return "Outputdefinition61";
++		case Outputdefinition62Enum : return "Outputdefinition62";
++		case Outputdefinition63Enum : return "Outputdefinition63";
++		case Outputdefinition64Enum : return "Outputdefinition64";
++		case Outputdefinition65Enum : return "Outputdefinition65";
++		case Outputdefinition66Enum : return "Outputdefinition66";
++		case Outputdefinition67Enum : return "Outputdefinition67";
++		case Outputdefinition68Enum : return "Outputdefinition68";
++		case Outputdefinition69Enum : return "Outputdefinition69";
++		case Outputdefinition70Enum : return "Outputdefinition70";
++		case Outputdefinition71Enum : return "Outputdefinition71";
++		case Outputdefinition72Enum : return "Outputdefinition72";
++		case Outputdefinition73Enum : return "Outputdefinition73";
++		case Outputdefinition74Enum : return "Outputdefinition74";
++		case Outputdefinition75Enum : return "Outputdefinition75";
++		case Outputdefinition76Enum : return "Outputdefinition76";
++		case Outputdefinition77Enum : return "Outputdefinition77";
++		case Outputdefinition78Enum : return "Outputdefinition78";
++		case Outputdefinition79Enum : return "Outputdefinition79";
++		case Outputdefinition80Enum : return "Outputdefinition80";
++		case Outputdefinition81Enum : return "Outputdefinition81";
++		case Outputdefinition82Enum : return "Outputdefinition82";
++		case Outputdefinition83Enum : return "Outputdefinition83";
++		case Outputdefinition84Enum : return "Outputdefinition84";
++		case Outputdefinition85Enum : return "Outputdefinition85";
++		case Outputdefinition86Enum : return "Outputdefinition86";
++		case Outputdefinition87Enum : return "Outputdefinition87";
++		case Outputdefinition88Enum : return "Outputdefinition88";
++		case Outputdefinition89Enum : return "Outputdefinition89";
++		case Outputdefinition90Enum : return "Outputdefinition90";
++		case Outputdefinition91Enum : return "Outputdefinition91";
++		case Outputdefinition92Enum : return "Outputdefinition92";
++		case Outputdefinition93Enum : return "Outputdefinition93";
++		case Outputdefinition94Enum : return "Outputdefinition94";
++		case Outputdefinition95Enum : return "Outputdefinition95";
++		case Outputdefinition96Enum : return "Outputdefinition96";
++		case Outputdefinition97Enum : return "Outputdefinition97";
++		case Outputdefinition98Enum : return "Outputdefinition98";
++		case Outputdefinition99Enum : return "Outputdefinition99";
++		case Outputdefinition100Enum : return "Outputdefinition100";
+ 		case OutputdefinitionListEnum : return "OutputdefinitionList";
+ 		case MassfluxatgateEnum : return "Massfluxatgate";
+ 		case MassfluxatgateNameEnum : return "MassfluxatgateName";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18998)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18999)
+@@ -688,6 +688,99 @@
+ 	      else if (strcmp(name,"Outputdefinition8")==0) return Outputdefinition8Enum;
+ 	      else if (strcmp(name,"Outputdefinition9")==0) return Outputdefinition9Enum;
+ 	      else if (strcmp(name,"Outputdefinition10")==0) return Outputdefinition10Enum;
++	      else if (strcmp(name,"Outputdefinition11")==0) return Outputdefinition11Enum;
++	      else if (strcmp(name,"Outputdefinition12")==0) return Outputdefinition12Enum;
++	      else if (strcmp(name,"Outputdefinition13")==0) return Outputdefinition13Enum;
++	      else if (strcmp(name,"Outputdefinition14")==0) return Outputdefinition14Enum;
++	      else if (strcmp(name,"Outputdefinition15")==0) return Outputdefinition15Enum;
++	      else if (strcmp(name,"Outputdefinition16")==0) return Outputdefinition16Enum;
++	      else if (strcmp(name,"Outputdefinition17")==0) return Outputdefinition17Enum;
++	      else if (strcmp(name,"Outputdefinition18")==0) return Outputdefinition18Enum;
++	      else if (strcmp(name,"Outputdefinition19")==0) return Outputdefinition19Enum;
++	      else if (strcmp(name,"Outputdefinition20")==0) return Outputdefinition20Enum;
++	      else if (strcmp(name,"Outputdefinition21")==0) return Outputdefinition21Enum;
++	      else if (strcmp(name,"Outputdefinition22")==0) return Outputdefinition22Enum;
++	      else if (strcmp(name,"Outputdefinition23")==0) return Outputdefinition23Enum;
++	      else if (strcmp(name,"Outputdefinition24")==0) return Outputdefinition24Enum;
++	      else if (strcmp(name,"Outputdefinition25")==0) return Outputdefinition25Enum;
++	      else if (strcmp(name,"Outputdefinition26")==0) return Outputdefinition26Enum;
++	      else if (strcmp(name,"Outputdefinition27")==0) return Outputdefinition27Enum;
++	      else if (strcmp(name,"Outputdefinition28")==0) return Outputdefinition28Enum;
++	      else if (strcmp(name,"Outputdefinition29")==0) return Outputdefinition29Enum;
++	      else if (strcmp(name,"Outputdefinition30")==0) return Outputdefinition30Enum;
++	      else if (strcmp(name,"Outputdefinition31")==0) return Outputdefinition31Enum;
++	      else if (strcmp(name,"Outputdefinition32")==0) return Outputdefinition32Enum;
++	      else if (strcmp(name,"Outputdefinition33")==0) return Outputdefinition33Enum;
++	      else if (strcmp(name,"Outputdefinition34")==0) return Outputdefinition34Enum;
++	      else if (strcmp(name,"Outputdefinition35")==0) return Outputdefinition35Enum;
++	      else if (strcmp(name,"Outputdefinition36")==0) return Outputdefinition36Enum;
++	      else if (strcmp(name,"Outputdefinition37")==0) return Outputdefinition37Enum;
++	      else if (strcmp(name,"Outputdefinition38")==0) return Outputdefinition38Enum;
++	      else if (strcmp(name,"Outputdefinition39")==0) return Outputdefinition39Enum;
++	      else if (strcmp(name,"Outputdefinition40")==0) return Outputdefinition40Enum;
++	      else if (strcmp(name,"Outputdefinition41")==0) return Outputdefinition41Enum;
++	      else if (strcmp(name,"Outputdefinition42")==0) return Outputdefinition42Enum;
++	      else if (strcmp(name,"Outputdefinition43")==0) return Outputdefinition43Enum;
++	      else if (strcmp(name,"Outputdefinition44")==0) return Outputdefinition44Enum;
++	      else if (strcmp(name,"Outputdefinition45")==0) return Outputdefinition45Enum;
++	      else if (strcmp(name,"Outputdefinition46")==0) return Outputdefinition46Enum;
++	      else if (strcmp(name,"Outputdefinition47")==0) return Outputdefinition47Enum;
++	      else if (strcmp(name,"Outputdefinition48")==0) return Outputdefinition48Enum;
++	      else if (strcmp(name,"Outputdefinition49")==0) return Outputdefinition49Enum;
++	      else if (strcmp(name,"Outputdefinition50")==0) return Outputdefinition50Enum;
++	      else if (strcmp(name,"Outputdefinition51")==0) return Outputdefinition51Enum;
++	      else if (strcmp(name,"Outputdefinition52")==0) return Outputdefinition52Enum;
++	      else if (strcmp(name,"Outputdefinition53")==0) return Outputdefinition53Enum;
++	      else if (strcmp(name,"Outputdefinition54")==0) return Outputdefinition54Enum;
++	      else if (strcmp(name,"Outputdefinition55")==0) return Outputdefinition55Enum;
++	      else if (strcmp(name,"Outputdefinition56")==0) return Outputdefinition56Enum;
++	      else if (strcmp(name,"Outputdefinition57")==0) return Outputdefinition57Enum;
++	      else if (strcmp(name,"Outputdefinition58")==0) return Outputdefinition58Enum;
++	      else if (strcmp(name,"Outputdefinition59")==0) return Outputdefinition59Enum;
++	      else if (strcmp(name,"Outputdefinition60")==0) return Outputdefinition60Enum;
++	      else if (strcmp(name,"Outputdefinition61")==0) return Outputdefinition61Enum;
++	      else if (strcmp(name,"Outputdefinition62")==0) return Outputdefinition62Enum;
++	      else if (strcmp(name,"Outputdefinition63")==0) return Outputdefinition63Enum;
++	      else if (strcmp(name,"Outputdefinition64")==0) return Outputdefinition64Enum;
++	      else if (strcmp(name,"Outputdefinition65")==0) return Outputdefinition65Enum;
++	      else if (strcmp(name,"Outputdefinition66")==0) return Outputdefinition66Enum;
++	      else if (strcmp(name,"Outputdefinition67")==0) return Outputdefinition67Enum;
++	      else if (strcmp(name,"Outputdefinition68")==0) return Outputdefinition68Enum;
++	      else if (strcmp(name,"Outputdefinition69")==0) return Outputdefinition69Enum;
++	      else if (strcmp(name,"Outputdefinition70")==0) return Outputdefinition70Enum;
++	      else if (strcmp(name,"Outputdefinition71")==0) return Outputdefinition71Enum;
++	      else if (strcmp(name,"Outputdefinition72")==0) return Outputdefinition72Enum;
++	      else if (strcmp(name,"Outputdefinition73")==0) return Outputdefinition73Enum;
++         else stage=7;
++   }
++   if(stage==7){
++	      if (strcmp(name,"Outputdefinition74")==0) return Outputdefinition74Enum;
++	      else if (strcmp(name,"Outputdefinition75")==0) return Outputdefinition75Enum;
++	      else if (strcmp(name,"Outputdefinition76")==0) return Outputdefinition76Enum;
++	      else if (strcmp(name,"Outputdefinition77")==0) return Outputdefinition77Enum;
++	      else if (strcmp(name,"Outputdefinition78")==0) return Outputdefinition78Enum;
++	      else if (strcmp(name,"Outputdefinition79")==0) return Outputdefinition79Enum;
++	      else if (strcmp(name,"Outputdefinition80")==0) return Outputdefinition80Enum;
++	      else if (strcmp(name,"Outputdefinition81")==0) return Outputdefinition81Enum;
++	      else if (strcmp(name,"Outputdefinition82")==0) return Outputdefinition82Enum;
++	      else if (strcmp(name,"Outputdefinition83")==0) return Outputdefinition83Enum;
++	      else if (strcmp(name,"Outputdefinition84")==0) return Outputdefinition84Enum;
++	      else if (strcmp(name,"Outputdefinition85")==0) return Outputdefinition85Enum;
++	      else if (strcmp(name,"Outputdefinition86")==0) return Outputdefinition86Enum;
++	      else if (strcmp(name,"Outputdefinition87")==0) return Outputdefinition87Enum;
++	      else if (strcmp(name,"Outputdefinition88")==0) return Outputdefinition88Enum;
++	      else if (strcmp(name,"Outputdefinition89")==0) return Outputdefinition89Enum;
++	      else if (strcmp(name,"Outputdefinition90")==0) return Outputdefinition90Enum;
++	      else if (strcmp(name,"Outputdefinition91")==0) return Outputdefinition91Enum;
++	      else if (strcmp(name,"Outputdefinition92")==0) return Outputdefinition92Enum;
++	      else if (strcmp(name,"Outputdefinition93")==0) return Outputdefinition93Enum;
++	      else if (strcmp(name,"Outputdefinition94")==0) return Outputdefinition94Enum;
++	      else if (strcmp(name,"Outputdefinition95")==0) return Outputdefinition95Enum;
++	      else if (strcmp(name,"Outputdefinition96")==0) return Outputdefinition96Enum;
++	      else if (strcmp(name,"Outputdefinition97")==0) return Outputdefinition97Enum;
++	      else if (strcmp(name,"Outputdefinition98")==0) return Outputdefinition98Enum;
++	      else if (strcmp(name,"Outputdefinition99")==0) return Outputdefinition99Enum;
++	      else if (strcmp(name,"Outputdefinition100")==0) return Outputdefinition100Enum;
+ 	      else if (strcmp(name,"OutputdefinitionList")==0) return OutputdefinitionListEnum;
+ 	      else if (strcmp(name,"Massfluxatgate")==0) return MassfluxatgateEnum;
+ 	      else if (strcmp(name,"MassfluxatgateName")==0) return MassfluxatgateNameEnum;
+@@ -751,10 +844,7 @@
+ 	      else if (strcmp(name,"Gradient")==0) return GradientEnum;
+ 	      else if (strcmp(name,"GroundinglineMigration")==0) return GroundinglineMigrationEnum;
+ 	      else if (strcmp(name,"Gset")==0) return GsetEnum;
+-         else stage=7;
+-   }
+-   if(stage==7){
+-	      if (strcmp(name,"Index")==0) return IndexEnum;
++	      else if (strcmp(name,"Index")==0) return IndexEnum;
+ 	      else if (strcmp(name,"Indexed")==0) return IndexedEnum;
+ 	      else if (strcmp(name,"Intersect")==0) return IntersectEnum;
+ 	      else if (strcmp(name,"Nodal")==0) return NodalEnum;
+@@ -784,7 +874,10 @@
+ 	      else if (strcmp(name,"MpiDense")==0) return MpiDenseEnum;
+ 	      else if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum;
+ 	      else if (strcmp(name,"Seq")==0) return SeqEnum;
+-	      else if (strcmp(name,"Mpi")==0) return MpiEnum;
++         else stage=8;
++   }
++   if(stage==8){
++	      if (strcmp(name,"Mpi")==0) return MpiEnum;
+ 	      else if (strcmp(name,"Mumps")==0) return MumpsEnum;
+ 	      else if (strcmp(name,"Gsl")==0) return GslEnum;
+ 	      else if (strcmp(name,"Option")==0) return OptionEnum;
+@@ -841,7 +934,7 @@
+ 	      else if (strcmp(name,"StressTensorPredictoryy")==0) return StressTensorPredictoryyEnum;
+ 	      else if (strcmp(name,"StressTensorPredictorxy")==0) return StressTensorPredictorxyEnum;
+ 	      else if (strcmp(name,"MaximumNumberOfDefinitions")==0) return MaximumNumberOfDefinitionsEnum;
+-         else stage=8;
++         else stage=9;
+    }
+ 	/*If we reach this point, the string provided has not been found*/
+ 	if(notfounderror)
Index: /issm/oecreview/Archive/18296-19100/ISSM-18999-19000.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-18999-19000.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-18999-19000.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/classes/massfluxatgate.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/massfluxatgate.m	(revision 18999)
++++ ../trunk-jpl/src/m/classes/massfluxatgate.m	(revision 19000)
+@@ -39,7 +39,7 @@
+ 				error('massfluxatgate error message: ''profilename'' field should be a string!');
+ 			end
+ 			
+-			md = checkfield(md,'field',obj.definitionenum,'values',[Outputdefinition1Enum(),Outputdefinition2Enum(),Outputdefinition3Enum(),Outputdefinition4Enum(),Outputdefinition5Enum(),Outputdefinition6Enum(),Outputdefinition7Enum(),Outputdefinition8Enum(),Outputdefinition9Enum(),Outputdefinition10Enum()]);
++			md = checkfield(md,'field',obj.definitionenum,'values',[Outputdefinition1Enum():Outputdefinition100Enum()]);
+ 
+ 			%check the profilename points to a file!: 
+ 			if exist(obj.profilename,'file')~=2,
Index: /issm/oecreview/Archive/18296-19100/ISSM-19000-19001.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19000-19001.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19000-19001.diff	(revision 19102)
@@ -0,0 +1,33 @@
+Index: ../trunk-jpl/src/m/inversions/supportedcontrols.py
+===================================================================
+--- ../trunk-jpl/src/m/inversions/supportedcontrols.py	(revision 19000)
++++ ../trunk-jpl/src/m/inversions/supportedcontrols.py	(revision 19001)
+@@ -1,2 +1,2 @@
+ def supportedcontrols():
+-	return ['BalancethicknessThickeningRate','FrictionCoefficient','MaterialsRheologyBbar','DamageDbar','Vx','Vy']
++	return ['BalancethicknessThickeningRate','FrictionCoefficient','FrictionAs','MaterialsRheologyBbar','DamageDbar','Vx','Vy']
+Index: ../trunk-jpl/src/m/inversions/supportedcontrols.m
+===================================================================
+--- ../trunk-jpl/src/m/inversions/supportedcontrols.m	(revision 19000)
++++ ../trunk-jpl/src/m/inversions/supportedcontrols.m	(revision 19001)
+@@ -3,6 +3,7 @@
+ 	list = {...
+ 		'BalancethicknessThickeningRate',...
+ 		'FrictionCoefficient',...
++		'FrictionAs',...
+ 		'MaterialsRheologyBbar',...
+ 		'DamageDbar',...
+ 		'Vx',...
+Index: ../trunk-jpl/src/m/classes/frictionhydro.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionhydro.m	(revision 19000)
++++ ../trunk-jpl/src/m/classes/frictionhydro.m	(revision 19001)
+@@ -35,7 +35,7 @@
+ 			fielddisplay(obj,'q','friction law exponent q>=1');
+ 			fielddisplay(obj,'C','friction law max value [SI]');
+ 			fielddisplay(obj,'As','Sliding Parameter without cavitation [m Pa^-n s^-1]');
+-			fielddisplay(obj,'effecitve_pressure','Effective Pressure [Pa]');
++			fielddisplay(obj,'effective_pressure','Effective Pressure [Pa]');
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+ 			WriteData(fid,'enum',FrictionLawEnum,'data',3,'format','Integer');
Index: /issm/oecreview/Archive/18296-19100/ISSM-19001-19002.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19001-19002.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19001-19002.diff	(revision 19102)
@@ -0,0 +1,527 @@
+Index: ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 19001)
++++ ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 19002)
+@@ -25,7 +25,7 @@
+ }/*}}}*/
+ 
+ /*Finite Element Analysis*/
+-void           AdjointHorizAnalysis::Core(FemModel* femmodel){/*{{{*/
++void AdjointHorizAnalysis::Core(FemModel* femmodel){/*{{{*/
+ 	_error_("not implemented");
+ }/*}}}*/
+ ElementVector* AdjointHorizAnalysis::CreateDVector(Element* element){/*{{{*/
+@@ -1073,7 +1073,8 @@
+ 
+ 	/*Check that control_type is supported*/
+ 	if(control_type!=MaterialsRheologyBbarEnum && 
+-		control_type!=FrictionCoefficientEnum   && 
++		control_type!=FrictionCoefficientEnum   &&
++		control_type!=FrictionAsEnum   && 
+ 		control_type!=DamageDbarEnum            &&
+ 		control_type!=MaterialsRheologyBEnum){
+ 		_error_("Control "<<EnumToStringx(control_type)<<" not supported");
+@@ -1104,6 +1105,16 @@
+ 				default: _error_("approximation " << EnumToStringx(approximation) << " not supported yet");
+ 			}
+ 			break;
++		case FrictionAsEnum:
++			switch(approximation){
++				case SSAApproximationEnum: GradientJDragHydroSSA(element,gradient,control_index); break;
++				case L1L2ApproximationEnum:GradientJDragHydroL1L2(element,gradient,control_index); break;
++				case HOApproximationEnum:  GradientJDragHydroHO( element,gradient,control_index); break;
++				case FSApproximationEnum:  GradientJDragHydroFS( element,gradient,control_index); break;
++				case NoneApproximationEnum: /*Gradient is 0*/                    break;
++				default: _error_("approximation " << EnumToStringx(approximation) << " not supported yet");
++			}
++			break;
+ 		case MaterialsRheologyBbarEnum:
+ 			switch(approximation){
+ 				case SSAApproximationEnum: GradientJBbarSSA(element,gradient,control_index); break;
+@@ -1885,6 +1896,306 @@
+ 	delete friction;
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
+ }/*}}}*/
++
++void AdjointHorizAnalysis::GradientJDragHydroFS(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++
++	/*return if floating or not on bed (gradient is 0)*/
++	if(element->IsFloating()) return;
++	if(!element->IsOnBase()) return;
++
++	/*Intermediaries*/
++	int        domaintype,dim;
++	IssmDouble Jdet,weight;
++	IssmDouble drag,dalpha2dk,normal[3];
++	IssmDouble vx,vy,vz,lambda,mu,xi;
++	IssmDouble *xyz_list_base= NULL;
++
++	/*Fetch number of vertices for this finite element*/
++	int numvertices = element->GetNumberOfVertices();
++
++	/*Initialize some vectors*/
++	IssmDouble* basis         = xNew<IssmDouble>(numvertices);
++	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
++	int*        vertexpidlist = xNew<int>(numvertices);
++
++	/* get domaintype */
++	element->FindParam(&domaintype,DomainTypeEnum);
++
++	/*Build friction element, needed later: */
++	if(domaintype!=Domain2DverticalEnum) dim=3;
++	else dim=2;
++	Friction* friction=new Friction(element,dim);
++
++	/*Retrieve all inputs we will be needing: */
++	element->GetVerticesCoordinatesBase(&xyz_list_base);
++	element->GradientIndexing(&vertexpidlist[0],control_index);
++	Input* vx_input        = element->GetInput(VxEnum);                   _assert_(vx_input);
++	Input* vy_input        = element->GetInput(VyEnum);                   _assert_(vy_input);
++	Input* adjointx_input  = element->GetInput(AdjointxEnum);             _assert_(adjointx_input);
++	Input* adjointy_input  = element->GetInput(AdjointyEnum);             _assert_(adjointy_input);
++	Input* vz_input        = NULL;
++	Input* adjointz_input  = NULL;
++	if(domaintype!=Domain2DverticalEnum){
++		vz_input        = element->GetInput(VzEnum);                   _assert_(vy_input);
++		adjointz_input  = element->GetInput(AdjointzEnum);             _assert_(adjointz_input);
++	}
++
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGaussBase(4);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		adjointx_input->GetInputValue(&lambda, gauss);
++		adjointy_input->GetInputValue(&mu, gauss);
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		if(domaintype!=Domain2DverticalEnum){
++			adjointz_input->GetInputValue(&xi    ,gauss);
++			vz_input->GetInputValue(&vz,gauss);
++		}
++
++		friction->GetAlphaComplement(&dalpha2dk,gauss);
++		element->NormalBase(&normal[0],xyz_list_base);
++
++		element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
++		element->NodalFunctionsP1(basis,gauss);
++
++		/*Build gradient vector (actually -dJ/dk): */
++		if(domaintype!=Domain2DverticalEnum){
++			for(int i=0;i<numvertices;i++){
++				ge[i]+=(
++							-lambda*(dalpha2dk*(vx - vz*normal[0]*normal[2]))
++							-mu    *(dalpha2dk*(vy - vz*normal[1]*normal[2]))
++							-xi    *(dalpha2dk*(-vx*normal[0]*normal[2]-vy*normal[1]*normal[2]))
++						 )*Jdet*gauss->weight*basis[i];
++				_assert_(!xIsNan<IssmDouble>(ge[i]));
++			}
++		}
++		else{
++			for(int i=0;i<numvertices;i++){
++				ge[i]+=(
++							-lambda*dalpha2dk*vx
++							-mu    *dalpha2dk*vy
++						 )*Jdet*gauss->weight*basis[i];
++				_assert_(!xIsNan<IssmDouble>(ge[i]));
++			}
++		}
++	}
++	gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(xyz_list_base);
++	xDelete<IssmDouble>(basis);
++	xDelete<IssmDouble>(ge);
++	xDelete<int>(vertexpidlist);
++	delete gauss;
++	delete friction;
++}/*}}}*/
++void           AdjointHorizAnalysis::GradientJDragHydroL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++
++	/*Same as SSA*/
++	return this->GradientJDragSSA(element,gradient,control_index);
++}/*}}}*/
++void           AdjointHorizAnalysis::GradientJDragHydroHO(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++
++	/*return if floating or not on bed (gradient is 0)*/
++	if(element->IsFloating()) return;
++	if(!element->IsOnBase()) return;
++
++	/*Intermediaries*/
++	IssmDouble Jdet,weight;
++	IssmDouble drag,dalpha2dk;
++	IssmDouble vx,vy,lambda,mu;
++	IssmDouble *xyz_list_base= NULL;
++
++	int      domaintype,dim;
++	element->FindParam(&domaintype,DomainTypeEnum);
++	/*Fetch number of vertices for this finite element*/
++	int numvertices = element->GetNumberOfVertices();
++
++	/*Initialize some vectors*/
++	IssmDouble* basis         = xNew<IssmDouble>(numvertices);
++	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
++	int*        vertexpidlist = xNew<int>(numvertices);
++
++	/*Build friction element, needed later: */
++	if(domaintype!=Domain2DverticalEnum) dim=3;
++	else dim=2;
++	Friction* friction=new Friction(element,dim);
++
++	/*Retrieve all inputs we will be needing: */
++	element->GetVerticesCoordinatesBase(&xyz_list_base);
++	element->GradientIndexing(&vertexpidlist[0],control_index);
++	Input* vx_input        = element->GetInput(VxEnum);                   _assert_(vx_input);
++	Input* vy_input        = NULL;
++	Input* adjointx_input  = element->GetInput(AdjointxEnum);             _assert_(adjointx_input);
++	Input* adjointy_input  = NULL;
++	if(domaintype!=Domain2DverticalEnum){
++		vy_input        = element->GetInput(VyEnum);                   _assert_(vy_input);
++		adjointy_input  = element->GetInput(AdjointyEnum);             _assert_(adjointy_input);
++	}
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=element->NewGaussBase(4);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		adjointx_input->GetInputValue(&lambda, gauss);
++		vx_input->GetInputValue(&vx,gauss);
++		if(domaintype!=Domain2DverticalEnum){
++			adjointy_input->GetInputValue(&mu, gauss);
++			vy_input->GetInputValue(&vy,gauss);
++		}
++
++		friction->GetAlphaComplement(&dalpha2dk,gauss);
++
++		element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
++		element->NodalFunctionsP1(basis,gauss);
++
++		/*Build gradient vector (actually -dJ/dD): */
++		for(int i=0;i<numvertices;i++){
++			if(domaintype!=Domain2DverticalEnum) ge[i]+=-dalpha2dk*((lambda*vx+mu*vy))*Jdet*gauss->weight*basis[i];
++			else ge[i]+=-dalpha2dk*(lambda*vx)*Jdet*gauss->weight*basis[i];
++			_assert_(!xIsNan<IssmDouble>(ge[i]));
++		}
++	}
++	gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(xyz_list_base);
++	xDelete<IssmDouble>(basis);
++	xDelete<IssmDouble>(ge);
++	xDelete<int>(vertexpidlist);
++	delete gauss;
++	delete friction;
++}/*}}}*/
++
++void AdjointHorizAnalysis::GradientJDragHydroSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
++
++	/*return if floating (gradient is 0)*/
++	if(element->IsFloating()) return;
++
++	/*Intermediaries*/
++	int      domaintype,dim;
++	Element* basalelement;
++
++	/*Get basal element*/
++	element->FindParam(&domaintype,DomainTypeEnum);
++	switch(domaintype){
++		case Domain2DhorizontalEnum:
++			basalelement = element;
++			dim          = 2;
++			break;
++		case Domain2DverticalEnum:
++			if(!element->IsOnBase()) return;
++			basalelement = element->SpawnBasalElement();
++			dim          = 1;
++			break;
++		case Domain3DEnum:
++			if(!element->IsOnBase()) return;
++			basalelement = element->SpawnBasalElement();
++			dim          = 2;
++			break;
++		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
++	}
++
++	/*Intermediaries*/
++	IssmDouble Jdet,weight;
++	IssmDouble dalpha2dk;
++	IssmDouble vx,vy,lambda,mu;
++	IssmDouble *xyz_list= NULL;
++
++
++	/*Fetch number of vertices for this finite element*/
++	int numvertices = basalelement->GetNumberOfVertices();
++
++	/*Initialize some vectors*/
++	IssmDouble* basis         = xNew<IssmDouble>(numvertices);
++	IssmDouble* ge            = xNewZeroInit<IssmDouble>(numvertices);
++	int*        vertexpidlist = xNew<int>(numvertices);
++
++	/*Build friction element, needed later: */
++	Friction* friction=new Friction(basalelement,dim);
++
++	/*Retrieve all inputs we will be needing: */
++	basalelement->GetVerticesCoordinates(&xyz_list);
++	basalelement->GradientIndexing(&vertexpidlist[0],control_index);
++	Input* vx_input        = basalelement->GetInput(VxEnum);          _assert_(vx_input);
++	Input* vy_input        = basalelement->GetInput(VyEnum);          _assert_(vy_input);
++	Input* adjointx_input  = basalelement->GetInput(AdjointxEnum);    _assert_(adjointx_input);
++	Input* adjointy_input  = basalelement->GetInput(AdjointyEnum);    _assert_(adjointy_input);
++
++
++
++	IssmDouble  q_exp;
++	IssmDouble  C_param;
++	IssmDouble  As;
++	IssmDouble  Neff;
++	IssmDouble  n;
++	IssmDouble  alpha;
++	IssmDouble  Chi,Gamma;
++	IssmDouble  vz,vmag;
++	IssmDouble  Uder;
++
++	/*Recover parameters: */
++	Input* qinput = basalelement->GetInput(FrictionQEnum);
++	Input* cinput = basalelement->GetInput(FrictionCEnum);
++	Input* Asinput = basalelement->GetInput(FrictionAsEnum);
++	Input* Ninput = basalelement->GetInput(FrictionEffectivePressureEnum);
++	Input* nInput =basalelement->GetInput(MaterialsRheologyNEnum);
++	
++	/* Start  looping on the number of gaussian points: */
++	Gauss* gauss=basalelement->NewGauss(4);
++	for(int ig=gauss->begin();ig<gauss->end();ig++){
++		gauss->GaussPoint(ig);
++
++		adjointx_input->GetInputValue(&lambda, gauss);
++		adjointy_input->GetInputValue(&mu, gauss);
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++
++		friction->GetAlphaComplement(&dalpha2dk,gauss);
++
++		basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
++		basalelement->NodalFunctionsP1(basis,gauss);
++
++		/*Dealing with dalpha/du*/
++		qinput->GetInputValue(&q_exp,gauss);
++		cinput->GetInputValue(&C_param,gauss);
++		Asinput->GetInputValue(&As,gauss);
++		Ninput->GetInputValue(&Neff,gauss);
++		nInput->GetInputValue(&n,gauss);
++
++		if (q_exp==1){
++			alpha=1;
++		}
++		else{
++			alpha=(pow(q_exp-1,q_exp-1))/pow(q_exp,q_exp);
++		}
++		Chi   = vmag/(pow(C_param,n)*pow(Neff,n)*As);
++		Gamma = (Chi/(1.+alpha*pow(Chi,q_exp)));
++		
++		Uder =Neff*C_param/(vmag*vmag*n) *
++			(Gamma-alpha*q_exp*pow(Chi,q_exp-1.)*Gamma*Gamma* pow(Gamma,(1.-n)/n) -
++			 n* pow(Gamma,1./n));
++		
++		/*Build gradient vector (actually -dJ/dD): */
++		for(int i=0;i<numvertices;i++){
++			ge[i]+=-dalpha2dk*((lambda*vx+mu*vy))*Jdet*gauss->weight*basis[i];
++			_assert_(!xIsNan<IssmDouble>(ge[i]));
++		}
++	}
++	gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
++
++	/*Clean up and return*/
++	xDelete<IssmDouble>(xyz_list);
++	xDelete<IssmDouble>(basis);
++	xDelete<IssmDouble>(ge);
++	xDelete<int>(vertexpidlist);
++	delete gauss;
++	delete friction;
++	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
++}/*}}}*/
++
+ void           AdjointHorizAnalysis::GradientJDSSA(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+ 
+ 	/*Intermediaries*/
+Index: ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h	(revision 19001)
++++ ../trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h	(revision 19002)
+@@ -49,6 +49,10 @@
+ 		void           GradientJDragL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void           GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void           GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJDragHydroFS(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJDragHydroL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJDragHydroHO(Element* element,Vector<IssmDouble>* gradient,int control_index);
++		void           GradientJDragHydroSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void           GradientJDSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
+ 		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
+ 		void           InputUpdateFromSolutionFS(IssmDouble* solution,Element* element);
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 19001)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 19002)
+@@ -47,12 +47,13 @@
+ 		control = reCast<int,IssmDouble>(iomodel->Data(InversionControlParametersEnum)[i]);
+ 		switch(control){
+ 			/*List of supported controls*/
+-			case BalancethicknessThickeningRateEnum: 
++		  case BalancethicknessThickeningRateEnum: 
+ 			case VxEnum:
+ 			case VyEnum:
+ 			case ThicknessEnum:
+-			case FrictionCoefficientEnum:
+-			case BalancethicknessApparentMassbalanceEnum:
++		  case FrictionCoefficientEnum:
++		  case FrictionAsEnum:
++		  case BalancethicknessApparentMassbalanceEnum:
+ 			case BalancethicknessOmegaEnum:
+ 			case MaterialsRheologyBEnum: 
+ 				iomodel->FetchData(1,control); 
+Index: ../trunk-jpl/src/c/classes/Loads/Friction.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 19001)
++++ ../trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 19002)
+@@ -125,15 +125,15 @@
+ 	IssmDouble  Neff;
+ 	IssmDouble  n;
+ 	IssmDouble  alpha;
+-	IssmDouble  Chi;
++	IssmDouble  Chi,Gamma;
+ 	IssmDouble  vx,vy,vz,vmag;
+ 	IssmDouble  alpha_complement;
+ 
+ 	/*Recover parameters: */
+ 	element->GetInputValue(&q_exp,FrictionQEnum);
+ 	element->GetInputValue(&C_param,FrictionCEnum);
+-	element->GetInputValue(&As,FrictionAsEnum);
+ 
++	element->GetInputValue(&As,gauss,FrictionAsEnum);
+ 	element->GetInputValue(&Neff,gauss,FrictionEffectivePressureEnum);
+ 	element->GetInputValue(&n,gauss,MaterialsRheologyNEnum);
+ 
+@@ -159,18 +159,23 @@
+ 		default:
+ 			_error_("not supported");
+ 	}
++	//	vmag=100./(3600.*24.*365.);
++
+ 	if (q_exp==1){
+ 		alpha=1;
+ 	}
+ 	else{
+ 		alpha=(pow(q_exp-1,q_exp-1))/pow(q_exp,q_exp);
+ 	}
+-	Chi=vmag/(pow(C_param,n)*pow(Neff,n)*As);
+-
++	Chi   = vmag/(pow(C_param,n)*pow(Neff,n)*As);
++	Gamma = (Chi/(1.+alpha*pow(Chi,q_exp)));
+ 	/*Check to prevent dividing by zero if vmag==0*/
+ 	if(vmag==0.) alpha_complement=0.;
+-	else if(Neff==0.) alpha_complement=0.;
+-	else alpha_complement=-(C_param*Neff/(vmag*n)) * pow((Chi/(alpha*pow(Chi,q_exp)+1)),((1-n)/n)) *(Chi/(As*(alpha*pow(Chi,q_exp)+1)))-(alpha*q_exp*pow(Chi,q_exp+1)/(As*(alpha*pow(Chi,q_exp)+1)));
++	else	if(Neff==0.) alpha_complement=0.;
++	else	alpha_complement=-(C_param*Neff/(n*vmag)) *
++					pow(Gamma,((1.-n)/n)) *
++					(Gamma/As - (alpha*q_exp*pow(Chi,q_exp-1.)* Gamma * Gamma/As));
++
+ 	_assert_(!xIsNan<IssmDouble>(alpha_complement));
+ 	/*Assign output pointers:*/
+ 	*palpha_complement=alpha_complement;
+@@ -220,7 +225,7 @@
+ 	IssmDouble  n;
+ 
+ 	IssmDouble  alpha;
+-	IssmDouble  Chi;
++	IssmDouble  Chi,Gamma;
+ 
+ 	IssmDouble  vx,vy,vz,vmag;
+ 	IssmDouble  alpha2;
+@@ -228,7 +233,7 @@
+ 	/*Recover parameters: */
+ 	element->GetInputValue(&q_exp,FrictionQEnum);
+ 	element->GetInputValue(&C_param,FrictionCEnum);
+-	element->GetInputValue(&As,FrictionAsEnum);
++	element->GetInputValue(&As,gauss,FrictionAsEnum);
+ 
+ 	element->GetInputValue(&Neff,gauss,FrictionEffectivePressureEnum);
+ 	element->GetInputValue(&n,gauss,MaterialsRheologyNEnum);
+@@ -255,6 +260,7 @@
+ 			_error_("not supported");
+ 	}
+ 
++	//	vmag=100./(3600.*24.*365.);
+ 	//compute alpha and Chi coefficients: */
+ 	if (q_exp==1){
+ 		alpha=1;
+@@ -263,11 +269,12 @@
+ 		alpha=(pow(q_exp-1,q_exp-1))/pow(q_exp,q_exp);
+ 	}
+ 	Chi=vmag/(pow(C_param,n)*pow(Neff,n)*As);
++	Gamma=(Chi/(1. + alpha * pow(Chi,q_exp)));
++	/*Check to prevent dividing by zero if vmag==0*/
++	if(vmag==0.) alpha2=0.; 
++	else	if (Neff==0) alpha2=0.0;
++	else	alpha2=Neff * C_param * pow(Gamma,1./n) * 1/vmag;
+ 
+-	/*Check to prevent dividing by zero if vmag==0*/
+-	if(vmag==0.) alpha2=0.;
+-	else if (Neff==0) alpha2=0.0;
+-	else alpha2= Neff * C_param * pow((Chi/(1 + alpha * pow(Chi,q_exp))),1/n) * 1/vmag;
+ 	_assert_(!xIsNan<IssmDouble>(alpha2));
+ 	/*Assign output pointers:*/
+ 	*palpha2=alpha2;
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 19001)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 19002)
+@@ -1773,7 +1773,8 @@
+ 				case ThicknessEnum:
+ 				case BalancethicknessOmegaEnum:
+ 				case FrictionCoefficientEnum:
+-				case MaterialsRheologyBEnum:
++			  case FrictionAsEnum:
++			  case MaterialsRheologyBEnum:
+ 					if(iomodel->Data(control)){
+ 						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data(control)[tria_vertex_ids[j]-1];
+ 						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i];
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 19001)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 19002)
+@@ -1573,6 +1573,7 @@
+ 				/*No yts conversion*/
+ 				case ThicknessEnum:
+ 				case FrictionCoefficientEnum:
++			  case FrictionAsEnum:	
+ 				case MaterialsRheologyBEnum:
+ 					if(iomodel->Data(control)){
+ 						for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data(control)[penta_vertex_ids[j]-1];
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 19001)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 19002)
+@@ -1147,6 +1147,7 @@
+ 				name==WaterfractionEnum||
+ 				name==WatercolumnEnum || 
+ 				name==FrictionCoefficientEnum ||
++				name==FrictionAsEnum ||
+ 				name==MaskGroundediceLevelsetEnum ||
+ 				name==MaskIceLevelsetEnum ||
+ 				name==IceMaskNodeActivationEnum ||
+Index: ../trunk-jpl/src/c/classes/Inputs/TriaInput.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/TriaInput.h	(revision 19001)
++++ ../trunk-jpl/src/c/classes/Inputs/TriaInput.h	(revision 19002)
+@@ -48,7 +48,7 @@
+ 		/*numerics*/
+ 		void GetInputValue(bool* pvalue){_error_("not implemented yet");}
+ 		void GetInputValue(int* pvalue){_error_("not implemented yet");}
+-		void GetInputValue(IssmDouble* pvalue){_error_("not implemented yet");}
++		void GetInputValue(IssmDouble* pvalue){_error_("not implemented yet (Input is "<<EnumToStringx(this->enum_type)<<")");}//{_error_("not implemented yet");}
+ 		void GetInputValue(IssmDouble* pvalue,Gauss* gauss);
+ 		void GetInputValue(IssmDouble* pvalue,Gauss* gauss,IssmDouble time){_error_("not implemented yet");};
+ 		void GetInputValue(IssmDouble* pvalue,Gauss* gauss,int index){_error_("not implemented yet");};
Index: /issm/oecreview/Archive/18296-19100/ISSM-19002-19003.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19002-19003.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19002-19003.diff	(revision 19102)
@@ -0,0 +1,39 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19002)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19003)
+@@ -590,10 +590,10 @@
+ 			for(int i=0;i<numnodes;i++){
+ 				
+ 				/*Compute first the effective pressure in the EPL*/
+-				EPL_N=gravity*((rho_ice*ice_thickness[i])-(rho_water*(eplhead[i]-bed[i])));
++				EPL_N=gravity*((rho_ice*ice_thickness[i])-(rho_water*min(0.0,(eplhead[i]-bed[i]))));
+ 				if(EPL_N<0.0)EPL_N=0.0;
+ 				/*Get then the square of the gradient of EPL heads*/
+-				EPLgrad2 = (epl_slopeX[i]+epl_slopeY[i])*(epl_slopeX[i]+epl_slopeY[i]);
++				EPLgrad2 = (epl_slopeX[i]*epl_slopeX[i])+(epl_slopeY[i]*epl_slopeY[i]);
+ 				
+ 				/*And proceed to the real thing*/
+ 				thickness[i] = old_thickness[i]*(1+((rho_water*gravity*dt)/(rho_ice*latentheat))*epl_conductivity*EPLgrad2-2.0*(A*dt/(pow(n,n)))*(pow(EPL_N,n)));
+@@ -711,7 +711,6 @@
+ 				if(eplzigzag_counter[basalelement->nodes[i]->Lid()]<eplflip_lock |eplflip_lock==0){
+ 					vec_mask->SetValue(basalelement->nodes[i]->Sid(),0.,INS_VAL);
+ 					epl_thickness[i]=init_thick;
+-					//If no more active nodes in the element probably colapse it two
+ 				}
+ 				else{
+ 					vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 19002)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 19003)
+@@ -465,7 +465,8 @@
+ 			else{
+ 				residual[i] = 0.;
+ 			}
+-			pressure[i]=(rho_ice*g*thickness[i])-(rho_freshwater*g*(min(h_max,values[i])-base[i]));
++			//adding base in min to take into account heads under bed wich don't change N
++			pressure[i]=(rho_ice*g*thickness[i])-(rho_freshwater*g*(min(h_max,values[i],base[i])-base[i]));
+ 		}
+ 		xDelete<IssmDouble>(thickness);
+ 		xDelete<IssmDouble>(base);
Index: /issm/oecreview/Archive/18296-19100/ISSM-19003-19004.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19003-19004.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19003-19004.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 19003)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 19004)
+@@ -466,7 +466,7 @@
+ 				residual[i] = 0.;
+ 			}
+ 			//adding base in min to take into account heads under bed wich don't change N
+-			pressure[i]=(rho_ice*g*thickness[i])-(rho_freshwater*g*(min(h_max,values[i],base[i])-base[i]));
++			pressure[i]=(rho_ice*g*thickness[i])-(rho_freshwater*g*(min((min(h_max,values[i])-base[i]),0.0)));
+ 		}
+ 		xDelete<IssmDouble>(thickness);
+ 		xDelete<IssmDouble>(base);
Index: /issm/oecreview/Archive/18296-19100/ISSM-19004-19005.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19004-19005.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19004-19005.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 19004)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 19005)
+@@ -466,7 +466,7 @@
+ 				residual[i] = 0.;
+ 			}
+ 			//adding base in min to take into account heads under bed wich don't change N
+-			pressure[i]=(rho_ice*g*thickness[i])-(rho_freshwater*g*(min((min(h_max,values[i])-base[i]),0.0)));
++			pressure[i]=(rho_ice*g*thickness[i])-(rho_freshwater*g*(max((min(h_max,values[i])-base[i]),0.0)));
+ 		}
+ 		xDelete<IssmDouble>(thickness);
+ 		xDelete<IssmDouble>(base);
Index: /issm/oecreview/Archive/18296-19100/ISSM-19005-19006.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19005-19006.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19005-19006.diff	(revision 19102)
@@ -0,0 +1,21 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19005)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19006)
+@@ -590,13 +590,15 @@
+ 			for(int i=0;i<numnodes;i++){
+ 				
+ 				/*Compute first the effective pressure in the EPL*/
+-				EPL_N=gravity*((rho_ice*ice_thickness[i])-(rho_water*min(0.0,(eplhead[i]-bed[i]))));
++				EPL_N=gravity*((rho_ice*ice_thickness[i])-(rho_water*max(0.0,(eplhead[i]-bed[i]))));
+ 				if(EPL_N<0.0)EPL_N=0.0;
+ 				/*Get then the square of the gradient of EPL heads*/
+ 				EPLgrad2 = (epl_slopeX[i]*epl_slopeX[i])+(epl_slopeY[i]*epl_slopeY[i]);
+ 				
+ 				/*And proceed to the real thing*/
+ 				thickness[i] = old_thickness[i]*(1+((rho_water*gravity*dt)/(rho_ice*latentheat))*epl_conductivity*EPLgrad2-2.0*(A*dt/(pow(n,n)))*(pow(EPL_N,n)));
++
++				printf("old: %e, new: %e, grad: %e \n",old_thickness[i],thickness[i],EPLgrad2);
+ 				
+ 				/*Take care of otherthikening*/
+ 				if(thickness[i]>max_thick){
Index: /issm/oecreview/Archive/18296-19100/ISSM-19006-19007.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19006-19007.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19006-19007.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19006)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19007)
+@@ -597,8 +597,6 @@
+ 				
+ 				/*And proceed to the real thing*/
+ 				thickness[i] = old_thickness[i]*(1+((rho_water*gravity*dt)/(rho_ice*latentheat))*epl_conductivity*EPLgrad2-2.0*(A*dt/(pow(n,n)))*(pow(EPL_N,n)));
+-
+-				printf("old: %e, new: %e, grad: %e \n",old_thickness[i],thickness[i],EPLgrad2);
+ 				
+ 				/*Take care of otherthikening*/
+ 				if(thickness[i]>max_thick){
Index: /issm/oecreview/Archive/18296-19100/ISSM-19007-19008.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19007-19008.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19007-19008.diff	(revision 19102)
@@ -0,0 +1,25 @@
+Index: ../trunk-jpl/src/c/shared/Elements/ComputeDelta18oTemperaturePrecipitation.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Elements/ComputeDelta18oTemperaturePrecipitation.cpp	(revision 19007)
++++ ../trunk-jpl/src/c/shared/Elements/ComputeDelta18oTemperaturePrecipitation.cpp	(revision 19008)
+@@ -16,20 +16,15 @@
+   IssmDouble delta18oLapseRate=-6.2*pow(10.,-3);
+   IssmDouble glacialindex; // used to vary present day temperature
+ 
+-  // CURENTLY THE TEMPERATURE COMPUTED HERE ARE NOT USED.
+-  // Tdiff is used isnstead in PddSurfaceMassBalance.cpp to get the interpolated temperature
+-
+   glacialindex = (Delta18oTime-Delta18oPresent-delta18oLapseRate*(Delta18oSurfaceTime-Delta18oSurfacePresent))
+     /(Delta18oLgm-Delta18oPresent-delta18oLapseRate*(Delta18oSurfaceLgm-Delta18oSurfacePresent)); // Tarasov 2004 paper
+ 
+   for (int imonth = 0; imonth<12; imonth++){
+     monthlytemperaturestmp[imonth] = glacialindex*TemperaturesLgm[imonth] + (1.-glacialindex)*TemperaturesPresentday[imonth];
+-    //monthlyprectmp[imonth] = 1.5*pow(2,((monthlytemperaturestmp[imonth]-273.15-0)/10)); //equation from rob's paper
+     monthlyprectmp[imonth] = PrecipitationsPresentday[imonth];
+ 
+     /*Assign output pointer*/
+     *(monthlytemperaturesout+imonth) = monthlytemperaturestmp[imonth];
+     *(monthlyprecout+imonth) = monthlyprectmp[imonth];
+   }
+-  // printf(" tempera %f\n",monthlytemperaturestmp[1]);
+ }
Index: /issm/oecreview/Archive/18296-19100/ISSM-19008-19009.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19008-19009.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19008-19009.diff	(revision 19102)
@@ -0,0 +1,107 @@
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp	(revision 19008)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp	(revision 19009)
+@@ -45,7 +45,8 @@
+ 	IssmDouble eps_hyd;
+ 	IssmDouble ndu_sed,nu_sed;
+ 	IssmDouble ndu_epl,nu_epl;
+-
++	IssmDouble ThickCount,L2Count;
++	
+ 	/*Recover parameters: */
+ 	femmodel->SetCurrentConfiguration(HydrologyDCInefficientAnalysisEnum);
+ 	femmodel->parameters->FindParam(&isefficientlayer,HydrologydcIsefficientlayerEnum);
+@@ -156,7 +157,7 @@
+ 		if(isefficientlayer){
+ 			femmodel->SetCurrentConfiguration(HydrologyDCEfficientAnalysisEnum);
+ 			/*updating mask*/
+-			femmodel->HydrologyEPLupdateDomainx();
++			femmodel->HydrologyEPLupdateDomainx(&ThickCount);
+ 			inefanalysis->ElementizeEplMask(femmodel);
+ 			InputUpdateFromConstantx(femmodel,true,ResetPenaltiesEnum);
+ 			InputUpdateFromConstantx(femmodel,false,ConvergedEnum);
+@@ -168,9 +169,9 @@
+ 				ug_epl->Copy(ug_epl_sub_iter);
+ 				/*{{{*//*Retrieve the EPL head slopes and compute EPL Thickness*/
+ 				if(VerboseSolution()) _printf0_("computing EPL Head slope...\n");
+-				//				inefanalysis->ElementizeEplMask(femmodel);
++				//inefanalysis->ElementizeEplMask(femmodel);
+ 				femmodel->SetCurrentConfiguration(L2ProjectionEPLAnalysisEnum);
+-				femmodel->UpdateConstraintsL2ProjectionEPLx();
++				femmodel->UpdateConstraintsL2ProjectionEPLx(&L2Count);
+ 				inefanalysis->ElementizeEplMask(femmodel);
+ 				femmodel->parameters->SetParam(EplHeadSlopeXEnum,InputToL2ProjectEnum);
+ 				solutionsequence_linear(femmodel);
+@@ -180,7 +181,7 @@
+ 				femmodel->SetCurrentConfiguration(HydrologyDCEfficientAnalysisEnum);
+ 				effanalysis->ComputeEPLThickness(femmodel);
+ 				//updating mask after the computation of the epl thickness (Allow to close too thin EPL)
+-				femmodel->HydrologyEPLupdateDomainx();
++				femmodel->HydrologyEPLupdateDomainx(&ThickCount);
+ 				inefanalysis->ElementizeEplMask(femmodel);
+ 				/*}}}*/
+ 					
+@@ -212,6 +213,8 @@
+ 				if (eplcount>=hydro_maxiter){
+ 					_error_("   maximum number of EPL iterations (" << hydro_maxiter << ") exceeded");
+ 				}
++				//If there is some colapse go through sediment again
++				if(ThickCount<L2Count)eplconverged=true;
+ 				eplcount++;
+ 				
+ 				delete ug_epl_sub_iter;
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 19008)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 19009)
+@@ -1870,7 +1870,7 @@
+ }
+ /*}}}*/
+ #endif
+-void FemModel::HydrologyEPLupdateDomainx(void){ /*{{{*/
++void FemModel::HydrologyEPLupdateDomainx(IssmDouble* pEplcount){ /*{{{*/
+ 
+ 	Vector<IssmDouble>* mask							= NULL;
+ 	IssmDouble*         serial_mask				= NULL;
+@@ -1932,6 +1932,7 @@
+ 	ISSM_MPI_Reduce(&counter,&sum_counter,1,ISSM_MPI_INT,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+ 	ISSM_MPI_Bcast(&sum_counter,1,ISSM_MPI_INT,0,IssmComm::GetComm());                
+ 	counter=sum_counter;
++	*pEplcount = counter;
+ 	if(VerboseSolution()) _printf0_("   Number of active nodes in EPL layer: "<< counter <<"\n");
+ 
+ 	/*Update dof indexings*/
+@@ -1939,7 +1940,7 @@
+ 
+ }
+ /*}}}*/
+-void FemModel::UpdateConstraintsL2ProjectionEPLx(void){ /*{{{*/
++void FemModel::UpdateConstraintsL2ProjectionEPLx(IssmDouble* pL2count){ /*{{{*/
+ 
+ 	Vector<IssmDouble>* active        = NULL;
+ 	IssmDouble*         serial_active = NULL;
+@@ -1977,6 +1978,7 @@
+ 	ISSM_MPI_Reduce(&counter,&sum_counter,1,ISSM_MPI_INT,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+ 	ISSM_MPI_Bcast(&sum_counter,1,ISSM_MPI_INT,0,IssmComm::GetComm());                
+ 	counter=sum_counter;
++	*pL2count = counter;
+ 	if(VerboseSolution()) _printf0_("   Number of active nodes L2 Projection: "<< counter <<"\n");
+ }
+ /*}}}*/
+Index: ../trunk-jpl/src/c/classes/FemModel.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.h	(revision 19008)
++++ ../trunk-jpl/src/c/classes/FemModel.h	(revision 19009)
+@@ -106,9 +106,8 @@
+ 		int  UpdateVertexPositionsx(void);
+ 		void UpdateConstraintsExtrudeFromBasex();
+ 		void UpdateConstraintsExtrudeFromTopx();
+-		void HydrologyEPLupdateDomainx(void);
+-		//		void HydrologyEPLThicknessx(void);
+-		void UpdateConstraintsL2ProjectionEPLx(void);
++		void HydrologyEPLupdateDomainx(IssmDouble* pEplcount);
++		void UpdateConstraintsL2ProjectionEPLx(IssmDouble* pL2count);
+ };
+ 
+ #endif
Index: /issm/oecreview/Archive/18296-19100/ISSM-19009-19010.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19009-19010.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19009-19010.diff	(revision 19102)
@@ -0,0 +1,338 @@
+Index: ../trunk-jpl/src/c/modules/ExpToLevelSetx/ExpToLevelSetxt.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ExpToLevelSetx/ExpToLevelSetxt.cpp	(revision 0)
++++ ../trunk-jpl/src/c/modules/ExpToLevelSetx/ExpToLevelSetxt.cpp	(revision 19010)
+@@ -0,0 +1,104 @@
++/*!\file:  ExpToLevelSetxt.cpp
++ * \brief  "thread" core code for figuring out level set value from a contour and a cloud of points.
++ */ 
++
++#ifdef HAVE_CONFIG_H
++	#include <config.h>
++#else
++#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
++#endif
++
++/*Include files: {{{*/
++#include "./ExpToLevelSetx.h"
++double minimum_distance(double x1, double y1, double x2, double y2, double x0, double y0);
++void ContourToLevelSet(double* distance,double* contourx, double* contoury, int contournods, double* x, double* y, int i0, int i10);
++/*}}}*/
++
++void* ExpToLevelSetxt(void* vpthread_handle){
++
++	/*gate variables :*/
++	ExpToLevelSetxThreadStruct *gate        = NULL;
++	pthread_handle             *handle      = NULL;
++	int  i,i1,i0;
++
++	/*recover handle and gate: */
++	handle          = (pthread_handle*)vpthread_handle;
++	gate            = (ExpToLevelSetxThreadStruct*)handle->gate;
++	int my_thread   = handle->id;
++	int num_threads = handle->num;
++
++	/*recover parameters :*/
++	Contours* contours  = gate->contours;
++	int       nods      = gate->nods;
++	double   *distance    = gate->distance;
++	double   *x         = gate->x;
++	double   *y         = gate->y;
++
++	/*distribute indices across threads :*/
++	PartitionRange(&i0,&i1,nods,num_threads,my_thread);
++
++	/*Loop through all contours: */
++	for (i=0;i<contours->Size();i++){
++		Contour<double>* contour=(Contour<double>*)contours->GetObjectByOffset(i);
++		ContourToLevelSet(distance,contour->x,contour->y,contour->nods,x,y,i0,i1);
++	}
++
++	return NULL;
++}
++
++void ContourToLevelSet(double* dist,double* contourx, double* contoury, int contournods, double* x, double* y, int i0, int i1){/*{{{*/
++	int i,j;
++	double x0,y0;
++	double x1,y1;
++	double x2,y2;
++	double mind;
++	
++	for(i=i0;i<i1;i++){
++		x0=x[i]; y0=y[i];
++
++		/*Figure out distance from (x0,y0) to contour: */
++		mind=INFINITY;
++		for (j=0;j<contournods-1;j++){
++			x1=contourx[j]; y1=contoury[j];
++			x2=contourx[j+1]; y2=contoury[j+1];
++			mind=min(mind,minimum_distance(x1,y1,x2,y2,x0,y0));
++		}
++		dist[i]=mind;
++	}
++
++}
++double ddistance(double x1,double y1,double x2,double y2){
++	return sqrt(pow(x2-x1,2)+pow(y2-y1,2));
++}
++double ddot(double x1, double y1, double x2, double y2){
++	return x1*x2+y1*y2;
++}
++
++bool isPointLeftOfRay(double x, double y, double raySx, double raySy, double rayEx, double rayEy) {
++	  return (y-raySy)*(rayEx-raySx)
++		    >      (x-raySx)*(rayEy-raySy); 
++}
++
++double minimum_distance(double x1, double y1, double x2, double y2, double x0, double y0){
++	
++	// Return minimum distance between line segment [(x1,y1) (x2,y2)] and point (x0,y0) (v=(x1,y1), w=(x2,y2) and p=(x0,y0)
++	double projectionx; 
++	double projectiony; 
++	double l2;
++	double t;
++
++	l2 = pow(x2-x1,2)+pow(y2-y1,2); // i.e. |w-v|^2 -  avoid a sqrt
++
++	if (l2 == 0.0) return ddistance(x0,y0, x1,y1); // v == w case
++	// Consider the line extending the segment, parameterized as v + t (w - v).
++	//         // We find projection of point p onto the line. 
++	//           // It falls where t = [(p-v) . (w-v)] / |w-v|^2
++	t = ddot(x0-x1,y0-y1, x2-x1, y2-y1) / l2;
++	if (t < 0.0) return ddistance(x0,y0, x1, y1);       // Beyond the 'v' end of the segment
++	else if (t > 1.0) return ddistance(x0,y0, x2,y2);  // Beyond the 'w' end of the segment
++	
++	projectionx= x1 + t* (x2-x1);  // Projection falls on the segment
++	projectiony= y1 + t* (y2-y1);
++	return ddistance(x0, y0, projectionx, projectiony);
++}
++/*}}}*/
+Index: ../trunk-jpl/src/c/modules/ExpToLevelSetx/ExpToLevelSetx.h
+===================================================================
+--- ../trunk-jpl/src/c/modules/ExpToLevelSetx/ExpToLevelSetx.h	(revision 0)
++++ ../trunk-jpl/src/c/modules/ExpToLevelSetx/ExpToLevelSetx.h	(revision 19010)
+@@ -0,0 +1,27 @@
++/*
++	ExpToLevelSetx.h
++*/
++
++#ifndef _EXPTOLEVELSETX_H
++#define _EXPTOLEVELSETX_H
++
++#include "../../shared/shared.h"
++#include "../../classes/classes.h"
++
++/*threading: */
++typedef struct{
++
++	Contours *contours;
++	int       nods;
++	double   *distance;
++	double   *x;
++	double   *y;
++
++} ExpToLevelSetxThreadStruct;
++
++/* local prototypes: */
++int ExpToLevelSetx(double** pdistance,double* x, double* y,int nods, Contours* contours);
++
++void* ExpToLevelSetxt(void* vExpToLevelSetxThreadStruct);
++
++#endif /* _EXPTOLEVELSETX_H */
+Index: ../trunk-jpl/src/c/modules/ExpToLevelSetx/ExpToLevelSetx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ExpToLevelSetx/ExpToLevelSetx.cpp	(revision 0)
++++ ../trunk-jpl/src/c/modules/ExpToLevelSetx/ExpToLevelSetx.cpp	(revision 19010)
+@@ -0,0 +1,36 @@
++/*! \file  ExpToLevelSetx.c
++ */
++
++#ifdef HAVE_CONFIG_H
++	#include <config.h>
++#else
++#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
++#endif
++
++#include "./ExpToLevelSetx.h"
++
++int ExpToLevelSetx(double** pdistance,double* x, double* y, int nods, Contours* contours){
++
++	/*Contour:*/
++	double value;
++
++	/*output: */
++	double*  distance;
++	distance   = xNewZeroInit<double>(nods);
++
++	/*initialize thread parameters: */
++	ExpToLevelSetxThreadStruct gate;
++	gate.contours  = contours;
++	gate.nods      = nods;
++	gate.distance    = distance;
++	gate.x         = x;
++	gate.y         = y;
++
++	/*launch the thread manager with ExpToLevelSetxt as a core: */
++	LaunchThread(ExpToLevelSetxt,(void*)&gate,_NUMTHREADS_);
++
++	/*Assign output pointers: */
++	*pdistance=distance;
++
++	return 1;
++}
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 19009)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 19010)
+@@ -821,6 +821,9 @@
+ 			./modules/ContourToMeshx/ContourToMeshx.cpp\
+ 			./modules/ContourToMeshx/ContourToMeshxt.cpp\
+ 			./modules/ContourToMeshx/ContourToMeshx.h\
++			./modules/ExpToLevelSetx/ExpToLevelSetx.cpp\
++			./modules/ExpToLevelSetx/ExpToLevelSetxt.cpp\
++			./modules/ExpToLevelSetx/ExpToLevelSetx.h\
+ 			./modules/ContourToNodesx/ContourToNodesx.cpp\
+ 			./modules/ContourToNodesx/ContourToNodesx.h\
+ 			./modules/NodeConnectivityx/NodeConnectivityx.cpp\
+Index: ../trunk-jpl/src/wrappers/ExpToLevelSet/ExpToLevelSet.cpp
+===================================================================
+--- ../trunk-jpl/src/wrappers/ExpToLevelSet/ExpToLevelSet.cpp	(revision 0)
++++ ../trunk-jpl/src/wrappers/ExpToLevelSet/ExpToLevelSet.cpp	(revision 19010)
+@@ -0,0 +1,76 @@
++/*! \file  ContourtoMesh
++    \brief: takes a  contour file, a cloud of points, and figures out a levelset dependent on the distance between the contour and 
++	the cloud.
++*/
++
++#include "./ExpToLevelSet.h"
++
++void ExpToLevelSetUsage(void){/*{{{*/
++	_printf_("EXPTOLEVELSET - determien levelset distance between a contour and a cloud of points\n");
++	_printf_("\n");
++	_printf_("      Usage: \n");
++	_printf_("         distance=ExpToLevelSet(x,y,contourname)\n");
++	_printf_("\n");
++	_printf_("         x,y: cloud point.\n");
++	_printf_("         contourname: name of .exp file containing the contours.\n");
++	_printf_("         distance: distance vector representing a levelset where the 0 level is one the contour segments', \n");
++	_printf_("\n");
++	_printf_("      Example: \n");
++	_printf_("         distance=ExpToLevelSet(md.mesh.x,md.mesh.y,'Contour.exp')\n");
++	_printf_("\n");
++}/*}}}*/
++WRAPPER(ExpToLevelSet){
++
++	/*diverse: */
++	int i;
++
++	/* required input: */
++	int       nods;
++	double   *x           = NULL;
++	double   *y           = NULL;
++	char     *interptype  = NULL;
++	double *flags = NULL;
++	Contours *contours    = NULL;
++
++	/* output: */
++	double *distance  = NULL;
++
++	/*Boot module: */
++	MODULEBOOT();
++
++	/*check on input arguments: */
++	if(nrhs!=NRHS | nlhs!=NLHS){
++		ExpToLevelSetUsage();
++		_error_("usage. See above");
++	}
++
++	/*Fetch inputs: */
++	FetchData(&x,&nods,NULL,X);
++	FetchData(&y,NULL,NULL,Y);
++	FetchData(&contours,CONTOUR);
++
++	/*Run interpolation routine: */
++	ExpToLevelSetx( &distance,x,y,nods,contours);
++	ContourToNodesx(&flags,x,y,nods,contours,2);
++
++	/*Make flags into a sign, left or right, or nill: */
++	for(i=0;i<nods;i++){
++		if (flags[i]==0) flags[i]=-1;
++		else if (flags[i]==2) flags[i]=0;
++	}
++
++	/*Multiply flags and distance: */
++	for(i=0;i<nods;i++)distance[i]*=flags[i];
++
++	/* output: */
++	WriteData(PLHS0,distance,nods);
++
++	/*Clean up*/
++	xDelete<double>(x);
++	xDelete<double>(y);
++	delete contours;
++	delete distance;
++	
++	/*end module: */
++	MODULEEND();
++}
+Index: ../trunk-jpl/src/wrappers/ExpToLevelSet/ExpToLevelSet.h
+===================================================================
+--- ../trunk-jpl/src/wrappers/ExpToLevelSet/ExpToLevelSet.h	(revision 0)
++++ ../trunk-jpl/src/wrappers/ExpToLevelSet/ExpToLevelSet.h	(revision 19010)
+@@ -0,0 +1,56 @@
++/*
++	ExpToLevelSet.h
++*/
++
++#ifndef _EXPTOLEVELSET_H
++#define _EXPTOLEVELSET_H
++
++#ifdef HAVE_CONFIG_H
++	#include <config.h>
++#else
++	#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
++#endif
++
++/*For python modules: needs to come before header files inclusion*/
++#ifdef _HAVE_PYTHON_
++#define PY_ARRAY_UNIQUE_SYMBOL PythonIOSymbol
++#endif
++
++/*Header files: */
++#include "../bindings.h"
++#include "../../c/main/globals.h"
++#include "../../c/toolkits/toolkits.h"
++#include "../../c/modules/modules.h"
++#include "../../c/shared/shared.h"
++#include "../../c/shared/io/io.h"
++#include "../../c/shared/Enum/Enum.h"
++
++#undef __FUNCT__
++#define __FUNCT__ "ExpToLevelSet"
++
++#ifdef _HAVE_MATLAB_MODULES_
++/* serial input macros: */
++#define X           prhs[0]
++#define Y           prhs[1]
++#define CONTOUR     prhs[2]
++
++/* serial output macros: */
++#define PLHS0 (mxArray**)&plhs[0]
++#endif
++
++#ifdef _HAVE_PYTHON_MODULES_
++/* serial input macros: */
++#define X           PyTuple_GetItem(args,0)
++#define Y           PyTuple_GetItem(args,1)
++#define CONTOUR     PyTuple_GetItem(args,2)
++/* serial output macros: */
++#define PLHS0 output,0
++#endif
++
++/* serial arg counts: */
++#undef NLHS
++#define NLHS  1
++#undef NRHS
++#define NRHS 3
++
++#endif  /* _EXPTOLEVELSET_H */
Index: /issm/oecreview/Archive/18296-19100/ISSM-19010-19011.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19010-19011.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19010-19011.diff	(revision 19102)
@@ -0,0 +1,284 @@
+Index: ../trunk-jpl/src/wrappers/M1qn3/M1qn3.cpp
+===================================================================
+--- ../trunk-jpl/src/wrappers/M1qn3/M1qn3.cpp	(revision 0)
++++ ../trunk-jpl/src/wrappers/M1qn3/M1qn3.cpp	(revision 19011)
+@@ -0,0 +1,178 @@
++/*!\file M1qn3.c
++ * \brief: data interpolation from a list of (x,y,values) into mesh vertices
++*/
++
++#include "./M1qn3.h"
++
++/*m1qn3 prototypes {{{*/
++extern "C" void *ctonbe_; // DIS mode : Conversion
++extern "C" void *ctcabe_; // DIS mode : Conversion
++extern "C" void *euclid_; // Scalar product
++typedef void (*SimulFunc) (long* indic,long* n, double* x, double* pf,double* g,long [],float [],void* dzs);
++extern "C" void m1qn3_ (void f(long* indic,long* n, double* x, double* pf,double* g,long [],float [],void* dzs),
++			void **, void **, void **,
++			long *, double [], double *, double [], double*, double *,
++			double *, char [], long *, long *, long *, long *, long *, long *, long [], double [], long *,
++			long *, long *, long [], float [],void* );
++/*Cost function prototype*/
++void fakesimul(long* indic,long* n,double* X,double* pf,double* G,long izs[1],float rzs[1],void* dzs);
++typedef struct {
++	int priorn; 
++	int counter; 
++	double* Gs; 
++	double* Xs;
++	double* Js;
++} Data; 
++
++/*}}}*/
++void M1qn3Usage(void){/*{{{*/
++	_printf0_("   usage:\n");
++	_printf0_("         X=M1qn3(Xs,Gs);\n");
++	_printf0_("   where:\n");
++	_printf0_("      Xs are the X values (m x n, where m is the number of independents, n the number of evaluations previously carried out on X)\n");
++	_printf0_("      Gs are the G (gradient) values (m x n, where m is the number of independents, n the number of evaluations previously carried out on X,G)\n");
++	_printf0_("      X - the new direction.\n");
++	_printf0_("\n");
++}/*}}}*/
++WRAPPER(M1qn3){
++
++	/*input: */
++	double* Xs=NULL;
++	double* Gs=NULL;
++	double* Js=NULL;
++	int     intn;
++	int     priorn;
++	int     maxsteps,maxiter;
++	Data    data_struct;
++
++	/* output: */
++	double* X_out = NULL;
++
++	/*intermediary: */
++	double* G=NULL;
++	double* X=NULL;
++	double f;
++	double dxmin=.01;
++	double gttol=.0001;
++	long   omode;
++
++	/*Boot module: */
++	MODULEBOOT();
++
++	/*checks on arguments on the matlab side: */
++	if(nlhs!=NLHS){
++		M1qn3Usage();
++		_error_("M1qn3 usage error");
++	}
++	if(nrhs!=5){
++		M1qn3Usage();
++		_error_("M1qn3 usage error");
++	}
++
++	/*Input datasets: */
++	FetchData(&Xs,&intn,&priorn,XHANDLE);
++	FetchData(&Gs,&intn,&priorn,GHANDLE);
++	FetchData(&Js,&priorn,JHANDLE);
++	FetchData(&maxsteps,MAXSTEPSHANDLE);
++	FetchData(&maxiter,MAXITERHANDLE);
++
++	/*_printf_("Xs: " << Xs[0] << "\n");
++	_printf_("Gs: " << Gs[0] << "\n");
++	_printf_("Js: " << Js[0] << "\n");
++	_printf_("maxiter: " << maxiter << "\n");
++	_printf_("maxsteps: " << maxsteps << "\n");*/
++
++	/*Initialize M1QN3 parameters*/
++	SimulFunc costfuncion  = &fakesimul;  /*Cost function address*/
++	void**    prosca       = &euclid_;  /*Dot product function (euclid is the default)*/
++	char      normtype[]   = "dfn";     /*Norm type: dfn = scalar product defined by prosca*/
++	long      izs[5];                   /*Arrays used by m1qn3 subroutines*/
++	long      iz[5];                    /*Integer m1qn3 working array of size 5*/
++	float     rzs[1];                   /*Arrays used by m1qn3 subroutines*/
++	long      impres       = 0;         /*verbosity level*/
++	long      imode[3]     = {0};       /*scaling and starting mode, 0 by default*/
++	long      indic        = 4;         /*compute f and g*/
++	long      reverse      = 0;         /*reverse or direct mode*/
++	long      io           = 6;         /*Channel number for the output*/
++
++	/*Optimization criterions*/
++	long niter = long(maxsteps); /*Maximum number of iterations*/
++	long nsim  = long(maxiter);/*Maximum number of function calls*/
++
++	/*Get problem dimension and initialize X, G and f: */
++	/*_printf_("intn: " << intn << "\n");
++	_printf_("priorn: " << priorn << "\n");*/
++	long n = long(intn);
++	IssmPDouble* G = xNew<IssmPDouble>(n); for (int i=0;i<n;i++)G[i]=Gs[i*priorn];
++	IssmPDouble* X = xNew<IssmPDouble>(n); for (int i=0;i<n;i++)X[i]=Xs[i*priorn];
++	f = Js[0];
++	
++	/*_printf_("X: " << X[0] << "\n");
++	_printf_("G: " << G[0] << "\n");
++	_printf_("J: " << f << "\n");
++	_printf_("n: " << n << "\n");*/
++
++
++	/*Allocate m1qn3 working arrays (see doc)*/
++	long      m   = 100;
++	long      ndz = 4*n+m*(2*n+1);
++	double*   dz  = xNew<double>(ndz);
++	double f1=f;
++
++	/*Initialize: */
++	data_struct.priorn=priorn;
++	data_struct.counter=0;
++	data_struct.Gs=Gs;
++	data_struct.Js=Js;
++	data_struct.Xs=Xs;
++
++	m1qn3_(costfuncion,prosca,&ctonbe_,&ctcabe_,
++				&n,X,&f,G,&dxmin,&f1,
++				&gttol,normtype,&impres,&io,imode,&omode,&niter,&nsim,iz,dz,&ndz,
++				&reverse,&indic,izs,rzs,(void*)&data_struct);
++
++	switch(int(omode)){
++		case 0: /*_printf0_("   Stop requested (indic = 0)\n"); */ break;
++		case 1:  _printf0_("   Convergence reached (gradient satisfies stopping criterion)\n"); break;
++		case 2:  _printf0_("   Bad initialization\n"); break;
++		case 3:  _printf0_("   Line search failure\n"); break;
++		case 4:  _printf0_("   Maximum number of iterations exceeded\n");break;
++		case 5:  _printf0_("   Maximum number of function calls exceeded\n"); break;
++		case 6:  _printf0_("   stopped on dxmin during line search\n"); break;
++		case 7:  _printf0_("   <g,d> > 0  or  <y,s> <0\n"); break;
++		default: _printf0_("   Unknown end condition\n");
++	}
++
++	/*build output: */
++	X_out=xNew<IssmPDouble>(n);
++	for(int i=0;i<n;i++)X_out[i]=X[i];
++
++	/*Write data: */
++	WriteData(XOUT,X_out,n);
++
++	/*end module: */
++	MODULEEND();
++}
++
++
++void fakesimul(long* indic,long* n,double* X,double* pf,double* G,long izs[1],float rzs[1],void* dzs){
++
++	Data* ds=(Data*)dzs;
++	double* Xs=ds->Xs;
++	double* Gs=ds->Gs;
++	double* Js=ds->Js;
++	
++	/*Are we done? : */
++	if(ds->counter+1==ds->priorn){
++		*indic=0;
++		return;
++	}
++	else{
++		//_printf0_("counter: " << ds->counter << "\n");
++		ds->counter++;
++		*pf=Js[ds->counter];
++		for(int i=0;i<*n;i++)X[i]=Xs[ds->priorn*i+ds->counter];
++		for(int i=0;i<*n;i++)G[i]=Gs[ds->priorn*i+ds->counter];
++	}
++
++}
+Index: ../trunk-jpl/src/wrappers/M1qn3/M1qn3.h
+===================================================================
+--- ../trunk-jpl/src/wrappers/M1qn3/M1qn3.h	(revision 0)
++++ ../trunk-jpl/src/wrappers/M1qn3/M1qn3.h	(revision 19011)
+@@ -0,0 +1,53 @@
++/*!\file M1qn3.h
++ * \brief: prototype for Data Interpolation mex module.
++ */
++
++#ifndef _M1QN3_WRAPPER_H
++#define _M1QN3_WRAPPER_H
++
++#ifdef HAVE_CONFIG_H
++	#include <config.h>
++#else
++	#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
++#endif
++
++/*For python modules: needs to come before header files inclusion*/
++#ifdef _HAVE_PYTHON_
++#define PY_ARRAY_UNIQUE_SYMBOL PythonIOSymbol
++#endif
++
++#include "../bindings.h"
++#include "../../c/main/globals.h"
++#include "../../c/modules/modules.h"
++#include "../../c/shared/shared.h"
++
++#undef __FUNCT__ 
++#define __FUNCT__  "M1qn3"
++
++#ifdef _HAVE_MATLAB_MODULES_
++/* serial input macros: */
++#define XHANDLE       prhs[0]
++#define GHANDLE       prhs[1]
++#define JHANDLE       prhs[2]
++#define MAXSTEPSHANDLE prhs[3]
++#define MAXITERHANDLE prhs[4]
++/* serial output macros: */
++#define XOUT (mxArray**)&plhs[0]
++#endif
++
++#ifdef _HAVE_PYTHON_MODULES_
++/* serial input macros: */
++#define XHANDLE   PyTuple_GetItem(args,0)
++#define GHANDLE       PyTuple_GetItem(args,1)
++#define JHANDLE       PyTuple_GetItem(args,2)
++#define MAXSTEPSHANDLE PyTuple_GetItem(args,3)
++#define MAXITERHANDLE PyTuple_GetItem(args,4)
++/* serial output macros: */
++#define XOUT output,0
++#endif
++
++/* serial arg counts: */
++#undef NLHS
++#define NLHS  1
++
++#endif  /* _M1QN3_WRAPPER_H */
+Index: ../trunk-jpl/src/wrappers/matlab/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/wrappers/matlab/Makefile.am	(revision 19010)
++++ ../trunk-jpl/src/wrappers/matlab/Makefile.am	(revision 19011)
+@@ -37,6 +37,7 @@
+ 						 ElementConnectivity.la\
+ 						 EnumToString.la\
+ 						 ExpSimplify.la\
++						 ExpToLevelSet.la\
+ 						 InterpFromGridToMesh.la\
+ 						 InterpFromMeshToMesh2d.la\
+ 						 InterpFromMeshToMesh3d.la\
+@@ -45,6 +46,7 @@
+ 						 IssmConfig.la\
+ 						 Ll2xy.la\
+ 						 NodeConnectivity.la\
++						 M1qn3.la\
+ 						 MeshPartition.la\
+ 						 MeshProfileIntersection.la\
+ 						 PointCloudFindNeighbors.la\
+@@ -140,6 +142,11 @@
+ 									../ContourToMesh/ContourToMesh.h
+ ContourToMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
++ExpToLevelSet_la_SOURCES = ../ExpToLevelSet/ExpToLevelSet.cpp\
++									../ExpToLevelSet/ExpToLevelSet.h
++ExpToLevelSet_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
++
++
+ ContourToNodes_la_SOURCES = ../ContourToNodes/ContourToNodes.cpp\
+ 									 ../ContourToNodes/ContourToNodes.h
+ ContourToNodes_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+@@ -220,6 +227,10 @@
+ 									../MeshPartition/MeshPartition.h
+ MeshPartition_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(METISLIB) $(GSLLIB) $(PROJ4LIB)
+ 
++M1qn3_la_SOURCES = ../M1qn3/M1qn3.cpp\
++									../M1qn3/M1qn3.h
++M1qn3_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(METISLIB) $(GSLLIB) $(PROJ4LIB)
++
+ MeshProfileIntersection_la_SOURCES = ../MeshProfileIntersection/MeshProfileIntersection.cpp\
+ 												 ../MeshProfileIntersection/MeshProfileIntersection.h
+ MeshProfileIntersection_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
Index: /issm/oecreview/Archive/18296-19100/ISSM-19011-19012.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19011-19012.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19011-19012.diff	(revision 19102)
@@ -0,0 +1,69 @@
+Index: ../trunk-jpl/src/m/contrib/resultstomatrix.m
+===================================================================
+--- ../trunk-jpl/src/m/contrib/resultstomatrix.m	(revision 0)
++++ ../trunk-jpl/src/m/contrib/resultstomatrix.m	(revision 19012)
+@@ -0,0 +1,64 @@
++function matrix=resultstomatrix(md,resultname,field,varargin)
++%RESULTSTOMATRIX - go grab in the model results structure the vector results for each time step (which is not empty), 
++%                  and line them up in a matrix.  If time vector is provided, resample.
++%
++%   Usage:
++%      matrix=resultstomatrix(model,solutioname,fieldname)
++%
++%   Available options:
++%      - 'time'     : vector providing new time tags used to resample time
++%
++%   Example:
++%      vel=resultstomatrix(md,'TransientSolution','Vel');
++%      vel=resultstomatrix(md,'TransientSolution','Vel','time',2008:1/12:2014);
++%
++%   See also MODEL  resample
++
++
++	options=pairoptions(varargin{:});
++
++	results=md.results.(resultname);
++
++	%first, figure out the size: 
++	count=0;
++	nods=0;
++	for i=1:length(results),
++		if ~isempty(results(i).(field)),
++			count=count+1;
++			nods=size(results(i).(field),1);
++		end
++	end
++
++	if ~count, 
++		error(['could not find any result ' field ' in ' resultname]);
++	end
++
++	%initialize: 
++	matrix=zeros(nods+1,count);
++
++	%fill it up: 
++	count=0;
++	for i=1:length(results),
++		if ~isempty(results(i).(field)),
++			count=count+1;
++			matrix(1:end-1,count)=results(i).(field);
++			matrix(end,count)=results(i).time/md.constants.yts;
++		end
++	end
++
++	newtime=getfieldvalue(options,'time',[]);
++	newmatrix=zeros(nods+1,length(newtime));
++	if ~isempty(newtime),
++		%we are asked to reinterpolate to this new time: 
++
++		for i=1:nods,
++			warning off;
++			ts=timeseries(matrix(i,:), matrix(end,:));
++			ts=resample(ts,newtime);
++			warning on;
++			newmatrix(i,:)=ts.Data;
++			newmatrix(end,:)=ts.Time;
++		end
++
++		matrix=newmatrix;
++	end
Index: /issm/oecreview/Archive/18296-19100/ISSM-19012-19013.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19012-19013.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19012-19013.diff	(revision 19102)
@@ -0,0 +1,220 @@
+Index: ../trunk-jpl/src/m/plot/writejsfile.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/writejsfile.m	(revision 0)
++++ ../trunk-jpl/src/m/plot/writejsfile.m	(revision 19013)
+@@ -0,0 +1,59 @@
++function writejsfile(filename,model,keyname)
++%WRITEJSFILE - write model file to javascript database
++%
++%   Usage:
++%      writejsfile(filename,model,keyname)
++%
++
++	nods=length(model.x);
++	nel=size(model.index,1);
++	nx=length(model.contourx1);
++	
++	fid=fopen(filename,'w');
++
++	fprintf(fid,'model = {};\n');
++	fprintf(fid,'model["title"]="%s";\n',model.title);
++	fprintf(fid,'model["initialZoomFactor"]=%s;\n',model.initialZoomFactor);
++	
++	%write index:
++	fprintf(fid,'<!-- model["index"]{{{-->\n');
++	fprintf(fid,'model["index"]=[');
++	for i=1:nel-1,
++		fprintf(fid,'[%i, %i, %i],',model.index(i,1),model.index(i,2),model.index(i,3));
++	end
++	fprintf(fid,'[%i, %i, %i]];\n',model.index(end,1),model.index(end,2),model.index(end,3));
++	fprintf(fid,'<!--}}}-->\n');
++	
++	writejsfield(fid,'model["x"]',model.x,nods);
++	writejsfield(fid,'model["y"]',model.y,nods);
++	writejsfield(fid,'model["z"]',model.z,nods);
++	writejsfield(fid,'model["surface"]',model.surface,nods);
++	writejsfield(fid,'model["contourx1"]',model.contourx1,nx);
++	writejsfield(fid,'model["contoury1"]',model.contoury1,nx);
++	writejsfield(fid,'model["contourz1"]',model.contourz1,nx);
++	writejsfield(fid,'model["contourx2"]',model.contourx2,nx);
++	writejsfield(fid,'model["contoury2"]',model.contoury2,nx);
++	writejsfield(fid,'model["contourz2"]',model.contourz2,nx);
++
++
++	results=model.results;
++	fprintf(fid,'results={};\n');
++
++	for i=1:length(results),
++		fprintf(fid,'result={};\n');
++		writejsfield(fid,'result["data"]',results(i).data,nods);
++		fprintf(fid,'<!--{{{-->\n');
++		fprintf(fid,'result["caxis"]=[%g,%g];\n',results(i).caxis(1),results(i).caxis(2));
++		fprintf(fid,'result["label"]="%s";\n',results(i).label);
++		fprintf(fid,'result["shortlabel"]="%s";\n',results(i).shortlabel);
++		fprintf(fid,'result["unit"]="%s";\n',results(i).unit);
++		if size(results(i).data,2)>1,
++			fprintf(fid,'result["time_range"]=[%g,%g];\n',results(i).time_range(1),results(i).time_range(2));
++		end
++		fprintf(fid,'results["%i"]=result;\n',i);
++		fprintf(fid,'<!--}}}-->\n');
++	end
++	fprintf(fid,'model.results=results;\n');
++	fprintf(fid,'models["%s"]=model;\n',keyname);
++
++	fclose(fid);
+Index: ../trunk-jpl/src/m/plot/writejsfield.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/writejsfield.m	(revision 0)
++++ ../trunk-jpl/src/m/plot/writejsfield.m	(revision 19013)
+@@ -0,0 +1,29 @@
++function writejsfield(fid,name,variable,nods)
++%WRITEJSFIELD - write variable to javascript file 
++%
++%   Usage:
++%      writejsfield(fid,name,variable)
++%
++
++	%write array:
++	if size(variable,2)==1,
++		fprintf(fid,'<!-- %s{{{-->\n',name);
++		fprintf(fid,'%s=[',name);
++		for i=1:nods-1,
++			fprintf(fid,'%g,',variable(i));
++		end
++		fprintf(fid,'%g];\n',variable(end));
++		fprintf(fid,'<!--}}}-->\n');
++	else
++		%multi-sized array: 
++		fprintf(fid,'<!-- %s{{{-->\n',name);
++		fprintf(fid,'%s=[]\n',name);
++		for i=1:size(variable,2),
++			fprintf(fid,'%s["%i"]=[',name,i);
++			for j=1:nods-1,
++				fprintf(fid,'%g,',variable(j,i));
++			end
++			fprintf(fid,'%g];\n',variable(end,i));
++		end
++		fprintf(fid,'<!--}}}-->\n');
++	end
+Index: ../trunk-jpl/src/m/plot/export_gl.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/export_gl.m	(revision 0)
++++ ../trunk-jpl/src/m/plot/export_gl.m	(revision 19013)
+@@ -0,0 +1,117 @@
++function export_gl(md,varargin)
++
++	templist=plotoptions(varargin{:}); 
++	optionslist=templist.list;
++	options=optionslist{1};
++	options=checkplotoptions(md,options);
++
++	%Setup unique directory in present dir: 
++	directory=getfieldvalue(options,'directory','./');
++	databasename=getfieldvalue(options,'database','webgl');
++
++	%scaling factor: 
++	scaling_factor=getfieldvalue(options,'scaling_factor',50);
++
++	%Deal with title: 
++	if exist(options,'title')
++		title=getfieldvalue(options,'title');
++	else
++		title='';
++	end
++
++	%initialize model: 
++	model.title=title;
++	model.initialZoomFactor=getfieldvalue(options,'zoom',-.25);
++
++	%Deal with contour {{{
++
++	contour_lat1=md.mesh.lat(md.mesh.segments(:,1));
++	contour_lat2=md.mesh.lat(md.mesh.segments(:,2));
++	contour_long1=md.mesh.long(md.mesh.segments(:,1));
++	contour_long2=md.mesh.long(md.mesh.segments(:,2));
++	contour_surface1=md.geometry.surface(md.mesh.segments(:,1));
++	contour_surface2=md.geometry.surface(md.mesh.segments(:,2));
++
++	R1=6371000*ones(length(contour_surface1),1)+scaling_factor*contour_surface1;
++	R2=6371000*ones(length(contour_surface2),1)+scaling_factor*contour_surface2;
++
++	contourx1 = R1 .* cosd(contour_lat1) .* cosd(contour_long1);
++	contoury1 = R1 .* cosd(contour_lat1) .* sind(contour_long1);
++	contourz1 = R1 .* sind(contour_lat1);
++	
++	contourx2 = R2 .* cosd(contour_lat2) .* cosd(contour_long2);
++	contoury2 = R2 .* cosd(contour_lat2) .* sind(contour_long2);
++	contourz2 = R2 .* sind(contour_lat2);
++
++
++	model.contourx1=contourx1;
++	model.contoury1=contoury1;
++	model.contourz1=contourz1;
++	model.contourx2=contourx2;
++	model.contoury2=contoury2;
++	model.contourz2=contourz2;
++
++
++	%}}}
++%Deal with mesh and results {{{
++	
++	
++	lat=md.mesh.lat;
++	long=md.mesh.long;
++	surface=md.geometry.surface;
++	numberofelements=md.mesh.numberofelements;
++	numberofvertices=md.mesh.numberofvertices;
++
++	R=6371000*ones(numberofvertices,1)+scaling_factor*surface;
++
++	x = R .* cosd(lat) .* cosd(long);
++	y = R .* cosd(lat) .* sind(long);
++	z = R .* sind(lat);
++
++
++	%Deal with triangulation: 
++	model.index=md.mesh.elements;
++	model.x=x;
++	model.y=y;
++	model.z=z;
++	model.surface=surface;
++	
++	%Deal with data: 
++	results=struct([]);
++	for i=1:length(optionslist),
++		options=optionslist{i}; options=checkplotoptions(md,options);
++		data=getfieldvalue(options,'data');
++		results(i).data=data;
++		results(i).caxis=getfieldvalue(options,'caxis',[min(data(:)) max(data(:))]);
++
++		label=getfieldvalue(options,'label','');
++		if strcmpi(label,''),
++			%create generic label: 
++			label=['data' num2str(i)];
++		end
++		results(i).label=label;
++
++		shortlabel=getfieldvalue(options,'shortlabel','');
++		if strcmpi(shortlabel,''),
++			%create generic short label: 
++			shortlabel=['data' num2str(i)];
++		end
++		results(i).shortlabel=shortlabel;
++		
++		if size(data,2)>1,
++			time_range=getfieldvalue(options,'time_range',[0 100]);
++			results(i).time_range=time_range;
++		end
++
++		unit=getfieldvalue(options,'unit','');
++		if strcmpi(unit,''),
++			%create generic unit: 
++			unit='SI';
++		end
++		results(i).unit=unit;
++	end
++	model.results=results;
++	
++	%Write model to javascript database file: 
++	writejsfile([directory databasename '.js'],model,databasename);
++%}}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-19013-19014.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19013-19014.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19013-19014.diff	(revision 19102)
@@ -0,0 +1,43 @@
+Index: ../trunk-jpl/src/m/classes/matice.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/matice.m	(revision 19013)
++++ ../trunk-jpl/src/m/classes/matice.m	(revision 19014)
+@@ -142,7 +142,7 @@
+ 			md = checkfield(md,'fieldname','materials.rho_water','>',0);
+ 			md = checkfield(md,'fieldname','materials.rho_freshwater','>',0);
+ 			md = checkfield(md,'fieldname','materials.mu_water','>',0);
+-			md = checkfield(md,'fieldname','materials.rheology_B','>',0,'size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','materials.rheology_B','>',0,'forcing',1,'NaN',1);
+ 			md = checkfield(md,'fieldname','materials.rheology_n','>',0,'size',[md.mesh.numberofelements 1]);
+ 			md = checkfield(md,'fieldname','materials.rheology_law','values',{'None' 'Cuffey' 'Paterson' 'Arrhenius' 'LliboutryDuval'});
+ 
+@@ -191,7 +191,7 @@
+ 			WriteData(fid,'object',obj,'class','materials','fieldname','beta','format','Double');
+ 			WriteData(fid,'object',obj,'class','materials','fieldname','mixed_layer_capacity','format','Double');
+ 			WriteData(fid,'object',obj,'class','materials','fieldname','thermal_exchange_velocity','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','rheology_B','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'class','materials','fieldname','rheology_B','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
+ 			WriteData(fid,'object',obj,'class','materials','fieldname','rheology_n','format','DoubleMat','mattype',2);
+ 			WriteData(fid,'data',StringToEnum(obj.rheology_law),'enum',MaterialsRheologyLawEnum(),'format','Integer');
+ 
+Index: ../trunk-jpl/src/m/classes/matice.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/matice.py	(revision 19013)
++++ ../trunk-jpl/src/m/classes/matice.py	(revision 19014)
+@@ -116,7 +116,7 @@
+ 		md = checkfield(md,'fieldname','materials.rho_water','>',0)
+ 		md = checkfield(md,'fieldname','materials.rho_freshwater','>',0)
+ 		md = checkfield(md,'fieldname','materials.mu_water','>',0)
+-		md = checkfield(md,'fieldname','materials.rheology_B','>',0,'size',[md.mesh.numberofvertices])
++		md = checkfield(md,'fieldname','materials.rheology_B','>',0,'forcing',1,'NaN',1)
+ 		md = checkfield(md,'fieldname','materials.rheology_n','>',0,'size',[md.mesh.numberofelements])
+ 		md = checkfield(md,'fieldname','materials.rheology_law','values',['None','Cuffey','Paterson','Arrhenius','LliboutryDuval'])
+ 		md = checkfield(md,'fieldname','materials.lithosphere_shear_modulus','>',0,'numel',[1]);
+@@ -139,6 +139,7 @@
+ 		WriteData(fid,'object',self,'class','materials','fieldname','beta','format','Double')
+ 		WriteData(fid,'object',self,'class','materials','fieldname','mixed_layer_capacity','format','Double')
+ 		WriteData(fid,'object',self,'class','materials','fieldname','thermal_exchange_velocity','format','Double')
++		WriteData(fid,'object',self,'class','materials','fieldname','rheology_B','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
+ 		WriteData(fid,'object',self,'class','materials','fieldname','rheology_B','format','DoubleMat','mattype',1)
+ 		WriteData(fid,'object',self,'class','materials','fieldname','rheology_n','format','DoubleMat','mattype',2)
+ 		WriteData(fid,'data',StringToEnum(self.rheology_law)[0],'enum',MaterialsRheologyLawEnum(),'format','Integer')
Index: /issm/oecreview/Archive/18296-19100/ISSM-19014-19015.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19014-19015.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19014-19015.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/c/modules/modules.h
+===================================================================
+--- ../trunk-jpl/src/c/modules/modules.h	(revision 19014)
++++ ../trunk-jpl/src/c/modules/modules.h	(revision 19015)
+@@ -19,6 +19,7 @@
+ #include "./CreateNodalConstraintsx/CreateNodalConstraintsx.h"
+ #include "./CreateJacobianMatrixx/CreateJacobianMatrixx.h"
+ #include "./DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.h"
++#include "./ExpToLevelSetx/ExpToLevelSetx.h"
+ #include "./ElementConnectivityx/ElementConnectivityx.h"
+ #include "./GetSolutionFromInputsx/GetSolutionFromInputsx.h"
+ #include "./GetVectorFromInputsx/GetVectorFromInputsx.h"
Index: /issm/oecreview/Archive/18296-19100/ISSM-19015-19016.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19015-19016.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19015-19016.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/m/plot/plotdoc.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/plotdoc.m	(revision 19015)
++++ ../trunk-jpl/src/m/plot/plotdoc.m	(revision 19016)
+@@ -53,7 +53,6 @@
+ disp('                  - ''part_hist'': partitioning node and area histogram');
+ disp('                  - ''quiver'': quiver plot');
+ 
+-disp('       ''alloptions'': apply the options to all subplots if ''on''');
+ disp('       ''axis'': same as standard matlab option (''equal'',''off'',''equal on'',...)');
+ disp('       ''basin'': zoom on a given basin (''pineislandglacier'',''ronneiceshelf'', use isbasin to identify a basin');
+ disp('                 ''basindeltax'': in m');
Index: /issm/oecreview/Archive/18296-19100/ISSM-19016-19017.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19016-19017.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19016-19017.diff	(revision 19102)
@@ -0,0 +1,10 @@
+Index: ../trunk-jpl/src/c/modules/ExpToLevelSetx
+===================================================================
+--- ../trunk-jpl/src/c/modules/ExpToLevelSetx	(revision 19016)
++++ ../trunk-jpl/src/c/modules/ExpToLevelSetx	(revision 19017)
+
+Property changes on: ../trunk-jpl/src/c/modules/ExpToLevelSetx
+___________________________________________________________________
+Added: svn:ignore
+## -0,0 +1 ##
++.deps
Index: /issm/oecreview/Archive/18296-19100/ISSM-19017-19018.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19017-19018.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19017-19018.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 19017)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 19018)
+@@ -301,7 +301,7 @@
+ 					meltingrate_input->GetInputValue(&meltingrate,gauss);
+ 
+ 					norm_calving=0.;
+-					for(i=0;i<dim;i++) norm_calving+=pow(c[i],2);
++					for(i=0;i<dim;i++) norm_calving+=c[i]*c[i];
+ 					norm_calving=sqrt(norm_calving)+1.e-14;
+ 
+ 					for(i=0;i<dim;i++) m[i]=meltingrate*c[i]/norm_calving;
Index: /issm/oecreview/Archive/18296-19100/ISSM-19018-19019.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19018-19019.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19018-19019.diff	(revision 19102)
@@ -0,0 +1,331 @@
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 19018)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 19019)
+@@ -216,6 +216,7 @@
+ 	CalvingMeltingrateEnum,
+ 	CalvingLevermannEnum,
+ 	CalvingPiEnum,
++	CalvingDevEnum,
+ 	DefaultCalvingEnum,
+ 	CalvingRequestedOutputsEnum,
+ 	CalvinglevermannCoeffEnum,
+@@ -228,6 +229,7 @@
+ 	CalvingrateyAverageEnum,
+ 	StrainRateparallelEnum,
+ 	StrainRateperpendicularEnum,
++	StrainRateeffectiveEnum,
+ 	MaterialsRhoIceEnum,
+ 	MaterialsRhoSeawaterEnum,
+ 	MaterialsRhoFreshwaterEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 19018)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 19019)
+@@ -224,6 +224,7 @@
+ 		case CalvingMeltingrateEnum : return "CalvingMeltingrate";
+ 		case CalvingLevermannEnum : return "CalvingLevermann";
+ 		case CalvingPiEnum : return "CalvingPi";
++		case CalvingDevEnum : return "CalvingDev";
+ 		case DefaultCalvingEnum : return "DefaultCalving";
+ 		case CalvingRequestedOutputsEnum : return "CalvingRequestedOutputs";
+ 		case CalvinglevermannCoeffEnum : return "CalvinglevermannCoeff";
+@@ -236,6 +237,7 @@
+ 		case CalvingrateyAverageEnum : return "CalvingrateyAverage";
+ 		case StrainRateparallelEnum : return "StrainRateparallel";
+ 		case StrainRateperpendicularEnum : return "StrainRateperpendicular";
++		case StrainRateeffectiveEnum : return "StrainRateeffective";
+ 		case MaterialsRhoIceEnum : return "MaterialsRhoIce";
+ 		case MaterialsRhoSeawaterEnum : return "MaterialsRhoSeawater";
+ 		case MaterialsRhoFreshwaterEnum : return "MaterialsRhoFreshwater";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 19018)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 19019)
+@@ -227,6 +227,7 @@
+ 	      else if (strcmp(name,"CalvingMeltingrate")==0) return CalvingMeltingrateEnum;
+ 	      else if (strcmp(name,"CalvingLevermann")==0) return CalvingLevermannEnum;
+ 	      else if (strcmp(name,"CalvingPi")==0) return CalvingPiEnum;
++	      else if (strcmp(name,"CalvingDev")==0) return CalvingDevEnum;
+ 	      else if (strcmp(name,"DefaultCalving")==0) return DefaultCalvingEnum;
+ 	      else if (strcmp(name,"CalvingRequestedOutputs")==0) return CalvingRequestedOutputsEnum;
+ 	      else if (strcmp(name,"CalvinglevermannCoeff")==0) return CalvinglevermannCoeffEnum;
+@@ -239,6 +240,7 @@
+ 	      else if (strcmp(name,"CalvingrateyAverage")==0) return CalvingrateyAverageEnum;
+ 	      else if (strcmp(name,"StrainRateparallel")==0) return StrainRateparallelEnum;
+ 	      else if (strcmp(name,"StrainRateperpendicular")==0) return StrainRateperpendicularEnum;
++	      else if (strcmp(name,"StrainRateeffective")==0) return StrainRateeffectiveEnum;
+ 	      else if (strcmp(name,"MaterialsRhoIce")==0) return MaterialsRhoIceEnum;
+ 	      else if (strcmp(name,"MaterialsRhoSeawater")==0) return MaterialsRhoSeawaterEnum;
+ 	      else if (strcmp(name,"MaterialsRhoFreshwater")==0) return MaterialsRhoFreshwaterEnum;
+@@ -257,12 +259,12 @@
+ 	      else if (strcmp(name,"MeshNumberofelements2d")==0) return MeshNumberofelements2dEnum;
+ 	      else if (strcmp(name,"MeshNumberofelements")==0) return MeshNumberofelementsEnum;
+ 	      else if (strcmp(name,"MeshNumberoflayers")==0) return MeshNumberoflayersEnum;
+-	      else if (strcmp(name,"MeshNumberofvertices2d")==0) return MeshNumberofvertices2dEnum;
+-	      else if (strcmp(name,"MeshNumberofvertices")==0) return MeshNumberofverticesEnum;
+          else stage=3;
+    }
+    if(stage==3){
+-	      if (strcmp(name,"MeshUpperelements")==0) return MeshUpperelementsEnum;
++	      if (strcmp(name,"MeshNumberofvertices2d")==0) return MeshNumberofvertices2dEnum;
++	      else if (strcmp(name,"MeshNumberofvertices")==0) return MeshNumberofverticesEnum;
++	      else if (strcmp(name,"MeshUpperelements")==0) return MeshUpperelementsEnum;
+ 	      else if (strcmp(name,"MeshVertexonbase")==0) return MeshVertexonbaseEnum;
+ 	      else if (strcmp(name,"MeshVertexonsurface")==0) return MeshVertexonsurfaceEnum;
+ 	      else if (strcmp(name,"MeshVertexonboundary")==0) return MeshVertexonboundaryEnum;
+@@ -380,12 +382,12 @@
+ 	      else if (strcmp(name,"SMBcomponents")==0) return SMBcomponentsEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsAccumulation")==0) return SurfaceforcingsAccumulationEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsEvaporation")==0) return SurfaceforcingsEvaporationEnum;
+-	      else if (strcmp(name,"SurfaceforcingsRunoff")==0) return SurfaceforcingsRunoffEnum;
+-	      else if (strcmp(name,"SMBmeltcomponents")==0) return SMBmeltcomponentsEnum;
+          else stage=4;
+    }
+    if(stage==4){
+-	      if (strcmp(name,"SurfaceforcingsMelt")==0) return SurfaceforcingsMeltEnum;
++	      if (strcmp(name,"SurfaceforcingsRunoff")==0) return SurfaceforcingsRunoffEnum;
++	      else if (strcmp(name,"SMBmeltcomponents")==0) return SMBmeltcomponentsEnum;
++	      else if (strcmp(name,"SurfaceforcingsMelt")==0) return SurfaceforcingsMeltEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsRefreeze")==0) return SurfaceforcingsRefreezeEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsIspdd")==0) return SurfaceforcingsIspddEnum;
+ 	      else if (strcmp(name,"SurfaceforcingsIssmbgradients")==0) return SurfaceforcingsIssmbgradientsEnum;
+@@ -503,12 +505,12 @@
+ 	      else if (strcmp(name,"Pengrid")==0) return PengridEnum;
+ 	      else if (strcmp(name,"Penpair")==0) return PenpairEnum;
+ 	      else if (strcmp(name,"Profiler")==0) return ProfilerEnum;
+-	      else if (strcmp(name,"MatrixParam")==0) return MatrixParamEnum;
+-	      else if (strcmp(name,"Masscon")==0) return MassconEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"MassconName")==0) return MassconNameEnum;
++	      if (strcmp(name,"MatrixParam")==0) return MatrixParamEnum;
++	      else if (strcmp(name,"Masscon")==0) return MassconEnum;
++	      else if (strcmp(name,"MassconName")==0) return MassconNameEnum;
+ 	      else if (strcmp(name,"MassconDefinitionenum")==0) return MassconDefinitionenumEnum;
+ 	      else if (strcmp(name,"MassconLevelset")==0) return MassconLevelsetEnum;
+ 	      else if (strcmp(name,"Massconaxpby")==0) return MassconaxpbyEnum;
+@@ -626,12 +628,12 @@
+ 	      else if (strcmp(name,"DeviatoricStress")==0) return DeviatoricStressEnum;
+ 	      else if (strcmp(name,"DeviatoricStressxx")==0) return DeviatoricStressxxEnum;
+ 	      else if (strcmp(name,"DeviatoricStressxy")==0) return DeviatoricStressxyEnum;
+-	      else if (strcmp(name,"DeviatoricStressxz")==0) return DeviatoricStressxzEnum;
+-	      else if (strcmp(name,"DeviatoricStressyy")==0) return DeviatoricStressyyEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"DeviatoricStressyz")==0) return DeviatoricStressyzEnum;
++	      if (strcmp(name,"DeviatoricStressxz")==0) return DeviatoricStressxzEnum;
++	      else if (strcmp(name,"DeviatoricStressyy")==0) return DeviatoricStressyyEnum;
++	      else if (strcmp(name,"DeviatoricStressyz")==0) return DeviatoricStressyzEnum;
+ 	      else if (strcmp(name,"DeviatoricStresszz")==0) return DeviatoricStresszzEnum;
+ 	      else if (strcmp(name,"StrainRate")==0) return StrainRateEnum;
+ 	      else if (strcmp(name,"StrainRatexx")==0) return StrainRatexxEnum;
+@@ -749,12 +751,12 @@
+ 	      else if (strcmp(name,"Outputdefinition69")==0) return Outputdefinition69Enum;
+ 	      else if (strcmp(name,"Outputdefinition70")==0) return Outputdefinition70Enum;
+ 	      else if (strcmp(name,"Outputdefinition71")==0) return Outputdefinition71Enum;
+-	      else if (strcmp(name,"Outputdefinition72")==0) return Outputdefinition72Enum;
+-	      else if (strcmp(name,"Outputdefinition73")==0) return Outputdefinition73Enum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"Outputdefinition74")==0) return Outputdefinition74Enum;
++	      if (strcmp(name,"Outputdefinition72")==0) return Outputdefinition72Enum;
++	      else if (strcmp(name,"Outputdefinition73")==0) return Outputdefinition73Enum;
++	      else if (strcmp(name,"Outputdefinition74")==0) return Outputdefinition74Enum;
+ 	      else if (strcmp(name,"Outputdefinition75")==0) return Outputdefinition75Enum;
+ 	      else if (strcmp(name,"Outputdefinition76")==0) return Outputdefinition76Enum;
+ 	      else if (strcmp(name,"Outputdefinition77")==0) return Outputdefinition77Enum;
+@@ -872,12 +874,12 @@
+ 	      else if (strcmp(name,"XYZ")==0) return XYZEnum;
+ 	      else if (strcmp(name,"Dense")==0) return DenseEnum;
+ 	      else if (strcmp(name,"MpiDense")==0) return MpiDenseEnum;
+-	      else if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum;
+-	      else if (strcmp(name,"Seq")==0) return SeqEnum;
+          else stage=8;
+    }
+    if(stage==8){
+-	      if (strcmp(name,"Mpi")==0) return MpiEnum;
++	      if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum;
++	      else if (strcmp(name,"Seq")==0) return SeqEnum;
++	      else if (strcmp(name,"Mpi")==0) return MpiEnum;
+ 	      else if (strcmp(name,"Mumps")==0) return MumpsEnum;
+ 	      else if (strcmp(name,"Gsl")==0) return GslEnum;
+ 	      else if (strcmp(name,"Option")==0) return OptionEnum;
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 19018)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 19019)
+@@ -1728,36 +1728,44 @@
+ 	/*}}}*/
+ void FemModel::CalvingRateLevermannx(){/*{{{*/
+ 
+-	   for(int i=0;i<elements->Size();i++){
+-			      Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
+-					      element->CalvingRateLevermann();
+-							   }
++	for(int i=0;i<elements->Size();i++){
++		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		element->CalvingRateLevermann();
++	}
+ }
+ /*}}}*/
+ void FemModel::CalvingRatePix(){/*{{{*/
+ 
+-	   for(int i=0;i<elements->Size();i++){
+-			      Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
+-					      element->CalvingRatePi();
+-							   }
++	for(int i=0;i<elements->Size();i++){
++		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		element->CalvingRatePi();
++	}
+ }
+ /*}}}*/
+ void FemModel::StrainRateparallelx(){/*{{{*/
+ 
+-	   for(int i=0;i<elements->Size();i++){
+-			      Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
+-					      element->StrainRateparallel();
+-							   }
++	for(int i=0;i<elements->Size();i++){
++		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		element->StrainRateparallel();
++	}
+ }
+ /*}}}*/
+ void FemModel::StrainRateperpendicularx(){/*{{{*/
+ 
+-	   for(int i=0;i<elements->Size();i++){
+-			      Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
+-					      element->StrainRateperpendicular();
+-							   }
++	for(int i=0;i<elements->Size();i++){
++		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		element->StrainRateperpendicular();
++	}
+ }
+ /*}}}*/
++void FemModel::DeviatoricStressx(){/*{{{*/
++
++	for(int i=0;i<elements->Size();i++){
++		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		element->ComputeDeviatoricStressTensor();
++	}
++}
++/*}}}*/
+ #ifdef  _HAVE_DAKOTA_
+ void FemModel::DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses){/*{{{*/
+ 
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 19018)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 19019)
+@@ -182,6 +182,7 @@
+ 	IssmDouble* eps_xy = xNew<IssmDouble>(numvertices);
+ 	IssmDouble* eps_xz = xNew<IssmDouble>(numvertices);
+ 	IssmDouble* eps_yz = xNew<IssmDouble>(numvertices);
++	IssmDouble* eps_ef = xNew<IssmDouble>(numvertices);
+ 
+ 	/* Start looping on the number of vertices: */
+ 	Gauss* gauss=this->NewGauss();
+@@ -199,6 +200,8 @@
+ 			eps_xx[iv]=epsilon[0]; 
+ 			eps_yy[iv]=epsilon[1];
+ 			eps_xy[iv]=epsilon[2];
++			/* eps_eff^2 = 1/2 ( exx^2 + eyy^2 + 2*exy^2 )*/
++			eps_ef[iv] = 1./sqrt(2.)*sqrt(epsilon[0]*epsilon[0] + epsilon[1]*epsilon[1] + 2.*epsilon[2]*epsilon[2]);
+ 		}
+ 		else{
+ 			/*epsilon=[exx eyy ezz exy exz eyz]*/
+@@ -208,6 +211,8 @@
+ 			eps_xy[iv]=epsilon[3]; 
+ 			eps_xz[iv]=epsilon[4];
+ 			eps_yz[iv]=epsilon[5];
++			/* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
++			eps_ef[iv] = sqrt(epsilon[0]*epsilon[0] + epsilon[1]*epsilon[1] + epsilon[3]*epsilon[3] +  epsilon[4]*epsilon[4] + epsilon[5]*epsilon[5] + epsilon[0]*epsilon[1]);
+ 		}
+ 	}
+ 
+@@ -218,6 +223,7 @@
+ 	this->AddInput(StrainRateyyEnum,eps_yy,P1Enum);
+ 	this->AddInput(StrainRateyzEnum,eps_yz,P1Enum);
+ 	this->AddInput(StrainRatezzEnum,eps_zz,P1Enum);
++	this->AddInput(StrainRateeffectiveEnum,eps_ef,P1Enum);
+ 
+ 	/*Clean up and return*/
+ 	delete gauss;
+@@ -1340,6 +1346,7 @@
+ 			case StrainRateyyEnum:
+ 			case StrainRateyzEnum:
+ 			case StrainRatezzEnum:
++			case StrainRateeffectiveEnum:
+ 				this->ComputeStrainRate();
+ 				input=this->inputs->GetInput(output_enum);
+ 				break;
+Index: ../trunk-jpl/src/c/classes/FemModel.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.h	(revision 19018)
++++ ../trunk-jpl/src/c/classes/FemModel.h	(revision 19019)
+@@ -84,6 +84,7 @@
+ 		void StressIntensityFactorx();
+ 		void StrainRateparallelx();
+ 		void StrainRateperpendicularx();
++		void DeviatoricStressx();
+ 		void CalvingRateLevermannx();
+ 		void CalvingRatePix();
+ 		#ifdef  _HAVE_DAKOTA_
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 19018)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 19019)
+@@ -216,6 +216,7 @@
+ def CalvingMeltingrateEnum(): return StringToEnum("CalvingMeltingrate")[0]
+ def CalvingLevermannEnum(): return StringToEnum("CalvingLevermann")[0]
+ def CalvingPiEnum(): return StringToEnum("CalvingPi")[0]
++def CalvingDevEnum(): return StringToEnum("CalvingDev")[0]
+ def DefaultCalvingEnum(): return StringToEnum("DefaultCalving")[0]
+ def CalvingRequestedOutputsEnum(): return StringToEnum("CalvingRequestedOutputs")[0]
+ def CalvinglevermannCoeffEnum(): return StringToEnum("CalvinglevermannCoeff")[0]
+@@ -228,6 +229,7 @@
+ def CalvingrateyAverageEnum(): return StringToEnum("CalvingrateyAverage")[0]
+ def StrainRateparallelEnum(): return StringToEnum("StrainRateparallel")[0]
+ def StrainRateperpendicularEnum(): return StringToEnum("StrainRateperpendicular")[0]
++def StrainRateeffectiveEnum(): return StringToEnum("StrainRateeffective")[0]
+ def MaterialsRhoIceEnum(): return StringToEnum("MaterialsRhoIce")[0]
+ def MaterialsRhoSeawaterEnum(): return StringToEnum("MaterialsRhoSeawater")[0]
+ def MaterialsRhoFreshwaterEnum(): return StringToEnum("MaterialsRhoFreshwater")[0]
+Index: ../trunk-jpl/src/m/enum/CalvingDevEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/CalvingDevEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/CalvingDevEnum.m	(revision 19019)
+@@ -0,0 +1,11 @@
++function macro=CalvingDevEnum()
++%CALVINGDEVENUM - Enum of CalvingDev
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=CalvingDevEnum()
++
++macro=StringToEnum('CalvingDev');
+Index: ../trunk-jpl/src/m/enum/StrainRateeffectiveEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StrainRateeffectiveEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/StrainRateeffectiveEnum.m	(revision 19019)
+@@ -0,0 +1,11 @@
++function macro=StrainRateeffectiveEnum()
++%STRAINRATEEFFECTIVEENUM - Enum of StrainRateeffective
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=StrainRateeffectiveEnum()
++
++macro=StringToEnum('StrainRateeffective');
Index: /issm/oecreview/Archive/18296-19100/ISSM-19019-19020.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19019-19020.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19019-19020.diff	(revision 19102)
@@ -0,0 +1,33 @@
+Index: ../trunk-jpl/src/wrappers/M1qn3
+===================================================================
+--- ../trunk-jpl/src/wrappers/M1qn3	(revision 19019)
++++ ../trunk-jpl/src/wrappers/M1qn3	(revision 19020)
+
+Property changes on: ../trunk-jpl/src/wrappers/M1qn3
+___________________________________________________________________
+Added: svn:ignore
+## -0,0 +1 ##
++.deps
+Index: ../trunk-jpl/src/wrappers/matlab/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/wrappers/matlab/Makefile.am	(revision 19019)
++++ ../trunk-jpl/src/wrappers/matlab/Makefile.am	(revision 19020)
+@@ -229,7 +229,7 @@
+ 
+ M1qn3_la_SOURCES = ../M1qn3/M1qn3.cpp\
+ 									../M1qn3/M1qn3.h
+-M1qn3_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(METISLIB) $(GSLLIB) $(PROJ4LIB)
++M1qn3_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(METISLIB) $(M1QN3LIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ MeshProfileIntersection_la_SOURCES = ../MeshProfileIntersection/MeshProfileIntersection.cpp\
+ 												 ../MeshProfileIntersection/MeshProfileIntersection.h
+Index: ../trunk-jpl/src/wrappers/ExpToLevelSet
+===================================================================
+--- ../trunk-jpl/src/wrappers/ExpToLevelSet	(revision 19019)
++++ ../trunk-jpl/src/wrappers/ExpToLevelSet	(revision 19020)
+
+Property changes on: ../trunk-jpl/src/wrappers/ExpToLevelSet
+___________________________________________________________________
+Added: svn:ignore
+## -0,0 +1 ##
++.deps
Index: /issm/oecreview/Archive/18296-19100/ISSM-19020-19021.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19020-19021.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19020-19021.diff	(revision 19102)
@@ -0,0 +1,41 @@
+Index: ../trunk-jpl/src/wrappers/M1qn3/M1qn3.cpp
+===================================================================
+--- ../trunk-jpl/src/wrappers/M1qn3/M1qn3.cpp	(revision 19020)
++++ ../trunk-jpl/src/wrappers/M1qn3/M1qn3.cpp	(revision 19021)
+@@ -4,6 +4,7 @@
+ 
+ #include "./M1qn3.h"
+ 
++#ifndef _HAVE_M1QN3_
+ /*m1qn3 prototypes {{{*/
+ extern "C" void *ctonbe_; // DIS mode : Conversion
+ extern "C" void *ctcabe_; // DIS mode : Conversion
+@@ -23,7 +24,6 @@
+ 	double* Xs;
+ 	double* Js;
+ } Data; 
+-
+ /*}}}*/
+ void M1qn3Usage(void){/*{{{*/
+ 	_printf0_("   usage:\n");
+@@ -34,8 +34,10 @@
+ 	_printf0_("      X - the new direction.\n");
+ 	_printf0_("\n");
+ }/*}}}*/
++#endif
+ WRAPPER(M1qn3){
+ 
++#ifndef _HAVE_M1QN3_
+ 	/*input: */
+ 	double* Xs=NULL;
+ 	double* Gs=NULL;
+@@ -152,6 +154,9 @@
+ 
+ 	/*end module: */
+ 	MODULEEND();
++	#else
++	_error_("m1qn3 is not installed");
++	#endif
+ }
+ 
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-19021-19022.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19021-19022.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19021-19022.diff	(revision 19102)
@@ -0,0 +1,17 @@
+Index: ../trunk-jpl/src/wrappers/M1qn3/M1qn3.cpp
+===================================================================
+--- ../trunk-jpl/src/wrappers/M1qn3/M1qn3.cpp	(revision 19021)
++++ ../trunk-jpl/src/wrappers/M1qn3/M1qn3.cpp	(revision 19022)
+@@ -160,6 +160,7 @@
+ }
+ 
+ 
++#ifndef _HAVE_M1QN3_
+ void fakesimul(long* indic,long* n,double* X,double* pf,double* G,long izs[1],float rzs[1],void* dzs){
+ 
+ 	Data* ds=(Data*)dzs;
+@@ -181,3 +182,4 @@
+ 	}
+ 
+ }
++#endif
Index: /issm/oecreview/Archive/18296-19100/ISSM-19022-19023.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19022-19023.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19022-19023.diff	(revision 19102)
@@ -0,0 +1,138 @@
+Index: ../trunk-jpl/src/m/contrib/resultstomatrix.m
+===================================================================
+--- ../trunk-jpl/src/m/contrib/resultstomatrix.m	(revision 19022)
++++ ../trunk-jpl/src/m/contrib/resultstomatrix.m	(revision 19023)
+@@ -1,64 +0,0 @@
+-function matrix=resultstomatrix(md,resultname,field,varargin)
+-%RESULTSTOMATRIX - go grab in the model results structure the vector results for each time step (which is not empty), 
+-%                  and line them up in a matrix.  If time vector is provided, resample.
+-%
+-%   Usage:
+-%      matrix=resultstomatrix(model,solutioname,fieldname)
+-%
+-%   Available options:
+-%      - 'time'     : vector providing new time tags used to resample time
+-%
+-%   Example:
+-%      vel=resultstomatrix(md,'TransientSolution','Vel');
+-%      vel=resultstomatrix(md,'TransientSolution','Vel','time',2008:1/12:2014);
+-%
+-%   See also MODEL  resample
+-
+-
+-	options=pairoptions(varargin{:});
+-
+-	results=md.results.(resultname);
+-
+-	%first, figure out the size: 
+-	count=0;
+-	nods=0;
+-	for i=1:length(results),
+-		if ~isempty(results(i).(field)),
+-			count=count+1;
+-			nods=size(results(i).(field),1);
+-		end
+-	end
+-
+-	if ~count, 
+-		error(['could not find any result ' field ' in ' resultname]);
+-	end
+-
+-	%initialize: 
+-	matrix=zeros(nods+1,count);
+-
+-	%fill it up: 
+-	count=0;
+-	for i=1:length(results),
+-		if ~isempty(results(i).(field)),
+-			count=count+1;
+-			matrix(1:end-1,count)=results(i).(field);
+-			matrix(end,count)=results(i).time/md.constants.yts;
+-		end
+-	end
+-
+-	newtime=getfieldvalue(options,'time',[]);
+-	newmatrix=zeros(nods+1,length(newtime));
+-	if ~isempty(newtime),
+-		%we are asked to reinterpolate to this new time: 
+-
+-		for i=1:nods,
+-			warning off;
+-			ts=timeseries(matrix(i,:), matrix(end,:));
+-			ts=resample(ts,newtime);
+-			warning on;
+-			newmatrix(i,:)=ts.Data;
+-			newmatrix(end,:)=ts.Time;
+-		end
+-
+-		matrix=newmatrix;
+-	end
+Index: ../trunk-jpl/src/m/contrib/hack/resultstomatrix.m
+===================================================================
+--- ../trunk-jpl/src/m/contrib/hack/resultstomatrix.m	(revision 0)
++++ ../trunk-jpl/src/m/contrib/hack/resultstomatrix.m	(revision 19023)
+@@ -0,0 +1,64 @@
++function matrix=resultstomatrix(md,resultname,field,varargin)
++%RESULTSTOMATRIX - go grab in the model results structure the vector results for each time step (which is not empty), 
++%                  and line them up in a matrix.  If time vector is provided, resample.
++%
++%   Usage:
++%      matrix=resultstomatrix(model,solutioname,fieldname)
++%
++%   Available options:
++%      - 'time'     : vector providing new time tags used to resample time
++%
++%   Example:
++%      vel=resultstomatrix(md,'TransientSolution','Vel');
++%      vel=resultstomatrix(md,'TransientSolution','Vel','time',2008:1/12:2014);
++%
++%   See also MODEL  resample
++
++
++	options=pairoptions(varargin{:});
++
++	results=md.results.(resultname);
++
++	%first, figure out the size: 
++	count=0;
++	nods=0;
++	for i=1:length(results),
++		if ~isempty(results(i).(field)),
++			count=count+1;
++			nods=size(results(i).(field),1);
++		end
++	end
++
++	if ~count, 
++		error(['could not find any result ' field ' in ' resultname]);
++	end
++
++	%initialize: 
++	matrix=zeros(nods+1,count);
++
++	%fill it up: 
++	count=0;
++	for i=1:length(results),
++		if ~isempty(results(i).(field)),
++			count=count+1;
++			matrix(1:end-1,count)=results(i).(field);
++			matrix(end,count)=results(i).time/md.constants.yts;
++		end
++	end
++
++	newtime=getfieldvalue(options,'time',[]);
++	newmatrix=zeros(nods+1,length(newtime));
++	if ~isempty(newtime),
++		%we are asked to reinterpolate to this new time: 
++
++		for i=1:nods,
++			warning off;
++			ts=timeseries(matrix(i,:), matrix(end,:));
++			ts=resample(ts,newtime);
++			warning on;
++			newmatrix(i,:)=ts.Data;
++			newmatrix(end,:)=ts.Time;
++		end
++
++		matrix=newmatrix;
++	end
Index: /issm/oecreview/Archive/18296-19100/ISSM-19023-19024.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19023-19024.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19023-19024.diff	(revision 19102)
@@ -0,0 +1,302 @@
+Index: ../trunk-jpl/src/wrappers/M1qn3/M1qn3.cpp
+===================================================================
+--- ../trunk-jpl/src/wrappers/M1qn3/M1qn3.cpp	(revision 19023)
++++ ../trunk-jpl/src/wrappers/M1qn3/M1qn3.cpp	(revision 19024)
+@@ -4,7 +4,7 @@
+ 
+ #include "./M1qn3.h"
+ 
+-#ifndef _HAVE_M1QN3_
++#ifdef _HAVE_M1QN3_
+ /*m1qn3 prototypes {{{*/
+ extern "C" void *ctonbe_; // DIS mode : Conversion
+ extern "C" void *ctcabe_; // DIS mode : Conversion
+@@ -37,7 +37,7 @@
+ #endif
+ WRAPPER(M1qn3){
+ 
+-#ifndef _HAVE_M1QN3_
++#ifdef _HAVE_M1QN3_
+ 	/*input: */
+ 	double* Xs=NULL;
+ 	double* Gs=NULL;
+@@ -160,7 +160,7 @@
+ }
+ 
+ 
+-#ifndef _HAVE_M1QN3_
++#ifdef _HAVE_M1QN3_
+ void fakesimul(long* indic,long* n,double* X,double* pf,double* G,long izs[1],float rzs[1],void* dzs){
+ 
+ 	Data* ds=(Data*)dzs;
+Index: ../trunk-jpl/src/m/classes/calving.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/calving.py	(revision 19023)
++++ ../trunk-jpl/src/m/classes/calving.py	(revision 19024)
+@@ -13,15 +13,18 @@
+ 	"""
+ 
+ 	def __init__(self): # {{{
+-		self.calvingrate            = float('NaN')
+-		self.meltingrate            = float('NaN')
+ 
++		self.stabilization = 0
++		self.calvingrate   = float('NaN')
++		self.meltingrate   = float('NaN')
++
+ 		#set defaults
+ 		self.setdefaultparameters()
+ 
+ 		#}}}
+ 	def __repr__(self): # {{{
+ 		string='   Calving parameters:'
++		string="%s\n%s"%(string,fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'calvingrate','calving rate at given location [m/a]'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'meltingrate','melting rate at given location [m/a]'))
+ 
+@@ -29,6 +32,9 @@
+ 		#}}}
+ 	def setdefaultparameters(self): # {{{
+ 
++		#stabilization = 2 by default
++		self.stabilization = 2
++
+ 		return self
+ 	#}}}
+ 	def checkconsistency(self,md,solution,analyses):    # {{{
+@@ -37,6 +43,7 @@
+ 		if (solution!=TransientSolutionEnum()) or (not md.transient.iscalving):
+ 			return md
+ 
++		md = checkfield(md,'fieldname','calving.stabilization','values',[0,1,2]);
+ 		md = checkfield(md,'fieldname','calving.calvingrate','>=',0,'forcing',1,'NaN',1);
+ 		md = checkfield(md,'fieldname','calving.meltingrate','>=',0,'forcing',1,'NaN',1);
+ 
+@@ -47,6 +54,7 @@
+ 		yts=365.*24.*3600.
+ 
+ 		WriteData(fid,'enum',CalvingLawEnum(),'data',DefaultCalvingEnum(),'format','Integer');
++		WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',self.stabilization,'format','Integer');
+ 		WriteData(fid,'object',self,'fieldname','calvingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts)
+ 		WriteData(fid,'object',self,'fieldname','meltingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts)
+ 	# }}}
+Index: ../trunk-jpl/src/m/classes/calvinglevermann.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvinglevermann.py	(revision 19023)
++++ ../trunk-jpl/src/m/classes/calvinglevermann.py	(revision 19024)
+@@ -13,8 +13,9 @@
+ 	"""
+ 
+ 	def __init__(self): # {{{
+-		self.coeff       = float('NaN')
+-		self.meltingrate = float('NaN')
++		self.stabilization = 0
++		self.coeff         = float('NaN')
++		self.meltingrate   = float('NaN')
+ 
+ 		#set defaults
+ 		self.setdefaultparameters()
+@@ -22,6 +23,7 @@
+ 		#}}}
+ 	def __repr__(self): # {{{
+ 		string='   Calving Levermann parameters:'
++		string="%s\n%s"%(string,fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'coeff','proportionality coefficient in Levermann model'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'meltingrate','melting rate at given location [m/a]'))
+ 
+@@ -29,6 +31,9 @@
+ 		#}}}
+ 	def setdefaultparameters(self): # {{{
+ 
++		#stabilization = 2 by default
++		self.stabilization = 2
++
+ 		#Proportionality coefficient in Levermann model
+ 		self.coeff=2e13;
+ 	#}}}
+@@ -38,6 +43,7 @@
+ 		if (solution!=TransientSolutionEnum()) or (not md.transient.iscalving):
+ 			return md
+ 
++		md = checkfield(md,'fieldname','calving.stabilization','values',[0,1,2]);
+ 		md = checkfield(md,'fieldname','calving.coeff','size',[md.mesh.numberofvertices],'>',0)
+ 		md = checkfield(md,'fieldname','calving.meltingrate','NaN',1,'size',[md.mesh.numberofvertices],'>=',0)
+ 		return md
+@@ -45,6 +51,7 @@
+ 	def marshall(self,md,fid):    # {{{
+ 		yts=365.*24.*3600.
+ 		WriteData(fid,'enum',CalvingLawEnum(),'data',CalvingLevermannEnum(),'format','Integer');
++		WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',self.stabilization,'format','Integer');
+ 		WriteData(fid,'enum',CalvinglevermannCoeffEnum(),'data',self.coeff,'format','DoubleMat','mattype',1)
+ 		WriteData(fid,'object',self,'fieldname','meltingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts)
+ 	# }}}
+Index: ../trunk-jpl/src/m/classes/calving.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calving.m	(revision 19023)
++++ ../trunk-jpl/src/m/classes/calving.m	(revision 19024)
+@@ -5,35 +5,10 @@
+ 
+ classdef calving
+ 	properties (SetAccess=public) 
+-		 calvingrate            = NaN;
+-		 meltingrate            = NaN;
++		stabilization = 0;
++		calvingrate   = NaN;
++		meltingrate   = NaN;
+ 	end
+-	methods (Static)
+-		function obj = loadobj(obj) % {{{
+-			% This function is directly called by matlab when a model object is
+-			% loaded. If the input is a struct it is an old version of this class and
+-			% old fields must be recovered (make sure they are in the deprecated
+-			% model properties)
+-
+-			if verLessThan('matlab','7.9'),
+-				disp('Warning: your matlab version is old and there is a risk that load does not work correctly');
+-				disp('         if the model is not loaded correctly, rename temporarily loadobj so that matlab does not use it');
+-
+-				% This is a Matlab bug: all the fields of md have their default value
+-				% Example of error message:
+-				% Warning: Error loading an object of class 'model':
+-				% Undefined function or method 'exist' for input arguments of type 'cell'
+-				%
+-				% This has been fixed in MATLAB 7.9 (R2009b) and later versions
+-			end
+-
+-			if isstruct(obj)
+-				disp('Recovering calving from older version');
+-				objstruct = obj;
+-				obj = structtoobj(calving(),objstruct);
+-			end
+-		end% }}}
+-	end
+ 	methods
+ 		function obj = calving(varargin) % {{{
+ 			switch nargin
+@@ -55,21 +30,28 @@
+ 		end % }}}
+ 		function obj = setdefaultparameters(obj) % {{{
+ 
++			%stabilization = 2 by default
++			obj.stabilization = 2;
++
+ 		end % }}}
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+ 			%Early return
+ 			if (solution~=TransientSolutionEnum() | md.transient.iscalving==0), return; end
++
++			md = checkfield(md,'fieldname','calving.stabilization','values',[0 1 2]);
+ 			md = checkfield(md,'fieldname','calving.calvingrate(1:md.mesh.numberofvertices,:)','>=',0,'forcing',1,'NaN',1);
+ 			md = checkfield(md,'fieldname','calving.meltingrate(1:md.mesh.numberofvertices,:)','>=',0,'forcing',1,'NaN',1);
+ 		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   Calving parameters:'));
++			fielddisplay(obj,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding');
+ 			fielddisplay(obj,'calvingrate','calving rate at given location [m/a]');
+ 			fielddisplay(obj,'meltingrate','melting rate at given location [m/a]');
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+ 			yts=365.0*24.0*3600.0;
+ 			WriteData(fid,'enum',CalvingLawEnum(),'data',DefaultCalvingEnum(),'format','Integer');
++			WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',obj.stabilization,'format','Integer');
+ 			WriteData(fid,'object',obj,'fieldname','calvingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts);
+ 			WriteData(fid,'object',obj,'fieldname','meltingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts);
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/calvingpi.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvingpi.m	(revision 19023)
++++ ../trunk-jpl/src/m/classes/calvingpi.m	(revision 19024)
+@@ -5,8 +5,9 @@
+ 
+ classdef calvingpi
+ 	properties (SetAccess=public) 
+-		 coeff       = NaN;
+-		 meltingrate = NaN;
++		stabilization = 0;
++		coeff         = NaN;
++		meltingrate   = NaN;
+ 	end
+ 	methods
+ 		function obj = calvingpi(varargin) % {{{
+@@ -28,17 +29,24 @@
+ 			end
+ 		end % }}}
+ 		function obj = setdefaultparameters(obj) % {{{
++
++			%stabilization = 2 by default
++			obj.stabilization = 2;
++
+ 			%Proportionality coefficient in Pi model
+ 			obj.coeff=2e13;
+ 		end % }}}
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+ 			%Early return
+ 			if (solution~=TransientSolutionEnum() | md.transient.iscalving==0), return; end
++
++			md = checkfield(md,'fieldname','calving.stabilization','values',[0 1 2]);
+ 			md = checkfield(md,'fieldname','calving.coeff','>',0,'size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','calving.meltingrate','NaN',1,'size',[md.mesh.numberofvertices 1],'>=',0);
+ 		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   Calving Pi parameters:'));
++			fielddisplay(obj,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding');
+ 			fielddisplay(obj,'coeff','proportionality coefficient in Pi model');
+ 			fielddisplay(obj,'meltingrate','melting rate at given location [m/a]');
+ 
+@@ -46,6 +54,7 @@
+ 		function marshall(obj,md,fid) % {{{
+ 			yts=365.0*24.0*3600.0;
+ 			WriteData(fid,'enum',CalvingLawEnum(),'data',CalvingPiEnum(),'format','Integer');
++			WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',obj.stabilization,'format','Integer');
+ 			WriteData(fid,'enum',CalvingpiCoeffEnum(),'data',obj.coeff,'format','DoubleMat','mattype',1);
+ 			WriteData(fid,'object',obj,'fieldname','meltingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts);
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/calvinglevermann.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvinglevermann.m	(revision 19023)
++++ ../trunk-jpl/src/m/classes/calvinglevermann.m	(revision 19024)
+@@ -5,8 +5,9 @@
+ 
+ classdef calvinglevermann
+ 	properties (SetAccess=public) 
+-		 coeff       = NaN;
+-		 meltingrate = NaN;
++		stabilization = 0;
++		coeff         = NaN;
++		meltingrate   = NaN;
+ 	end
+ 	methods
+ 		function obj = calvinglevermann(varargin) % {{{
+@@ -28,17 +29,24 @@
+ 			end
+ 		end % }}}
+ 		function obj = setdefaultparameters(obj) % {{{
++
++			%stabilization = 2 by default
++			obj.stabilization = 2;
++
+ 			%Proportionality coefficient in Levermann model
+ 			obj.coeff=2e13;
+ 		end % }}}
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+ 			%Early return
+ 			if (solution~=TransientSolutionEnum() | md.transient.iscalving==0), return; end
++
++			md = checkfield(md,'fieldname','calving.stabilization','values',[0 1 2]);
+ 			md = checkfield(md,'fieldname','calving.coeff','>',0,'size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','calving.meltingrate','NaN',1,'size',[md.mesh.numberofvertices 1],'>=',0);
+ 		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   Calving Levermann parameters:'));
++			fielddisplay(obj,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding');
+ 			fielddisplay(obj,'coeff','proportionality coefficient in Levermann model');
+ 			fielddisplay(obj,'meltingrate','melting rate at given location [m/a]');
+ 
+@@ -46,6 +54,7 @@
+ 		function marshall(obj,md,fid) % {{{
+ 			yts=365.0*24.0*3600.0;
+ 			WriteData(fid,'enum',CalvingLawEnum(),'data',CalvingLevermannEnum(),'format','Integer');
++			WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',obj.stabilization,'format','Integer');
+ 			WriteData(fid,'enum',CalvinglevermannCoeffEnum(),'data',obj.coeff,'format','DoubleMat','mattype',1);
+ 			WriteData(fid,'object',obj,'fieldname','meltingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts);
+ 		end % }}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-19024-19025.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19024-19025.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19024-19025.diff	(revision 19102)
@@ -0,0 +1,55 @@
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 19024)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 19025)
+@@ -74,6 +74,7 @@
+ }
+ /*}}}*/
+ void LevelsetAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
++	parameters->AddObject(iomodel->CopyConstantObject(LevelsetStabilizationEnum));
+ 	return;
+ }
+ /*}}}*/
+@@ -86,10 +87,10 @@
+ 	#endif
+ 
+ 	/*parameters: */
++	int  stabilization;
+ 	bool save_results;
+-	int  stabilization = 1;
+ 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+-	//femmodel->parameters->FindParam(&stabilization,LevelsetStabilizationEnum);
++	femmodel->parameters->FindParam(&stabilization,LevelsetStabilizationEnum);
+ 
+ 	/*activate formulation: */
+ 	femmodel->SetCurrentConfiguration(LevelsetAnalysisEnum);
+@@ -122,8 +123,7 @@
+ 	Element* basalelement = element->SpawnBasalElement();
+ 
+ 	/*Intermediaries */
+-	int  stabilization=2;
+-	int  dim, domaintype, calvinglaw;
++	int  stabilization,dim, domaintype, calvinglaw;
+ 	bool iscalving;
+ 	int i, row, col;
+ 	IssmDouble kappa;
+@@ -137,6 +137,7 @@
+ 	basalelement->FindParam(&iscalving,TransientIscalvingEnum);
+ 	basalelement->FindParam(&domaintype,DomainTypeEnum);
+ 	basalelement->FindParam(&calvinglaw,CalvingLawEnum);
++	basalelement->FindParam(&stabilization,LevelsetStabilizationEnum);
+ 	switch(domaintype){
+ 		case Domain2DverticalEnum:   dim = 1; break;
+ 		case Domain2DhorizontalEnum: dim = 2; break;
+Index: ../trunk-jpl/src/c/cores/transient_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/transient_core.cpp	(revision 19024)
++++ ../trunk-jpl/src/c/cores/transient_core.cpp	(revision 19025)
+@@ -111,6 +111,7 @@
+ 			if(iscalving && calvinglaw==CalvingPiEnum){
+ 				if(VerboseSolution()) _printf0_("   computing calving rate\n");
+ 				femmodel->StrainRateparallelx();
++				femmodel->DeviatoricStressx();
+ 				femmodel->CalvingRatePix();
+ 			}
+ 			if(VerboseSolution()) _printf0_("   computing movement of ice boundaries\n");
Index: /issm/oecreview/Archive/18296-19100/ISSM-19025-19026.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19025-19026.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19025-19026.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/plot/plot_gridded.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/plot_gridded.m	(revision 19025)
++++ ../trunk-jpl/src/m/plot/plot_gridded.m	(revision 19026)
+@@ -85,7 +85,7 @@
+ end
+ 
+ %Apply options
+-if ~isnan(data_min),
++if ~isnan(data_min) & ~isinf(data_min),
+ 	options=changefieldvalue(options,'caxis',[data_min data_max]); % force caxis so that the colorbar is ready
+ end
+ options=addfielddefault(options,'axis','xy equal'); % default axis
Index: /issm/oecreview/Archive/18296-19100/ISSM-19026-19027.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19026-19027.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19026-19027.diff	(revision 19102)
@@ -0,0 +1,1333 @@
+Index: ../trunk-jpl/src/c/classes/Inputs/TransientInput.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Inputs/TransientInput.h	(revision 19026)
++++ ../trunk-jpl/src/c/classes/Inputs/TransientInput.h	(revision 19027)
+@@ -41,9 +41,9 @@
+ 		int    InstanceEnum();
+ 		Input* SpawnTriaInput(int index1,int index2,int index3);
+ 		Input* SpawnSegInput(int index1,int index2);
+-		Input* PointwiseDivide(Input* forcingB){_error_("not implemented yet");};
+-		Input* PointwiseMin(Input* forcingB){_error_("not implemented yet");};
+-		Input* PointwiseMax(Input* forcingB){_error_("not implemented yet");};
++		Input* PointwiseDivide(Input* input_in){_error_("not implemented yet");};
++		Input* PointwiseMin(Input* input_in){_error_("not implemented yet");};
++		Input* PointwiseMax(Input* input_in){_error_("not implemented yet");};
+ 		int  GetResultInterpolation(void);
+ 		int  GetResultNumberOfNodes(void);
+ 		void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");};
+Index: ../trunk-jpl/src/m/solve/WriteData.m
+===================================================================
+--- ../trunk-jpl/src/m/solve/WriteData.m	(revision 19026)
++++ ../trunk-jpl/src/m/solve/WriteData.m	(revision 19027)
+@@ -26,7 +26,7 @@
+ end
+ format  = getfieldvalue(options,'format');
+ mattype = getfieldvalue(options,'mattype',0);    %only required for matrices
+-forcinglength = getfieldvalue(options,'forcinglength',-1);
++timeserieslength = getfieldvalue(options,'timeserieslength',-1);
+ 
+ %Process sparse matrices
+ if issparse(data),
+@@ -36,13 +36,13 @@
+ %Scale data if necesarry
+ if exist(options,'scale'),
+ 	scale = getfieldvalue(options,'scale');
+-	if size(data,1)==forcinglength,
++	if size(data,1)==timeserieslength,
+ 		data(1:end-1,:) = scale.*data(1:end-1,:);
+ 	else
+ 		data  = scale.*data;
+ 	end
+ end
+-if(size(data,1)==forcinglength),
++if(size(data,1)==timeserieslength),
+ 	yts=365.0*24.0*3600.0;
+ 	data(end,:) = data(end,:)*yts;
+ end
+Index: ../trunk-jpl/src/m/solve/WriteData.py
+===================================================================
+--- ../trunk-jpl/src/m/solve/WriteData.py	(revision 19026)
++++ ../trunk-jpl/src/m/solve/WriteData.py	(revision 19027)
+@@ -34,7 +34,7 @@
+ 		enum = options.getfieldvalue('enum')
+ 	format  = options.getfieldvalue('format')
+ 	mattype = options.getfieldvalue('mattype',0)    #only required for matrices
+-	forcinglength = options.getfieldvalue('forcinglength',-1)
++	timeserieslength = options.getfieldvalue('timeserieslength',-1)
+ 
+ 	#Process sparse matrices
+ #	if issparse(data),
+@@ -45,7 +45,7 @@
+ 	if options.exist('scale'):
+ 		scale = options.getfieldvalue('scale')
+ 		if numpy.size(data) > 1 :
+-			if numpy.size(data,0)==forcinglength:
++			if numpy.size(data,0)==timeserieslength:
+ 				data=numpy.array(data)
+ 				data[0:-1,:] = scale*data[0:-1,:]
+ 			else:
+@@ -53,7 +53,7 @@
+ 		else:
+ 			data  = scale*data
+ 	if numpy.size(data) > 1 :
+-		if numpy.size(data,0)==forcinglength:
++		if numpy.size(data,0)==timeserieslength:
+ 			yts=365.0*24.0*3600.0
+ 			data[-1,:] = yts*data[-1,:]
+ 
+Index: ../trunk-jpl/src/m/consistency/checkfield.py
+===================================================================
+--- ../trunk-jpl/src/m/consistency/checkfield.py	(revision 19026)
++++ ../trunk-jpl/src/m/consistency/checkfield.py	(revision 19027)
+@@ -20,7 +20,7 @@
+ 	      - <:  smallerthan provided value
+ 	      - <=: smaller or equal to provided value
+ 	      - < vec:  smallerthan provided values on each vertex
+-	      - forcing: 1 if check forcing consistency (size and time)
++	      - timeseries: 1 if check time series consistency (size and time)
+ 	      - values: cell of strings or vector of acceptable values
+ 	      - numel: list of acceptable number of elements
+ 	      - cell: 1 if check that is cell
+@@ -150,7 +150,7 @@
+ 					"field '%s' should be a list" %fieldname))
+ 
+ 	#Check forcings (size and times)
+-	if options.getfieldvalue('forcing',0):
++	if options.getfieldvalue('timeseries',0):
+ 		if   numpy.size(field,0)==md.mesh.numberofvertices:
+ 			if numpy.ndim(field)>1 and not numpy.size(field,1)==1:
+ 				md = md.checkmessage(options.getfieldvalue('message',\
+Index: ../trunk-jpl/src/m/consistency/checkfield.m
+===================================================================
+--- ../trunk-jpl/src/m/consistency/checkfield.m	(revision 19026)
++++ ../trunk-jpl/src/m/consistency/checkfield.m	(revision 19027)
+@@ -13,7 +13,7 @@
+ %      - <:  smallerthan provided value
+ %      - <=: smaller or equal to provided value
+ %      - < vec:  smallerthan provided values on each vertex
+-%      - forcing: 1 if check forcing consistency (size and time)
++%      - timeseries: 1 if check time series consistency (size and time)
+ %      - values: cell of strings or vector of acceptable values
+ %      - numel: list of acceptable number of elements
+ %      - cell: 1 if check that is cell
+@@ -197,7 +197,7 @@
+ end
+ 
+ %Check forcings (size and times)
+-if getfieldvalue(options,'forcing',0),
++if getfieldvalue(options,'timeseries',0),
+ 	if size(field,1)==md.mesh.numberofvertices,
+ 		if ~size(field,2)==1,
+ 			md = checkmessage(md,getfieldvalue(options,'message',...
+Index: ../trunk-jpl/src/m/classes/thermal.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/thermal.py	(revision 19026)
++++ ../trunk-jpl/src/m/classes/thermal.py	(revision 19027)
+@@ -85,7 +85,7 @@
+ 			return md
+ 
+ 		md = checkfield(md,'fieldname','thermal.stabilization','numel',[1],'values',[0,1,2])
+-		md = checkfield(md,'fieldname','thermal.spctemperature','forcing',1)
++		md = checkfield(md,'fieldname','thermal.spctemperature','timeseries',1)
+ 		if EnthalpyAnalysisEnum() in analyses and md.thermal.isenthalpy and md.mesh.dimension()==3:
+ 			pos=numpy.nonzero(numpy.logical_not(numpy.isnan(md.thermal.spctemperature[0:md.mesh.numberofvertices])))
+ 			replicate=numpy.tile(md.geometry.surface-md.mesh.z,(1,numpy.size(md.thermal.spctemperature,axis=1)))
+@@ -101,7 +101,7 @@
+ 		return md
+ 	# }}}
+ 	def marshall(self,md,fid):    # {{{
+-		WriteData(fid,'object',self,'fieldname','spctemperature','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'fieldname','spctemperature','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1)
+ 		WriteData(fid,'object',self,'fieldname','penalty_threshold','format','Integer')
+ 		WriteData(fid,'object',self,'fieldname','stabilization','format','Integer')
+ 		WriteData(fid,'object',self,'fieldname','reltol','format','Double');
+Index: ../trunk-jpl/src/m/classes/SMBpdd.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBpdd.py	(revision 19026)
++++ ../trunk-jpl/src/m/classes/SMBpdd.py	(revision 19027)
+@@ -152,7 +152,7 @@
+ 
+ 		if (self.isdelta18o==0 and self.ismungsm==0):
+ 			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1)
+-			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
+ 		elif self.isdelta18o:
+ 			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1)
+ 			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','temperatures_lgm','format','DoubleMat','mattype',1)
+Index: ../trunk-jpl/src/m/classes/frictionweertman.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionweertman.py	(revision 19026)
++++ ../trunk-jpl/src/m/classes/frictionweertman.py	(revision 19027)
+@@ -35,7 +35,7 @@
+ 		if StressbalanceAnalysisEnum() not in analyses and ThermalAnalysisEnum() not in analyses:
+ 			return md
+ 
+-		md = checkfield(md,'fieldname','friction.C','forcing',1,'NaN',1)
++		md = checkfield(md,'fieldname','friction.C','timeseries',1,'NaN',1)
+ 		md = checkfield(md,'fieldname','friction.m','NaN',1,'size',[md.mesh.numberofelements])
+ 
+ 		return md
+Index: ../trunk-jpl/src/m/classes/frictionwaterlayer.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionwaterlayer.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/frictionwaterlayer.m	(revision 19027)
+@@ -29,10 +29,10 @@
+ 			%Early return
+ 			if ~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(ThermalAnalysisEnum(),analyses), return; end
+ 
+-			md = checkfield(md,'fieldname','friction.coefficient','forcing',1,'NaN',1);
++			md = checkfield(md,'fieldname','friction.coefficient','timeseries',1,'NaN',1);
+ 			md = checkfield(md,'fieldname','friction.q','NaN',1,'size',[md.mesh.numberofelements 1]);
+ 			md = checkfield(md,'fieldname','friction.p','NaN',1,'size',[md.mesh.numberofelements 1]);
+-			md = checkfield(md,'fieldname','thermal.spctemperature','forcing',1,'>=',0.);
++			md = checkfield(md,'fieldname','thermal.spctemperature','timeseries',1,'>=',0.);
+ 
+ 		end % }}}
+ 		function disp(obj) % {{{
+@@ -45,10 +45,10 @@
+ 		function marshall(obj,md,fid) % {{{
+ 
+ 			WriteData(fid,'enum',FrictionLawEnum,'data',5,'format','Integer');
+-			WriteData(fid,'class','friction','object',obj,'fieldname','coefficient','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'class','friction','object',obj,'fieldname','coefficient','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 			WriteData(fid,'class','friction','object',obj,'fieldname','p','format','DoubleMat','mattype',2);
+ 			WriteData(fid,'class','friction','object',obj,'fieldname','q','format','DoubleMat','mattype',2);
+-			WriteData(fid,'class','friction','object',obj,'fieldname','water_layer','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'class','friction','object',obj,'fieldname','water_layer','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/calving.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/calving.py	(revision 19026)
++++ ../trunk-jpl/src/m/classes/calving.py	(revision 19027)
+@@ -44,8 +44,8 @@
+ 			return md
+ 
+ 		md = checkfield(md,'fieldname','calving.stabilization','values',[0,1,2]);
+-		md = checkfield(md,'fieldname','calving.calvingrate','>=',0,'forcing',1,'NaN',1);
+-		md = checkfield(md,'fieldname','calving.meltingrate','>=',0,'forcing',1,'NaN',1);
++		md = checkfield(md,'fieldname','calving.calvingrate','>=',0,'timeseries',1,'NaN',1);
++		md = checkfield(md,'fieldname','calving.meltingrate','>=',0,'timeseries',1,'NaN',1);
+ 
+ 		return md
+ 	# }}}
+@@ -55,6 +55,6 @@
+ 
+ 		WriteData(fid,'enum',CalvingLawEnum(),'data',DefaultCalvingEnum(),'format','Integer');
+ 		WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',self.stabilization,'format','Integer');
+-		WriteData(fid,'object',self,'fieldname','calvingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts)
+-		WriteData(fid,'object',self,'fieldname','meltingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts)
++		WriteData(fid,'object',self,'fieldname','calvingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts)
++		WriteData(fid,'object',self,'fieldname','meltingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts)
+ 	# }}}
+Index: ../trunk-jpl/src/m/classes/SMB.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMB.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/SMB.m	(revision 19027)
+@@ -37,7 +37,7 @@
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+ 
+ 			if ismember(MasstransportAnalysisEnum(),analyses),
+-				md = checkfield(md,'fieldname','surfaceforcings.mass_balance','forcing',1,'NaN',1);
++				md = checkfield(md,'fieldname','surfaceforcings.mass_balance','timeseries',1,'NaN',1);
+ 			end
+ 			if ismember(BalancethicknessAnalysisEnum(),analyses),
+ 				md = checkfield(md,'fieldname','surfaceforcings.mass_balance','size',[md.mesh.numberofvertices 1],'NaN',1);
+@@ -52,7 +52,7 @@
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','mass_balance','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','mass_balance','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/thermal.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/thermal.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/thermal.m	(revision 19027)
+@@ -90,7 +90,7 @@
+ 			if (~ismember(ThermalAnalysisEnum(),analyses) & ~ismember(EnthalpyAnalysisEnum(),analyses)) | (solution==TransientSolutionEnum() & md.transient.isthermal==0), return; end
+ 
+ 			md = checkfield(md,'fieldname','thermal.stabilization','numel',[1],'values',[0 1 2]);
+-			md = checkfield(md,'fieldname','thermal.spctemperature','forcing',1);
++			md = checkfield(md,'fieldname','thermal.spctemperature','timeseries',1);
+ 			if (ismember(EnthalpyAnalysisEnum(),analyses) & md.thermal.isenthalpy & dimension(md.mesh)==3),
+ 				pos=find(md.thermal.spctemperature(1:md.mesh.numberofvertices,:)~=NaN);
+ 				replicate=repmat(md.geometry.surface-md.mesh.z,1,size(md.thermal.spctemperature,2));
+@@ -123,7 +123,7 @@
+ 
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'object',obj,'fieldname','spctemperature','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'fieldname','spctemperature','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 			WriteData(fid,'object',obj,'fieldname','penalty_threshold','format','Integer');
+ 			WriteData(fid,'object',obj,'fieldname','stabilization','format','Integer');
+ 			WriteData(fid,'object',obj,'fieldname','reltol','format','Double');
+Index: ../trunk-jpl/src/m/classes/SMBmeltcomponents.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBmeltcomponents.py	(revision 19026)
++++ ../trunk-jpl/src/m/classes/SMBmeltcomponents.py	(revision 19027)
+@@ -56,25 +56,25 @@
+ 	def checkconsistency(self,md,solution,analyses):    # {{{
+ 
+ 		if MasstransportAnalysisEnum() in analyses:
+-			md = checkfield(md,'fieldname','surfaceforcings.accumulation','forcing',1,'NaN',1)
++			md = checkfield(md,'fieldname','surfaceforcings.accumulation','timeseries',1,'NaN',1)
+ 
+ 		if BalancethicknessAnalysisEnum() in analyses:
+ 			md = checkfield(md,'fieldname','surfaceforcings.accumulation','size',[md.mesh.numberofvertices],'NaN',1)
+ 
+ 		if MasstransportAnalysisEnum() in analyses:
+-			md = checkfield(md,'fieldname','surfaceforcings.melt','forcing',1,'NaN',1)
++			md = checkfield(md,'fieldname','surfaceforcings.melt','timeseries',1,'NaN',1)
+ 
+ 		if BalancethicknessAnalysisEnum() in analyses:
+ 			md = checkfield(md,'fieldname','surfaceforcings.melt','size',[md.mesh.numberofvertices],'NaN',1)
+ 
+ 		if MasstransportAnalysisEnum() in analyses:
+-			md = checkfield(md,'fieldname','surfaceforcings.refreeze','forcing',1,'NaN',1)
++			md = checkfield(md,'fieldname','surfaceforcings.refreeze','timeseries',1,'NaN',1)
+ 
+ 		if BalancethicknessAnalysisEnum() in analyses:
+ 			md = checkfield(md,'fieldname','surfaceforcings.refreeze','size',[md.mesh.numberofvertices],'NaN',1)
+ 
+ 		if MasstransportAnalysisEnum() in analyses:
+-			md = checkfield(md,'fieldname','surfaceforcings.evaporation','forcing',1,'NaN',1)
++			md = checkfield(md,'fieldname','surfaceforcings.evaporation','timeseries',1,'NaN',1)
+ 
+ 		if BalancethicknessAnalysisEnum() in analyses:
+ 			md = checkfield(md,'fieldname','surfaceforcings.evaporation','size',[md.mesh.numberofvertices],'NaN',1)
+@@ -86,8 +86,8 @@
+ 		yts=365.0*24.0*3600.0
+ 
+ 		WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBmeltcomponentsEnum(),'format','Integer');
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','accumulation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','evaporation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','melt','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','refreeze','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','accumulation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','evaporation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','melt','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','refreeze','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
+ 	# }}}
+Index: ../trunk-jpl/src/m/classes/linearbasalforcings.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/linearbasalforcings.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/linearbasalforcings.m	(revision 19027)
+@@ -48,7 +48,7 @@
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+ 
+ 			if ismember(MasstransportAnalysisEnum(),analyses) & ~(solution==TransientSolutionEnum() & md.transient.ismasstransport==0),
+-				md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'forcing',1);
++				md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'timeseries',1);
+ 				md = checkfield(md,'fieldname','basalforcings.deepwater_melting_rate','>=',0,'numel',1);
+ 				md = checkfield(md,'fieldname','basalforcings.deepwater_elevation','<','basalforcings.upperwater_elevation','numel',1);
+ 				md = checkfield(md,'fieldname','basalforcings.upperwater_elevation','<',0,'numel',1);
+@@ -60,11 +60,11 @@
+ 				md = checkfield(md,'fieldname','basalforcings.upperwater_elevation','<',0,'numel',1);
+ 			end
+ 			if ismember(ThermalAnalysisEnum(),analyses) & ~(solution==TransientSolutionEnum() & md.transient.isthermal==0),
+-				md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'forcing',1);
++				md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'timeseries',1);
+ 				md = checkfield(md,'fieldname','basalforcings.deepwater_melting_rate','>=',0,'numel',1);
+ 				md = checkfield(md,'fieldname','basalforcings.deepwater_elevation','<','basalforcings.upperwater_elevation','numel',1);
+ 				md = checkfield(md,'fieldname','basalforcings.upperwater_elevation','<',0,'numel',1);
+-				md = checkfield(md,'fieldname','basalforcings.geothermalflux','NaN',1,'forcing',1,'>=',0);
++				md = checkfield(md,'fieldname','basalforcings.geothermalflux','NaN',1,'timeseries',1,'>=',0);
+ 			end
+ 		end % }}}
+ 		function disp(obj) % {{{
+@@ -86,9 +86,9 @@
+ 			pos=find(md.geometry.base>md.basalforcings.deepwater_elevation & md.geometry.base<md.basalforcings.upperwater_elevation);
+ 			floatingice_melting_rate(pos)=md.basalforcings.deepwater_melting_rate*(md.geometry.base(pos)-md.basalforcings.upperwater_elevation)/(md.basalforcings.deepwater_elevation-md.basalforcings.upperwater_elevation);
+ 			WriteData(fid,'enum',BasalforcingsEnum(),'data',LinearFloatingMeltRateEnum(),'format','Integer');
+-			WriteData(fid,'data',floatingice_melting_rate,'format','DoubleMat','enum',BasalforcingsFloatingiceMeltingRateEnum(),'mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+-			WriteData(fid,'object',obj,'fieldname','groundedice_melting_rate','format','DoubleMat','enum',BasalforcingsGroundediceMeltingRateEnum(),'mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+-			WriteData(fid,'object',obj,'fieldname','geothermalflux','enum',BasalforcingsGeothermalfluxEnum(),'format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'data',floatingice_melting_rate,'format','DoubleMat','enum',BasalforcingsFloatingiceMeltingRateEnum(),'mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++			WriteData(fid,'object',obj,'fieldname','groundedice_melting_rate','format','DoubleMat','enum',BasalforcingsGroundediceMeltingRateEnum(),'mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++			WriteData(fid,'object',obj,'fieldname','geothermalflux','enum',BasalforcingsGeothermalfluxEnum(),'format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 			WriteData(fid,'object',obj,'fieldname','deepwater_melting_rate','format','Double','enum',BasalforcingsDeepwaterMeltingRateEnum(),'scale',1./yts)
+ 			WriteData(fid,'object',obj,'fieldname','deepwater_elevation','format','Double','enum',BasalforcingsDeepwaterElevationEnum())
+ 			WriteData(fid,'object',obj,'fieldname','upperwater_elevation','format','Double','enum',BasalforcingsUpperwaterElevationEnum())
+Index: ../trunk-jpl/src/m/classes/calvinglevermann.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvinglevermann.py	(revision 19026)
++++ ../trunk-jpl/src/m/classes/calvinglevermann.py	(revision 19027)
+@@ -53,5 +53,5 @@
+ 		WriteData(fid,'enum',CalvingLawEnum(),'data',CalvingLevermannEnum(),'format','Integer');
+ 		WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',self.stabilization,'format','Integer');
+ 		WriteData(fid,'enum',CalvinglevermannCoeffEnum(),'data',self.coeff,'format','DoubleMat','mattype',1)
+-		WriteData(fid,'object',self,'fieldname','meltingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts)
++		WriteData(fid,'object',self,'fieldname','meltingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts)
+ 	# }}}
+Index: ../trunk-jpl/src/m/classes/misfit.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/misfit.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/misfit.m	(revision 19027)
+@@ -59,9 +59,9 @@
+ 			if ~ischar(obj.timeinterpolation),
+ 				error('misfit error message: ''timeinterpolation'' field should be a string!');
+ 			end
+-			md = checkfield(md,'fieldname','obj.observation','field',obj.observation,'forcing',1,'NaN',1);
++			md = checkfield(md,'fieldname','obj.observation','field',obj.observation,'timeseries',1,'NaN',1);
+ 			md = checkfield(md,'fieldname','obj.timeinterpolation','field',obj.timeinterpolation,'values',{'nearestneighbor'});
+-			md = checkfield(md,'fieldname','obj.weights','field',obj.weights,'forcing',1,'NaN',1);
++			md = checkfield(md,'fieldname','obj.weights','field',obj.weights,'timeseries',1,'NaN',1);
+ 
+ 		end % }}}
+ 		function md = disp(obj) % {{{
+@@ -83,10 +83,10 @@
+ 		WriteData(fid,'object',obj,'fieldname','name','format','String');
+ 		WriteData(fid,'object',obj,'fieldname','definitionenum','format','Integer');
+ 		WriteData(fid,'object',obj,'fieldname','model_enum','format','Integer');
+-		WriteData(fid,'object',obj,'fieldname','observation','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++		WriteData(fid,'object',obj,'fieldname','observation','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 		WriteData(fid,'object',obj,'fieldname','observation_enum','format','Integer');
+ 		WriteData(fid,'object',obj,'fieldname','timeinterpolation','format','String');
+-		WriteData(fid,'object',obj,'fieldname','weights','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++		WriteData(fid,'object',obj,'fieldname','weights','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 		WriteData(fid,'object',obj,'fieldname','weights_enum','format','Integer');
+ 
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/matice.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/matice.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/matice.m	(revision 19027)
+@@ -142,7 +142,7 @@
+ 			md = checkfield(md,'fieldname','materials.rho_water','>',0);
+ 			md = checkfield(md,'fieldname','materials.rho_freshwater','>',0);
+ 			md = checkfield(md,'fieldname','materials.mu_water','>',0);
+-			md = checkfield(md,'fieldname','materials.rheology_B','>',0,'forcing',1,'NaN',1);
++			md = checkfield(md,'fieldname','materials.rheology_B','>',0,'timeseries',1,'NaN',1);
+ 			md = checkfield(md,'fieldname','materials.rheology_n','>',0,'size',[md.mesh.numberofelements 1]);
+ 			md = checkfield(md,'fieldname','materials.rheology_law','values',{'None' 'Cuffey' 'Paterson' 'Arrhenius' 'LliboutryDuval'});
+ 
+@@ -191,7 +191,7 @@
+ 			WriteData(fid,'object',obj,'class','materials','fieldname','beta','format','Double');
+ 			WriteData(fid,'object',obj,'class','materials','fieldname','mixed_layer_capacity','format','Double');
+ 			WriteData(fid,'object',obj,'class','materials','fieldname','thermal_exchange_velocity','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','rheology_B','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','materials','fieldname','rheology_B','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 			WriteData(fid,'object',obj,'class','materials','fieldname','rheology_n','format','DoubleMat','mattype',2);
+ 			WriteData(fid,'data',StringToEnum(obj.rheology_law),'enum',MaterialsRheologyLawEnum(),'format','Integer');
+ 
+Index: ../trunk-jpl/src/m/classes/frictiontemp.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictiontemp.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/frictiontemp.m	(revision 19027)
+@@ -33,7 +33,7 @@
+ 			%Early return
+ 			if ~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(ThermalAnalysisEnum(),analyses), return; end
+ 
+-			md = checkfield(md,'fieldname','friction.coefficient','forcing',1,'NaN',1);
++			md = checkfield(md,'fieldname','friction.coefficient','timeseries',1,'NaN',1);
+ 			md = checkfield(md,'fieldname','friction.q','NaN',1,'size',[md.mesh.numberofelements 1]);
+ 			md = checkfield(md,'fieldname','friction.p','NaN',1,'size',[md.mesh.numberofelements 1]);
+ 			md = checkfield(md,'fieldname','friction.gamma','NaN',1,'numel',1,'>',0.);
+@@ -52,7 +52,7 @@
+ 
+ 			WriteData(fid,'enum',FrictionLawEnum,'data',4,'format','Integer');
+ 			WriteData(fid,'class','friction','object',obj,'fieldname','gamma','format','Double');
+-			WriteData(fid,'class','friction','object',obj,'fieldname','coefficient','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'class','friction','object',obj,'fieldname','coefficient','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 			WriteData(fid,'class','friction','object',obj,'fieldname','p','format','DoubleMat','mattype',2);
+ 			WriteData(fid,'class','friction','object',obj,'fieldname','q','format','DoubleMat','mattype',2);
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/masstransport.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/masstransport.py	(revision 19026)
++++ ../trunk-jpl/src/m/classes/masstransport.py	(revision 19027)
+@@ -66,7 +66,7 @@
+ 		if (MasstransportAnalysisEnum() not in analyses) or (solution==TransientSolutionEnum() and not md.transient.ismasstransport):
+ 			return md
+ 
+-		md = checkfield(md,'fieldname','masstransport.spcthickness','forcing',1)
++		md = checkfield(md,'fieldname','masstransport.spcthickness','timeseries',1)
+ 		md = checkfield(md,'fieldname','masstransport.isfreesurface','values',[0,1])
+ 		md = checkfield(md,'fieldname','masstransport.hydrostatic_adjustment','values',['Absolute','Incremental'])
+ 		md = checkfield(md,'fieldname','masstransport.stabilization','values',[0,1,2,3,4])
+@@ -79,7 +79,7 @@
+ 
+ 		yts=365.*24.*3600.
+ 
+-		WriteData(fid,'object',self,'fieldname','spcthickness','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'fieldname','spcthickness','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1)
+ 		WriteData(fid,'object',self,'fieldname','isfreesurface','format','Boolean')
+ 		WriteData(fid,'object',self,'fieldname','min_thickness','format','Double')
+ 		WriteData(fid,'data',StringToEnum(self.hydrostatic_adjustment)[0],'format','Integer','enum',MasstransportHydrostaticAdjustmentEnum())
+Index: ../trunk-jpl/src/m/classes/SMBgradients.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBgradients.py	(revision 19026)
++++ ../trunk-jpl/src/m/classes/SMBgradients.py	(revision 19027)
+@@ -43,10 +43,10 @@
+ 	def checkconsistency(self,md,solution,analyses):    # {{{
+ 
+ 		if MasstransportAnalysisEnum() in analyses:
+-			md = checkfield(md,'fieldname','surfaceforcings.href','forcing',1,'NaN',1)
+-			md = checkfield(md,'fieldname','surfaceforcings.smbref','forcing',1,'NaN',1)
+-			md = checkfield(md,'fieldname','surfaceforcings.b_pos','forcing',1,'NaN',1)
+-			md = checkfield(md,'fieldname','surfaceforcings.b_neg','forcing',1,'NaN',1)
++			md = checkfield(md,'fieldname','surfaceforcings.href','timeseries',1,'NaN',1)
++			md = checkfield(md,'fieldname','surfaceforcings.smbref','timeseries',1,'NaN',1)
++			md = checkfield(md,'fieldname','surfaceforcings.b_pos','timeseries',1,'NaN',1)
++			md = checkfield(md,'fieldname','surfaceforcings.b_neg','timeseries',1,'NaN',1)
+ 
+ 		return md
+ 	# }}}
+@@ -55,8 +55,8 @@
+ 		yts=365.0*24.0*3600.0
+ 
+ 		WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBgradientsEnum(),'format','Integer');
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','href','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','smbref','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','b_pos','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','b_neg','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','href','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','smbref','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','b_pos','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','b_neg','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
+ 	# }}}
+Index: ../trunk-jpl/src/m/classes/calving.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calving.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/calving.m	(revision 19027)
+@@ -39,8 +39,8 @@
+ 			if (solution~=TransientSolutionEnum() | md.transient.iscalving==0), return; end
+ 
+ 			md = checkfield(md,'fieldname','calving.stabilization','values',[0 1 2]);
+-			md = checkfield(md,'fieldname','calving.calvingrate(1:md.mesh.numberofvertices,:)','>=',0,'forcing',1,'NaN',1);
+-			md = checkfield(md,'fieldname','calving.meltingrate(1:md.mesh.numberofvertices,:)','>=',0,'forcing',1,'NaN',1);
++			md = checkfield(md,'fieldname','calving.calvingrate(1:md.mesh.numberofvertices,:)','>=',0,'timeseries',1,'NaN',1);
++			md = checkfield(md,'fieldname','calving.meltingrate(1:md.mesh.numberofvertices,:)','>=',0,'timeseries',1,'NaN',1);
+ 		end % }}}
+ 		function disp(obj) % {{{
+ 			disp(sprintf('   Calving parameters:'));
+@@ -52,8 +52,8 @@
+ 			yts=365.0*24.0*3600.0;
+ 			WriteData(fid,'enum',CalvingLawEnum(),'data',DefaultCalvingEnum(),'format','Integer');
+ 			WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',obj.stabilization,'format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','calvingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts);
+-			WriteData(fid,'object',obj,'fieldname','meltingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts);
++			WriteData(fid,'object',obj,'fieldname','calvingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts);
++			WriteData(fid,'object',obj,'fieldname','meltingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/SMBcomponents.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBcomponents.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/SMBcomponents.m	(revision 19027)
+@@ -43,19 +43,19 @@
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+ 
+ 			if ismember(MasstransportAnalysisEnum(),analyses),
+-				md = checkfield(md,'fieldname','surfaceforcings.accumulation','forcing',1,'NaN',1);
++				md = checkfield(md,'fieldname','surfaceforcings.accumulation','timeseries',1,'NaN',1);
+ 			end
+ 			if ismember(BalancethicknessAnalysisEnum(),analyses),
+ 				md = checkfield(md,'fieldname','surfaceforcings.accumulation','size',[md.mesh.numberofvertices 1],'NaN',1);
+ 			end
+ 			if ismember(MasstransportAnalysisEnum(),analyses),
+-				md = checkfield(md,'fieldname','surfaceforcings.runoff','forcing',1,'NaN',1);
++				md = checkfield(md,'fieldname','surfaceforcings.runoff','timeseries',1,'NaN',1);
+ 			end
+ 			if ismember(BalancethicknessAnalysisEnum(),analyses),
+ 				md = checkfield(md,'fieldname','surfaceforcings.runoff','size',[md.mesh.numberofvertices 1],'NaN',1);
+ 			end
+ 			if ismember(MasstransportAnalysisEnum(),analyses),
+-				md = checkfield(md,'fieldname','surfaceforcings.evaporation','forcing',1,'NaN',1);
++				md = checkfield(md,'fieldname','surfaceforcings.evaporation','timeseries',1,'NaN',1);
+ 			end
+ 			if ismember(BalancethicknessAnalysisEnum(),analyses),
+ 				md = checkfield(md,'fieldname','surfaceforcings.evaporation','size',[md.mesh.numberofvertices 1],'NaN',1);
+@@ -72,9 +72,9 @@
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBcomponentsEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','accumulation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','runoff','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','evaporation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','accumulation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','runoff','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','evaporation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/geometry.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/geometry.py	(revision 19026)
++++ ../trunk-jpl/src/m/classes/geometry.py	(revision 19027)
+@@ -38,7 +38,7 @@
+ 
+ 		md = checkfield(md,'fieldname','geometry.surface'  ,'NaN',1,'size',[md.mesh.numberofvertices])
+ 		md = checkfield(md,'fieldname','geometry.base'      ,'NaN',1,'size',[md.mesh.numberofvertices])
+-		md = checkfield(md,'fieldname','geometry.thickness','NaN',1,'size',[md.mesh.numberofvertices],'>',0,'forcing',1)
++		md = checkfield(md,'fieldname','geometry.thickness','NaN',1,'size',[md.mesh.numberofvertices],'>',0,'timeseries',1)
+ 		if any((self.thickness-self.surface+self.base)>10**-9):
+ 			md.checkmessage("equality thickness=surface-base violated")
+ 		if solution==TransientSolutionEnum() and md.transient.isgroundingline:
+@@ -48,7 +48,7 @@
+ 	# }}}
+ 	def marshall(self,md,fid):    # {{{
+ 		WriteData(fid,'data',self.surface,'format','DoubleMat','mattype',1,'enum',SurfaceEnum())
+-		WriteData(fid,'data',self.thickness,'format','DoubleMat','mattype',1,'enum',ThicknessEnum(),'forcinglength',md.mesh.numberofvertices+1)
++		WriteData(fid,'data',self.thickness,'format','DoubleMat','mattype',1,'enum',ThicknessEnum(),'timeserieslength',md.mesh.numberofvertices+1)
+ 		WriteData(fid,'data',self.base,'format','DoubleMat','mattype',1,'enum',BaseEnum())
+ 		WriteData(fid,'data',self.bed,'format','DoubleMat','mattype',1,'enum',BedEnum())
+ 		WriteData(fid,'object',self,'fieldname','hydrostatic_ratio','format','DoubleMat','mattype',1)
+Index: ../trunk-jpl/src/m/classes/stressbalance.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/stressbalance.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/stressbalance.m	(revision 19027)
+@@ -125,9 +125,9 @@
+ 			%Early return
+ 			if ~ismember(StressbalanceAnalysisEnum(),analyses), return; end
+ 
+-			md = checkfield(md,'fieldname','stressbalance.spcvx','forcing',1);
+-			md = checkfield(md,'fieldname','stressbalance.spcvy','forcing',1);
+-			md = checkfield(md,'fieldname','stressbalance.spcvz','forcing',1);
++			md = checkfield(md,'fieldname','stressbalance.spcvx','timeseries',1);
++			md = checkfield(md,'fieldname','stressbalance.spcvy','timeseries',1);
++			md = checkfield(md,'fieldname','stressbalance.spcvz','timeseries',1);
+ 			md = checkfield(md,'fieldname','stressbalance.restol','size',[1 1],'>',0,'NaN',1);
+ 			md = checkfield(md,'fieldname','stressbalance.reltol','size',[1 1]);
+ 			md = checkfield(md,'fieldname','stressbalance.abstol','size',[1 1]);
+@@ -217,9 +217,9 @@
+ 
+ 			yts=365.0*24.0*3600.0;
+ 
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','spcvx','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','spcvy','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','spcvz','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','stressbalance','fieldname','spcvx','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','stressbalance','fieldname','spcvy','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','stressbalance','fieldname','spcvz','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+ 			WriteData(fid,'object',obj,'class','stressbalance','fieldname','restol','format','Double');
+ 			WriteData(fid,'object',obj,'class','stressbalance','fieldname','reltol','format','Double');
+ 			WriteData(fid,'object',obj,'class','stressbalance','fieldname','abstol','format','Double','scale',1./yts);
+Index: ../trunk-jpl/src/m/classes/hydrologyshreve.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologyshreve.py	(revision 19026)
++++ ../trunk-jpl/src/m/classes/hydrologyshreve.py	(revision 19027)
+@@ -39,13 +39,13 @@
+ 		if HydrologyShreveAnalysisEnum() not in analyses:
+ 			return md
+ 
+-		md = checkfield(md,'fieldname','hydrology.spcwatercolumn','forcing',1)
++		md = checkfield(md,'fieldname','hydrology.spcwatercolumn','timeseries',1)
+ 		md = checkfield(md,'fieldname','hydrology.stabilization','>=',0)
+ 
+ 		return md
+ 	# }}}
+ 	def marshall(self,md,fid):    # {{{
+ 		WriteData(fid,'enum',HydrologyModelEnum(),'data',HydrologyshreveEnum(),'format','Integer');
+-		WriteData(fid,'object',self,'fieldname','spcwatercolumn','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'fieldname','spcwatercolumn','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1)
+ 		WriteData(fid,'object',self,'fieldname','stabilization','format','Double')
+ 	# }}}
+Index: ../trunk-jpl/src/m/classes/hydrologyshreve.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologyshreve.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/hydrologyshreve.m	(revision 19027)
+@@ -42,7 +42,7 @@
+ 				return;
+ 			end
+ 
+-			md = checkfield(md,'fieldname','hydrology.spcwatercolumn','forcing',1);
++			md = checkfield(md,'fieldname','hydrology.spcwatercolumn','timeseries',1);
+ 			md = checkfield(md,'fieldname','hydrology.stabilization','>=',0);
+ 		end % }}}
+ 		function disp(obj) % {{{
+@@ -53,7 +53,7 @@
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+ 			WriteData(fid,'enum',HydrologyModelEnum(),'data',HydrologyshreveEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','spcwatercolumn','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'fieldname','spcwatercolumn','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 			WriteData(fid,'object',obj,'fieldname','stabilization','format','Double');
+ 		end % }}}
+ 	end
+Index: ../trunk-jpl/src/m/classes/basalforcings.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/basalforcings.py	(revision 19026)
++++ ../trunk-jpl/src/m/classes/basalforcings.py	(revision 19027)
+@@ -47,17 +47,17 @@
+ 	def checkconsistency(self,md,solution,analyses):    # {{{
+ 
+ 		if MasstransportAnalysisEnum() in analyses and not (solution==TransientSolutionEnum() and not md.transient.ismasstransport):
+-			md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'forcing',1)
+-			md = checkfield(md,'fieldname','basalforcings.floatingice_melting_rate','NaN',1,'forcing',1)
++			md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'timeseries',1)
++			md = checkfield(md,'fieldname','basalforcings.floatingice_melting_rate','NaN',1,'timeseries',1)
+ 
+ 		if BalancethicknessAnalysisEnum() in analyses:
+ 			md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'size',[md.mesh.numberofvertices])
+ 			md = checkfield(md,'fieldname','basalforcings.floatingice_melting_rate','NaN',1,'size',[md.mesh.numberofvertices])
+ 
+ 		if ThermalAnalysisEnum() in analyses and not (solution==TransientSolutionEnum() and not md.transient.isthermal):
+-			md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'forcing',1)
+-			md = checkfield(md,'fieldname','basalforcings.floatingice_melting_rate','NaN',1,'forcing',1)
+-			md = checkfield(md,'fieldname','basalforcings.geothermalflux','NaN',1,'forcing',1,'>=',0)
++			md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'timeseries',1)
++			md = checkfield(md,'fieldname','basalforcings.floatingice_melting_rate','NaN',1,'timeseries',1)
++			md = checkfield(md,'fieldname','basalforcings.geothermalflux','NaN',1,'timeseries',1,'>=',0)
+ 
+ 		return md
+ 	# }}}
+@@ -66,7 +66,7 @@
+ 		yts=365.0*24.0*3600.0
+ 
+ 		WriteData(fid,'enum',BasalforcingsEnum(),'data',FloatingMeltRateEnum(),'format','Integer');
+-		WriteData(fid,'object',self,'fieldname','groundedice_melting_rate','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+-		WriteData(fid,'object',self,'fieldname','floatingice_melting_rate','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+-		WriteData(fid,'object',self,'fieldname','geothermalflux','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'fieldname','groundedice_melting_rate','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'fieldname','floatingice_melting_rate','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'fieldname','geothermalflux','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1)
+ 	# }}}
+Index: ../trunk-jpl/src/m/classes/calvingpi.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvingpi.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/calvingpi.m	(revision 19027)
+@@ -56,7 +56,7 @@
+ 			WriteData(fid,'enum',CalvingLawEnum(),'data',CalvingPiEnum(),'format','Integer');
+ 			WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',obj.stabilization,'format','Integer');
+ 			WriteData(fid,'enum',CalvingpiCoeffEnum(),'data',obj.coeff,'format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'fieldname','meltingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts);
++			WriteData(fid,'object',obj,'fieldname','meltingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/basalforcings.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/basalforcings.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/basalforcings.m	(revision 19027)
+@@ -44,17 +44,17 @@
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+ 
+ 			if ismember(MasstransportAnalysisEnum(),analyses) & ~(solution==TransientSolutionEnum() & md.transient.ismasstransport==0),
+-				md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'forcing',1);
+-				md = checkfield(md,'fieldname','basalforcings.floatingice_melting_rate','NaN',1,'forcing',1);
++				md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'timeseries',1);
++				md = checkfield(md,'fieldname','basalforcings.floatingice_melting_rate','NaN',1,'timeseries',1);
+ 			end
+ 			if ismember(BalancethicknessAnalysisEnum(),analyses),
+ 				md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 				md = checkfield(md,'fieldname','basalforcings.floatingice_melting_rate','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 			end
+ 			if ismember(ThermalAnalysisEnum(),analyses) & ~(solution==TransientSolutionEnum() & md.transient.isthermal==0),
+-				md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'forcing',1);
+-				md = checkfield(md,'fieldname','basalforcings.floatingice_melting_rate','NaN',1,'forcing',1);
+-				md = checkfield(md,'fieldname','basalforcings.geothermalflux','NaN',1,'forcing',1,'>=',0);
++				md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'timeseries',1);
++				md = checkfield(md,'fieldname','basalforcings.floatingice_melting_rate','NaN',1,'timeseries',1);
++				md = checkfield(md,'fieldname','basalforcings.geothermalflux','NaN',1,'timeseries',1,'>=',0);
+ 			end
+ 		end % }}}
+ 		function disp(obj) % {{{
+@@ -70,9 +70,9 @@
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'enum',BasalforcingsEnum(),'data',FloatingMeltRateEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','groundedice_melting_rate','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+-			WriteData(fid,'object',obj,'fieldname','floatingice_melting_rate','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+-			WriteData(fid,'object',obj,'fieldname','geothermalflux','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'fieldname','groundedice_melting_rate','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++			WriteData(fid,'object',obj,'fieldname','floatingice_melting_rate','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++			WriteData(fid,'object',obj,'fieldname','geothermalflux','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/damage.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/damage.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/damage.m	(revision 19027)
+@@ -149,7 +149,7 @@
+ 			if obj.isdamage,
+ 				md = checkfield(md,'fieldname','damage.law','numel',[1],'values',[0,1,2]);
+ 				md = checkfield(md,'fieldname','damage.D','>=',0,'<=',obj.max_damage,'size',[md.mesh.numberofvertices 1]);
+-				md = checkfield(md,'fieldname','damage.spcdamage','forcing',1);
++				md = checkfield(md,'fieldname','damage.spcdamage','timeseries',1);
+ 				md = checkfield(md,'fieldname','damage.max_damage','<',1,'>=',0);
+ 				md = checkfield(md,'fieldname','damage.stabilization','numel',[1],'values',[0 1 2]);
+ 				md = checkfield(md,'fieldname','damage.maxiter','>=0',0);
+@@ -212,7 +212,7 @@
+ 			if obj.isdamage,
+ 				WriteData(fid,'object',obj,'fieldname','law','format','Integer');
+ 				WriteData(fid,'object',obj,'fieldname','D','format','DoubleMat','mattype',1);
+-				WriteData(fid,'object',obj,'fieldname','spcdamage','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++				WriteData(fid,'object',obj,'fieldname','spcdamage','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 				WriteData(fid,'object',obj,'fieldname','max_damage','format','Double');
+ 
+ 				WriteData(fid,'object',obj,'fieldname','stabilization','format','Integer');
+Index: ../trunk-jpl/src/m/classes/hydrologydc.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologydc.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/hydrologydc.m	(revision 19027)
+@@ -104,16 +104,16 @@
+ 			if obj.transfer_flag==1,
+ 				md = checkfield(md,'fieldname','hydrology.leakage_factor','>',0,'numel',1);
+ 	    end
+-			md = checkfield(md,'fieldname','hydrology.basal_moulin_input','NaN',1,'forcing',1);
++			md = checkfield(md,'fieldname','hydrology.basal_moulin_input','NaN',1,'timeseries',1);
+ 
+-			md = checkfield(md,'fieldname','hydrology.spcsediment_head','forcing',1);
++			md = checkfield(md,'fieldname','hydrology.spcsediment_head','timeseries',1);
+ 			md = checkfield(md,'fieldname','hydrology.sediment_compressibility','>',0,'numel',1);
+ 			md = checkfield(md,'fieldname','hydrology.sediment_porosity','>',0,'numel',1);
+ 			md = checkfield(md,'fieldname','hydrology.sediment_thickness','>',0,'numel',1);
+ 			md = checkfield(md,'fieldname','hydrology.sediment_transmitivity','>=',0,'size',[md.mesh.numberofvertices 1]);
+ 
+ 			if obj.isefficientlayer==1,
+-				md = checkfield(md,'fieldname','hydrology.spcepl_head','forcing',1);
++				md = checkfield(md,'fieldname','hydrology.spcepl_head','timeseries',1);
+ 				md = checkfield(md,'fieldname','hydrology.mask_eplactive_node','size',[md.mesh.numberofvertices 1],'values',[0 1]);
+ 				md = checkfield(md,'fieldname','hydrology.epl_compressibility','>',0,'numel',1);
+ 				md = checkfield(md,'fieldname','hydrology.epl_porosity','>',0,'numel',1);
+@@ -194,16 +194,16 @@
+ 			if obj.transfer_flag==1,
+ 				WriteData(fid,'object',obj,'fieldname','leakage_factor','format','Double');
+ 	    end
+-			WriteData(fid,'object',obj,'fieldname','basal_moulin_input','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
++			WriteData(fid,'object',obj,'fieldname','basal_moulin_input','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1)
+ 
+-			WriteData(fid,'object',obj,'fieldname','spcsediment_head','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'fieldname','spcsediment_head','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 			WriteData(fid,'object',obj,'fieldname','sediment_compressibility','format','Double');			
+ 			WriteData(fid,'object',obj,'fieldname','sediment_porosity','format','Double');			
+ 			WriteData(fid,'object',obj,'fieldname','sediment_thickness','format','Double');
+ 			WriteData(fid,'object',obj,'fieldname','sediment_transmitivity','format','DoubleMat','mattype',1');		
+ 
+ 			if obj.isefficientlayer==1,	
+-				WriteData(fid,'object',obj,'fieldname','spcepl_head','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);	
++				WriteData(fid,'object',obj,'fieldname','spcepl_head','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);	
+ 				WriteData(fid,'object',obj,'fieldname','mask_eplactive_node','format','DoubleMat','mattype',1);
+ 				WriteData(fid,'object',obj,'fieldname','epl_compressibility','format','Double');			
+ 				WriteData(fid,'object',obj,'fieldname','epl_porosity','format','Double');			
+Index: ../trunk-jpl/src/m/classes/calvinglevermann.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvinglevermann.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/calvinglevermann.m	(revision 19027)
+@@ -56,7 +56,7 @@
+ 			WriteData(fid,'enum',CalvingLawEnum(),'data',CalvingLevermannEnum(),'format','Integer');
+ 			WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',obj.stabilization,'format','Integer');
+ 			WriteData(fid,'enum',CalvinglevermannCoeffEnum(),'data',obj.coeff,'format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'fieldname','meltingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts);
++			WriteData(fid,'object',obj,'fieldname','meltingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/linearbasalforcings.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/linearbasalforcings.py	(revision 19026)
++++ ../trunk-jpl/src/m/classes/linearbasalforcings.py	(revision 19027)
+@@ -68,7 +68,7 @@
+ 	def checkconsistency(self,md,solution,analyses):    # {{{
+ 
+ 		if MasstransportAnalysisEnum() in analyses and not (solution==TransientSolutionEnum() and not md.transient.ismasstransport):
+-			md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'forcing',1)
++			md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'timeseries',1)
+ 			md = checkfield(md,'fieldname','basalforcings.deepwater_melting_rate','>=',0);
+ 			md = checkfield(md,'fieldname','basalforcings.deepwater_elevation','<',md.basalforcings.upperwater_elevation);
+ 			md = checkfield(md,'fieldname','basalforcings.upperwater_elevation','<',0);
+@@ -80,11 +80,11 @@
+ 			md = checkfield(md,'fieldname','basalforcings.upperwater_elevation','<',0);
+ 
+ 		if ThermalAnalysisEnum() in analyses and not (solution==TransientSolutionEnum() and not md.transient.isthermal):
+-			md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'forcing',1)
++			md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'timeseries',1)
+ 			md = checkfield(md,'fieldname','basalforcings.deepwater_melting_rate','>=',0);
+ 			md = checkfield(md,'fieldname','basalforcings.deepwater_elevation','<',md.basalforcings.upperwater_elevation);
+ 			md = checkfield(md,'fieldname','basalforcings.upperwater_elevation','<',0);
+-			md = checkfield(md,'fieldname','basalforcings.geothermalflux','NaN',1,'forcing',1,'>=',0)
++			md = checkfield(md,'fieldname','basalforcings.geothermalflux','NaN',1,'timeseries',1,'>=',0)
+ 
+ 		return md
+ 	# }}}
+@@ -99,9 +99,9 @@
+ 		floatingice_melting_rate[pos]=md.basalforcings.deepwater_melting_rate*(md.geometry.base[pos]-md.basalforcings.upperwater_elevation)/(md.basalforcings.deepwater_elevation-md.basalforcings.upperwater_elevation)
+ 
+ 		WriteData(fid,'enum',BasalforcingsEnum(),'data',LinearFloatingMeltRateEnum(),'format','Integer');
+-		WriteData(fid,'object',self,'fieldname','groundedice_melting_rate','enum',BasalforcingsGroundediceMeltingRateEnum(),'format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+-		WriteData(fid,'data',floatingice_melting_rate,'enum',BasalforcingsFloatingiceMeltingRateEnum(),'format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+-		WriteData(fid,'object',self,'fieldname','geothermalflux','enum',BasalforcingsGeothermalfluxEnum(),'format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'fieldname','groundedice_melting_rate','enum',BasalforcingsGroundediceMeltingRateEnum(),'format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++		WriteData(fid,'data',floatingice_melting_rate,'enum',BasalforcingsFloatingiceMeltingRateEnum(),'format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'fieldname','geothermalflux','enum',BasalforcingsGeothermalfluxEnum(),'format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1)
+ 		WriteData(fid,'object',self,'fieldname','deepwater_melting_rate','enum',BasalforcingsDeepwaterMeltingRateEnum(),'format','Double','scale',1./yts)
+ 		WriteData(fid,'object',self,'fieldname','deepwater_elevation','enum',BasalforcingsDeepwaterElevationEnum(),'format','Double')
+ 		WriteData(fid,'object',self,'fieldname','upperwater_elevation','enum',BasalforcingsUpperwaterElevationEnum(),'format','Double')
+Index: ../trunk-jpl/src/m/classes/SMBpdd.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBpdd.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/SMBpdd.m	(revision 19027)
+@@ -74,8 +74,8 @@
+ 				md = checkfield(md,'fieldname','surfaceforcings.rlaps','>=',0,'numel',1);
+ 				md = checkfield(md,'fieldname','surfaceforcings.rlapslgm','>=',0,'numel',1);
+ 				if(obj.isdelta18o==0 & obj.ismungsm==0)
+-					md = checkfield(md,'fieldname','surfaceforcings.monthlytemperatures','forcing',1,'NaN',1);
+-					md = checkfield(md,'fieldname','surfaceforcings.precipitation','forcing',1,'NaN',1);
++					md = checkfield(md,'fieldname','surfaceforcings.monthlytemperatures','timeseries',1,'NaN',1);
++					md = checkfield(md,'fieldname','surfaceforcings.precipitation','timeseries',1,'NaN',1);
+ 				elseif(obj.isdelta18o==1) 
+ 					md = checkfield(md,'fieldname','surfaceforcings.delta18o','NaN',1);
+ 					md = checkfield(md,'fieldname','surfaceforcings.delta18o_surface','NaN',1);
+@@ -145,8 +145,8 @@
+ 
+ 			if(obj.isdelta18o==0 & obj.ismungsm==0)
+ 				%WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1);
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
++				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+ 			elseif obj.isdelta18o
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1);
+ 				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_lgm','format','DoubleMat','mattype',1);
+Index: ../trunk-jpl/src/m/classes/damage.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/damage.py	(revision 19026)
++++ ../trunk-jpl/src/m/classes/damage.py	(revision 19027)
+@@ -130,7 +130,7 @@
+ 			md = checkfield(md,'fieldname','damage.D','>=',0,'<=',self.max_damage,'size',[md.mesh.numberofvertices])
+ 			md = checkfield(md,'fieldname','damage.max_damage','<',1,'>=',0)
+ 			md = checkfield(md,'fieldname','damage.law','numel',[1],'values',[0,1,2,3])
+-			md = checkfield(md,'fieldname','damage.spcdamage','forcing',1)
++			md = checkfield(md,'fieldname','damage.spcdamage','timeseries',1)
+ 			md = checkfield(md,'fieldname','damage.stabilization','numel',[1],'values',[0,1,2])
+ 			md = checkfield(md,'fieldname','damage.maxiter','>=0',0)
+ 			md = checkfield(md,'fieldname','damage.elementinterp','values',['P1','P2'])
+@@ -158,7 +158,7 @@
+ 		if self.isdamage:
+ 			WriteData(fid,'object',self,'fieldname','D','format','DoubleMat','mattype',1)
+ 			WriteData(fid,'object',self,'fieldname','law','format','Integer')
+-			WriteData(fid,'object',self,'fieldname','spcdamage','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
++			WriteData(fid,'object',self,'fieldname','spcdamage','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1)
+ 			WriteData(fid,'object',self,'fieldname','max_damage','format','Double')
+ 			WriteData(fid,'object',self,'fieldname','stabilization','format','Integer')
+ 			WriteData(fid,'object',self,'fieldname','maxiter','format','Integer')
+Index: ../trunk-jpl/src/m/classes/SMB.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMB.py	(revision 19026)
++++ ../trunk-jpl/src/m/classes/SMB.py	(revision 19027)
+@@ -37,7 +37,7 @@
+ 	def checkconsistency(self,md,solution,analyses):    # {{{
+ 
+ 		if MasstransportAnalysisEnum() in analyses:
+-			md = checkfield(md,'fieldname','surfaceforcings.mass_balance','forcing',1,'NaN',1)
++			md = checkfield(md,'fieldname','surfaceforcings.mass_balance','timeseries',1,'NaN',1)
+ 
+ 		if BalancethicknessAnalysisEnum() in analyses:
+ 			md = checkfield(md,'fieldname','surfaceforcings.mass_balance','size',[md.mesh.numberofvertices],'NaN',1)
+@@ -49,5 +49,5 @@
+ 		yts=365.0*24.0*3600.0
+ 
+ 		WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBEnum(),'format','Integer');
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','mass_balance','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','mass_balance','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
+ 	# }}}
+Index: ../trunk-jpl/src/m/classes/SMBcomponents.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBcomponents.py	(revision 19026)
++++ ../trunk-jpl/src/m/classes/SMBcomponents.py	(revision 19027)
+@@ -50,19 +50,19 @@
+ 	def checkconsistency(self,md,solution,analyses):    # {{{
+ 
+ 		if MasstransportAnalysisEnum() in analyses:
+-			md = checkfield(md,'fieldname','surfaceforcings.accumulation','forcing',1,'NaN',1)
++			md = checkfield(md,'fieldname','surfaceforcings.accumulation','timeseries',1,'NaN',1)
+ 
+ 		if BalancethicknessAnalysisEnum() in analyses:
+ 			md = checkfield(md,'fieldname','surfaceforcings.accumulation','size',[md.mesh.numberofvertices],'NaN',1)
+ 
+ 		if MasstransportAnalysisEnum() in analyses:
+-			md = checkfield(md,'fieldname','surfaceforcings.runoff','forcing',1,'NaN',1)
++			md = checkfield(md,'fieldname','surfaceforcings.runoff','timeseries',1,'NaN',1)
+ 
+ 		if BalancethicknessAnalysisEnum() in analyses:
+ 			md = checkfield(md,'fieldname','surfaceforcings.runoff','size',[md.mesh.numberofvertices],'NaN',1)
+ 
+ 		if MasstransportAnalysisEnum() in analyses:
+-			md = checkfield(md,'fieldname','surfaceforcings.evaporation','forcing',1,'NaN',1)
++			md = checkfield(md,'fieldname','surfaceforcings.evaporation','timeseries',1,'NaN',1)
+ 
+ 		if BalancethicknessAnalysisEnum() in analyses:
+ 			md = checkfield(md,'fieldname','surfaceforcings.evaporation','size',[md.mesh.numberofvertices],'NaN',1)
+@@ -74,7 +74,7 @@
+ 		yts=365.0*24.0*3600.0
+ 
+ 		WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBcomponentsEnum(),'format','Integer');
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','accumulation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','runoff','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+-		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','evaporation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','accumulation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','runoff','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','evaporation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
+ 	# }}}
+Index: ../trunk-jpl/src/m/classes/geometry.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/geometry.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/geometry.m	(revision 19027)
+@@ -62,7 +62,7 @@
+ 			end
+ 
+ 			if (solution==TransientSolutionEnum() & md.transient.isgia) | (solution==GiaSolutionEnum()),
+-				md = checkfield(md,'fieldname','geometry.thickness','forcing',1,'NaN',1,'>=',0);
++				md = checkfield(md,'fieldname','geometry.thickness','timeseries',1,'NaN',1,'>=',0);
+ 			else
+ 				md = checkfield(md,'fieldname','geometry.surface'  ,'NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 				md = checkfield(md,'fieldname','geometry.base'      ,'NaN',1,'size',[md.mesh.numberofvertices 1]);
+@@ -86,7 +86,7 @@
+ 		end % }}}
+ 		function marshall(obj,md,fid) % {{{
+ 			WriteData(fid,'data',obj.surface,'format','DoubleMat','mattype',1,'enum',SurfaceEnum());
+-			WriteData(fid,'data',obj.thickness,'format','DoubleMat','mattype',1,'enum',ThicknessEnum(),'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'data',obj.thickness,'format','DoubleMat','mattype',1,'enum',ThicknessEnum(),'timeserieslength',md.mesh.numberofvertices+1);
+ 			WriteData(fid,'data',obj.base,'format','DoubleMat','mattype',1,'enum',BaseEnum());
+ 			WriteData(fid,'data',obj.bed,'format','DoubleMat','mattype',1,'enum',BedEnum());
+ 			WriteData(fid,'object',obj,'fieldname','hydrostatic_ratio','format','DoubleMat','mattype',1);
+Index: ../trunk-jpl/src/m/classes/friction.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/friction.py	(revision 19026)
++++ ../trunk-jpl/src/m/classes/friction.py	(revision 19027)
+@@ -37,7 +37,7 @@
+ 		if StressbalanceAnalysisEnum() not in analyses and ThermalAnalysisEnum() not in analyses:
+ 			return md
+ 
+-		md = checkfield(md,'fieldname','friction.coefficient','forcing',1,'NaN',1)
++		md = checkfield(md,'fieldname','friction.coefficient','timeseries',1,'NaN',1)
+ 		md = checkfield(md,'fieldname','friction.q','NaN',1,'size',[md.mesh.numberofelements])
+ 		md = checkfield(md,'fieldname','friction.p','NaN',1,'size',[md.mesh.numberofelements])
+ 
+Index: ../trunk-jpl/src/m/classes/SMBmeltcomponents.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBmeltcomponents.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/SMBmeltcomponents.m	(revision 19027)
+@@ -49,25 +49,25 @@
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+ 
+ 			if ismember(MasstransportAnalysisEnum(),analyses),
+-				md = checkfield(md,'fieldname','surfaceforcings.accumulation','forcing',1,'NaN',1);
++				md = checkfield(md,'fieldname','surfaceforcings.accumulation','timeseries',1,'NaN',1);
+ 			end
+ 			if ismember(BalancethicknessAnalysisEnum(),analyses),
+ 				md = checkfield(md,'fieldname','surfaceforcings.accumulation','size',[md.mesh.numberofvertices 1],'NaN',1);
+ 			end
+ 			if ismember(MasstransportAnalysisEnum(),analyses),
+-				md = checkfield(md,'fieldname','surfaceforcings.evaporation','forcing',1,'NaN',1);
++				md = checkfield(md,'fieldname','surfaceforcings.evaporation','timeseries',1,'NaN',1);
+ 			end
+ 			if ismember(BalancethicknessAnalysisEnum(),analyses),
+ 				md = checkfield(md,'fieldname','surfaceforcings.evaporation','size',[md.mesh.numberofvertices 1],'NaN',1);
+ 			end
+ 			if ismember(MasstransportAnalysisEnum(),analyses),
+-				md = checkfield(md,'fieldname','surfaceforcings.refreeze','forcing',1,'NaN',1);
++				md = checkfield(md,'fieldname','surfaceforcings.refreeze','timeseries',1,'NaN',1);
+ 			end
+ 			if ismember(BalancethicknessAnalysisEnum(),analyses),
+ 				md = checkfield(md,'fieldname','surfaceforcings.refreeze','size',[md.mesh.numberofvertices 1],'NaN',1);
+ 			end
+ 			if ismember(MasstransportAnalysisEnum(),analyses),
+-				md = checkfield(md,'fieldname','surfaceforcings.melt','forcing',1,'NaN',1);
++				md = checkfield(md,'fieldname','surfaceforcings.melt','timeseries',1,'NaN',1);
+ 			end
+ 			if ismember(BalancethicknessAnalysisEnum(),analyses),
+ 				md = checkfield(md,'fieldname','surfaceforcings.melt','size',[md.mesh.numberofvertices 1],'NaN',1);
+@@ -85,10 +85,10 @@
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBmeltcomponentsEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','accumulation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','evaporation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','melt','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','refreeze','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','accumulation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','evaporation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','melt','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','refreeze','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/friction.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/friction.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/friction.m	(revision 19027)
+@@ -34,7 +34,7 @@
+ 
+ 			%Early return
+ 			if ~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(ThermalAnalysisEnum(),analyses), return; end
+-			md = checkfield(md,'fieldname','friction.coefficient','forcing',1,'NaN',1);
++			md = checkfield(md,'fieldname','friction.coefficient','timeseries',1,'NaN',1);
+ 			md = checkfield(md,'fieldname','friction.q','NaN',1,'size',[md.mesh.numberofelements 1]);
+ 			md = checkfield(md,'fieldname','friction.p','NaN',1,'size',[md.mesh.numberofelements 1]);
+ 		end % }}}
+@@ -48,7 +48,7 @@
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'enum',FrictionLawEnum,'data',1,'format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','coefficient','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'fieldname','coefficient','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 			%WriteData(fid,'object',obj,'fieldname','coefficient','format','DoubleMat','mattype',1);
+ 			WriteData(fid,'object',obj,'fieldname','p','format','DoubleMat','mattype',2);
+ 			WriteData(fid,'object',obj,'fieldname','q','format','DoubleMat','mattype',2);
+Index: ../trunk-jpl/src/m/classes/frictionweertman.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionweertman.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/frictionweertman.m	(revision 19027)
+@@ -33,7 +33,7 @@
+ 
+ 			%Early return
+ 			if ~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(ThermalAnalysisEnum(),analyses), return; end
+-			md = checkfield(md,'fieldname','friction.C','forcing',1,'NaN',1);
++			md = checkfield(md,'fieldname','friction.C','timeseries',1,'NaN',1);
+ 			md = checkfield(md,'fieldname','friction.m','NaN',1,'size',[md.mesh.numberofelements 1]);
+ 		end % }}}
+ 		function disp(obj) % {{{
+@@ -50,7 +50,7 @@
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'enum',FrictionLawEnum,'data',2,'format','Integer');
+-			WriteData(fid,'class','friction','object',obj,'fieldname','C','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'class','friction','object',obj,'fieldname','C','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 			WriteData(fid,'class','friction','object',obj,'fieldname','m','format','DoubleMat','mattype',2);
+ 			
+ 
+Index: ../trunk-jpl/src/m/classes/SMBgradients.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBgradients.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/SMBgradients.m	(revision 19027)
+@@ -37,10 +37,10 @@
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+ 
+ 			if ismember(MasstransportAnalysisEnum(),analyses),
+-				md = checkfield(md,'fieldname','surfaceforcings.href','forcing',1,'NaN',1);
+-				md = checkfield(md,'fieldname','surfaceforcings.smbref','forcing',1,'NaN',1);
+-				md = checkfield(md,'fieldname','surfaceforcings.b_pos','forcing',1,'NaN',1);
+-				md = checkfield(md,'fieldname','surfaceforcings.b_neg','forcing',1,'NaN',1);
++				md = checkfield(md,'fieldname','surfaceforcings.href','timeseries',1,'NaN',1);
++				md = checkfield(md,'fieldname','surfaceforcings.smbref','timeseries',1,'NaN',1);
++				md = checkfield(md,'fieldname','surfaceforcings.b_pos','timeseries',1,'NaN',1);
++				md = checkfield(md,'fieldname','surfaceforcings.b_neg','timeseries',1,'NaN',1);
+ 			end
+ 		end % }}}
+ 		function disp(obj) % {{{
+@@ -58,10 +58,10 @@
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBgradientsEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','href','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','smbref','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','b_pos','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','b_neg','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','href','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','smbref','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','b_pos','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','b_neg','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+ 
+ 		end % }}}
+ 	end
+Index: ../trunk-jpl/src/m/classes/hydrologydc.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 19026)
++++ ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 19027)
+@@ -153,14 +153,14 @@
+ 		if self.transfer_flag==1:
+ 			md = checkfield(md,'fieldname','hydrology.leakage_factor','>',0.,'numel',[1])
+ 
+-		md = checkfield(md,'fieldname','hydrology.basal_moulin_input','NaN',1,'forcing',1)
+-		md = checkfield(md,'fieldname','hydrology.spcsediment_head','forcing',1)
++		md = checkfield(md,'fieldname','hydrology.basal_moulin_input','NaN',1,'timeseries',1)
++		md = checkfield(md,'fieldname','hydrology.spcsediment_head','timeseries',1)
+ 		md = checkfield(md,'fieldname','hydrology.sediment_compressibility','>',0.,'numel',[1])
+ 		md = checkfield(md,'fieldname','hydrology.sediment_porosity','>',0.,'numel',[1])
+ 		md = checkfield(md,'fieldname','hydrology.sediment_thickness','>',0.,'numel',[1])
+ 		md = checkfield(md,'fieldname','hydrology.sediment_transmitivity','>=',0,'size',[md.mesh.numberofvertices,1])
+ 		if self.isefficientlayer==1:
+-			md = checkfield(md,'fieldname','hydrology.spcepl_head','forcing',1)
++			md = checkfield(md,'fieldname','hydrology.spcepl_head','timeseries',1)
+ 			md = checkfield(md,'fieldname','hydrology.mask_eplactive_node','size',[md.mesh.numberofvertices,1],'values',[0,1])
+ 			md = checkfield(md,'fieldname','hydrology.epl_compressibility','>',0.,'numel',[1])
+ 			md = checkfield(md,'fieldname','hydrology.epl_porosity','>',0.,'numel',[1])
+@@ -189,15 +189,15 @@
+ 		if self.transfer_flag==1:
+ 			WriteData(fid,'object',self,'fieldname','leakage_factor','format','Double')
+ 
+-		WriteData(fid,'object',self,'fieldname','basal_moulin_input','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
+-		WriteData(fid,'object',self,'fieldname','spcsediment_head','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'fieldname','basal_moulin_input','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'fieldname','spcsediment_head','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1)
+ 		WriteData(fid,'object',self,'fieldname','sediment_compressibility','format','Double')
+ 		WriteData(fid,'object',self,'fieldname','sediment_porosity','format','Double')			
+ 		WriteData(fid,'object',self,'fieldname','sediment_thickness','format','Double')
+ 		WriteData(fid,'object',self,'fieldname','sediment_transmitivity','format','DoubleMat','mattype',1)		
+ 
+ 		if self.isefficientlayer==1:	
+-			WriteData(fid,'object',self,'fieldname','spcepl_head','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)	
++			WriteData(fid,'object',self,'fieldname','spcepl_head','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1)	
+ 			WriteData(fid,'object',self,'fieldname','mask_eplactive_node','format','DoubleMat','mattype',1)
+ 			WriteData(fid,'object',self,'fieldname','epl_compressibility','format','Double')			
+ 			WriteData(fid,'object',self,'fieldname','epl_porosity','format','Double')			
+Index: ../trunk-jpl/src/m/classes/frictionhydro.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionhydro.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/frictionhydro.m	(revision 19027)
+@@ -42,7 +42,7 @@
+ 			WriteData(fid,'class','friction','object',obj,'fieldname','q','format','DoubleMat','mattype',2);
+ 			WriteData(fid,'class','friction','object',obj,'fieldname','C','format','DoubleMat','mattype',2);
+ 			WriteData(fid,'class','friction','object',obj,'fieldname','As','format','DoubleMat','mattype',2);
+-			WriteData(fid,'class','friction','object',obj,'fieldname','effective_pressure','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'class','friction','object',obj,'fieldname','effective_pressure','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/frictionweertmantemp.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionweertmantemp.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/frictionweertmantemp.m	(revision 19027)
+@@ -25,7 +25,7 @@
+ 
+ 			%Early return
+ 			if ~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(ThermalAnalysisEnum(),analyses), return; end
+-			md = checkfield(md,'fieldname','friction.C','forcing',1,'NaN',1);
++			md = checkfield(md,'fieldname','friction.C','timeseries',1,'NaN',1);
+ 			md = checkfield(md,'fieldname','friction.m','NaN',1,'size',[md.mesh.numberofelements 1]);
+ 		end % }}}
+ 		function disp(obj) % {{{
+@@ -41,7 +41,7 @@
+ 
+ 			WriteData(fid,'enum',FrictionLawEnum,'data',6,'format','Integer');
+ 			WriteData(fid,'class','friction','object',obj,'fieldname','gamma','format','Double');
+-			WriteData(fid,'class','friction','object',obj,'fieldname','C','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'class','friction','object',obj,'fieldname','C','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 			WriteData(fid,'class','friction','object',obj,'fieldname','m','format','DoubleMat','mattype',2);
+ 			
+ 
+Index: ../trunk-jpl/src/m/classes/snowpack.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/snowpack.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/snowpack.m	(revision 19027)
+@@ -454,9 +454,9 @@
+ 
+ 			yts=365.0*24.0*3600.0;
+ 
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','spcvx','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','spcvy','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','spcvz','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','snowpack','fieldname','spcvx','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','snowpack','fieldname','spcvy','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','snowpack','fieldname','spcvz','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+ 			WriteData(fid,'object',obj,'class','snowpack','fieldname','restol','format','Double');
+ 			WriteData(fid,'object',obj,'class','snowpack','fieldname','reltol','format','Double');
+ 			WriteData(fid,'object',obj,'class','snowpack','fieldname','abstol','format','Double');
+Index: ../trunk-jpl/src/m/classes/stressbalance.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/stressbalance.py	(revision 19026)
++++ ../trunk-jpl/src/m/classes/stressbalance.py	(revision 19027)
+@@ -122,10 +122,10 @@
+ 		if StressbalanceAnalysisEnum() not in analyses:
+ 			return md
+ 
+-		md = checkfield(md,'fieldname','stressbalance.spcvx','forcing',1)
+-		md = checkfield(md,'fieldname','stressbalance.spcvy','forcing',1)
++		md = checkfield(md,'fieldname','stressbalance.spcvx','timeseries',1)
++		md = checkfield(md,'fieldname','stressbalance.spcvy','timeseries',1)
+ 		if m.strcmp(md.mesh.domaintype(),'3D'):
+-			md = checkfield(md,'fieldname','stressbalance.spcvz','forcing',1)
++			md = checkfield(md,'fieldname','stressbalance.spcvz','timeseries',1)
+ 		md = checkfield(md,'fieldname','stressbalance.restol','size',[1],'>',0)
+ 		md = checkfield(md,'fieldname','stressbalance.reltol','size',[1])
+ 		md = checkfield(md,'fieldname','stressbalance.abstol','size',[1])
+@@ -167,9 +167,9 @@
+ 
+ 		yts=365.0*24.0*3600.0
+ 
+-		WriteData(fid,'object',self,'class','stressbalance','fieldname','spcvx','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+-		WriteData(fid,'object',self,'class','stressbalance','fieldname','spcvy','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+-		WriteData(fid,'object',self,'class','stressbalance','fieldname','spcvz','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'class','stressbalance','fieldname','spcvx','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'class','stressbalance','fieldname','spcvy','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'class','stressbalance','fieldname','spcvz','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
+ 		WriteData(fid,'object',self,'class','stressbalance','fieldname','restol','format','Double')
+ 		WriteData(fid,'object',self,'class','stressbalance','fieldname','reltol','format','Double')
+ 		WriteData(fid,'object',self,'class','stressbalance','fieldname','abstol','format','Double','scale',1./yts)
+Index: ../trunk-jpl/src/m/classes/SMBhenning.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBhenning.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/SMBhenning.m	(revision 19027)
+@@ -31,7 +31,7 @@
+ 		function md = checkconsistency(obj,md,solution,analyses) % {{{
+ 
+ 			if ismember(MasstransportAnalysisEnum(),analyses),
+-				md = checkfield(md,'fieldname','surfaceforcings.smbref','forcing',1,'NaN',1);
++				md = checkfield(md,'fieldname','surfaceforcings.smbref','timeseries',1,'NaN',1);
+ 			end
+ 			if ismember(BalancethicknessAnalysisEnum(),analyses),
+ 				md = checkfield(md,'fieldname','surfaceforcings.smbref','size',[md.mesh.numberofvertices 1],'NaN',1);
+@@ -46,7 +46,7 @@
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBhenningEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','smbref','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','smbref','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/matice.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/matice.py	(revision 19026)
++++ ../trunk-jpl/src/m/classes/matice.py	(revision 19027)
+@@ -116,7 +116,7 @@
+ 		md = checkfield(md,'fieldname','materials.rho_water','>',0)
+ 		md = checkfield(md,'fieldname','materials.rho_freshwater','>',0)
+ 		md = checkfield(md,'fieldname','materials.mu_water','>',0)
+-		md = checkfield(md,'fieldname','materials.rheology_B','>',0,'forcing',1,'NaN',1)
++		md = checkfield(md,'fieldname','materials.rheology_B','>',0,'timeseries',1,'NaN',1)
+ 		md = checkfield(md,'fieldname','materials.rheology_n','>',0,'size',[md.mesh.numberofelements])
+ 		md = checkfield(md,'fieldname','materials.rheology_law','values',['None','Cuffey','Paterson','Arrhenius','LliboutryDuval'])
+ 		md = checkfield(md,'fieldname','materials.lithosphere_shear_modulus','>',0,'numel',[1]);
+@@ -139,7 +139,7 @@
+ 		WriteData(fid,'object',self,'class','materials','fieldname','beta','format','Double')
+ 		WriteData(fid,'object',self,'class','materials','fieldname','mixed_layer_capacity','format','Double')
+ 		WriteData(fid,'object',self,'class','materials','fieldname','thermal_exchange_velocity','format','Double')
+-		WriteData(fid,'object',self,'class','materials','fieldname','rheology_B','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
++		WriteData(fid,'object',self,'class','materials','fieldname','rheology_B','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1)
+ 		WriteData(fid,'object',self,'class','materials','fieldname','rheology_B','format','DoubleMat','mattype',1)
+ 		WriteData(fid,'object',self,'class','materials','fieldname','rheology_n','format','DoubleMat','mattype',2)
+ 		WriteData(fid,'data',StringToEnum(self.rheology_law)[0],'enum',MaterialsRheologyLawEnum(),'format','Integer')
+Index: ../trunk-jpl/src/m/classes/masscon.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/masscon.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/masscon.m	(revision 19027)
+@@ -42,7 +42,7 @@
+ 			
+ 			md = checkfield(md,'fieldname','obj.definitionenum','field',obj.definitionenum,'values',[Outputdefinition1Enum,Outputdefinition2Enum,Outputdefinition3Enum,Outputdefinition4Enum,Outputdefinition5Enum,Outputdefinition6Enum,Outputdefinition7Enum,Outputdefinition8Enum,Outputdefinition9Enum,Outputdefinition10Enum]);
+ 
+-			md = checkfield(md,'fieldname','obj.levelset','field',obj.levelset,'forcing',1,'NaN',1);
++			md = checkfield(md,'fieldname','obj.levelset','field',obj.levelset,'timeseries',1,'NaN',1);
+ 
+ 		end % }}}
+ 		function md = disp(obj) % {{{
+Index: ../trunk-jpl/src/m/classes/masstransport.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/masstransport.m	(revision 19026)
++++ ../trunk-jpl/src/m/classes/masstransport.m	(revision 19027)
+@@ -86,7 +86,7 @@
+ 			%Early return
+ 			if ~ismember(MasstransportAnalysisEnum(),analyses) |  (solution==TransientSolutionEnum() & md.transient.ismasstransport==0), return; end
+ 
+-			md = checkfield(md,'fieldname','masstransport.spcthickness','forcing',1);
++			md = checkfield(md,'fieldname','masstransport.spcthickness','timeseries',1);
+ 			md = checkfield(md,'fieldname','masstransport.isfreesurface','values',[0 1]);
+ 			md = checkfield(md,'fieldname','masstransport.hydrostatic_adjustment','values',{'Absolute' 'Incremental'});
+ 			md = checkfield(md,'fieldname','masstransport.stabilization','values',[0 1 2 3 4]);
+@@ -112,7 +112,7 @@
+ 
+ 			yts=365.*24.*3600.;
+ 
+-			WriteData(fid,'object',obj,'fieldname','spcthickness','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',obj,'fieldname','spcthickness','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 			WriteData(fid,'object',obj,'fieldname','isfreesurface','format','Boolean');
+ 			WriteData(fid,'object',obj,'fieldname','min_thickness','format','Double');
+ 			WriteData(fid,'data',StringToEnum(obj.hydrostatic_adjustment),'format','Integer','enum',MasstransportHydrostaticAdjustmentEnum());
Index: /issm/oecreview/Archive/18296-19100/ISSM-19027-19028.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19027-19028.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19027-19028.diff	(revision 19102)
@@ -0,0 +1,202 @@
+Index: ../trunk-jpl/src/ad/validation/Validation/Makefile
+===================================================================
+--- ../trunk-jpl/src/ad/validation/Validation/Makefile	(revision 19027)
++++ ../trunk-jpl/src/ad/validation/Validation/Makefile	(revision 19028)
+@@ -1,2 +0,0 @@
+-clean:
+-	rm validation.lock validation.outlog validationRose.outlog
+Index: ../trunk-jpl/src/ad/validation/Validation/validation.queue
+===================================================================
+--- ../trunk-jpl/src/ad/validation/Validation/validation.queue	(revision 19027)
++++ ../trunk-jpl/src/ad/validation/Validation/validation.queue	(revision 19028)
+@@ -1,4 +0,0 @@
+-#!/bin/sh
+-#mpiexec -np 3 $ISSM_TIER/bin/issm.exe PrognosticSolution ./ validation > validation.outlog
+-echo "\n Running issm.exe"
+-mpiexec -np 3 $ISSM_TIER/src/ad/issm.exe PrognosticSolution ./ validation > validation.outlog 
+Index: ../trunk-jpl/src/ad/validation/Validation/Archive.mat
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/ad/validation/Validation/validation.bin
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/ad/validation/Validation/validation.m
+===================================================================
+--- ../trunk-jpl/src/ad/validation/Validation/validation.m	(revision 19027)
++++ ../trunk-jpl/src/ad/validation/Validation/validation.m	(revision 19028)
+@@ -1,31 +0,0 @@
+-tolerance=1e-13;
+-
+-md=model;
+-md.cluster=generic('name',oshostname(),'np',3);
+-md.miscellaneous.name='validation';
+-
+-%run all scripts
+-for i=1:2,
+-
+-	%run queuing script
+-	if i==1,
+-		disp('Checking src/ad/issm.exe ...');
+-		!source validation.queue
+-	elseif i==2,
+-		disp('Checking src/ad/issmROSE.exe ...');
+-		!source validationROSE.queue
+-	end
+-
+-	%load solution and remove outbin
+-	md=loadresultsfromdisk(md,'validation.outbin');
+-	!rm validation.outbin
+-
+-	s=load('Archive.mat'); h0=s.thickness;
+-	h=md.results.MasstransportSolution.Thickness;
+-	error_diff=full(max(abs(h-h0))/(max(abs(h0))+eps));
+-	if (error_diff>tolerance);
+-		disp(sprintf(['\nERROR   difference: %-7.2g > %7.2g \n'],error_diff,tolerance));
+-	else
+-		disp(sprintf(['\nSUCCESS difference: %-7.2g < %7.2g \n'],error_diff,tolerance));
+-	end
+-end
+Index: ../trunk-jpl/src/ad/validation/Validation/validationROSE.queue
+===================================================================
+--- ../trunk-jpl/src/ad/validation/Validation/validationROSE.queue	(revision 19027)
++++ ../trunk-jpl/src/ad/validation/Validation/validationROSE.queue	(revision 19028)
+@@ -1,4 +0,0 @@
+-#!/bin/sh
+-#mpiexec -np 3 $ISSM_TIER/bin/issm.exe PrognosticSolution ./ validation > validation.outlog
+-echo "\n Running issmRose.exe"
+-mpiexec -np 3 $ISSM_TIER/src/ad/issmRose.exe PrognosticSolution ./ validation > validationRose.outlog 
+Index: ../trunk-jpl/src/ad/validation/Validation/validation.petsc
+===================================================================
+--- ../trunk-jpl/src/ad/validation/Validation/validation.petsc	(revision 19027)
++++ ../trunk-jpl/src/ad/validation/Validation/validation.petsc	(revision 19028)
+@@ -1,17 +0,0 @@
+-%Petsc options file: validation.petsc written from Matlab solver array
+-
+-+NoneAnalysis
+--mat_type mpiaij
+--ksp_type preonly
+--pc_type lu
+--pc_factor_mat_solver_package mumps
+--mat_mumps_icntl_14 120
+--pc_factor_shift_positive_definite true
+-
+-+DiagnosticVertAnalysis
+--mat_type mpiaij
+--ksp_type preonly
+--pc_type lu
+--pc_factor_mat_solver_package mumps
+--mat_mumps_icntl_14 120
+--pc_factor_shift_positive_definite true
+Index: ../trunk-jpl/src/ad/validation/Update/SquareShelfConstrained.data
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+Index: ../trunk-jpl/src/ad/validation/Update/Square.exp
+===================================================================
+--- ../trunk-jpl/src/ad/validation/Update/Square.exp	(revision 19027)
++++ ../trunk-jpl/src/ad/validation/Update/Square.exp	(revision 19028)
+@@ -1,10 +0,0 @@
+-## Name:domainoutline
+-## Icon:0
+-# Points Count  Value
+-5 1.
+-# X pos Y pos
+-0 0
+-1000000 0
+-1000000 1000000
+-0 1000000
+-0 0
+Index: ../trunk-jpl/src/ad/validation/Update/SquareShelfConstrained.par
+===================================================================
+--- ../trunk-jpl/src/ad/validation/Update/SquareShelfConstrained.par	(revision 19027)
++++ ../trunk-jpl/src/ad/validation/Update/SquareShelfConstrained.par	(revision 19028)
+@@ -1,51 +0,0 @@
+-%Start defining model parameters here
+-
+-%Geometry
+-hmin=300;
+-hmax=1000;
+-ymin=min(md.mesh.y);
+-ymax=max(md.mesh.y);
+-md.geometry.thickness=hmax+(hmin-hmax)*(md.mesh.y-ymin)/(ymax-ymin);
+-md.geometry.bed=-md.materials.rho_ice/md.materials.rho_water*md.geometry.thickness;
+-md.geometry.surface=md.geometry.bed+md.geometry.thickness;
+-
+-%Initial velocity 
+-load('SquareShelfConstrained.data','-mat');
+-md.initialization.vx=InterpFromMeshToMesh2d(index,x,y,vx,md.mesh.x,md.mesh.y);
+-md.initialization.vy=InterpFromMeshToMesh2d(index,x,y,vy,md.mesh.x,md.mesh.y);
+-clear vx vy x y index;
+-md.initialization.vz=zeros(md.mesh.numberofvertices,1);
+-md.initialization.pressure=zeros(md.mesh.numberofvertices,1);
+-
+-%Materials
+-md.initialization.temperature=(273-20)*ones(md.mesh.numberofvertices,1);
+-md.materials.rheology_B=paterson(md.initialization.temperature);
+-md.materials.rheology_n=3*ones(md.mesh.numberofelements,1);
+-
+-%Surface mass balance and basal melting
+-md.surfaceforcings.mass_balance=10*ones(md.mesh.numberofvertices,1);
+-md.basalforcings.melting_rate=5*ones(md.mesh.numberofvertices,1);
+-
+-%Friction
+-pos=find(md.mask.elementonfloatingice);
+-md.friction.coefficient=20*ones(md.mesh.numberofvertices,1);
+-md.friction.coefficient(md.mesh.elements(pos,:))=0;
+-md.friction.p=ones(md.mesh.numberofelements,1);
+-md.friction.q=ones(md.mesh.numberofelements,1);
+-
+-%Numerical parameters
+-md.stressbalance.viscosity_overshoot=0.0;
+-md.prognostic.stabilization=1;
+-md.thermal.stabilization=1;
+-md.verbose=verbose(0);
+-md.settings.waitonlock=30;
+-md.stressbalance.restol=0.05;
+-md.stressbalance.reltol=0.05;
+-md.steadystate.reltol=0.05;
+-md.stressbalance.abstol=NaN;
+-md.timestepping.time_step=1;
+-md.timestepping.final_time=3;
+-
+-%Deal with boundary conditions:
+-md=SetIceShelfBC(md);
+-md.miscellaneous.name='validation';
+Index: ../trunk-jpl/src/ad/validation/Update/update.m
+===================================================================
+--- ../trunk-jpl/src/ad/validation/Update/update.m	(revision 19027)
++++ ../trunk-jpl/src/ad/validation/Update/update.m	(revision 19028)
+@@ -1,17 +0,0 @@
+-tolerance=1e-13;
+-
+-md=setmesh(model,'Square.exp',150000);
+-md=setmask(md,'all','');
+-md=parameterize(md,'SquareShelfConstrained.par');
+-md=setflowequation(md,'SSA','all');
+-md.cluster=generic('name',oshostname(),'np',3);
+-md.cluster.executionpath=[issmtier() '/src/ad/validation/Validation/'];
+-
+-md.autodiff.isautodiff=true;
+-md.autodiff.forward=true;
+-md.verbose=verbose('solution',true);
+-
+-md=solve(md,MasstransportSolutionEnum);
+-
+-thickness=md.results.MasstransportSolution.Thickness;
+-save ../Validation/Archive.mat thickness;
+Index: ../trunk-jpl/src/ad/validation.sh
+===================================================================
+--- ../trunk-jpl/src/ad/validation.sh	(revision 19027)
++++ ../trunk-jpl/src/ad/validation.sh	(revision 19028)
+@@ -1,9 +0,0 @@
+-#!/bin/bash
+-#This is a quick validation test for new ADIC2 capability development
+-#Just run it, it will fire up matlab, which will create a binary file
+-#launch issm.exe using the binary file, post-process the output binary 
+-#and compare it against an archive result.
+-
+-cd validation/Validation
+-matlab -nojvm -r "addpath $ISSM_TIER/; startup;" < validation.m
+-cd ..
Index: /issm/oecreview/Archive/18296-19100/ISSM-19028-19029.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19028-19029.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19028-19029.diff	(revision 19102)
@@ -0,0 +1,24 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 19028)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 19029)
+@@ -649,6 +649,7 @@
+ 	/*clean-up*/
+ 	delete gauss;
+ }
++/*}}}*/
+ void       Tria::MungsmtpParameterization(void){/*{{{*/
+ 	/*Are we on the base? If not, return*/
+ 	if(!IsOnBase()) return;
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 19028)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 19029)
+@@ -651,6 +651,7 @@
+ 	/*clean-up*/
+ 	delete gauss;
+ }
++/*}}}*/
+ void       Penta::MungsmtpParameterization(void){/*{{{*/
+ 	/*Are we on the base? If not, return*/
+ 	if(!IsOnBase()) return;
Index: /issm/oecreview/Archive/18296-19100/ISSM-19029-19030.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19029-19030.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19029-19030.diff	(revision 19102)
@@ -0,0 +1,107 @@
+Index: ../trunk-jpl/src/c/shared/Matrix/MatrixUtils.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Matrix/MatrixUtils.cpp	(revision 19029)
++++ ../trunk-jpl/src/c/shared/Matrix/MatrixUtils.cpp	(revision 19030)
+@@ -332,7 +332,90 @@
+ 	Ainv[3]=   A[0]/det; /* =  a/det */
+ 
+ }/*}}}*/
++void Matrix2x2Eigen(IssmDouble* plambda1,IssmDouble* plambda2,IssmDouble* pvx, IssmDouble* pvy,IssmDouble a11, IssmDouble a21,IssmDouble a22){/*{{{*/
++	/*From symetric matrix (a11,a21;a21,a22), get eigen values lambda1 and lambda2 and one eigen vector v*/
+ 
++	/*Output*/
++	IssmDouble lambda1,lambda2;
++	IssmDouble vx,vy;
++
++	/*To get the eigen values, we must solve the following equation:
++	 *     | a11 - lambda    a21        |
++	 * det |                            | = 0
++	 *     | a21             a22-lambda |
++	 *
++	 * We have to solve the following polynom:
++	 *  lamda^2 + ( -a11 -a22)*lambda + (a11*a22-a21*a21) = 0*/
++
++	/*Compute polynom determinant*/
++	IssmDouble b=-a11-a22;
++	IssmDouble delta=b*b - 4*(a11*a22-a21*a21);
++
++	/*Compute norm of M to avoid round off errors*/
++	IssmDouble normM=a11*a11 + a22*a22 + a21*a21;
++
++	/*1: normM too small: eigen values = 0*/
++	if(normM<1.e-30){
++		lambda1=0.;
++		lambda2=0.;
++		vx=1.;
++		vy=0.;
++	}
++	/*2: delta is small -> double root*/
++	else if (delta < 1.e-5*normM){
++		lambda1=-b/2.;
++		lambda2=-b/2.;
++		vx=1.;
++		vy=0.;
++	}
++	/*3: general case -> two roots*/
++	else{
++		delta   = sqrt(delta);
++		lambda1 = (-b-delta)/2.;
++		lambda2 = (-b+delta)/2.;
++
++		/*Now, one must find the eigen vectors. For that we use the following property of the inner product
++		 *    <Ax,y> = <x,tAy>
++		 * Here, M'(M-lambda*Id) is symmetrical, which gives:
++		 *    ∀(x,y)∈R²xR² <M'x,y> = <M'y,x>
++		 * And we have the following:
++		 *    if y∈Ker(M'), ∀x∈R² <M'x,y> = <x,M'y> = 0
++		 * We have shown that
++		 *    Im(M') ⊥ Ker(M')
++		 *
++		 * To find the eigen vectors of M, we only have to find two vectors
++		 * of the image of M' and take their perpendicular as long as they are
++		 * not 0.
++		 * To do that, we take the images (1,0) and (0,1):
++		 *  x1 = (a11 - lambda)      x2 = a21
++		 *  y1 = a21                 y2 = (a22-lambda)
++		 *
++		 * We take the vector that has the larger norm and take its perpendicular.*/
++
++		IssmDouble norm1 = (a11-lambda1)*(a11-lambda1) + a21*a21; 
++		IssmDouble norm2 = a21*a21 + (a22-lambda1)*(a22-lambda1);
++
++		if(norm2<norm1){
++			norm1=sqrt(norm1);
++			vx = - a21/norm1;
++			vy = (a11-lambda1)/norm1;
++		}
++		else{
++			norm2=sqrt(norm2);
++			vx = - (a22-lambda1)/norm2;
++			vy = a21/norm2;
++		}
++	}
++
++	/*Assign output*/
++	*plambda1 = lambda1;
++	*plambda2 = lambda2;
++	*pvx      = vx;
++	*pvy      = vy;
++
++
++}/*}}}*/
++
+ void Matrix3x3Determinant(IssmDouble* Adet,IssmDouble* A){/*{{{*/
+ 	/*Compute determinant of a 3x3 matrix*/
+ 
+Index: ../trunk-jpl/src/c/shared/Matrix/matrix.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Matrix/matrix.h	(revision 19029)
++++ ../trunk-jpl/src/c/shared/Matrix/matrix.h	(revision 19030)
+@@ -13,6 +13,7 @@
+ 
+ void Matrix2x2Invert(IssmDouble* Ainv, IssmDouble* A);
+ void Matrix2x2Determinant(IssmDouble* Adet,IssmDouble* A);
++void Matrix2x2Eigen(IssmDouble* plambda1,IssmDouble* plambda2,IssmDouble* pvx, IssmDouble* pvy,IssmDouble a11, IssmDouble a21,IssmDouble a22);
+ 
+ void Matrix3x3Invert(IssmDouble* Ainv, IssmDouble* A);
+ void Matrix3x3Determinant(IssmDouble* Adet,IssmDouble* A);
Index: /issm/oecreview/Archive/18296-19100/ISSM-19030-19031.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19030-19031.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19030-19031.diff	(revision 19102)
@@ -0,0 +1,23 @@
+Index: ../trunk-jpl/test/NightlyRun/test3300.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3300.m	(revision 19030)
++++ ../trunk-jpl/test/NightlyRun/test3300.m	(revision 19031)
+@@ -30,7 +30,7 @@
+ md.hydrology.transfer_flag=1.0;
+ md.hydrology.leakage_factor=3.9e-12;
+ 
+-times=0:0.2:8.0;
++times=0:0.002:8.0;
+ md.basalforcings.groundedice_melting_rate=ones(md.mesh.numberofvertices+1,length(times));
+ 
+ for i=1:length(times)
+@@ -45,8 +45,7 @@
+ 
+ md.basalforcings.groundedice_melting_rate(end,:)=times;
+ 
+-
+-md.timestepping.time_step=0.2;
++md.timestepping.time_step=0.002;
+ md.timestepping.final_time=8.0;
+ 
+ md=solve(md,TransientSolutionEnum());
Index: /issm/oecreview/Archive/18296-19100/ISSM-19031-19032.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19031-19032.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19031-19032.diff	(revision 19102)
@@ -0,0 +1,66 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19031)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19032)
+@@ -230,9 +230,10 @@
+ 						basis,1,numnodes,0,
+ 						&Ke->values[0],1);
+ 			
++			
+ 			/*Transfer EPL part*/
+ 			transfer=GetHydrologyKMatrixTransfer(basalelement,gauss,sed_head_input,epl_head_input,thick_input,base_input);
+-			D_scalar=transfer*gauss->weight*Jdet;
++			D_scalar=dt*transfer*gauss->weight*Jdet;
+ 			TripleMultiply(basis,numnodes,1,0,
+ 										 &D_scalar,1,1,0,
+ 										 basis,1,numnodes,0,
+@@ -327,7 +328,7 @@
+ 			
+ 			/*Dealing with the epl part of the transfer term*/
+ 			transfer=GetHydrologyPVectorTransfer(basalelement,gauss,sed_head_input,epl_head_input,thick_input,base_input);
+-			scalar = Jdet*gauss->weight*((water_head*epl_specificstoring*epl_thickness)+(transfer));
++			scalar = Jdet*gauss->weight*((water_head*epl_specificstoring*epl_thickness)+(dt*transfer));
+ 			for(int i=0;i<numnodes;i++)pe->values[i]+=scalar*basis[i];
+ 		}
+ 	}
+@@ -537,7 +538,7 @@
+ 		
+ 		switch(domaintype){
+ 		case Domain2DhorizontalEnum:
+-			if(!element->IsOnBase()) return;			
++			if(!element->IsOnBase()) return;	
+ 			B = element->GetMaterialParameter(MaterialsRheologyBbarEnum);
+ 			break;
+ 		case Domain3DEnum:
+@@ -596,7 +597,8 @@
+ 				EPLgrad2 = (epl_slopeX[i]*epl_slopeX[i])+(epl_slopeY[i]*epl_slopeY[i]);
+ 				
+ 				/*And proceed to the real thing*/
+-				thickness[i] = old_thickness[i]*(1+((rho_water*gravity*dt)/(rho_ice*latentheat))*epl_conductivity*EPLgrad2-2.0*(A*dt/(pow(n,n)))*(pow(EPL_N,n)));
++				thickness[i] = old_thickness[i]*(1.0+((rho_water*gravity*dt)/(rho_ice*latentheat))*epl_conductivity*EPLgrad2-
++																				 (2.0*(A*dt/(pow(n,n)))*(pow(EPL_N,n))));
+ 				
+ 				/*Take care of otherthikening*/
+ 				if(thickness[i]>max_thick){
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 19031)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 19032)
+@@ -250,7 +250,7 @@
+ 				if(active_element){
+ 					transfer=GetHydrologyKMatrixTransfer(basalelement,gauss,sed_head_input,epl_head_input,thick_input,base_input);
+ 					basalelement->NodalFunctions(&basis[0],gauss);
+-					D_scalar=transfer*gauss->weight*Jdet;
++					D_scalar=dt*transfer*gauss->weight*Jdet;
+ 					TripleMultiply(basis,numnodes,1,0,
+ 												 &D_scalar,1,1,0,
+ 												 basis,1,numnodes,0,
+@@ -352,7 +352,7 @@
+ 				else{
+ 					transfer=0.0;
+ 				}
+-				scalar = Jdet*gauss->weight*((water_head*sediment_storing)+(transfer));
++				scalar = Jdet*gauss->weight*((water_head*sediment_storing)+(dt*transfer));
+ 				for(int i=0;i<numnodes;i++)pe->values[i]+=scalar*basis[i];
+ 			}
+ 			else{
Index: /issm/oecreview/Archive/18296-19100/ISSM-19032-19033.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19032-19033.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19032-19033.diff	(revision 19102)
@@ -0,0 +1,393 @@
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 19032)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 19033)
+@@ -67,6 +67,10 @@
+ 				iomodel->FetchDataToInput(elements,CalvingpiCoeffEnum);
+ 				iomodel->FetchDataToInput(elements,CalvingpiMeltingrateEnum);
+ 				break;
++			case CalvingDevEnum:
++				iomodel->FetchDataToInput(elements,CalvingpiCoeffEnum);
++				iomodel->FetchDataToInput(elements,CalvingMeltingrateEnum);
++				break;
+ 			default:
+ 				_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
+ 		}
+@@ -173,18 +177,19 @@
+ 	Input* meltingrate_input  = NULL;
+ 
+ 	/*Load velocities*/
+-	if(domaintype==Domain2DhorizontalEnum){
+-		vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input);
+-		vy_input=basalelement->GetInput(VyEnum); _assert_(vy_input);
+-	}
+-	else{
+-		if(dim==1){
++	switch(domaintype){
++		case Domain2DverticalEnum:
+ 			vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input);
+-		}
+-		if(dim==2){
++			break;
++		case Domain2DhorizontalEnum:
++			vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input);
++			vy_input=basalelement->GetInput(VyEnum); _assert_(vy_input);
++			break;
++		case Domain3DEnum:
+ 			vx_input=basalelement->GetInput(VxAverageEnum); _assert_(vx_input);
+ 			vy_input=basalelement->GetInput(VyAverageEnum); _assert_(vy_input);
+-		}
++			break;
++		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+ 	}
+ 
+ 	/*Load calving inputs*/
+@@ -197,37 +202,56 @@
+ 				meltingrate_input = basalelement->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
+ 				break;
+ 			case CalvingLevermannEnum:
+-				if(domaintype==Domain2DhorizontalEnum){
+-					calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
+-					calvingratey_input=basalelement->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
+-				}
+-				else{
+-					if(dim==1){
++				switch(domaintype){
++					case Domain2DverticalEnum:
+ 						calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
+-					}
+-					if(dim==2){
++						break;
++					case Domain2DhorizontalEnum:
++						calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
++						calvingratey_input=basalelement->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
++						break;
++					case Domain3DEnum:
+ 						calvingratex_input=basalelement->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
+ 						calvingratey_input=basalelement->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
+-					}
++						break;
++					default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+ 				}
+ 				meltingrate_input = basalelement->GetInput(CalvinglevermannMeltingrateEnum);     _assert_(meltingrate_input);
+ 				break;
+ 			case CalvingPiEnum:
+-				if(domaintype==Domain2DhorizontalEnum){
+-					calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
+-					calvingratey_input=basalelement->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
+-				}
+-				else{
+-					if(dim==1){
++				switch(domaintype){
++					case Domain2DverticalEnum:
+ 						calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
+-					}
+-					if(dim==2){
++						break;
++					case Domain2DhorizontalEnum:
++						calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
++						calvingratey_input=basalelement->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
++						break;
++					case Domain3DEnum:
+ 						calvingratex_input=basalelement->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
+ 						calvingratey_input=basalelement->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
+-					}
++						break;
++					default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+ 				}
+ 				meltingrate_input = basalelement->GetInput(CalvingpiMeltingrateEnum);     _assert_(meltingrate_input);
+ 				break;
++			case CalvingDevEnum:
++				switch(domaintype){
++					case Domain2DverticalEnum:
++						calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
++						break;
++					case Domain2DhorizontalEnum:
++						calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input);
++						calvingratey_input=basalelement->GetInput(CalvingrateyEnum); _assert_(calvingratey_input);
++						break;
++					case Domain3DEnum:
++						calvingratex_input=basalelement->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input);
++						calvingratey_input=basalelement->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input);
++						break;
++					default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
++				}
++				meltingrate_input = basalelement->GetInput(CalvingMeltingrateEnum);     _assert_(meltingrate_input);
++				break;
+ 			default:
+ 				_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
+ 		}
+@@ -254,7 +278,7 @@
+ 		/* Advection */
+ 		GetB(B,basalelement,xyz_list,gauss); 
+ 		GetBprime(Bprime,basalelement,xyz_list,gauss); 
+-		vx_input->GetInputValue(&v[0],gauss); // in 3D case, add mesh velocity 
++		vx_input->GetInputValue(&v[0],gauss);
+ 		vy_input->GetInputValue(&v[1],gauss); 
+ 
+ 		/*Get calving speed*/
+@@ -272,43 +296,26 @@
+ 
+ 					if(norm_dlsf>1.e-10)
+ 					 for(i=0;i<dim;i++){ 
+-					  c[i]=calvingrate*dlsf[i]/norm_dlsf;
+-					  m[i]=meltingrate*dlsf[i]/norm_dlsf;
++					  c[i]=calvingrate*dlsf[i]/norm_dlsf; m[i]=meltingrate*dlsf[i]/norm_dlsf;
+ 					 }
+ 					else
+ 					 for(i=0;i<dim;i++){
+-						 c[i]=0.;
+-						 m[i]=0.;
++						 c[i]=0.; m[i]=0.;
+ 					 }
+-
+ 					break;
+ 
+ 				case CalvingLevermannEnum:
+-					calvingratex_input->GetInputValue(&c[0],gauss); // in 3D case, add mesh velocity 
++				case CalvingPiEnum:
++				case CalvingDevEnum:
++					calvingratex_input->GetInputValue(&c[0],gauss);
+ 					if(dim==2) calvingratey_input->GetInputValue(&c[1],gauss);
+ 					meltingrate_input->GetInputValue(&meltingrate,gauss);
+-
+ 					norm_calving=0.;
+ 					for(i=0;i<dim;i++) norm_calving+=pow(c[i],2);
+ 					norm_calving=sqrt(norm_calving)+1.e-14;
+-
+ 					for(i=0;i<dim;i++) m[i]=meltingrate*c[i]/norm_calving;
+-					
+ 					break;
+ 
+-				case CalvingPiEnum:
+-					calvingratex_input->GetInputValue(&c[0],gauss); // in 3D case, add mesh velocity
+-					if(dim==2) calvingratey_input->GetInputValue(&c[1],gauss);
+-					meltingrate_input->GetInputValue(&meltingrate,gauss);
+-
+-					norm_calving=0.;
+-					for(i=0;i<dim;i++) norm_calving+=c[i]*c[i];
+-					norm_calving=sqrt(norm_calving)+1.e-14;
+-
+-					for(i=0;i<dim;i++) m[i]=meltingrate*c[i]/norm_calving;
+-
+-					break;
+-
+ 				default:
+ 					_error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
+ 			}
+Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 19032)
++++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 19033)
+@@ -1567,7 +1567,7 @@
+ 		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+ 		element->NodalFunctions(basis, gauss);
+ 
+-		thickness_input->GetInputValue(&thickness,gauss);
++		thickness_input->GetInputValue(&thickness,gauss); _assert_(thickness>0);
+ 		surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss);
+ 
+ 		for(int i=0;i<numnodes;i++){
+Index: ../trunk-jpl/src/c/cores/transient_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/transient_core.cpp	(revision 19032)
++++ ../trunk-jpl/src/c/cores/transient_core.cpp	(revision 19033)
+@@ -102,19 +102,31 @@
+ 		}
+ 
+ 		if(islevelset){
+-			if(iscalving && calvinglaw==CalvingLevermannEnum){
+-				if(VerboseSolution()) _printf0_("   computing calving rate\n");
+-				femmodel->StrainRateparallelx();
+-				femmodel->StrainRateperpendicularx();
+-				femmodel->CalvingRateLevermannx();
++			if(iscalving){
++				switch(calvinglaw){
++					case DefaultCalvingEnum:
++						break;
++					case CalvingLevermannEnum:
++						if(VerboseSolution()) _printf0_("   computing Levermann's calving rate\n");
++						femmodel->StrainRateparallelx();
++						femmodel->StrainRateperpendicularx();
++						femmodel->CalvingRateLevermannx();
++						break;
++					case CalvingPiEnum:
++						if(VerboseSolution()) _printf0_("   computing Pi's calving rate\n");
++						femmodel->StrainRateparallelx();
++						femmodel->DeviatoricStressx();
++						femmodel->CalvingRatePix();
++						break;
++					case CalvingDevEnum:
++						femmodel->CalvingRateDevx();
++						femmodel->ElementOperationx(&Element::CalvingRateDev);
++						break;
++					default:
++						_error_("Caving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
++				}
+ 			}
+-			if(iscalving && calvinglaw==CalvingPiEnum){
+-				if(VerboseSolution()) _printf0_("   computing calving rate\n");
+-				femmodel->StrainRateparallelx();
+-				femmodel->DeviatoricStressx();
+-				femmodel->CalvingRatePix();
+-			}
+-			if(VerboseSolution()) _printf0_("   computing movement of ice boundaries\n");
++			if(VerboseSolution()) _printf0_("   computing levelset transport\n");
+ 			/* smoothen slope of lsf for computation of normal on ice domain*/
+ 			levelsetfunctionslope_core(femmodel);
+ 
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 19032)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 19033)
+@@ -671,6 +671,15 @@
+ 
+ }
+ /*}}}*/
++void FemModel::ElementOperationx(void (Element::*function)(void)){ /*{{{*/
++
++	for(int i=0;i<elements->Size();i++){
++		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		(element->*function)();
++	}
++
++}
++/*}}}*/
+ void FemModel::Responsex(IssmDouble* responses,const char* response_descriptor){/*{{{*/
+ 
+ 	int response_descriptor_enum=StringToEnumx(response_descriptor);
+@@ -1742,6 +1751,14 @@
+ 	}
+ }
+ /*}}}*/
++void FemModel::CalvingRateDevx(){/*{{{*/
++
++	for(int i=0;i<elements->Size();i++){
++		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
++		element->CalvingRateDev();
++	}
++}
++/*}}}*/
+ void FemModel::StrainRateparallelx(){/*{{{*/
+ 
+ 	for(int i=0;i<elements->Size();i++){
+Index: ../trunk-jpl/src/c/classes/Elements/Element.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 19032)
++++ ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 19033)
+@@ -170,6 +170,7 @@
+ 		virtual void       AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part)=0;
+ 		virtual void	    CalvingRateLevermann(void)=0;
+ 		virtual void       CalvingRatePi(void)=0;
++		virtual void       CalvingRateDev(void){_error_("not implemented yet");};
+ 		virtual IssmDouble CharacteristicLength(void)=0;
+ 		virtual void       ComputeBasalStress(Vector<IssmDouble>* sigma_b)=0;
+ 		virtual void       ComputeDeviatoricStressTensor(void)=0;
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 19032)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 19033)
+@@ -327,6 +327,63 @@
+ 
+ }
+ /*}}}*/
++void       Tria::CalvingRateDev(){/*{{{*/
++
++	IssmDouble  xyz_list[NUMVERTICES][3];
++	IssmDouble  epsilon[3]; /* epsilon=[exx,eyy,exy];*/
++	IssmDouble  calvingratex[NUMVERTICES];
++	IssmDouble  calvingratey[NUMVERTICES];
++	IssmDouble  calvingrate[NUMVERTICES];
++	IssmDouble  lambda1,lambda2,ex,ey,vx,vy,vel;
++
++	/* Get node coordinates and dof list: */
++	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
++
++	/*Retrieve all inputs and parameters we will need*/
++	Input* vx_input=inputs->GetInput(VxEnum);        _assert_(vx_input);
++	Input* vy_input=inputs->GetInput(VyEnum);        _assert_(vy_input);
++
++	/* Start looping on the number of vertices: */
++	GaussTria* gauss=new GaussTria();
++	for(int iv=0;iv<NUMVERTICES;iv++){
++		gauss->GaussVertex(iv);
++
++		/*Get velocity components and thickness*/
++		vx_input->GetInputValue(&vx,gauss);
++		vy_input->GetInputValue(&vy,gauss);
++		vel=sqrt(vx*vx+vy*vy)+1.e-14;
++
++		/*Compute strain rate and viscosity: */
++		this->StrainRateSSA(&epsilon[0],&xyz_list[0][0],gauss,vx_input,vy_input);
++
++		/*Get Eigen values*/
++		Matrix2x2Eigen(&lambda1,&lambda2,&ex,&ey,epsilon[0],epsilon[2],epsilon[1]);
++
++		/*Process Eigen values*/
++		lambda1>0? lambda1 = pow(lambda1,.3) : lambda1=0.;
++		lambda2>0? lambda2 = pow(lambda2,.3) : lambda2=0.;
++		lambda1 = lambda1*5.e-2;
++		lambda2 = lambda2*5.e-2;
++		_assert_(!xIsNan<IssmDouble>(lambda1));
++		_assert_(!xIsNan<IssmDouble>(lambda2));
++
++		/*Assign values*/
++		//calvingratex[iv]=ex*lambda1 - ey*lambda2;
++		//calvingratey[iv]=ey*lambda1 + ex*lambda2;
++		calvingratex[iv]=vx/vel*(lambda1 + lambda2);
++		calvingratey[iv]=vy/vel*(lambda1 + lambda2);
++		calvingrate[iv]=sqrt(calvingratex[iv]*calvingratex[iv] + calvingratey[iv]*calvingratey[iv]);
++	}
++
++	/*Add input*/
++	this->inputs->AddInput(new TriaInput(CalvingratexEnum,&calvingratex[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(CalvingrateyEnum,&calvingratey[0],P1Enum));
++	this->inputs->AddInput(new TriaInput(CalvingCalvingrateEnum,&calvingrate[0],P1Enum));
++
++	/*Clean up and return*/
++	delete gauss;
++}
++/*}}}*/
+ IssmDouble Tria::CharacteristicLength(void){/*{{{*/
+ 
+ 	return sqrt(2*this->GetArea());
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 19032)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 19033)
+@@ -51,13 +51,14 @@
+ 		/*Element virtual functions definitions: {{{*/
+ 		void        AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part);
+ 		void			CalvingRateLevermann();
++		void			CalvingRatePi();
++		void			CalvingRateDev();
+ 		IssmDouble  CharacteristicLength(void);
+ 		void        ComputeBasalStress(Vector<IssmDouble>* sigma_b);
+ 		void        ComputeDeviatoricStressTensor();
+ 		void        ComputeSigmaNN();
+ 		void        ComputeStressTensor();
+ 		void        ComputeSurfaceNormalVelocity();
+-		void			CalvingRatePi();
+ 		void        Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters);
+ 		void        ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index);
+ 		void        ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum);
+Index: ../trunk-jpl/src/c/classes/FemModel.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.h	(revision 19032)
++++ ../trunk-jpl/src/c/classes/FemModel.h	(revision 19033)
+@@ -61,6 +61,7 @@
+ 		void SetCurrentConfiguration(int configuration_type,int analysis_type);
+ 
+ 		/*Modules*/ 
++		void ElementOperationx(void (Element::*function)(void));
+ 		void GetInputLocalMinMaxOnNodesx(IssmDouble** pmin,IssmDouble** pmax,IssmDouble* ug);
+ 		void MassFluxx(IssmDouble* presponse);
+ 		void MaxAbsVxx(IssmDouble* presponse);
+@@ -87,6 +88,7 @@
+ 		void DeviatoricStressx();
+ 		void CalvingRateLevermannx();
+ 		void CalvingRatePix();
++		void CalvingRateDevx();
+ 		#ifdef  _HAVE_DAKOTA_
+ 		void DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses);
+ 		#endif
Index: /issm/oecreview/Archive/18296-19100/ISSM-19033-19034.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19033-19034.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19033-19034.diff	(revision 19102)
@@ -0,0 +1,67 @@
+Index: ../trunk-jpl/src/m/classes/calvingdev.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvingdev.m	(revision 0)
++++ ../trunk-jpl/src/m/classes/calvingdev.m	(revision 19034)
+@@ -0,0 +1,62 @@
++%CALVINGDEV class definition
++%
++%   Usage:
++%      calvingdev=calvingdev();
++
++classdef calvingdev
++	properties (SetAccess=public) 
++		stabilization = 0;
++		coeff         = NaN;
++		meltingrate   = NaN;
++	end
++	methods
++		function obj = calvingdev(varargin) % {{{
++			switch nargin
++				case 0
++					obj=setdefaultparameters(obj);
++				case 1
++					inputstruct=varargin{1};
++					list1 = properties('calvingdev');
++					list2 = fieldnames(inputstruct);
++					for i=1:length(list1)
++						fieldname = list1{i};
++						if ismember(fieldname,list2),
++							obj.(fieldname) = inputstruct.(fieldname);
++						end
++					end
++				otherwise
++					error('constructor not supported');
++			end
++		end % }}}
++		function obj = setdefaultparameters(obj) % {{{
++
++			%stabilization = 2 by default
++			obj.stabilization = 2;
++
++			%Proportionality coefficient in Pi model
++			obj.coeff=2e13;
++		end % }}}
++		function md = checkconsistency(obj,md,solution,analyses) % {{{
++			%Early return
++			if (solution~=TransientSolutionEnum() | md.transient.iscalving==0), return; end
++
++			md = checkfield(md,'fieldname','calving.stabilization','values',[0 1 2]);
++			md = checkfield(md,'fieldname','calving.coeff','>',0,'size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','calving.meltingrate','NaN',1,'size',[md.mesh.numberofvertices 1],'>=',0);
++		end % }}}
++		function disp(obj) % {{{
++			disp(sprintf('   Calving Pi parameters:'));
++			fielddisplay(obj,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding');
++			fielddisplay(obj,'coeff','proportionality coefficient in Pi model');
++			fielddisplay(obj,'meltingrate','melting rate at given location [m/a]');
++
++		end % }}}
++		function marshall(obj,md,fid) % {{{
++			yts=365.0*24.0*3600.0;
++			WriteData(fid,'enum',CalvingLawEnum(),'data',CalvingDevEnum(),'format','Integer');
++			WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',obj.stabilization,'format','Integer');
++			WriteData(fid,'enum',CalvingpiCoeffEnum(),'data',obj.coeff,'format','DoubleMat','mattype',1);
++			WriteData(fid,'class','calving','object',obj,'fieldname','meltingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts);
++		end % }}}
++	end
++end
Index: /issm/oecreview/Archive/18296-19100/ISSM-19034-19035.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19034-19035.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19034-19035.diff	(revision 19102)
@@ -0,0 +1,208 @@
+Index: ../trunk-jpl/src/m/plot/writejsfile.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/writejsfile.py	(revision 0)
++++ ../trunk-jpl/src/m/plot/writejsfile.py	(revision 19035)
+@@ -0,0 +1,57 @@
++def writejsfile(filename,model,keyname)
++#WRITEJSFILE - write model file to javascript database
++#
++#   Usage:
++#      writejsfile(filename,model,keyname)
++#
++
++	nods=length(model.x);
++	nel=size(model.index,1);
++	nx=length(model.contourx1);
++	
++	fid=open(filename,'w');
++
++	fid.write('model = {};\n');
++	fid.write('model["title"]="{0}";\n'.format(model.title);
++	fid.write('model["initialZoomFactor"]={0};\n'.format(model.initialZoomFactor);
++	
++	#write index:
++	fid.write('<!-- model["index"]{{{-->\n');
++	fid.write('model["index"]=[');
++	for i=1:nel-1,
++		fid.write('[{0}, {1}, {2}],'.format(model.index(i,1),model.index(i,2),model.index(i,3));
++	end
++	fid.write('[{0}, {1}, {2}]];\n'.format(model.index(end,1),model.index(end,2),model.index(end,3));
++	fid.write('<!--}}}-->\n');
++	
++	writejsfield(fid,'model["x"]',model.x,nods);
++	writejsfield(fid,'model["y"]',model.y,nods);
++	writejsfield(fid,'model["z"]',model.z,nods);
++	writejsfield(fid,'model["surface"]',model.surface,nods);
++	writejsfield(fid,'model["contourx1"]',model.contourx1,nx);
++	writejsfield(fid,'model["contoury1"]',model.contoury1,nx);
++	writejsfield(fid,'model["contourz1"]',model.contourz1,nx);
++	writejsfield(fid,'model["contourx2"]',model.contourx2,nx);
++	writejsfield(fid,'model["contoury2"]',model.contoury2,nx);
++	writejsfield(fid,'model["contourz2"]',model.contourz2,nx);
++
++
++	results=model.results;
++	fid.write('results={};\n');
++
++	for i=1:length(results):
++		fid.write('result={};\n');
++		writejsfield(fid,'result["data"]',results(i).data,nods);
++		fid.write('<!--{{{-->\n');
++		fid.write('result["caxis"]=[{0},{1}];\n'.format(results(i).caxis(1),results(i).caxis(2));
++		fid.write('result["label"]="{0}";\n'.format(results(i).label);
++		fid.write('result["shortlabel"]="{0}";\n'.format(results(i).shortlabel);
++		fid.write('result["unit"]="{0}";\n'.format(results(i).unit);
++		if size(results(i).data,2)>1:
++			fid.write('result["time_range"]=[{0},{1}];\n'.format(results(i).time_range(1),results(i).time_range(2));
++		fid.write('results["{0}"]=result;\n'.format(i);
++		fid.write('<!--}}}-->\n');
++	fid.write('model.results=results;\n');
++	fid.write('models["{0}"]=model;\n'.format(keyname);
++
++	fid.close();
+Index: ../trunk-jpl/src/m/plot/writejsfield.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/writejsfield.py	(revision 0)
++++ ../trunk-jpl/src/m/plot/writejsfield.py	(revision 19035)
+@@ -0,0 +1,24 @@
++def writejsfield(fid,name,variable,nods)
++#WRITEJSFIELD - write variable to javascript file 
++#
++#   Usage:
++#      writejsfield(fid,name,variable)
++#
++	#write array:
++	if len(variable[2])==1:
++		fid.write('<!-- {0}{{{-->\n'.format(name));
++		fid.write('{0}=['.format(name));
++		for i in xrange(1, nods-1):
++			fid.write('{0},',variable[i]);
++		fid.write('{0}];\n',variable[-1]);
++		fid.write('<!--}}}-->\n');
++	else:
++		#multi-sized array: 
++		fid.write('<!-- {0}{{{-->\n'.format(name));
++		fid.write('{0}=[]\n'.format(name));
++		for i in xrange(1, len(variable[2])):
++			fid.write('{0}["{1}"]=['.format(name,i));
++			for j in xrange(1, nods-1):
++				fid.write('{0},'.format(variable[j,i]));
++			fid.write('{0}];\n'.format(variable[-1,i]));
++		fid.write('<!--}}}-->\n');
+Index: ../trunk-jpl/src/m/plot/export_gl.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/export_gl.py	(revision 0)
++++ ../trunk-jpl/src/m/plot/export_gl.py	(revision 19035)
+@@ -0,0 +1,112 @@
++def export_gl(md,varargin)
++
++	templist=plotoptions(varargin{:}); 
++	optionslist=templist.list;
++	options=optionslist{1};
++	options=checkplotoptions(md,options);
++
++	#Setup unique directory in present dir: 
++	directory=getfieldvalue(options,'directory','./');
++	databasename=getfieldvalue(options,'database','webgl');
++
++	#scaling factor: 
++	scaling_factor=getfieldvalue(options,'scaling_factor',50);
++
++	#Deal with title: 
++	if exist(options,'title')
++		title=getfieldvalue(options,'title');
++	else
++		title='';
++	end
++
++	#initialize model: 
++	model.title=title;
++	model.initialZoomFactor=getfieldvalue(options,'zoom',-.25);
++
++	#Deal with contour {{{
++
++	contour_lat1=md.mesh.lat(md.mesh.segments(:,1));
++	contour_lat2=md.mesh.lat(md.mesh.segments(:,2));
++	contour_long1=md.mesh.long(md.mesh.segments(:,1));
++	contour_long2=md.mesh.long(md.mesh.segments(:,2));
++	contour_surface1=md.geometry.surface(md.mesh.segments(:,1));
++	contour_surface2=md.geometry.surface(md.mesh.segments(:,2));
++
++	R1=6371000*ones(length(contour_surface1),1)+scaling_factor*contour_surface1;
++	R2=6371000*ones(length(contour_surface2),1)+scaling_factor*contour_surface2;
++
++	contourx1 = R1 .* cosd(contour_lat1) .* cosd(contour_long1);
++	contoury1 = R1 .* cosd(contour_lat1) .* sind(contour_long1);
++	contourz1 = R1 .* sind(contour_lat1);
++	
++	contourx2 = R2 .* cosd(contour_lat2) .* cosd(contour_long2);
++	contoury2 = R2 .* cosd(contour_lat2) .* sind(contour_long2);
++	contourz2 = R2 .* sind(contour_lat2);
++
++
++	model.contourx1=contourx1;
++	model.contoury1=contoury1;
++	model.contourz1=contourz1;
++	model.contourx2=contourx2;
++	model.contoury2=contoury2;
++	model.contourz2=contourz2;
++
++
++	#}}}
++#Deal with mesh and results {{{
++	
++	
++	lat=md.mesh.lat;
++	long=md.mesh.long;
++	surface=md.geometry.surface;
++	numberofelements=md.mesh.numberofelements;
++	numberofvertices=md.mesh.numberofvertices;
++
++	R=6371000*ones(numberofvertices,1)+scaling_factor*surface;
++
++	x = R .* cosd(lat) .* cosd(long);
++	y = R .* cosd(lat) .* sind(long);
++	z = R .* sind(lat);
++
++
++	#Deal with triangulation: 
++	model.index=md.mesh.elements;
++	model.x=x;
++	model.y=y;
++	model.z=z;
++	model.surface=surface;
++	
++	#Deal with data: 
++	results=struct([]);
++	for i=1:length(optionslist),
++		options=optionslist{i}; options=checkplotoptions(md,options);
++		data=getfieldvalue(options,'data');
++		results(i).data=data;
++		results(i).caxis=getfieldvalue(options,'caxis',[min(data(:)) max(data(:))]);
++
++		label=getfieldvalue(options,'label','');
++		if strcmpi(label,''),
++			#create generic label: 
++			label=['data' num2str(i)];
++		results(i).label=label;
++
++		shortlabel=getfieldvalue(options,'shortlabel','');
++		if strcmpi(shortlabel,''),
++			#create generic short label: 
++			shortlabel=['data' num2str(i)];
++		results(i).shortlabel=shortlabel;
++		
++		if size(data,2)>1,
++			time_range=getfieldvalue(options,'time_range',[0 100]);
++			results(i).time_range=time_range;
++
++		unit=getfieldvalue(options,'unit','');
++		if strcmpi(unit,''),
++			#create generic unit: 
++			unit='SI';
++		results(i).unit=unit;
++	model.results=results;
++	
++	#Write model to javascript database file: 
++	writejsfile([directory databasename '.js'],model,databasename);
++#}}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-19035-19036.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19035-19036.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19035-19036.diff	(revision 19102)
@@ -0,0 +1,224 @@
+Index: ../trunk-jpl/src/m/plot/writejsfile.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/writejsfile.py	(revision 19035)
++++ ../trunk-jpl/src/m/plot/writejsfile.py	(revision 19036)
+@@ -5,53 +5,52 @@
+ #      writejsfile(filename,model,keyname)
+ #
+ 
+-	nods=length(model.x);
+-	nel=size(model.index,1);
+-	nx=length(model.contourx1);
++	nods=len(model.x)
++	nel=len(model.index[1])
++	nx=len(model.contourx1)
+ 	
+-	fid=open(filename,'w');
++	fid=open(filename,'w')
+ 
+-	fid.write('model = {};\n');
+-	fid.write('model["title"]="{0}";\n'.format(model.title);
+-	fid.write('model["initialZoomFactor"]={0};\n'.format(model.initialZoomFactor);
++	fid.write('model = {};\n')
++	fid.write('model["title"]="{0}";\n'.format(model.title)
++	fid.write('model["initialZoomFactor"]={0};\n'.format(model.initialZoomFactor)
+ 	
+ 	#write index:
+-	fid.write('<!-- model["index"]{{{-->\n');
+-	fid.write('model["index"]=[');
+-	for i=1:nel-1,
+-		fid.write('[{0}, {1}, {2}],'.format(model.index(i,1),model.index(i,2),model.index(i,3));
+-	end
+-	fid.write('[{0}, {1}, {2}]];\n'.format(model.index(end,1),model.index(end,2),model.index(end,3));
+-	fid.write('<!--}}}-->\n');
++	fid.write('<!-- model["index"]{{{-->\n')
++	fid.write('model["index"]=[')
++	for i in xrange(1,nel-1):
++		fid.write('[{0}, {1}, {2}],'.model.index[i][1],model.index[i][2],model.index[i][3])
++	fid.write('[{0}, {1}, {2}]];\n'.format(model.index[-1][1],model.index[-1][2],model.index[-1][3])
++	fid.write('<!--}}}-->\n')
+ 	
+-	writejsfield(fid,'model["x"]',model.x,nods);
+-	writejsfield(fid,'model["y"]',model.y,nods);
+-	writejsfield(fid,'model["z"]',model.z,nods);
+-	writejsfield(fid,'model["surface"]',model.surface,nods);
+-	writejsfield(fid,'model["contourx1"]',model.contourx1,nx);
+-	writejsfield(fid,'model["contoury1"]',model.contoury1,nx);
+-	writejsfield(fid,'model["contourz1"]',model.contourz1,nx);
+-	writejsfield(fid,'model["contourx2"]',model.contourx2,nx);
+-	writejsfield(fid,'model["contoury2"]',model.contoury2,nx);
+-	writejsfield(fid,'model["contourz2"]',model.contourz2,nx);
++	writejsfield(fid,'model["x"]',model.x,nods)
++	writejsfield(fid,'model["y"]',model.y,nods)
++	writejsfield(fid,'model["z"]',model.z,nods)
++	writejsfield(fid,'model["surface"]',model.surface,nods)
++	writejsfield(fid,'model["contourx1"]',model.contourx1,nx)
++	writejsfield(fid,'model["contoury1"]',model.contoury1,nx)
++	writejsfield(fid,'model["contourz1"]',model.contourz1,nx)
++	writejsfield(fid,'model["contourx2"]',model.contourx2,nx)
++	writejsfield(fid,'model["contoury2"]',model.contoury2,nx)
++	writejsfield(fid,'model["contourz2"]',model.contourz2,nx)
+ 
+ 
+-	results=model.results;
+-	fid.write('results={};\n');
++	results=model.results
++	fid.write('results={};\n')
+ 
+-	for i=1:length(results):
+-		fid.write('result={};\n');
+-		writejsfield(fid,'result["data"]',results(i).data,nods);
+-		fid.write('<!--{{{-->\n');
+-		fid.write('result["caxis"]=[{0},{1}];\n'.format(results(i).caxis(1),results(i).caxis(2));
+-		fid.write('result["label"]="{0}";\n'.format(results(i).label);
+-		fid.write('result["shortlabel"]="{0}";\n'.format(results(i).shortlabel);
+-		fid.write('result["unit"]="{0}";\n'.format(results(i).unit);
+-		if size(results(i).data,2)>1:
+-			fid.write('result["time_range"]=[{0},{1}];\n'.format(results(i).time_range(1),results(i).time_range(2));
+-		fid.write('results["{0}"]=result;\n'.format(i);
+-		fid.write('<!--}}}-->\n');
+-	fid.write('model.results=results;\n');
+-	fid.write('models["{0}"]=model;\n'.format(keyname);
++	for i in xrange(1,len(results)):
++		fid.write('result={};\n')
++		writejsfield(fid,'result["data"]',results[i].data,nods)
++		fid.write('<!--{{{-->\n')
++		fid.write('result["caxis"]=[{0},{1}];\n'.format(results[i].caxis[1],results[i].caxis[2])
++		fid.write('result["label"]="{0}";\n'.format(results[i].label)
++		fid.write('result["shortlabel"]="{0}";\n'.format(results[i].shortlabel)
++		fid.write('result["unit"]="{0}";\n'.format(results[i].unit)
++		if len(results[i].data[2])>1:
++			fid.write('result["time_range"]=[{0},{1}];\n'.format(results[i].time_range[1],results[i].time_range[2])
++		fid.write('results["{0}"]=result;\n'.format[i]
++		fid.write('<!--}}}-->\n')
++	fid.write('model.results=results;\n')
++	fid.write('models["{0}"]=model;\n'.format(keyname)
+ 
+-	fid.close();
++	fid.close()
+Index: ../trunk-jpl/src/m/plot/writejsfield.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/writejsfield.py	(revision 19035)
++++ ../trunk-jpl/src/m/plot/writejsfield.py	(revision 19036)
+@@ -6,19 +6,19 @@
+ #
+ 	#write array:
+ 	if len(variable[2])==1:
+-		fid.write('<!-- {0}{{{-->\n'.format(name));
+-		fid.write('{0}=['.format(name));
++		fid.write('<!-- {0}{{{-->\n'.format(name))
++		fid.write('{0}=['.format(name))
+ 		for i in xrange(1, nods-1):
+-			fid.write('{0},',variable[i]);
+-		fid.write('{0}];\n',variable[-1]);
+-		fid.write('<!--}}}-->\n');
++			fid.write('{0},',variable[i])
++		fid.write('{0}];\n',variable[-1])
++		fid.write('<!--}}}-->\n')
+ 	else:
+ 		#multi-sized array: 
+-		fid.write('<!-- {0}{{{-->\n'.format(name));
+-		fid.write('{0}=[]\n'.format(name));
++		fid.write('<!-- {0}{{{-->\n'.format(name))
++		fid.write('{0}=[]\n'.format(name))
+ 		for i in xrange(1, len(variable[2])):
+-			fid.write('{0}["{1}"]=['.format(name,i));
++			fid.write('{0}["{1}"]=['.format(name,i))
+ 			for j in xrange(1, nods-1):
+-				fid.write('{0},'.format(variable[j,i]));
+-			fid.write('{0}];\n'.format(variable[-1,i]));
+-		fid.write('<!--}}}-->\n');
++				fid.write('{0},'.format(variable[j,i]))
++			fid.write('{0}];\n'.format(variable[-1,i]))
++		fid.write('<!--}}}-->\n')
+Index: ../trunk-jpl/src/m/plot/export_gl.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/export_gl.py	(revision 19035)
++++ ../trunk-jpl/src/m/plot/export_gl.py	(revision 19036)
+@@ -1,8 +1,8 @@
+ def export_gl(md,varargin)
+ 
+-	templist=plotoptions(varargin{:}); 
++	templist=plotoptions(varargin[:]); 
+ 	optionslist=templist.list;
+-	options=optionslist{1};
++	options=optionslist[1];
+ 	options=checkplotoptions(md,options);
+ 
+ 	#Setup unique directory in present dir: 
+@@ -13,11 +13,10 @@
+ 	scaling_factor=getfieldvalue(options,'scaling_factor',50);
+ 
+ 	#Deal with title: 
+-	if exist(options,'title')
++	if options['title']:
+ 		title=getfieldvalue(options,'title');
+-	else
++	else:
+ 		title='';
+-	end
+ 
+ 	#initialize model: 
+ 	model.title=title;
+@@ -25,15 +24,15 @@
+ 
+ 	#Deal with contour {{{
+ 
+-	contour_lat1=md.mesh.lat(md.mesh.segments(:,1));
++	contour_lat1=md.mesh.lat(md.mesh.segments(	:,1));
+ 	contour_lat2=md.mesh.lat(md.mesh.segments(:,2));
+ 	contour_long1=md.mesh.long(md.mesh.segments(:,1));
+ 	contour_long2=md.mesh.long(md.mesh.segments(:,2));
+ 	contour_surface1=md.geometry.surface(md.mesh.segments(:,1));
+ 	contour_surface2=md.geometry.surface(md.mesh.segments(:,2));
+ 
+-	R1=6371000*ones(length(contour_surface1),1)+scaling_factor*contour_surface1;
+-	R2=6371000*ones(length(contour_surface2),1)+scaling_factor*contour_surface2;
++	R1=6371000*ones(len(contour_surface1),1)+scaling_factor*contour_surface1;
++	R2=6371000*ones(len(contour_surface2),1)+scaling_factor*contour_surface2;
+ 
+ 	contourx1 = R1 .* cosd(contour_lat1) .* cosd(contour_long1);
+ 	contoury1 = R1 .* cosd(contour_lat1) .* sind(contour_long1);
+@@ -78,33 +77,34 @@
+ 	
+ 	#Deal with data: 
+ 	results=struct([]);
+-	for i=1:length(optionslist),
+-		options=optionslist{i}; options=checkplotoptions(md,options);
++	for i in xrange(1,len(optionslist)),
++		options=optionslist[i]; 
++		options=checkplotoptions(md,options);
+ 		data=getfieldvalue(options,'data');
+-		results(i).data=data;
+-		results(i).caxis=getfieldvalue(options,'caxis',[min(data(:)) max(data(:))]);
++		results[i].data=data;
++		results[i].caxis=getfieldvalue(options,'caxis',[min(data) max(data)]);
+ 
+ 		label=getfieldvalue(options,'label','');
+ 		if strcmpi(label,''),
+ 			#create generic label: 
+ 			label=['data' num2str(i)];
+-		results(i).label=label;
++		results[i].label=label;
+ 
+ 		shortlabel=getfieldvalue(options,'shortlabel','');
+ 		if strcmpi(shortlabel,''),
+ 			#create generic short label: 
+ 			shortlabel=['data' num2str(i)];
+-		results(i).shortlabel=shortlabel;
++		results[i].shortlabel=shortlabel;
+ 		
+ 		if size(data,2)>1,
+ 			time_range=getfieldvalue(options,'time_range',[0 100]);
+-			results(i).time_range=time_range;
++			results[i].time_range=time_range;
+ 
+ 		unit=getfieldvalue(options,'unit','');
+ 		if strcmpi(unit,''),
+ 			#create generic unit: 
+ 			unit='SI';
+-		results(i).unit=unit;
++		results[i].unit=unit;
+ 	model.results=results;
+ 	
+ 	#Write model to javascript database file: 
Index: /issm/oecreview/Archive/18296-19100/ISSM-19036-19037.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19036-19037.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19036-19037.diff	(revision 19102)
@@ -0,0 +1,63 @@
+Index: ../trunk-jpl/src/m/plot/writejsfile.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/writejsfile.py	(revision 19036)
++++ ../trunk-jpl/src/m/plot/writejsfile.py	(revision 19037)
+@@ -1,4 +1,4 @@
+-def writejsfile(filename,model,keyname)
++def writejsfile(filename,model,keyname):
+ #WRITEJSFILE - write model file to javascript database
+ #
+ #   Usage:
+@@ -12,15 +12,15 @@
+ 	fid=open(filename,'w')
+ 
+ 	fid.write('model = {};\n')
+-	fid.write('model["title"]="{0}";\n'.format(model.title)
+-	fid.write('model["initialZoomFactor"]={0};\n'.format(model.initialZoomFactor)
++	fid.write('model["title"]="{0}";\n'.format(model.title))
++	fid.write('model["initialZoomFactor"]={0};\n'.format(model.initialZoomFactor))
+ 	
+ 	#write index:
+ 	fid.write('<!-- model["index"]{{{-->\n')
+ 	fid.write('model["index"]=[')
+ 	for i in xrange(1,nel-1):
+-		fid.write('[{0}, {1}, {2}],'.model.index[i][1],model.index[i][2],model.index[i][3])
+-	fid.write('[{0}, {1}, {2}]];\n'.format(model.index[-1][1],model.index[-1][2],model.index[-1][3])
++		fid.write('[{0}, {1}, {2}],'.format(model.index[i][1],model.index[i][2],model.index[i][3]))
++	fid.write('[{0}, {1}, {2}]];\n'.format(model.index[-1][1],model.index[-1][2],model.index[-1][3]))
+ 	fid.write('<!--}}}-->\n')
+ 	
+ 	writejsfield(fid,'model["x"]',model.x,nods)
+@@ -42,15 +42,15 @@
+ 		fid.write('result={};\n')
+ 		writejsfield(fid,'result["data"]',results[i].data,nods)
+ 		fid.write('<!--{{{-->\n')
+-		fid.write('result["caxis"]=[{0},{1}];\n'.format(results[i].caxis[1],results[i].caxis[2])
+-		fid.write('result["label"]="{0}";\n'.format(results[i].label)
+-		fid.write('result["shortlabel"]="{0}";\n'.format(results[i].shortlabel)
+-		fid.write('result["unit"]="{0}";\n'.format(results[i].unit)
++		fid.write('result["caxis"]=[{0},{1}];\n'.format(results[i].caxis[1],results[i].caxis[2]))
++		fid.write('result["label"]="{0}";\n'.format(results[i].label))
++		fid.write('result["shortlabel"]="{0}";\n'.format(results[i].shortlabel))
++		fid.write('result["unit"]="{0}";\n'.format(results[i].unit))
+ 		if len(results[i].data[2])>1:
+-			fid.write('result["time_range"]=[{0},{1}];\n'.format(results[i].time_range[1],results[i].time_range[2])
+-		fid.write('results["{0}"]=result;\n'.format[i]
++			fid.write('result["time_range"]=[{0},{1}];\n'.format(results[i].time_range[1],results[i].time_range[2]))
++		fid.write('results["{0}"]=result;\n'.format(i))
+ 		fid.write('<!--}}}-->\n')
+ 	fid.write('model.results=results;\n')
+-	fid.write('models["{0}"]=model;\n'.format(keyname)
++	fid.write('models["{0}"]=model;\n'.format(keyname))
+ 
+ 	fid.close()
+Index: ../trunk-jpl/src/m/plot/writejsfield.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/writejsfield.py	(revision 19036)
++++ ../trunk-jpl/src/m/plot/writejsfield.py	(revision 19037)
+@@ -1,4 +1,4 @@
+-def writejsfield(fid,name,variable,nods)
++def writejsfield(fid,name,variable,nods):
+ #WRITEJSFIELD - write variable to javascript file 
+ #
+ #   Usage:
Index: /issm/oecreview/Archive/18296-19100/ISSM-19037-19038.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19037-19038.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19037-19038.diff	(revision 19102)
@@ -0,0 +1,89 @@
+Index: ../trunk-jpl/src/m/plot/export_gl.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/export_gl.py	(revision 19037)
++++ ../trunk-jpl/src/m/plot/export_gl.py	(revision 19038)
+@@ -1,4 +1,4 @@
+-def export_gl(md,varargin)
++def export_gl(md,varargin):
+ 
+ 	templist=plotoptions(varargin[:]); 
+ 	optionslist=templist.list;
+@@ -24,7 +24,7 @@
+ 
+ 	#Deal with contour {{{
+ 
+-	contour_lat1=md.mesh.lat(md.mesh.segments(	:,1));
++	contour_lat1=md.mesh.lat(md.mesh.segments(:,1));
+ 	contour_lat2=md.mesh.lat(md.mesh.segments(:,2));
+ 	contour_long1=md.mesh.long(md.mesh.segments(:,1));
+ 	contour_long2=md.mesh.long(md.mesh.segments(:,2));
+@@ -34,13 +34,13 @@
+ 	R1=6371000*ones(len(contour_surface1),1)+scaling_factor*contour_surface1;
+ 	R2=6371000*ones(len(contour_surface2),1)+scaling_factor*contour_surface2;
+ 
+-	contourx1 = R1 .* cosd(contour_lat1) .* cosd(contour_long1);
+-	contoury1 = R1 .* cosd(contour_lat1) .* sind(contour_long1);
+-	contourz1 = R1 .* sind(contour_lat1);
++	contourx1 = R1 * cosd(contour_lat1) * cosd(contour_long1;
++	contoury1 = R1 * cosd(contour_lat1) * sind(contour_long1);
++	contourz1 = R1 * sind(contour_lat1);
+ 	
+-	contourx2 = R2 .* cosd(contour_lat2) .* cosd(contour_long2);
+-	contoury2 = R2 .* cosd(contour_lat2) .* sind(contour_long2);
+-	contourz2 = R2 .* sind(contour_lat2);
++	contourx2 = R2 * cosd(contour_lat2) * cosd(contour_long2);
++	contoury2 = R2 * cosd(contour_lat2) * sind(contour_long2);
++	contourz2 = R2 * sind(contour_lat2);
+ 
+ 
+ 	model.contourx1=contourx1;
+@@ -63,9 +63,9 @@
+ 
+ 	R=6371000*ones(numberofvertices,1)+scaling_factor*surface;
+ 
+-	x = R .* cosd(lat) .* cosd(long);
+-	y = R .* cosd(lat) .* sind(long);
+-	z = R .* sind(lat);
++	x = R * cosd(lat) * cosd(long);
++	y = R * cosd(lat) * sind(long);
++	z = R * sind(lat);
+ 
+ 
+ 	#Deal with triangulation: 
+@@ -77,7 +77,7 @@
+ 	
+ 	#Deal with data: 
+ 	results=struct([]);
+-	for i in xrange(1,len(optionslist)),
++	for i in xrange(1,len(optionslist)):
+ 		options=optionslist[i]; 
+ 		options=checkplotoptions(md,options);
+ 		data=getfieldvalue(options,'data');
+@@ -85,23 +85,23 @@
+ 		results[i].caxis=getfieldvalue(options,'caxis',[min(data) max(data)]);
+ 
+ 		label=getfieldvalue(options,'label','');
+-		if strcmpi(label,''),
++		if strcmpi(label,''):
+ 			#create generic label: 
+ 			label=['data' num2str(i)];
+ 		results[i].label=label;
+ 
+ 		shortlabel=getfieldvalue(options,'shortlabel','');
+-		if strcmpi(shortlabel,''),
++		if strcmpi(shortlabel,''):
+ 			#create generic short label: 
+ 			shortlabel=['data' num2str(i)];
+ 		results[i].shortlabel=shortlabel;
+ 		
+-		if size(data,2)>1,
++		if len(data[2])>1:
+ 			time_range=getfieldvalue(options,'time_range',[0 100]);
+ 			results[i].time_range=time_range;
+ 
+ 		unit=getfieldvalue(options,'unit','');
+-		if strcmpi(unit,''),
++		if strcmpi(unit,''):
+ 			#create generic unit: 
+ 			unit='SI';
+ 		results[i].unit=unit;
Index: /issm/oecreview/Archive/18296-19100/ISSM-19038-19039.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19038-19039.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19038-19039.diff	(revision 19102)
@@ -0,0 +1,71 @@
+Index: ../trunk-jpl/src/m/plot/export_gl.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/export_gl.py	(revision 19038)
++++ ../trunk-jpl/src/m/plot/export_gl.py	(revision 19039)
+@@ -1,5 +1,5 @@
+ def export_gl(md,varargin):
+-
++	return;
+ 	templist=plotoptions(varargin[:]); 
+ 	optionslist=templist.list;
+ 	options=optionslist[1];
+@@ -23,18 +23,17 @@
+ 	model.initialZoomFactor=getfieldvalue(options,'zoom',-.25);
+ 
+ 	#Deal with contour {{{
++	contour_lat1=md.mesh.lat(md.mesh.segments[:,1]);
++	contour_lat2=md.mesh.lat(md.mesh.segments[:,2]);
++	contour_long1=md.mesh.long(md.mesh.segments[:,1]);
++	contour_long2=md.mesh.long(md.mesh.segments[:,2]);
++	contour_surface1=md.geometry.surface(md.mesh.segments[:,1]);
++	contour_surface2=md.geometry.surface(md.mesh.segments[:,2]);
+ 
+-	contour_lat1=md.mesh.lat(md.mesh.segments(:,1));
+-	contour_lat2=md.mesh.lat(md.mesh.segments(:,2));
+-	contour_long1=md.mesh.long(md.mesh.segments(:,1));
+-	contour_long2=md.mesh.long(md.mesh.segments(:,2));
+-	contour_surface1=md.geometry.surface(md.mesh.segments(:,1));
+-	contour_surface2=md.geometry.surface(md.mesh.segments(:,2));
+-
+ 	R1=6371000*ones(len(contour_surface1),1)+scaling_factor*contour_surface1;
+ 	R2=6371000*ones(len(contour_surface2),1)+scaling_factor*contour_surface2;
+ 
+-	contourx1 = R1 * cosd(contour_lat1) * cosd(contour_long1;
++	contourx1 = R1 * cosd(contour_lat1) * cosd(contour_long1);
+ 	contoury1 = R1 * cosd(contour_lat1) * sind(contour_long1);
+ 	contourz1 = R1 * sind(contour_lat1);
+ 	
+@@ -82,22 +81,22 @@
+ 		options=checkplotoptions(md,options);
+ 		data=getfieldvalue(options,'data');
+ 		results[i].data=data;
+-		results[i].caxis=getfieldvalue(options,'caxis',[min(data) max(data)]);
++		results[i].caxis=getfieldvalue(options,'caxis',[min(data), max(data)]);
+ 
+ 		label=getfieldvalue(options,'label','');
+ 		if strcmpi(label,''):
+ 			#create generic label: 
+-			label=['data' num2str(i)];
++			label=['data', num2str(i)];
+ 		results[i].label=label;
+ 
+ 		shortlabel=getfieldvalue(options,'shortlabel','');
+ 		if strcmpi(shortlabel,''):
+ 			#create generic short label: 
+-			shortlabel=['data' num2str(i)];
++			shortlabel=['data', num2str(i)];
+ 		results[i].shortlabel=shortlabel;
+ 		
+ 		if len(data[2])>1:
+-			time_range=getfieldvalue(options,'time_range',[0 100]);
++			time_range=getfieldvalue(options,'time_range',[0, 100]);
+ 			results[i].time_range=time_range;
+ 
+ 		unit=getfieldvalue(options,'unit','');
+@@ -108,5 +107,5 @@
+ 	model.results=results;
+ 	
+ 	#Write model to javascript database file: 
+-	writejsfile([directory databasename '.js'],model,databasename);
++	writejsfile(directory + databasename + '.js',model,databasename);
+ #}}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-19039-19040.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19039-19040.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19039-19040.diff	(revision 19102)
@@ -0,0 +1,9288 @@
+Index: ../trunk-jpl/src/m/classes/initialization.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/initialization.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/initialization.m	(revision 19040)
+@@ -18,35 +18,35 @@
+ 		watercolumn   = NaN;
+ 	end
+ 	methods
+-		function createxml(obj,fid) % {{{
++		function createxml(self,fid) % {{{
+ 			fprintf(fid, '\n\n');
+ 			fprintf(fid, '%s\n', '<!-- initialization -->');
+ 			fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Initial field values">','<section name="initialization" />');                    
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="vx" type="',class(obj.vx),'" default="',obj.vx,'">','     <section name="initialization" />','     <help> x component of velocity [m/yr] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="vy" type="',class(obj.vy),'" default="',obj.vy,'">','     <section name="initialization" />','     <help> y component of velocity [m/yr] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="vz" type="',class(obj.vz),'" default="',obj.vz,'">','     <section name="initialization" />','     <help> z component of velocity [m/yr] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="vel" type="',class(obj.vel),'" default="',obj.vel,'">','     <section name="initialization" />','     <help> velocity norm [m/yr] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="pressure" type="',class(obj.pressure),'" default="',obj.pressure,'">','     <section name="initialization" />','     <help> pressure field [Pa] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="temperature" type="',class(obj.temperature),'" default="',obj.temperature,'">','     <section name="initialization" />','     <help> fraction of water in the ice </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="waterfraction" type="',class(obj.waterfraction),'" default="',obj.waterfraction,'">','     <section name="initialization" />','     <help> ice thickness [m] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="sediment_head" type="',class(obj.sediment_head),'" default="',obj.sediment_head,'">','     <section name="initialization" />','     <help> sediment water head of subglacial system [m] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="epl_head" type="',class(obj.epl_head),'" default="',obj.epl_head,'">','     <section name="initialization" />','     <help> epl water head of subglacial system [m] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','<parameter key ="watercolumn" type="',class(obj.watercolumn),'" default="',obj.watercolumn,'">','     <section name="initialization" />','     <help> thickness of subglacial water [m] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="vx" type="',class(self.vx),'" default="',self.vx,'">','     <section name="initialization" />','     <help> x component of velocity [m/yr] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="vy" type="',class(self.vy),'" default="',self.vy,'">','     <section name="initialization" />','     <help> y component of velocity [m/yr] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="vz" type="',class(self.vz),'" default="',self.vz,'">','     <section name="initialization" />','     <help> z component of velocity [m/yr] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="vel" type="',class(self.vel),'" default="',self.vel,'">','     <section name="initialization" />','     <help> velocity norm [m/yr] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="pressure" type="',class(self.pressure),'" default="',self.pressure,'">','     <section name="initialization" />','     <help> pressure field [Pa] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="temperature" type="',class(self.temperature),'" default="',self.temperature,'">','     <section name="initialization" />','     <help> fraction of water in the ice </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="waterfraction" type="',class(self.waterfraction),'" default="',self.waterfraction,'">','     <section name="initialization" />','     <help> ice thickness [m] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="sediment_head" type="',class(self.sediment_head),'" default="',self.sediment_head,'">','     <section name="initialization" />','     <help> sediment water head of subglacial system [m] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="epl_head" type="',class(self.epl_head),'" default="',self.epl_head,'">','     <section name="initialization" />','     <help> epl water head of subglacial system [m] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','<parameter key ="watercolumn" type="',class(self.watercolumn),'" default="',self.watercolumn,'">','     <section name="initialization" />','     <help> thickness of subglacial water [m] </help>','</parameter>');
+ 			fprintf(fid,'%s\n%s\n','</frame>');
+ 		end % }}}
+-		function obj = initialization(varargin) % {{{
++		function self = initialization(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 			if ismember(StressbalanceAnalysisEnum(),analyses)
+ 				if ~(isnan(md.initialization.vx) | isnan(md.initialization.vy)),
+ 					md = checkfield(md,'fieldname','initialization.vx','NaN',1,'size',[md.mesh.numberofvertices 1]);
+@@ -97,36 +97,36 @@
+ 				end
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   initial field values:'));
+ 
+-			fielddisplay(obj,'vx','x component of velocity [m/yr]');
+-			fielddisplay(obj,'vy','y component of velocity [m/yr]');
+-			fielddisplay(obj,'vz','z component of velocity [m/yr]');
+-			fielddisplay(obj,'vel','velocity norm [m/yr]');
+-			fielddisplay(obj,'pressure','pressure field [Pa]');
+-			fielddisplay(obj,'temperature','temperature [K]');
+-			fielddisplay(obj,'waterfraction','fraction of water in the ice');
+-			fielddisplay(obj,'sediment_head','sediment water head of subglacial system [m]');
+-			fielddisplay(obj,'epl_head','epl water head of subglacial system [m]');
+-			fielddisplay(obj,'epl_thickness','epl layer thickness [m]');
+-			fielddisplay(obj,'watercolumn','thickness of subglacial water [m]');
++			fielddisplay(self,'vx','x component of velocity [m/yr]');
++			fielddisplay(self,'vy','y component of velocity [m/yr]');
++			fielddisplay(self,'vz','z component of velocity [m/yr]');
++			fielddisplay(self,'vel','velocity norm [m/yr]');
++			fielddisplay(self,'pressure','pressure field [Pa]');
++			fielddisplay(self,'temperature','temperature [K]');
++			fielddisplay(self,'waterfraction','fraction of water in the ice');
++			fielddisplay(self,'sediment_head','sediment water head of subglacial system [m]');
++			fielddisplay(self,'epl_head','epl water head of subglacial system [m]');
++			fielddisplay(self,'epl_thickness','epl layer thickness [m]');
++			fielddisplay(self,'watercolumn','thickness of subglacial water [m]');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			yts=365.0*24.0*3600.0;
+ 
+-			WriteData(fid,'data',obj.vx,'format','DoubleMat','mattype',1,'enum',VxEnum,'scale',1./yts);
+-			WriteData(fid,'data',obj.vy,'format','DoubleMat','mattype',1,'enum',VyEnum,'scale',1./yts);
+-			WriteData(fid,'data',obj.vz,'format','DoubleMat','mattype',1,'enum',VzEnum,'scale',1./yts);
+-			WriteData(fid,'data',obj.pressure,'format','DoubleMat','mattype',1,'enum',PressureEnum);
+-			WriteData(fid,'data',obj.temperature,'format','DoubleMat','mattype',1,'enum',TemperatureEnum);
+-			WriteData(fid,'data',obj.waterfraction,'format','DoubleMat','mattype',1,'enum',WaterfractionEnum);
+-			WriteData(fid,'data',obj.sediment_head,'format','DoubleMat','mattype',1,'enum',SedimentHeadEnum);
+-			WriteData(fid,'data',obj.epl_head,'format','DoubleMat','mattype',1,'enum',EplHeadEnum);
+-			WriteData(fid,'data',obj.epl_thickness,'format','DoubleMat','mattype',1,'enum',HydrologydcEplThicknessEnum);
+-			WriteData(fid,'data',obj.watercolumn,'format','DoubleMat','mattype',1,'enum',WatercolumnEnum);
++			WriteData(fid,'data',self.vx,'format','DoubleMat','mattype',1,'enum',VxEnum,'scale',1./yts);
++			WriteData(fid,'data',self.vy,'format','DoubleMat','mattype',1,'enum',VyEnum,'scale',1./yts);
++			WriteData(fid,'data',self.vz,'format','DoubleMat','mattype',1,'enum',VzEnum,'scale',1./yts);
++			WriteData(fid,'data',self.pressure,'format','DoubleMat','mattype',1,'enum',PressureEnum);
++			WriteData(fid,'data',self.temperature,'format','DoubleMat','mattype',1,'enum',TemperatureEnum);
++			WriteData(fid,'data',self.waterfraction,'format','DoubleMat','mattype',1,'enum',WaterfractionEnum);
++			WriteData(fid,'data',self.sediment_head,'format','DoubleMat','mattype',1,'enum',SedimentHeadEnum);
++			WriteData(fid,'data',self.epl_head,'format','DoubleMat','mattype',1,'enum',EplHeadEnum);
++			WriteData(fid,'data',self.epl_thickness,'format','DoubleMat','mattype',1,'enum',HydrologydcEplThicknessEnum);
++			WriteData(fid,'data',self.watercolumn,'format','DoubleMat','mattype',1,'enum',WatercolumnEnum);
+ 
+ 			if md.thermal.isenthalpy,
+ 				tpmp = md.materials.meltingpoint - md.materials.beta*md.initialization.pressure;
+Index: ../trunk-jpl/src/m/classes/radaroverlay.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/radaroverlay.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/radaroverlay.m	(revision 19040)
+@@ -10,23 +10,23 @@
+ 		y   = NaN;
+ 	end
+ 	methods
+-		function obj = radaroverlay(varargin) % {{{
++		function self = radaroverlay(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   radaroverlay parameters:'));
+ 
+-			fielddisplay(obj,'pwr','radar power image (matrix)');
+-			fielddisplay(obj,'x','corresponding x coordinates [m]');
+-			fielddisplay(obj,'y','corresponding y coordinates [m]');
++			fielddisplay(self,'pwr','radar power image (matrix)');
++			fielddisplay(self,'x','corresponding x coordinates [m]');
++			fielddisplay(self,'y','corresponding y coordinates [m]');
+ 
+ 		end % }}}
+ 	end
+Index: ../trunk-jpl/src/m/classes/pairoptions.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/pairoptions.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/pairoptions.m	(revision 19040)
+@@ -10,24 +10,24 @@
+ 		list         = cell(0,3);
+ 	end
+ 	methods
+-		function obj = pairoptions(varargin) % {{{
++		function self = pairoptions(varargin) % {{{
+ 
+ 			%get calling function name
+ 			a=dbstack;
+ 			if length(a)>1,
+-				obj.functionname=a(2).file(1:end-2);
++				self.functionname=a(2).file(1:end-2);
+ 			else
+-				obj.functionname='';
++				self.functionname='';
+ 			end
+ 
+ 			%initialize list
+ 			if nargin==0,
+ 				%Do nothing,
+ 			else
+-				obj=buildlist(obj,varargin{:});
++				self=buildlist(self,varargin{:});
+ 			end
+ 		end % }}}
+-		function obj = buildlist(obj,varargin) % {{{
++		function self = buildlist(self,varargin) % {{{
+ 		%BUILDLIST - build list of obj from input
+ 
+ 			%check length of input
+@@ -37,36 +37,36 @@
+ 			numoptions = (nargin-1)/2;
+ 
+ 			%Allocate memory
+-			obj.list=cell(numoptions,3);
++			self.list=cell(numoptions,3);
+ 
+ 			%go through varargin and build list of obj
+ 			for i=1:numoptions,
+ 				if ischar(varargin{2*i-1}),
+-					obj.list{i,1}=varargin{2*i-1};
+-					obj.list{i,2}=varargin{2*i};
+-					obj.list{i,3}=false; %used?
++					self.list{i,1}=varargin{2*i-1};
++					self.list{i,2}=varargin{2*i};
++					self.list{i,3}=false; %used?
+ 				else
+ 					%option is not a string, ignore it
+ 					disp(['WARNING: option number ' num2str(i) ' is not a string, it will be ignored']);
+-					obj.list(i,:)=[];
++					self.list(i,:)=[];
+ 					continue
+ 				end
+ 			end
+ 		end % }}}
+-		function obj = addfield(obj,field,value) % {{{
++		function self = addfield(self,field,value) % {{{
+ 			if ischar(field),
+-				obj.list{end+1,1} = field;
+-				obj.list{end,2}   = value;
+-				obj.list{end,3}   = false;
++				self.list{end+1,1} = field;
++				self.list{end,2}   = value;
++				self.list{end,3}   = false;
+ 			end
+ 		end % }}}
+-		function obj = addfielddefault(obj,field,value) % {{{
++		function self = addfielddefault(self,field,value) % {{{
+ 		%ADDFIELDDEFAULT - add a field to an options list if it does not exist
+ 			if ischar(field),
+-				if ~exist(obj,field),
+-					obj.list{end+1,1} = field;
+-					obj.list{end,2}   = value;
+-					obj.list{end,3}   = true;  %It is a default so user will not be notified if not used
++				if ~exist(self,field),
++					self.list{end+1,1} = field;
++					self.list{end,2}   = value;
++					self.list{end,3}   = true;  %It is a default so user will not be notified if not used
+ 				end
+ 			end
+ 		end % }}}
+@@ -83,73 +83,73 @@
+ 				end
+ 			end
+ 		end % }}}
+-		function obj = changefieldvalue(obj,field,newvalue) % {{{
++		function self = changefieldvalue(self,field,newvalue) % {{{
+ 		%CHANGEOPTIONVALUE - change the value of an option in an option list
+ 
+ 			%track occurrence of field
+-			lines=find(strcmpi(obj.list(:,1),field));
++			lines=find(strcmpi(self.list(:,1),field));
+ 
+ 			%replace value
+ 			if isempty(lines),
+ 				%add new field if not found
+-				obj=addfield(obj,field,newvalue);
+-				obj.list{end,3}=true; % do not notify user if unused
++				self=addfield(self,field,newvalue);
++				self.list{end,3}=true; % do not notify user if unused
+ 			else
+ 				for i=1:length(lines),
+-					obj.list{lines(i),2}=newvalue;
++					self.list{lines(i),2}=newvalue;
+ 				end
+ 			end
+ 		end % }}}
+-		function obj = deleteduplicates(obj,warn) % {{{
++		function self = deleteduplicates(self,warn) % {{{
+ 		%DELETEDUPLICATES - delete duplicates in an option list
+ 
+ 			%track the first occurrence of each option
+-			[dummy lines]=unique(obj.list(:,1),'first');
++			[dummy lines]=unique(self.list(:,1),'first');
+ 			clear dummy
+ 
+ 			%warn user if requested
+ 			if warn,
+-				numoptions=size(obj.list,1);
++				numoptions=size(self.list,1);
+ 				for i=1:numoptions,
+ 					if ~ismember(i,lines),
+-						disp(['WARNING: option ' obj.list{i,1} ' appeared more than once. Only its first occurrence will be kept'])
++						disp(['WARNING: option ' self.list{i,1} ' appeared more than once. Only its first occurrence will be kept'])
+ 					end
+ 				end
+ 			end
+ 
+ 			%remove duplicates from the options list
+-			obj.list=obj.list(lines,:);
++			self.list=self.list(lines,:);
+ 		end % }}}
+-		function displayunused(obj) % {{{
++		function displayunused(self) % {{{
+ 			%DISPLAYUNUSED - display unused options
+ 
+-			numoptions=size(obj.list,1);
++			numoptions=size(self.list,1);
+ 			for i=1:numoptions,
+-				if ~obj.list{i,3},
+-					disp(['WARNING: option ' obj.list{i,1} ' was not used'])
++				if ~self.list{i,3},
++					disp(['WARNING: option ' self.list{i,1} ' was not used'])
+ 				end
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
+-			disp(sprintf('   functionname: %s',obj.functionname));
+-			if ~isempty(obj.list),
+-				disp(sprintf('   list: (%ix%i)\n',size(obj.list,1),size(obj.list,2)));
+-				for i=1:size(obj.list,1),
+-					if ischar(obj.list{i,2}),
+-						disp(sprintf('     field: %-10s value: ''%s''',obj.list{i,1},obj.list{i,2}));
+-					elseif isnumeric(obj.list{i,2}) & length(obj.list{i,2})==1,
+-						disp(sprintf('     field: %-10s value: %g',obj.list{i,1},obj.list{i,2}));
+-					elseif isnumeric(obj.list{i,2}) & length(obj.list{i,2})==2,
+-						disp(sprintf('     field: %-10s value: [%g %g]',obj.list{i,1},obj.list{i,2}));
++		function disp(self) % {{{
++			disp(sprintf('   functionname: %s',self.functionname));
++			if ~isempty(self.list),
++				disp(sprintf('   list: (%ix%i)\n',size(self.list,1),size(self.list,2)));
++				for i=1:size(self.list,1),
++					if ischar(self.list{i,2}),
++						disp(sprintf('     field: %-10s value: ''%s''',self.list{i,1},self.list{i,2}));
++					elseif isnumeric(self.list{i,2}) & length(self.list{i,2})==1,
++						disp(sprintf('     field: %-10s value: %g',self.list{i,1},self.list{i,2}));
++					elseif isnumeric(self.list{i,2}) & length(self.list{i,2})==2,
++						disp(sprintf('     field: %-10s value: [%g %g]',self.list{i,1},self.list{i,2}));
+ 					else
+-						disp(sprintf('     field: %-10s value: (%ix%i)',obj.list{i,1},size(obj.list{i,2},1),size(obj.list{i,2},2)));
++						disp(sprintf('     field: %-10s value: (%ix%i)',self.list{i,1},size(self.list{i,2},1),size(self.list{i,2},2)));
+ 					end
+ 				end
+ 			else
+ 				disp(sprintf('   list: empty'));
+ 			end
+ 		end % }}}
+-		function bool = exist(obj,field) % {{{
++		function bool = exist(self,field) % {{{
+ 		%EXIST - check if the option exists
+ 
+ 			%some argument checking: 
+@@ -161,15 +161,15 @@
+ 			end
+ 
+ 			%Recover option
+-			pos=find(strcmpi(field,obj.list(:,1)));
++			pos=find(strcmpi(field,self.list(:,1)));
+ 			if ~isempty(pos),
+ 				bool=true;
+-				obj.list{pos,3}   = true;  %It is a default so user will not be notified if not used
++				self.list{pos,3}   = true;  %It is a default so user will not be notified if not used
+ 			else
+ 				bool=false;
+ 			end
+ 		end % }}}
+-		function num = fieldoccurrences(obj,field), % {{{
++		function num = fieldoccurrences(self,field), % {{{
+ 		%FIELDOCCURRENCES - get number of occurrence of a field
+ 
+ 			%check input 
+@@ -178,13 +178,13 @@
+ 			end
+ 
+ 			%get number of occurrence
+-			num=sum(strcmpi(field,obj.list(:,1)));
++			num=sum(strcmpi(field,self.list(:,1)));
+ 		end % }}}
+-		function value = getfieldvalue(obj,field,varargin), % {{{
++		function value = getfieldvalue(self,field,varargin), % {{{
+ 		%GETOPTION - get the value of an option
+ 		%
+ 		%   Usage:
+-		%      value=getfieldvalue(obj,field,varargin)
++		%      value=getfieldvalue(self,field,varargin)
+ 		%
+ 		%   Find an option value from a field. A default option
+ 		%   can be given in input if the field does not exist
+@@ -204,10 +204,10 @@
+ 			end
+ 
+ 			%Recover option
+-			pos=find(strcmpi(obj.list(:,1),field));
++			pos=find(strcmpi(self.list(:,1),field));
+ 			if ~isempty(pos),
+-				value=obj.list{pos(1),2}; % ignore extra entry
+-				obj.list{pos(1),3}=true;  % option used
++				value=self.list{pos(1),2}; % ignore extra entry
++				self.list{pos(1),3}=true;  % option used
+ 				return;
+ 			end
+ 
+@@ -218,23 +218,23 @@
+ 				error(['error message: field ' field ' has not been provided by user (and no default value has been specified)'])
+ 			end
+ 		end % }}}
+-		function obj = removefield(obj,field,warn)% {{{
++		function self = removefield(self,field,warn)% {{{
+ 		%REMOVEFIELD - delete a field in an option list
+ 		%
+ 		%   Usage:
+-		%      obj=removefield(obj,field,warn)
++		%      self=removefield(self,field,warn)
+ 		%
+ 		%   if warn==1 display an info message to warn user that
+ 		%   some of his options have been removed.
+ 
+ 			%check is field exist
+-			if exist(obj,field),
++			if exist(self,field),
+ 
+ 				%find where the field is located
+-				lines=find(~strcmpi(obj.list(:,1),field));
++				lines=find(~strcmpi(self.list(:,1),field));
+ 
+ 				%remove duplicates from the options list
+-				obj.list=obj.list(lines,:);
++				self.list=self.list(lines,:);
+ 
+ 				%warn user if requested
+ 				if warn
+@@ -242,11 +242,11 @@
+ 				end
+ 			end
+ 		end % }}}
+-		function marshall(obj,fid,firstindex)% {{{
++		function marshall(self,fid,firstindex)% {{{
+ 
+-			for i=1:size(obj.list,1),
+-				name  = obj.list{i,1};
+-				value = obj.list{i,2};
++			for i=1:size(self.list,1),
++				name  = self.list{i,1};
++				value = self.list{i,2};
+ 
+ 				%Write option name
+ 				WriteData(fid,'enum',(firstindex-1)+2*i-1,'data',name,'format','String');
+Index: ../trunk-jpl/src/m/classes/toolkits.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/toolkits.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/toolkits.m	(revision 19040)
+@@ -1,7 +1,7 @@
+ %TOOLKITS class definition
+ %
+ %   Usage:
+-%      obj=toolkits();
++%      self=toolkits();
+ 
+ classdef toolkits < dynamicprops
+     properties (SetAccess=public) 
+@@ -9,17 +9,17 @@
+ 		 %The other properties are dynamic
+ 	 end
+ 	 methods
+-		 function obj = toolkits(varargin) % {{{
++		 function self = toolkits(varargin) % {{{
+ 			 switch nargin
+ 				 case 0
+-					 obj=setdefaultparameters(obj);
++					 self=setdefaultparameters(self);
+ 				 case 1
+-					 obj=structtoobj(obj,varargin{1});
++					 self=structtoobj(self,varargin{1});
+ 				 otherwise
+ 					 error('constructor not supported');
+ 				 end
+ 			 end % }}}
+-		 function obj = addoptions(obj,analysis,varargin) % {{{
++		 function self = addoptions(self,analysis,varargin) % {{{
+ 		 % Usage example:
+ 		 %    md.toolkits=addoptions(md.toolkits,StressbalanceAnalysisEnum(),FSoptions());
+ 		 %    md.toolkits=addoptions(md.toolkits,StressbalanceAnalysisEnum());
+@@ -28,48 +28,48 @@
+ 			 analysis=EnumToString(analysis);
+ 
+ 			 %Create dynamic property if property does not exist yet
+-			 if ~ismember(analysis,properties(obj)),
+-				 obj.addprop(analysis);
++			 if ~ismember(analysis,properties(self)),
++				 self.addprop(analysis);
+ 			 end
+ 
+ 			 %Add toolkits options to analysis
+-			 if nargin==3, obj.(analysis) = varargin{1}; end
++			 if nargin==3, self.(analysis) = varargin{1}; end
+ 		 end
+ 		 %}}}
+-		 function obj = setdefaultparameters(obj) % {{{
++		 function self = setdefaultparameters(self) % {{{
+ 
+ 			 %default toolkits: 
+ 			 if IssmConfig('_HAVE_PETSC_'),
+ 				 %MUMPS is the default toolkits
+ 				 if IssmConfig('_HAVE_MUMPS_'),
+-					 obj.DefaultAnalysis           = mumpsoptions();
++					 self.DefaultAnalysis           = mumpsoptions();
+ 				 else
+-					 obj.DefaultAnalysis           = iluasmoptions(); 
++					 self.DefaultAnalysis           = iluasmoptions(); 
+ 				 end
+ 			 else
+ 				 if IssmConfig('_HAVE_MUMPS_'),
+-					 obj.DefaultAnalysis           = issmmumpssolver(); 
++					 self.DefaultAnalysis           = issmmumpssolver(); 
+ 				 elseif IssmConfig('_HAVE_GSL_'),
+-					 obj.DefaultAnalysis           = issmgslsolver(); 
++					 self.DefaultAnalysis           = issmgslsolver(); 
+ 				 else 
+ 					 error('Need at least Mumps or Gsl to define an issm solver type');
+ 				 end
+ 			 end
+ 
+ 		 end % }}}
+-		 function disp(obj) % {{{
+-			 analyses=properties(obj);
++		 function disp(self) % {{{
++			 analyses=properties(self);
+ 			 disp(sprintf('List of toolkits options per analysis:\n'));
+ 			 for i=1:numel(analyses),
+ 				 analysis=analyses{i};
+ 				 disp([analysis ':']);
+-				 disp(obj.(analysis));
++				 disp(self.(analysis));
+ 			 end
+ 		 end % }}}
+-		 function md = checkconsistency(obj,md,solution,analyses) % {{{
+-			 analyses=properties(obj);
++		 function md = checkconsistency(self,md,solution,analyses) % {{{
++			 analyses=properties(self);
+ 			 for i=1:numel(analyses),
+-				 if isempty(fieldnames(obj.(analyses{i})))
++				 if isempty(fieldnames(self.(analyses{i})))
+ 					 md = checkmessage(md,['md.toolkits.' analyses{i} ' is empty']);
+ 				 end
+ 			 end
+Index: ../trunk-jpl/src/m/classes/frictionwaterlayer.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionwaterlayer.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/frictionwaterlayer.m	(revision 19040)
+@@ -11,20 +11,20 @@
+ 		water_layer = NaN;
+ 	end
+ 	methods
+-		function obj = frictionwaterlayer(varargin) % {{{
++		function self = frictionwaterlayer(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+ 					obj=structtoobj(frictionwaterlayer(),varargin{1});
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return
+ 			if ~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(ThermalAnalysisEnum(),analyses), return; end
+@@ -35,20 +35,20 @@
+ 			md = checkfield(md,'fieldname','thermal.spctemperature','timeseries',1,'>=',0.);
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('Basal shear stress parameters: tau_b = coefficient^2 * Neff ^r * |u_b|^(s-1) * u_b * 1/f(T)\n(effective stress Neff=rho_ice*g*thickness+rho_water*g*(bed+water_layer), r=q/p and s=1/p)'));
+-			fielddisplay(obj,'coefficient','frictiontemp coefficient [SI]');
+-			fielddisplay(obj,'p','p exponent');
+-			fielddisplay(obj,'q','q exponent');
+-			fielddisplay(obj,'water_layer','water thickness at the base of the ice (m)');
++			fielddisplay(self,'coefficient','frictiontemp coefficient [SI]');
++			fielddisplay(self,'p','p exponent');
++			fielddisplay(self,'q','q exponent');
++			fielddisplay(self,'water_layer','water thickness at the base of the ice (m)');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			WriteData(fid,'enum',FrictionLawEnum,'data',5,'format','Integer');
+-			WriteData(fid,'class','friction','object',obj,'fieldname','coefficient','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'class','friction','object',obj,'fieldname','p','format','DoubleMat','mattype',2);
+-			WriteData(fid,'class','friction','object',obj,'fieldname','q','format','DoubleMat','mattype',2);
+-			WriteData(fid,'class','friction','object',obj,'fieldname','water_layer','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'class','friction','object',self,'fieldname','coefficient','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'class','friction','object',self,'fieldname','p','format','DoubleMat','mattype',2);
++			WriteData(fid,'class','friction','object',self,'fieldname','q','format','DoubleMat','mattype',2);
++			WriteData(fid,'class','friction','object',self,'fieldname','water_layer','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/SMB.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMB.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/SMB.m	(revision 19040)
+@@ -8,13 +8,13 @@
+ 		mass_balance = NaN;
+ 	end
+ 	methods
+-        function createxml(obj,fid) % {{{
++        function createxml(self,fid) % {{{
+             fprintf(fid, '\n\n');
+             fprintf(fid, '%s\n', '<!-- surfaceforcings(SMB) -->');
+-			 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','<parameter key ="mass_balance" type="',class(obj.mass_balance),'" default="',obj.mass_balance,'">','     <section name="surfaceforcings(SMB)" />','     <help> surface mass balance [m/yr ice eq] </help>','</parameter>');
++			 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','<parameter key ="mass_balance" type="',class(self.mass_balance),'" default="',self.mass_balance,'">','     <section name="surfaceforcings(SMB)" />','     <help> surface mass balance [m/yr ice eq] </help>','</parameter>');
+            
+         end % }}}
+-		function obj = SMB(varargin) % {{{
++		function self = SMB(varargin) % {{{
+ 			switch nargin
+ 				case 0
+ 				otherwise
+@@ -34,7 +34,7 @@
+ 			end
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			if ismember(MasstransportAnalysisEnum(),analyses),
+ 				md = checkfield(md,'fieldname','surfaceforcings.mass_balance','timeseries',1,'NaN',1);
+@@ -43,16 +43,16 @@
+ 				md = checkfield(md,'fieldname','surfaceforcings.mass_balance','size',[md.mesh.numberofvertices 1],'NaN',1);
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   surface forcings parameters:'));
+-			fielddisplay(obj,'mass_balance','surface mass balance [m/yr ice eq]');
++			fielddisplay(self,'mass_balance','surface mass balance [m/yr ice eq]');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','mass_balance','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','mass_balance','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/debug.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/debug.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/debug.m	(revision 19040)
+@@ -10,7 +10,7 @@
+ 		profiling = false;
+ 	end
+ 	methods
+-        function createxml(obj,fid) % {{{
++        function createxml(self,fid) % {{{
+             fprintf(fid, '\n\n');
+             fprintf(fid, '%s\n', '<!-- Debug -->');
+             
+@@ -19,30 +19,30 @@
+             fprintf(fid,'%s\n','       <option value="0" type="string" default="true"> </option>');
+             fprintf(fid,'%s\n%s\n','       <option value="1" type="string" default="false"> </option>','</parameter>');
+           
+-            fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n',    '<parameter key ="gprof" type="',              class(obj.gprof),'" optional="false">',              '     <section name="debug" />','        <option value="',convert2str(obj.gprof),'" type="string" default="true"></option>','     <help> use gnu-profiler to find out where the time is spent </help>','</parameter>');
+-            fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n',    '<parameter key ="profiling" type="',              class(obj.profiling),'" optional="false">',              '     <section name="debug" />','        <option value="',convert2str(obj.profiling),'" type="string" default="true"></option>','     <help> enables profiling (memory, flops, time) </help>','</parameter>');
++            fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n',    '<parameter key ="gprof" type="',              class(self.gprof),'" optional="false">',              '     <section name="debug" />','        <option value="',convert2str(self.gprof),'" type="string" default="true"></option>','     <help> use gnu-profiler to find out where the time is spent </help>','</parameter>');
++            fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n',    '<parameter key ="profiling" type="',              class(self.profiling),'" optional="false">',              '     <section name="debug" />','        <option value="',convert2str(self.profiling),'" type="string" default="true"></option>','     <help> enables profiling (memory, flops, time) </help>','</parameter>');
+         end % }}}
+-		function obj = debug(varargin) % {{{
++		function self = debug(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 				end
+ 			end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   debug parameters:'));
+ 
+-			fielddisplay(obj,'valgrind','use Valgrind to debug (0 or 1)');
+-			fielddisplay(obj,'gprof','use gnu-profiler to find out where the time is spent');
+-			fielddisplay(obj,'profiling','enables profiling (memory, flops, time)');
++			fielddisplay(self,'valgrind','use Valgrind to debug (0 or 1)');
++			fielddisplay(self,'gprof','use gnu-profiler to find out where the time is spent');
++			fielddisplay(self,'profiling','enables profiling (memory, flops, time)');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'object',obj,'fieldname','profiling','format','Boolean');
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'object',self,'fieldname','profiling','format','Boolean');
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/massfluxatgate.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/massfluxatgate.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/massfluxatgate.m	(revision 19040)
+@@ -15,54 +15,54 @@
+ 		segments        = NaN;
+ 	end
+ 	methods
+-		function obj = massfluxatgate(varargin) % {{{
++		function self = massfluxatgate(varargin) % {{{
+ 			if nargin==0,
+-				obj=setdefaultparameters(obj);
++				self=setdefaultparameters(self);
+ 			else
+ 				%use provided options to change fields
+ 				options=pairoptions(varargin{:});
+ 
+ 				%get name
+-				obj.name=getfieldvalue(options,'name','');
+-				obj.definitionenum=getfieldvalue(options,'definitionenum');
+-				obj.profilename=getfieldvalue(options,'profilename');
++				self.name=getfieldvalue(options,'name','');
++				self.definitionenum=getfieldvalue(options,'definitionenum');
++				self.profilename=getfieldvalue(options,'profilename');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 			
+-			if ~ischar(obj.name),
++			if ~ischar(self.name),
+ 				error('massfluxatgate error message: ''name'' field should be a string!');
+ 			end
+-			if ~ischar(obj.profilename),
++			if ~ischar(self.profilename),
+ 				error('massfluxatgate error message: ''profilename'' field should be a string!');
+ 			end
+ 			
+-			md = checkfield(md,'field',obj.definitionenum,'values',[Outputdefinition1Enum():Outputdefinition100Enum()]);
++			md = checkfield(md,'field',self.definitionenum,'values',[Outputdefinition1Enum():Outputdefinition100Enum()]);
+ 
+ 			%check the profilename points to a file!: 
+-			if exist(obj.profilename,'file')~=2,
++			if exist(self.profilename,'file')~=2,
+ 				error('massfluxatgate error message: file name for profile corresponding to gate does not point to a legitimate file on disk!');
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   Massfluxatgate:\n'));
+ 
+-			fielddisplay(obj,'name','identifier for this massfluxatgate response');
+-			fielddisplay(obj,'profilename','name of file (shapefile or argus file) defining a profile (or gate)');
+-			fielddisplay(obj,'definitionenum','enum that identifies this output definition uniquely, from Outputdefinition[1-10]Enum');
++			fielddisplay(self,'name','identifier for this massfluxatgate response');
++			fielddisplay(self,'profilename','name of file (shapefile or argus file) defining a profile (or gate)');
++			fielddisplay(self,'definitionenum','enum that identifies this output definition uniquely, from Outputdefinition[1-10]Enum');
+ 			
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 		%before marshalling, we need to create the segments out of the profilename: 
+-		obj.segments=MeshProfileIntersection(md.mesh.elements,md.mesh.x,md.mesh.y,obj.profilename);
++		self.segments=MeshProfileIntersection(md.mesh.elements,md.mesh.x,md.mesh.y,self.profilename);
+ 
+ 		%ok, marshall name and segments: 
+-		WriteData(fid,'object',obj,'fieldname','name','format','String');
+-		WriteData(fid,'object',obj,'fieldname','definitionenum','format','Integer');
+-		WriteData(fid,'object',obj,'fieldname','segments','format','DoubleMat','mattype',1);
++		WriteData(fid,'object',self,'fieldname','name','format','String');
++		WriteData(fid,'object',self,'fieldname','definitionenum','format','Integer');
++		WriteData(fid,'object',self,'fieldname','segments','format','DoubleMat','mattype',1);
+ 
+ 		end % }}}
+ 	end
+Index: ../trunk-jpl/src/m/classes/m1qn3inversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 19040)
+@@ -26,12 +26,12 @@
+ 
+ 	end
+ 	methods
+-		function obj = m1qn3inversion(varargin) % {{{
++		function self = m1qn3inversion(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+-					obj=structtoobj(m1qn3inversion(),varargin{1});
++					self=structtoobj(m1qn3inversion(),varargin{1});
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+@@ -60,10 +60,10 @@
+ 			self.gttol = 1e-4;
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return
+-			if ~obj.iscontrol, return; end
++			if ~self.iscontrol, return; end
+ 
+ 			if ~IssmConfig('_HAVE_M1QN3_'),
+ 				md = checkmessage(md,['M1QN3 has not been installed, ISSM needs to be reconfigured and recompiled with M1QN3']);
+@@ -96,25 +96,25 @@
+ 				end
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   m1qn3inversion parameters:'));
+-			fielddisplay(obj,'iscontrol','is inversion activated?');
+-			fielddisplay(obj,'incomplete_adjoint','1: linear viscosity, 0: non-linear viscosity');
+-			fielddisplay(obj,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}');
+-			fielddisplay(obj,'control_scaling_factors','order of magnitude of each control (useful for multi-parameter optimization)');
+-			fielddisplay(obj,'maxsteps','maximum number of iterations (gradient computation)');
+-			fielddisplay(obj,'maxiter','maximum number of Function evaluation (forward run)');
+-			fielddisplay(obj,'dxmin','convergence criterion: two points less than dxmin from eachother (sup-norm) are considered identical');
+-			fielddisplay(obj,'gttol','convergence criterion: ||g(X)||/||g(X0)|| (g(X0): gradient at initial guess X0)');
+-			fielddisplay(obj,'cost_functions','indicate the type of response for each optimization step');
+-			fielddisplay(obj,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter');
+-			fielddisplay(obj,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex');
+-			fielddisplay(obj,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex');
+-			fielddisplay(obj,'vx_obs','observed velocity x component [m/yr]');
+-			fielddisplay(obj,'vy_obs','observed velocity y component [m/yr]');
+-			fielddisplay(obj,'vel_obs','observed velocity magnitude [m/yr]');
+-			fielddisplay(obj,'thickness_obs','observed thickness [m]');
+-			fielddisplay(obj,'surface_obs','observed surface elevation [m]');
++			fielddisplay(self,'iscontrol','is inversion activated?');
++			fielddisplay(self,'incomplete_adjoint','1: linear viscosity, 0: non-linear viscosity');
++			fielddisplay(self,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}');
++			fielddisplay(self,'control_scaling_factors','order of magnitude of each control (useful for multi-parameter optimization)');
++			fielddisplay(self,'maxsteps','maximum number of iterations (gradient computation)');
++			fielddisplay(self,'maxiter','maximum number of Function evaluation (forward run)');
++			fielddisplay(self,'dxmin','convergence criterion: two points less than dxmin from eachother (sup-norm) are considered identical');
++			fielddisplay(self,'gttol','convergence criterion: ||g(X)||/||g(X0)|| (g(X0): gradient at initial guess X0)');
++			fielddisplay(self,'cost_functions','indicate the type of response for each optimization step');
++			fielddisplay(self,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter');
++			fielddisplay(self,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex');
++			fielddisplay(self,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex');
++			fielddisplay(self,'vx_obs','observed velocity x component [m/yr]');
++			fielddisplay(self,'vy_obs','observed velocity y component [m/yr]');
++			fielddisplay(self,'vel_obs','observed velocity magnitude [m/yr]');
++			fielddisplay(self,'thickness_obs','observed thickness [m]');
++			fielddisplay(self,'surface_obs','observed surface elevation [m]');
+ 			disp('Available cost functions:');
+ 			disp('   101: SurfaceAbsVelMisfit');
+ 			disp('   102: SurfaceRelVelMisfit');
+@@ -126,45 +126,45 @@
+ 			disp('   502: RheologyBbarAbsGradient');
+ 			disp('   503: ThicknessAbsGradient');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			yts=365.0*24.0*3600.0;
+ 
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','iscontrol','format','Boolean');
++			WriteData(fid,'object',self,'class','inversion','fieldname','iscontrol','format','Boolean');
+ 			WriteData(fid,'enum',InversionTypeEnum(),'data',2,'format','Integer');
+-			if ~obj.iscontrol, return; end
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','incomplete_adjoint','format','Boolean');
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','control_scaling_factors','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','maxsteps','format','Integer');
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','maxiter','format','Integer');
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','dxmin','format','Double');
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','gttol','format','Double');
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','min_parameters','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','max_parameters','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','vx_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','vy_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','vz_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+-			if(numel(obj.thickness_obs)==md.mesh.numberofelements),
++			if ~self.iscontrol, return; end
++			WriteData(fid,'object',self,'class','inversion','fieldname','incomplete_adjoint','format','Boolean');
++			WriteData(fid,'object',self,'class','inversion','fieldname','control_scaling_factors','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'class','inversion','fieldname','maxsteps','format','Integer');
++			WriteData(fid,'object',self,'class','inversion','fieldname','maxiter','format','Integer');
++			WriteData(fid,'object',self,'class','inversion','fieldname','dxmin','format','Double');
++			WriteData(fid,'object',self,'class','inversion','fieldname','gttol','format','Double');
++			WriteData(fid,'object',self,'class','inversion','fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','inversion','fieldname','min_parameters','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'class','inversion','fieldname','max_parameters','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'class','inversion','fieldname','vx_obs','format','DoubleMat','mattype',1,'scale',1./yts);
++			WriteData(fid,'object',self,'class','inversion','fieldname','vy_obs','format','DoubleMat','mattype',1,'scale',1./yts);
++			WriteData(fid,'object',self,'class','inversion','fieldname','vz_obs','format','DoubleMat','mattype',1,'scale',1./yts);
++			if(numel(self.thickness_obs)==md.mesh.numberofelements),
+ 				mattype=2;
+ 			else
+ 				mattype=1;
+ 			end
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',mattype);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','surface_obs','format','DoubleMat','mattype',mattype);
++			WriteData(fid,'object',self,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',mattype);
++			WriteData(fid,'object',self,'class','inversion','fieldname','surface_obs','format','DoubleMat','mattype',mattype);
+ 
+ 			%process control parameters
+-			num_control_parameters=numel(obj.control_parameters);
++			num_control_parameters=numel(self.control_parameters);
+ 			data=zeros(1,num_control_parameters);
+ 			for i=1:num_control_parameters,
+-				data(i)=StringToEnum(obj.control_parameters{i});
++				data(i)=StringToEnum(self.control_parameters{i});
+ 			end
+ 			WriteData(fid,'data',data,'enum',InversionControlParametersEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_control_parameters,'enum',InversionNumControlParametersEnum(),'format','Integer');
+ 
+ 			%process cost functions
+-			num_cost_functions=size(obj.cost_functions,2);
+-			data=marshallcostfunctions(obj.cost_functions);
++			num_cost_functions=size(self.cost_functions,2);
++			data=marshallcostfunctions(self.cost_functions);
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/thermal.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/thermal.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/thermal.m	(revision 19040)
+@@ -17,12 +17,12 @@
+ 		requested_outputs = {};
+ 	end
+ 	methods
+-        function createxml(obj,fid) % {{{
++        function createxml(self,fid) % {{{
+             fprintf(fid, '<!-- thermal -->\n');            
+                     
+             % thermal solution parameters
+             fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Thermal solution parameters">','<section name="thermal" />');                    
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="spctemperature" type="',class(obj.spctemperature),'" default="',convert2str(obj.spctemperature),'">','     <section name="thermal" />','     <help> temperature constraints (NaN means no constraint) [K] </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="spctemperature" type="',class(self.spctemperature),'" default="',convert2str(self.spctemperature),'">','     <section name="thermal" />','     <help> temperature constraints (NaN means no constraint) [K] </help>','  </parameter>');
+                 
+             % penalty_threshold drop-down (0, 1, or 2)
+             fprintf(fid,'%s\n%s\n%s\n%s\n','  <parameter key ="penalty_threshold" type="alternative"  optional="false">','     <section name="thermal" />','     <help> 0: no, 1: artificial_diffusivity, 2: SUPG </help>');
+@@ -30,21 +30,21 @@
+             fprintf(fid,'%s\n','       <option value="1" type="string" default="false"> </option>');
+             fprintf(fid,'%s\n%s\n','       <option value="2" type="string" default="false"> </option>','</parameter>');
+ 
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="stabilization" type="',class(obj.stabilization),'" default="',convert2str(obj.stabilization),'">','     <section name="thermal" />','     <help> maximum number of non linear iterations </help>','  </parameter>');
+-				fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="reltol" type="',class(obj.reltol),'" default="',convert2str(obj.reltol),'">','     <section name="steadystate" />','     <help> relative tolerance criterion [K] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="maxiter" type="',class(obj.maxiter),'" default="',convert2str(obj.maxiter),'">','     <section name="thermal" />','     <help> stabilize unstable thermal constraints that keep zigzagging after n iteration (default is 0, no stabilization) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="penalty_lock" type="',class(obj.penalty_lock),'" default="',convert2str(obj.penalty_lock),'">','     <section name="thermal" />','     <help> threshold to declare convergence of thermal solution (default is 0)  </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="penalty_factor" type="',class(obj.penalty_factor),'" default="',convert2str(obj.penalty_factor),'">','     <section name="thermal" />','     <help> scaling exponent (default is 3) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isenthalpy" type="',class(obj.isenthalpy),'" default="',convert2str(obj.isenthalpy),'">','     <section name="thermal" />','     <help> use an enthalpy formulation to include temperate ice (default is 0) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isdynamicbasalspc" type="',class(obj.isdynamicbasalspc),'" default="',convert2str(obj.isdynamicbasalspc),'">','     <section name="thermal" />','     <help> enable dynamic setting of basal forcing. recommended for enthalpy formulation (default is 0)  </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="requested_outputs" type="',class(obj.requested_outputs),'" default="',convert2str(obj.requested_outputs),'">','     <section name="thermal" />','     <help> additional outputs requested </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="stabilization" type="',class(self.stabilization),'" default="',convert2str(self.stabilization),'">','     <section name="thermal" />','     <help> maximum number of non linear iterations </help>','  </parameter>');
++				fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="reltol" type="',class(self.reltol),'" default="',convert2str(self.reltol),'">','     <section name="steadystate" />','     <help> relative tolerance criterion [K] </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="maxiter" type="',class(self.maxiter),'" default="',convert2str(self.maxiter),'">','     <section name="thermal" />','     <help> stabilize unstable thermal constraints that keep zigzagging after n iteration (default is 0, no stabilization) </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="penalty_lock" type="',class(self.penalty_lock),'" default="',convert2str(self.penalty_lock),'">','     <section name="thermal" />','     <help> threshold to declare convergence of thermal solution (default is 0)  </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="penalty_factor" type="',class(self.penalty_factor),'" default="',convert2str(self.penalty_factor),'">','     <section name="thermal" />','     <help> scaling exponent (default is 3) </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isenthalpy" type="',class(self.isenthalpy),'" default="',convert2str(self.isenthalpy),'">','     <section name="thermal" />','     <help> use an enthalpy formulation to include temperate ice (default is 0) </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isdynamicbasalspc" type="',class(self.isdynamicbasalspc),'" default="',convert2str(self.isdynamicbasalspc),'">','     <section name="thermal" />','     <help> enable dynamic setting of basal forcing. recommended for enthalpy formulation (default is 0)  </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="requested_outputs" type="',class(self.requested_outputs),'" default="',convert2str(self.requested_outputs),'">','     <section name="thermal" />','     <help> additional outputs requested </help>','  </parameter>');
+             fprintf(fid,'%s\n%s\n','</frame>');    
+         
+         end % }}}
+-		function obj = thermal(varargin) % {{{
++		function self = thermal(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+@@ -58,33 +58,33 @@
+ 			end
+ 
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%Number of unstable constraints acceptable
+-			obj.penalty_threshold=0;
++			self.penalty_threshold=0;
+ 
+ 			%Type of stabilization used
+-			obj.stabilization=1;
++			self.stabilization=1;
+ 
+ 			%Relative tolerance for the enthalpy convergence
+-			obj.reltol=0.01;
++			self.reltol=0.01;
+ 
+ 			%Maximum number of iterations
+-			obj.maxiter=100;
++			self.maxiter=100;
+ 
+ 			%factor used to compute the values of the penalties: kappa=max(stiffness matrix)*10^penalty_factor
+-			obj.penalty_factor=3;
++			self.penalty_factor=3;
+ 
+ 			%Should we use cold ice (default) or enthalpy formulation
+-			obj.isenthalpy=0;
++			self.isenthalpy=0;
+ 
+ 			%will basal boundary conditions be set dynamically
+-			obj.isdynamicbasalspc=0;
++			self.isdynamicbasalspc=0;
+ 
+ 			%default output
+-			obj.requested_outputs={'default'};
++			self.requested_outputs={'default'};
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return
+ 			if (~ismember(ThermalAnalysisEnum(),analyses) & ~ismember(EnthalpyAnalysisEnum(),analyses)) | (solution==TransientSolutionEnum() & md.transient.isthermal==0), return; end
+@@ -107,38 +107,38 @@
+ 
+ 		 md = checkfield(md,'fieldname','thermal.requested_outputs','stringrow',1);
+     end % }}} 
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   Thermal solution parameters:'));
+ 
+-			fielddisplay(obj,'spctemperature','temperature constraints (NaN means no constraint) [K]');
+-			fielddisplay(obj,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG');
+-			fielddisplay(obj,'reltol','relative tolerance convergence criterion for enthalpy');
+-			fielddisplay(obj,'maxiter','maximum number of non linear iterations');
+-			fielddisplay(obj,'penalty_lock','stabilize unstable thermal constraints that keep zigzagging after n iteration (default is 0, no stabilization)');
+-			fielddisplay(obj,'penalty_threshold','threshold to declare convergence of thermal solution (default is 0)');
+-			fielddisplay(obj,'penalty_factor','scaling exponent (default is 3)');
+-			fielddisplay(obj,'isenthalpy','use an enthalpy formulation to include temperate ice (default is 0)');
+-			fielddisplay(obj,'isdynamicbasalspc',['enable dynamic setting of basal forcing. required for enthalpy formulation (default is 0)']);
+-			fielddisplay(obj,'requested_outputs','additional outputs requested');
++			fielddisplay(self,'spctemperature','temperature constraints (NaN means no constraint) [K]');
++			fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG');
++			fielddisplay(self,'reltol','relative tolerance convergence criterion for enthalpy');
++			fielddisplay(self,'maxiter','maximum number of non linear iterations');
++			fielddisplay(self,'penalty_lock','stabilize unstable thermal constraints that keep zigzagging after n iteration (default is 0, no stabilization)');
++			fielddisplay(self,'penalty_threshold','threshold to declare convergence of thermal solution (default is 0)');
++			fielddisplay(self,'penalty_factor','scaling exponent (default is 3)');
++			fielddisplay(self,'isenthalpy','use an enthalpy formulation to include temperate ice (default is 0)');
++			fielddisplay(self,'isdynamicbasalspc',['enable dynamic setting of basal forcing. required for enthalpy formulation (default is 0)']);
++			fielddisplay(self,'requested_outputs','additional outputs requested');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'object',obj,'fieldname','spctemperature','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'fieldname','penalty_threshold','format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','stabilization','format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','reltol','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','maxiter','format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','penalty_lock','format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','penalty_factor','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','isenthalpy','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','isdynamicbasalspc','format','Boolean');
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'object',self,'fieldname','spctemperature','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'fieldname','penalty_threshold','format','Integer');
++			WriteData(fid,'object',self,'fieldname','stabilization','format','Integer');
++			WriteData(fid,'object',self,'fieldname','reltol','format','Double');
++			WriteData(fid,'object',self,'fieldname','maxiter','format','Integer');
++			WriteData(fid,'object',self,'fieldname','penalty_lock','format','Integer');
++			WriteData(fid,'object',self,'fieldname','penalty_factor','format','Double');
++			WriteData(fid,'object',self,'fieldname','isenthalpy','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','isdynamicbasalspc','format','Boolean');
+ 
+ 			%process requested outputs
+-			outputs = obj.requested_outputs;
++			outputs = self.requested_outputs;
+ 			pos  = find(ismember(outputs,'default'));
+ 			if ~isempty(pos),
+ 				outputs(pos) = [];                         %remove 'default' from outputs
+-				outputs      = [outputs defaultoutputs(obj,md)]; %add defaults
++				outputs      = [outputs defaultoutputs(self,md)]; %add defaults
+ 			end
+ 			WriteData(fid,'data',outputs,'enum',ThermalRequestedOutputsEnum(),'format','StringArray');
+         	end % }}}
+Index: ../trunk-jpl/src/m/classes/miscellaneous.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/miscellaneous.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/miscellaneous.m	(revision 19040)
+@@ -10,43 +10,43 @@
+ 		dummy = struct();
+ 	end
+ 	methods
+-        function createxml(obj,fid) % {{{
++        function createxml(self,fid) % {{{
+             fprintf(fid, '<!-- miscellaneous -->\n');            
+                     
+             % miscellaneous solution parameters
+             fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="miscellaneous parameters">','<section name="miscellaneous" />');                    
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="notes" type="',class(obj.notes),'" default="',convert2str(obj.notes),'">','     <section name="miscellaneous" />','     <help> notes in a cell of strings </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="name" type="',class(obj.name),'" default="',convert2str(obj.name),'">','     <section name="miscellaneous" />','     <help> model name </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="dummy" type="',class(obj.dummy),'" default="',convert2str(obj.dummy),'">','     <section name="miscellaneous" />','     <help> empty field to store some data </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="notes" type="',class(self.notes),'" default="',convert2str(self.notes),'">','     <section name="miscellaneous" />','     <help> notes in a cell of strings </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="name" type="',class(self.name),'" default="',convert2str(self.name),'">','     <section name="miscellaneous" />','     <help> model name </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="dummy" type="',class(self.dummy),'" default="',convert2str(self.dummy),'">','     <section name="miscellaneous" />','     <help> empty field to store some data </help>','  </parameter>');
+             fprintf(fid,'%s\n%s\n','</frame>');    
+         
+         end % }}}        
+-		function obj = miscellaneous(varargin) % {{{
++		function self = miscellaneous(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			md = checkfield(md,'fieldname','miscellaneous.name','empty',1);
+ 
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   miscellaneous parameters:'));
+ 
+-			fielddisplay(obj,'notes','notes in a cell of strings');
+-			fielddisplay(obj,'name','model name');
+-			fielddisplay(obj,'dummy','empty field to store some data');
++			fielddisplay(self,'notes','notes in a cell of strings');
++			fielddisplay(self,'name','model name');
++			fielddisplay(self,'dummy','empty field to store some data');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'object',obj,'fieldname','name','format','String');
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'object',self,'fieldname','name','format','String');
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/mesh3dtetras.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mesh3dtetras.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/mesh3dtetras.m	(revision 19040)
+@@ -61,56 +61,56 @@
+ 		end% }}}
+ 	end
+ 	methods
+-		function createxml(obj,fid) % {{{
++		function createxml(self,fid) % {{{
+ 			fprintf(fid, '<!-- 3D Tetra Mesh -->\n');
+ 
+ 			% Elements and verticies of the original 2d mesh
+ 			fprintf(fid,'%s\n%s\n%s\n','       <frame key="1" label="Elements and vertices of the orginal 2d mesh">','       <section name="mesh3dprisms" />');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements2d" type="',class(obj.numberofelements2d),'" default="',convert2str(obj.numberofelements2d),'">','              <help> number of elements </help>','          </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices2d" type="',class(obj.numberofvertices2d),'" default="',convert2str(obj.numberofvertices2d),'">','              <help> number of vertices </help>','          </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements2d" type="',class(obj.elements2d),'" default="',convert2str(obj.elements2d),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x2d" type="',class(obj.x2d),'" default="',convert2str(obj.x2d),'">','     <section name="mesh3dprisms" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y2d" type="',class(obj.y2d),'" default="',convert2str(obj.y2d),'">','     <section name="mesh3dprisms" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements2d" type="',class(self.numberofelements2d),'" default="',convert2str(self.numberofelements2d),'">','              <help> number of elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices2d" type="',class(self.numberofvertices2d),'" default="',convert2str(self.numberofvertices2d),'">','              <help> number of vertices </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements2d" type="',class(self.elements2d),'" default="',convert2str(self.elements2d),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x2d" type="',class(self.x2d),'" default="',convert2str(self.x2d),'">','     <section name="mesh3dprisms" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y2d" type="',class(self.y2d),'" default="',convert2str(self.y2d),'">','     <section name="mesh3dprisms" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
+ 			fprintf(fid,'%s\n%s\n','       </frame>');
+ 
+ 			% Elements and vertices of the extruded 3d mesh
+ 			fprintf(fid,'%s\n%s\n%s\n','       <frame key="2" label="Elements and vertices of the orginal 3d mesh">','       <section name="mesh3dprisms" />');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements" type="',class(obj.numberofelements),'" default="',convert2str(obj.numberofelements),'">','              <help> number of elements </help>','          </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices" type="',class(obj.numberofvertices),'" default="',convert2str(obj.numberofvertices),'">','              <help> number of vertices </help>','          </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements" type="',class(obj.elements),'" default="',convert2str(obj.elements),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x" type="',class(obj.x),'" default="',convert2str(obj.x),'">','     <section name="mesh3dprisms" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y" type="',class(obj.y),'" default="',convert2str(obj.y),'">','     <section name="mesh3dprisms" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="z" type="',class(obj.y),'" default="',convert2str(obj.y),'">','     <section name="mesh3dprisms" />','     <help> vertices z coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements" type="',class(self.numberofelements),'" default="',convert2str(self.numberofelements),'">','              <help> number of elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices" type="',class(self.numberofvertices),'" default="',convert2str(self.numberofvertices),'">','              <help> number of vertices </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements" type="',class(self.elements),'" default="',convert2str(self.elements),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x" type="',class(self.x),'" default="',convert2str(self.x),'">','     <section name="mesh3dprisms" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y" type="',class(self.y),'" default="',convert2str(self.y),'">','     <section name="mesh3dprisms" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="z" type="',class(self.y),'" default="',convert2str(self.y),'">','     <section name="mesh3dprisms" />','     <help> vertices z coordinate [m] </help>','  </parameter>');
+ 			fprintf(fid,'%s\n%s\n','       </frame>');
+ 
+ 			% properties
+ 			fprintf(fid,'%s\n%s\n%s\n','<frame key="3" label="Properties">','<section name="mesh3dprisms" />');             
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberoflayers" type="',class(obj.numberoflayers),'" default="',convert2str(obj.numberoflayers),'">','     <section name="mesh3dprisms" />','     <help> number of extrusion layers </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonbase" type="',class(obj.vertexonbase),'" default="',convert2str(obj.vertexonbase),'">','     <section name="mesh3dprisms" />','     <help> lower vertices flags list </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementontbase" type="',class(obj.elementontbase),'" default="',convert2str(obj.elementontbase),'">','     <section name="mesh3dprisms" />','     <help> lower elements flags list </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonsurface" type="',class(obj.vertexonsurface),'" default="',convert2str(obj.vertexonsurface),'">','     <section name="mesh3dprisms" />','     <help> upper vertices flags list </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementontsurface" type="',class(obj.elementontsurface),'" default="',convert2str(obj.elementontsurface),'">','     <section name="mesh3dprisms" />','     <help> upper elements flags list </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="uppervertex" type="',class(obj.uppervertex),'" default="',convert2str(obj.uppervertex),'">','     <section name="mesh3dprisms" />','     <help> upper vertex list (NaN for vertex on the upper surface) </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="upperelements" type="',class(obj.upperelements),'" default="',convert2str(obj.upperelements),'">','     <section name="mesh3dprisms" />','     <help> upper element list (NaN for element on the upper layer) </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lowervertex" type="',class(obj.lowervertex),'" default="',convert2str(obj.lowervertex),'">','     <section name="mesh3dprisms" />','     <help> lower vertex list (NaN for vertex on the lower surface) </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lowerelements" type="',class(obj.lowerelements),'" default="',convert2str(obj.lowerelements),'">','     <section name="mesh3dprisms" />','     <help> element list (NaN for element on the lower layer) </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonboundary" type="',class(obj.vertexonboundary),'" default="',convert2str(obj.vertexonboundary),'">','     <section name="mesh3dprisms" />','     <help> vertices on the boundary of the domain flag list </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexconnectivity" type="',class(obj.vertexconnectivity),'" default="',convert2str(obj.vertexconnectivity),'">','     <section name="mesh3dprisms" />','     <help> list of vertices connected to vertex_i </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementconnectivity" type="',class(obj.elementconnectivity),'" default="',convert2str(obj.elementconnectivity),'">','     <section name="mesh3dprisms" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="average_vertex_connectivity" type="',class(obj.average_vertex_connectivity),'" default="',convert2str(obj.average_vertex_connectivity),'">','     <section name="mesh3dprisms" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberoflayers" type="',class(self.numberoflayers),'" default="',convert2str(self.numberoflayers),'">','     <section name="mesh3dprisms" />','     <help> number of extrusion layers </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonbase" type="',class(self.vertexonbase),'" default="',convert2str(self.vertexonbase),'">','     <section name="mesh3dprisms" />','     <help> lower vertices flags list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementontbase" type="',class(self.elementontbase),'" default="',convert2str(self.elementontbase),'">','     <section name="mesh3dprisms" />','     <help> lower elements flags list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonsurface" type="',class(self.vertexonsurface),'" default="',convert2str(self.vertexonsurface),'">','     <section name="mesh3dprisms" />','     <help> upper vertices flags list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementontsurface" type="',class(self.elementontsurface),'" default="',convert2str(self.elementontsurface),'">','     <section name="mesh3dprisms" />','     <help> upper elements flags list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="uppervertex" type="',class(self.uppervertex),'" default="',convert2str(self.uppervertex),'">','     <section name="mesh3dprisms" />','     <help> upper vertex list (NaN for vertex on the upper surface) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="upperelements" type="',class(self.upperelements),'" default="',convert2str(self.upperelements),'">','     <section name="mesh3dprisms" />','     <help> upper element list (NaN for element on the upper layer) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lowervertex" type="',class(self.lowervertex),'" default="',convert2str(self.lowervertex),'">','     <section name="mesh3dprisms" />','     <help> lower vertex list (NaN for vertex on the lower surface) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lowerelements" type="',class(self.lowerelements),'" default="',convert2str(self.lowerelements),'">','     <section name="mesh3dprisms" />','     <help> element list (NaN for element on the lower layer) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonboundary" type="',class(self.vertexonboundary),'" default="',convert2str(self.vertexonboundary),'">','     <section name="mesh3dprisms" />','     <help> vertices on the boundary of the domain flag list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexconnectivity" type="',class(self.vertexconnectivity),'" default="',convert2str(self.vertexconnectivity),'">','     <section name="mesh3dprisms" />','     <help> list of vertices connected to vertex_i </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementconnectivity" type="',class(self.elementconnectivity),'" default="',convert2str(self.elementconnectivity),'">','     <section name="mesh3dprisms" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="average_vertex_connectivity" type="',class(self.average_vertex_connectivity),'" default="',convert2str(self.average_vertex_connectivity),'">','     <section name="mesh3dprisms" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
+ 			fprintf(fid,'%s\n%s\n','</frame>');
+ 
+ 			% Extracted model
+ 			fprintf(fid,'%s\n%s\n%s\n','<frame key="4" label="Extracted Model">','<section name="mesh3dprisms" />'); 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedvertices" type="',class(obj.extractedvertices),'" default="',convert2str(obj.extractedvertices),'">','     <section name="mesh3dprisms" />','     <help> vertices extracted from the model </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedelements" type="',class(obj.extractedelements),'" default="',convert2str(obj.extractedelements),'">','     <section name="mesh3dprisms" />','     <help> elements extracted from the model </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedvertices" type="',class(self.extractedvertices),'" default="',convert2str(self.extractedvertices),'">','     <section name="mesh3dprisms" />','     <help> vertices extracted from the model </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedelements" type="',class(self.extractedelements),'" default="',convert2str(self.extractedelements),'">','     <section name="mesh3dprisms" />','     <help> elements extracted from the model </help>','  </parameter>');
+ 			fprintf(fid,'%s\n%s\n','</frame>');
+ 
+ 			% Projection
+ 			fprintf(fid,'%s\n%s\n%s\n','<frame key="5" label="Projection">','<section name="mesh3dprisms" />'); 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lat" type="',class(obj.lat),'" default="',convert2str(obj.lat),'">','     <section name="mesh3dprisms" />','     <help> vertices latitude [degrees] </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="long" type="',class(obj.long),'" default="',convert2str(obj.long),'">','     <section name="mesh3dprisms" />','     <help> verticies longitude [degrees] </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="epsg" type="',class(obj.epsg),'" default="',convert2str(obj.epsg),'">','     <section name="mesh3dprisms" />','     <help> Indicate epsg ''n'' or ''s'' </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lat" type="',class(self.lat),'" default="',convert2str(self.lat),'">','     <section name="mesh3dprisms" />','     <help> vertices latitude [degrees] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="long" type="',class(self.long),'" default="',convert2str(self.long),'">','     <section name="mesh3dprisms" />','     <help> verticies longitude [degrees] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="epsg" type="',class(self.epsg),'" default="',convert2str(self.epsg),'">','     <section name="mesh3dprisms" />','     <help> Indicate epsg ''n'' or ''s'' </help>','  </parameter>');
+ 			fprintf(fid,'%s\n%s\n','</frame>');
+ 
+ 		end % }}}cd
+@@ -132,16 +132,16 @@
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%the connectivity is the averaged number of nodes linked to a
+ 			%given node through an edge. This connectivity is used to initially
+ 			%allocate memory to the stiffness matrix. A value of 16 seems to
+ 			%give a good memory/time ration. This value can be checked in
+ 			%trunk/test/Miscellaneous/runme.m
+-			obj.average_vertex_connectivity=25;
++			self.average_vertex_connectivity=25;
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			md = checkfield(md,'fieldname','mesh.x','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','mesh.y','NaN',1,'size',[md.mesh.numberofvertices 1]);
+@@ -160,74 +160,74 @@
+ 			md = checkfield(md,'fieldname','mesh.z','<=',md.geometry.surface+10^-10,'message','''mesh.z'' higher than surface elevation');
+ 			md = checkfield(md,'fieldname','mesh.average_vertex_connectivity','>=',24,'message','''mesh.average_vertex_connectivity'' should be at least 24 in 3d');
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   3D tetra Mesh:')); 
+ 
+ 			disp(sprintf('\n      Elements and vertices of the original 2d mesh:'));
+-			fielddisplay(obj,'numberofelements2d','number of elements');
+-			fielddisplay(obj,'numberofvertices2d','number of vertices');
+-			fielddisplay(obj,'elements2d','vertex indices of the mesh elements');
+-			fielddisplay(obj,'x2d','vertices x coordinate [m]');
+-			fielddisplay(obj,'y2d','vertices y coordinate [m]');
++			fielddisplay(self,'numberofelements2d','number of elements');
++			fielddisplay(self,'numberofvertices2d','number of vertices');
++			fielddisplay(self,'elements2d','vertex indices of the mesh elements');
++			fielddisplay(self,'x2d','vertices x coordinate [m]');
++			fielddisplay(self,'y2d','vertices y coordinate [m]');
+ 
+ 			disp(sprintf('\n      Elements and vertices of the extruded 3d mesh:'));
+-			fielddisplay(obj,'numberofelements','number of elements');
+-			fielddisplay(obj,'numberofvertices','number of vertices');
+-			fielddisplay(obj,'elements','vertex indices of the mesh elements');
+-			fielddisplay(obj,'x','vertices x coordinate [m]');
+-			fielddisplay(obj,'y','vertices y coordinate [m]');
+-			fielddisplay(obj,'z','vertices z coordinate [m]');
++			fielddisplay(self,'numberofelements','number of elements');
++			fielddisplay(self,'numberofvertices','number of vertices');
++			fielddisplay(self,'elements','vertex indices of the mesh elements');
++			fielddisplay(self,'x','vertices x coordinate [m]');
++			fielddisplay(self,'y','vertices y coordinate [m]');
++			fielddisplay(self,'z','vertices z coordinate [m]');
+ 
+ 			disp(sprintf('\n      Properties:'));
+-			fielddisplay(obj,'numberoflayers','number of extrusion layers');
+-			fielddisplay(obj,'vertexonbase','lower vertices flags list');
+-			fielddisplay(obj,'vertexonsurface','upper vertices flags list');
+-			fielddisplay(obj,'uppervertex','upper vertex list (NaN for vertex on the upper surface)');
+-			fielddisplay(obj,'upperelements','upper element list (NaN for element on the upper layer)');
+-			fielddisplay(obj,'lowervertex','lower vertex list (NaN for vertex on the lower surface)');
+-			fielddisplay(obj,'lowerelements','lower element list (NaN for element on the lower layer');
+-			fielddisplay(obj,'vertexonboundary','vertices on the boundary of the domain flag list');
++			fielddisplay(self,'numberoflayers','number of extrusion layers');
++			fielddisplay(self,'vertexonbase','lower vertices flags list');
++			fielddisplay(self,'vertexonsurface','upper vertices flags list');
++			fielddisplay(self,'uppervertex','upper vertex list (NaN for vertex on the upper surface)');
++			fielddisplay(self,'upperelements','upper element list (NaN for element on the upper layer)');
++			fielddisplay(self,'lowervertex','lower vertex list (NaN for vertex on the lower surface)');
++			fielddisplay(self,'lowerelements','lower element list (NaN for element on the lower layer');
++			fielddisplay(self,'vertexonboundary','vertices on the boundary of the domain flag list');
+ 
+-			fielddisplay(obj,'vertexconnectivity','list of vertices connected to vertex_i');
+-			fielddisplay(obj,'elementconnectivity','list of vertices connected to element_i');
+-			fielddisplay(obj,'average_vertex_connectivity','average number of vertices connected to one vertex');
++			fielddisplay(self,'vertexconnectivity','list of vertices connected to vertex_i');
++			fielddisplay(self,'elementconnectivity','list of vertices connected to element_i');
++			fielddisplay(self,'average_vertex_connectivity','average number of vertices connected to one vertex');
+ 
+ 			disp(sprintf('\n      Extracted model:'));
+-			fielddisplay(obj,'extractedvertices','vertices extracted from the model');
+-			fielddisplay(obj,'extractedelements','elements extracted from the model');
++			fielddisplay(self,'extractedvertices','vertices extracted from the model');
++			fielddisplay(self,'extractedelements','elements extracted from the model');
+ 
+ 			disp(sprintf('\n      Projection:'));
+-			fielddisplay(obj,'lat','vertices latitude [degrees]');
+-			fielddisplay(obj,'long','vertices longitude [degrees]');
+-			fielddisplay(obj,'epsg','EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)');
++			fielddisplay(self,'lat','vertices latitude [degrees]');
++			fielddisplay(self,'long','vertices longitude [degrees]');
++			fielddisplay(self,'epsg','EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'enum',DomainTypeEnum(),'data',StringToEnum(['Domain' domaintype(obj)]),'format','Integer');
+-			WriteData(fid,'enum',DomainDimensionEnum(),'data',dimension(obj),'format','Integer');
+-			WriteData(fid,'enum',MeshElementtypeEnum(),'data',StringToEnum(elementtype(obj)),'format','Integer');
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','x','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','y','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','z','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','elements','format','DoubleMat','mattype',2);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','numberoflayers','format','Integer');
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','numberofelements','format','Integer');
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','numberofvertices','format','Integer');
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','vertexonbase','format','BooleanMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','vertexonsurface','format','BooleanMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','lowerelements','format','DoubleMat','mattype',2);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','upperelements','format','DoubleMat','mattype',2);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','average_vertex_connectivity','format','Integer');
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','elements2d','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','numberofvertices2d','format','Integer');
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','numberofelements2d','format','Integer');
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'enum',DomainTypeEnum(),'data',StringToEnum(['Domain' domaintype(self)]),'format','Integer');
++			WriteData(fid,'enum',DomainDimensionEnum(),'data',dimension(self),'format','Integer');
++			WriteData(fid,'enum',MeshElementtypeEnum(),'data',StringToEnum(elementtype(self)),'format','Integer');
++			WriteData(fid,'object',self,'class','mesh','fieldname','x','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','mesh','fieldname','y','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','mesh','fieldname','z','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','mesh','fieldname','elements','format','DoubleMat','mattype',2);
++			WriteData(fid,'object',self,'class','mesh','fieldname','numberoflayers','format','Integer');
++			WriteData(fid,'object',self,'class','mesh','fieldname','numberofelements','format','Integer');
++			WriteData(fid,'object',self,'class','mesh','fieldname','numberofvertices','format','Integer');
++			WriteData(fid,'object',self,'class','mesh','fieldname','vertexonbase','format','BooleanMat','mattype',1);
++			WriteData(fid,'object',self,'class','mesh','fieldname','vertexonsurface','format','BooleanMat','mattype',1);
++			WriteData(fid,'object',self,'class','mesh','fieldname','lowerelements','format','DoubleMat','mattype',2);
++			WriteData(fid,'object',self,'class','mesh','fieldname','upperelements','format','DoubleMat','mattype',2);
++			WriteData(fid,'object',self,'class','mesh','fieldname','average_vertex_connectivity','format','Integer');
++			WriteData(fid,'object',self,'class','mesh','fieldname','elements2d','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'class','mesh','fieldname','numberofvertices2d','format','Integer');
++			WriteData(fid,'object',self,'class','mesh','fieldname','numberofelements2d','format','Integer');
+ 		end % }}}
+-		function t = domaintype(obj) % {{{
++		function t = domaintype(self) % {{{
+ 			t = '3D';
+ 		end % }}}
+-		function d = dimension(obj) % {{{
++		function d = dimension(self) % {{{
+ 			d = 3;
+ 		end % }}}
+-		function s = elementtype(obj) % {{{
++		function s = elementtype(self) % {{{
+ 			s = 'Tetra';
+ 		end % }}}
+ 	end
+Index: ../trunk-jpl/src/m/classes/linearbasalforcings.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/linearbasalforcings.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/linearbasalforcings.m	(revision 19040)
+@@ -12,17 +12,17 @@
+ 		geothermalflux            = NaN;
+ 	end
+ 	methods
+-     function createxml(obj,fid) % {{{
++     function createxml(self,fid) % {{{
+             fprintf(fid, '\n\n');
+             fprintf(fid, '%s\n', '<!-- basalforcings -->');
+-			 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="melting_rate" type="',            class(obj.melting_rate),'" default="',              num2str(obj.melting_rate),'">',              '     <section name="basalforcings" />','     <help> basal melting rate (positive if melting) [m/yr] </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',        '<parameter key ="geothermalflux" type="',          class(obj.geothermalflux),'" default="',            num2str(obj.geothermalflux),'">',            '     <section name="basalforcings" />','     <help> geothermal heat flux [W/m^2] </help>','</parameter>');
++			 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="melting_rate" type="',            class(self.melting_rate),'" default="',              num2str(self.melting_rate),'">',              '     <section name="basalforcings" />','     <help> basal melting rate (positive if melting) [m/yr] </help>','</parameter>');
++             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',        '<parameter key ="geothermalflux" type="',          class(self.geothermalflux),'" default="',            num2str(self.geothermalflux),'">',            '     <section name="basalforcings" />','     <help> geothermal heat flux [W/m^2] </help>','</parameter>');
+              
+         end % }}}
+-		function obj = linearbasalforcings(varargin) % {{{
++		function self = linearbasalforcings(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+ 					obj=structtoobj(linearbasalforcings(),varargin{1});
+ 				otherwise
+@@ -37,15 +37,15 @@
+ 			end
+ 
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%default values for melting parameterization
+-			obj.deepwater_melting_rate = 50;
+-			obj.deepwater_elevation    = -800;
+-			obj.upperwater_elevation   = -400;
++			self.deepwater_melting_rate = 50;
++			self.deepwater_elevation    = -800;
++			self.upperwater_elevation   = -400;
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			if ismember(MasstransportAnalysisEnum(),analyses) & ~(solution==TransientSolutionEnum() & md.transient.ismasstransport==0),
+ 				md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'timeseries',1);
+@@ -67,17 +67,17 @@
+ 				md = checkfield(md,'fieldname','basalforcings.geothermalflux','NaN',1,'timeseries',1,'>=',0);
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   basal forcings parameters:'));
+ 
+-			fielddisplay(obj,'groundedice_melting_rate','basal melting rate (positive if melting) [m/yr]');
+-			fielddisplay(obj,'deepwater_melting_rate','basal melting rate (positive if melting applied for floating ice whith base < deepwater_elevation) [m/yr]');
+-			fielddisplay(obj,'deepwater_elevation','elevation of ocean deepwater [m]');
+-			fielddisplay(obj,'upperwater_elevation','elevation of ocean upperwater [m]');
+-			fielddisplay(obj,'geothermalflux','geothermal heat flux [W/m^2]');
++			fielddisplay(self,'groundedice_melting_rate','basal melting rate (positive if melting) [m/yr]');
++			fielddisplay(self,'deepwater_melting_rate','basal melting rate (positive if melting applied for floating ice whith base < deepwater_elevation) [m/yr]');
++			fielddisplay(self,'deepwater_elevation','elevation of ocean deepwater [m]');
++			fielddisplay(self,'upperwater_elevation','elevation of ocean upperwater [m]');
++			fielddisplay(self,'geothermalflux','geothermal heat flux [W/m^2]');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			yts=365.0*24.0*3600.0;
+ 
+@@ -87,11 +87,11 @@
+ 			floatingice_melting_rate(pos)=md.basalforcings.deepwater_melting_rate*(md.geometry.base(pos)-md.basalforcings.upperwater_elevation)/(md.basalforcings.deepwater_elevation-md.basalforcings.upperwater_elevation);
+ 			WriteData(fid,'enum',BasalforcingsEnum(),'data',LinearFloatingMeltRateEnum(),'format','Integer');
+ 			WriteData(fid,'data',floatingice_melting_rate,'format','DoubleMat','enum',BasalforcingsFloatingiceMeltingRateEnum(),'mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
+-			WriteData(fid,'object',obj,'fieldname','groundedice_melting_rate','format','DoubleMat','enum',BasalforcingsGroundediceMeltingRateEnum(),'mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
+-			WriteData(fid,'object',obj,'fieldname','geothermalflux','enum',BasalforcingsGeothermalfluxEnum(),'format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'fieldname','deepwater_melting_rate','format','Double','enum',BasalforcingsDeepwaterMeltingRateEnum(),'scale',1./yts)
+-			WriteData(fid,'object',obj,'fieldname','deepwater_elevation','format','Double','enum',BasalforcingsDeepwaterElevationEnum())
+-			WriteData(fid,'object',obj,'fieldname','upperwater_elevation','format','Double','enum',BasalforcingsUpperwaterElevationEnum())
++			WriteData(fid,'object',self,'fieldname','groundedice_melting_rate','format','DoubleMat','enum',BasalforcingsGroundediceMeltingRateEnum(),'mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++			WriteData(fid,'object',self,'fieldname','geothermalflux','enum',BasalforcingsGeothermalfluxEnum(),'format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'fieldname','deepwater_melting_rate','format','Double','enum',BasalforcingsDeepwaterMeltingRateEnum(),'scale',1./yts)
++			WriteData(fid,'object',self,'fieldname','deepwater_elevation','format','Double','enum',BasalforcingsDeepwaterElevationEnum())
++			WriteData(fid,'object',self,'fieldname','upperwater_elevation','format','Double','enum',BasalforcingsUpperwaterElevationEnum())
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/steadystate.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/steadystate.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/steadystate.m	(revision 19040)
+@@ -10,41 +10,41 @@
+ 		requested_outputs = {};
+ 	end
+ 	methods
+-        function createxml(obj,fid) % {{{
++        function createxml(self,fid) % {{{
+             fprintf(fid, '<!-- steadystate -->\n');            
+                     
+             % steadystate solution parameters
+             fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="steadystate solution parameters">','<section name="steadystate" />');                    
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="reltol" type="',class(obj.reltol),'" default="',convert2str(obj.reltol),'">','     <section name="steadystate" />','     <help> relative tolerance criterion [K] </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="maxiter" type="',class(obj.maxiter),'" default="',convert2str(obj.maxiter),'">','     <section name="steadystate" />','     <help> maximum number of iterations </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="requested_outputs" type="',class(obj.requested_outputs),'" default="',convert2str(obj.requested_outputs),'">','     <section name="steadystate" />','     <help> additional requested outputs </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="reltol" type="',class(self.reltol),'" default="',convert2str(self.reltol),'">','     <section name="steadystate" />','     <help> relative tolerance criterion [K] </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="maxiter" type="',class(self.maxiter),'" default="',convert2str(self.maxiter),'">','     <section name="steadystate" />','     <help> maximum number of iterations </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="requested_outputs" type="',class(self.requested_outputs),'" default="',convert2str(self.requested_outputs),'">','     <section name="steadystate" />','     <help> additional requested outputs </help>','  </parameter>');
+             fprintf(fid,'%s\n%s\n','</frame>');    
+         
+         end % }}}
+-		function obj = steadystate(varargin) % {{{
++		function self = steadystate(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 			%maximum of steady state iterations
+-			obj.maxiter=100;
++			self.maxiter=100;
+ 
+ 			%Relative tolerance for the steadystate convertgence
+-			obj.reltol=0.01;
++			self.reltol=0.01;
+ 
+ 			%default output
+-			obj.requested_outputs={'default'};
++			self.requested_outputs={'default'};
+ 		end % }}}
+ 		function list=defaultoutputs(self,md) % {{{
+ 
+ 			list =  [md.stressbalance.defaultoutputs(md) md.thermal.defaultoutputs(md)];
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return
+ 			if solution~=SteadystateSolutionEnum(), return; end;
+@@ -58,24 +58,24 @@
+ 				md = checkmessage(md,['for a steadystate computation, stressbalance.reltol (relative convergence criterion) must be defined!']);
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   steadystate solution parameters:'));
+ 
+-			fielddisplay(obj,'reltol','relative tolerance criterion');
+-			fielddisplay(obj,'maxiter','maximum number of iterations');
+-			fielddisplay(obj,'requested_outputs','additional requested outputs');
++			fielddisplay(self,'reltol','relative tolerance criterion');
++			fielddisplay(self,'maxiter','maximum number of iterations');
++			fielddisplay(self,'requested_outputs','additional requested outputs');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'object',obj,'fieldname','reltol','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','maxiter','format','Integer');
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'object',self,'fieldname','reltol','format','Double');
++			WriteData(fid,'object',self,'fieldname','maxiter','format','Integer');
+ 
+ 			%process requested outputs
+-			outputs = obj.requested_outputs;
++			outputs = self.requested_outputs;
+ 			pos  = find(ismember(outputs,'default'));
+ 			if ~isempty(pos),
+ 				outputs(pos) = [];                         %remove 'default' from outputs
+-				outputs      = [outputs defaultoutputs(obj,md)]; %add defaults
++				outputs      = [outputs defaultoutputs(self,md)]; %add defaults
+ 			end
+ 			WriteData(fid,'data',outputs,'enum',SteadystateRequestedOutputsEnum,'format','StringArray');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/misfit.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/misfit.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/misfit.m	(revision 19040)
+@@ -27,67 +27,67 @@
+ 	end
+ 	
+ 	methods
+-		function obj = misfit(varargin) % {{{
++		function self = misfit(varargin) % {{{
+ 			if nargin==0,
+-				obj=setdefaultparameters(obj);
++				self=setdefaultparameters(self);
+ 			else
+ 				%use provided options to change fields
+ 				options=pairoptions(varargin{:});
+ 
+ 				%get name
+-				obj.name=getfieldvalue(options,'name','');
+-				obj.definitionenum=getfieldvalue(options,'definitionenum');
+-				obj.model_enum=getfieldvalue(options,'model_enum');
+-				obj.observation=getfieldvalue(options,'observation',NaN);
+-				obj.observation_enum=getfieldvalue(options,'observation_enum');
+-				obj.timeinterpolation=getfieldvalue(options,'timeinterpolation','nearestneighbor');
+-				obj.weights=getfieldvalue(options,'weights',NaN);
+-				obj.weights_enum=getfieldvalue(options,'weights_enum',NaN);
++				self.name=getfieldvalue(options,'name','');
++				self.definitionenum=getfieldvalue(options,'definitionenum');
++				self.model_enum=getfieldvalue(options,'model_enum');
++				self.observation=getfieldvalue(options,'observation',NaN);
++				self.observation_enum=getfieldvalue(options,'observation_enum');
++				self.timeinterpolation=getfieldvalue(options,'timeinterpolation','nearestneighbor');
++				self.weights=getfieldvalue(options,'weights',NaN);
++				self.weights_enum=getfieldvalue(options,'weights_enum',NaN);
+ 
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
+-			obj.timeinterpolation='nearestneighbor';
++		function self = setdefaultparameters(self) % {{{
++			self.timeinterpolation='nearestneighbor';
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+-			if ~ischar(obj.name),
++			if ~ischar(self.name),
+ 				error('misfit error message: ''name'' field should be a string!');
+ 			end
+-			md = checkfield(md,'fieldname','obj.definitionenum','field',obj.definitionenum,'values',[Outputdefinition1Enum,Outputdefinition2Enum,Outputdefinition3Enum,Outputdefinition4Enum,Outputdefinition5Enum,Outputdefinition6Enum,Outputdefinition7Enum,Outputdefinition8Enum,Outputdefinition9Enum,Outputdefinition10Enum]);
++			md = checkfield(md,'fieldname','self.definitionenum','field',self.definitionenum,'values',[Outputdefinition1Enum,Outputdefinition2Enum,Outputdefinition3Enum,Outputdefinition4Enum,Outputdefinition5Enum,Outputdefinition6Enum,Outputdefinition7Enum,Outputdefinition8Enum,Outputdefinition9Enum,Outputdefinition10Enum]);
+ 
+-			if ~ischar(obj.timeinterpolation),
++			if ~ischar(self.timeinterpolation),
+ 				error('misfit error message: ''timeinterpolation'' field should be a string!');
+ 			end
+-			md = checkfield(md,'fieldname','obj.observation','field',obj.observation,'timeseries',1,'NaN',1);
+-			md = checkfield(md,'fieldname','obj.timeinterpolation','field',obj.timeinterpolation,'values',{'nearestneighbor'});
+-			md = checkfield(md,'fieldname','obj.weights','field',obj.weights,'timeseries',1,'NaN',1);
++			md = checkfield(md,'fieldname','self.observation','field',self.observation,'timeseries',1,'NaN',1);
++			md = checkfield(md,'fieldname','self.timeinterpolation','field',self.timeinterpolation,'values',{'nearestneighbor'});
++			md = checkfield(md,'fieldname','self.weights','field',self.weights,'timeseries',1,'NaN',1);
+ 
+ 		end % }}}
+-		function md = disp(obj) % {{{
++		function md = disp(self) % {{{
+ 		
+ 			disp(sprintf('   Misfit:\n'));
+ 
+-			fielddisplay(obj,'name','identifier for this misfit response');
+-			fielddisplay(obj,'definitionenum','enum that identifies this output definition uniquely, from Outputdefinition[1-10]Enum');
+-			fielddisplay(obj,'model_enum','enum for field that is modeled');
+-			fielddisplay(obj,'observation','observed field that we compare the model against');
+-			fielddisplay(obj,'observation_enum','observation enum');
+-			fielddisplay(obj,'timeinterpolation','interpolation routine used to interpolate misfit between two time steps (default is ''nearestneighbor''');
+-			fielddisplay(obj,'weights','weights (at vertices) to apply to the misfit');
+-			fielddisplay(obj,'weights_enum','enum for weights for identification purposes');
++			fielddisplay(self,'name','identifier for this misfit response');
++			fielddisplay(self,'definitionenum','enum that identifies this output definition uniquely, from Outputdefinition[1-10]Enum');
++			fielddisplay(self,'model_enum','enum for field that is modeled');
++			fielddisplay(self,'observation','observed field that we compare the model against');
++			fielddisplay(self,'observation_enum','observation enum');
++			fielddisplay(self,'timeinterpolation','interpolation routine used to interpolate misfit between two time steps (default is ''nearestneighbor''');
++			fielddisplay(self,'weights','weights (at vertices) to apply to the misfit');
++			fielddisplay(self,'weights_enum','enum for weights for identification purposes');
+ 
+ 		end % }}}
+-		function md = marshall(obj,md,fid) % {{{
++		function md = marshall(self,md,fid) % {{{
+ 
+-		WriteData(fid,'object',obj,'fieldname','name','format','String');
+-		WriteData(fid,'object',obj,'fieldname','definitionenum','format','Integer');
+-		WriteData(fid,'object',obj,'fieldname','model_enum','format','Integer');
+-		WriteData(fid,'object',obj,'fieldname','observation','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+-		WriteData(fid,'object',obj,'fieldname','observation_enum','format','Integer');
+-		WriteData(fid,'object',obj,'fieldname','timeinterpolation','format','String');
+-		WriteData(fid,'object',obj,'fieldname','weights','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+-		WriteData(fid,'object',obj,'fieldname','weights_enum','format','Integer');
++		WriteData(fid,'object',self,'fieldname','name','format','String');
++		WriteData(fid,'object',self,'fieldname','definitionenum','format','Integer');
++		WriteData(fid,'object',self,'fieldname','model_enum','format','Integer');
++		WriteData(fid,'object',self,'fieldname','observation','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++		WriteData(fid,'object',self,'fieldname','observation_enum','format','Integer');
++		WriteData(fid,'object',self,'fieldname','timeinterpolation','format','String');
++		WriteData(fid,'object',self,'fieldname','weights','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++		WriteData(fid,'object',self,'fieldname','weights_enum','format','Integer');
+ 
+ 		end % }}}
+ 	end
+Index: ../trunk-jpl/src/m/classes/matseaice.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/matseaice.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/matseaice.m	(revision 19040)
+@@ -17,10 +17,10 @@
+ 		time_relaxation_damage  = 0.;
+ 	end
+ 	methods
+-		function obj = matseaice(varargin) % {{{
++		function self = matseaice(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+ 					inputstruct=varargin{1};
+ 					list1 = properties('matseaice');
+@@ -28,49 +28,49 @@
+ 					for i=1:length(list1)
+ 						fieldname = list1{i};
+ 						if ismember(fieldname,list2),
+-							obj.(fieldname) = inputstruct.(fieldname);
++							self.(fieldname) = inputstruct.(fieldname);
+ 						end
+ 					end
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%Ice density
+-			obj.rho_ice = 917.; %kg/m^3
++			self.rho_ice = 917.; %kg/m^3
+ 
+ 			%poisson modulus
+-			obj.poisson=0.3;
++			self.poisson=0.3;
+ 
+ 			%Young modulus
+-			obj.young_modulus=9.e+9;
++			self.young_modulus=9.e+9;
+ 
+ 			%ridging exponent
+-			obj.ridging_exponent=-20.;
++			self.ridging_exponent=-20.;
+ 
+ 			%Cohesion (Weiss 2007)
+-			obj.cohesion = 40.e+3; %40 kPa
++			self.cohesion = 40.e+3; %40 kPa
+ 
+ 			%internal_friction_coef 
+-			obj.internal_friction_coef=0.7;
++			self.internal_friction_coef=0.7;
+ 
+ 			%compression_coef (Bouillon and Rampal 2014)
+-			obj.compression_coef=5./2;
++			self.compression_coef=5./2;
+ 
+ 			%traction_coef (Bouillon and Rampal 2014)
+-			obj.traction_coef=5./6.;
++			self.traction_coef=5./6.;
+ 
+ 			%Time relaxation stress
+ 			%1e20 for the elastic case (perfect memory of the stress), equal to the timestep for the viscous case (no memory of the stress)
+-			obj.time_relaxation_stress=1.e+20;
++			self.time_relaxation_stress=1.e+20;
+ 
+ 			%Time relaxation damage
+ 			%1e20 for the brittle case (perfect memory of the damage), equal to the timestep for the plastic case (no memory of the damage)
+-			obj.time_relaxation_damage=1.e+20;
++			self.time_relaxation_damage=1.e+20;
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 			md = checkfield(md,'fieldname','materials.rho_ice','NaN',1,'>',0,'numel',1);
+ 			md = checkfield(md,'fieldname','materials.poisson','NaN',1,'>',0,'<',.5,'numel',1);
+ 			md = checkfield(md,'fieldname','materials.young_modulus','NaN',1,'>',0,'numel',1);
+@@ -81,31 +81,31 @@
+ 			md = checkfield(md,'fieldname','materials.traction_coef','NaN',1,'>',0,'<',1,'numel',1);
+ 			md = checkfield(md,'fieldname','materials.time_relaxation_stress','NaN',1,'>',md.timestepping.time_step,'numel',1);
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   Sea Ice Material:'));
+-			fielddisplay(obj,'rho_ice','ice density [kg/m^3]');
+-			fielddisplay(obj,'poisson','poisson ratio for undamaged ice [no unit]');
+-			fielddisplay(obj,'young_modulus','Young modulus for undamaged ice [Pa]');
+-			fielddisplay(obj,'ridging_exponent','Riging exponent (c, Hibler parameter) [no unit]');
+-			fielddisplay(obj,'cohesion','cohesion (C) [Pa]');
+-			fielddisplay(obj,'internal_friction_coef','Mohr-Coulomb internal friction coefficient (mu=tan(phi)) [no unit]');
+-			fielddisplay(obj,'compression_coef','Ratio between cutoff compressive strength and the cohesion [no unit]');
+-			fielddisplay(obj,'traction_coef','Ratio between cutoff tensile strength and Mohr-Coulomb tensile strength [no unit]');
+-			fielddisplay(obj,'time_relaxation_stress','Relaxation time for stress (1e+20: elastic, dt: viscous) [s]');
+-			fielddisplay(obj,'time_relaxation_damage','Relaxation time for damage (1e+20: brittle, dt: plastic) [s]');
++			fielddisplay(self,'rho_ice','ice density [kg/m^3]');
++			fielddisplay(self,'poisson','poisson ratio for undamaged ice [no unit]');
++			fielddisplay(self,'young_modulus','Young modulus for undamaged ice [Pa]');
++			fielddisplay(self,'ridging_exponent','Riging exponent (c, Hibler parameter) [no unit]');
++			fielddisplay(self,'cohesion','cohesion (C) [Pa]');
++			fielddisplay(self,'internal_friction_coef','Mohr-Coulomb internal friction coefficient (mu=tan(phi)) [no unit]');
++			fielddisplay(self,'compression_coef','Ratio between cutoff compressive strength and the cohesion [no unit]');
++			fielddisplay(self,'traction_coef','Ratio between cutoff tensile strength and Mohr-Coulomb tensile strength [no unit]');
++			fielddisplay(self,'time_relaxation_stress','Relaxation time for stress (1e+20: elastic, dt: viscous) [s]');
++			fielddisplay(self,'time_relaxation_damage','Relaxation time for damage (1e+20: brittle, dt: plastic) [s]');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 			WriteData(fid,'enum',MaterialsEnum(),'data',MatseaiceEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','rho_ice','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','poisson','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','young_modulus','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','ridging_exponent','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','cohesion','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','internal_friction_coef','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','compression_coef','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','traction_coef','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','time_relaxation_stress','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','time_relaxation_damage','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','rho_ice','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','poisson','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','young_modulus','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','ridging_exponent','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','cohesion','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','internal_friction_coef','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','compression_coef','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','traction_coef','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','time_relaxation_stress','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','time_relaxation_damage','format','Double');
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/autodiff.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/autodiff.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/autodiff.m	(revision 19040)
+@@ -19,46 +19,46 @@
+ 		end
+ 		%}}}
+ 	methods
+-     	function createxml(obj,fid) % {{{
++     	function createxml(self,fid) % {{{
+             fprintf(fid, '<!-- autodiff -->\n');            
+                     
+             % automatic differentiation parameters 
+             fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="automatic differentiation parameters">','<section name="autodiff" />');                    
+-                fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n','  <parameter key ="isautodiff" type="',class(obj.isautodiff),'" optional="false">','     <section name="autodiff" />','         <option value="',convert2str(obj.isautodiff),'" type="string" default="true"></option>','     <help> indicates if the automatic differentiation is activated </help>','  </parameter>');
++                fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n','  <parameter key ="isautodiff" type="',class(self.isautodiff),'" optional="false">','     <section name="autodiff" />','         <option value="',convert2str(self.isautodiff),'" type="string" default="true"></option>','     <help> indicates if the automatic differentiation is activated </help>','  </parameter>');
+              
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="dependents" type="',class(obj.dependents),'" default="',convert2str(obj.dependents),'">','     <section name="autodiff" />','     <help> list of dependent variables </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="independents" type="',class(obj.independents),'" default="',convert2str(obj.independents),'">','     <section name="autodiff" />','     <help> list of independent variables </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="driver" type="',class(obj.driver),'" default="',convert2str(obj.driver),'">','     <section name="autodiff" />','     <help> ADOLC driver (''fos_forward'' or ''fov_forward'') </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="obufsize" type="',class(obj.obufsize),'" default="',convert2str(obj.obufsize),'">','     <section name="autodiff" />','     <help> Number of operations per buffer (==OBUFSIZE in usrparms.h)  </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lbufsize" type="',class(obj.lbufsize),'" default="',convert2str(obj.lbufsize),'">','     <section name="autodiff" />','     <help> Number of locations per buffer (==LBUFSIZE in usrparms.h) </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="cbufsize" type="',class(obj.cbufsize),'" default="',convert2str(obj.cbufsize),'">','     <section name="autodiff" />','     <help> Number of values per buffer (==CBUFSIZE in usrparms.h) </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="tbufsize" type="',class(obj.tbufsize),'" default="',convert2str(obj.tbufsize),'">','     <section name="autodiff" />','     <help> Number of taylors per buffer (&amp;lt;=TBUFSIZE in usrparms.h) </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="gcTriggerRatio" type="',class(obj.gcTriggerRatio),'" default="',convert2str(obj.gcTriggerRatio),'">','     <section name="autodiff" />','     <help> free location block sorting/consolidation triggered if the ratio between allocated and used locations exceeds gcTriggerRatio </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="gcTriggerRatio" type="',class(obj.gcTriggerRatio),'" default="',convert2str(obj.gcTriggerRatio),'">','     <section name="autodiff" />','     <help> free location block sorting/consolidation triggered if the allocated locations exceed gcTriggerMaxSize </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="dependents" type="',class(self.dependents),'" default="',convert2str(self.dependents),'">','     <section name="autodiff" />','     <help> list of dependent variables </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="independents" type="',class(self.independents),'" default="',convert2str(self.independents),'">','     <section name="autodiff" />','     <help> list of independent variables </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="driver" type="',class(self.driver),'" default="',convert2str(self.driver),'">','     <section name="autodiff" />','     <help> ADOLC driver (''fos_forward'' or ''fov_forward'') </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="obufsize" type="',class(self.obufsize),'" default="',convert2str(self.obufsize),'">','     <section name="autodiff" />','     <help> Number of operations per buffer (==OBUFSIZE in usrparms.h)  </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lbufsize" type="',class(self.lbufsize),'" default="',convert2str(self.lbufsize),'">','     <section name="autodiff" />','     <help> Number of locations per buffer (==LBUFSIZE in usrparms.h) </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="cbufsize" type="',class(self.cbufsize),'" default="',convert2str(self.cbufsize),'">','     <section name="autodiff" />','     <help> Number of values per buffer (==CBUFSIZE in usrparms.h) </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="tbufsize" type="',class(self.tbufsize),'" default="',convert2str(self.tbufsize),'">','     <section name="autodiff" />','     <help> Number of taylors per buffer (&amp;lt;=TBUFSIZE in usrparms.h) </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="gcTriggerRatio" type="',class(self.gcTriggerRatio),'" default="',convert2str(self.gcTriggerRatio),'">','     <section name="autodiff" />','     <help> free location block sorting/consolidation triggered if the ratio between allocated and used locations exceeds gcTriggerRatio </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="gcTriggerRatio" type="',class(self.gcTriggerRatio),'" default="',convert2str(self.gcTriggerRatio),'">','     <section name="autodiff" />','     <help> free location block sorting/consolidation triggered if the allocated locations exceed gcTriggerMaxSize </help>','  </parameter>');
+             
+             fprintf(fid,'%s\n%s\n','</frame>');    
+         
+         end % }}}
+-		function obj = autodiff(varargin) % {{{
++		function self = autodiff(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
+-		obj.obufsize     = 524288;
+-		obj.lbufsize     = 524288;
+-		obj.cbufsize     = 524288;
+-		obj.tbufsize     = 524288;
+-		obj.gcTriggerRatio=2.0;
+-		obj.gcTriggerMaxSize=65536;
++		function self = setdefaultparameters(self) % {{{
++		self.obufsize     = 524288;
++		self.lbufsize     = 524288;
++		self.cbufsize     = 524288;
++		self.tbufsize     = 524288;
++		self.gcTriggerRatio=2.0;
++		self.gcTriggerMaxSize=65536;
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return 
+-			if ~obj.isautodiff, return; end
++			if ~self.isautodiff, return; end
+ 
+ 			%Driver value:
+ 			md = checkfield(md,'fieldname','autodiff.driver','values',{'fos_forward','fov_forward','fov_forward_all','fos_reverse','fov_reverse','fov_reverse_all'});
+@@ -72,51 +72,51 @@
+ 			md = checkfield(md,'fieldname','autodiff.gcTriggerMaxSize','>=',65536);
+ 
+ 			%go through our dependents and independents and check consistency: 
+-			for i=1:numel(obj.dependents),
+-				dep=obj.dependents{i};
++			for i=1:numel(self.dependents),
++				dep=self.dependents{i};
+ 				md=checkconsistency(dep,md,solution,analyses);
+ 			end
+-			for i=1:numel(obj.independents),
+-				indep=obj.independents{i};
+-				md=checkconsistency(indep,md,i,solution,analyses,obj.driver);
++			for i=1:numel(self.independents),
++				indep=self.independents{i};
++				md=checkconsistency(indep,md,i,solution,analyses,self.driver);
+ 			end
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   automatic differentiation parameters:'));
+-			fielddisplay(obj,'isautodiff','indicates if the automatic differentiation is activated');
+-			fielddisplay(obj,'dependents','list of dependent variables');
+-			fielddisplay(obj,'independents','list of independent variables');
+-			fielddisplay(obj,'driver','ADOLC driver (''fos_forward'' or ''fov_forward'')');
+-			fielddisplay(obj,'obufsize','Number of operations per buffer (==OBUFSIZE in usrparms.h)');
+-			fielddisplay(obj,'lbufsize','Number of locations per buffer (==LBUFSIZE in usrparms.h)');
+-			fielddisplay(obj,'cbufsize','Number of values per buffer (==CBUFSIZE in usrparms.h)');
+-			fielddisplay(obj,'tbufsize','Number of taylors per buffer (<=TBUFSIZE in usrparms.h)');
+-			fielddisplay(obj,'gcTriggerRatio','free location block sorting/consolidation triggered if the ratio between allocated and used locations exceeds gcTriggerRatio');
+-			fielddisplay(obj,'gcTriggerMaxSize','free location block sorting/consolidation triggered if the allocated locations exceed gcTriggerMaxSize');
++			fielddisplay(self,'isautodiff','indicates if the automatic differentiation is activated');
++			fielddisplay(self,'dependents','list of dependent variables');
++			fielddisplay(self,'independents','list of independent variables');
++			fielddisplay(self,'driver','ADOLC driver (''fos_forward'' or ''fov_forward'')');
++			fielddisplay(self,'obufsize','Number of operations per buffer (==OBUFSIZE in usrparms.h)');
++			fielddisplay(self,'lbufsize','Number of locations per buffer (==LBUFSIZE in usrparms.h)');
++			fielddisplay(self,'cbufsize','Number of values per buffer (==CBUFSIZE in usrparms.h)');
++			fielddisplay(self,'tbufsize','Number of taylors per buffer (<=TBUFSIZE in usrparms.h)');
++			fielddisplay(self,'gcTriggerRatio','free location block sorting/consolidation triggered if the ratio between allocated and used locations exceeds gcTriggerRatio');
++			fielddisplay(self,'gcTriggerMaxSize','free location block sorting/consolidation triggered if the allocated locations exceed gcTriggerMaxSize');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+-			WriteData(fid,'object',obj,'fieldname','isautodiff','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','driver','format','String');
++			WriteData(fid,'object',self,'fieldname','isautodiff','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','driver','format','String');
+ 
+ 			%early return
+-			if ~obj.isautodiff,
++			if ~self.isautodiff,
+ 				WriteData(fid,'data',false,'enum',AutodiffMassFluxSegmentsPresentEnum(),'format','Boolean');
+ 				WriteData(fid,'data',false,'enum',AutodiffKeepEnum(),'format','Boolean');
+ 				return;
+ 			end
+ 
+ 			%buffer sizes {{{
+-			WriteData(fid,'object',obj,'fieldname','obufsize','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','lbufsize','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','cbufsize','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','tbufsize','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','gcTriggerRatio','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','gcTriggerMaxSize','format','Double');
++			WriteData(fid,'object',self,'fieldname','obufsize','format','Double');
++			WriteData(fid,'object',self,'fieldname','lbufsize','format','Double');
++			WriteData(fid,'object',self,'fieldname','cbufsize','format','Double');
++			WriteData(fid,'object',self,'fieldname','tbufsize','format','Double');
++			WriteData(fid,'object',self,'fieldname','gcTriggerRatio','format','Double');
++			WriteData(fid,'object',self,'fieldname','gcTriggerMaxSize','format','Double');
+ 			%}}}
+ 			%process dependent variables {{{
+-			num_dependent_objects=numel(obj.dependents);
++			num_dependent_objects=numel(self.dependents);
+ 			WriteData(fid,'data',num_dependent_objects,'enum',AutodiffNumDependentObjectsEnum(),'format','Integer');
+ 
+ 			if(num_dependent_objects),
+@@ -125,7 +125,7 @@
+ 				indices=zeros(num_dependent_objects,1);
+ 
+ 				for i=1:num_dependent_objects,
+-					dep=obj.dependents{i};
++					dep=self.dependents{i};
+ 
+ 					names{i}=dep.name;
+ 					types(i)=dep.typetoscalar();
+@@ -137,7 +137,7 @@
+ 			end
+ 			%}}}
+ 			%process independent variables {{{
+-			num_independent_objects=numel(obj.independents);
++			num_independent_objects=numel(self.independents);
+ 			WriteData(fid,'data',num_independent_objects,'enum',AutodiffNumIndependentObjectsEnum(),'format','Integer');
+ 
+ 			if(num_independent_objects),
+@@ -145,7 +145,7 @@
+ 				types=zeros(num_independent_objects,1);
+ 
+ 				for i=1:num_independent_objects,
+-					indep=obj.independents{i};
++					indep=self.independents{i};
+ 
+ 					names(i)=StringToEnum(indep.name);
+ 					types(i)=indep.typetoscalar();
+@@ -155,11 +155,11 @@
+ 			end
+ 			%}}}
+ 			%if driver is fos_forward, build index:  {{{
+-			if strcmpi(obj.driver,'fos_forward'),
++			if strcmpi(self.driver,'fos_forward'),
+ 				index=0;
+ 
+ 				for i=1:num_independent_objects,
+-					indep=obj.independents{i};
++					indep=self.independents{i};
+ 					if ~isnan(indep.fos_forward_index),
+ 						index=index+indep.fos_forward_index;
+ 						break;
+@@ -176,11 +176,11 @@
+ 			end
+ 			%}}}
+ 			%if driver is fos_reverse, build index:  {{{
+-			if strcmpi(obj.driver,'fos_reverse'),
++			if strcmpi(self.driver,'fos_reverse'),
+ 				index=0;
+ 
+ 				for i=1:num_dependent_objects,
+-					dep=obj.dependents{i};
++					dep=self.dependents{i};
+ 					if ~isnan(dep.fos_reverse_index),
+ 						index=index+dep.fos_reverse_index;
+ 						break;
+@@ -197,11 +197,11 @@
+ 			end
+ 			%}}}
+ 			%if driver is fov_forward, build indices:  {{{
+-			if strcmpi(obj.driver,'fov_forward'),
++			if strcmpi(self.driver,'fov_forward'),
+ 				indices=0;
+ 
+ 				for i=1:num_independent_objects,
+-					indep=obj.independents{i};
++					indep=self.independents{i};
+ 					if ~isempty(indep.fos_forward_index),
+ 						indices=indices+indep.fov_forward_indices;
+ 						break;
+@@ -220,7 +220,7 @@
+ 			%deal with mass fluxes:  {{{
+ 			mass_flux_segments=cell(0,1);
+ 			for i=1:num_dependent_objects,
+-				dep=obj.dependents{i};
++				dep=self.dependents{i};
+ 				if strcmpi(dep.name,'MassFlux'),
+ 					mass_flux_segments{end+1,1}=dep.segments;
+ 				end
+@@ -243,10 +243,10 @@
+ 			% mode as described in the Section 4 and Section 5. 
+ 			%
+ 
+-			if length(obj.driver)<=3,
++			if length(self.driver)<=3,
+ 				keep=false; %there is no "_reverse" string within the driver string: 
+ 			else
+-				if strncmpi(obj.driver(4:end),'_reverse',8),
++				if strncmpi(self.driver(4:end),'_reverse',8),
+ 					keep=true;
+ 				else
+ 					keep=false;
+Index: ../trunk-jpl/src/m/classes/qmu.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/qmu.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/qmu.m	(revision 19040)
+@@ -23,47 +23,47 @@
+ 		vertex_weight               = NaN;
+ 	end
+ 	methods
+-        function createxml(obj,fid) % {{{
++        function createxml(self,fid) % {{{
+             fprintf(fid, '<!-- qmu -->\n');            
+                     
+             % qmu solution parameters
+             fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="qmu parameters">','<section name="qmu" />');                    
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isdakota" type="',class(obj.isdakota),'" default="',convert2str(obj.isdakota),'">','     <section name="qmu" />','     <help> is qmu analysis activated? </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="variables" type="',class(obj.variables),'" default="',convert2str(obj.variables),'">','     <section name="qmu" />','     <help> (arrays of each variable class) </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="responses" type="',class(obj.responses),'" default="',convert2str(obj.responses),'">','     <section name="qmu" />','     <help> (arrays of each response class) </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isdakota" type="',class(self.isdakota),'" default="',convert2str(self.isdakota),'">','     <section name="qmu" />','     <help> is qmu analysis activated? </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="variables" type="',class(self.variables),'" default="',convert2str(self.variables),'">','     <section name="qmu" />','     <help> (arrays of each variable class) </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="responses" type="',class(self.responses),'" default="',convert2str(self.responses),'">','     <section name="qmu" />','     <help> (arrays of each response class) </help>','  </parameter>');
+                 
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberofresponses" type="',class(obj.numberofresponses),'" default="',convert2str(obj.numberofresponses),'">','     <section name="qmu" />','     <help> number of responses </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="params" type="',class(obj.params),'" default="',convert2str(obj.params),'">','     <section name="qmu" />','     <help> (array of method-independent parameters)  </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="results" type="',class(obj.results),'" default="',convert2str(obj.results),'">','     <section name="qmu" />','     <help> (information from dakota files) </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberofresponses" type="',class(self.numberofresponses),'" default="',convert2str(self.numberofresponses),'">','     <section name="qmu" />','     <help> number of responses </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="params" type="',class(self.params),'" default="',convert2str(self.params),'">','     <section name="qmu" />','     <help> (array of method-independent parameters)  </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="results" type="',class(self.results),'" default="',convert2str(self.results),'">','     <section name="qmu" />','     <help> (information from dakota files) </help>','  </parameter>');
+                 
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="partition" type="',class(obj.partition),'" default="',convert2str(obj.partition),'">','     <section name="qmu" />','     <help> user provided mesh partitioning, defaults to metis if not specified </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberofpartitions" type="',class(obj.numberofpartitions),'" default="',convert2str(obj.numberofpartitions),'">','     <section name="qmu" />','     <help> number of partitions for semi-discrete qmu  </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="variabledescriptors" type="',class(obj.variabledescriptors),'" default="',convert2str(obj.variabledescriptors),'">','     <section name="qmu" />','     <help>  </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="partition" type="',class(self.partition),'" default="',convert2str(self.partition),'">','     <section name="qmu" />','     <help> user provided mesh partitioning, defaults to metis if not specified </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberofpartitions" type="',class(self.numberofpartitions),'" default="',convert2str(self.numberofpartitions),'">','     <section name="qmu" />','     <help> number of partitions for semi-discrete qmu  </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="variabledescriptors" type="',class(self.variabledescriptors),'" default="',convert2str(self.variabledescriptors),'">','     <section name="qmu" />','     <help>  </help>','  </parameter>');
+             
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="responsedescriptors" type="',class(obj.responsedescriptors),'" default="',convert2str(obj.responsedescriptors),'">','     <section name="qmu" />','     <help> use an enthalpy formulation to include temperate ice (default is 0) </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="method" type="',class(obj.method),'" default="',convert2str(obj.method),'">','     <section name="qmu" />','     <help> array of dakota_method class </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="mass_flux_profile_directory" type="',class(obj.mass_flux_profile_directory),'" default="',convert2str(obj.mass_flux_profile_directory),'">','     <section name="qmu" />','     <help> directory for mass flux profiles </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="responsedescriptors" type="',class(self.responsedescriptors),'" default="',convert2str(self.responsedescriptors),'">','     <section name="qmu" />','     <help> use an enthalpy formulation to include temperate ice (default is 0) </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="method" type="',class(self.method),'" default="',convert2str(self.method),'">','     <section name="qmu" />','     <help> array of dakota_method class </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="mass_flux_profile_directory" type="',class(self.mass_flux_profile_directory),'" default="',convert2str(self.mass_flux_profile_directory),'">','     <section name="qmu" />','     <help> directory for mass flux profiles </help>','  </parameter>');
+                 
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="mass_flux_profiles" type="',class(obj.mass_flux_profiles),'" default="',convert2str(obj.mass_flux_profiles),'">','     <section name="qmu" />','     <help>  </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="mass_flux_segments" type="',class(obj.mass_flux_segments),'" default="',convert2str(obj.mass_flux_segments),'">','     <section name="qmu" />','     <help>  </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="adjacency" type="',class(obj.adjacency),'" default="',convert2str(obj.adjacency),'">','     <section name="qmu" />','     <help> additional outputs requested </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertex_weight" type="',class(obj.vertex_weight),'" default="',convert2str(obj.vertex_weight),'">','     <section name="qmu" />','     <help> weight applied to each mesh vertex </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="mass_flux_profiles" type="',class(self.mass_flux_profiles),'" default="',convert2str(self.mass_flux_profiles),'">','     <section name="qmu" />','     <help>  </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="mass_flux_segments" type="',class(self.mass_flux_segments),'" default="',convert2str(self.mass_flux_segments),'">','     <section name="qmu" />','     <help>  </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="adjacency" type="',class(self.adjacency),'" default="',convert2str(self.adjacency),'">','     <section name="qmu" />','     <help> additional outputs requested </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertex_weight" type="',class(self.vertex_weight),'" default="',convert2str(self.vertex_weight),'">','     <section name="qmu" />','     <help> weight applied to each mesh vertex </help>','  </parameter>');
+             
+             fprintf(fid,'%s\n%s\n','</frame>');    
+         
+         end % }}}        
+-		function obj = qmu(varargin) % {{{
++		function self = qmu(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return
+ 			if ~md.qmu.isdakota, return; end
+@@ -89,14 +89,14 @@
+ 				end
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   qmu parameters:'));
+ 
+-			fielddisplay(obj,'isdakota','is qmu analysis activated?');
+-			for i=1:numel(obj.variables)
++			fielddisplay(self,'isdakota','is qmu analysis activated?');
++			for i=1:numel(self.variables)
+ 				disp(sprintf('         variables%s:  (arrays of each variable class)',...
+-					string_dim(obj.variables,i)));
+-				fnames=fieldnames(obj.variables(i));
++					string_dim(self.variables,i)));
++				fnames=fieldnames(self.variables(i));
+ 				maxlen=0;
+ 				for j=1:numel(fnames)
+ 					maxlen=max(maxlen,length(fnames{j}));
+@@ -104,13 +104,13 @@
+ 
+ 				for j=1:numel(fnames)
+ 					disp(sprintf(['            %-' num2str(maxlen+1) 's:    [%ix%i]    ''%s'''],...
+-						fnames{j},size(obj.variables.(fnames{j})),class(obj.variables.(fnames{j}))));
++						fnames{j},size(self.variables.(fnames{j})),class(self.variables.(fnames{j}))));
+ 				end
+ 			end
+-			for i=1:numel(obj.responses)
++			for i=1:numel(self.responses)
+ 				disp(sprintf('         responses%s:  (arrays of each response class)',...
+-					string_dim(obj.responses,i)));
+-				fnames=fieldnames(obj.responses(i));
++					string_dim(self.responses,i)));
++				fnames=fieldnames(self.responses(i));
+ 				maxlen=0;
+ 				for j=1:numel(fnames)
+ 					maxlen=max(maxlen,length(fnames{j}));
+@@ -118,20 +118,20 @@
+ 
+ 				for j=1:numel(fnames)
+ 					disp(sprintf(['            %-' num2str(maxlen+1) 's:    [%ix%i]    ''%s'''],...
+-						fnames{j},size(obj.responses.(fnames{j})),class(obj.responses.(fnames{j}))));
++						fnames{j},size(self.responses.(fnames{j})),class(self.responses.(fnames{j}))));
+ 				end
+ 			end
+-			fielddisplay(obj,'numberofresponses','number of responses') 
+-			for i=1:numel(obj.method);
+-				if strcmp(class(obj.method(i)),'dakota_method')
++			fielddisplay(self,'numberofresponses','number of responses') 
++			for i=1:numel(self.method);
++				if strcmp(class(self.method(i)),'dakota_method')
+ 					disp(sprintf('            method%s :    ''%s''',...
+-						string_dim(obj.method,i),obj.method(i).method));
++						string_dim(self.method,i),self.method(i).method));
+ 				end
+ 			end
+-			for i=1:numel(obj.params)
++			for i=1:numel(self.params)
+ 				disp(sprintf('         params%s:  (array of method-independent parameters)',...
+-					string_dim(obj.params,i)));
+-				fnames=fieldnames(obj.params(i));
++					string_dim(self.params,i)));
++				fnames=fieldnames(self.params(i));
+ 				maxlen=0;
+ 				for j=1:numel(fnames)
+ 					maxlen=max(maxlen,length(fnames{j}));
+@@ -139,13 +139,13 @@
+ 
+ 				for j=1:numel(fnames)
+ 					disp(sprintf(['            %-' num2str(maxlen+1) 's: %s'],...
+-						fnames{j},any2str(obj.params(i).(fnames{j}))));
++						fnames{j},any2str(self.params(i).(fnames{j}))));
+ 				end
+ 			end
+-			for i=1:numel(obj.results)
++			for i=1:numel(self.results)
+ 				disp(sprintf('         results%s:  (information from dakota files)',...
+-					string_dim(obj.results,i)));
+-				fnames=fieldnames(obj.results(i));
++					string_dim(self.results,i)));
++				fnames=fieldnames(self.results(i));
+ 				maxlen=0;
+ 				for j=1:numel(fnames)
+ 					maxlen=max(maxlen,length(fnames{j}));
+@@ -153,34 +153,34 @@
+ 
+ 				for j=1:numel(fnames)
+ 					disp(sprintf(['            %-' num2str(maxlen+1) 's:    [%ix%i]    ''%s'''],...
+-						fnames{j},size(obj.results.(fnames{j})),class(obj.results.(fnames{j}))));
++						fnames{j},size(self.results.(fnames{j})),class(self.results.(fnames{j}))));
+ 				end
+ 			end
+-			fielddisplay(obj,'partition','user provided mesh partitioning, defaults to metis if not specified') 
+-			fielddisplay(obj,'numberofpartitions','number of partitions for semi-discrete qmu') 
+-			fielddisplay(obj,'variabledescriptors','');
+-			fielddisplay(obj,'responsedescriptors','');
+-			fielddisplay(obj,'method','array of dakota_method class');
+-			fielddisplay(obj,'mass_flux_profile_directory','directory for mass flux profiles');
+-			fielddisplay(obj,'mass_flux_profiles','list of mass_flux profiles');
+-			fielddisplay(obj,'mass_flux_segments','');
+-			fielddisplay(obj,'adjacency','');
+-			fielddisplay(obj,'vertex_weight','weight applied to each mesh vertex');
++			fielddisplay(self,'partition','user provided mesh partitioning, defaults to metis if not specified') 
++			fielddisplay(self,'numberofpartitions','number of partitions for semi-discrete qmu') 
++			fielddisplay(self,'variabledescriptors','');
++			fielddisplay(self,'responsedescriptors','');
++			fielddisplay(self,'method','array of dakota_method class');
++			fielddisplay(self,'mass_flux_profile_directory','directory for mass flux profiles');
++			fielddisplay(self,'mass_flux_profiles','list of mass_flux profiles');
++			fielddisplay(self,'mass_flux_segments','');
++			fielddisplay(self,'adjacency','');
++			fielddisplay(self,'vertex_weight','weight applied to each mesh vertex');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'object',obj,'fieldname','isdakota','format','Boolean');
+-			if ~obj.isdakota, 
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'object',self,'fieldname','isdakota','format','Boolean');
++			if ~self.isdakota, 
+ 				WriteData(fid,'data',false,'enum',QmuMassFluxSegmentsPresentEnum,'format','Boolean');
+ 				return; 
+ 			end
+-			WriteData(fid,'object',obj,'fieldname','partition','format','DoubleMat','mattype',2);
+-			WriteData(fid,'object',obj,'fieldname','numberofpartitions','format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','numberofresponses','format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','variabledescriptors','format','StringArray');
+-			WriteData(fid,'object',obj,'fieldname','responsedescriptors','format','StringArray');
+-			if ~isempty(obj.mass_flux_segments), 
+-				WriteData(fid,'data',obj.mass_flux_segments,'enum',MassFluxSegmentsEnum,'format','MatArray');
++			WriteData(fid,'object',self,'fieldname','partition','format','DoubleMat','mattype',2);
++			WriteData(fid,'object',self,'fieldname','numberofpartitions','format','Integer');
++			WriteData(fid,'object',self,'fieldname','numberofresponses','format','Integer');
++			WriteData(fid,'object',self,'fieldname','variabledescriptors','format','StringArray');
++			WriteData(fid,'object',self,'fieldname','responsedescriptors','format','StringArray');
++			if ~isempty(self.mass_flux_segments), 
++				WriteData(fid,'data',self.mass_flux_segments,'enum',MassFluxSegmentsEnum,'format','MatArray');
+ 				flag=true; 
+ 			else 
+ 				flag=false; 
+Index: ../trunk-jpl/src/m/classes/matice.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/matice.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/matice.m	(revision 19040)
+@@ -29,31 +29,31 @@
+ 
+ 	end
+ 	methods
+-		function createxml(obj,fid) % {{{
++		function createxml(self,fid) % {{{
+ 			fprintf(fid, '\n\n');
+ 			fprintf(fid, '<!-- materials -->\n');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rho_ice" type="',class(obj.rho_ice),'" default="',convert2str(obj.rho_ice),'">','     <section name="materials" />','     <help> ice density [kg/m^3] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rho_water" type="',class(obj.rho_water),'" default="',convert2str(obj.rho_water),'">','     <section name="materials" />','     <help> ocean water density [kg/m^3] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rho_freshwater" type="',class(obj.rho_freshwater),'" default="',convert2str(obj.rho_freshwater),'">','     <section name="materials" />','     <help> fresh water density [kg/m^3] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rho_ice" type="',class(self.rho_ice),'" default="',convert2str(self.rho_ice),'">','     <section name="materials" />','     <help> ice density [kg/m^3] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rho_water" type="',class(self.rho_water),'" default="',convert2str(self.rho_water),'">','     <section name="materials" />','     <help> ocean water density [kg/m^3] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rho_freshwater" type="',class(self.rho_freshwater),'" default="',convert2str(self.rho_freshwater),'">','     <section name="materials" />','     <help> fresh water density [kg/m^3] </help>','</parameter>');
+ 
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="mu_water" type="',class(obj.mu_water),'" default="',convert2str(obj.mu_water),'">','     <section name="materials" />','     <help> water viscosity [N s/m^2] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="heatcapacity" type="',class(obj.heatcapacity),'" default="',convert2str(obj.heatcapacity),'">','     <section name="materials" />','     <help> heat capacity [J/kg/K] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="latentheat" type="',class(obj.latentheat),'" default="',convert2str(obj.latentheat),'">','     <section name="materials" />','     <help> latent heat of fusion [J/kg] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="mu_water" type="',class(self.mu_water),'" default="',convert2str(self.mu_water),'">','     <section name="materials" />','     <help> water viscosity [N s/m^2] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="heatcapacity" type="',class(self.heatcapacity),'" default="',convert2str(self.heatcapacity),'">','     <section name="materials" />','     <help> heat capacity [J/kg/K] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="latentheat" type="',class(self.latentheat),'" default="',convert2str(self.latentheat),'">','     <section name="materials" />','     <help> latent heat of fusion [J/kg] </help>','</parameter>');
+ 
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="thermalconductivity" type="',class(obj.thermalconductivity),'" default="',convert2str(obj.thermalconductivity),'">','     <section name="materials" />','     <help> ice thermal conductivity [W/m/K] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="temperateiceconductivity" type="',class(obj.temperateiceconductivity),'" default="',convert2str(obj.temperateiceconductivity),'">','     <section name="materials" />','     <help> temperate ice thermal conductivity [W/m/K] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="meltingpoint" type="',class(obj.meltingpoint),'" default="',convert2str(obj.meltingpoint),'">','     <section name="materials" />','     <help> melting point of ice at 1atm in K </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="thermalconductivity" type="',class(self.thermalconductivity),'" default="',convert2str(self.thermalconductivity),'">','     <section name="materials" />','     <help> ice thermal conductivity [W/m/K] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="temperateiceconductivity" type="',class(self.temperateiceconductivity),'" default="',convert2str(self.temperateiceconductivity),'">','     <section name="materials" />','     <help> temperate ice thermal conductivity [W/m/K] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="meltingpoint" type="',class(self.meltingpoint),'" default="',convert2str(self.meltingpoint),'">','     <section name="materials" />','     <help> melting point of ice at 1atm in K </help>','</parameter>');
+ 
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="beta" type="',class(obj.beta),'" default="',convert2str(obj.beta),'">','     <section name="materials" />','     <help> rate of change of melting point with pressure [K/Pa] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="mixed_layer_capacity" type="',class(obj.mixed_layer_capacity),'" default="',convert2str(obj.mixed_layer_capacity),'">','     <section name="materials" />','     <help> mixed layer capacity [W/kg/K] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="thermal_exchange_velocity" type="',class(obj.thermal_exchange_velocity),'" default="',convert2str(obj.thermal_exchange_velocity),'">','     <section name="materials" />','     <help> thermal exchange velocity [m/s] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="beta" type="',class(self.beta),'" default="',convert2str(self.beta),'">','     <section name="materials" />','     <help> rate of change of melting point with pressure [K/Pa] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="mixed_layer_capacity" type="',class(self.mixed_layer_capacity),'" default="',convert2str(self.mixed_layer_capacity),'">','     <section name="materials" />','     <help> mixed layer capacity [W/kg/K] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="thermal_exchange_velocity" type="',class(self.thermal_exchange_velocity),'" default="',convert2str(self.thermal_exchange_velocity),'">','     <section name="materials" />','     <help> thermal exchange velocity [m/s] </help>','</parameter>');
+ 
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rheology_B" type="',class(obj.rheology_B),'" default="',convert2str(obj.rheology_B),'">','     <section name="materials" />','     <help> flow law parameter [Pa/s^(1/n)] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rheology_n" type="',class(obj.rheology_n),'" default="',convert2str(obj.rheology_n),'">','     <section name="materials" />','     <help> Glens flow law exponent </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rheology_B" type="',class(self.rheology_B),'" default="',convert2str(self.rheology_B),'">','     <section name="materials" />','     <help> flow law parameter [Pa/s^(1/n)] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rheology_n" type="',class(self.rheology_n),'" default="',convert2str(self.rheology_n),'">','     <section name="materials" />','     <help> Glens flow law exponent </help>','</parameter>');
+ 
+ 			% rheology_law drop-down
+ 			fprintf(fid,'%s\n%s\n%s\n%s\n','<parameter key ="rheology_law" type="alternative" optional="false">','     <section name="materials" />','     <help> law for the temperature dependance of the rheology: "None", "Paterson",  "Arrhenius" or "LliboutryDuval" </help>');
+@@ -63,17 +63,17 @@
+ 			fprintf(fid,'%s\n%s\n','       <option value="LliboutryDuval" type="string" default="false"> </option>','</parameter>');
+ 
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="lithosphere_shear_modulus" type="',class(obj.lithosphere_shear_modulus),'" default="',convert2str(obj.lithosphere_shear_modulus),'">','     <section name="materials" />','     <help> Lithosphere shear modulus [Pa] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="lithosphere_density" type="',class(obj.lithosphere_density),'" default="',convert2str(obj.lithosphere_density),'">','     <section name="materials" />','     <help> Lithosphere density [g/cm^-3] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="mantle_shear_modulus" type="',class(obj.mantle_shear_modulus),'" default="',convert2str(obj.mantle_shear_modulus),'">','     <section name="materials" />','     <help> Mantle shear modulus [Pa] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="mantle_density" type="',class(obj.mantle_density),'" default="',convert2str(obj.mantle_density),'">','     <section name="materials" />','     <help> Mantle density [g/cm^-3] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="lithosphere_shear_modulus" type="',class(self.lithosphere_shear_modulus),'" default="',convert2str(self.lithosphere_shear_modulus),'">','     <section name="materials" />','     <help> Lithosphere shear modulus [Pa] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="lithosphere_density" type="',class(self.lithosphere_density),'" default="',convert2str(self.lithosphere_density),'">','     <section name="materials" />','     <help> Lithosphere density [g/cm^-3] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="mantle_shear_modulus" type="',class(self.mantle_shear_modulus),'" default="',convert2str(self.mantle_shear_modulus),'">','     <section name="materials" />','     <help> Mantle shear modulus [Pa] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="mantle_density" type="',class(self.mantle_density),'" default="',convert2str(self.mantle_density),'">','     <section name="materials" />','     <help> Mantle density [g/cm^-3] </help>','</parameter>');
+ 
+ 
+ 		end % }}}
+-		function obj = matice(varargin) % {{{
++		function self = matice(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+ 					inputstruct=varargin{1};
+ 					list1 = properties('matice');
+@@ -81,63 +81,63 @@
+ 					for i=1:length(list1)
+ 						fieldname = list1{i};
+ 						if ismember(fieldname,list2),
+-							obj.(fieldname) = inputstruct.(fieldname);
++							self.(fieldname) = inputstruct.(fieldname);
+ 						end
+ 					end
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%ice density (kg/m^3)
+-			obj.rho_ice=917.;
++			self.rho_ice=917.;
+ 
+ 			%ocean water density (kg/m^3)
+-			obj.rho_water=1023.;
++			self.rho_water=1023.;
+ 
+ 			%fresh water density (kg/m^3)
+-			obj.rho_freshwater=1000.;
++			self.rho_freshwater=1000.;
+ 
+ 			%water viscosity (N.s/m^2)
+-			obj.mu_water=0.001787;  
++			self.mu_water=0.001787;  
+ 
+ 			%ice heat capacity cp (J/kg/K)
+-			obj.heatcapacity=2093.;
++			self.heatcapacity=2093.;
+ 
+ 			%ice latent heat of fusion L (J/kg)
+-			obj.latentheat=3.34*10^5;
++			self.latentheat=3.34*10^5;
+ 
+ 			%ice thermal conductivity (W/m/K)
+-			obj.thermalconductivity=2.4;
++			self.thermalconductivity=2.4;
+ 			
+ 			%wet ice thermal conductivity (W/m/K)
+-			obj.temperateiceconductivity=.24;
++			self.temperateiceconductivity=.24;
+ 
+ 			%the melting point of ice at 1 atmosphere of pressure in K
+-			obj.meltingpoint=273.15;
++			self.meltingpoint=273.15;
+ 
+ 			%rate of change of melting point with pressure (K/Pa)
+-			obj.beta=9.8*10^-8;
++			self.beta=9.8*10^-8;
+ 
+ 			%mixed layer (ice-water interface) heat capacity (J/kg/K)
+-			obj.mixed_layer_capacity=3974.;
++			self.mixed_layer_capacity=3974.;
+ 
+ 			%thermal exchange velocity (ice-water interface) (m/s)
+-			obj.thermal_exchange_velocity=1.00*10^-4;
++			self.thermal_exchange_velocity=1.00*10^-4;
+ 
+ 			%Rheology law: what is the temperature dependence of B with T
+ 			%available: none, paterson and arrhenius
+-			obj.rheology_law='Paterson';
++			self.rheology_law='Paterson';
+ 
+ 			% GIA:
+-			obj.lithosphere_shear_modulus  = 6.7*10^10;  % (Pa)
+-			obj.lithosphere_density        = 3.32;       % (g/cm^-3)
+-			obj.mantle_shear_modulus       = 1.45*10^11; % (Pa)
+-			obj.mantle_density             = 3.34;       % (g/cm^-3)
++			self.lithosphere_shear_modulus  = 6.7*10^10;  % (Pa)
++			self.lithosphere_density        = 3.32;       % (g/cm^-3)
++			self.mantle_shear_modulus       = 1.45*10^11; % (Pa)
++			self.mantle_density             = 3.34;       % (g/cm^-3)
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 			md = checkfield(md,'fieldname','materials.rho_ice','>',0);
+ 			md = checkfield(md,'fieldname','materials.rho_water','>',0);
+ 			md = checkfield(md,'fieldname','materials.rho_freshwater','>',0);
+@@ -154,51 +154,51 @@
+ 			end
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   Materials:'));
+ 
+-			fielddisplay(obj,'rho_ice','ice density [kg/m^3]');
+-			fielddisplay(obj,'rho_water','ocean water density [kg/m^3]');
+-			fielddisplay(obj,'rho_freshwater','fresh water density [kg/m^3]');
+-			fielddisplay(obj,'mu_water','water viscosity [N s/m^2]');
+-			fielddisplay(obj,'heatcapacity','heat capacity [J/kg/K]');
+-			fielddisplay(obj,'thermalconductivity',['ice thermal conductivity [W/m/K]']);
+-			fielddisplay(obj,'temperateiceconductivity','temperate ice thermal conductivity [W/m/K]');
+-			fielddisplay(obj,'meltingpoint','melting point of ice at 1atm in K');
+-			fielddisplay(obj,'latentheat','latent heat of fusion [J/kg]');
+-			fielddisplay(obj,'beta','rate of change of melting point with pressure [K/Pa]');
+-			fielddisplay(obj,'mixed_layer_capacity','mixed layer capacity [W/kg/K]');
+-			fielddisplay(obj,'thermal_exchange_velocity','thermal exchange velocity [m/s]');
+-			fielddisplay(obj,'rheology_B','flow law parameter [Pa/s^(1/n)]');
+-			fielddisplay(obj,'rheology_n','Glen''s flow law exponent');
+-			fielddisplay(obj,'rheology_law',['law for the temperature dependance of the rheology: ''None'', ''Cuffey'', ''Paterson'', ''Arrhenius'' or ''LliboutryDuval''']);
+-			fielddisplay(obj,'lithosphere_shear_modulus','Lithosphere shear modulus [Pa]');
+-			fielddisplay(obj,'lithosphere_density','Lithosphere density [g/cm^-3]');
+-			fielddisplay(obj,'mantle_shear_modulus','Mantle shear modulus [Pa]');
+-			fielddisplay(obj,'mantle_density','Mantle density [g/cm^-3]');
++			fielddisplay(self,'rho_ice','ice density [kg/m^3]');
++			fielddisplay(self,'rho_water','ocean water density [kg/m^3]');
++			fielddisplay(self,'rho_freshwater','fresh water density [kg/m^3]');
++			fielddisplay(self,'mu_water','water viscosity [N s/m^2]');
++			fielddisplay(self,'heatcapacity','heat capacity [J/kg/K]');
++			fielddisplay(self,'thermalconductivity',['ice thermal conductivity [W/m/K]']);
++			fielddisplay(self,'temperateiceconductivity','temperate ice thermal conductivity [W/m/K]');
++			fielddisplay(self,'meltingpoint','melting point of ice at 1atm in K');
++			fielddisplay(self,'latentheat','latent heat of fusion [J/kg]');
++			fielddisplay(self,'beta','rate of change of melting point with pressure [K/Pa]');
++			fielddisplay(self,'mixed_layer_capacity','mixed layer capacity [W/kg/K]');
++			fielddisplay(self,'thermal_exchange_velocity','thermal exchange velocity [m/s]');
++			fielddisplay(self,'rheology_B','flow law parameter [Pa/s^(1/n)]');
++			fielddisplay(self,'rheology_n','Glen''s flow law exponent');
++			fielddisplay(self,'rheology_law',['law for the temperature dependance of the rheology: ''None'', ''Cuffey'', ''Paterson'', ''Arrhenius'' or ''LliboutryDuval''']);
++			fielddisplay(self,'lithosphere_shear_modulus','Lithosphere shear modulus [Pa]');
++			fielddisplay(self,'lithosphere_density','Lithosphere density [g/cm^-3]');
++			fielddisplay(self,'mantle_shear_modulus','Mantle shear modulus [Pa]');
++			fielddisplay(self,'mantle_density','Mantle density [g/cm^-3]');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 			WriteData(fid,'enum',MaterialsEnum(),'data',MaticeEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','rho_ice','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','rho_water','enum',MaterialsRhoSeawaterEnum(),'format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','rho_freshwater','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','mu_water','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','heatcapacity','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','latentheat','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','thermalconductivity','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','temperateiceconductivity','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','meltingpoint','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','beta','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','mixed_layer_capacity','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','thermal_exchange_velocity','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','rheology_B','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','materials','fieldname','rheology_n','format','DoubleMat','mattype',2);
+-			WriteData(fid,'data',StringToEnum(obj.rheology_law),'enum',MaterialsRheologyLawEnum(),'format','Integer');
++			WriteData(fid,'object',self,'class','materials','fieldname','rho_ice','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','rho_water','enum',MaterialsRhoSeawaterEnum(),'format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','rho_freshwater','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','mu_water','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','heatcapacity','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','latentheat','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','thermalconductivity','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','temperateiceconductivity','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','meltingpoint','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','beta','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','mixed_layer_capacity','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','thermal_exchange_velocity','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','rheology_B','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','materials','fieldname','rheology_n','format','DoubleMat','mattype',2);
++			WriteData(fid,'data',StringToEnum(self.rheology_law),'enum',MaterialsRheologyLawEnum(),'format','Integer');
+ 
+-			WriteData(fid,'object',obj,'class','materials','fieldname','lithosphere_shear_modulus','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','lithosphere_density','format','Double','scale',10^3);
+-			WriteData(fid,'object',obj,'class','materials','fieldname','mantle_shear_modulus','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','mantle_density','format','Double','scale',10^3);
++			WriteData(fid,'object',self,'class','materials','fieldname','lithosphere_shear_modulus','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','lithosphere_density','format','Double','scale',10^3);
++			WriteData(fid,'object',self,'class','materials','fieldname','mantle_shear_modulus','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','mantle_density','format','Double','scale',10^3);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/frictiontemp.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictiontemp.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/frictiontemp.m	(revision 19040)
+@@ -11,24 +11,24 @@
+ 		q           = NaN;
+ 	end
+ 	methods
+-		function obj = frictiontemp(varargin) % {{{
++		function self = frictiontemp(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+ 					obj=structtoobj(frictiontemp(),varargin{1});
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%By default gamma = 1;
+-			obj.gamma = 1;
++			self.gamma = 1;
+ 
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return
+ 			if ~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(ThermalAnalysisEnum(),analyses), return; end
+@@ -41,20 +41,20 @@
+ 			%Check that temperature is provided
+ 			md = checkfield(md,'fieldname','initialization.temperature','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('Basal shear stress parameters: tau_b = coefficient^2 * Neff ^r * |u_b|^(s-1) * u_b * 1/f(T)\n(effective stress Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p)'));
+-			fielddisplay(obj,'gamma','submelt sliding parameter f(T) = exp((T-Tpmp)/gamma)');
+-			fielddisplay(obj,'coefficient','frictiontemp coefficient [SI]');
+-			fielddisplay(obj,'p','p exponent');
+-			fielddisplay(obj,'q','q exponent');
++			fielddisplay(self,'gamma','submelt sliding parameter f(T) = exp((T-Tpmp)/gamma)');
++			fielddisplay(self,'coefficient','frictiontemp coefficient [SI]');
++			fielddisplay(self,'p','p exponent');
++			fielddisplay(self,'q','q exponent');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			WriteData(fid,'enum',FrictionLawEnum,'data',4,'format','Integer');
+-			WriteData(fid,'class','friction','object',obj,'fieldname','gamma','format','Double');
+-			WriteData(fid,'class','friction','object',obj,'fieldname','coefficient','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'class','friction','object',obj,'fieldname','p','format','DoubleMat','mattype',2);
+-			WriteData(fid,'class','friction','object',obj,'fieldname','q','format','DoubleMat','mattype',2);
++			WriteData(fid,'class','friction','object',self,'fieldname','gamma','format','Double');
++			WriteData(fid,'class','friction','object',self,'fieldname','coefficient','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'class','friction','object',self,'fieldname','p','format','DoubleMat','mattype',2);
++			WriteData(fid,'class','friction','object',self,'fieldname','q','format','DoubleMat','mattype',2);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/verbose.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/verbose.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/verbose.m	(revision 19040)
+@@ -37,21 +37,21 @@
+ 	end
+ 	%}}}
+ 	methods
+-        function createxml(obj,fid) % {{{
+-            fprintf(fid, '\n\n');
+-            fprintf(fid, '%s\n', '<!-- verbose -->');
+-             
+-             fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n',    '<parameter key ="mprocessor" type="',              class(obj.mprocessor),'" optional="false">',              '     <section name="verbose" />','        <option value="',convert2str(obj.mprocessor),'" type="string" default="true"></option>','     <help>  </help>','</parameter>');
+-             fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n',    '<parameter key ="module" type="',              class(obj.module),'" optional="false">',              '     <section name="verbose" />','        <option value="',convert2str(obj.module),'" type="string" default="true"></option>','     <help>  </help>','</parameter>');
+-             fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n',    '<parameter key ="solution" type="',              class(obj.solution),'" optional="false">',              '     <section name="verbose" />','        <option value="',convert2str(obj.solution),'" type="string" default="true"></option>','     <help>  </help>','</parameter>');
+-             fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n',    '<parameter key ="solver" type="',              class(obj.solver),'" optional="false">',              '     <section name="verbose" />','        <option value="',convert2str(obj.solver),'" type="string" default="true"></option>','     <help>  </help>','</parameter>');
+-             fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n',    '<parameter key ="convergence" type="',              class(obj.convergence),'" optional="false">',              '     <section name="verbose" />','        <option value="',convert2str(obj.convergence),'" type="string" default="true"></option>','     <help>  </help>','</parameter>');
+-             fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n',    '<parameter key ="control" type="',              class(obj.control),'" optional="false">',              '     <section name="verbose" />','        <option value="',convert2str(obj.control),'" type="string" default="true"></option>','     <help>  </help>','</parameter>');
+-             fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n',    '<parameter key ="qmu" type="',              class(obj.qmu),'" optional="false">',              '     <section name="verbose" />','        <option value="',convert2str(obj.qmu),'" type="string" default="true"></option>','     <help>  </help>','</parameter>');
+-             fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n',    '<parameter key ="autodiff" type="',              class(obj.autodiff),'" optional="false">',              '     <section name="verbose" />','        <option value="',convert2str(obj.autodiff),'" type="string" default="true"></option>','     <help>  </help>','</parameter>');
+-             
+-             
+-        end % }}}
++		function createxml(self,fid) % {{{
++			fprintf(fid, '\n\n');
++			fprintf(fid, '%s\n', '<!-- verbose -->');
++
++			fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n',    '<parameter key ="mprocessor" type="',              class(self.mprocessor),'" optional="false">',              '     <section name="verbose" />','        <option value="',convert2str(self.mprocessor),'" type="string" default="true"></option>','     <help>  </help>','</parameter>');
++			fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n',    '<parameter key ="module" type="',              class(self.module),'" optional="false">',              '     <section name="verbose" />','        <option value="',convert2str(self.module),'" type="string" default="true"></option>','     <help>  </help>','</parameter>');
++			fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n',    '<parameter key ="solution" type="',              class(self.solution),'" optional="false">',              '     <section name="verbose" />','        <option value="',convert2str(self.solution),'" type="string" default="true"></option>','     <help>  </help>','</parameter>');
++			fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n',    '<parameter key ="solver" type="',              class(self.solver),'" optional="false">',              '     <section name="verbose" />','        <option value="',convert2str(self.solver),'" type="string" default="true"></option>','     <help>  </help>','</parameter>');
++			fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n',    '<parameter key ="convergence" type="',              class(self.convergence),'" optional="false">',              '     <section name="verbose" />','        <option value="',convert2str(self.convergence),'" type="string" default="true"></option>','     <help>  </help>','</parameter>');
++			fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n',    '<parameter key ="control" type="',              class(self.control),'" optional="false">',              '     <section name="verbose" />','        <option value="',convert2str(self.control),'" type="string" default="true"></option>','     <help>  </help>','</parameter>');
++			fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n',    '<parameter key ="qmu" type="',              class(self.qmu),'" optional="false">',              '     <section name="verbose" />','        <option value="',convert2str(self.qmu),'" type="string" default="true"></option>','     <help>  </help>','</parameter>');
++			fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n',    '<parameter key ="autodiff" type="',              class(self.autodiff),'" optional="false">',              '     <section name="verbose" />','        <option value="',convert2str(self.autodiff),'" type="string" default="true"></option>','     <help>  </help>','</parameter>');
++
++
++		end % }}}
+ 		function verbose=verbose(varargin) % {{{
+ 
+ 			switch(nargin),
+@@ -122,7 +122,7 @@
+ 
+ 		end
+ 		%}}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 		end % }}}
+ 		function disp(verbose) % {{{
+@@ -141,8 +141,8 @@
+ 
+ 		end
+ 		%}}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'data',VerboseToBinary(obj),'enum',VerboseEnum(),'format','Integer');
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'data',VerboseToBinary(self),'enum',VerboseEnum(),'format','Integer');
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/massconaxpby.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/massconaxpby.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/massconaxpby.m	(revision 19040)
+@@ -22,60 +22,60 @@
+ 	end
+ 	
+ 	methods
+-		function obj = massconaxpby(varargin) % {{{
++		function self = massconaxpby(varargin) % {{{
+ 			if nargin==0,
+-				obj=setdefaultparameters(obj);
++				self=setdefaultparameters(self);
+ 			else
+ 				%use provided options to change fields
+ 				options=pairoptions(varargin{:});
+ 
+ 				%get names
+-				obj.name=getfieldvalue(options,'name','');
+-				obj.definitionenum=getfieldvalue(options,'definitionenum');
+-				obj.namex=getfieldvalue(options,'namex');
+-				obj.namey=getfieldvalue(options,'namey');
++				self.name=getfieldvalue(options,'name','');
++				self.definitionenum=getfieldvalue(options,'definitionenum');
++				self.namex=getfieldvalue(options,'namex');
++				self.namey=getfieldvalue(options,'namey');
+ 
+ 				%get multiplicators: 
+-				obj.alpha=getfieldvalue(options,'alpha');
+-				obj.beta=getfieldvalue(options,'beta');
++				self.alpha=getfieldvalue(options,'alpha');
++				self.beta=getfieldvalue(options,'beta');
+ 
+ 
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+-			if ~ischar(obj.name), error('masscon error message: ''name'' field should be a string!'); end
+-			if ~ischar(obj.namex), error('masscon error message: ''namex'' field should be a string!'); end
+-			if ~ischar(obj.namey), error('masscon error message: ''namey'' field should be a string!'); end
++			if ~ischar(self.name), error('masscon error message: ''name'' field should be a string!'); end
++			if ~ischar(self.namex), error('masscon error message: ''namex'' field should be a string!'); end
++			if ~ischar(self.namey), error('masscon error message: ''namey'' field should be a string!'); end
+ 			
+-			md = checkfield(md,'fieldname','obj.definitionenum','field',obj.definitionenum,'values',[Outputdefinition1Enum,Outputdefinition2Enum,Outputdefinition3Enum,Outputdefinition4Enum,Outputdefinition5Enum,Outputdefinition6Enum,Outputdefinition7Enum,Outputdefinition8Enum,Outputdefinition9Enum,Outputdefinition10Enum]);
++			md = checkfield(md,'fieldname','self.definitionenum','field',self.definitionenum,'values',[Outputdefinition1Enum,Outputdefinition2Enum,Outputdefinition3Enum,Outputdefinition4Enum,Outputdefinition5Enum,Outputdefinition6Enum,Outputdefinition7Enum,Outputdefinition8Enum,Outputdefinition9Enum,Outputdefinition10Enum]);
+ 
+-			md = checkfield(md,'fieldname','obj.alpha','field',obj.alpha,'NaN',1,'size',[1 1]);
+-			md = checkfield(md,'fieldname','obj.betaa','field',obj.beta,'NaN',1,'size',[1 1]);
++			md = checkfield(md,'fieldname','self.alpha','field',self.alpha,'NaN',1,'size',[1 1]);
++			md = checkfield(md,'fieldname','self.betaa','field',self.beta,'NaN',1,'size',[1 1]);
+ 
+ 		end % }}}
+-		function md = disp(obj) % {{{
++		function md = disp(self) % {{{
+ 		
+ 			disp(sprintf('   Misfit:\n'));
+ 
+-			fielddisplay(obj,'name','name');
+-			fielddisplay(obj,'definitionenum','enum that identifies this output definition uniquely, from Outputdefinition[1-10]Enum');
+-			fielddisplay(obj,'namex','identifier for the first masscon');
+-			fielddisplay(obj,'alpha','first masscon multiplicator');
+-			fielddisplay(obj,'namey','identifier for the second masscon');
+-			fielddisplay(obj,'beta','second masscon multiplicator');
++			fielddisplay(self,'name','name');
++			fielddisplay(self,'definitionenum','enum that identifies this output definition uniquely, from Outputdefinition[1-10]Enum');
++			fielddisplay(self,'namex','identifier for the first masscon');
++			fielddisplay(self,'alpha','first masscon multiplicator');
++			fielddisplay(self,'namey','identifier for the second masscon');
++			fielddisplay(self,'beta','second masscon multiplicator');
+ 
+ 		end % }}}
+-		function md = marshall(obj,md,fid) % {{{
++		function md = marshall(self,md,fid) % {{{
+ 
+-		WriteData(fid,'object',obj,'fieldname','name','format','String');
+-		WriteData(fid,'object',obj,'fieldname','definitionenum','format','Integer');
+-		WriteData(fid,'object',obj,'fieldname','namex','format','String');
+-		WriteData(fid,'object',obj,'fieldname','namey','format','String');
+-		WriteData(fid,'object',obj,'fieldname','alpha','format','Double');
+-		WriteData(fid,'object',obj,'fieldname','beta','format','Double');
++		WriteData(fid,'object',self,'fieldname','name','format','String');
++		WriteData(fid,'object',self,'fieldname','definitionenum','format','Integer');
++		WriteData(fid,'object',self,'fieldname','namex','format','String');
++		WriteData(fid,'object',self,'fieldname','namey','format','String');
++		WriteData(fid,'object',self,'fieldname','alpha','format','Double');
++		WriteData(fid,'object',self,'fieldname','beta','format','Double');
+ 
+ 		end % }}}
+ 	end
+Index: ../trunk-jpl/src/m/classes/transient.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/transient.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/transient.m	(revision 19040)
+@@ -17,62 +17,62 @@
+ 		requested_outputs = {};
+ 	end
+ 	methods
+-        function createxml(obj,fid) % {{{
++        function createxml(self,fid) % {{{
+             fprintf(fid, '<!-- transient -->\n');            
+                     
+             % transient solution parameters
+             fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="transient solution parameters">','<section name="transient" />');                    
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="ismasstransport" type="',class(obj.ismasstransport),'" default="',convert2str(obj.ismasstransport),'">','     <section name="transient" />','     <help> indicates whether a masstransport solution is used in the transient </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isstressbalance" type="',class(obj.isstressbalance),'" default="',convert2str(obj.isstressbalance),'">','     <section name="transient" />','     <help> indicates whether a stressbalance solution is used in the transient </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isthermal" type="',class(obj.isthermal),'" default="',convert2str(obj.isthermal),'">','     <section name="transient" />','     <help> indicates whether a thermal solution is used in the transient </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isgroundingline" type="',class(obj.isgroundingline),'" default="',convert2str(obj.isgroundingline),'">','     <section name="transient" />','     <help> indicates whether a groundingline migration is used in the transient </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isgia" type="',class(obj.isgia),'" default="',convert2str(obj.isgia),'">','     <section name="transient" />','     <help> indicates whether a postglacial rebound model is used in the transient </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isdamageevolution" type="',class(obj.isdamageevolution),'" default="',convert2str(obj.isdamageevolution),'">','     <section name="transient" />','     <help> indicates whether damage evolution is used in the transient </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="islevelset" type="',class(obj.islevelset),'" default="',convert2str(obj.islevelset),'">','     <section name="transient" />','     <help> LEVEL SET DESCRIPTION...  </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="iscalving" type="',class(obj.iscalving),'" default="',convert2str(obj.iscalving),'">','     <section name="transient" />','     <help> indicates whether calving is used in the transient </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="requested_outputs" type="',class(obj.requested_outputs),'" default="',convert2str(obj.requested_outputs),'">','     <section name="transient" />','     <help> list of additional outputs requested </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="ismasstransport" type="',class(self.ismasstransport),'" default="',convert2str(self.ismasstransport),'">','     <section name="transient" />','     <help> indicates whether a masstransport solution is used in the transient </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isstressbalance" type="',class(self.isstressbalance),'" default="',convert2str(self.isstressbalance),'">','     <section name="transient" />','     <help> indicates whether a stressbalance solution is used in the transient </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isthermal" type="',class(self.isthermal),'" default="',convert2str(self.isthermal),'">','     <section name="transient" />','     <help> indicates whether a thermal solution is used in the transient </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isgroundingline" type="',class(self.isgroundingline),'" default="',convert2str(self.isgroundingline),'">','     <section name="transient" />','     <help> indicates whether a groundingline migration is used in the transient </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isgia" type="',class(self.isgia),'" default="',convert2str(self.isgia),'">','     <section name="transient" />','     <help> indicates whether a postglacial rebound model is used in the transient </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isdamageevolution" type="',class(self.isdamageevolution),'" default="',convert2str(self.isdamageevolution),'">','     <section name="transient" />','     <help> indicates whether damage evolution is used in the transient </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="islevelset" type="',class(self.islevelset),'" default="',convert2str(self.islevelset),'">','     <section name="transient" />','     <help> LEVEL SET DESCRIPTION...  </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="iscalving" type="',class(self.iscalving),'" default="',convert2str(self.iscalving),'">','     <section name="transient" />','     <help> indicates whether calving is used in the transient </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="requested_outputs" type="',class(self.requested_outputs),'" default="',convert2str(self.requested_outputs),'">','     <section name="transient" />','     <help> list of additional outputs requested </help>','  </parameter>');
+             fprintf(fid,'%s\n%s\n','</frame>');    
+         
+         end % }}}
+-		function obj = transient(varargin) % {{{
++		function self = transient(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self = setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = deactivateall(obj) % {{{
++		function self = deactivateall(self) % {{{
+ 
+ 			%full analysis: Stressbalance, Masstransport and Thermal but no groundingline migration for now
+-			obj.ismasstransport = 0;
+-			obj.isstressbalance = 0;
+-			obj.isthermal       = 0;
+-			obj.isgroundingline = 0;
+-			obj.isgia           = 0;
+-			obj.isdamageevolution = 0;
+-			obj.islevelset      = 0;
+-			obj.iscalving       =0;
+-			obj.ishydrology     = 0;
++			self.ismasstransport = 0;
++			self.isstressbalance = 0;
++			self.isthermal       = 0;
++			self.isgroundingline = 0;
++			self.isgia           = 0;
++			self.isdamageevolution = 0;
++			self.islevelset      = 0;
++			self.iscalving       =0;
++			self.ishydrology     = 0;
+ 
+ 			%default output
+-			obj.requested_outputs={};
++			self.requested_outputs={};
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%full analysis: Stressbalance, Masstransport and Thermal but no groundingline migration for now
+-			obj.ismasstransport = 1;
+-			obj.isstressbalance = 1;
+-			obj.isthermal       = 1;
+-			obj.isgroundingline = 0;
+-			obj.isgia           = 0;
+-			obj.isdamageevolution = 0;
+-			obj.islevelset      = 0;
+-			obj.iscalving       = 0;
+-			obj.ishydrology     = 0;
++			self.ismasstransport = 1;
++			self.isstressbalance = 1;
++			self.isthermal       = 1;
++			self.isgroundingline = 0;
++			self.isgia           = 0;
++			self.isdamageevolution = 0;
++			self.islevelset      = 0;
++			self.iscalving       = 0;
++			self.ishydrology     = 0;
+ 
+ 			%default output
+-			obj.requested_outputs={'default'};
++			self.requested_outputs={'default'};
+ 		end % }}}
+ 		function list = defaultoutputs(self,md) % {{{
+ 			if(self.ismasstransport)
+@@ -81,7 +81,7 @@
+ 				list = {};
+ 			end
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return
+ 			if solution~=TransientSolutionEnum(), return; end
+@@ -98,38 +98,38 @@
+ 			md = checkfield(md,'fieldname','transient.requested_outputs','stringrow',1);
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   transient solution parameters:'));
+ 
+-			fielddisplay(obj,'ismasstransport','indicates whether a masstransport solution is used in the transient');
+-			fielddisplay(obj,'isstressbalance','indicates whether a stressbalance solution is used in the transient');
+-			fielddisplay(obj,'isthermal','indicates whether a thermal solution is used in the transient');
+-			fielddisplay(obj,'isgroundingline','indicates whether a groundingline migration is used in the transient');
+-			fielddisplay(obj,'isgia','indicates whether a postglacial rebound model is used in the transient');
+-			fielddisplay(obj,'isdamageevolution','indicates whether damage evolution is used in the transient');
+-			fielddisplay(obj,'islevelset','LEVEL SET DESCRIPTION...');
+-			fielddisplay(obj,'iscalving','indicates whether calving is used in the transient');
+-			fielddisplay(obj,'ishydrology','indicates whether an hydrology model is used');
+-			fielddisplay(obj,'requested_outputs','list of additional outputs requested');
++			fielddisplay(self,'ismasstransport','indicates whether a masstransport solution is used in the transient');
++			fielddisplay(self,'isstressbalance','indicates whether a stressbalance solution is used in the transient');
++			fielddisplay(self,'isthermal','indicates whether a thermal solution is used in the transient');
++			fielddisplay(self,'isgroundingline','indicates whether a groundingline migration is used in the transient');
++			fielddisplay(self,'isgia','indicates whether a postglacial rebound model is used in the transient');
++			fielddisplay(self,'isdamageevolution','indicates whether damage evolution is used in the transient');
++			fielddisplay(self,'islevelset','LEVEL SET DESCRIPTION...');
++			fielddisplay(self,'iscalving','indicates whether calving is used in the transient');
++			fielddisplay(self,'ishydrology','indicates whether an hydrology model is used');
++			fielddisplay(self,'requested_outputs','list of additional outputs requested');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'object',obj,'fieldname','ismasstransport','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','isstressbalance','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','isthermal','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','isgroundingline','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','isgia','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','isdamageevolution','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','ishydrology','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','islevelset','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','iscalving','format','Boolean');
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'object',self,'fieldname','ismasstransport','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','isstressbalance','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','isthermal','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','isgroundingline','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','isgia','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','isdamageevolution','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','ishydrology','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','islevelset','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','iscalving','format','Boolean');
+ 
+ 			%process requested outputs
+-			outputs = obj.requested_outputs;
++			outputs = self.requested_outputs;
+ 			pos  = find(ismember(outputs,'default'));
+ 			if ~isempty(pos),
+ 				outputs(pos) = [];                         %remove 'default' from outputs
+-				outputs      = [outputs defaultoutputs(obj,md)]; %add defaults
++				outputs      = [outputs defaultoutputs(self,md)]; %add defaults
+ 			end
+ 			WriteData(fid,'data',outputs,'enum',TransientRequestedOutputsEnum,'format','StringArray');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/outputdefinition.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/outputdefinition.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/outputdefinition.m	(revision 19040)
+@@ -8,48 +8,48 @@
+ 		definitions                 = {};
+ 	end
+ 	methods
+-	   function createxml(obj,fid) % {{{
++	   function createxml(self,fid) % {{{
+             fprintf(fid, '<!-- outputdefinition -->\n');            
+                     
+             % outputdefinition solution parameters
+             fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="outputdefinition">','<section name="outputdefinition" />');                    
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="definitions" type="',class(obj.definitions),'" default="',convert2str(obj.definitions),'">','     <section name="outputdefinition" />','     <help> list of potential outputs that can be requested, but which need additional data to be defined </help>','  </parameter>');
++                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="definitions" type="',class(self.definitions),'" default="',convert2str(self.definitions),'">','     <section name="outputdefinition" />','     <help> list of potential outputs that can be requested, but which need additional data to be defined </help>','  </parameter>');
+             fprintf(fid,'%s\n%s\n','</frame>');    
+         
+         end % }}}
+-		function obj = outputdefinition(varargin) % {{{
++		function self = outputdefinition(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+-			obj.definitions={};
++			self.definitions={};
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			md = checkfield(md,'fieldname','outputdefinition.definitions','cell',1);
+ 
+-			for i=1:length(obj.definitions),
+-				md=checkconsistency(obj.definitions{i},md,solution,analyses);
++			for i=1:length(self.definitions),
++				md=checkconsistency(self.definitions{i},md,solution,analyses);
+ 			end
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   outputdefinition:'));
+-			fielddisplay(obj,'definitions','list of potential outputs that can be requested, but which need additional data to be defined');
++			fielddisplay(self,'definitions','list of potential outputs that can be requested, but which need additional data to be defined');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+-		enums=zeros(length(obj.definitions),1);
+-		for i=1:length(obj.definitions),
+-			obj.definitions{i}.marshall(md,fid);
+-			classdefinition=class(obj.definitions{i});
++		enums=zeros(length(self.definitions),1);
++		for i=1:length(self.definitions),
++			self.definitions{i}.marshall(md,fid);
++			classdefinition=class(self.definitions{i});
+ 			classdefinition(1)=upper(classdefinition(1)); %so it matches our enums definitions.
+ 			enums(i)=StringToEnum(classdefinition);
+ 		end
+Index: ../trunk-jpl/src/m/classes/constants.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/constants.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/constants.m	(revision 19040)
+@@ -11,37 +11,37 @@
+ 		referencetemperature = 0.;
+ 	end
+ 	methods
+-        function createxml(obj,fid) % {{{
++        function createxml(self,fid) % {{{
+             fprintf(fid, '\n\n');
+             fprintf(fid, '%s\n', '<!-- constants -->');
+-			 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="g" type="',class(obj.g),'" default="',num2str(obj.g),'">','     <section name="constants" />','     <help> gravitational acceleration [m/s^2] </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="yts" type="',class(obj.yts),'" default="',num2str(obj.yts),'">','     <section name="constants" />','     <help> number of seconds in a year [s/yr] </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','<parameter key ="referencetemperature" type="',class(obj.referencetemperature),'" default="',num2str(obj.referencetemperature),'">','     <section name="constants" />','     <help> reference temperature used in the enthalpy model [K] </help>','</parameter>');
++			 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="g" type="',class(self.g),'" default="',num2str(self.g),'">','     <section name="constants" />','     <help> gravitational acceleration [m/s^2] </help>','</parameter>');
++             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="yts" type="',class(self.yts),'" default="',num2str(self.yts),'">','     <section name="constants" />','     <help> number of seconds in a year [s/yr] </help>','</parameter>');
++             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','<parameter key ="referencetemperature" type="',class(self.referencetemperature),'" default="',num2str(self.referencetemperature),'">','     <section name="constants" />','     <help> reference temperature used in the enthalpy model [K] </help>','</parameter>');
+ 		end % }}}
+-		function obj = constants(varargin) % {{{
++		function self = constants(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%acceleration due to gravity (m/s^2)
+-			obj.g=9.81;
++			self.g=9.81;
+ 
+ 			%Earth's rotation speed 
+-			obj.omega = 7.292*1e-5;
++			self.omega = 7.292*1e-5;
+ 
+ 			%converstion from year to seconds
+-			obj.yts=365*24*3600;
++			self.yts=365*24*3600;
+ 
+ 			%the reference temperature for enthalpy model (cf Aschwanden)
+-			obj.referencetemperature=223.15;
++			self.referencetemperature=223.15;
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			md = checkfield(md,'fieldname','constants.g','>=',0,'size',[1 1]); %We allow 0 for validation tests
+ 			md = checkfield(md,'fieldname','constants.omega','>=',0,'size',[1 1]);
+@@ -49,20 +49,20 @@
+ 			md = checkfield(md,'fieldname','constants.referencetemperature','size',[1 1]);
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   constants parameters:'));
+ 
+-			fielddisplay(obj,'g','gravitational acceleration [m/s^2]');
+-			fielddisplay(obj,'omega','angular velocity of Earth [rad/s]');
+-			fielddisplay(obj,'yts','number of seconds in a year [s/yr]');
+-			fielddisplay(obj,'referencetemperature','reference temperature used in the enthalpy model [K]');
++			fielddisplay(self,'g','gravitational acceleration [m/s^2]');
++			fielddisplay(self,'omega','angular velocity of Earth [rad/s]');
++			fielddisplay(self,'yts','number of seconds in a year [s/yr]');
++			fielddisplay(self,'referencetemperature','reference temperature used in the enthalpy model [K]');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'object',obj,'fieldname','g','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','omega','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','yts','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','referencetemperature','format','Double');
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'object',self,'fieldname','g','format','Double');
++			WriteData(fid,'object',self,'fieldname','omega','format','Double');
++			WriteData(fid,'object',self,'fieldname','yts','format','Double');
++			WriteData(fid,'object',self,'fieldname','referencetemperature','format','Double');
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/adinversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/adinversion.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/adinversion.m	(revision 19040)
+@@ -25,10 +25,10 @@
+ 
+ 	end
+ 	methods
+-		function obj = adinversion(varargin) % {{{
++		function self = adinversion(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+ 					obj=structtoobj(adinversion(),varargin{1});
+ 				otherwise
+@@ -56,10 +56,10 @@
+ 			self.gttol = 1e-4;
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return
+-			if ~obj.iscontrol, return; end
++			if ~self.iscontrol, return; end
+ 
+ 			if ~IssmConfig('_HAVE_M1QN3_'),
+ 				md = checkmessage(md,['M1QN3 has not been installed, ISSM needs to be reconfigured and recompiled with AD']);
+@@ -94,24 +94,24 @@
+ 				end
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   adinversion parameters:'));
+-			fielddisplay(obj,'iscontrol','is inversion activated?');
+-			fielddisplay(obj,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}');
+-			fielddisplay(obj,'control_scaling_factors','order of magnitude of each control (useful for multi-parameter optimization)');
+-			fielddisplay(obj,'maxsteps','maximum number of iterations (gradient computation)');
+-			fielddisplay(obj,'maxiter','maximum number of Function evaluation (forward run)');
+-			fielddisplay(obj,'dxmin','convergence criterion: two points less than dxmin from eachother (sup-norm) are considered identical');
+-			fielddisplay(obj,'gttol','convergence criterion: ||g(X)||/||g(X0)|| (g(X0): gradient at initial guess X0)');
+-			fielddisplay(obj,'cost_functions','indicate the type of response for each optimization step');
+-			fielddisplay(obj,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter');
+-			fielddisplay(obj,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex');
+-			fielddisplay(obj,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex');
+-			fielddisplay(obj,'vx_obs','observed velocity x component [m/yr]');
+-			fielddisplay(obj,'vy_obs','observed velocity y component [m/yr]');
+-			fielddisplay(obj,'vel_obs','observed velocity magnitude [m/yr]');
+-			fielddisplay(obj,'thickness_obs','observed thickness [m]');
+-			fielddisplay(obj,'surface_obs','observed surface elevation [m]');
++			fielddisplay(self,'iscontrol','is inversion activated?');
++			fielddisplay(self,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}');
++			fielddisplay(self,'control_scaling_factors','order of magnitude of each control (useful for multi-parameter optimization)');
++			fielddisplay(self,'maxsteps','maximum number of iterations (gradient computation)');
++			fielddisplay(self,'maxiter','maximum number of Function evaluation (forward run)');
++			fielddisplay(self,'dxmin','convergence criterion: two points less than dxmin from eachother (sup-norm) are considered identical');
++			fielddisplay(self,'gttol','convergence criterion: ||g(X)||/||g(X0)|| (g(X0): gradient at initial guess X0)');
++			fielddisplay(self,'cost_functions','indicate the type of response for each optimization step');
++			fielddisplay(self,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter');
++			fielddisplay(self,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex');
++			fielddisplay(self,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex');
++			fielddisplay(self,'vx_obs','observed velocity x component [m/yr]');
++			fielddisplay(self,'vy_obs','observed velocity y component [m/yr]');
++			fielddisplay(self,'vel_obs','observed velocity magnitude [m/yr]');
++			fielddisplay(self,'thickness_obs','observed thickness [m]');
++			fielddisplay(self,'surface_obs','observed surface elevation [m]');
+ 			
+ 			disp('Available cost functions:');
+ 			disp('   101: SurfaceAbsVelMisfit');
+@@ -124,67 +124,67 @@
+ 			disp('   502: RheologyBbarAbsGradient');
+ 			disp('   503: ThicknessAbsGradient');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			yts=365.0*24.0*3600.0;
+ 
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','iscontrol','format','Boolean');
++			WriteData(fid,'object',self,'class','inversion','fieldname','iscontrol','format','Boolean');
+ 			WriteData(fid,'enum',InversionTypeEnum(),'data',4,'format','Integer');
+-			if ~obj.iscontrol, return; end
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','control_scaling_factors','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','maxsteps','format','Integer');
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','maxiter','format','Integer');
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','dxmin','format','Double');
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','gttol','format','Double');
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','min_parameters','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','max_parameters','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','vx_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','vy_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','vz_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+-			if(numel(obj.thickness_obs)==md.mesh.numberofelements),
++			if ~self.iscontrol, return; end
++			WriteData(fid,'object',self,'class','inversion','fieldname','control_scaling_factors','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'class','inversion','fieldname','maxsteps','format','Integer');
++			WriteData(fid,'object',self,'class','inversion','fieldname','maxiter','format','Integer');
++			WriteData(fid,'object',self,'class','inversion','fieldname','dxmin','format','Double');
++			WriteData(fid,'object',self,'class','inversion','fieldname','gttol','format','Double');
++			WriteData(fid,'object',self,'class','inversion','fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','inversion','fieldname','min_parameters','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'class','inversion','fieldname','max_parameters','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'class','inversion','fieldname','vx_obs','format','DoubleMat','mattype',1,'scale',1./yts);
++			WriteData(fid,'object',self,'class','inversion','fieldname','vy_obs','format','DoubleMat','mattype',1,'scale',1./yts);
++			WriteData(fid,'object',self,'class','inversion','fieldname','vz_obs','format','DoubleMat','mattype',1,'scale',1./yts);
++			if(numel(self.thickness_obs)==md.mesh.numberofelements),
+ 				mattype=2;
+ 			else
+ 				mattype=1;
+ 			end
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',mattype);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','surface_obs','format','DoubleMat','mattype',mattype);
++			WriteData(fid,'object',self,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',mattype);
++			WriteData(fid,'object',self,'class','inversion','fieldname','surface_obs','format','DoubleMat','mattype',mattype);
+ 
+ 			%process control parameters
+-			num_control_parameters=numel(obj.control_parameters);
++			num_control_parameters=numel(self.control_parameters);
+ 			data=zeros(1,num_control_parameters);
+ 			for i=1:num_control_parameters,
+-				data(i)=StringToEnum(obj.control_parameters{i});
++				data(i)=StringToEnum(self.control_parameters{i});
+ 			end
+ 			WriteData(fid,'data',data,'enum',InversionControlParametersEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_control_parameters,'enum',InversionNumControlParametersEnum(),'format','Integer');
+ 
+ 			%process cost functions
+-			num_cost_functions=size(obj.cost_functions,2);
+-			data=obj.cost_functions;
+-			pos=find(obj.cost_functions==101); data(pos)=SurfaceAbsVelMisfitEnum();
+-			pos=find(obj.cost_functions==102); data(pos)=SurfaceRelVelMisfitEnum();
+-			pos=find(obj.cost_functions==103); data(pos)=SurfaceLogVelMisfitEnum();
+-			pos=find(obj.cost_functions==104); data(pos)=SurfaceLogVxVyMisfitEnum();
+-			pos=find(obj.cost_functions==105); data(pos)=SurfaceAverageVelMisfitEnum();
+-			pos=find(obj.cost_functions==201); data(pos)=ThicknessAbsMisfitEnum();
+-			pos=find(obj.cost_functions==501); data(pos)=DragCoefficientAbsGradientEnum();
+-			pos=find(obj.cost_functions==502); data(pos)=RheologyBbarAbsGradientEnum();
+-			pos=find(obj.cost_functions==503); data(pos)=ThicknessAbsGradientEnum();
+-			pos=find(obj.cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
+-			pos=find(obj.cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
+-			pos=find(obj.cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
+-			pos=find(obj.cost_functions==601); data(pos)=SurfaceAbsMisfitEnum();
+-			pos=find(obj.cost_functions==1001); data(pos)=Outputdefinition1Enum();
+-			pos=find(obj.cost_functions==1002); data(pos)=Outputdefinition2Enum();
+-			pos=find(obj.cost_functions==1003); data(pos)=Outputdefinition3Enum();
+-			pos=find(obj.cost_functions==1004); data(pos)=Outputdefinition4Enum();
+-			pos=find(obj.cost_functions==1005); data(pos)=Outputdefinition5Enum();
+-			pos=find(obj.cost_functions==1006); data(pos)=Outputdefinition6Enum();
+-			pos=find(obj.cost_functions==1007); data(pos)=Outputdefinition7Enum();
+-			pos=find(obj.cost_functions==1008); data(pos)=Outputdefinition8Enum();
+-			pos=find(obj.cost_functions==1009); data(pos)=Outputdefinition8Enum();
+-			pos=find(obj.cost_functions==1010); data(pos)=Outputdefinition10Enum();
++			num_cost_functions=size(self.cost_functions,2);
++			data=self.cost_functions;
++			pos=find(self.cost_functions==101); data(pos)=SurfaceAbsVelMisfitEnum();
++			pos=find(self.cost_functions==102); data(pos)=SurfaceRelVelMisfitEnum();
++			pos=find(self.cost_functions==103); data(pos)=SurfaceLogVelMisfitEnum();
++			pos=find(self.cost_functions==104); data(pos)=SurfaceLogVxVyMisfitEnum();
++			pos=find(self.cost_functions==105); data(pos)=SurfaceAverageVelMisfitEnum();
++			pos=find(self.cost_functions==201); data(pos)=ThicknessAbsMisfitEnum();
++			pos=find(self.cost_functions==501); data(pos)=DragCoefficientAbsGradientEnum();
++			pos=find(self.cost_functions==502); data(pos)=RheologyBbarAbsGradientEnum();
++			pos=find(self.cost_functions==503); data(pos)=ThicknessAbsGradientEnum();
++			pos=find(self.cost_functions==504); data(pos)=ThicknessAlongGradientEnum();
++			pos=find(self.cost_functions==505); data(pos)=ThicknessAcrossGradientEnum();
++			pos=find(self.cost_functions==506); data(pos)=BalancethicknessMisfitEnum();
++			pos=find(self.cost_functions==601); data(pos)=SurfaceAbsMisfitEnum();
++			pos=find(self.cost_functions==1001); data(pos)=Outputdefinition1Enum();
++			pos=find(self.cost_functions==1002); data(pos)=Outputdefinition2Enum();
++			pos=find(self.cost_functions==1003); data(pos)=Outputdefinition3Enum();
++			pos=find(self.cost_functions==1004); data(pos)=Outputdefinition4Enum();
++			pos=find(self.cost_functions==1005); data(pos)=Outputdefinition5Enum();
++			pos=find(self.cost_functions==1006); data(pos)=Outputdefinition6Enum();
++			pos=find(self.cost_functions==1007); data(pos)=Outputdefinition7Enum();
++			pos=find(self.cost_functions==1008); data(pos)=Outputdefinition8Enum();
++			pos=find(self.cost_functions==1009); data(pos)=Outputdefinition8Enum();
++			pos=find(self.cost_functions==1010); data(pos)=Outputdefinition10Enum();
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/mesh2d.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mesh2d.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/mesh2d.m	(revision 19040)
+@@ -69,16 +69,16 @@
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%the connectivity is the averaged number of nodes linked to a
+ 			%given node through an edge. This connectivity is used to initially
+ 			%allocate memory to the stiffness matrix. A value of 16 seems to
+ 			%give a good memory/time ration. This value can be checked in
+ 			%trunk/test/Miscellaneous/runme.m
+-			obj.average_vertex_connectivity=25;
++			self.average_vertex_connectivity=25;
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			md = checkfield(md,'fieldname','mesh.x','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','mesh.y','NaN',1,'size',[md.mesh.numberofvertices 1]);
+@@ -96,69 +96,69 @@
+ 					md = checkmessage(md,'thermal not supported for 2d mesh');
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   2D tria Mesh (horizontal):')); 
+ 
+ 			disp(sprintf('\n      Elements and vertices:'));
+-			fielddisplay(obj,'numberofelements','number of elements');
+-			fielddisplay(obj,'numberofvertices','number of vertices');
+-			fielddisplay(obj,'elements','vertex indices of the mesh elements');
+-			fielddisplay(obj,'x','vertices x coordinate [m]');
+-			fielddisplay(obj,'y','vertices y coordinate [m]');
+-			fielddisplay(obj,'edges','edges of the 2d mesh (vertex1 vertex2 element1 element2)');
+-			fielddisplay(obj,'numberofedges','number of edges of the 2d mesh');
++			fielddisplay(self,'numberofelements','number of elements');
++			fielddisplay(self,'numberofvertices','number of vertices');
++			fielddisplay(self,'elements','vertex indices of the mesh elements');
++			fielddisplay(self,'x','vertices x coordinate [m]');
++			fielddisplay(self,'y','vertices y coordinate [m]');
++			fielddisplay(self,'edges','edges of the 2d mesh (vertex1 vertex2 element1 element2)');
++			fielddisplay(self,'numberofedges','number of edges of the 2d mesh');
+ 
+ 			disp(sprintf('\n      Properties:'));
+-			fielddisplay(obj,'vertexonboundary','vertices on the boundary of the domain flag list');
+-			fielddisplay(obj,'segments','edges on domain boundary (vertex1 vertex2 element)');
+-			fielddisplay(obj,'segmentmarkers','number associated to each segment');
+-			fielddisplay(obj,'vertexconnectivity','list of vertices connected to vertex_i');
+-			fielddisplay(obj,'elementconnectivity','list of vertices connected to element_i');
+-			fielddisplay(obj,'average_vertex_connectivity','average number of vertices connected to one vertex');
++			fielddisplay(self,'vertexonboundary','vertices on the boundary of the domain flag list');
++			fielddisplay(self,'segments','edges on domain boundary (vertex1 vertex2 element)');
++			fielddisplay(self,'segmentmarkers','number associated to each segment');
++			fielddisplay(self,'vertexconnectivity','list of vertices connected to vertex_i');
++			fielddisplay(self,'elementconnectivity','list of vertices connected to element_i');
++			fielddisplay(self,'average_vertex_connectivity','average number of vertices connected to one vertex');
+ 
+ 			disp(sprintf('\n      Extracted model:'));
+-			fielddisplay(obj,'extractedvertices','vertices extracted from the model');
+-			fielddisplay(obj,'extractedelements','elements extracted from the model');
++			fielddisplay(self,'extractedvertices','vertices extracted from the model');
++			fielddisplay(self,'extractedelements','elements extracted from the model');
+ 
+ 			disp(sprintf('\n      Projection:'));
+-			fielddisplay(obj,'lat','vertices latitude [degrees]');
+-			fielddisplay(obj,'long','vertices longitude [degrees]');
+-			fielddisplay(obj,'epsg','EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)');
++			fielddisplay(self,'lat','vertices latitude [degrees]');
++			fielddisplay(self,'long','vertices longitude [degrees]');
++			fielddisplay(self,'epsg','EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)');
+ 		end % }}}
+-		function createxml(obj,fid) % {{{
++		function createxml(self,fid) % {{{
+ 			fprintf(fid, '<!-- 2D tria Mesh (horizontal) -->\n');
+ 
+ 			%elements and vertices
+ 			fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Elements and vertices">','<section name="mesh" />');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="numberofelements" type="',class(obj.numberofelements),'" default="',convert2str(obj.numberofelements),'">','     <section name="mesh" />','     <help> number of elements </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="numberofvertices" type="',class(obj.numberofvertices),'" default="',convert2str(obj.numberofvertices),'">','     <section name="mesh" />','     <help> number of vertices </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="elements" type="',class(obj.elements),'" default="',convert2str(obj.elements),'">','     <section name="mesh" />','     <help> vertex indices of the mesh elements </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x" type="',class(obj.x),'" default="',convert2str(obj.x),'">','     <section name="mesh" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y" type="',class(obj.y),'" default="',convert2str(obj.y),'">','     <section name="mesh" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="edges" type="',class(obj.edges),'" default="',convert2str(obj.edges),'">','     <section name="mesh" />','     <help> edges of the 2d mesh (vertex1 vertex2 element1 element2) </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberofedges" type="',class(obj.numberofedges),'" default="',convert2str(obj.numberofedges),'">','     <section name="mesh" />','     <help> number of edges of the 2d mesh </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="numberofelements" type="',class(self.numberofelements),'" default="',convert2str(self.numberofelements),'">','     <section name="mesh" />','     <help> number of elements </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="numberofvertices" type="',class(self.numberofvertices),'" default="',convert2str(self.numberofvertices),'">','     <section name="mesh" />','     <help> number of vertices </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="elements" type="',class(self.elements),'" default="',convert2str(self.elements),'">','     <section name="mesh" />','     <help> vertex indices of the mesh elements </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x" type="',class(self.x),'" default="',convert2str(self.x),'">','     <section name="mesh" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y" type="',class(self.y),'" default="',convert2str(self.y),'">','     <section name="mesh" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="edges" type="',class(self.edges),'" default="',convert2str(self.edges),'">','     <section name="mesh" />','     <help> edges of the 2d mesh (vertex1 vertex2 element1 element2) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberofedges" type="',class(self.numberofedges),'" default="',convert2str(self.numberofedges),'">','     <section name="mesh" />','     <help> number of edges of the 2d mesh </help>','  </parameter>');
+ 			fprintf(fid,'%s\n%s\n','</frame>');
+ 
+ 			% properties
+ 			fprintf(fid,'%s\n%s\n%s\n','<frame key="2" label="Properties">','<section name="mesh" />');             
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonboundary" type="',class(obj.vertexonboundary),'" default="',convert2str(obj.vertexonboundary),'">','     <section name="mesh" />','     <help> vertices on the boundary of the domain flag list </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="segments" type="',class(obj.segments),'" default="',convert2str(obj.segments),'">','     <section name="mesh" />','     <help> edges on domain boundary (vertex1 vertex2 element) </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="segmentmarkers" type="',class(obj.segmentmarkers),'" default="',convert2str(obj.segmentmarkers),'">','     <section name="mesh" />','     <help> number associated to each segment </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexconnectivity" type="',class(obj.vertexconnectivity),'" default="',convert2str(obj.vertexconnectivity),'">','     <section name="mesh" />','     <help> list of vertices connected to vertex_i </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementconnectivity" type="',class(obj.elementconnectivity),'" default="',convert2str(obj.elementconnectivity),'">','     <section name="mesh" />','     <help> list of vertices connected to element_i </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="average_vertex_connectivity" type="',class(obj.average_vertex_connectivity),'" default="',convert2str(obj.average_vertex_connectivity),'">','     <section name="mesh" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonboundary" type="',class(self.vertexonboundary),'" default="',convert2str(self.vertexonboundary),'">','     <section name="mesh" />','     <help> vertices on the boundary of the domain flag list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="segments" type="',class(self.segments),'" default="',convert2str(self.segments),'">','     <section name="mesh" />','     <help> edges on domain boundary (vertex1 vertex2 element) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="segmentmarkers" type="',class(self.segmentmarkers),'" default="',convert2str(self.segmentmarkers),'">','     <section name="mesh" />','     <help> number associated to each segment </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexconnectivity" type="',class(self.vertexconnectivity),'" default="',convert2str(self.vertexconnectivity),'">','     <section name="mesh" />','     <help> list of vertices connected to vertex_i </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementconnectivity" type="',class(self.elementconnectivity),'" default="',convert2str(self.elementconnectivity),'">','     <section name="mesh" />','     <help> list of vertices connected to element_i </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="average_vertex_connectivity" type="',class(self.average_vertex_connectivity),'" default="',convert2str(self.average_vertex_connectivity),'">','     <section name="mesh" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
+ 			fprintf(fid,'%s\n%s\n','</frame>');
+ 
+ 			%extracted model
+ 			fprintf(fid,'%s\n%s\n%s\n','<frame key="3" label="Extracted Model">','<section name="mesh" />'); 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedvertices" type="',class(obj.extractedvertices),'" default="',convert2str(obj.extractedvertices),'">','     <section name="mesh" />','     <help> vertices extracted from the model </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedelements" type="',class(obj.extractedelements),'" default="',convert2str(obj.extractedelements),'">','     <section name="mesh" />','     <help> elements extracted from the model </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedvertices" type="',class(self.extractedvertices),'" default="',convert2str(self.extractedvertices),'">','     <section name="mesh" />','     <help> vertices extracted from the model </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedelements" type="',class(self.extractedelements),'" default="',convert2str(self.extractedelements),'">','     <section name="mesh" />','     <help> elements extracted from the model </help>','  </parameter>');
+ 			fprintf(fid,'%s\n%s\n','</frame>');
+ 
+ 			%projection
+ 			fprintf(fid,'%s\n%s\n%s\n','<frame key="4" label="Projection">','<section name="mesh" />'); 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lat" type="',class(obj.lat),'" default="',convert2str(obj.lat),'">','     <section name="mesh" />','     <help> vertices latitude [degrees] </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="long" type="',class(obj.long),'" default="',convert2str(obj.long),'">','     <section name="mesh" />','     <help> verticies longitude [degrees] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lat" type="',class(self.lat),'" default="',convert2str(self.lat),'">','     <section name="mesh" />','     <help> vertices latitude [degrees] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="long" type="',class(self.long),'" default="',convert2str(self.long),'">','     <section name="mesh" />','     <help> verticies longitude [degrees] </help>','  </parameter>');
+ 			% choice (epsg) 'n' or 's'
+ 			fprintf(fid,'%s\n%s\n%s\n','  <parameter key ="epsg" type="alternative" optional="false">','     <section name="mesh" />','     <help> Indicate epsg ''n'' or ''s'' </help>');
+ 			fprintf(fid,'%s\n','       <option value="n" type="string" default="true"> </option>');
+@@ -167,26 +167,26 @@
+ 			fprintf(fid,'%s\n%s\n','</frame>');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'enum',DomainTypeEnum(),'data',StringToEnum(['Domain' domaintype(obj)]),'format','Integer');
+-			WriteData(fid,'enum',DomainDimensionEnum(),'data',dimension(obj),'format','Integer');
+-			WriteData(fid,'enum',MeshElementtypeEnum(),'data',StringToEnum(elementtype(obj)),'format','Integer');
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','x','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','y','format','DoubleMat','mattype',1);
+-			WriteData(fid,'enum',MeshZEnum(),'data',zeros(obj.numberofvertices,1),'format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','elements','format','DoubleMat','mattype',2);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','numberofelements','format','Integer');
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','numberofvertices','format','Integer');
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','average_vertex_connectivity','format','Integer');
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','vertexonboundary','format','DoubleMat','mattype',1);
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'enum',DomainTypeEnum(),'data',StringToEnum(['Domain' domaintype(self)]),'format','Integer');
++			WriteData(fid,'enum',DomainDimensionEnum(),'data',dimension(self),'format','Integer');
++			WriteData(fid,'enum',MeshElementtypeEnum(),'data',StringToEnum(elementtype(self)),'format','Integer');
++			WriteData(fid,'object',self,'class','mesh','fieldname','x','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','mesh','fieldname','y','format','DoubleMat','mattype',1);
++			WriteData(fid,'enum',MeshZEnum(),'data',zeros(self.numberofvertices,1),'format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','mesh','fieldname','elements','format','DoubleMat','mattype',2);
++			WriteData(fid,'object',self,'class','mesh','fieldname','numberofelements','format','Integer');
++			WriteData(fid,'object',self,'class','mesh','fieldname','numberofvertices','format','Integer');
++			WriteData(fid,'object',self,'class','mesh','fieldname','average_vertex_connectivity','format','Integer');
++			WriteData(fid,'object',self,'class','mesh','fieldname','vertexonboundary','format','DoubleMat','mattype',1);
+ 		end % }}}
+-		function t = domaintype(obj) % {{{
++		function t = domaintype(self) % {{{
+ 			t = '2Dhorizontal';
+ 		end % }}}
+-		function d = dimension(obj) % {{{
++		function d = dimension(self) % {{{
+ 			d = 2;
+ 		end % }}}
+-		function s = elementtype(obj) % {{{
++		function s = elementtype(self) % {{{
+ 			s = 'Tria';
+ 		end % }}}
+ 	end
+Index: ../trunk-jpl/src/m/classes/calving.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calving.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/calving.m	(revision 19040)
+@@ -10,10 +10,10 @@
+ 		meltingrate   = NaN;
+ 	end
+ 	methods
+-		function obj = calving(varargin) % {{{
++		function self = calving(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+ 					inputstruct=varargin{1};
+ 					list1 = properties('calving');
+@@ -21,20 +21,20 @@
+ 					for i=1:length(list1)
+ 						fieldname = list1{i};
+ 						if ismember(fieldname,list2),
+-							obj.(fieldname) = inputstruct.(fieldname);
++							self.(fieldname) = inputstruct.(fieldname);
+ 						end
+ 					end
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%stabilization = 2 by default
+-			obj.stabilization = 2;
++			self.stabilization = 2;
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 			%Early return
+ 			if (solution~=TransientSolutionEnum() | md.transient.iscalving==0), return; end
+ 
+@@ -42,18 +42,18 @@
+ 			md = checkfield(md,'fieldname','calving.calvingrate(1:md.mesh.numberofvertices,:)','>=',0,'timeseries',1,'NaN',1);
+ 			md = checkfield(md,'fieldname','calving.meltingrate(1:md.mesh.numberofvertices,:)','>=',0,'timeseries',1,'NaN',1);
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   Calving parameters:'));
+-			fielddisplay(obj,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding');
+-			fielddisplay(obj,'calvingrate','calving rate at given location [m/a]');
+-			fielddisplay(obj,'meltingrate','melting rate at given location [m/a]');
++			fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding');
++			fielddisplay(self,'calvingrate','calving rate at given location [m/a]');
++			fielddisplay(self,'meltingrate','melting rate at given location [m/a]');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 			yts=365.0*24.0*3600.0;
+ 			WriteData(fid,'enum',CalvingLawEnum(),'data',DefaultCalvingEnum(),'format','Integer');
+-			WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',obj.stabilization,'format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','calvingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts);
+-			WriteData(fid,'object',obj,'fieldname','meltingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts);
++			WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',self.stabilization,'format','Integer');
++			WriteData(fid,'object',self,'fieldname','calvingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts);
++			WriteData(fid,'object',self,'fieldname','meltingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/inversionvalidation.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 19040)
+@@ -21,10 +21,10 @@
+ 		surface_obs                 = NaN
+ 	end
+ 	methods
+-		function obj = inversionvalidation(varargin) % {{{
++		function self = inversionvalidation(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+ 					obj=structtoobj(inversionvalidation(),varargin{1});
+ 				otherwise
+@@ -46,10 +46,10 @@
+ 			%several responses can be used:
+ 			self.cost_functions=101;
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return
+-			if ~obj.iscontrol, return; end
++			if ~self.iscontrol, return; end
+ 
+ 			num_controls=numel(md.inversion.control_parameters);
+ 			num_costfunc=size(md.inversion.cost_functions,2);
+@@ -74,21 +74,21 @@
+ 				end
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   inversionvalidation parameters:'));
+-			fielddisplay(obj,'iscontrol','is inversion activated?');
+-			fielddisplay(obj,'incomplete_adjoint','1: linear viscosity, 0: non-linear viscosity');
+-			fielddisplay(obj,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}');
+-			fielddisplay(obj,'control_scaling_factors','order of magnitude of each control (useful for multi-parameter optimization)');
+-			fielddisplay(obj,'cost_functions','indicate the type of response for each optimization step');
+-			fielddisplay(obj,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter');
+-			fielddisplay(obj,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex');
+-			fielddisplay(obj,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex');
+-			fielddisplay(obj,'vx_obs','observed velocity x component [m/yr]');
+-			fielddisplay(obj,'vy_obs','observed velocity y component [m/yr]');
+-			fielddisplay(obj,'vel_obs','observed velocity magnitude [m/yr]');
+-			fielddisplay(obj,'thickness_obs','observed thickness [m]');
+-			fielddisplay(obj,'surface_obs','observed surface elevation [m]');
++			fielddisplay(self,'iscontrol','is inversion activated?');
++			fielddisplay(self,'incomplete_adjoint','1: linear viscosity, 0: non-linear viscosity');
++			fielddisplay(self,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}');
++			fielddisplay(self,'control_scaling_factors','order of magnitude of each control (useful for multi-parameter optimization)');
++			fielddisplay(self,'cost_functions','indicate the type of response for each optimization step');
++			fielddisplay(self,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter');
++			fielddisplay(self,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex');
++			fielddisplay(self,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex');
++			fielddisplay(self,'vx_obs','observed velocity x component [m/yr]');
++			fielddisplay(self,'vy_obs','observed velocity y component [m/yr]');
++			fielddisplay(self,'vel_obs','observed velocity magnitude [m/yr]');
++			fielddisplay(self,'thickness_obs','observed thickness [m]');
++			fielddisplay(self,'surface_obs','observed surface elevation [m]');
+ 			disp('Available cost functions:');
+ 			disp('   101: SurfaceAbsVelMisfit');
+ 			disp('   102: SurfaceRelVelMisfit');
+@@ -100,41 +100,41 @@
+ 			disp('   502: RheologyBbarAbsGradient');
+ 			disp('   503: ThicknessAbsGradient');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			yts=365.0*24.0*3600.0;
+ 
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','iscontrol','format','Boolean');
++			WriteData(fid,'object',self,'class','inversion','fieldname','iscontrol','format','Boolean');
+ 			WriteData(fid,'enum',InversionTypeEnum(),'data',3,'format','Integer');
+-			if ~obj.iscontrol, return; end
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','incomplete_adjoint','format','Boolean');
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','control_scaling_factors','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','min_parameters','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','max_parameters','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','vx_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','vy_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','vz_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+-			if(numel(obj.thickness_obs)==md.mesh.numberofelements),
++			if ~self.iscontrol, return; end
++			WriteData(fid,'object',self,'class','inversion','fieldname','incomplete_adjoint','format','Boolean');
++			WriteData(fid,'object',self,'class','inversion','fieldname','control_scaling_factors','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'class','inversion','fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','inversion','fieldname','min_parameters','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'class','inversion','fieldname','max_parameters','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'class','inversion','fieldname','vx_obs','format','DoubleMat','mattype',1,'scale',1./yts);
++			WriteData(fid,'object',self,'class','inversion','fieldname','vy_obs','format','DoubleMat','mattype',1,'scale',1./yts);
++			WriteData(fid,'object',self,'class','inversion','fieldname','vz_obs','format','DoubleMat','mattype',1,'scale',1./yts);
++			if(numel(self.thickness_obs)==md.mesh.numberofelements),
+ 				mattype=2; 
+ 			else
+ 				mattype=1;
+ 			end
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',mattype);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','surface_obs','format','DoubleMat','mattype',mattype);
++			WriteData(fid,'object',self,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',mattype);
++			WriteData(fid,'object',self,'class','inversion','fieldname','surface_obs','format','DoubleMat','mattype',mattype);
+ 
+ 			%process control parameters
+-			num_control_parameters=numel(obj.control_parameters);
++			num_control_parameters=numel(self.control_parameters);
+ 			data=zeros(1,num_control_parameters);
+ 			for i=1:num_control_parameters,
+-				data(i)=StringToEnum(obj.control_parameters{i});
++				data(i)=StringToEnum(self.control_parameters{i});
+ 			end
+ 			WriteData(fid,'data',data,'enum',InversionControlParametersEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_control_parameters,'enum',InversionNumControlParametersEnum(),'format','Integer');
+ 
+ 			%process cost functions
+-			num_cost_functions=size(obj.cost_functions,2);
+-			data=marshallcostfunctions(obj.cost_functions);
++			num_cost_functions=size(self.cost_functions,2);
++			data=marshallcostfunctions(self.cost_functions);
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/SMBcomponents.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBcomponents.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/SMBcomponents.m	(revision 19040)
+@@ -10,7 +10,7 @@
+ 		evaporation = NaN;
+ 	end
+ 	methods
+-		function obj = SMBcomponents(varargin) % {{{
++		function self = SMBcomponents(varargin) % {{{
+ 			switch nargin
+ 				case 0
+ 				otherwise
+@@ -40,7 +40,7 @@
+ 			end
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			if ismember(MasstransportAnalysisEnum(),analyses),
+ 				md = checkfield(md,'fieldname','surfaceforcings.accumulation','timeseries',1,'NaN',1);
+@@ -61,20 +61,20 @@
+ 				md = checkfield(md,'fieldname','surfaceforcings.evaporation','size',[md.mesh.numberofvertices 1],'NaN',1);
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   surface forcings parameters (SMB=accumulation-runoff-evaporation) :'));
+-			fielddisplay(obj,'accumulation','accumulated snow [m/yr ice eq]');
+-			fielddisplay(obj,'runoff','amount of ice melt lost from the ice column [m/yr ice eq]');
+-			fielddisplay(obj,'evaporation','amount of ice lost to evaporative processes [m/yr ice eq]');
++			fielddisplay(self,'accumulation','accumulated snow [m/yr ice eq]');
++			fielddisplay(self,'runoff','amount of ice melt lost from the ice column [m/yr ice eq]');
++			fielddisplay(self,'evaporation','amount of ice lost to evaporative processes [m/yr ice eq]');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBcomponentsEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','accumulation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','runoff','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','evaporation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','accumulation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','runoff','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','evaporation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/stressbalance.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/stressbalance.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/stressbalance.m	(revision 19040)
+@@ -25,15 +25,15 @@
+ 		requested_outputs      = {};
+ 	end
+ 	methods
+-		function createxml(obj,fid) % {{{
++		function createxml(self,fid) % {{{
+ 			fprintf(fid, '\n\n');
+ 			fprintf(fid, '%s\n', '<!-- StressBalance solution parameters: -->');
+ 
+ 			% Convergence criteria            
+ 			fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Convergence criteria">','<section name="stressbalance" />'); 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="restol" type="',      class(obj.restol),'" default="',        convert2str(obj.restol),'">',	'     <section name="stressbalance" />','     <help> mechanical equilibrium residual convergence criterion </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="reltol" type="',          class(obj.reltol),'" default="',            convert2str(obj.reltol),'">',     '     <section name="stressbalance" />','     <help> velocity relative convergence criterion, NaN: not applied </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',	'<parameter key ="abstol" type="',        class(obj.abstol),'" default="',          convert2str(obj.abstol),'">',	'     <section name="stressbalance" />','     <help> velocity absolute convergence criterion, NaN: not applied </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="restol" type="',      class(self.restol),'" default="',        convert2str(self.restol),'">',	'     <section name="stressbalance" />','     <help> mechanical equilibrium residual convergence criterion </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="reltol" type="',          class(self.reltol),'" default="',            convert2str(self.reltol),'">',     '     <section name="stressbalance" />','     <help> velocity relative convergence criterion, NaN: not applied </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',	'<parameter key ="abstol" type="',        class(self.abstol),'" default="',          convert2str(self.abstol),'">',	'     <section name="stressbalance" />','     <help> velocity absolute convergence criterion, NaN: not applied </help>','</parameter>');
+ 
+ 			%is newton drop-down (0,1,or 2)
+ 			fprintf(fid,'%s\n%s\n%s\n%s\n',    '<parameter key ="isnewton" type="alternative" optional="false">',	'     <section name="stressbalance" />','     <help> 0: Picards fixed point, 1: Newtons method, 2: hybrid </help>');
+@@ -41,38 +41,38 @@
+ 			fprintf(fid,'%s\n','       <option value="1" type="string" default="false"> </option>');
+ 			fprintf(fid,'%s\n%s\n','       <option value="2" type="string" default="false"> </option>','</parameter>');
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="maxiter" type="',  	class(obj.maxiter),'" default="',       convert2str(obj.maxiter),'">',     '     <section name="stressbalance" />','     <help> maximum number of nonlinear iterations </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="viscosity_overshoot" type="',         class(obj.viscosity_overshoot),'" default="',           convert2str(obj.viscosity_overshoot),'">',	'     <section name="stressbalance" />','     <help> over-shooting constant new=new+C*(new-old) </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="maxiter" type="',  	class(self.maxiter),'" default="',       convert2str(self.maxiter),'">',     '     <section name="stressbalance" />','     <help> maximum number of nonlinear iterations </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="viscosity_overshoot" type="',         class(self.viscosity_overshoot),'" default="',           convert2str(self.viscosity_overshoot),'">',	'     <section name="stressbalance" />','     <help> over-shooting constant new=new+C*(new-old) </help>','</parameter>');
+ 			fprintf(fid,'%s\n%s\n','</frame>');
+ 
+ 			% boundary conditions    
+ 			fprintf(fid,'%s\n%s\n%s\n','<frame key="2" label="Boundary conditions">','<section name="stressbalance" />'); 			 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcvx" type="',     	class(obj.spcvx),'" default="',    	convert2str(obj.spcvx),'">',     '     <section name="stressbalance" />','     <help> x-axis velocity constraint (NaN means no constraint) [m/yr] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcvy" type="',     	class(obj.spcvy),'" default="',    	convert2str(obj.spcvy),'">',	'     <section name="stressbalance" />','     <help> y-axis velocity constraint (NaN means no constraint) [m/yr] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcvz" type="',    	class(obj.spcvz),'" default="',    	convert2str(obj.spcvz),'">',     '     <section name="stressbalance" />','     <help> z-axis velocity constraint (NaN means no constraint) [m/yr] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcvx" type="',     	class(self.spcvx),'" default="',    	convert2str(self.spcvx),'">',     '     <section name="stressbalance" />','     <help> x-axis velocity constraint (NaN means no constraint) [m/yr] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcvy" type="',     	class(self.spcvy),'" default="',    	convert2str(self.spcvy),'">',	'     <section name="stressbalance" />','     <help> y-axis velocity constraint (NaN means no constraint) [m/yr] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcvz" type="',    	class(self.spcvz),'" default="',    	convert2str(self.spcvz),'">',     '     <section name="stressbalance" />','     <help> z-axis velocity constraint (NaN means no constraint) [m/yr] </help>','</parameter>');
+ 			fprintf(fid,'%s\n%s\n','</frame>');
+ 
+ 			% Rift options   
+ 			fprintf(fid,'%s\n%s\n%s\n','<frame key="3" label="Rift options">','<section name="stressbalance" />'); 	
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="rift_penalty_threshold" type="',    	class(obj.rift_penalty_threshold),'" default="',       convert2str(obj.rift_penalty_threshold),'">',     '     <section name="stressbalance" />','     <help> threshold for instability of mechanical constraints </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    	'<parameter key ="rift_penalty_lock" type="',         class(obj.rift_penalty_lock),'" default="',           convert2str(obj.rift_penalty_lock),'">',	'     <section name="stressbalance" />','     <help> number of iterations before rift penalties are locked </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="rift_penalty_threshold" type="',    	class(self.rift_penalty_threshold),'" default="',       convert2str(self.rift_penalty_threshold),'">',     '     <section name="stressbalance" />','     <help> threshold for instability of mechanical constraints </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    	'<parameter key ="rift_penalty_lock" type="',         class(self.rift_penalty_lock),'" default="',           convert2str(self.rift_penalty_lock),'">',	'     <section name="stressbalance" />','     <help> number of iterations before rift penalties are locked </help>','</parameter>');
+ 			fprintf(fid,'%s\n%s\n','</frame>'); 
+ 
+ 			%others
+ 			fprintf(fid,'%s\n%s\n%s\n','<frame key="4" label="Other">','<section name="stressbalance" />'); 	
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="shelf_dampening" type="',  	class(obj.shelf_dampening),'" default="',       convert2str(obj.shelf_dampening),'">',     '     <section name="stressbalance" />','     <help> use dampening for floating ice ? Only for FS model </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',  	'<parameter key ="FSreconditioning" type="', 	class(obj.FSreconditioning),'" default="',           convert2str(obj.FSreconditioning),'">',	'     <section name="stressbalance" />','     <help> multiplier for incompressibility equation. Only for FS model </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="referential" type="',  	class(obj.referential),'" default="',       convert2str(obj.referential),'">',     '     <section name="stressbalance" />','     <help> local referential </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',  	'<parameter key ="loadingforce" type="', 	class(obj.loadingforce),'" default="',           convert2str(obj.loadingforce),'">',	'     <section name="stressbalance" />','     <help> loading force applied on each point [N/m^3] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="requested_outputs" type="',  	class(obj.requested_outputs),'" default="',       convert2str(obj.requested_outputs),'">',     '     <section name="stressbalance" />','     <help> additional outputs requested </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="shelf_dampening" type="',  	class(self.shelf_dampening),'" default="',       convert2str(self.shelf_dampening),'">',     '     <section name="stressbalance" />','     <help> use dampening for floating ice ? Only for FS model </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',  	'<parameter key ="FSreconditioning" type="', 	class(self.FSreconditioning),'" default="',           convert2str(self.FSreconditioning),'">',	'     <section name="stressbalance" />','     <help> multiplier for incompressibility equation. Only for FS model </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="referential" type="',  	class(self.referential),'" default="',       convert2str(self.referential),'">',     '     <section name="stressbalance" />','     <help> local referential </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',  	'<parameter key ="loadingforce" type="', 	class(self.loadingforce),'" default="',           convert2str(self.loadingforce),'">',	'     <section name="stressbalance" />','     <help> loading force applied on each point [N/m^3] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="requested_outputs" type="',  	class(self.requested_outputs),'" default="',       convert2str(self.requested_outputs),'">',     '     <section name="stressbalance" />','     <help> additional outputs requested </help>','</parameter>');
+ 
+ 
+ 			fprintf(fid,'%s\n%s\n','</frame>'); 
+ 		end % }}}
+-		function obj = stressbalance(varargin) % {{{
++		function self = stressbalance(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+ 					inputstruct=varargin{1};
+ 					list1 = properties('stressbalance');
+@@ -80,47 +80,47 @@
+ 					for i=1:length(list1)
+ 						fieldname = list1{i};
+ 						if ismember(fieldname,list2),
+-							obj.(fieldname) = inputstruct.(fieldname);
++							self.(fieldname) = inputstruct.(fieldname);
+ 						end
+ 					end
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			 %maximum of non-linear iterations.
+-			 obj.maxiter=100;
++			 self.maxiter=100;
+ 
+ 			 %Convergence criterion: absolute, relative and residual
+-			 obj.restol=10^-4; 
+-			 obj.reltol=0.01;
+-			 obj.abstol=10;
++			 self.restol=10^-4; 
++			 self.reltol=0.01;
++			 self.abstol=10;
+ 
+-			 obj.FSreconditioning=10^13;
+-			 obj.shelf_dampening=0;
++			 self.FSreconditioning=10^13;
++			 self.shelf_dampening=0;
+ 
+ 			 %Penalty factor applied kappa=max(stiffness matrix)*10^penalty_factor
+-			 obj.penalty_factor=3;
++			 self.penalty_factor=3;
+ 
+ 			 %coefficient to update the viscosity between each iteration of
+ 			 %a stressbalance according to the following formula
+ 			 %viscosity(n)=viscosity(n)+viscosity_overshoot(viscosity(n)-viscosity(n-1))
+-			 obj.viscosity_overshoot=0;
++			 self.viscosity_overshoot=0;
+ 
+ 			 %Stop the iterations of rift if below a threshold
+-			 obj.rift_penalty_threshold=0;
++			 self.rift_penalty_threshold=0;
+ 
+ 			 %in some solutions, it might be needed to stop a run when only
+ 			 %a few constraints remain unstable. For thermal computation, this
+ 			 %parameter is often used.
+-			 obj.rift_penalty_lock=10;
++			 self.rift_penalty_lock=10;
+ 
+ 			 %output default:
+-			 obj.requested_outputs={'default'};
++			 self.requested_outputs={'default'};
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return
+ 			if ~ismember(StressbalanceAnalysisEnum(),analyses), return; end
+@@ -174,42 +174,42 @@
+ 			end
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 
+ 			disp(sprintf('   StressBalance solution parameters:'));
+ 
+ 			disp(sprintf('\n      %s','Convergence criteria:'));
+-			fielddisplay(obj,'restol','mechanical equilibrium residual convergence criterion');
+-			fielddisplay(obj,'reltol','velocity relative convergence criterion, NaN: not applied');
+-			fielddisplay(obj,'abstol','velocity absolute convergence criterion, NaN: not applied');
+-			fielddisplay(obj,'isnewton','0: Picard''s fixed point, 1: Newton''s method, 2: hybrid');
+-			fielddisplay(obj,'maxiter','maximum number of nonlinear iterations');
+-			fielddisplay(obj,'viscosity_overshoot','over-shooting constant new=new+C*(new-old)');
++			fielddisplay(self,'restol','mechanical equilibrium residual convergence criterion');
++			fielddisplay(self,'reltol','velocity relative convergence criterion, NaN: not applied');
++			fielddisplay(self,'abstol','velocity absolute convergence criterion, NaN: not applied');
++			fielddisplay(self,'isnewton','0: Picard''s fixed point, 1: Newton''s method, 2: hybrid');
++			fielddisplay(self,'maxiter','maximum number of nonlinear iterations');
++			fielddisplay(self,'viscosity_overshoot','over-shooting constant new=new+C*(new-old)');
+ 
+ 			disp(sprintf('\n      %s','boundary conditions:'));
+-			fielddisplay(obj,'spcvx','x-axis velocity constraint (NaN means no constraint) [m/yr]');
+-			fielddisplay(obj,'spcvy','y-axis velocity constraint (NaN means no constraint) [m/yr]');
+-			fielddisplay(obj,'spcvz','z-axis velocity constraint (NaN means no constraint) [m/yr]');
++			fielddisplay(self,'spcvx','x-axis velocity constraint (NaN means no constraint) [m/yr]');
++			fielddisplay(self,'spcvy','y-axis velocity constraint (NaN means no constraint) [m/yr]');
++			fielddisplay(self,'spcvz','z-axis velocity constraint (NaN means no constraint) [m/yr]');
+ 
+ 			disp(sprintf('\n      %s','Rift options:'));
+-			fielddisplay(obj,'rift_penalty_threshold','threshold for instability of mechanical constraints');
+-			fielddisplay(obj,'rift_penalty_lock','number of iterations before rift penalties are locked');
++			fielddisplay(self,'rift_penalty_threshold','threshold for instability of mechanical constraints');
++			fielddisplay(self,'rift_penalty_lock','number of iterations before rift penalties are locked');
+ 
+ 			disp(sprintf('\n      %s','Penalty options:'));
+-			fielddisplay(obj,'penalty_factor','offset used by penalties: penalty = Kmax*10^offset');
+-			fielddisplay(obj,'vertex_pairing','pairs of vertices that are penalized');
++			fielddisplay(self,'penalty_factor','offset used by penalties: penalty = Kmax*10^offset');
++			fielddisplay(self,'vertex_pairing','pairs of vertices that are penalized');
+ 
+ 			disp(sprintf('\n      %s','Other:'));
+-			fielddisplay(obj,'shelf_dampening','use dampening for floating ice ? Only for FS model');
+-			fielddisplay(obj,'FSreconditioning','multiplier for incompressibility equation. Only for FS model');
+-			fielddisplay(obj,'referential','local referential');
+-			fielddisplay(obj,'loadingforce','loading force applied on each point [N/m^3]');
+-			fielddisplay(obj,'requested_outputs','additional outputs requested');
++			fielddisplay(self,'shelf_dampening','use dampening for floating ice ? Only for FS model');
++			fielddisplay(self,'FSreconditioning','multiplier for incompressibility equation. Only for FS model');
++			fielddisplay(self,'referential','local referential');
++			fielddisplay(self,'loadingforce','loading force applied on each point [N/m^3]');
++			fielddisplay(self,'requested_outputs','additional outputs requested');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','vertex_pairing','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'class','stressbalance','fieldname','vertex_pairing','format','DoubleMat','mattype',3);
+ 
+ 			if md.private.solution==SeaiceSolutionEnum,
+ 				return;
+@@ -217,32 +217,32 @@
+ 
+ 			yts=365.0*24.0*3600.0;
+ 
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','spcvx','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','spcvy','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','spcvz','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','restol','format','Double');
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','reltol','format','Double');
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','abstol','format','Double','scale',1./yts);
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','isnewton','format','Integer');
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','FSreconditioning','format','Double');
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','viscosity_overshoot','format','Double');
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','maxiter','format','Integer');
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','shelf_dampening','format','Integer');
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','penalty_factor','format','Double');
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','rift_penalty_lock','format','Integer');
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','rift_penalty_threshold','format','Integer');
+-			WriteData(fid,'object',obj,'class','stressbalance','fieldname','referential','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','stressbalance','fieldname','spcvx','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','stressbalance','fieldname','spcvy','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','stressbalance','fieldname','spcvz','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','stressbalance','fieldname','restol','format','Double');
++			WriteData(fid,'object',self,'class','stressbalance','fieldname','reltol','format','Double');
++			WriteData(fid,'object',self,'class','stressbalance','fieldname','abstol','format','Double','scale',1./yts);
++			WriteData(fid,'object',self,'class','stressbalance','fieldname','isnewton','format','Integer');
++			WriteData(fid,'object',self,'class','stressbalance','fieldname','FSreconditioning','format','Double');
++			WriteData(fid,'object',self,'class','stressbalance','fieldname','viscosity_overshoot','format','Double');
++			WriteData(fid,'object',self,'class','stressbalance','fieldname','maxiter','format','Integer');
++			WriteData(fid,'object',self,'class','stressbalance','fieldname','shelf_dampening','format','Integer');
++			WriteData(fid,'object',self,'class','stressbalance','fieldname','penalty_factor','format','Double');
++			WriteData(fid,'object',self,'class','stressbalance','fieldname','rift_penalty_lock','format','Integer');
++			WriteData(fid,'object',self,'class','stressbalance','fieldname','rift_penalty_threshold','format','Integer');
++			WriteData(fid,'object',self,'class','stressbalance','fieldname','referential','format','DoubleMat','mattype',1);
+ 
+-			WriteData(fid,'data',obj.loadingforce(:,1),'format','DoubleMat','mattype',1,'enum',LoadingforceXEnum);
+-			WriteData(fid,'data',obj.loadingforce(:,2),'format','DoubleMat','mattype',1,'enum',LoadingforceYEnum);
+-			WriteData(fid,'data',obj.loadingforce(:,3),'format','DoubleMat','mattype',1,'enum',LoadingforceZEnum);
++			WriteData(fid,'data',self.loadingforce(:,1),'format','DoubleMat','mattype',1,'enum',LoadingforceXEnum);
++			WriteData(fid,'data',self.loadingforce(:,2),'format','DoubleMat','mattype',1,'enum',LoadingforceYEnum);
++			WriteData(fid,'data',self.loadingforce(:,3),'format','DoubleMat','mattype',1,'enum',LoadingforceZEnum);
+ 
+ 			%process requested outputs
+-			outputs = obj.requested_outputs;
++			outputs = self.requested_outputs;
+ 			pos  = find(ismember(outputs,'default'));
+ 			if ~isempty(pos),
+ 				outputs(pos) = [];                         %remove 'default' from outputs
+-				outputs      = [outputs defaultoutputs(obj,md)]; %add defaults
++				outputs      = [outputs defaultoutputs(self,md)]; %add defaults
+ 			end
+ 			WriteData(fid,'data',outputs,'enum',StressbalanceRequestedOutputsEnum,'format','StringArray');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/hydrologyshreve.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologyshreve.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/hydrologyshreve.m	(revision 19040)
+@@ -9,33 +9,33 @@
+ 		stabilization  = 0;
+ 	end
+ 	methods
+-        function createxml(obj,fid) % {{{
++        function createxml(self,fid) % {{{
+             fprintf(fid, '\n\n');
+             fprintf(fid, '%s\n', '<!-- Hydrology -->');
+             
+             % Convergence criteria            
+             fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Hydrologyshreve solution parameters">','<section name="hydrologyshreve" />');                    
+             
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcwatercolumn" type="',      class(obj.spcwatercolumn),'" default="',        convert2str(obj.spcwatercolumn),'">',	'     <section name="hydrologyshreve" />','     <help> water thickness constraints (NaN means no constraint) [m] </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="stabilization" type="',         class(obj.stabilization),'" default="',           convert2str(obj.stabilization),'">',	'     <section name="hydrologyshreve" />','     <help> artificial diffusivity (default is 1). can be more than 1 to increase diffusivity. </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcwatercolumn" type="',      class(self.spcwatercolumn),'" default="',        convert2str(self.spcwatercolumn),'">',	'     <section name="hydrologyshreve" />','     <help> water thickness constraints (NaN means no constraint) [m] </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="stabilization" type="',         class(self.stabilization),'" default="',           convert2str(self.stabilization),'">',	'     <section name="hydrologyshreve" />','     <help> artificial diffusivity (default is 1). can be more than 1 to increase diffusivity. </help>','</parameter>');
+             fprintf(fid,'%s\n%s\n','</frame>');
+         end % }}}
+-		function obj = hydrologyshreve(varargin) % {{{
++		function self = hydrologyshreve(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+-					obj=structtoobj(obj,varargin{1});
++					obj=structtoobj(self,varargin{1});
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%Type of stabilization to use 0:nothing 1:artificial_diffusivity
+-			obj.stabilization=1;
++			self.stabilization=1;
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return
+ 			if ~ismember(HydrologyShreveAnalysisEnum(),analyses)
+@@ -45,16 +45,16 @@
+ 			md = checkfield(md,'fieldname','hydrology.spcwatercolumn','timeseries',1);
+ 			md = checkfield(md,'fieldname','hydrology.stabilization','>=',0);
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   hydrologyshreve solution parameters:'));
+-			fielddisplay(obj,'spcwatercolumn','water thickness constraints (NaN means no constraint) [m]');
+-			fielddisplay(obj,'stabilization','artificial diffusivity (default is 1). can be more than 1 to increase diffusivity.');
++			fielddisplay(self,'spcwatercolumn','water thickness constraints (NaN means no constraint) [m]');
++			fielddisplay(self,'stabilization','artificial diffusivity (default is 1). can be more than 1 to increase diffusivity.');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 			WriteData(fid,'enum',HydrologyModelEnum(),'data',HydrologyshreveEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','spcwatercolumn','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'fieldname','stabilization','format','Double');
++			WriteData(fid,'object',self,'fieldname','spcwatercolumn','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'fieldname','stabilization','format','Double');
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/independent.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/independent.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/independent.m	(revision 19040)
+@@ -12,61 +12,61 @@
+ 		nods                 = 0;
+ 	end
+ 	methods
+-		function obj = independent(varargin) % {{{
++		function self = independent(varargin) % {{{
+ 
+ 			%use provided options to change fields
+ 			options=pairoptions(varargin{:});
+ 
+ 			%OK get other fields
+-			obj=AssignObjectFields(pairoptions(varargin{:}),obj);
++			self=AssignObjectFields(pairoptions(varargin{:}),self);
+ 
+ 		end
+ 		%}}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 			%do nothing
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,i,solution,analyses,driver) % {{{
+-			if ~isnan(obj.fos_forward_index),
++		function md = checkconsistency(self,md,i,solution,analyses,driver) % {{{
++			if ~isnan(self.fos_forward_index),
+ 				if ~strcmpi(driver,'fos_forward'),
+ 					error('cannot declare an independent with a fos_forward_index when the driver is not fos_forward!');
+ 				end
+-				if obj.nods==0,
++				if self.nods==0,
+ 					error('independent checkconsistency error: nods should be set to the size of the independent variable');
+ 				end
+ 			end
+ 
+-			if ~isempty(obj.fov_forward_indices),
++			if ~isempty(self.fov_forward_indices),
+ 				if ~strcmpi(driver,'fov_forward'),
+ 					error('cannot declare an independent with fov_forward_indices when the driver is not fov_forward!');
+ 				end
+-				if obj.nods==0,
++				if self.nods==0,
+ 					error('independent checkconsistency error: nods should be set to the size of the independent variable');
+ 				end
+-				md = checkfield(md,'fieldname',['autodiff.independents{' num2str(i) '}.fov_forward_indices'],'>=',1,'<=',obj.nods,'size',[NaN 1]);
++				md = checkfield(md,'fieldname',['autodiff.independents{' num2str(i) '}.fov_forward_indices'],'>=',1,'<=',self.nods,'size',[NaN 1]);
+ 			end
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   independent variable:'));
+ 
+-			fielddisplay(obj,'name','variable name (must match corresponding Enum)');
+-			fielddisplay(obj,'type','type of variable (''vertex'' or ''scalar'')');
+-			if ~isnan(obj.fos_forward_index),
+-				fielddisplay(obj,'fos_forward_index','index for fos_foward driver of ADOLC');
++			fielddisplay(self,'name','variable name (must match corresponding Enum)');
++			fielddisplay(self,'type','type of variable (''vertex'' or ''scalar'')');
++			if ~isnan(self.fos_forward_index),
++				fielddisplay(self,'fos_forward_index','index for fos_foward driver of ADOLC');
+ 			end
+-			if ~isnan(obj.fov_forward_indices),
+-				fielddisplay(obj,'fov_forward_indices','indices for fov_foward driver of ADOLC');
++			if ~isnan(self.fov_forward_indices),
++				fielddisplay(self,'fov_forward_indices','indices for fov_foward driver of ADOLC');
+ 			end
+ 		end % }}}
+-		function scalartype=typetoscalar(obj) % {{{
+-			if strcmpi(obj.type,'scalar'),
++		function scalartype=typetoscalar(self) % {{{
++			if strcmpi(self.type,'scalar'),
+ 				scalartype=0;
+-			elseif strcmpi(obj.type,'vertex'),
++			elseif strcmpi(self.type,'vertex'),
+ 				scalartype=1;
+-			elseif strcmpi(obj.type,'matrix'),
++			elseif strcmpi(self.type,'matrix'),
+ 				scalartype=1;
+-			else error([obj.type ' not supported yet!']);
++			else error([self.type ' not supported yet!']);
+ 			end
+ 		end % }}}
+ 	end
+Index: ../trunk-jpl/src/m/classes/seaiceocean.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/seaiceocean.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/seaiceocean.m	(revision 19040)
+@@ -15,31 +15,31 @@
+ 		ocean_vy             = NaN;
+ 	end
+ 	methods
+-		function obj = seaiceocean(varargin) % {{{
++		function self = seaiceocean(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%ocean density (kg/m^3)
+-			obj.rho_ocean=1025.;
++			self.rho_ocean=1025.;
+ 
+ 			%By default, we apply the full stress
+-			obj.ocean_coef = 1.;
++			self.ocean_coef = 1.;
+ 
+ 			%drag coefficients (different from Hibler 0.0055)
+-			obj.ocean_lin_drag_coef  = 0.;
+-			obj.ocean_quad_drag_coef = 0.004;
++			self.ocean_lin_drag_coef  = 0.;
++			self.ocean_quad_drag_coef = 0.004;
+ 
+ 			%Turning angle in degrees (McPhee 1998)
+-			obj.ocean_turning_angle = deg2rad(25.);
++			self.ocean_turning_angle = deg2rad(25.);
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 			md = checkfield(md,'fieldname','basalforcings.rho_ocean','NaN',1,'>',0.,'numel',1);
+ 			md = checkfield(md,'fieldname','basalforcings.ocean_coef','NaN',1,'>=',0.,'<=',1.,'numel',1);
+ 			md = checkfield(md,'fieldname','basalforcings.ocean_lin_drag_coef','NaN',1,'>=',0.,'numel',1);
+@@ -49,28 +49,28 @@
+ 			md = checkfield(md,'fieldname','basalforcings.ocean_vx','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','basalforcings.ocean_vy','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   Ocean forcings for sea ice:'));
+ 			%disp(sprintf('\n     tau_b = ocean_coef*rho_ocean*...'));
+-			fielddisplay(obj,'rho_ocean','ocean density [kg/m^3]');
+-			fielddisplay(obj,'ocean_coef','ocean stress spin up coefficient (between 0 and 1)');
+-			fielddisplay(obj,'ocean_lin_drag_coef','ocean linear drag coefficient [Pa/(m/s)]');
+-			fielddisplay(obj,'ocean_quad_drag_coef','ocean quadratic drag coefficient [Pa/(m/s)^2]');
+-			fielddisplay(obj,'ocean_turning_angle','ocean turning angle [rad]');
+-			fielddisplay(obj,'ocean_ssh','ocean sea surface height [m]');
+-			fielddisplay(obj,'ocean_vx','ocean speed x-component [m/s]');
+-			fielddisplay(obj,'ocean_vy','ocean speed y-component [m/s]');
++			fielddisplay(self,'rho_ocean','ocean density [kg/m^3]');
++			fielddisplay(self,'ocean_coef','ocean stress spin up coefficient (between 0 and 1)');
++			fielddisplay(self,'ocean_lin_drag_coef','ocean linear drag coefficient [Pa/(m/s)]');
++			fielddisplay(self,'ocean_quad_drag_coef','ocean quadratic drag coefficient [Pa/(m/s)^2]');
++			fielddisplay(self,'ocean_turning_angle','ocean turning angle [rad]');
++			fielddisplay(self,'ocean_ssh','ocean sea surface height [m]');
++			fielddisplay(self,'ocean_vx','ocean speed x-component [m/s]');
++			fielddisplay(self,'ocean_vy','ocean speed y-component [m/s]');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 			WriteData(fid,'enum',BasalforcingsEnum(),'data',SeaiceoceanEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'class','basalforcings','fieldname','rho_ocean','format','Double');
+-			WriteData(fid,'object',obj,'class','basalforcings','fieldname','ocean_coef','format','Double');
+-			WriteData(fid,'object',obj,'class','basalforcings','fieldname','ocean_lin_drag_coef','format','Double');
+-			WriteData(fid,'object',obj,'class','basalforcings','fieldname','ocean_quad_drag_coef','format','Double');
+-			WriteData(fid,'object',obj,'class','basalforcings','fieldname','ocean_turning_angle','format','Double');
+-			WriteData(fid,'object',obj,'class','basalforcings','fieldname','ocean_ssh','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','basalforcings','fieldname','ocean_vx','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','basalforcings','fieldname','ocean_vy','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','basalforcings','fieldname','rho_ocean','format','Double');
++			WriteData(fid,'object',self,'class','basalforcings','fieldname','ocean_coef','format','Double');
++			WriteData(fid,'object',self,'class','basalforcings','fieldname','ocean_lin_drag_coef','format','Double');
++			WriteData(fid,'object',self,'class','basalforcings','fieldname','ocean_quad_drag_coef','format','Double');
++			WriteData(fid,'object',self,'class','basalforcings','fieldname','ocean_turning_angle','format','Double');
++			WriteData(fid,'object',self,'class','basalforcings','fieldname','ocean_ssh','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','basalforcings','fieldname','ocean_vx','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','basalforcings','fieldname','ocean_vy','format','DoubleMat','mattype',1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 19040)
+@@ -1340,46 +1340,46 @@
+ 				md.mesh.average_vertex_connectivity=100;
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
+-			disp(sprintf('%19s: %-22s -- %s','mesh'            ,['[1x1 ' class(obj.mesh) ']'],'mesh properties'));
+-			disp(sprintf('%19s: %-22s -- %s','mask'            ,['[1x1 ' class(obj.mask) ']'],'defines grounded and floating elements'));
+-			disp(sprintf('%19s: %-22s -- %s','geometry'        ,['[1x1 ' class(obj.geometry) ']'],'surface elevation, bedrock topography, ice thickness,...'));
+-			disp(sprintf('%19s: %-22s -- %s','constants'       ,['[1x1 ' class(obj.constants) ']'],'physical constants'));
+-			disp(sprintf('%19s: %-22s -- %s','surfaceforcings' ,['[1x1 ' class(obj.surfaceforcings) ']'],'surface forcings'));
+-			disp(sprintf('%19s: %-22s -- %s','basalforcings'   ,['[1x1 ' class(obj.basalforcings) ']'],'bed forcings'));
+-			disp(sprintf('%19s: %-22s -- %s','materials'       ,['[1x1 ' class(obj.materials) ']'],'material properties'));
+-			disp(sprintf('%19s: %-22s -- %s','damage'          ,['[1x1 ' class(obj.damage) ']'],'parameters for damage evolution solution'));
+-			disp(sprintf('%19s: %-22s -- %s','friction'        ,['[1x1 ' class(obj.friction) ']'],'basal friction/drag properties'));
+-			disp(sprintf('%19s: %-22s -- %s','flowequation'    ,['[1x1 ' class(obj.flowequation) ']'],'flow equations'));
+-			disp(sprintf('%19s: %-22s -- %s','timestepping'    ,['[1x1 ' class(obj.timestepping) ']'],'time stepping for transient models'));
+-			disp(sprintf('%19s: %-22s -- %s','initialization'  ,['[1x1 ' class(obj.initialization) ']'],'initial guess/state'));
+-			disp(sprintf('%19s: %-22s -- %s','rifts'           ,['[1x1 ' class(obj.rifts) ']'],'rifts properties'));
+-			disp(sprintf('%19s: %-22s -- %s','debug'           ,['[1x1 ' class(obj.debug) ']'],'debugging tools (valgrind, gprof)'));
+-			disp(sprintf('%19s: %-22s -- %s','verbose'         ,['[1x1 ' class(obj.verbose) ']'],'verbosity level in solve'));
+-			disp(sprintf('%19s: %-22s -- %s','settings'        ,['[1x1 ' class(obj.settings) ']'],'settings properties'));
+-			disp(sprintf('%19s: %-22s -- %s','toolkits'        ,['[1x1 ' class(obj.toolkits) ']'],'PETSc options for each solution'));
+-			disp(sprintf('%19s: %-22s -- %s','cluster'         ,['[1x1 ' class(obj.cluster) ']'],'cluster parameters (number of cpus...)'));
+-			disp(sprintf('%19s: %-22s -- %s','balancethickness',['[1x1 ' class(obj.balancethickness) ']'],'parameters for balancethickness solution'));
+-			disp(sprintf('%19s: %-22s -- %s','stressbalance'   ,['[1x1 ' class(obj.stressbalance) ']'],'parameters for stressbalance solution'));
+-			disp(sprintf('%19s: %-22s -- %s','groundingline'   ,['[1x1 ' class(obj.groundingline) ']'],'parameters for groundingline solution'));
+-			disp(sprintf('%19s: %-22s -- %s','hydrology'       ,['[1x1 ' class(obj.hydrology) ']'],'parameters for hydrology solution'));
+-			disp(sprintf('%19s: %-22s -- %s','masstransport'   ,['[1x1 ' class(obj.masstransport) ']'],'parameters for masstransport solution'));
+-			disp(sprintf('%19s: %-22s -- %s','thermal'         ,['[1x1 ' class(obj.thermal) ']'],'parameters for thermal solution'));
+-			disp(sprintf('%19s: %-22s -- %s','steadystate'     ,['[1x1 ' class(obj.steadystate) ']'],'parameters for steadystate solution'));
+-			disp(sprintf('%19s: %-22s -- %s','transient'       ,['[1x1 ' class(obj.transient) ']'],'parameters for transient solution'));
+-			disp(sprintf('%19s: %-22s -- %s','calving'         ,['[1x1 ' class(obj.calving) ']'],'parameters for calving'));
+-			disp(sprintf('%19s: %-22s -- %s','gia'             ,['[1x1 ' class(obj.gia) ']'],'parameters for gia solution'));
+-			disp(sprintf('%19s: %-22s -- %s','autodiff'        ,['[1x1 ' class(obj.autodiff) ']'],'automatic differentiation parameters'));
+-			disp(sprintf('%19s: %-22s -- %s','flaim'           ,['[1x1 ' class(obj.flaim) ']'],'flaim parameters'));
+-			disp(sprintf('%19s: %-22s -- %s','inversion'       ,['[1x1 ' class(obj.inversion) ']'],'parameters for inverse methods'));
+-			disp(sprintf('%19s: %-22s -- %s','qmu'             ,['[1x1 ' class(obj.qmu) ']'],'dakota properties'));
+-			disp(sprintf('%19s: %-22s -- %s','outputdefinition',['[1x1 ' class(obj.outputdefinition) ']'],'output definition'));
+-			disp(sprintf('%19s: %-22s -- %s','results'         ,['[1x1 ' class(obj.results) ']'],'model results'));
+-			disp(sprintf('%19s: %-22s -- %s','radaroverlay'    ,['[1x1 ' class(obj.radaroverlay) ']'],'radar image for plot overlay'));
+-			disp(sprintf('%19s: %-22s -- %s','miscellaneous'   ,['[1x1 ' class(obj.miscellaneous) ']'],'miscellaneous fields'));
+-			disp(sprintf('%19s: %-22s -- %s','seaice'       ,['[1x1 ' class(obj.seaice) ']'],'parameters for Sea Ice solution'));
++		function disp(self) % {{{
++			disp(sprintf('%19s: %-22s -- %s','mesh'            ,['[1x1 ' class(self.mesh) ']'],'mesh properties'));
++			disp(sprintf('%19s: %-22s -- %s','mask'            ,['[1x1 ' class(self.mask) ']'],'defines grounded and floating elements'));
++			disp(sprintf('%19s: %-22s -- %s','geometry'        ,['[1x1 ' class(self.geometry) ']'],'surface elevation, bedrock topography, ice thickness,...'));
++			disp(sprintf('%19s: %-22s -- %s','constants'       ,['[1x1 ' class(self.constants) ']'],'physical constants'));
++			disp(sprintf('%19s: %-22s -- %s','surfaceforcings' ,['[1x1 ' class(self.surfaceforcings) ']'],'surface forcings'));
++			disp(sprintf('%19s: %-22s -- %s','basalforcings'   ,['[1x1 ' class(self.basalforcings) ']'],'bed forcings'));
++			disp(sprintf('%19s: %-22s -- %s','materials'       ,['[1x1 ' class(self.materials) ']'],'material properties'));
++			disp(sprintf('%19s: %-22s -- %s','damage'          ,['[1x1 ' class(self.damage) ']'],'parameters for damage evolution solution'));
++			disp(sprintf('%19s: %-22s -- %s','friction'        ,['[1x1 ' class(self.friction) ']'],'basal friction/drag properties'));
++			disp(sprintf('%19s: %-22s -- %s','flowequation'    ,['[1x1 ' class(self.flowequation) ']'],'flow equations'));
++			disp(sprintf('%19s: %-22s -- %s','timestepping'    ,['[1x1 ' class(self.timestepping) ']'],'time stepping for transient models'));
++			disp(sprintf('%19s: %-22s -- %s','initialization'  ,['[1x1 ' class(self.initialization) ']'],'initial guess/state'));
++			disp(sprintf('%19s: %-22s -- %s','rifts'           ,['[1x1 ' class(self.rifts) ']'],'rifts properties'));
++			disp(sprintf('%19s: %-22s -- %s','debug'           ,['[1x1 ' class(self.debug) ']'],'debugging tools (valgrind, gprof)'));
++			disp(sprintf('%19s: %-22s -- %s','verbose'         ,['[1x1 ' class(self.verbose) ']'],'verbosity level in solve'));
++			disp(sprintf('%19s: %-22s -- %s','settings'        ,['[1x1 ' class(self.settings) ']'],'settings properties'));
++			disp(sprintf('%19s: %-22s -- %s','toolkits'        ,['[1x1 ' class(self.toolkits) ']'],'PETSc options for each solution'));
++			disp(sprintf('%19s: %-22s -- %s','cluster'         ,['[1x1 ' class(self.cluster) ']'],'cluster parameters (number of cpus...)'));
++			disp(sprintf('%19s: %-22s -- %s','balancethickness',['[1x1 ' class(self.balancethickness) ']'],'parameters for balancethickness solution'));
++			disp(sprintf('%19s: %-22s -- %s','stressbalance'   ,['[1x1 ' class(self.stressbalance) ']'],'parameters for stressbalance solution'));
++			disp(sprintf('%19s: %-22s -- %s','groundingline'   ,['[1x1 ' class(self.groundingline) ']'],'parameters for groundingline solution'));
++			disp(sprintf('%19s: %-22s -- %s','hydrology'       ,['[1x1 ' class(self.hydrology) ']'],'parameters for hydrology solution'));
++			disp(sprintf('%19s: %-22s -- %s','masstransport'   ,['[1x1 ' class(self.masstransport) ']'],'parameters for masstransport solution'));
++			disp(sprintf('%19s: %-22s -- %s','thermal'         ,['[1x1 ' class(self.thermal) ']'],'parameters for thermal solution'));
++			disp(sprintf('%19s: %-22s -- %s','steadystate'     ,['[1x1 ' class(self.steadystate) ']'],'parameters for steadystate solution'));
++			disp(sprintf('%19s: %-22s -- %s','transient'       ,['[1x1 ' class(self.transient) ']'],'parameters for transient solution'));
++			disp(sprintf('%19s: %-22s -- %s','calving'         ,['[1x1 ' class(self.calving) ']'],'parameters for calving'));
++			disp(sprintf('%19s: %-22s -- %s','gia'             ,['[1x1 ' class(self.gia) ']'],'parameters for gia solution'));
++			disp(sprintf('%19s: %-22s -- %s','autodiff'        ,['[1x1 ' class(self.autodiff) ']'],'automatic differentiation parameters'));
++			disp(sprintf('%19s: %-22s -- %s','flaim'           ,['[1x1 ' class(self.flaim) ']'],'flaim parameters'));
++			disp(sprintf('%19s: %-22s -- %s','inversion'       ,['[1x1 ' class(self.inversion) ']'],'parameters for inverse methods'));
++			disp(sprintf('%19s: %-22s -- %s','qmu'             ,['[1x1 ' class(self.qmu) ']'],'dakota properties'));
++			disp(sprintf('%19s: %-22s -- %s','outputdefinition',['[1x1 ' class(self.outputdefinition) ']'],'output definition'));
++			disp(sprintf('%19s: %-22s -- %s','results'         ,['[1x1 ' class(self.results) ']'],'model results'));
++			disp(sprintf('%19s: %-22s -- %s','radaroverlay'    ,['[1x1 ' class(self.radaroverlay) ']'],'radar image for plot overlay'));
++			disp(sprintf('%19s: %-22s -- %s','miscellaneous'   ,['[1x1 ' class(self.miscellaneous) ']'],'miscellaneous fields'));
++			disp(sprintf('%19s: %-22s -- %s','seaice'       ,['[1x1 ' class(self.seaice) ']'],'parameters for Sea Ice solution'));
+ 		end % }}}
+-		function memory(obj) % {{{
++		function memory(self) % {{{
+ 
+ 		disp(sprintf('\nMemory imprint:\n'));
+ 
+@@ -1387,7 +1387,7 @@
+ 		mem=0;
+ 
+ 		for i=1:length(fields),
+-			field=obj.(fields{i});
++			field=self.(fields{i});
+ 			s=whos('field'); 
+ 			mem=mem+s.bytes/1e6;
+ 			disp(sprintf('%19s: %6.2f Mb',fields{i},s.bytes/1e6));
+@@ -1395,7 +1395,7 @@
+ 		disp(sprintf('%19s--%10s','--------------','--------------'));
+ 		disp(sprintf('%19s: %g Mb','Total',mem));
+ 		end % }}}
+-		function netcdf(obj,filename) % {{{
++		function netcdf(self,filename) % {{{
+ 		%NETCDF - save model as netcdf
+ 		%
+ 		%   Usage:
+@@ -1408,7 +1408,7 @@
+ 		%1. Create NetCDF file
+ 		ncid=netcdf.create(filename,'CLOBBER');
+ 		netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'Conventions','CF-1.4');
+-		netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'Title',['ISSM model (' obj.miscellaneous.name ')']);
++		netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'Title',['ISSM model (' self.miscellaneous.name ')']);
+ 		netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'Author',getenv('USER'));
+ 		netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'Date',datestr(now));
+ 
+@@ -1417,7 +1417,7 @@
+ 
+ 		for step=1:2,
+ 			counter=0;
+-			[var_id,counter]=structtonc(ncid,'md',obj,0,var_id,counter,step);
++			[var_id,counter]=structtonc(ncid,'md',self,0,var_id,counter,step);
+ 			if step==1, netcdf.endDef(ncid); end
+ 		end
+ 
+@@ -1427,10 +1427,10 @@
+ 
+ 		netcdf.close(ncid)
+ 		end % }}}
+-		function xylim(obj) % {{{
++		function xylim(self) % {{{
+ 
+-			xlim([min(obj.mesh.x) max(obj.mesh.x)]);
+-			ylim([min(obj.mesh.y) max(obj.mesh.y)])
++			xlim([min(self.mesh.x) max(self.mesh.x)]);
++			ylim([min(self.mesh.y) max(self.mesh.y)])
+ 		end % }}}
+ 		function md=upload(md) % {{{
+ 		%the goal of this routine is to upload the model onto a server, and to empty it.
+Index: ../trunk-jpl/src/m/classes/toolkits.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/toolkits.py	(revision 19039)
++++ ../trunk-jpl/src/m/classes/toolkits.py	(revision 19040)
+@@ -11,7 +11,7 @@
+ 	TOOLKITS class definition
+ 
+ 	   Usage:
+-	      obj=toolkits();
++	      self=toolkits();
+ 	"""
+ 
+ 	def __init__(self):    # {{{
+Index: ../trunk-jpl/src/m/classes/calvingpi.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvingpi.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/calvingpi.m	(revision 19040)
+@@ -10,10 +10,10 @@
+ 		meltingrate   = NaN;
+ 	end
+ 	methods
+-		function obj = calvingpi(varargin) % {{{
++		function self = calvingpi(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+ 					inputstruct=varargin{1};
+ 					list1 = properties('calvingpi');
+@@ -21,22 +21,22 @@
+ 					for i=1:length(list1)
+ 						fieldname = list1{i};
+ 						if ismember(fieldname,list2),
+-							obj.(fieldname) = inputstruct.(fieldname);
++							self.(fieldname) = inputstruct.(fieldname);
+ 						end
+ 					end
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%stabilization = 2 by default
+-			obj.stabilization = 2;
++			self.stabilization = 2;
+ 
+ 			%Proportionality coefficient in Pi model
+-			obj.coeff=2e13;
++			self.coeff=2e13;
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 			%Early return
+ 			if (solution~=TransientSolutionEnum() | md.transient.iscalving==0), return; end
+ 
+@@ -44,19 +44,19 @@
+ 			md = checkfield(md,'fieldname','calving.coeff','>',0,'size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','calving.meltingrate','NaN',1,'size',[md.mesh.numberofvertices 1],'>=',0);
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   Calving Pi parameters:'));
+-			fielddisplay(obj,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding');
+-			fielddisplay(obj,'coeff','proportionality coefficient in Pi model');
+-			fielddisplay(obj,'meltingrate','melting rate at given location [m/a]');
++			fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding');
++			fielddisplay(self,'coeff','proportionality coefficient in Pi model');
++			fielddisplay(self,'meltingrate','melting rate at given location [m/a]');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 			yts=365.0*24.0*3600.0;
+ 			WriteData(fid,'enum',CalvingLawEnum(),'data',CalvingPiEnum(),'format','Integer');
+-			WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',obj.stabilization,'format','Integer');
+-			WriteData(fid,'enum',CalvingpiCoeffEnum(),'data',obj.coeff,'format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'fieldname','meltingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts);
++			WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',self.stabilization,'format','Integer');
++			WriteData(fid,'enum',CalvingpiCoeffEnum(),'data',self.coeff,'format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'fieldname','meltingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/flowequation.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/flowequation.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/flowequation.m	(revision 19040)
+@@ -25,7 +25,7 @@
+ 		borderFS                       = NaN;
+ 	end
+ 	methods (Static)
+-		function obj = loadobj(obj) % {{{
++		function self = loadobj(self) % {{{
+ 			% This function is directly called by matlab when a model object is
+ 			% loaded. If the input is a struct it is an old version of this class and
+ 			% old fields must be recovered (make sure they are in the deprecated
+@@ -43,35 +43,35 @@
+ 				% This has been fixed in MATLAB 7.9 (R2009b) and later versions
+ 			end
+ 
+-			if isstruct(obj)
++			if isstruct(self)
+ 				disp('Recovering flowequation from older version');
+-				objstruct = obj;
+-				obj = structtoobj(flowequation(),objstruct);
++				objstruct = self;
++				self = structtoobj(flowequation(),objstruct);
+ 
+ 				%2013 July 23rd
+-				if isfield(objstruct,'ishutter'),      obj.isSIA     = objstruct.ishutter;       end; 
+-				if isfield(objstruct,'ismacayeal'),    obj.isSSA     = objstruct.ismacayeal;     end; 
+-				if isfield(objstruct,'ispattyn'),      obj.isHO      = objstruct.ispattyn;       end; 
+-				if isfield(objstruct,'isstokes'),      obj.isFS      = objstruct.isstokes;       end; 
+-				if isfield(objstruct,'bordermacayeal'),obj.borderSSA = objstruct.bordermacayeal; end; 
+-				if isfield(objstruct,'borderpattyn'),  obj.borderHO  = objstruct.borderpattyn;   end; 
+-				if isfield(objstruct,'borderstokes'),  obj.borderFS  = objstruct.borderstokes;   end; 
++				if isfield(objstruct,'ishutter'),      self.isSIA     = objstruct.ishutter;       end; 
++				if isfield(objstruct,'ismacayeal'),    self.isSSA     = objstruct.ismacayeal;     end; 
++				if isfield(objstruct,'ispattyn'),      self.isHO      = objstruct.ispattyn;       end; 
++				if isfield(objstruct,'isstokes'),      self.isFS      = objstruct.isstokes;       end; 
++				if isfield(objstruct,'bordermacayeal'),self.borderSSA = objstruct.bordermacayeal; end; 
++				if isfield(objstruct,'borderpattyn'),  self.borderHO  = objstruct.borderpattyn;   end; 
++				if isfield(objstruct,'borderstokes'),  self.borderFS  = objstruct.borderstokes;   end; 
+ 			end
+ 
+ 		end% }}}
+ 	end
+ 	methods
+-		function createxml(obj,fid) % {{{
++		function createxml(self,fid) % {{{
+ 			fprintf(fid, '\n\n');
+ 			fprintf(fid, '%s\n', '<!-- flowequation -->');
+ 			fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Flow equation parameters">','<section name="flowequation" />');                    
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="isSIA" type="',              class(obj.isSIA),'" default="',                  convert2str(obj.isSIA),'">',              '     <section name="flowequation" />','     <help> is the Shallow Ice Approximation (SIA) used ? </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="isSSA" type="',            class(obj.isSSA),'" default="',                convert2str(obj.isSSA),'">',   '     <section name="flowequation" />','     <help> is the Shelfy-Stream Approximation (SSA) used ? </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="isL1L2" type="',      class(obj.isL1L2),'" default="',          convert2str(obj.isL1L2),'">',            '     <section name="flowequation" />','     <help> is the L1L2 approximation used ? </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="isHO" type="',     class(obj.isHO),'" default="',         convert2str(obj.isHO),'">',            '     <section name="flowequation" />','     <help> is the Higher-Order (HO) approximation used ? </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="isSIA" type="',              class(self.isSIA),'" default="',                  convert2str(self.isSIA),'">',              '     <section name="flowequation" />','     <help> is the Shallow Ice Approximation (SIA) used ? </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="isSSA" type="',            class(self.isSSA),'" default="',                convert2str(self.isSSA),'">',   '     <section name="flowequation" />','     <help> is the Shelfy-Stream Approximation (SSA) used ? </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="isL1L2" type="',      class(self.isL1L2),'" default="',          convert2str(self.isL1L2),'">',            '     <section name="flowequation" />','     <help> is the L1L2 approximation used ? </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="isHO" type="',     class(self.isHO),'" default="',         convert2str(self.isHO),'">',            '     <section name="flowequation" />','     <help> is the Higher-Order (HO) approximation used ? </help>','</parameter>');
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="isFS" type="',       class(obj.isFS),'" default="',              convert2str(obj.isFS),'">',              '     <section name="flowequation" />','     <help> are the Full-FS (FS) equations used ? </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="isFS" type="',       class(self.isFS),'" default="',              convert2str(self.isFS),'">',              '     <section name="flowequation" />','     <help> are the Full-FS (FS) equations used ? </help>','</parameter>');
+ 
+ 			% fe_SSA drop-down (P1, P1bubble, P1bubblecondensed, P2)
+ 			fprintf(fid,'%s\n%s\n%s\n%s\n',    '<parameter key ="fe_SSA" type="alternative" optional="false">','     <section name="flowequation" />','     <help> Finite Element for SSA  "P1", "P1bubble" "P1bubblecondensed" "P2" </help>');
+@@ -97,35 +97,35 @@
+ 			fprintf(fid,'%s\n','       <option value="MINI" type="string" default="false"> </option>');
+ 			fprintf(fid,'%s\n%s\n','       <option value="TaylorHood" type="string" default="false"> </option>','</parameter>');
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="vertex_equation" type="',      class(obj.vertex_equation),'" default="',            convert2str(obj.vertex_equation),'">',            '     <section name="flowequation" />','     <help> flow equation for each vertex </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="vertex_equation" type="',      class(self.vertex_equation),'" default="',            convert2str(self.vertex_equation),'">',            '     <section name="flowequation" />','     <help> flow equation for each vertex </help>','</parameter>');
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="element_equation" type="',            class(obj.element_equation),'" default="',              convert2str(obj.element_equation),'">',              '     <section name="flowequation" />','     <help> flow equation for each element </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="borderSSA" type="', class(obj.borderSSA),'" default="',   convert2str(obj.borderSSA),'">',   '     <section name="flowequation" />','     <help> vertices on SSAs border (for tiling) </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="borderHO" type="',          class(obj.borderHO),'" default="',            convert2str(obj.borderHO),'">',            '     <section name="flowequation" />','     <help> vertices on HOs border (for tiling) </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',        '<parameter key ="borderFS" type="',          class(obj.borderFS),'" default="',            convert2str(obj.borderFS),'">',            '     <section name="flowequation" />','     <help> vertices on FS border (for tiling) </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="element_equation" type="',            class(self.element_equation),'" default="',              convert2str(self.element_equation),'">',              '     <section name="flowequation" />','     <help> flow equation for each element </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="borderSSA" type="', class(self.borderSSA),'" default="',   convert2str(self.borderSSA),'">',   '     <section name="flowequation" />','     <help> vertices on SSAs border (for tiling) </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="borderHO" type="',          class(self.borderHO),'" default="',            convert2str(self.borderHO),'">',            '     <section name="flowequation" />','     <help> vertices on HOs border (for tiling) </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',        '<parameter key ="borderFS" type="',          class(self.borderFS),'" default="',            convert2str(self.borderFS),'">',            '     <section name="flowequation" />','     <help> vertices on FS border (for tiling) </help>','</parameter>');
+ 
+ 			fprintf(fid,'%s\n%s\n','</frame>');
+ 		end % }}}
+-		function obj = flowequation(varargin) % {{{
++		function self = flowequation(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%P1 for SSA
+-			obj.fe_SSA= 'P1';
++			self.fe_SSA= 'P1';
+ 
+ 			%P1 for HO
+-			obj.fe_HO= 'P1';
++			self.fe_HO= 'P1';
+ 
+ 			%MINI condensed element for FS by default
+-			obj.fe_FS = 'MINIcondensed';
++			self.fe_FS = 'MINIcondensed';
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 
+ 			%Early return
+@@ -159,55 +159,55 @@
+ 			else
+ 				error('Case not supported yet');
+ 			end
+-			if ~(obj.isSIA || obj.isSSA || obj.isL1L2 || obj.isHO || obj.isFS),
++			if ~(self.isSIA || self.isSSA || self.isL1L2 || self.isHO || self.isFS),
+ 				md = checkmessage(md,['no element types set for this model']);
+ 			end
+ 			if ismember(StressbalanceSIAAnalysisEnum(),analyses),
+-				if any(obj.element_equation==1),
+-					if(obj.vertex_equation & md.mask.groundedice_levelset<0.),
++				if any(self.element_equation==1),
++					if(self.vertex_equation & md.mask.groundedice_levelset<0.),
+ 						disp(sprintf('\n !!! Warning: SIA''s model is not consistent on ice shelves !!!\n'));
+ 					end
+ 				end
+ 			end
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   flow equation parameters:'));
+ 
+-			fielddisplay(obj,'isSIA','is the Shallow Ice Approximation (SIA) used ?');
+-			fielddisplay(obj,'isSSA','is the Shelfy-Stream Approximation (SSA) used ?');
+-			fielddisplay(obj,'isL1L2','is the L1L2 approximation used ?');
+-			fielddisplay(obj,'isHO','is the Higher-Order (HO) approximation used ?');
+-			fielddisplay(obj,'isFS','are the Full-FS (FS) equations used ?');
+-			fielddisplay(obj,'fe_SSA','Finite Element for SSA  ''P1'', ''P1bubble'' ''P1bubblecondensed'' ''P2''');
+-			fielddisplay(obj,'fe_HO', 'Finite Element for HO   ''P1'' ''P1bubble'' ''P1bubblecondensed'' ''P1xP2'' ''P2xP1'' ''P2''');
+-			fielddisplay(obj,'fe_FS', 'Finite Element for FS   ''P1P1'' (debugging only) ''P1P1GLS'' ''MINIcondensed'' ''MINI'' ''TaylorHood'' ''XTaylorHood''');
+-			fielddisplay(obj,'vertex_equation','flow equation for each vertex');
+-			fielddisplay(obj,'element_equation','flow equation for each element');
+-			fielddisplay(obj,'borderSSA','vertices on SSA''s border (for tiling)');
+-			fielddisplay(obj,'borderHO','vertices on HO''s border (for tiling)');
+-			fielddisplay(obj,'borderFS','vertices on FS'' border (for tiling)');
++			fielddisplay(self,'isSIA','is the Shallow Ice Approximation (SIA) used ?');
++			fielddisplay(self,'isSSA','is the Shelfy-Stream Approximation (SSA) used ?');
++			fielddisplay(self,'isL1L2','is the L1L2 approximation used ?');
++			fielddisplay(self,'isHO','is the Higher-Order (HO) approximation used ?');
++			fielddisplay(self,'isFS','are the Full-FS (FS) equations used ?');
++			fielddisplay(self,'fe_SSA','Finite Element for SSA  ''P1'', ''P1bubble'' ''P1bubblecondensed'' ''P2''');
++			fielddisplay(self,'fe_HO', 'Finite Element for HO   ''P1'' ''P1bubble'' ''P1bubblecondensed'' ''P1xP2'' ''P2xP1'' ''P2''');
++			fielddisplay(self,'fe_FS', 'Finite Element for FS   ''P1P1'' (debugging only) ''P1P1GLS'' ''MINIcondensed'' ''MINI'' ''TaylorHood'' ''XTaylorHood''');
++			fielddisplay(self,'vertex_equation','flow equation for each vertex');
++			fielddisplay(self,'element_equation','flow equation for each element');
++			fielddisplay(self,'borderSSA','vertices on SSA''s border (for tiling)');
++			fielddisplay(self,'borderHO','vertices on HO''s border (for tiling)');
++			fielddisplay(self,'borderFS','vertices on FS'' border (for tiling)');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'object',obj,'fieldname','isSIA','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','isSSA','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','isL1L2','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','isHO','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','isFS','format','Boolean');
+-			WriteData(fid,'enum',FlowequationFeSSAEnum(),'data',StringToEnum(obj.fe_SSA),'format','Integer');
+-			WriteData(fid,'enum',FlowequationFeHOEnum() ,'data',StringToEnum(obj.fe_HO) ,'format','Integer');
+-			WriteData(fid,'enum',FlowequationFeFSEnum() ,'data',StringToEnum(obj.fe_FS) ,'format','Integer');
+-			WriteData(fid,'enum',AugmentedLagrangianREnum(),'data',obj.augmented_lagrangian_r ,'format','Double');
+-			WriteData(fid,'enum',AugmentedLagrangianRhopEnum(),'data',obj.augmented_lagrangian_rhop ,'format','Double');
+-			WriteData(fid,'enum',AugmentedLagrangianRlambdaEnum(),'data',obj.augmented_lagrangian_rlambda ,'format','Double');
+-			WriteData(fid,'enum',AugmentedLagrangianRholambdaEnum(),'data',obj.augmented_lagrangian_rholambda ,'format','Double');
+-			WriteData(fid,'enum',AugmentedLagrangianThetaEnum() ,'data',obj.XTH_theta ,'format','Double');
+-			WriteData(fid,'object',obj,'fieldname','borderSSA','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'fieldname','borderHO','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'fieldname','borderFS','format','DoubleMat','mattype',1);
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'object',self,'fieldname','isSIA','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','isSSA','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','isL1L2','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','isHO','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','isFS','format','Boolean');
++			WriteData(fid,'enum',FlowequationFeSSAEnum(),'data',StringToEnum(self.fe_SSA),'format','Integer');
++			WriteData(fid,'enum',FlowequationFeHOEnum() ,'data',StringToEnum(self.fe_HO) ,'format','Integer');
++			WriteData(fid,'enum',FlowequationFeFSEnum() ,'data',StringToEnum(self.fe_FS) ,'format','Integer');
++			WriteData(fid,'enum',AugmentedLagrangianREnum(),'data',self.augmented_lagrangian_r ,'format','Double');
++			WriteData(fid,'enum',AugmentedLagrangianRhopEnum(),'data',self.augmented_lagrangian_rhop ,'format','Double');
++			WriteData(fid,'enum',AugmentedLagrangianRlambdaEnum(),'data',self.augmented_lagrangian_rlambda ,'format','Double');
++			WriteData(fid,'enum',AugmentedLagrangianRholambdaEnum(),'data',self.augmented_lagrangian_rholambda ,'format','Double');
++			WriteData(fid,'enum',AugmentedLagrangianThetaEnum() ,'data',self.XTH_theta ,'format','Double');
++			WriteData(fid,'object',self,'fieldname','borderSSA','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'fieldname','borderHO','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'fieldname','borderFS','format','DoubleMat','mattype',1);
+ 			%convert approximations to enums
+-			data=obj.vertex_equation;
++			data=self.vertex_equation;
+ 			pos=find(data==0); data(pos,end)=NoneApproximationEnum();
+ 			pos=find(data==1); data(pos,end)=SIAApproximationEnum();
+ 			pos=find(data==2); data(pos,end)=SSAApproximationEnum();
+@@ -219,7 +219,7 @@
+ 			pos=find(data==7); data(pos,end)=HOFSApproximationEnum();
+ 			pos=find(data==8); data(pos,end)=SSAFSApproximationEnum();
+ 			WriteData(fid,'data',data,'enum',FlowequationVertexEquationEnum(),'format','DoubleMat','mattype',1);
+-			data=obj.element_equation;
++			data=self.element_equation;
+ 			pos=find(data==0); data(pos,end)=NoneApproximationEnum();
+ 			pos=find(data==1); data(pos,end)=SIAApproximationEnum();
+ 			pos=find(data==2); data(pos,end)=SSAApproximationEnum();
+Index: ../trunk-jpl/src/m/classes/basalforcings.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/basalforcings.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/basalforcings.m	(revision 19040)
+@@ -10,17 +10,17 @@
+ 		geothermalflux            = NaN;
+ 	end
+ 	methods
+-        function createxml(obj,fid) % {{{
++        function createxml(self,fid) % {{{
+             fprintf(fid, '\n\n');
+             fprintf(fid, '%s\n', '<!-- basalforcings -->');
+-			 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="melting_rate" type="',            class(obj.melting_rate),'" default="',              num2str(obj.melting_rate),'">',              '     <section name="basalforcings" />','     <help> basal melting rate (positive if melting) [m/yr] </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',        '<parameter key ="geothermalflux" type="',          class(obj.geothermalflux),'" default="',            num2str(obj.geothermalflux),'">',            '     <section name="basalforcings" />','     <help> geothermal heat flux [W/m^2] </help>','</parameter>');
++			 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="melting_rate" type="',            class(self.melting_rate),'" default="',              num2str(self.melting_rate),'">',              '     <section name="basalforcings" />','     <help> basal melting rate (positive if melting) [m/yr] </help>','</parameter>');
++             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',        '<parameter key ="geothermalflux" type="',          class(self.geothermalflux),'" default="',            num2str(self.geothermalflux),'">',            '     <section name="basalforcings" />','     <help> geothermal heat flux [W/m^2] </help>','</parameter>');
+              
+         end % }}}
+-		function obj = basalforcings(varargin) % {{{
++		function self = basalforcings(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+@@ -38,10 +38,10 @@
+ 			end
+ 
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			if ismember(MasstransportAnalysisEnum(),analyses) & ~(solution==TransientSolutionEnum() & md.transient.ismasstransport==0),
+ 				md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'timeseries',1);
+@@ -57,22 +57,22 @@
+ 				md = checkfield(md,'fieldname','basalforcings.geothermalflux','NaN',1,'timeseries',1,'>=',0);
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   basal forcings parameters:'));
+ 
+-			fielddisplay(obj,'groundedice_melting_rate','basal melting rate (positive if melting) [m/yr]');
+-			fielddisplay(obj,'floatingice_melting_rate','basal melting rate (positive if melting) [m/yr]');
+-			fielddisplay(obj,'geothermalflux','geothermal heat flux [W/m^2]');
++			fielddisplay(self,'groundedice_melting_rate','basal melting rate (positive if melting) [m/yr]');
++			fielddisplay(self,'floatingice_melting_rate','basal melting rate (positive if melting) [m/yr]');
++			fielddisplay(self,'geothermalflux','geothermal heat flux [W/m^2]');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'enum',BasalforcingsEnum(),'data',FloatingMeltRateEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','groundedice_melting_rate','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
+-			WriteData(fid,'object',obj,'fieldname','floatingice_melting_rate','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
+-			WriteData(fid,'object',obj,'fieldname','geothermalflux','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'fieldname','groundedice_melting_rate','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++			WriteData(fid,'object',self,'fieldname','floatingice_melting_rate','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
++			WriteData(fid,'object',self,'fieldname','geothermalflux','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/damage.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/damage.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/damage.m	(revision 19040)
+@@ -31,12 +31,12 @@
+ 		requested_outputs   = {};
+ 	end
+ 	methods
+-		function createxml(obj,fid) % {{{
++		function createxml(self,fid) % {{{
+ 			fprintf(fid, '\n\n');
+ 			fprintf(fid, '%s\n', '<!-- damage -->');
+ 			fprintf(fid, '%s\n', '<!-- Note: this class depends on different input of law -->');
+ 
+-			%fprintf(fid,'%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="law" type="logical"',           '" default="',                num2str(obj.law),'">',   '     <section name="damage" />','     <help> damage law (string) from {"undamaged","pralong"} </help>','</parameter>');
++			%fprintf(fid,'%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="law" type="logical"',           '" default="',                num2str(self.law),'">',   '     <section name="damage" />','     <help> damage law (string) from {"undamaged","pralong"} </help>','</parameter>');
+ 			% drop-down 
+ 			fprintf(fid,'%s%s%s%s%s\n\t%s\n','<parameter key ="law" type="','alternative','" optional="','false','">','<section name="damage" />');
+ 
+@@ -48,14 +48,14 @@
+ 			% law = 'pralong'
+ 			fprintf(fid,'\t%s%s%s%s%s\n\t\t%s\n','<option value="pralong" type="','string','" default="','false','">','<help> law = pralong </help>');
+ 
+-			fprintf(fid,'\t\t%s%s%s%s%s\n\t\t\t%s\n\t\t%s\n',   '<parameter key ="stress_threshold" type="',class(obj.stress_threshold),'" default="',num2str(obj.stress_threshold),'">','<help> damage stress threshold [Pa] </help>','</parameter>');
+-			fprintf(fid,'\t\t%s%s%s%s%s\n\t\t\t%s\n\t\t%s\n',	'<parameter key ="c1" type="', class(obj.c1),'" default="',   num2str(obj.c1),'">',   '<help> damage parameter 1 </help>','</parameter>');
+-			fprintf(fid,'\t\t%s%s%s%s%s\n\t\t\t%s\n\t\t%s\n',  	'<parameter key ="c2" type="',          class(obj.c2),'" default="',            num2str(obj.c2),'">','<help> damage parameter 2 </help>','</parameter>');
+-			fprintf(fid,'\t\t%s%s%s%s%s\n\t\t\t%s\n\t\t%s\n',  	'<parameter key ="c3" type="',          class(obj.c3),'" default="',            num2str(obj.c3),'">','<help> damage parameter 3 [W/m^2] </help>','</parameter>');
+-			fprintf(fid,'\t\t%s%s%s%s%s\n\t\t\t%s\n\t\t%s\n',  	'<parameter key ="c4" type="',            class(obj.c4),'" default="',              num2str(obj.c4),'">','<help> damage parameter 4 </help>','</parameter>');
+-			fprintf(fid,'\t\t%s%s%s%s%s\n\t\t\t%s\n\t\t%s\n',  	'<parameter key ="healing" type="', class(obj.healing),'" default="',   num2str(obj.healing),'">','<help> damage healing parameter 1 </help>','</parameter>');
+-			fprintf(fid,'\t\t%s%s%s%s%s\n\t\t\t%s\n\t\t%s\n',  	'<parameter key ="equiv_stress" type="',          class(obj.equiv_stress),'" default="',convert2str(obj.equiv_stress),'">','<help> 0: von Mises </help>','</parameter>');
+-			fprintf(fid,'\t\t%s%s%s%s%s\n\t\t\t%s\n\t\t%s\n',  	'<parameter key ="requested_outputs" type="',          class(obj.requested_outputs),'" default="',convert2str(obj.requested_outputs),'">','<help> additional outputs requested </help>','</parameter>');
++			fprintf(fid,'\t\t%s%s%s%s%s\n\t\t\t%s\n\t\t%s\n',   '<parameter key ="stress_threshold" type="',class(self.stress_threshold),'" default="',num2str(self.stress_threshold),'">','<help> damage stress threshold [Pa] </help>','</parameter>');
++			fprintf(fid,'\t\t%s%s%s%s%s\n\t\t\t%s\n\t\t%s\n',	'<parameter key ="c1" type="', class(self.c1),'" default="',   num2str(self.c1),'">',   '<help> damage parameter 1 </help>','</parameter>');
++			fprintf(fid,'\t\t%s%s%s%s%s\n\t\t\t%s\n\t\t%s\n',  	'<parameter key ="c2" type="',          class(self.c2),'" default="',            num2str(self.c2),'">','<help> damage parameter 2 </help>','</parameter>');
++			fprintf(fid,'\t\t%s%s%s%s%s\n\t\t\t%s\n\t\t%s\n',  	'<parameter key ="c3" type="',          class(self.c3),'" default="',            num2str(self.c3),'">','<help> damage parameter 3 [W/m^2] </help>','</parameter>');
++			fprintf(fid,'\t\t%s%s%s%s%s\n\t\t\t%s\n\t\t%s\n',  	'<parameter key ="c4" type="',            class(self.c4),'" default="',              num2str(self.c4),'">','<help> damage parameter 4 </help>','</parameter>');
++			fprintf(fid,'\t\t%s%s%s%s%s\n\t\t\t%s\n\t\t%s\n',  	'<parameter key ="healing" type="', class(self.healing),'" default="',   num2str(self.healing),'">','<help> damage healing parameter 1 </help>','</parameter>');
++			fprintf(fid,'\t\t%s%s%s%s%s\n\t\t\t%s\n\t\t%s\n',  	'<parameter key ="equiv_stress" type="',          class(self.equiv_stress),'" default="',convert2str(self.equiv_stress),'">','<help> 0: von Mises </help>','</parameter>');
++			fprintf(fid,'\t\t%s%s%s%s%s\n\t\t\t%s\n\t\t%s\n',  	'<parameter key ="requested_outputs" type="',          class(self.requested_outputs),'" default="',convert2str(self.requested_outputs),'">','<help> additional outputs requested </help>','</parameter>');
+ 
+ 
+ 			% footer for option
+@@ -66,10 +66,10 @@
+ 			fprintf(fid,'\t%s\n%s\n%s','<help> damage law (string) from {"undamaged","pralong"} </help>','</parameter>');
+ 
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="D" type="',              class(obj.D),'" default="',                  num2str(obj.D),'">',              '     <section name="damage" />','     <help> damage tensor (scalar) </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="law" type="',            class(obj.law),'" default="',                num2str(obj.law),'">',   '     <section name="damage" />','     <help> damage law (string) from {"undamaged","pralong"} </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="spcdamage" type="',      class(obj.spcdamage),'" default="',          num2str(obj.spcdamage),'">',            '     <section name="damage" />','     <help> damage constraints (NaN means no constraint) </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="max_damage" type="',     class(obj.max_damage),'" default="',         num2str(obj.max_damage),'">',            '     <section name="damage" />','     <help> maximum possible damage (0&amp;lt;=max_damage&amp;lt;1) </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="D" type="',              class(self.D),'" default="',                  num2str(self.D),'">',              '     <section name="damage" />','     <help> damage tensor (scalar) </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="law" type="',            class(self.law),'" default="',                num2str(self.law),'">',   '     <section name="damage" />','     <help> damage law (string) from {"undamaged","pralong"} </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="spcdamage" type="',      class(self.spcdamage),'" default="',          num2str(self.spcdamage),'">',            '     <section name="damage" />','     <help> damage constraints (NaN means no constraint) </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="max_damage" type="',     class(self.max_damage),'" default="',         num2str(self.max_damage),'">',            '     <section name="damage" />','     <help> maximum possible damage (0&amp;lt;=max_damage&amp;lt;1) </help>','</parameter>');
+ 
+ 			% stabilization (0,1, or 2) drop-down
+ 			fprintf(fid,'%s\n%s\n%s\n%s\n',    '<parameter key ="stabilization" type="alternative" optional="false">','     <section name="damage" />','     <help> 0: no, 1: artificial_diffusivity, 2: SUPG </help>');
+@@ -78,17 +78,17 @@
+ 			fprintf(fid, '%s\n', '       <option value="2" type="string" default="false"></option>');
+ 			fprintf(fid, '%s\n','</parameter>');
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="maxiter" type="',             class(obj.maxiter),'" default="',   num2str(obj.maxiter),'">',   '     <section name="damage" />','     <help> maximum number of non linear iterations </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="penalty_lock" type="',        class(obj.penalty_lock),'" default="',            num2str(obj.penalty_lock),'">',            '     <section name="damage" />','     <help> stabilize unstable damage constraints that keep zigzagging after n iteration (default is 0, no stabilization) </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="penalty_threshold" type="',   class(obj.penalty_threshold),'" default="',            num2str(obj.penalty_threshold),'">',            '     <section name="damage" />','     <help> threshold to declare convergence of damage evolution solution (default is 0) </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="penalty_factor" type="',      class(obj.penalty_factor),'" default="',            num2str(obj.penalty_factor),'">',            '     <section name="damage" />','     <help> scaling exponent (default is 3) </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="maxiter" type="',             class(self.maxiter),'" default="',   num2str(self.maxiter),'">',   '     <section name="damage" />','     <help> maximum number of non linear iterations </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="penalty_lock" type="',        class(self.penalty_lock),'" default="',            num2str(self.penalty_lock),'">',            '     <section name="damage" />','     <help> stabilize unstable damage constraints that keep zigzagging after n iteration (default is 0, no stabilization) </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="penalty_threshold" type="',   class(self.penalty_threshold),'" default="',            num2str(self.penalty_threshold),'">',            '     <section name="damage" />','     <help> threshold to declare convergence of damage evolution solution (default is 0) </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="penalty_factor" type="',      class(self.penalty_factor),'" default="',            num2str(self.penalty_factor),'">',            '     <section name="damage" />','     <help> scaling exponent (default is 3) </help>','</parameter>');
+ 
+ 		end % }}}
+         
+-		function obj = damage(varargin) % {{{
++		function self = damage(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+ 					inputstruct=varargin{1};
+ 					list1 = properties('damage');
+@@ -96,59 +96,59 @@
+ 					for i=1:length(list1)
+ 						fieldname = list1{i};
+ 						if ismember(fieldname,list2),
+-							obj.(fieldname) = inputstruct.(fieldname);
++							self.(fieldname) = inputstruct.(fieldname);
+ 						end
+ 					end
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%damage parameters: 
+-			obj.isdamage=0;
+-			obj.D=0;
+-			obj.law=0;
++			self.isdamage=0;
++			self.D=0;
++			self.law=0;
+ 			
+-			obj.max_damage=1-1e-5; %if damage reaches 1, solve becomes singular, as viscosity becomes nil
++			self.max_damage=1-1e-5; %if damage reaches 1, solve becomes singular, as viscosity becomes nil
+ 		
+ 			%Type of stabilization used
+-			obj.stabilization=2;
++			self.stabilization=2;
+ 			
+ 			%Maximum number of iterations
+-			obj.maxiter=100;
++			self.maxiter=100;
+ 
+ 			%finite element interpolation
+-			obj.elementinterp='P1';
++			self.elementinterp='P1';
+ 
+ 			%factor used to compute the values of the penalties: kappa=max(stiffness matrix)*10^penalty_factor
+-			obj.penalty_factor=3;
++			self.penalty_factor=3;
+ 			
+ 			%stabilize unstable damage constraints that keep zigzagging after n iteration (default is 0, no stabilization)
+-			obj.penalty_lock=0;
++			self.penalty_lock=0;
+ 			
+ 			%threshold to declare convergence of thermal solution (default is 0)
+-			obj.penalty_threshold=0;
++			self.penalty_threshold=0;
+ 		
+ 			%damage evolution parameters 
+-			obj.stress_threshold=0;
+-			obj.healing=0;
+-			obj.c1=0;
+-			obj.c2=0;
+-			obj.c3=0;
+-			obj.c4=0;
+-			obj.equiv_stress=0;
++			self.stress_threshold=0;
++			self.healing=0;
++			self.c1=0;
++			self.c2=0;
++			self.c3=0;
++			self.c4=0;
++			self.equiv_stress=0;
+ 
+ 			 %output default:
+-			 obj.requested_outputs={'default'};
++			 self.requested_outputs={'default'};
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 			
+ 			md = checkfield(md,'fieldname','damage.isdamage','values',[1,0]);
+-			if obj.isdamage,
++			if self.isdamage,
+ 				md = checkfield(md,'fieldname','damage.law','numel',[1],'values',[0,1,2]);
+-				md = checkfield(md,'fieldname','damage.D','>=',0,'<=',obj.max_damage,'size',[md.mesh.numberofvertices 1]);
++				md = checkfield(md,'fieldname','damage.D','>=',0,'<=',self.max_damage,'size',[md.mesh.numberofvertices 1]);
+ 				md = checkfield(md,'fieldname','damage.spcdamage','timeseries',1);
+ 				md = checkfield(md,'fieldname','damage.max_damage','<',1,'>=',0);
+ 				md = checkfield(md,'fieldname','damage.stabilization','numel',[1],'values',[0 1 2]);
+@@ -165,7 +165,7 @@
+ 				md = checkfield(md,'fieldname','damage.stress_threshold','>=',0);
+ 				md = checkfield(md,'fieldname','damage.equiv_stress','numel',[1],'values',[0 1]);
+ 				md = checkfield(md,'fieldname','damage.requested_outputs','stringrow',1);
+-			elseif (obj.law~=0),
++			elseif (self.law~=0),
+ 				if (solution==DamageEvolutionSolutionEnum),
+ 					error('Invalid evolution law (md.damage.law) for a damage solution');
+ 				end
+@@ -179,65 +179,65 @@
+             list = {'DamageD'};
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   Damage:\n'));
+ 
+-			fielddisplay(obj,'isdamage','is damage mechanics being used? {true,false}');
+-			if obj.isdamage,
+-				fielddisplay(obj,'law','damage law {''0: undamaged'',''1: pralong''}');
+-				fielddisplay(obj,'D','damage tensor (scalar)');
+-				fielddisplay(obj,'spcdamage','damage constraints (NaN means no constraint)');
+-				fielddisplay(obj,'max_damage','maximum possible damage (0<=max_damage<1)');
++			fielddisplay(self,'isdamage','is damage mechanics being used? {true,false}');
++			if self.isdamage,
++				fielddisplay(self,'law','damage law {''0: undamaged'',''1: pralong''}');
++				fielddisplay(self,'D','damage tensor (scalar)');
++				fielddisplay(self,'spcdamage','damage constraints (NaN means no constraint)');
++				fielddisplay(self,'max_damage','maximum possible damage (0<=max_damage<1)');
+ 				
+-				fielddisplay(obj,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG');
+-				fielddisplay(obj,'maxiter','maximum number of non linear iterations');
+-				fielddisplay(obj,'elementinterp','interpolation scheme for finite elements {''P1'',''P2''}');
+-				fielddisplay(obj,'penalty_lock','stabilize unstable damage constraints that keep zigzagging after n iteration (default is 0, no stabilization)');
+-				fielddisplay(obj,'penalty_threshold','threshold to declare convergence of damage evolution solution (default is 0)');
+-				fielddisplay(obj,'penalty_factor','scaling exponent (default is 3)');
+-				fielddisplay(obj,'c1','damage parameter 1');
+-				fielddisplay(obj,'c2','damage parameter 2');
+-				fielddisplay(obj,'c3','damage parameter 3');
+-				fielddisplay(obj,'c4','damage parameter 4');
+-				fielddisplay(obj,'healing','damage healing parameter');
+-				fielddisplay(obj,'stress_threshold','damage stress threshold [Pa]');
+-				fielddisplay(obj,'equiv_stress','0: von Mises, 1: max principal');
+-				fielddisplay(obj,'requested_outputs','additional outputs requested');
++				fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG');
++				fielddisplay(self,'maxiter','maximum number of non linear iterations');
++				fielddisplay(self,'elementinterp','interpolation scheme for finite elements {''P1'',''P2''}');
++				fielddisplay(self,'penalty_lock','stabilize unstable damage constraints that keep zigzagging after n iteration (default is 0, no stabilization)');
++				fielddisplay(self,'penalty_threshold','threshold to declare convergence of damage evolution solution (default is 0)');
++				fielddisplay(self,'penalty_factor','scaling exponent (default is 3)');
++				fielddisplay(self,'c1','damage parameter 1');
++				fielddisplay(self,'c2','damage parameter 2');
++				fielddisplay(self,'c3','damage parameter 3');
++				fielddisplay(self,'c4','damage parameter 4');
++				fielddisplay(self,'healing','damage healing parameter');
++				fielddisplay(self,'stress_threshold','damage stress threshold [Pa]');
++				fielddisplay(self,'equiv_stress','0: von Mises, 1: max principal');
++				fielddisplay(self,'requested_outputs','additional outputs requested');
+ 			end
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 		
+-			WriteData(fid,'object',obj,'fieldname','isdamage','format','Boolean');
+-			if obj.isdamage,
+-				WriteData(fid,'object',obj,'fieldname','law','format','Integer');
+-				WriteData(fid,'object',obj,'fieldname','D','format','DoubleMat','mattype',1);
+-				WriteData(fid,'object',obj,'fieldname','spcdamage','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+-				WriteData(fid,'object',obj,'fieldname','max_damage','format','Double');
++			WriteData(fid,'object',self,'fieldname','isdamage','format','Boolean');
++			if self.isdamage,
++				WriteData(fid,'object',self,'fieldname','law','format','Integer');
++				WriteData(fid,'object',self,'fieldname','D','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',self,'fieldname','spcdamage','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++				WriteData(fid,'object',self,'fieldname','max_damage','format','Double');
+ 
+-				WriteData(fid,'object',obj,'fieldname','stabilization','format','Integer');
+-				WriteData(fid,'object',obj,'fieldname','maxiter','format','Integer');
+-				WriteData(fid,'enum',DamageElementinterpEnum(),'data',StringToEnum(obj.elementinterp),'format','Integer');
+-				WriteData(fid,'object',obj,'fieldname','penalty_threshold','format','Integer');
+-				WriteData(fid,'object',obj,'fieldname','penalty_lock','format','Integer');
+-				WriteData(fid,'object',obj,'fieldname','penalty_factor','format','Double');
+-				WriteData(fid,'object',obj,'fieldname','c1','format','Double');
+-				WriteData(fid,'object',obj,'fieldname','c2','format','Double');
+-				WriteData(fid,'object',obj,'fieldname','c3','format','Double');
+-				WriteData(fid,'object',obj,'fieldname','c4','format','Double');
+-				WriteData(fid,'object',obj,'fieldname','stress_threshold','format','Double');
+-				WriteData(fid,'object',obj,'fieldname','healing','format','Double');
+-				WriteData(fid,'object',obj,'fieldname','equiv_stress','format','Integer');
++				WriteData(fid,'object',self,'fieldname','stabilization','format','Integer');
++				WriteData(fid,'object',self,'fieldname','maxiter','format','Integer');
++				WriteData(fid,'enum',DamageElementinterpEnum(),'data',StringToEnum(self.elementinterp),'format','Integer');
++				WriteData(fid,'object',self,'fieldname','penalty_threshold','format','Integer');
++				WriteData(fid,'object',self,'fieldname','penalty_lock','format','Integer');
++				WriteData(fid,'object',self,'fieldname','penalty_factor','format','Double');
++				WriteData(fid,'object',self,'fieldname','c1','format','Double');
++				WriteData(fid,'object',self,'fieldname','c2','format','Double');
++				WriteData(fid,'object',self,'fieldname','c3','format','Double');
++				WriteData(fid,'object',self,'fieldname','c4','format','Double');
++				WriteData(fid,'object',self,'fieldname','stress_threshold','format','Double');
++				WriteData(fid,'object',self,'fieldname','healing','format','Double');
++				WriteData(fid,'object',self,'fieldname','equiv_stress','format','Integer');
+ 			end
+ 
+ 			%process requested outputs
+-			outputs = obj.requested_outputs;
++			outputs = self.requested_outputs;
+ 			pos = find(ismember(outputs,'default'));
+ 			if ~isempty(pos),
+ 				outputs(pos) = [];                         %remove 'default' from outputs
+-				outputs      = [outputs defaultoutputs(obj,md)]; %add defaults
++				outputs      = [outputs defaultoutputs(self,md)]; %add defaults
+ 			end
+-			if obj.isdamage,
++			if self.isdamage,
+ 				WriteData(fid,'data',outputs,'enum',DamageEvolutionRequestedOutputsEnum,'format','StringArray');
+ 			end
+ 
+Index: ../trunk-jpl/src/m/classes/taoinversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/taoinversion.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/taoinversion.m	(revision 19040)
+@@ -28,53 +28,53 @@
+ 		surface_obs               = NaN
+ 	end
+ 	methods
+-		function obj = taoinversion(varargin) % {{{
++		function self = taoinversion(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+-					obj=structtoobj(taoinversion(),varargin{1});
++					self=structtoobj(taoinversion(),varargin{1});
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%default is incomplete adjoint for now
+-			obj.incomplete_adjoint=1;
++			self.incomplete_adjoint=1;
+ 
+ 			%parameter to be inferred by control methods (only
+ 			%drag and B are supported yet)
+-			obj.control_parameters={'FrictionCoefficient'};
++			self.control_parameters={'FrictionCoefficient'};
+ 
+ 			%number of iterations and steps
+-			obj.maxsteps=20;
+-			obj.maxiter =30;
++			self.maxsteps=20;
++			self.maxiter =30;
+ 
+ 			%default tolerances
+-			obj.fatol = 0;
+-			obj.frtol = 0;
+-			obj.gatol = 0;
+-			obj.grtol = 0;
+-			obj.gttol = 1e-4;
++			self.fatol = 0;
++			self.frtol = 0;
++			self.gatol = 0;
++			self.grtol = 0;
++			self.gttol = 1e-4;
+ 
+ 			%minimization algorithm
+ 			PETSCMAJOR = IssmConfig('_PETSC_MAJOR_');
+ 			PETSCMINOR = IssmConfig('_PETSC_MINOR_');
+ 			if(PETSCMAJOR>3 | (PETSCMAJOR==3 & PETSCMINOR>=5))
+-				obj.algorithm = 'blmvm';
++				self.algorithm = 'blmvm';
+ 			else
+-				obj.algorithm = 'tao_blmvm';
++				self.algorithm = 'tao_blmvm';
+ 			end
+ 
+ 			%several responses can be used:
+-			obj.cost_functions=101;
++			self.cost_functions=101;
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return
+-			if ~obj.iscontrol, return; end
++			if ~self.iscontrol, return; end
+ 
+ 			if ~IssmConfig('_HAVE_TAO_'),
+ 				md = checkmessage(md,['TAO has not been installed, ISSM needs to be reconfigured and recompiled with TAO']);
+@@ -116,28 +116,28 @@
+ 				md = checkfield(md,'fieldname','inversion.vy_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   taoinversion parameters:'));
+-			fielddisplay(obj,'iscontrol','is inversion activated?');
+-			fielddisplay(obj,'incomplete_adjoint','1: linear viscosity, 0: non-linear viscosity');
+-			fielddisplay(obj,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}');
+-			fielddisplay(obj,'maxsteps','maximum number of iterations (gradient computation)');
+-			fielddisplay(obj,'maxiter','maximum number of Function evaluation (forward run)');
+-			fielddisplay(obj,'fatol','convergence criterion: f(X)-f(X*) (X: current iteration, X*: "true" solution, f: cost function)');
+-			fielddisplay(obj,'frtol','convergence criterion: |f(X)-f(X*)|/|f(X*)|');
+-			fielddisplay(obj,'gatol','convergence criterion: ||g(X)|| (g: gradient of the cost function)');
+-			fielddisplay(obj,'grtol','convergence criterion: ||g(X)||/|f(X)|');
+-			fielddisplay(obj,'gttol','convergence criterion: ||g(X)||/||g(X0)|| (g(X0): gradient at initial guess X0)');
+-			fielddisplay(obj,'algorithm','minimization algorithm: ''tao_blmvm'', ''tao_cg'', ''tao_lmvm''');
+-			fielddisplay(obj,'cost_functions','indicate the type of response for each optimization step');
+-			fielddisplay(obj,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter');
+-			fielddisplay(obj,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex');
+-			fielddisplay(obj,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex');
+-			fielddisplay(obj,'vx_obs','observed velocity x component [m/yr]');
+-			fielddisplay(obj,'vy_obs','observed velocity y component [m/yr]');
+-			fielddisplay(obj,'vel_obs','observed velocity magnitude [m/yr]');
+-			fielddisplay(obj,'thickness_obs','observed thickness [m]');
+-			fielddisplay(obj,'surface_obs','observed surface elevation [m]');
++			fielddisplay(self,'iscontrol','is inversion activated?');
++			fielddisplay(self,'incomplete_adjoint','1: linear viscosity, 0: non-linear viscosity');
++			fielddisplay(self,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}');
++			fielddisplay(self,'maxsteps','maximum number of iterations (gradient computation)');
++			fielddisplay(self,'maxiter','maximum number of Function evaluation (forward run)');
++			fielddisplay(self,'fatol','convergence criterion: f(X)-f(X*) (X: current iteration, X*: "true" solution, f: cost function)');
++			fielddisplay(self,'frtol','convergence criterion: |f(X)-f(X*)|/|f(X*)|');
++			fielddisplay(self,'gatol','convergence criterion: ||g(X)|| (g: gradient of the cost function)');
++			fielddisplay(self,'grtol','convergence criterion: ||g(X)||/|f(X)|');
++			fielddisplay(self,'gttol','convergence criterion: ||g(X)||/||g(X0)|| (g(X0): gradient at initial guess X0)');
++			fielddisplay(self,'algorithm','minimization algorithm: ''tao_blmvm'', ''tao_cg'', ''tao_lmvm''');
++			fielddisplay(self,'cost_functions','indicate the type of response for each optimization step');
++			fielddisplay(self,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter');
++			fielddisplay(self,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex');
++			fielddisplay(self,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex');
++			fielddisplay(self,'vx_obs','observed velocity x component [m/yr]');
++			fielddisplay(self,'vy_obs','observed velocity y component [m/yr]');
++			fielddisplay(self,'vel_obs','observed velocity magnitude [m/yr]');
++			fielddisplay(self,'thickness_obs','observed thickness [m]');
++			fielddisplay(self,'surface_obs','observed surface elevation [m]');
+ 			disp('Available cost functions:');
+ 			disp('   101: SurfaceAbsVelMisfit');
+ 			disp('   102: SurfaceRelVelMisfit');
+@@ -149,43 +149,43 @@
+ 			disp('   502: RheologyBbarAbsGradient');
+ 			disp('   503: ThicknessAbsGradient');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			yts=365.0*24.0*3600.0;
+ 
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','iscontrol','format','Boolean');
++			WriteData(fid,'object',self,'class','inversion','fieldname','iscontrol','format','Boolean');
+ 			WriteData(fid,'enum',InversionTypeEnum(),'data',1,'format','Integer');
+-			if ~obj.iscontrol, return; end
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','incomplete_adjoint','format','Boolean');
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','maxsteps','format','Integer');
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','maxiter','format','Integer');
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','fatol','format','Double');
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','frtol','format','Double');
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','gatol','format','Double');
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','grtol','format','Double');
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','gttol','format','Double');
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','algorithm','format','String');
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','min_parameters','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','max_parameters','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','vx_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','vy_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','vz_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','surface_obs','format','DoubleMat','mattype',1);
++			if ~self.iscontrol, return; end
++			WriteData(fid,'object',self,'class','inversion','fieldname','incomplete_adjoint','format','Boolean');
++			WriteData(fid,'object',self,'class','inversion','fieldname','maxsteps','format','Integer');
++			WriteData(fid,'object',self,'class','inversion','fieldname','maxiter','format','Integer');
++			WriteData(fid,'object',self,'class','inversion','fieldname','fatol','format','Double');
++			WriteData(fid,'object',self,'class','inversion','fieldname','frtol','format','Double');
++			WriteData(fid,'object',self,'class','inversion','fieldname','gatol','format','Double');
++			WriteData(fid,'object',self,'class','inversion','fieldname','grtol','format','Double');
++			WriteData(fid,'object',self,'class','inversion','fieldname','gttol','format','Double');
++			WriteData(fid,'object',self,'class','inversion','fieldname','algorithm','format','String');
++			WriteData(fid,'object',self,'class','inversion','fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','inversion','fieldname','min_parameters','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'class','inversion','fieldname','max_parameters','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'class','inversion','fieldname','vx_obs','format','DoubleMat','mattype',1,'scale',1./yts);
++			WriteData(fid,'object',self,'class','inversion','fieldname','vy_obs','format','DoubleMat','mattype',1,'scale',1./yts);
++			WriteData(fid,'object',self,'class','inversion','fieldname','vz_obs','format','DoubleMat','mattype',1,'scale',1./yts);
++			WriteData(fid,'object',self,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','inversion','fieldname','surface_obs','format','DoubleMat','mattype',1);
+ 
+ 			%process control parameters
+-			num_control_parameters=numel(obj.control_parameters);
++			num_control_parameters=numel(self.control_parameters);
+ 			data=zeros(1,num_control_parameters);
+ 			for i=1:num_control_parameters,
+-				data(i)=StringToEnum(obj.control_parameters{i});
++				data(i)=StringToEnum(self.control_parameters{i});
+ 			end
+ 			WriteData(fid,'data',data,'enum',InversionControlParametersEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_control_parameters,'enum',InversionNumControlParametersEnum(),'format','Integer');
+ 
+ 			%process cost functions
+-			num_cost_functions=size(obj.cost_functions,2);
+-			data=marshallcostfunctions(obj.cost_functions);
++			num_cost_functions=size(self.cost_functions,2);
++			data=marshallcostfunctions(self.cost_functions);
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/calvingdev.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvingdev.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/calvingdev.m	(revision 19040)
+@@ -10,10 +10,10 @@
+ 		meltingrate   = NaN;
+ 	end
+ 	methods
+-		function obj = calvingdev(varargin) % {{{
++		function self = calvingdev(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+ 					inputstruct=varargin{1};
+ 					list1 = properties('calvingdev');
+@@ -21,22 +21,22 @@
+ 					for i=1:length(list1)
+ 						fieldname = list1{i};
+ 						if ismember(fieldname,list2),
+-							obj.(fieldname) = inputstruct.(fieldname);
++							self.(fieldname) = inputstruct.(fieldname);
+ 						end
+ 					end
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%stabilization = 2 by default
+-			obj.stabilization = 2;
++			self.stabilization = 2;
+ 
+ 			%Proportionality coefficient in Pi model
+-			obj.coeff=2e13;
++			self.coeff=2e13;
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 			%Early return
+ 			if (solution~=TransientSolutionEnum() | md.transient.iscalving==0), return; end
+ 
+@@ -44,19 +44,19 @@
+ 			md = checkfield(md,'fieldname','calving.coeff','>',0,'size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','calving.meltingrate','NaN',1,'size',[md.mesh.numberofvertices 1],'>=',0);
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   Calving Pi parameters:'));
+-			fielddisplay(obj,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding');
+-			fielddisplay(obj,'coeff','proportionality coefficient in Pi model');
+-			fielddisplay(obj,'meltingrate','melting rate at given location [m/a]');
++			fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding');
++			fielddisplay(self,'coeff','proportionality coefficient in Pi model');
++			fielddisplay(self,'meltingrate','melting rate at given location [m/a]');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 			yts=365.0*24.0*3600.0;
+ 			WriteData(fid,'enum',CalvingLawEnum(),'data',CalvingDevEnum(),'format','Integer');
+-			WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',obj.stabilization,'format','Integer');
+-			WriteData(fid,'enum',CalvingpiCoeffEnum(),'data',obj.coeff,'format','DoubleMat','mattype',1);
+-			WriteData(fid,'class','calving','object',obj,'fieldname','meltingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts);
++			WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',self.stabilization,'format','Integer');
++			WriteData(fid,'enum',CalvingpiCoeffEnum(),'data',self.coeff,'format','DoubleMat','mattype',1);
++			WriteData(fid,'class','calving','object',self,'fieldname','meltingrate','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1,'scale',1./yts);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/hydrologydc.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologydc.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/hydrologydc.m	(revision 19040)
+@@ -36,11 +36,11 @@
+ 		eplflip_lock             = 0;
+   end
+ 	methods
+-		% {{{ function obj = hydrologydc(varargin) 
+-		function obj = hydrologydc(varargin) 
++		% {{{ function self = hydrologydc(varargin) 
++		function self = hydrologydc(varargin) 
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 	    end
+@@ -53,38 +53,38 @@
+ 			end
+ 
+ 		end % }}}
+-		% {{{ function obj = setdefaultparameters(obj) 
+-		function obj = setdefaultparameters(obj) 
++		% {{{ function self = setdefaultparameters(self) 
++		function self = setdefaultparameters(self) 
+ 
+ 		%Parameters from de Fleurian 2014
+-			obj.water_compressibility    = 5.04e-10;
+-			obj.isefficientlayer         = 1;
+-			obj.penalty_factor           = 3;
+-			obj.penalty_lock             = 0;
+-			obj.rel_tol                  = 1.0e-06;
+-			obj.max_iter                 = 100;
+-			obj.sedimentlimit_flag       = 0;
+-			obj.sedimentlimit            = 0;
+-			obj.transfer_flag            = 0;
+-			obj.leakage_factor           = 10.0;
++			self.water_compressibility    = 5.04e-10;
++			self.isefficientlayer         = 1;
++			self.penalty_factor           = 3;
++			self.penalty_lock             = 0;
++			self.rel_tol                  = 1.0e-06;
++			self.max_iter                 = 100;
++			self.sedimentlimit_flag       = 0;
++			self.sedimentlimit            = 0;
++			self.transfer_flag            = 0;
++			self.leakage_factor           = 10.0;
+ 
+-			obj.sediment_compressibility = 1.0e-08;
+-			obj.sediment_porosity        = 0.4;
+-			obj.sediment_thickness       = 20.0;
+-			obj.sediment_transmitivity   = 8.0e-04;
++			self.sediment_compressibility = 1.0e-08;
++			self.sediment_porosity        = 0.4;
++			self.sediment_thickness       = 20.0;
++			self.sediment_transmitivity   = 8.0e-04;
+ 
+-			obj.epl_compressibility      = 1.0e-08;
+-			obj.epl_porosity             = 0.4;
+-			obj.epl_initial_thickness    = 1.0;
+-			obj.epl_colapse_thickness    = 1.0e-3;
+-			obj.epl_thick_comp           = 1;
+-			obj.epl_max_thickness        = 5.0;
+-			obj.epl_conductivity         = 8.0e-02;
+-			obj.eplflip_lock             = 0;
++			self.epl_compressibility      = 1.0e-08;
++			self.epl_porosity             = 0.4;
++			self.epl_initial_thickness    = 1.0;
++			self.epl_colapse_thickness    = 1.0e-3;
++			self.epl_thick_comp           = 1;
++			self.epl_max_thickness        = 5.0;
++			self.epl_conductivity         = 8.0e-02;
++			self.eplflip_lock             = 0;
+ 		end 
+ 		% }}}
+-		% {{{ function md = checkconsistency(obj,md,solution,analyses) 
+-		function md = checkconsistency(obj,md,solution,analyses) 
++		% {{{ function md = checkconsistency(self,md,solution,analyses) 
++		function md = checkconsistency(self,md,solution,analyses) 
+ 		%Early return
+ 			if ~ismember(HydrologyDCInefficientAnalysisEnum(),analyses) & ~ismember(HydrologyDCEfficientAnalysisEnum(),analyses),
+ 				return;
+@@ -98,10 +98,10 @@
+ 			md = checkfield(md,'fieldname','hydrology.max_iter','>',0,'numel',1);
+ 			md = checkfield(md,'fieldname','hydrology.sedimentlimit_flag','numel',[1],'values',[0 1 2 3]);
+ 			md = checkfield(md,'fieldname','hydrology.transfer_flag','numel',[1],'values',[0 1]);
+-			if obj.sedimentlimit_flag==1,
++			if self.sedimentlimit_flag==1,
+ 				md = checkfield(md,'fieldname','hydrology.sedimentlimit','>',0,'numel',1);
+ 	    end
+-			if obj.transfer_flag==1,
++			if self.transfer_flag==1,
+ 				md = checkfield(md,'fieldname','hydrology.leakage_factor','>',0,'numel',1);
+ 	    end
+ 			md = checkfield(md,'fieldname','hydrology.basal_moulin_input','NaN',1,'timeseries',1);
+@@ -112,7 +112,7 @@
+ 			md = checkfield(md,'fieldname','hydrology.sediment_thickness','>',0,'numel',1);
+ 			md = checkfield(md,'fieldname','hydrology.sediment_transmitivity','>=',0,'size',[md.mesh.numberofvertices 1]);
+ 
+-			if obj.isefficientlayer==1,
++			if self.isefficientlayer==1,
+ 				md = checkfield(md,'fieldname','hydrology.spcepl_head','timeseries',1);
+ 				md = checkfield(md,'fieldname','hydrology.mask_eplactive_node','size',[md.mesh.numberofvertices 1],'values',[0 1]);
+ 				md = checkfield(md,'fieldname','hydrology.epl_compressibility','>',0,'numel',1);
+@@ -123,96 +123,96 @@
+ 				md = checkfield(md,'fieldname','hydrology.epl_max_thickness','>',0,'numel',1);
+ 				md = checkfield(md,'fieldname','hydrology.epl_conductivity','>',0,'numel',1);
+ 				md = checkfield(md,'fieldname','hydrology.eplflip_lock','>=',0,'numel',1);
+-				if (obj.epl_colapse_thickness>obj.epl_initial_thickness),
++				if (self.epl_colapse_thickness>self.epl_initial_thickness),
+ 					md = checkmessage(md,'Colapsing thickness for EPL larger than initial thickness');
+ 				end 
+ 	    end
+ 		end 
+ 		% }}}
+-		% {{{ function disp(obj)
+-		function disp(obj) 
++		% {{{ function disp(self)
++		function disp(self) 
+ 			disp(sprintf('   hydrology Dual Porous Continuum Equivalent parameters:'));
+ 			disp(sprintf('   - general parameters'));
+-			fielddisplay(obj,'water_compressibility','compressibility of water [Pa^-1]');
+-			fielddisplay(obj,'isefficientlayer','do we use an efficient drainage system [1: true; 0: false]');
+-			fielddisplay(obj,'penalty_factor','exponent of the value used in the penalisation method [dimensionless]');
+-			fielddisplay(obj,'penalty_lock','stabilize unstable constraints that keep zigzagging after n iteration (default is 0, no stabilization)');
+-			fielddisplay(obj,'rel_tol','tolerance of the nonlinear iteration for the transfer between layers [dimensionless]');
+-			fielddisplay(obj,'max_iter','maximum number of nonlinear iteration');
+-			fielddisplay(obj,'sedimentlimit_flag','what kind of upper limit is applied for the inefficient layer');
++			fielddisplay(self,'water_compressibility','compressibility of water [Pa^-1]');
++			fielddisplay(self,'isefficientlayer','do we use an efficient drainage system [1: true; 0: false]');
++			fielddisplay(self,'penalty_factor','exponent of the value used in the penalisation method [dimensionless]');
++			fielddisplay(self,'penalty_lock','stabilize unstable constraints that keep zigzagging after n iteration (default is 0, no stabilization)');
++			fielddisplay(self,'rel_tol','tolerance of the nonlinear iteration for the transfer between layers [dimensionless]');
++			fielddisplay(self,'max_iter','maximum number of nonlinear iteration');
++			fielddisplay(self,'sedimentlimit_flag','what kind of upper limit is applied for the inefficient layer');
+ 			disp(sprintf('%55s  0: no limit',' '));
+ 			disp(sprintf('%55s  1: user defined: %s',' ','sedimentlimit'));
+ 			disp(sprintf('%55s  2: hydrostatic pressure',' '));
+ 			disp(sprintf('%55s  3: normal stress',' '));
+-			if obj.sedimentlimit_flag==1,
+-				fielddisplay(obj,'sedimentlimit','user defined upper limit for the inefficient layer [m]');
++			if self.sedimentlimit_flag==1,
++				fielddisplay(self,'sedimentlimit','user defined upper limit for the inefficient layer [m]');
+ 	    end
+-			fielddisplay(obj,'transfer_flag',['what kind of transfer method is applied between the layers']);
++			fielddisplay(self,'transfer_flag',['what kind of transfer method is applied between the layers']);
+ 			disp(sprintf('%55s  0: no transfer',' '));
+ 			disp(sprintf('%55s  1: constant leakage factor: %s',' ','leakage_factor'));
+-			if obj.transfer_flag==1,
+-				fielddisplay(obj,'leakage_factor','user defined leakage factor [m]');
++			if self.transfer_flag==1,
++				fielddisplay(self,'leakage_factor','user defined leakage factor [m]');
+ 	    end
+-			fielddisplay(obj,'basal_moulin_input','water flux at a given point [m3 s-1]');
++			fielddisplay(self,'basal_moulin_input','water flux at a given point [m3 s-1]');
+ 			disp(sprintf('   - for the sediment layer'));
+-			fielddisplay(obj,'spcsediment_head','sediment water head constraints (NaN means no constraint) [m above MSL]');
+-			fielddisplay(obj,'sediment_compressibility','sediment compressibility [Pa^-1]');
+-			fielddisplay(obj,'sediment_porosity','sediment [dimensionless]');
+-			fielddisplay(obj,'sediment_thickness','sediment thickness [m]');
+-			fielddisplay(obj,'sediment_transmitivity','sediment transmitivity [m^2/s]');
++			fielddisplay(self,'spcsediment_head','sediment water head constraints (NaN means no constraint) [m above MSL]');
++			fielddisplay(self,'sediment_compressibility','sediment compressibility [Pa^-1]');
++			fielddisplay(self,'sediment_porosity','sediment [dimensionless]');
++			fielddisplay(self,'sediment_thickness','sediment thickness [m]');
++			fielddisplay(self,'sediment_transmitivity','sediment transmitivity [m^2/s]');
+ 
+-			if obj.isefficientlayer==1,
++			if self.isefficientlayer==1,
+ 				disp(sprintf('   - for the epl layer'));
+-				fielddisplay(obj,'spcepl_head','epl water head constraints (NaN means no constraint) [m above MSL]');
+-				fielddisplay(obj,'mask_eplactive_node','active (1) or not (0) EPL');
+-				fielddisplay(obj,'epl_compressibility','epl compressibility [Pa^-1]');
+-				fielddisplay(obj,'epl_porosity','epl [dimensionless]');
+-				fielddisplay(obj,'epl_initial_thickness','epl initial thickness [m]');
+-				fielddisplay(obj,'epl_colapse_thickness','epl colapsing thickness [m]');
+-				fielddisplay(obj,'epl_thick_comp','epl thickness computation flag');
+-				fielddisplay(obj,'epl_max_thickness','epl maximal thickness [m]');
+-				fielddisplay(obj,'epl_conductivity','epl conductivity [m^2/s]');
+-				fielddisplay(obj,'eplflip_lock','lock the epl activation to avoid fli-floping (default is 0, no stabilization)');
++				fielddisplay(self,'spcepl_head','epl water head constraints (NaN means no constraint) [m above MSL]');
++				fielddisplay(self,'mask_eplactive_node','active (1) or not (0) EPL');
++				fielddisplay(self,'epl_compressibility','epl compressibility [Pa^-1]');
++				fielddisplay(self,'epl_porosity','epl [dimensionless]');
++				fielddisplay(self,'epl_initial_thickness','epl initial thickness [m]');
++				fielddisplay(self,'epl_colapse_thickness','epl colapsing thickness [m]');
++				fielddisplay(self,'epl_thick_comp','epl thickness computation flag');
++				fielddisplay(self,'epl_max_thickness','epl maximal thickness [m]');
++				fielddisplay(self,'epl_conductivity','epl conductivity [m^2/s]');
++				fielddisplay(self,'eplflip_lock','lock the epl activation to avoid fli-floping (default is 0, no stabilization)');
+ 	    end
+ 
+ 		end 
+ 		% }}}
+-		% {{{ function marshall(obj,md,fid) 
+-		function marshall(obj,md,fid) 
++		% {{{ function marshall(self,md,fid) 
++		function marshall(self,md,fid) 
+ 			WriteData(fid,'enum',HydrologyModelEnum(),'data',HydrologydcEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','water_compressibility','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','isefficientlayer','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','penalty_factor','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','penalty_lock','format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','rel_tol','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','max_iter','format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','sedimentlimit_flag','format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','transfer_flag','format','Integer');
+-			if obj.sedimentlimit_flag==1,
+-				WriteData(fid,'object',obj,'fieldname','sedimentlimit','format','Double');
++			WriteData(fid,'object',self,'fieldname','water_compressibility','format','Double');
++			WriteData(fid,'object',self,'fieldname','isefficientlayer','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','penalty_factor','format','Double');
++			WriteData(fid,'object',self,'fieldname','penalty_lock','format','Integer');
++			WriteData(fid,'object',self,'fieldname','rel_tol','format','Double');
++			WriteData(fid,'object',self,'fieldname','max_iter','format','Integer');
++			WriteData(fid,'object',self,'fieldname','sedimentlimit_flag','format','Integer');
++			WriteData(fid,'object',self,'fieldname','transfer_flag','format','Integer');
++			if self.sedimentlimit_flag==1,
++				WriteData(fid,'object',self,'fieldname','sedimentlimit','format','Double');
+ 	    end
+-			if obj.transfer_flag==1,
+-				WriteData(fid,'object',obj,'fieldname','leakage_factor','format','Double');
++			if self.transfer_flag==1,
++				WriteData(fid,'object',self,'fieldname','leakage_factor','format','Double');
+ 	    end
+-			WriteData(fid,'object',obj,'fieldname','basal_moulin_input','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1)
++			WriteData(fid,'object',self,'fieldname','basal_moulin_input','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1)
+ 
+-			WriteData(fid,'object',obj,'fieldname','spcsediment_head','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'fieldname','sediment_compressibility','format','Double');			
+-			WriteData(fid,'object',obj,'fieldname','sediment_porosity','format','Double');			
+-			WriteData(fid,'object',obj,'fieldname','sediment_thickness','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','sediment_transmitivity','format','DoubleMat','mattype',1');		
++			WriteData(fid,'object',self,'fieldname','spcsediment_head','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'fieldname','sediment_compressibility','format','Double');			
++			WriteData(fid,'object',self,'fieldname','sediment_porosity','format','Double');			
++			WriteData(fid,'object',self,'fieldname','sediment_thickness','format','Double');
++			WriteData(fid,'object',self,'fieldname','sediment_transmitivity','format','DoubleMat','mattype',1');		
+ 
+-			if obj.isefficientlayer==1,	
+-				WriteData(fid,'object',obj,'fieldname','spcepl_head','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);	
+-				WriteData(fid,'object',obj,'fieldname','mask_eplactive_node','format','DoubleMat','mattype',1);
+-				WriteData(fid,'object',obj,'fieldname','epl_compressibility','format','Double');			
+-				WriteData(fid,'object',obj,'fieldname','epl_porosity','format','Double');			
+-				WriteData(fid,'object',obj,'fieldname','epl_initial_thickness','format','Double');
+-				WriteData(fid,'object',obj,'fieldname','epl_colapse_thickness','format','Double');
+-				WriteData(fid,'object',obj,'fieldname','epl_thick_comp','format','Integer');
+-				WriteData(fid,'object',obj,'fieldname','epl_max_thickness','format','Double');
+-				WriteData(fid,'object',obj,'fieldname','epl_conductivity','format','Double');
+-				WriteData(fid,'object',obj,'fieldname','eplflip_lock','format','Integer');
++			if self.isefficientlayer==1,	
++				WriteData(fid,'object',self,'fieldname','spcepl_head','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);	
++				WriteData(fid,'object',self,'fieldname','mask_eplactive_node','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',self,'fieldname','epl_compressibility','format','Double');			
++				WriteData(fid,'object',self,'fieldname','epl_porosity','format','Double');			
++				WriteData(fid,'object',self,'fieldname','epl_initial_thickness','format','Double');
++				WriteData(fid,'object',self,'fieldname','epl_colapse_thickness','format','Double');
++				WriteData(fid,'object',self,'fieldname','epl_thick_comp','format','Integer');
++				WriteData(fid,'object',self,'fieldname','epl_max_thickness','format','Double');
++				WriteData(fid,'object',self,'fieldname','epl_conductivity','format','Double');
++				WriteData(fid,'object',self,'fieldname','eplflip_lock','format','Integer');
+ 	    end
+ 		end 
+ % }}}
+Index: ../trunk-jpl/src/m/classes/flaim.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/flaim.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/flaim.m	(revision 19040)
+@@ -20,51 +20,51 @@
+ 		opt_niter          = 30000
+ 	end
+ 	methods
+-  	 	function createxml(obj,fid) % {{{
++  	 	function createxml(self,fid) % {{{
+             fprintf(fid, '<!-- flaim -->\n');            
+                     
+             % Input
+             fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Input:">','<section name="flaim" />');                    
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="targets" type="',class(obj.targets),'" default="',convert2str(obj.targets),'">','     <section name="flaim" />','     <help> name of kml output targets file </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="tracks" type="',class(obj.tracks),'" default="',convert2str(obj.tracks),'">','     <section name="flaim" />','     <help> name of kml input tracks file </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="flightreqs" type="',class(obj.flightreqs),'" default="',convert2str(obj.flightreqs),'">','     <section name="flaim" />','     <help> structure of kml flight requirements (not used yet) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="criterion" type="',class(obj.criterion),'" default="',convert2str(obj.criterion),'">','     <section name="flaim" />','     <help> element or nodal criterion for flight path evaluation (metric) </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="targets" type="',class(self.targets),'" default="',convert2str(self.targets),'">','     <section name="flaim" />','     <help> name of kml output targets file </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="tracks" type="',class(self.tracks),'" default="',convert2str(self.tracks),'">','     <section name="flaim" />','     <help> name of kml input tracks file </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="flightreqs" type="',class(self.flightreqs),'" default="',convert2str(self.flightreqs),'">','     <section name="flaim" />','     <help> structure of kml flight requirements (not used yet) </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="criterion" type="',class(self.criterion),'" default="',convert2str(self.criterion),'">','     <section name="flaim" />','     <help> element or nodal criterion for flight path evaluation (metric) </help>','  </parameter>');
+         	fprintf(fid,'%s\n%s\n','</frame>');    
+             
+             % Arguments
+             fprintf(fid,'%s\n%s\n%s\n','<frame key="2" label="Arguments:">','<section name="flaim" />');                    
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="gridsatequator" type="',class(obj.gridsatequator),'" default="',convert2str(obj.gridsatequator),'">','     <section name="flaim" />','     <help> number of grids at equator (determines resolution) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n','  <parameter key ="usevalueordering" type="',class(obj.usevalueordering),'" optional="false">','     <section name="flaim" />','         <option value="',convert2str(obj.usevalueordering),'" type="string" default="true"></option>','     <help> flag to consider target values for flight path evaluation </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n','  <parameter key ="split_antimeridian" type="',class(obj.split_antimeridian),'" optional="false">','     <section name="flaim" />','         <option value="',convert2str(obj.split_antimeridian),'" type="string" default="true"></option>','     <help> flag to split polygons on the antimeridian </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="gridsatequator" type="',class(self.gridsatequator),'" default="',convert2str(self.gridsatequator),'">','     <section name="flaim" />','     <help> number of grids at equator (determines resolution) </help>','  </parameter>');
++            fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n','  <parameter key ="usevalueordering" type="',class(self.usevalueordering),'" optional="false">','     <section name="flaim" />','         <option value="',convert2str(self.usevalueordering),'" type="string" default="true"></option>','     <help> flag to consider target values for flight path evaluation </help>','  </parameter>');
++            fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n','  <parameter key ="split_antimeridian" type="',class(self.split_antimeridian),'" optional="false">','     <section name="flaim" />','         <option value="',convert2str(self.split_antimeridian),'" type="string" default="true"></option>','     <help> flag to split polygons on the antimeridian </help>','  </parameter>');
+             fprintf(fid,'%s\n%s\n','</frame>');   
+             
+             % Optimization
+             fprintf(fid,'%s\n%s\n%s\n','<frame key="3" label="Optimization:">','<section name="flaim" />');                    
+-            fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n','  <parameter key ="path_optimize" type="',class(obj.path_optimize),'" optional="false">','     <section name="flaim" />','         <option value="',convert2str(obj.path_optimize),'" type="string" default="true"></option>','     <help> optimize? (default false) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="opt_ndir" type="',class(obj.opt_ndir),'" default="',convert2str(obj.opt_ndir),'">','     <section name="flaim" />','     <help> number of directions to test when moving a point.  If this value = 1, a random direction is tested. A value > 1 results in directions equally spaced from [0, 2*PI] being tested. For example, 4 would result in directions [0, PI/2, PI, 3PI/2] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="opt_dist" type="',class(obj.opt_dist),'" default="',convert2str(obj.opt_dist),'">','     <section name="flaim" />','     <help> specifies the distance in km (default 25) to move a randomly selected path point on each iteration </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="opt_niter" type="',class(obj.opt_niter),'" default="',convert2str(obj.opt_niter),'">','     <section name="flaim" />','     <help> number of iterations (default 30,000) to run for flightplan optimization, i.e. the number of times to randomly select a point and move it. </help>','  </parameter>');
++            fprintf(fid,'%s%s%s\n%s\n%s%s%s\n%s\n%s\n','  <parameter key ="path_optimize" type="',class(self.path_optimize),'" optional="false">','     <section name="flaim" />','         <option value="',convert2str(self.path_optimize),'" type="string" default="true"></option>','     <help> optimize? (default false) </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="opt_ndir" type="',class(self.opt_ndir),'" default="',convert2str(self.opt_ndir),'">','     <section name="flaim" />','     <help> number of directions to test when moving a point.  If this value = 1, a random direction is tested. A value > 1 results in directions equally spaced from [0, 2*PI] being tested. For example, 4 would result in directions [0, PI/2, PI, 3PI/2] </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="opt_dist" type="',class(self.opt_dist),'" default="',convert2str(self.opt_dist),'">','     <section name="flaim" />','     <help> specifies the distance in km (default 25) to move a randomly selected path point on each iteration </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="opt_niter" type="',class(self.opt_niter),'" default="',convert2str(self.opt_niter),'">','     <section name="flaim" />','     <help> number of iterations (default 30,000) to run for flightplan optimization, i.e. the number of times to randomly select a point and move it. </help>','  </parameter>');
+         	fprintf(fid,'%s\n%s\n','</frame>');     
+             
+             % Output
+             fprintf(fid,'%s\n%s\n%s\n','<frame key="4" label="Output:">','<section name="flaim" />');                    
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="solution" type="',class(obj.solution),'" default="',convert2str(obj.solution),'">','     <section name="flaim" />','     <help> name of kml solution file </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="quality" type="',class(obj.quality),'" default="',convert2str(obj.quality),'">','     <section name="flaim" />','     <help> quality of kml solution </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="solution" type="',class(self.solution),'" default="',convert2str(self.solution),'">','     <section name="flaim" />','     <help> name of kml solution file </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="quality" type="',class(self.quality),'" default="',convert2str(self.quality),'">','     <section name="flaim" />','     <help> quality of kml solution </help>','  </parameter>');
+             fprintf(fid,'%s\n%s\n','</frame>');              
+         
+         end % }}}
+-		function obj = flaim(varargin) % {{{
++		function self = flaim(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return
+ 			if solution~=FlaimSolutionEnum(), return; end
+@@ -77,33 +77,33 @@
+ 			end
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 
+ 			disp(sprintf('   FLAIM - Flight Line Adaptation using Ice sheet Modeling:')); 
+ 
+ 			disp(sprintf('\n      Input:'));
+-			fielddisplay(obj,'targets'            ,'name of kml output targets file ');
+-			fielddisplay(obj,'tracks'             ,'name of kml input tracks file ');
+-			fielddisplay(obj,'flightreqs'         ,'structure of kml flight requirements (not used yet)');
+-			fielddisplay(obj,'criterion'          ,'element or nodal criterion for flight path evaluation (metric)');
++			fielddisplay(self,'targets'            ,'name of kml output targets file ');
++			fielddisplay(self,'tracks'             ,'name of kml input tracks file ');
++			fielddisplay(self,'flightreqs'         ,'structure of kml flight requirements (not used yet)');
++			fielddisplay(self,'criterion'          ,'element or nodal criterion for flight path evaluation (metric)');
+ 
+ 			disp(sprintf('\n      Arguments:'));
+-			fielddisplay(obj,'gridsatequator'     ,'number of grids at equator (determines resolution)');
+-			fielddisplay(obj,'usevalueordering'   ,'flag to consider target values for flight path evaluation');
+-			fielddisplay(obj,'split_antimeridian' ,'flag to split polygons on the antimeridian');
++			fielddisplay(self,'gridsatequator'     ,'number of grids at equator (determines resolution)');
++			fielddisplay(self,'usevalueordering'   ,'flag to consider target values for flight path evaluation');
++			fielddisplay(self,'split_antimeridian' ,'flag to split polygons on the antimeridian');
+ 
+ 			disp(sprintf('\n      Optimization:'));
+-			fielddisplay(obj,'path_optimize'     ,'optimize? (default false)');
+-			fielddisplay(obj,'opt_ndir'     ,{'number of directions to test when moving a point.  If this value = 1, a random direction is tested.',...
++			fielddisplay(self,'path_optimize'     ,'optimize? (default false)');
++			fielddisplay(self,'opt_ndir'     ,{'number of directions to test when moving a point.  If this value = 1, a random direction is tested.',...
+ 											  'A value > 1 results in directions equally spaced from [0, 2*PI] being tested.',...
+ 											  'For example, 4 would result in directions [0, PI/2, PI, 3PI/2].'});
+-			fielddisplay(obj,'opt_dist'     ,'specifies the distance in km (default 25) to move a randomly selected path point on each iteration');
+-			fielddisplay(obj,'opt_niter'     ,{'number of iterations (default 30,000) to run for flightplan optimization',...
++			fielddisplay(self,'opt_dist'     ,'specifies the distance in km (default 25) to move a randomly selected path point on each iteration');
++			fielddisplay(self,'opt_niter'     ,{'number of iterations (default 30,000) to run for flightplan optimization',...
+ 											   'i.e. the number of times to randomly select a point and move it.'});
+ 
+ 			disp(sprintf('\n      Output:'));
+-			fielddisplay(obj,'solution'           ,'name of kml solution file');
+-			fielddisplay(obj,'quality'            ,'quality of kml solution');
++			fielddisplay(self,'solution'           ,'name of kml solution file');
++			fielddisplay(self,'quality'            ,'quality of kml solution');
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/calvinglevermann.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvinglevermann.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/calvinglevermann.m	(revision 19040)
+@@ -10,10 +10,10 @@
+ 		meltingrate   = NaN;
+ 	end
+ 	methods
+-		function obj = calvinglevermann(varargin) % {{{
++		function self = calvinglevermann(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+ 					inputstruct=varargin{1};
+ 					list1 = properties('calvinglevermann');
+@@ -21,22 +21,22 @@
+ 					for i=1:length(list1)
+ 						fieldname = list1{i};
+ 						if ismember(fieldname,list2),
+-							obj.(fieldname) = inputstruct.(fieldname);
++							self.(fieldname) = inputstruct.(fieldname);
+ 						end
+ 					end
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%stabilization = 2 by default
+-			obj.stabilization = 2;
++			self.stabilization = 2;
+ 
+ 			%Proportionality coefficient in Levermann model
+-			obj.coeff=2e13;
++			self.coeff=2e13;
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 			%Early return
+ 			if (solution~=TransientSolutionEnum() | md.transient.iscalving==0), return; end
+ 
+@@ -44,19 +44,19 @@
+ 			md = checkfield(md,'fieldname','calving.coeff','>',0,'size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','calving.meltingrate','NaN',1,'size',[md.mesh.numberofvertices 1],'>=',0);
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   Calving Levermann parameters:'));
+-			fielddisplay(obj,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding');
+-			fielddisplay(obj,'coeff','proportionality coefficient in Levermann model');
+-			fielddisplay(obj,'meltingrate','melting rate at given location [m/a]');
++			fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding');
++			fielddisplay(self,'coeff','proportionality coefficient in Levermann model');
++			fielddisplay(self,'meltingrate','melting rate at given location [m/a]');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 			yts=365.0*24.0*3600.0;
+ 			WriteData(fid,'enum',CalvingLawEnum(),'data',CalvingLevermannEnum(),'format','Integer');
+-			WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',obj.stabilization,'format','Integer');
+-			WriteData(fid,'enum',CalvinglevermannCoeffEnum(),'data',obj.coeff,'format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'fieldname','meltingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts);
++			WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',self.stabilization,'format','Integer');
++			WriteData(fid,'enum',CalvinglevermannCoeffEnum(),'data',self.coeff,'format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'fieldname','meltingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/mask.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mask.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/mask.m	(revision 19040)
+@@ -9,36 +9,36 @@
+ 		ice_levelset         = NaN;
+ 	end
+ 	methods (Static)
+-		function obj = loadobj(obj) % {{{
++		function self = loadobj(self) % {{{
+ 			% This function is directly called by matlab when a model object is
+ 			% loaded. Update old properties here
+ 
+ 			%2014 February 5th
+-			if numel(obj.ice_levelset)>1 & all(obj.ice_levelset>=0),
++			if numel(self.ice_levelset)>1 & all(self.ice_levelset>=0),
+ 				disp('WARNING: md.mask.ice_levelset>=0, you probably need to change the sign of this levelset');
+ 			end
+ 
+ 		end% }}}
+ 	end
+ 	methods
+-        function createxml(obj,fid) % {{{
++        function createxml(self,fid) % {{{
+             fprintf(fid, '\n\n');
+             fprintf(fid, '%s\n', '<!-- mask -->');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="groundedice_levelset" type="',class(obj.groundedice_levelset),'" default="',obj.groundedice_levelset,'">','     <section name="mask" />','     <help> is ice grounded ? grounded ice if > 0, grounding line position if = 0, floating ice if &amp;lt; 0 </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','<parameter key ="ice_levelset" type="',class(obj.ice_levelset),'" default="',obj.ice_levelset,'">','     <section name="mask" />','     <help> presence of ice if > 0, icefront position if = 0, no ice if &amp;lt; 0 </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="groundedice_levelset" type="',class(self.groundedice_levelset),'" default="',self.groundedice_levelset,'">','     <section name="mask" />','     <help> is ice grounded ? grounded ice if > 0, grounding line position if = 0, floating ice if &amp;lt; 0 </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','<parameter key ="ice_levelset" type="',class(self.ice_levelset),'" default="',self.ice_levelset,'">','     <section name="mask" />','     <help> presence of ice if > 0, icefront position if = 0, no ice if &amp;lt; 0 </help>','</parameter>');
+ 		end % }}}
+-		function obj = mask(varargin) % {{{
++		function self = mask(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 			if (solution==SeaiceSolutionEnum()),
+ 				return;
+ 			end
+@@ -57,15 +57,15 @@
+ 				error('At least one element has all nodes on ice front, change md.mask.ice_levelset to fix it')
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   masks:'));
+ 
+-			fielddisplay(obj,'groundedice_levelset','is ice grounded ? grounded ice if > 0, grounding line position if = 0, floating ice if < 0');
+-			fielddisplay(obj,'ice_levelset','presence of ice if < 0, icefront position if = 0, no ice if > 0');
++			fielddisplay(self,'groundedice_levelset','is ice grounded ? grounded ice if > 0, grounding line position if = 0, floating ice if < 0');
++			fielddisplay(self,'ice_levelset','presence of ice if < 0, icefront position if = 0, no ice if > 0');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'object',obj,'fieldname','groundedice_levelset','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'fieldname','ice_levelset','format','DoubleMat','mattype',1);
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'object',self,'fieldname','groundedice_levelset','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'fieldname','ice_levelset','format','DoubleMat','mattype',1);
+ 
+ 			if(md.private.solution==SeaiceSolutionEnum()),
+ 				return;
+Index: ../trunk-jpl/src/m/classes/balancethickness.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/balancethickness.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/balancethickness.m	(revision 19040)
+@@ -12,21 +12,21 @@
+ 		omega             = NaN;
+ 	end
+ 	methods
+-		function obj = balancethickness(varargin) % {{{
++		function self = balancethickness(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%Type of stabilization used
+-			obj.stabilization=1;
++			self.stabilization=1;
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 			%Early return
+ 			if solution~=BalancethicknessSolutionEnum(), return; end
+ 
+@@ -36,23 +36,23 @@
+ 
+ 			%md = checkfield(md,'fieldname','balancethickness.omega','size',[md.mesh.numberofvertices 1],'NaN',1,'>=',0);
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   balance thickness solution parameters:'));
+ 
+-			fielddisplay(obj,'spcthickness','thickness constraints (NaN means no constraint) [m]');
+-			fielddisplay(obj,'thickening_rate','ice thickening rate used in the mass conservation (dh/dt) [m/yr]');
+-			fielddisplay(obj,'stabilization','0: None, 1: SU, 2: SSA''s artificial diffusivity, 3:DG');
++			fielddisplay(self,'spcthickness','thickness constraints (NaN means no constraint) [m]');
++			fielddisplay(self,'thickening_rate','ice thickening rate used in the mass conservation (dh/dt) [m/yr]');
++			fielddisplay(self,'stabilization','0: None, 1: SU, 2: SSA''s artificial diffusivity, 3:DG');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			yts=365.0*24.0*3600.0;
+ 
+-			WriteData(fid,'object',obj,'fieldname','spcthickness','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'fieldname','thickening_rate','format','DoubleMat','mattype',1,'scale',1./yts);
+-			WriteData(fid,'object',obj,'fieldname','stabilization','format','Integer');
++			WriteData(fid,'object',self,'fieldname','spcthickness','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'fieldname','thickening_rate','format','DoubleMat','mattype',1,'scale',1./yts);
++			WriteData(fid,'object',self,'fieldname','stabilization','format','Integer');
+ 
+-			WriteData(fid,'object',obj,'fieldname','omega','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'fieldname','omega','format','DoubleMat','mattype',1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/matdamageice.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/matdamageice.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/matdamageice.m	(revision 19040)
+@@ -29,44 +29,44 @@
+ 
+ 	end
+ 	methods
+-		function createxml(obj,fid) % {{{
++		function createxml(self,fid) % {{{
+ 			fprintf(fid, '\n\n');
+ 			fprintf(fid, '<!-- materials -->\n');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rho_ice" type="',class(obj.rho_ice),'" default="',convert2str(obj.rho_ice),'">','     <section name="materials" />','     <help> ice density [kg/m^3] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rho_water" type="',class(obj.rho_water),'" default="',convert2str(obj.rho_water),'">','     <section name="materials" />','     <help> ocean water density [kg/m^3] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rho_freshwater" type="',class(obj.rho_freshwater),'" default="',convert2str(obj.rho_freshwater),'">','     <section name="materials" />','     <help> fresh water density [kg/m^3] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rho_ice" type="',class(self.rho_ice),'" default="',convert2str(self.rho_ice),'">','     <section name="materials" />','     <help> ice density [kg/m^3] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rho_water" type="',class(self.rho_water),'" default="',convert2str(self.rho_water),'">','     <section name="materials" />','     <help> ocean water density [kg/m^3] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rho_freshwater" type="',class(self.rho_freshwater),'" default="',convert2str(self.rho_freshwater),'">','     <section name="materials" />','     <help> fresh water density [kg/m^3] </help>','</parameter>');
+ 
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="mu_water" type="',class(obj.mu_water),'" default="',convert2str(obj.mu_water),'">','     <section name="materials" />','     <help> water viscosity [N s/m^2] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="heatcapacity" type="',class(obj.heatcapacity),'" default="',convert2str(obj.heatcapacity),'">','     <section name="materials" />','     <help> heat capacity [J/kg/K] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="latentheat" type="',class(obj.latentheat),'" default="',convert2str(obj.latentheat),'">','     <section name="materials" />','     <help> latent heat of fusion [J/kg] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="mu_water" type="',class(self.mu_water),'" default="',convert2str(self.mu_water),'">','     <section name="materials" />','     <help> water viscosity [N s/m^2] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="heatcapacity" type="',class(self.heatcapacity),'" default="',convert2str(self.heatcapacity),'">','     <section name="materials" />','     <help> heat capacity [J/kg/K] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="latentheat" type="',class(self.latentheat),'" default="',convert2str(self.latentheat),'">','     <section name="materials" />','     <help> latent heat of fusion [J/kg] </help>','</parameter>');
+ 
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="thermalconductivity" type="',class(obj.thermalconductivity),'" default="',convert2str(obj.thermalconductivity),'">','     <section name="materials" />','     <help> ice thermal conductivity [W/m/K] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="temperateiceconductivity" type="',class(obj.temperateiceconductivity),'" default="',convert2str(obj.temperateiceconductivity),'">','     <section name="materials" />','     <help> temperate ice thermal conductivity [W/m/K] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="meltingpoint" type="',class(obj.meltingpoint),'" default="',convert2str(obj.meltingpoint),'">','     <section name="materials" />','     <help> melting point of ice at 1atm in K </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="thermalconductivity" type="',class(self.thermalconductivity),'" default="',convert2str(self.thermalconductivity),'">','     <section name="materials" />','     <help> ice thermal conductivity [W/m/K] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="temperateiceconductivity" type="',class(self.temperateiceconductivity),'" default="',convert2str(self.temperateiceconductivity),'">','     <section name="materials" />','     <help> temperate ice thermal conductivity [W/m/K] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="meltingpoint" type="',class(self.meltingpoint),'" default="',convert2str(self.meltingpoint),'">','     <section name="materials" />','     <help> melting point of ice at 1atm in K </help>','</parameter>');
+ 
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="beta" type="',class(obj.beta),'" default="',convert2str(obj.beta),'">','     <section name="materials" />','     <help> rate of change of melting point with pressure [K/Pa] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="mixed_layer_capacity" type="',class(obj.mixed_layer_capacity),'" default="',convert2str(obj.mixed_layer_capacity),'">','     <section name="materials" />','     <help> mixed layer capacity [W/kg/K] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="thermal_exchange_velocity" type="',class(obj.thermal_exchange_velocity),'" default="',convert2str(obj.thermal_exchange_velocity),'">','     <section name="materials" />','     <help> thermal exchange velocity [m/s] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="beta" type="',class(self.beta),'" default="',convert2str(self.beta),'">','     <section name="materials" />','     <help> rate of change of melting point with pressure [K/Pa] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="mixed_layer_capacity" type="',class(self.mixed_layer_capacity),'" default="',convert2str(self.mixed_layer_capacity),'">','     <section name="materials" />','     <help> mixed layer capacity [W/kg/K] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="thermal_exchange_velocity" type="',class(self.thermal_exchange_velocity),'" default="',convert2str(self.thermal_exchange_velocity),'">','     <section name="materials" />','     <help> thermal exchange velocity [m/s] </help>','</parameter>');
+ 
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rheology_B" type="',class(obj.rheology_B),'" default="',convert2str(obj.rheology_B),'">','     <section name="materials" />','     <help> flow law parameter [Pa/s^(1/n)] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rheology_n" type="',class(obj.rheology_n),'" default="',convert2str(obj.rheology_n),'">','     <section name="materials" />','     <help> Glens flow law exponent </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rheology_law" type="',class(obj.rheology_law),'" default="',convert2str(obj.rheology_law),'">','     <section name="materials" />','     <help> law for the temperature dependance of the rheology: "None", "Paterson",  "Arrhenius" or "LliboutryDuval" </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rheology_B" type="',class(self.rheology_B),'" default="',convert2str(self.rheology_B),'">','     <section name="materials" />','     <help> flow law parameter [Pa/s^(1/n)] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rheology_n" type="',class(self.rheology_n),'" default="',convert2str(self.rheology_n),'">','     <section name="materials" />','     <help> Glens flow law exponent </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="rheology_law" type="',class(self.rheology_law),'" default="',convert2str(self.rheology_law),'">','     <section name="materials" />','     <help> law for the temperature dependance of the rheology: "None", "Paterson",  "Arrhenius" or "LliboutryDuval" </help>','</parameter>');
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="lithosphere_shear_modulus" type="',class(obj.lithosphere_shear_modulus),'" default="',convert2str(obj.lithosphere_shear_modulus),'">','     <section name="materials" />','     <help> Lithosphere shear modulus [Pa] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="lithosphere_density" type="',class(obj.lithosphere_density),'" default="',convert2str(obj.lithosphere_density),'">','     <section name="materials" />','     <help> Lithosphere density [g/cm^-3] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="mantle_shear_modulus" type="',class(obj.mantle_shear_modulus),'" default="',convert2str(obj.mantle_shear_modulus),'">','     <section name="materials" />','     <help> Mantle shear modulus [Pa] </help>','</parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="mantle_density" type="',class(obj.mantle_density),'" default="',convert2str(obj.mantle_density),'">','     <section name="materials" />','     <help> Mantle density [g/cm^-3] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="lithosphere_shear_modulus" type="',class(self.lithosphere_shear_modulus),'" default="',convert2str(self.lithosphere_shear_modulus),'">','     <section name="materials" />','     <help> Lithosphere shear modulus [Pa] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="lithosphere_density" type="',class(self.lithosphere_density),'" default="',convert2str(self.lithosphere_density),'">','     <section name="materials" />','     <help> Lithosphere density [g/cm^-3] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="mantle_shear_modulus" type="',class(self.mantle_shear_modulus),'" default="',convert2str(self.mantle_shear_modulus),'">','     <section name="materials" />','     <help> Mantle shear modulus [Pa] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="mantle_density" type="',class(self.mantle_density),'" default="',convert2str(self.mantle_density),'">','     <section name="materials" />','     <help> Mantle density [g/cm^-3] </help>','</parameter>');
+ 
+ 
+ 		end % }}}
+-		function obj = matdamageice(varargin) % {{{
++		function self = matdamageice(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+ 					inputstruct=varargin{1};
+ 					list1 = properties('matdamageice');
+@@ -74,63 +74,63 @@
+ 					for i=1:length(list1)
+ 						fieldname = list1{i};
+ 						if ismember(fieldname,list2),
+-							obj.(fieldname) = inputstruct.(fieldname);
++							self.(fieldname) = inputstruct.(fieldname);
+ 						end
+ 					end
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%ice density (kg/m^3)
+-			obj.rho_ice=917.;
++			self.rho_ice=917.;
+ 
+ 			%ocean water density (kg/m^3)
+-			obj.rho_water=1023.;
++			self.rho_water=1023.;
+ 
+ 			%fresh water density (kg/m^3)
+-			obj.rho_freshwater=1000.;
++			self.rho_freshwater=1000.;
+ 
+ 			%water viscosity (N.s/m^2)
+-			obj.mu_water=0.001787;  
++			self.mu_water=0.001787;  
+ 
+ 			%ice heat capacity cp (J/kg/K)
+-			obj.heatcapacity=2093.;
++			self.heatcapacity=2093.;
+ 
+ 			%ice latent heat of fusion L (J/kg)
+-			obj.latentheat=3.34*10^5;
++			self.latentheat=3.34*10^5;
+ 
+ 			%ice thermal conductivity (W/m/K)
+-			obj.thermalconductivity=2.4;
++			self.thermalconductivity=2.4;
+ 			
+ 			%wet ice thermal conductivity (W/m/K)
+-			obj.temperateiceconductivity=.24;
++			self.temperateiceconductivity=.24;
+ 
+ 			%the melting point of ice at 1 atmosphere of pressure in K
+-			obj.meltingpoint=273.15;
++			self.meltingpoint=273.15;
+ 
+ 			%rate of change of melting point with pressure (K/Pa)
+-			obj.beta=9.8*10^-8;
++			self.beta=9.8*10^-8;
+ 
+ 			%mixed layer (ice-water interface) heat capacity (J/kg/K)
+-			obj.mixed_layer_capacity=3974.;
++			self.mixed_layer_capacity=3974.;
+ 
+ 			%thermal exchange velocity (ice-water interface) (m/s)
+-			obj.thermal_exchange_velocity=1.00*10^-4;
++			self.thermal_exchange_velocity=1.00*10^-4;
+ 
+ 			%Rheology law: what is the temperature dependence of B with T
+ 			%available: none, paterson and arrhenius
+-			obj.rheology_law='Paterson';
++			self.rheology_law='Paterson';
+ 
+ 			% GIA:
+-			obj.lithosphere_shear_modulus  = 6.7*10^10;  % (Pa)
+-			obj.lithosphere_density        = 3.32;       % (g/cm^-3)
+-			obj.mantle_shear_modulus       = 1.45*10^11; % (Pa)
+-			obj.mantle_density             = 3.34;       % (g/cm^-3)
++			self.lithosphere_shear_modulus  = 6.7*10^10;  % (Pa)
++			self.lithosphere_density        = 3.32;       % (g/cm^-3)
++			self.mantle_shear_modulus       = 1.45*10^11; % (Pa)
++			self.mantle_density             = 3.34;       % (g/cm^-3)
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 			md = checkfield(md,'fieldname','materials.rho_ice','>',0);
+ 			md = checkfield(md,'fieldname','materials.rho_water','>',0);
+ 			md = checkfield(md,'fieldname','materials.rho_freshwater','>',0);
+@@ -147,51 +147,51 @@
+ 			end
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   Materials:'));
+ 
+-			fielddisplay(obj,'rho_ice','ice density [kg/m^3]');
+-			fielddisplay(obj,'rho_water','ocean water density [kg/m^3]');
+-			fielddisplay(obj,'rho_freshwater','fresh water density [kg/m^3]');
+-			fielddisplay(obj,'mu_water','water viscosity [N s/m^2]');
+-			fielddisplay(obj,'heatcapacity','heat capacity [J/kg/K]');
+-			fielddisplay(obj,'thermalconductivity',['ice thermal conductivity [W/m/K]']);
+-			fielddisplay(obj,'temperateiceconductivity','temperate ice thermal conductivity [W/m/K]');
+-			fielddisplay(obj,'meltingpoint','melting point of ice at 1atm in K');
+-			fielddisplay(obj,'latentheat','latent heat of fusion [J/kg]');
+-			fielddisplay(obj,'beta','rate of change of melting point with pressure [K/Pa]');
+-			fielddisplay(obj,'mixed_layer_capacity','mixed layer capacity [W/kg/K]');
+-			fielddisplay(obj,'thermal_exchange_velocity','thermal exchange velocity [m/s]');
+-			fielddisplay(obj,'rheology_B','flow law parameter [Pa/s^(1/n)]');
+-			fielddisplay(obj,'rheology_n','Glen''s flow law exponent');
+-			fielddisplay(obj,'rheology_law',['law for the temperature dependance of the rheology: ''None'', ''Cuffey'', ''Paterson'', ''Arrhenius'' or ''LliboutryDuval''']);
+-			fielddisplay(obj,'lithosphere_shear_modulus','Lithosphere shear modulus [Pa]');
+-			fielddisplay(obj,'lithosphere_density','Lithosphere density [g/cm^-3]');
+-			fielddisplay(obj,'mantle_shear_modulus','Mantle shear modulus [Pa]');
+-			fielddisplay(obj,'mantle_density','Mantle density [g/cm^-3]');
++			fielddisplay(self,'rho_ice','ice density [kg/m^3]');
++			fielddisplay(self,'rho_water','ocean water density [kg/m^3]');
++			fielddisplay(self,'rho_freshwater','fresh water density [kg/m^3]');
++			fielddisplay(self,'mu_water','water viscosity [N s/m^2]');
++			fielddisplay(self,'heatcapacity','heat capacity [J/kg/K]');
++			fielddisplay(self,'thermalconductivity',['ice thermal conductivity [W/m/K]']);
++			fielddisplay(self,'temperateiceconductivity','temperate ice thermal conductivity [W/m/K]');
++			fielddisplay(self,'meltingpoint','melting point of ice at 1atm in K');
++			fielddisplay(self,'latentheat','latent heat of fusion [J/kg]');
++			fielddisplay(self,'beta','rate of change of melting point with pressure [K/Pa]');
++			fielddisplay(self,'mixed_layer_capacity','mixed layer capacity [W/kg/K]');
++			fielddisplay(self,'thermal_exchange_velocity','thermal exchange velocity [m/s]');
++			fielddisplay(self,'rheology_B','flow law parameter [Pa/s^(1/n)]');
++			fielddisplay(self,'rheology_n','Glen''s flow law exponent');
++			fielddisplay(self,'rheology_law',['law for the temperature dependance of the rheology: ''None'', ''Cuffey'', ''Paterson'', ''Arrhenius'' or ''LliboutryDuval''']);
++			fielddisplay(self,'lithosphere_shear_modulus','Lithosphere shear modulus [Pa]');
++			fielddisplay(self,'lithosphere_density','Lithosphere density [g/cm^-3]');
++			fielddisplay(self,'mantle_shear_modulus','Mantle shear modulus [Pa]');
++			fielddisplay(self,'mantle_density','Mantle density [g/cm^-3]');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 			WriteData(fid,'enum',MaterialsEnum(),'data',MatdamageiceEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','rho_ice','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','rho_water','enum',MaterialsRhoSeawaterEnum(),'format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','rho_freshwater','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','mu_water','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','heatcapacity','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','latentheat','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','thermalconductivity','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','temperateiceconductivity','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','meltingpoint','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','beta','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','mixed_layer_capacity','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','thermal_exchange_velocity','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','rheology_B','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','materials','fieldname','rheology_n','format','DoubleMat','mattype',2);
+-			WriteData(fid,'data',StringToEnum(obj.rheology_law),'enum',MaterialsRheologyLawEnum(),'format','Integer');
++			WriteData(fid,'object',self,'class','materials','fieldname','rho_ice','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','rho_water','enum',MaterialsRhoSeawaterEnum(),'format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','rho_freshwater','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','mu_water','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','heatcapacity','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','latentheat','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','thermalconductivity','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','temperateiceconductivity','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','meltingpoint','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','beta','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','mixed_layer_capacity','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','thermal_exchange_velocity','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','rheology_B','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','materials','fieldname','rheology_n','format','DoubleMat','mattype',2);
++			WriteData(fid,'data',StringToEnum(self.rheology_law),'enum',MaterialsRheologyLawEnum(),'format','Integer');
+ 
+-			WriteData(fid,'object',obj,'class','materials','fieldname','lithosphere_shear_modulus','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','lithosphere_density','format','Double','scale',10^3);
+-			WriteData(fid,'object',obj,'class','materials','fieldname','mantle_shear_modulus','format','Double');
+-			WriteData(fid,'object',obj,'class','materials','fieldname','mantle_density','format','Double','scale',10^3);
++			WriteData(fid,'object',self,'class','materials','fieldname','lithosphere_shear_modulus','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','lithosphere_density','format','Double','scale',10^3);
++			WriteData(fid,'object',self,'class','materials','fieldname','mantle_shear_modulus','format','Double');
++			WriteData(fid,'object',self,'class','materials','fieldname','mantle_density','format','Double','scale',10^3);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/SMBpdd.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBpdd.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/SMBpdd.m	(revision 19040)
+@@ -25,10 +25,10 @@
+ 		precipitations_lgm        = NaN;
+ 	end
+ 	methods
+-		function obj = SMBpdd(varargin) % {{{
++		function self = SMBpdd(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+@@ -54,18 +54,18 @@
+ 			% end
+ 
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+-		  obj.isdelta18o = 0;
+-		  obj.ismungsm   = 0;
+-		  obj.desfac     = 0.5;
+-		  obj.s0p        = 0;
+-		  obj.s0t        = 0;
+-		  obj.rlaps      = 6.5;
+-		  obj.rlapslgm   = 6.5;
++		  self.isdelta18o = 0;
++		  self.ismungsm   = 0;
++		  self.desfac     = 0.5;
++		  self.s0p        = 0;
++		  self.s0t        = 0;
++		  self.rlaps      = 6.5;
++		  self.rlapslgm   = 6.5;
+                   
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			if ismember(MasstransportAnalysisEnum(),analyses),
+ 				md = checkfield(md,'fieldname','surfaceforcings.desfac','<=',1,'numel',1);
+@@ -73,10 +73,10 @@
+ 				md = checkfield(md,'fieldname','surfaceforcings.s0t','>=',0,'numel',1);
+ 				md = checkfield(md,'fieldname','surfaceforcings.rlaps','>=',0,'numel',1);
+ 				md = checkfield(md,'fieldname','surfaceforcings.rlapslgm','>=',0,'numel',1);
+-				if(obj.isdelta18o==0 & obj.ismungsm==0)
++				if(self.isdelta18o==0 & self.ismungsm==0)
+ 					md = checkfield(md,'fieldname','surfaceforcings.monthlytemperatures','timeseries',1,'NaN',1);
+ 					md = checkfield(md,'fieldname','surfaceforcings.precipitation','timeseries',1,'NaN',1);
+-				elseif(obj.isdelta18o==1) 
++				elseif(self.isdelta18o==1) 
+ 					md = checkfield(md,'fieldname','surfaceforcings.delta18o','NaN',1);
+ 					md = checkfield(md,'fieldname','surfaceforcings.delta18o_surface','NaN',1);
+ 					md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
+@@ -85,7 +85,7 @@
+ 					md = checkfield(md,'fieldname','surfaceforcings.precipitations_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1);                                       
+ 					md = checkfield(md,'fieldname','surfaceforcings.Tdiff','NaN',1);
+ 					md = checkfield(md,'fieldname','surfaceforcings.sealev','NaN',1);
+-				elseif(obj.ismungsm==1) 
++				elseif(self.ismungsm==1) 
+ 					md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
+ 					md = checkfield(md,'fieldname','surfaceforcings.temperatures_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1);
+ 					md = checkfield(md,'fieldname','surfaceforcings.precipitations_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
+@@ -96,74 +96,74 @@
+ 				end
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   surface forcings parameters:'));
+ 
+ 			disp(sprintf('\n   PDD and deltaO18 parameters:'));
+-			fielddisplay(obj,'isdelta18o','is temperature and precipitation delta18o parametrisation activated (0 or 1, default is 0)');
+-			fielddisplay(obj,'ismungsm','is temperature and precipitation mungsm parametrisation activated (0 or 1, default is 0)');
+-			fielddisplay(obj,'desfac','desertification elevation factor (between 0 and 1, default is 0.5) [m]');
+-			fielddisplay(obj,'s0p','should be set to elevation from precip source (between 0 and a few 1000s m, default is 0) [m]');
+-			fielddisplay(obj,'s0t','should be set to elevation from temperature source (between 0 and a few 1000s m, default is 0) [m]');
+-			fielddisplay(obj,'rlaps','present day lapse rate [degree/km]');
+-			fielddisplay(obj,'rlapslgm','LGM lapse rate [degree/km]');
+-                        if(obj.isdelta18o==0 & obj.ismungsm==0)
+-                            fielddisplay(obj,'monthlytemperatures',['monthly surface temperatures [K], required if pdd is activated and delta18o not activated']);
+-                            fielddisplay(obj,'precipitation',['monthly surface precipitation [m/yr water eq], required if pdd is activated and delta18o or mungsm not activated']);
+-                        elseif(obj.isdelta18o==1)
+-                            fielddisplay(obj,'delta18o','delta18o, required if pdd is activated and delta18o activated');
+-                            fielddisplay(obj,'delta18o_surface','surface elevation of the delta18o site, required if pdd is activated and delta18o activated');
+-                            fielddisplay(obj,'temperatures_presentday','monthly present day surface temperatures [K], required if delta18o/mungsm is activated');
+-                            fielddisplay(obj,'temperatures_lgm','monthly LGM surface temperatures [K], required if delta18o or mungsm is activated');
+-                            fielddisplay(obj,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if delta18o or mungsm is activated');
+-                            fielddisplay(obj,'precipitations_lgm','monthly surface precipitation [m/yr water eq], required if delta18o or mungsm is activated');
+-                            fielddisplay(obj,'Tdiff','time interpolation parameter for temperature, 1D(year), required if mungsm is activated');
+-                            fielddisplay(obj,'sealev','sea level [m], 1D(year), required if mungsm is activated');
+-                        elseif(obj.ismungsm==1)
+-                            fielddisplay(obj,'temperatures_presentday','monthly present day surface temperatures [K], required if delta18o/mungsm is activated');
+-                            fielddisplay(obj,'temperatures_lgm','monthly LGM surface temperatures [K], required if delta18o or mungsm is activated');
+-                            fielddisplay(obj,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if delta18o or mungsm is activated');
+-                            fielddisplay(obj,'precipitations_lgm','monthly surface precipitation [m/yr water eq], required if delta18o or mungsm is activated');
+-                            fielddisplay(obj,'Pfac','time interpolation parameter for precipitation, 1D(year), required if mungsm is activated');
+-                            fielddisplay(obj,'Tdiff','time interpolation parameter for temperature, 1D(year), required if mungsm is activated');
+-                            fielddisplay(obj,'sealev','sea level [m], 1D(year), required if mungsm is activated');
++			fielddisplay(self,'isdelta18o','is temperature and precipitation delta18o parametrisation activated (0 or 1, default is 0)');
++			fielddisplay(self,'ismungsm','is temperature and precipitation mungsm parametrisation activated (0 or 1, default is 0)');
++			fielddisplay(self,'desfac','desertification elevation factor (between 0 and 1, default is 0.5) [m]');
++			fielddisplay(self,'s0p','should be set to elevation from precip source (between 0 and a few 1000s m, default is 0) [m]');
++			fielddisplay(self,'s0t','should be set to elevation from temperature source (between 0 and a few 1000s m, default is 0) [m]');
++			fielddisplay(self,'rlaps','present day lapse rate [degree/km]');
++			fielddisplay(self,'rlapslgm','LGM lapse rate [degree/km]');
++                        if(self.isdelta18o==0 & self.ismungsm==0)
++                            fielddisplay(self,'monthlytemperatures',['monthly surface temperatures [K], required if pdd is activated and delta18o not activated']);
++                            fielddisplay(self,'precipitation',['monthly surface precipitation [m/yr water eq], required if pdd is activated and delta18o or mungsm not activated']);
++                        elseif(self.isdelta18o==1)
++                            fielddisplay(self,'delta18o','delta18o, required if pdd is activated and delta18o activated');
++                            fielddisplay(self,'delta18o_surface','surface elevation of the delta18o site, required if pdd is activated and delta18o activated');
++                            fielddisplay(self,'temperatures_presentday','monthly present day surface temperatures [K], required if delta18o/mungsm is activated');
++                            fielddisplay(self,'temperatures_lgm','monthly LGM surface temperatures [K], required if delta18o or mungsm is activated');
++                            fielddisplay(self,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if delta18o or mungsm is activated');
++                            fielddisplay(self,'precipitations_lgm','monthly surface precipitation [m/yr water eq], required if delta18o or mungsm is activated');
++                            fielddisplay(self,'Tdiff','time interpolation parameter for temperature, 1D(year), required if mungsm is activated');
++                            fielddisplay(self,'sealev','sea level [m], 1D(year), required if mungsm is activated');
++                        elseif(self.ismungsm==1)
++                            fielddisplay(self,'temperatures_presentday','monthly present day surface temperatures [K], required if delta18o/mungsm is activated');
++                            fielddisplay(self,'temperatures_lgm','monthly LGM surface temperatures [K], required if delta18o or mungsm is activated');
++                            fielddisplay(self,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if delta18o or mungsm is activated');
++                            fielddisplay(self,'precipitations_lgm','monthly surface precipitation [m/yr water eq], required if delta18o or mungsm is activated');
++                            fielddisplay(self,'Pfac','time interpolation parameter for precipitation, 1D(year), required if mungsm is activated');
++                            fielddisplay(self,'Tdiff','time interpolation parameter for temperature, 1D(year), required if mungsm is activated');
++                            fielddisplay(self,'sealev','sea level [m], 1D(year), required if mungsm is activated');
+                         end
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBpddEnum(),'format','Integer');
+ 
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','isdelta18o','format','Boolean');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','ismungsm','format','Boolean');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','desfac','format','Double');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','s0p','format','Double');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','s0t','format','Double');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','rlaps','format','Double');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','rlapslgm','format','Double');
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','isdelta18o','format','Boolean');
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','ismungsm','format','Boolean');
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','desfac','format','Double');
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','s0p','format','Double');
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','s0t','format','Double');
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','rlaps','format','Double');
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','rlapslgm','format','Double');
+ 
+-			if(obj.isdelta18o==0 & obj.ismungsm==0)
+-				%WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1);
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+-			elseif obj.isdelta18o
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1);
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_lgm','format','DoubleMat','mattype',1);
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitations_presentday','format','DoubleMat','mattype',1);
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitations_lgm','format','DoubleMat','mattype',1);
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','delta18o_surface','format','DoubleMat','mattype',1);
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','delta18o','format','DoubleMat','mattype',1);
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1);
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1);
+-			elseif obj.ismungsm
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1);
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_lgm','format','DoubleMat','mattype',1);
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitations_presentday','format','DoubleMat','mattype',1);
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitations_lgm','format','DoubleMat','mattype',1);
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Pfac','format','DoubleMat','mattype',1);
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1);
+-				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1);
++			if(self.isdelta18o==0 & self.ismungsm==0)
++				%WriteData(fid,'object',self,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',self,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++				WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			elseif self.isdelta18o
++				WriteData(fid,'object',self,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',self,'class','surfaceforcings','fieldname','temperatures_lgm','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitations_presentday','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitations_lgm','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',self,'class','surfaceforcings','fieldname','delta18o_surface','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',self,'class','surfaceforcings','fieldname','delta18o','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',self,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',self,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1);
++			elseif self.ismungsm
++				WriteData(fid,'object',self,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',self,'class','surfaceforcings','fieldname','temperatures_lgm','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitations_presentday','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitations_lgm','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',self,'class','surfaceforcings','fieldname','Pfac','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',self,'class','surfaceforcings','fieldname','Tdiff','format','DoubleMat','mattype',1);
++				WriteData(fid,'object',self,'class','surfaceforcings','fieldname','sealev','format','DoubleMat','mattype',1);
+ 			end
+ 		end % }}}
+ 	end
+Index: ../trunk-jpl/src/m/classes/inversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversion.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/inversion.m	(revision 19040)
+@@ -25,36 +25,36 @@
+ 		surface_obs                 = NaN
+ 	end
+ 	methods
+-		function createxml(obj,fid) % {{{
++		function createxml(self,fid) % {{{
+ 			fprintf(fid, '<!-- inversion -->\n');            
+ 
+ 			% inversion parameters
+ 			fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="inversion parameters">','<section name="inversion" />');                    
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="iscontrol" type="',class(obj.iscontrol),'" default="',convert2str(obj.iscontrol),'">','     <section name="inversion" />','     <help> is inversion activated? </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="iscontrol" type="',class(self.iscontrol),'" default="',convert2str(self.iscontrol),'">','     <section name="inversion" />','     <help> is inversion activated? </help>','  </parameter>');
+ 
+ 			% incompleteadjoing drop-down (0 or 1)
+ 			fprintf(fid,'%s\n%s\n%s\n%s\n','  <parameter key ="incomplete_adjoint" type="alternative" optional="false">','     <section name="inversion" />','     <help> 1: linear viscosity, 0: non-linear viscosity </help>');
+ 			fprintf(fid,'%s\n','       <option value="0" type="string" default="true"> </option>');
+ 			fprintf(fid,'%s\n%s\n','       <option value="1" type="string" default="false"> </option>','</parameter>');
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="control_parameters" type="',class(obj.control_parameters),'" default="',convert2str(obj.control_parameters),'">','     <section name="inversion" />','     <help> ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''} </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="control_parameters" type="',class(self.control_parameters),'" default="',convert2str(self.control_parameters),'">','     <section name="inversion" />','     <help> ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''} </help>','  </parameter>');
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="nsteps" type="',class(obj.nsteps),'" default="',convert2str(obj.nsteps),'">','     <section name="inversion" />','     <help> number of optimization searches </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="cost_functions" type="',class(obj.cost_functions),'" default="',convert2str(obj.cost_functions),'">','     <section name="inversion" />','     <help> indicate the type of response for each optimization step  </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="cost_functions_coefficients" type="',class(obj.cost_functions_coefficients),'" default="',convert2str(obj.cost_functions_coefficients),'">','     <section name="inversion" />','     <help> cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="nsteps" type="',class(self.nsteps),'" default="',convert2str(self.nsteps),'">','     <section name="inversion" />','     <help> number of optimization searches </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="cost_functions" type="',class(self.cost_functions),'" default="',convert2str(self.cost_functions),'">','     <section name="inversion" />','     <help> indicate the type of response for each optimization step  </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="cost_functions_coefficients" type="',class(self.cost_functions_coefficients),'" default="',convert2str(self.cost_functions_coefficients),'">','     <section name="inversion" />','     <help> cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter </help>','  </parameter>');
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="cost_function_threshold" type="',class(obj.cost_function_threshold),'" default="',convert2str(obj.cost_function_threshold),'">','     <section name="inversion" />','     <help> misfit convergence criterion. Default is 1%, NaN if not applied </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="maxiter_per_step" type="',class(obj.maxiter_per_step),'" default="',convert2str(obj.maxiter_per_step),'">','     <section name="inversion" />','     <help> maximum iterations during each optimization step  </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="gradient_scaling" type="',class(obj.gradient_scaling),'" default="',convert2str(obj.gradient_scaling),'">','     <section name="inversion" />','     <help> scaling factor on gradient direction during optimization, for each optimization step </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="cost_function_threshold" type="',class(self.cost_function_threshold),'" default="',convert2str(self.cost_function_threshold),'">','     <section name="inversion" />','     <help> misfit convergence criterion. Default is 1%, NaN if not applied </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="maxiter_per_step" type="',class(self.maxiter_per_step),'" default="',convert2str(self.maxiter_per_step),'">','     <section name="inversion" />','     <help> maximum iterations during each optimization step  </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="gradient_scaling" type="',class(self.gradient_scaling),'" default="',convert2str(self.gradient_scaling),'">','     <section name="inversion" />','     <help> scaling factor on gradient direction during optimization, for each optimization step </help>','  </parameter>');
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="step_threshold" type="',class(obj.step_threshold),'" default="',convert2str(obj.step_threshold),'">','     <section name="inversion" />','     <help> decrease threshold for misfit, default is 30% </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="min_parameters" type="',class(obj.min_parameters),'" default="',convert2str(obj.min_parameters),'">','     <section name="inversion" />','     <help> absolute minimum acceptable value of the inversed parameter on each vertex </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="max_parameters" type="',class(obj.max_parameters),'" default="',convert2str(obj.max_parameters),'">','     <section name="inversion" />','     <help> absolute maximum acceptable value of the inversed parameter on each vertex </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="step_threshold" type="',class(self.step_threshold),'" default="',convert2str(self.step_threshold),'">','     <section name="inversion" />','     <help> decrease threshold for misfit, default is 30% </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="min_parameters" type="',class(self.min_parameters),'" default="',convert2str(self.min_parameters),'">','     <section name="inversion" />','     <help> absolute minimum acceptable value of the inversed parameter on each vertex </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="max_parameters" type="',class(self.max_parameters),'" default="',convert2str(self.max_parameters),'">','     <section name="inversion" />','     <help> absolute maximum acceptable value of the inversed parameter on each vertex </help>','  </parameter>');
+ 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vx_obs" type="',class(obj.vx_obs),'" default="',convert2str(obj.vx_obs),'">','     <section name="inversion" />','     <help> observed velocity x component [m/yr] </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vy_obs" type="',class(obj.vy_obs),'" default="',convert2str(obj.vy_obs),'">','     <section name="inversion" />','     <help> observed velocity y component [m/yr]  </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vel_obs" type="',class(obj.vel_obs),'" default="',convert2str(obj.vel_obs),'">','     <section name="inversion" />','     <help> observed velocity magnitude [m/yr] </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="thickness_obs" type="',class(obj.thickness_obs),'" default="',convert2str(obj.thickness_obs),'">','     <section name="inversion" />','     <help> observed thickness [m]) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vx_obs" type="',class(self.vx_obs),'" default="',convert2str(self.vx_obs),'">','     <section name="inversion" />','     <help> observed velocity x component [m/yr] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vy_obs" type="',class(self.vy_obs),'" default="',convert2str(self.vy_obs),'">','     <section name="inversion" />','     <help> observed velocity y component [m/yr]  </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vel_obs" type="',class(self.vel_obs),'" default="',convert2str(self.vel_obs),'">','     <section name="inversion" />','     <help> observed velocity magnitude [m/yr] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="thickness_obs" type="',class(self.thickness_obs),'" default="',convert2str(self.thickness_obs),'">','     <section name="inversion" />','     <help> observed thickness [m]) </help>','  </parameter>');
+ 
+ 			fprintf(fid,'%s\n%s\n','</frame>');    
+ 
+@@ -74,57 +74,57 @@
+ 			fprintf(fid,'%s\n%s\n','</frame>');    
+ 
+ 		end % }}}       
+-		function obj = inversion(varargin) % {{{
++		function self = inversion(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+-					obj=structtoobj(inversion(),varargin{1});
++					self =structtoobj(inversion(),varargin{1});
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%default is incomplete adjoint for now
+-			obj.incomplete_adjoint=1;
++			self.incomplete_adjoint=1;
+ 
+ 			%parameter to be inferred by control methods (only
+ 			%drag and B are supported yet)
+-			obj.control_parameters={'FrictionCoefficient'};
++			self.control_parameters={'FrictionCoefficient'};
+ 
+ 			%number of steps in the control methods
+-			obj.nsteps=20;
++			self.nsteps=20;
+ 
+ 			%maximum number of iteration in the optimization algorithm for
+ 			%each step
+-			obj.maxiter_per_step=20*ones(obj.nsteps,1);
++			self.maxiter_per_step=20*ones(self.nsteps,1);
+ 
+ 			%the inversed parameter is updated as follows:
+ 			%new_par=old_par + gradient_scaling(n)*C*gradient with C in [0 1];
+ 			%usually the gradient_scaling must be of the order of magnitude of the 
+ 			%inversed parameter (10^8 for B, 50 for drag) and can be decreased
+ 			%after the first iterations
+-			obj.gradient_scaling=50*ones(obj.nsteps,1);
++			self.gradient_scaling=50*ones(self.nsteps,1);
+ 
+ 			%several responses can be used:
+-			obj.cost_functions=101;
++			self.cost_functions=101;
+ 
+ 			%step_threshold is used to speed up control method. When
+-			%misfit(1)/misfit(0) < obj.step_threshold, we go directly to
++			%misfit(1)/misfit(0) < self.step_threshold, we go directly to
+ 			%the next step
+-			obj.step_threshold=.7*ones(obj.nsteps,1); %30 per cent decrement.
++			self.step_threshold=.7*ones(self.nsteps,1); %30 per cent decrement.
+ 
+ 			%cost_function_threshold is a criteria to stop the control methods.
+ 			%if J[n]-J[n-1]/J[n] < criteria, the control run stops
+ 			%NaN if not applied
+-			obj.cost_function_threshold=NaN; %not activated
++			self.cost_function_threshold=NaN; %not activated
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return
+-			if ~obj.iscontrol, return; end
++			if ~self.iscontrol, return; end
+ 
+ 			num_controls=numel(md.inversion.control_parameters);
+ 			num_costfunc=size(md.inversion.cost_functions,2);
+@@ -157,25 +157,25 @@
+ 				md = checkfield(md,'fieldname','inversion.vy_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   inversion parameters:'));
+-			fielddisplay(obj,'iscontrol','is inversion activated?');
+-			fielddisplay(obj,'incomplete_adjoint','1: linear viscosity, 0: non-linear viscosity');
+-			fielddisplay(obj,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}');
+-			fielddisplay(obj,'nsteps','number of optimization searches');
+-			fielddisplay(obj,'cost_functions','indicate the type of response for each optimization step');
+-			fielddisplay(obj,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter');
+-			fielddisplay(obj,'cost_function_threshold','misfit convergence criterion. Default is 1%, NaN if not applied');
+-			fielddisplay(obj,'maxiter_per_step','maximum iterations during each optimization step');
+-			fielddisplay(obj,'gradient_scaling','scaling factor on gradient direction during optimization, for each optimization step');
+-			fielddisplay(obj,'step_threshold','decrease threshold for misfit, default is 30%');
+-			fielddisplay(obj,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex');
+-			fielddisplay(obj,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex');
+-			fielddisplay(obj,'vx_obs','observed velocity x component [m/yr]');
+-			fielddisplay(obj,'vy_obs','observed velocity y component [m/yr]');
+-			fielddisplay(obj,'vel_obs','observed velocity magnitude [m/yr]');
+-			fielddisplay(obj,'thickness_obs','observed thickness [m]');
+-			fielddisplay(obj,'surface_obs','observed surface elevation [m]');
++			fielddisplay(self,'iscontrol','is inversion activated?');
++			fielddisplay(self,'incomplete_adjoint','1: linear viscosity, 0: non-linear viscosity');
++			fielddisplay(self,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}');
++			fielddisplay(self,'nsteps','number of optimization searches');
++			fielddisplay(self,'cost_functions','indicate the type of response for each optimization step');
++			fielddisplay(self,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter');
++			fielddisplay(self,'cost_function_threshold','misfit convergence criterion. Default is 1%, NaN if not applied');
++			fielddisplay(self,'maxiter_per_step','maximum iterations during each optimization step');
++			fielddisplay(self,'gradient_scaling','scaling factor on gradient direction during optimization, for each optimization step');
++			fielddisplay(self,'step_threshold','decrease threshold for misfit, default is 30%');
++			fielddisplay(self,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex');
++			fielddisplay(self,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex');
++			fielddisplay(self,'vx_obs','observed velocity x component [m/yr]');
++			fielddisplay(self,'vy_obs','observed velocity y component [m/yr]');
++			fielddisplay(self,'vel_obs','observed velocity magnitude [m/yr]');
++			fielddisplay(self,'thickness_obs','observed thickness [m]');
++			fielddisplay(self,'surface_obs','observed surface elevation [m]');
+ 			disp('Available cost functions:');
+ 			disp('   101: SurfaceAbsVelMisfit');
+ 			disp('   102: SurfaceRelVelMisfit');
+@@ -187,46 +187,46 @@
+ 			disp('   502: RheologyBbarAbsGradient');
+ 			disp('   503: ThicknessAbsGradient');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'enum',InversionTypeEnum(),'data',0,'format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','iscontrol','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','incomplete_adjoint','format','Boolean');
+-			if ~obj.iscontrol, return; end
+-			WriteData(fid,'object',obj,'fieldname','nsteps','format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','maxiter_per_step','format','IntMat','mattype',3);
+-			WriteData(fid,'object',obj,'fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'fieldname','gradient_scaling','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'fieldname','cost_function_threshold','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','min_parameters','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'fieldname','max_parameters','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'fieldname','step_threshold','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'fieldname','vx_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+-			WriteData(fid,'object',obj,'fieldname','vy_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+-			WriteData(fid,'object',obj,'fieldname','vz_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+-			if(numel(obj.thickness_obs)==md.mesh.numberofelements),
++			WriteData(fid,'object',self,'fieldname','iscontrol','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','incomplete_adjoint','format','Boolean');
++			if ~self.iscontrol, return; end
++			WriteData(fid,'object',self,'fieldname','nsteps','format','Integer');
++			WriteData(fid,'object',self,'fieldname','maxiter_per_step','format','IntMat','mattype',3);
++			WriteData(fid,'object',self,'fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'fieldname','gradient_scaling','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'fieldname','cost_function_threshold','format','Double');
++			WriteData(fid,'object',self,'fieldname','min_parameters','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'fieldname','max_parameters','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'fieldname','step_threshold','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'fieldname','vx_obs','format','DoubleMat','mattype',1,'scale',1./yts);
++			WriteData(fid,'object',self,'fieldname','vy_obs','format','DoubleMat','mattype',1,'scale',1./yts);
++			WriteData(fid,'object',self,'fieldname','vz_obs','format','DoubleMat','mattype',1,'scale',1./yts);
++			if(numel(self.thickness_obs)==md.mesh.numberofelements),
+ 				mattype=2;
+ 			else
+ 				mattype=1;
+ 			end
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',mattype);
+-			WriteData(fid,'object',obj,'class','inversion','fieldname','surface_obs','format','DoubleMat','mattype',mattype);
++			WriteData(fid,'object',self,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',mattype);
++			WriteData(fid,'object',self,'class','inversion','fieldname','surface_obs','format','DoubleMat','mattype',mattype);
+ 
+ 
+ 			%process control parameters
+-			num_control_parameters=numel(obj.control_parameters);
++			num_control_parameters=numel(self.control_parameters);
+ 			data=zeros(1,num_control_parameters);
+ 			for i=1:num_control_parameters,
+-				data(i)=StringToEnum(obj.control_parameters{i});
++				data(i)=StringToEnum(self.control_parameters{i});
+ 			end
+ 			WriteData(fid,'data',data,'enum',InversionControlParametersEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_control_parameters,'enum',InversionNumControlParametersEnum(),'format','Integer');
+ 
+ 			%process cost functions
+-			num_cost_functions=size(obj.cost_functions,2);
+-			data=marshallcostfunctions(obj.cost_functions);
++			num_cost_functions=size(self.cost_functions,2);
++			data=marshallcostfunctions(self.cost_functions);
+ 			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+ 			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/mesh3dprisms.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mesh3dprisms.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/mesh3dprisms.m	(revision 19040)
+@@ -61,56 +61,56 @@
+ 		end% }}}
+ 	end
+ 	methods
+-		function createxml(obj,fid) % {{{
++		function createxml(self,fid) % {{{
+ 			fprintf(fid, '<!-- 3D prism Mesh -->\n');
+ 
+ 			% Elements and verticies of the original 2d mesh
+ 			fprintf(fid,'%s\n%s\n%s\n','       <frame key="1" label="Elements and vertices of the orginal 2d mesh">','       <section name="mesh3dprisms" />');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements2d" type="',class(obj.numberofelements2d),'" default="',convert2str(obj.numberofelements2d),'">','              <help> number of elements </help>','          </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices2d" type="',class(obj.numberofvertices2d),'" default="',convert2str(obj.numberofvertices2d),'">','              <help> number of vertices </help>','          </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements2d" type="',class(obj.elements2d),'" default="',convert2str(obj.elements2d),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x2d" type="',class(obj.x2d),'" default="',convert2str(obj.x2d),'">','     <section name="mesh3dprisms" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y2d" type="',class(obj.y2d),'" default="',convert2str(obj.y2d),'">','     <section name="mesh3dprisms" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements2d" type="',class(self.numberofelements2d),'" default="',convert2str(self.numberofelements2d),'">','              <help> number of elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices2d" type="',class(self.numberofvertices2d),'" default="',convert2str(self.numberofvertices2d),'">','              <help> number of vertices </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements2d" type="',class(self.elements2d),'" default="',convert2str(self.elements2d),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x2d" type="',class(self.x2d),'" default="',convert2str(self.x2d),'">','     <section name="mesh3dprisms" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y2d" type="',class(self.y2d),'" default="',convert2str(self.y2d),'">','     <section name="mesh3dprisms" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
+ 			fprintf(fid,'%s\n%s\n','       </frame>');
+ 
+ 			% Elements and vertices of the extruded 3d mesh
+ 			fprintf(fid,'%s\n%s\n%s\n','       <frame key="2" label="Elements and vertices of the orginal 3d mesh">','       <section name="mesh3dprisms" />');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements" type="',class(obj.numberofelements),'" default="',convert2str(obj.numberofelements),'">','              <help> number of elements </help>','          </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices" type="',class(obj.numberofvertices),'" default="',convert2str(obj.numberofvertices),'">','              <help> number of vertices </help>','          </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements" type="',class(obj.elements),'" default="',convert2str(obj.elements),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x" type="',class(obj.x),'" default="',convert2str(obj.x),'">','     <section name="mesh3dprisms" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y" type="',class(obj.y),'" default="',convert2str(obj.y),'">','     <section name="mesh3dprisms" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="z" type="',class(obj.y),'" default="',convert2str(obj.y),'">','     <section name="mesh3dprisms" />','     <help> vertices z coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements" type="',class(self.numberofelements),'" default="',convert2str(self.numberofelements),'">','              <help> number of elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices" type="',class(self.numberofvertices),'" default="',convert2str(self.numberofvertices),'">','              <help> number of vertices </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements" type="',class(self.elements),'" default="',convert2str(self.elements),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x" type="',class(self.x),'" default="',convert2str(self.x),'">','     <section name="mesh3dprisms" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y" type="',class(self.y),'" default="',convert2str(self.y),'">','     <section name="mesh3dprisms" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="z" type="',class(self.y),'" default="',convert2str(self.y),'">','     <section name="mesh3dprisms" />','     <help> vertices z coordinate [m] </help>','  </parameter>');
+ 			fprintf(fid,'%s\n%s\n','       </frame>');
+ 
+ 			% properties
+ 			fprintf(fid,'%s\n%s\n%s\n','<frame key="3" label="Properties">','<section name="mesh3dprisms" />');             
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberoflayers" type="',class(obj.numberoflayers),'" default="',convert2str(obj.numberoflayers),'">','     <section name="mesh3dprisms" />','     <help> number of extrusion layers </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonbase" type="',class(obj.vertexonbase),'" default="',convert2str(obj.vertexonbase),'">','     <section name="mesh3dprisms" />','     <help> lower vertices flags list </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementontbase" type="',class(obj.elementontbase),'" default="',convert2str(obj.elementontbase),'">','     <section name="mesh3dprisms" />','     <help> lower elements flags list </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonsurface" type="',class(obj.vertexonsurface),'" default="',convert2str(obj.vertexonsurface),'">','     <section name="mesh3dprisms" />','     <help> upper vertices flags list </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementontsurface" type="',class(obj.elementontsurface),'" default="',convert2str(obj.elementontsurface),'">','     <section name="mesh3dprisms" />','     <help> upper elements flags list </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="uppervertex" type="',class(obj.uppervertex),'" default="',convert2str(obj.uppervertex),'">','     <section name="mesh3dprisms" />','     <help> upper vertex list (NaN for vertex on the upper surface) </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="upperelements" type="',class(obj.upperelements),'" default="',convert2str(obj.upperelements),'">','     <section name="mesh3dprisms" />','     <help> upper element list (NaN for element on the upper layer) </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lowervertex" type="',class(obj.lowervertex),'" default="',convert2str(obj.lowervertex),'">','     <section name="mesh3dprisms" />','     <help> lower vertex list (NaN for vertex on the lower surface) </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lowerelements" type="',class(obj.lowerelements),'" default="',convert2str(obj.lowerelements),'">','     <section name="mesh3dprisms" />','     <help> element list (NaN for element on the lower layer) </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonboundary" type="',class(obj.vertexonboundary),'" default="',convert2str(obj.vertexonboundary),'">','     <section name="mesh3dprisms" />','     <help> vertices on the boundary of the domain flag list </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexconnectivity" type="',class(obj.vertexconnectivity),'" default="',convert2str(obj.vertexconnectivity),'">','     <section name="mesh3dprisms" />','     <help> list of vertices connected to vertex_i </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementconnectivity" type="',class(obj.elementconnectivity),'" default="',convert2str(obj.elementconnectivity),'">','     <section name="mesh3dprisms" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="average_vertex_connectivity" type="',class(obj.average_vertex_connectivity),'" default="',convert2str(obj.average_vertex_connectivity),'">','     <section name="mesh3dprisms" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberoflayers" type="',class(self.numberoflayers),'" default="',convert2str(self.numberoflayers),'">','     <section name="mesh3dprisms" />','     <help> number of extrusion layers </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonbase" type="',class(self.vertexonbase),'" default="',convert2str(self.vertexonbase),'">','     <section name="mesh3dprisms" />','     <help> lower vertices flags list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementontbase" type="',class(self.elementontbase),'" default="',convert2str(self.elementontbase),'">','     <section name="mesh3dprisms" />','     <help> lower elements flags list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonsurface" type="',class(self.vertexonsurface),'" default="',convert2str(self.vertexonsurface),'">','     <section name="mesh3dprisms" />','     <help> upper vertices flags list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementontsurface" type="',class(self.elementontsurface),'" default="',convert2str(self.elementontsurface),'">','     <section name="mesh3dprisms" />','     <help> upper elements flags list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="uppervertex" type="',class(self.uppervertex),'" default="',convert2str(self.uppervertex),'">','     <section name="mesh3dprisms" />','     <help> upper vertex list (NaN for vertex on the upper surface) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="upperelements" type="',class(self.upperelements),'" default="',convert2str(self.upperelements),'">','     <section name="mesh3dprisms" />','     <help> upper element list (NaN for element on the upper layer) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lowervertex" type="',class(self.lowervertex),'" default="',convert2str(self.lowervertex),'">','     <section name="mesh3dprisms" />','     <help> lower vertex list (NaN for vertex on the lower surface) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lowerelements" type="',class(self.lowerelements),'" default="',convert2str(self.lowerelements),'">','     <section name="mesh3dprisms" />','     <help> element list (NaN for element on the lower layer) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonboundary" type="',class(self.vertexonboundary),'" default="',convert2str(self.vertexonboundary),'">','     <section name="mesh3dprisms" />','     <help> vertices on the boundary of the domain flag list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexconnectivity" type="',class(self.vertexconnectivity),'" default="',convert2str(self.vertexconnectivity),'">','     <section name="mesh3dprisms" />','     <help> list of vertices connected to vertex_i </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementconnectivity" type="',class(self.elementconnectivity),'" default="',convert2str(self.elementconnectivity),'">','     <section name="mesh3dprisms" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="average_vertex_connectivity" type="',class(self.average_vertex_connectivity),'" default="',convert2str(self.average_vertex_connectivity),'">','     <section name="mesh3dprisms" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
+ 			fprintf(fid,'%s\n%s\n','</frame>');
+ 
+ 			% Extracted model
+ 			fprintf(fid,'%s\n%s\n%s\n','<frame key="4" label="Extracted Model">','<section name="mesh3dprisms" />'); 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedvertices" type="',class(obj.extractedvertices),'" default="',convert2str(obj.extractedvertices),'">','     <section name="mesh3dprisms" />','     <help> vertices extracted from the model </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedelements" type="',class(obj.extractedelements),'" default="',convert2str(obj.extractedelements),'">','     <section name="mesh3dprisms" />','     <help> elements extracted from the model </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedvertices" type="',class(self.extractedvertices),'" default="',convert2str(self.extractedvertices),'">','     <section name="mesh3dprisms" />','     <help> vertices extracted from the model </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedelements" type="',class(self.extractedelements),'" default="',convert2str(self.extractedelements),'">','     <section name="mesh3dprisms" />','     <help> elements extracted from the model </help>','  </parameter>');
+ 			fprintf(fid,'%s\n%s\n','</frame>');
+ 
+ 			% Projection
+ 			fprintf(fid,'%s\n%s\n%s\n','<frame key="5" label="Projection">','<section name="mesh3dprisms" />'); 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lat" type="',class(obj.lat),'" default="',convert2str(obj.lat),'">','     <section name="mesh3dprisms" />','     <help> vertices latitude [degrees] </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="long" type="',class(obj.long),'" default="',convert2str(obj.long),'">','     <section name="mesh3dprisms" />','     <help> verticies longitude [degrees] </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="epsg" type="',class(obj.epsg),'" default="',convert2str(obj.epsg),'">','     <section name="mesh3dprisms" />','     <help> Indicate epsg ''n'' or ''s'' </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lat" type="',class(self.lat),'" default="',convert2str(self.lat),'">','     <section name="mesh3dprisms" />','     <help> vertices latitude [degrees] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="long" type="',class(self.long),'" default="',convert2str(self.long),'">','     <section name="mesh3dprisms" />','     <help> verticies longitude [degrees] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="epsg" type="',class(self.epsg),'" default="',convert2str(self.epsg),'">','     <section name="mesh3dprisms" />','     <help> Indicate epsg ''n'' or ''s'' </help>','  </parameter>');
+ 			fprintf(fid,'%s\n%s\n','</frame>');
+ 
+ 		end % }}}cd
+@@ -132,16 +132,16 @@
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%the connectivity is the averaged number of nodes linked to a
+ 			%given node through an edge. This connectivity is used to initially
+ 			%allocate memory to the stiffness matrix. A value of 16 seems to
+ 			%give a good memory/time ration. This value can be checked in
+ 			%trunk/test/Miscellaneous/runme.m
+-			obj.average_vertex_connectivity=25;
++			self.average_vertex_connectivity=25;
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			md = checkfield(md,'fieldname','mesh.x','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','mesh.y','NaN',1,'size',[md.mesh.numberofvertices 1]);
+@@ -160,74 +160,74 @@
+ 			md = checkfield(md,'fieldname','mesh.z','<=',md.geometry.surface+10^-10,'message','''mesh.z'' higher than surface elevation');
+ 			md = checkfield(md,'fieldname','mesh.average_vertex_connectivity','>=',24,'message','''mesh.average_vertex_connectivity'' should be at least 24 in 3d');
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   3D prism Mesh:')); 
+ 
+ 			disp(sprintf('\n      Elements and vertices of the original 2d mesh:'));
+-			fielddisplay(obj,'numberofelements2d','number of elements');
+-			fielddisplay(obj,'numberofvertices2d','number of vertices');
+-			fielddisplay(obj,'elements2d','vertex indices of the mesh elements');
+-			fielddisplay(obj,'x2d','vertices x coordinate [m]');
+-			fielddisplay(obj,'y2d','vertices y coordinate [m]');
++			fielddisplay(self,'numberofelements2d','number of elements');
++			fielddisplay(self,'numberofvertices2d','number of vertices');
++			fielddisplay(self,'elements2d','vertex indices of the mesh elements');
++			fielddisplay(self,'x2d','vertices x coordinate [m]');
++			fielddisplay(self,'y2d','vertices y coordinate [m]');
+ 
+ 			disp(sprintf('\n      Elements and vertices of the extruded 3d mesh:'));
+-			fielddisplay(obj,'numberofelements','number of elements');
+-			fielddisplay(obj,'numberofvertices','number of vertices');
+-			fielddisplay(obj,'elements','vertex indices of the mesh elements');
+-			fielddisplay(obj,'x','vertices x coordinate [m]');
+-			fielddisplay(obj,'y','vertices y coordinate [m]');
+-			fielddisplay(obj,'z','vertices z coordinate [m]');
++			fielddisplay(self,'numberofelements','number of elements');
++			fielddisplay(self,'numberofvertices','number of vertices');
++			fielddisplay(self,'elements','vertex indices of the mesh elements');
++			fielddisplay(self,'x','vertices x coordinate [m]');
++			fielddisplay(self,'y','vertices y coordinate [m]');
++			fielddisplay(self,'z','vertices z coordinate [m]');
+ 
+ 			disp(sprintf('\n      Properties:'));
+-			fielddisplay(obj,'numberoflayers','number of extrusion layers');
+-			fielddisplay(obj,'vertexonbase','lower vertices flags list');
+-			fielddisplay(obj,'vertexonsurface','upper vertices flags list');
+-			fielddisplay(obj,'uppervertex','upper vertex list (NaN for vertex on the upper surface)');
+-			fielddisplay(obj,'upperelements','upper element list (NaN for element on the upper layer)');
+-			fielddisplay(obj,'lowervertex','lower vertex list (NaN for vertex on the lower surface)');
+-			fielddisplay(obj,'lowerelements','lower element list (NaN for element on the lower layer');
+-			fielddisplay(obj,'vertexonboundary','vertices on the boundary of the domain flag list');
++			fielddisplay(self,'numberoflayers','number of extrusion layers');
++			fielddisplay(self,'vertexonbase','lower vertices flags list');
++			fielddisplay(self,'vertexonsurface','upper vertices flags list');
++			fielddisplay(self,'uppervertex','upper vertex list (NaN for vertex on the upper surface)');
++			fielddisplay(self,'upperelements','upper element list (NaN for element on the upper layer)');
++			fielddisplay(self,'lowervertex','lower vertex list (NaN for vertex on the lower surface)');
++			fielddisplay(self,'lowerelements','lower element list (NaN for element on the lower layer');
++			fielddisplay(self,'vertexonboundary','vertices on the boundary of the domain flag list');
+ 
+-			fielddisplay(obj,'vertexconnectivity','list of vertices connected to vertex_i');
+-			fielddisplay(obj,'elementconnectivity','list of vertices connected to element_i');
+-			fielddisplay(obj,'average_vertex_connectivity','average number of vertices connected to one vertex');
++			fielddisplay(self,'vertexconnectivity','list of vertices connected to vertex_i');
++			fielddisplay(self,'elementconnectivity','list of vertices connected to element_i');
++			fielddisplay(self,'average_vertex_connectivity','average number of vertices connected to one vertex');
+ 
+ 			disp(sprintf('\n      Extracted model:'));
+-			fielddisplay(obj,'extractedvertices','vertices extracted from the model');
+-			fielddisplay(obj,'extractedelements','elements extracted from the model');
++			fielddisplay(self,'extractedvertices','vertices extracted from the model');
++			fielddisplay(self,'extractedelements','elements extracted from the model');
+ 
+ 			disp(sprintf('\n      Projection:'));
+-			fielddisplay(obj,'lat','vertices latitude [degrees]');
+-			fielddisplay(obj,'long','vertices longitude [degrees]');
+-			fielddisplay(obj,'epsg','EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)');
++			fielddisplay(self,'lat','vertices latitude [degrees]');
++			fielddisplay(self,'long','vertices longitude [degrees]');
++			fielddisplay(self,'epsg','EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'enum',DomainTypeEnum(),'data',StringToEnum(['Domain' domaintype(obj)]),'format','Integer');
+-			WriteData(fid,'enum',DomainDimensionEnum(),'data',dimension(obj),'format','Integer');
+-			WriteData(fid,'enum',MeshElementtypeEnum(),'data',StringToEnum(elementtype(obj)),'format','Integer');
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','x','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','y','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','z','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','elements','format','DoubleMat','mattype',2);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','numberoflayers','format','Integer');
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','numberofelements','format','Integer');
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','numberofvertices','format','Integer');
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','vertexonbase','format','BooleanMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','vertexonsurface','format','BooleanMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','lowerelements','format','DoubleMat','mattype',2);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','upperelements','format','DoubleMat','mattype',2);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','average_vertex_connectivity','format','Integer');
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','elements2d','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','numberofvertices2d','format','Integer');
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','numberofelements2d','format','Integer');
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'enum',DomainTypeEnum(),'data',StringToEnum(['Domain' domaintype(self)]),'format','Integer');
++			WriteData(fid,'enum',DomainDimensionEnum(),'data',dimension(self),'format','Integer');
++			WriteData(fid,'enum',MeshElementtypeEnum(),'data',StringToEnum(elementtype(self)),'format','Integer');
++			WriteData(fid,'object',self,'class','mesh','fieldname','x','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','mesh','fieldname','y','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','mesh','fieldname','z','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','mesh','fieldname','elements','format','DoubleMat','mattype',2);
++			WriteData(fid,'object',self,'class','mesh','fieldname','numberoflayers','format','Integer');
++			WriteData(fid,'object',self,'class','mesh','fieldname','numberofelements','format','Integer');
++			WriteData(fid,'object',self,'class','mesh','fieldname','numberofvertices','format','Integer');
++			WriteData(fid,'object',self,'class','mesh','fieldname','vertexonbase','format','BooleanMat','mattype',1);
++			WriteData(fid,'object',self,'class','mesh','fieldname','vertexonsurface','format','BooleanMat','mattype',1);
++			WriteData(fid,'object',self,'class','mesh','fieldname','lowerelements','format','DoubleMat','mattype',2);
++			WriteData(fid,'object',self,'class','mesh','fieldname','upperelements','format','DoubleMat','mattype',2);
++			WriteData(fid,'object',self,'class','mesh','fieldname','average_vertex_connectivity','format','Integer');
++			WriteData(fid,'object',self,'class','mesh','fieldname','elements2d','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'class','mesh','fieldname','numberofvertices2d','format','Integer');
++			WriteData(fid,'object',self,'class','mesh','fieldname','numberofelements2d','format','Integer');
+ 		end % }}}
+-		function type = domaintype(obj) % {{{
++		function type = domaintype(self) % {{{
+ 			type = '3D';
+ 		end % }}}
+-		function d = dimension(obj) % {{{
++		function d = dimension(self) % {{{
+ 			d = 3;
+ 		end % }}}
+-		function s = elementtype(obj) % {{{
++		function s = elementtype(self) % {{{
+ 			s = 'Penta';
+ 		end % }}}
+ 	end
+Index: ../trunk-jpl/src/m/classes/seaice.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/seaice.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/seaice.m	(revision 19040)
+@@ -13,16 +13,16 @@
+ 		coriolis_factor   = NaN;
+ 	end
+ 	methods
+-		function obj = seaice(varargin) % {{{
++		function self = seaice(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 					return;
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 			if solution~=SeaiceSolutionEnum(), return; end
+ 			md = checkfield(md,'fieldname','seaice.min_concentration','NaN',1,'>=',0,'numel',1);
+ 			md = checkfield(md,'fieldname','seaice.min_thickness','NaN',1,'>=',0,'numel',1);
+@@ -31,34 +31,34 @@
+ 			md = checkfield(md,'fieldname','seaice.spcvy','size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','seaice.coriolis_factor','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%Minimum ice concentration allowed in the simulation
+-			obj.min_concentration=0.;
++			self.min_concentration=0.;
+ 
+ 			%Minimum ice thickness allowed in the simulation
+-			obj.min_thickness=0.;
++			self.min_thickness=0.;
+ 
+ 			%Maxmimum ice thickness allowed in the simulation
+-			obj.max_thickness=25.;
++			self.max_thickness=25.;
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   seaice parameters:'));
+-			fielddisplay(obj,'min_concentration','minimum ice concentration allowed in the simulation [no unit]');
+-			fielddisplay(obj,'min_thickness','minimum ice thickness allowed in the simulation [m]');
+-			fielddisplay(obj,'max_thickness','maximum ice thickness allowed in the simulation [m]');
+-			fielddisplay(obj,'spcvx','x-axis velocity constraint (NaN means no constraint) [m/s]');
+-			fielddisplay(obj,'spcvy','y-axis velocity constraint (NaN means no constraint) [m/s]');
+-			fielddisplay(obj,'coriolis_factor','factor applied to Coriolis forces (latitude dependent)');
++			fielddisplay(self,'min_concentration','minimum ice concentration allowed in the simulation [no unit]');
++			fielddisplay(self,'min_thickness','minimum ice thickness allowed in the simulation [m]');
++			fielddisplay(self,'max_thickness','maximum ice thickness allowed in the simulation [m]');
++			fielddisplay(self,'spcvx','x-axis velocity constraint (NaN means no constraint) [m/s]');
++			fielddisplay(self,'spcvy','y-axis velocity constraint (NaN means no constraint) [m/s]');
++			fielddisplay(self,'coriolis_factor','factor applied to Coriolis forces (latitude dependent)');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'object',obj,'fieldname','min_concentration','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','min_thickness','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','max_thickness','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','spcvx','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'fieldname','spcvy','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'fieldname','coriolis_factor','format','DoubleMat','mattype',2);
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'object',self,'fieldname','min_concentration','format','Double');
++			WriteData(fid,'object',self,'fieldname','min_thickness','format','Double');
++			WriteData(fid,'object',self,'fieldname','max_thickness','format','Double');
++			WriteData(fid,'object',self,'fieldname','spcvx','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'fieldname','spcvy','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'fieldname','coriolis_factor','format','DoubleMat','mattype',2);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/geometry.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/geometry.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/geometry.m	(revision 19040)
+@@ -12,50 +12,50 @@
+ 		hydrostatic_ratio = NaN;
+ 	end
+ 	methods (Static)
+-		function obj = loadobj(obj) % {{{
++		function self = loadobj(self) % {{{
+ 			% This function is directly called by matlab when a model object is
+ 			% loaded. Update old properties here
+ 
+ 			%2014 March 26th
+-			if isstruct(obj),
++			if isstruct(self),
+ 				disp('WARNING: updating geometry');
+ 				disp('         md.geometry.bed        is now md.geometry.base');
+ 				disp('         md.geometry.bathymetry is now md.geometry.bed');
+-				obj2=obj;
+-				obj=geometry();
+-				obj.surface    = obj2.surface;
+-				obj.thickness  = obj2.thickness;
+-				obj.base       = obj2.bed;
+-				obj.bed        = obj2.bathymetry;
++				obj2 = self;
++				self = geometry();
++				self.surface    = obj2.surface;
++				self.thickness  = obj2.thickness;
++				self.base       = obj2.bed;
++				self.bed        = obj2.bathymetry;
+ 			end
+ 
+ 		end% }}}
+ 	end
+ 	methods
+-        %function createxml(obj,fid)
+-        function createxml(obj, fid)% {{{
++        %function createxml(self,fid)
++        function createxml(self, fid)% {{{
+             fprintf(fid, '\n\n');
+             fprintf(fid, '%s\n', '<!-- geometry -->');
+             fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Geometry parameters">','<section name="geometry" />'); 
+ 			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="surface" type="','path','" optional="','false','">','     <section name="geometry" />','     <help> surface elevation [m] </help>','</parameter>');
+             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="thickness" type="','path','" optional="','false','">','     <section name="geometry" />','     <help> ice thickness [m] </help>','</parameter>');
+             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="bed" type="','path','" optional="','false','">','     <section name="geometry" />','     <help> bed elevation [m] </help>','</parameter>');
+-            %fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="bathymetry" type="',class(obj.bathymetry),'" default="',convert2str(obj.bathymetry),'">','     <section name="geometry" />','     <help> bathymetry elevation [m] </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','<parameter key ="hydrostatic_ratio" type="',class(obj.hydrostatic_ratio),'" default="',convert2str(obj.hydrostatic_ratio),'">','     <section name="geometry" />','     <help> coefficient for ice shelves; thickness correction: hydrostatic_ratio H_obs+ (1-hydrostatic_ratio) H_hydro </help>','</parameter>');
++            %fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="bathymetry" type="',class(self.bathymetry),'" default="',convert2str(self.bathymetry),'">','     <section name="geometry" />','     <help> bathymetry elevation [m] </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','<parameter key ="hydrostatic_ratio" type="',class(self.hydrostatic_ratio),'" default="',convert2str(self.hydrostatic_ratio),'">','     <section name="geometry" />','     <help> coefficient for ice shelves; thickness correction: hydrostatic_ratio H_obs+ (1-hydrostatic_ratio) H_hydro </help>','</parameter>');
+             fprintf(fid,'%s\n%s\n','</frame>');
+         end % }}}
+-		function obj = geometry(varargin) % {{{
++		function self = geometry(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			if (solution==SeaiceSolutionEnum()),
+ 				return;
+@@ -67,7 +67,7 @@
+ 				md = checkfield(md,'fieldname','geometry.surface'  ,'NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 				md = checkfield(md,'fieldname','geometry.base'      ,'NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 				md = checkfield(md,'fieldname','geometry.thickness','NaN',1,'size',[md.mesh.numberofvertices 1],'>',0);
+-				if any((obj.thickness-obj.surface+obj.base)>10^-9),
++				if any((self.thickness-self.surface+self.base)>10^-9),
+ 					md = checkmessage(md,['equality thickness=surface-base violated']);
+ 				end 
+ 				if solution==TransientSolutionEnum() & md.transient.isgroundingline,
+@@ -75,21 +75,21 @@
+ 				end
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   geometry parameters:'));
+ 
+-			fielddisplay(obj,'surface','ice upper surface elevation [m]');
+-			fielddisplay(obj,'thickness','ice thickness [m]');
+-			fielddisplay(obj,'base','ice base elevation [m]');
+-			fielddisplay(obj,'bed','bed elevation [m]');
++			fielddisplay(self,'surface','ice upper surface elevation [m]');
++			fielddisplay(self,'thickness','ice thickness [m]');
++			fielddisplay(self,'base','ice base elevation [m]');
++			fielddisplay(self,'bed','bed elevation [m]');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'data',obj.surface,'format','DoubleMat','mattype',1,'enum',SurfaceEnum());
+-			WriteData(fid,'data',obj.thickness,'format','DoubleMat','mattype',1,'enum',ThicknessEnum(),'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'data',obj.base,'format','DoubleMat','mattype',1,'enum',BaseEnum());
+-			WriteData(fid,'data',obj.bed,'format','DoubleMat','mattype',1,'enum',BedEnum());
+-			WriteData(fid,'object',obj,'fieldname','hydrostatic_ratio','format','DoubleMat','mattype',1);
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'data',self.surface,'format','DoubleMat','mattype',1,'enum',SurfaceEnum());
++			WriteData(fid,'data',self.thickness,'format','DoubleMat','mattype',1,'enum',ThicknessEnum(),'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'data',self.base,'format','DoubleMat','mattype',1,'enum',BaseEnum());
++			WriteData(fid,'data',self.bed,'format','DoubleMat','mattype',1,'enum',BedEnum());
++			WriteData(fid,'object',self,'fieldname','hydrostatic_ratio','format','DoubleMat','mattype',1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/gia.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/gia.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/gia.m	(revision 19040)
+@@ -10,13 +10,13 @@
+ 		cross_section_shape           = 0;
+ 	end
+ 	methods
+-         function createxml(obj,fid) % {{{
++         function createxml(self,fid) % {{{
+             fprintf(fid, '<!-- gia -->\n');            
+                     
+             % gia solution parameters
+             fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="gia parameters">','<section name="gia" />');                    
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="mantle_viscosity" type="',class(obj.mantle_viscosity),'" default="',convert2str(obj.mantle_viscosity),'">','     <section name="gia" />','     <help> mantle viscosity[Pa s] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lithosphere_thickness" type="',class(obj.lithosphere_thickness),'" default="',convert2str(obj.lithosphere_thickness),'">','     <section name="gia" />','     <help> lithosphere thickness (km) </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="mantle_viscosity" type="',class(self.mantle_viscosity),'" default="',convert2str(self.mantle_viscosity),'">','     <section name="gia" />','     <help> mantle viscosity[Pa s] </help>','  </parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lithosphere_thickness" type="',class(self.lithosphere_thickness),'" default="',convert2str(self.lithosphere_thickness),'">','     <section name="gia" />','     <help> lithosphere thickness (km) </help>','  </parameter>');
+             %cross_section_shape drop-down (1 o r 2)
+             fprintf(fid,'%s\n%s\n%s\n%s\n','  <parameter key ="cross_section_shape" type="alternative" optional="false">','     <section name="gia" />','     <help> 1: square-edged (default). 2: elliptical.  See iedge in GiaDeflectionCore </help>');
+             fprintf(fid,'%s\n','       <option value="1" type="string" default="true"> </option>');
+@@ -25,18 +25,18 @@
+             fprintf(fid,'%s\n%s\n','</frame>');    
+         
+         end % }}}
+-		function obj = gia(varargin) % {{{
++		function self = gia(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
+-		obj.cross_section_shape=1; %square as default (see iedge in GiaDeflectionCorex)
++		function self = setdefaultparameters(self) % {{{
++		self.cross_section_shape=1; %square as default (see iedge in GiaDeflectionCorex)
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			if ~ismember(GiaAnalysisEnum(),analyses), return; end
+ 			md = checkfield(md,'fieldname','gia.mantle_viscosity','NaN',1,'size',[md.mesh.numberofvertices 1],'>',0);
+@@ -59,18 +59,18 @@
+ 			end
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   gia parameters:'));
+ 
+-			fielddisplay(obj,'mantle_viscosity','mantle viscosity[Pa s]');
+-			fielddisplay(obj,'lithosphere_thickness','lithosphere thickness (km)');
+-			fielddisplay(obj,'cross_section_shape','1: square-edged (default). 2: elliptical.  See iedge in GiaDeflectionCore');
++			fielddisplay(self,'mantle_viscosity','mantle viscosity[Pa s]');
++			fielddisplay(self,'lithosphere_thickness','lithosphere thickness (km)');
++			fielddisplay(self,'cross_section_shape','1: square-edged (default). 2: elliptical.  See iedge in GiaDeflectionCore');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'object',obj,'fieldname','mantle_viscosity','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'fieldname','lithosphere_thickness','format','DoubleMat','mattype',1,'scale',10^3); %from km to m
+-			WriteData(fid,'object',obj,'fieldname','cross_section_shape','format','Integer');
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'object',self,'fieldname','mantle_viscosity','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'fieldname','lithosphere_thickness','format','DoubleMat','mattype',1,'scale',10^3); %from km to m
++			WriteData(fid,'object',self,'fieldname','cross_section_shape','format','Integer');
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/settings.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/settings.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/settings.m	(revision 19040)
+@@ -18,56 +18,56 @@
+ 
+ 	end
+ 	methods
+-        function createxml(obj,fid) % {{{
++        function createxml(self,fid) % {{{
+             fprintf(fid, '\n\n');
+             fprintf(fid, '%s\n', '<!-- settings -->');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="results_on_nodes" type="',      class(obj.results_on_nodes),'" default="',        convert2str(obj.results_on_nodes),'">',	'     <section name="settings" />','     <help> results are output for all the nodes of each element </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="io_gather" type="',          class(obj.io_gather),'" default="',           convert2str(obj.io_gather),'">',     '     <section name="settings" />','     <help> I/O gathering strategy for result outputs (default 1) </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="results_on_nodes" type="',      class(self.results_on_nodes),'" default="',        convert2str(self.results_on_nodes),'">',	'     <section name="settings" />','     <help> results are output for all the nodes of each element </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="io_gather" type="',          class(self.io_gather),'" default="',           convert2str(self.io_gather),'">',     '     <section name="settings" />','     <help> I/O gathering strategy for result outputs (default 1) </help>','</parameter>');
+             
+             % lowmen drop-down (0 or 1)
+             fprintf(fid,'%s\n%s\n%s\n%s\n',	'<parameter key ="lowmem" type="alternative" optional="true">',	'     <section name="settings" />','     <help> is the memory limited ? (0 or 1) </help>');
+             fprintf(fid,'%s\n','       <option value="0" type="string" default="true"> </option>');
+             fprintf(fid,'%s\n%s\n','       <option value="1" type="string" default="false"> </option>','</parameter>');
+ 
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="output_frequency" type="',          class(obj.output_frequency),'" default="',           convert2str(obj.output_frequency),'">',	'     <section name="settings" />','     <help> frequency at which results are saved in all solutions with multiple time_steps </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="waitonlock" type="',  	class(obj.waitonlock),'" default="',      convert2str(obj.waitonlock),'">',     '     <section name="settings" />','     <help> maximum number of minutes to wait for batch results (NaN to deactivate) </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="upload_server" type="',         class(obj.upload_server),'" default="',          convert2str(obj.upload_server),'">',	'     <section name="settings" />','     <help> server hostname where model should be uploaded </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="upload_path" type="',             class(obj.upload_path),'" default="',              convert2str(obj.upload_path),'">',     '     <section name="settings" />','     <help> path on server where model should be uploaded </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="upload_login" type="',        class(obj.upload_login),'" default="',         convert2str(obj.upload_login),'">',	'     <section name="settings" />','     <help> server login </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="upload_port" type="',    	class(obj.upload_port),'" default="',      convert2str(obj.upload_port),'">',     '     <section name="settings" />','     <help> port login (default is 0) </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',    	'<parameter key ="upload_filename" type="',         class(obj.upload_filename),'" default="',          convert2str(obj.upload_filename),'">',	'     <section name="settings" />','     <help> unique id generated when uploading the file to server </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="output_frequency" type="',          class(self.output_frequency),'" default="',           convert2str(self.output_frequency),'">',	'     <section name="settings" />','     <help> frequency at which results are saved in all solutions with multiple time_steps </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="waitonlock" type="',  	class(self.waitonlock),'" default="',      convert2str(self.waitonlock),'">',     '     <section name="settings" />','     <help> maximum number of minutes to wait for batch results (NaN to deactivate) </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="upload_server" type="',         class(self.upload_server),'" default="',          convert2str(self.upload_server),'">',	'     <section name="settings" />','     <help> server hostname where model should be uploaded </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="upload_path" type="',             class(self.upload_path),'" default="',              convert2str(self.upload_path),'">',     '     <section name="settings" />','     <help> path on server where model should be uploaded </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="upload_login" type="',        class(self.upload_login),'" default="',         convert2str(self.upload_login),'">',	'     <section name="settings" />','     <help> server login </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="upload_port" type="',    	class(self.upload_port),'" default="',      convert2str(self.upload_port),'">',     '     <section name="settings" />','     <help> port login (default is 0) </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',    	'<parameter key ="upload_filename" type="',         class(self.upload_filename),'" default="',          convert2str(self.upload_filename),'">',	'     <section name="settings" />','     <help> unique id generated when uploading the file to server </help>','</parameter>');
+              
+         end % }}}
+-		function obj = settings(varargin) % {{{
++		function self = settings(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%are we short in memory ? (0 faster but requires more memory)
+-			obj.lowmem=0;
++			self.lowmem=0;
+ 
+ 			%i/o:
+-			obj.io_gather=1;
++			self.io_gather=1;
+ 
+ 			%results frequency by default every step
+-			obj.output_frequency=1;
++			self.output_frequency=1;
+ 
+ 			%this option can be activated to load automatically the results
+ 			%onto the model after a parallel run by waiting for the lock file
+ 			%N minutes that is generated once the solution has converged
+ 			%0 to deactivate
+-			obj.waitonlock=Inf;
++			self.waitonlock=Inf;
+ 
+ 			%upload options: 
+ 			upload_port         = 0;
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			md = checkfield(md,'fieldname','settings.results_on_nodes','numel',[1],'values',[0 1]);
+ 			md = checkfield(md,'fieldname','settings.io_gather','numel',[1],'values',[0 1]);
+@@ -76,27 +76,27 @@
+ 			md = checkfield(md,'fieldname','settings.waitonlock','numel',[1]);
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   general settings parameters:'));
+ 
+-			fielddisplay(obj,'results_on_nodes','results are output for all the nodes of each element');
+-			fielddisplay(obj,'io_gather','I/O gathering strategy for result outputs (default 1)');
+-			fielddisplay(obj,'lowmem','is the memory limited ? (0 or 1)');
+-			fielddisplay(obj,'output_frequency','frequency at which results are saved in all solutions with multiple time_steps');
+-			fielddisplay(obj,'waitonlock','maximum number of minutes to wait for batch results (NaN to deactivate)');
+-			fielddisplay(obj,'upload_server','server hostname where model should be uploaded');
+-			fielddisplay(obj,'upload_path','path on server where model should be uploaded');
+-			fielddisplay(obj,'upload_login','server login');
+-			fielddisplay(obj,'upload_port','port login (default is 0)');
+-			fielddisplay(obj,'upload_filename','unique id generated when uploading the file to server');
++			fielddisplay(self,'results_on_nodes','results are output for all the nodes of each element');
++			fielddisplay(self,'io_gather','I/O gathering strategy for result outputs (default 1)');
++			fielddisplay(self,'lowmem','is the memory limited ? (0 or 1)');
++			fielddisplay(self,'output_frequency','frequency at which results are saved in all solutions with multiple time_steps');
++			fielddisplay(self,'waitonlock','maximum number of minutes to wait for batch results (NaN to deactivate)');
++			fielddisplay(self,'upload_server','server hostname where model should be uploaded');
++			fielddisplay(self,'upload_path','path on server where model should be uploaded');
++			fielddisplay(self,'upload_login','server login');
++			fielddisplay(self,'upload_port','port login (default is 0)');
++			fielddisplay(self,'upload_filename','unique id generated when uploading the file to server');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'object',obj,'fieldname','results_on_nodes','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','io_gather','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','lowmem','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','output_frequency','format','Integer');
+-			if obj.waitonlock>0,
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'object',self,'fieldname','results_on_nodes','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','io_gather','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','lowmem','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','output_frequency','format','Integer');
++			if self.waitonlock>0,
+ 				WriteData(fid,'enum',SettingsWaitonlockEnum(),'data',true,'format','Boolean');
+ 			else
+ 				WriteData(fid,'enum',SettingsWaitonlockEnum(),'data',false,'format','Boolean');
+Index: ../trunk-jpl/src/m/classes/groundingline.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/groundingline.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/groundingline.m	(revision 19040)
+@@ -8,7 +8,7 @@
+ 		migration    = '';
+ 	end
+ 	methods
+-		function createxml(obj,fid) % {{{
++		function createxml(self,fid) % {{{
+ 			fprintf(fid, '\n\n');
+ 			fprintf(fid, '%s\n', '<!-- groundingline -->');
+ 
+@@ -23,25 +23,25 @@
+ 
+ 			fprintf(fid,'%s\n%s\n','</frame>');
+ 		end % }}}
+-		function obj = groundingline(varargin) % {{{
++		function self = groundingline(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%Type of migration
+-			obj.migration='None';
++			self.migration='None';
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			md = checkfield(md,'fieldname','groundingline.migration','values',{'None' 'AggressiveMigration' 'SoftMigration' 'SubelementMigration' 'SubelementMigration2' 'Contact' 'None' 'GroundingOnly'});
+ 
+-			if ~strcmp(obj.migration,'None'),
++			if ~strcmp(self.migration,'None'),
+ 				if isnan(md.geometry.bed),
+ 					md = checkmessage(md,['requesting grounding line migration, but bathymetry is absent!']);
+ 				end
+@@ -55,13 +55,13 @@
+ 			end
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   grounding line migration parameters:'));
+-			fielddisplay(obj,'migration','type of grounding line migration: ''SoftMigration'',''AggressiveMigration'',''SubelementMigration'',''SubelementMigration2'' or ''None''');
++			fielddisplay(self,'migration','type of grounding line migration: ''SoftMigration'',''AggressiveMigration'',''SubelementMigration'',''SubelementMigration2'' or ''None''');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'data',StringToEnum(obj.migration),'enum',GroundinglineMigrationEnum(),'format','Integer');
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'data',StringToEnum(self.migration),'enum',GroundinglineMigrationEnum(),'format','Integer');
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/SMBmeltcomponents.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBmeltcomponents.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/SMBmeltcomponents.m	(revision 19040)
+@@ -11,7 +11,7 @@
+ 		refreeze = NaN;
+ 	end
+ 	methods
+-		function obj = SMBmeltcomponents(varargin) % {{{
++		function self = SMBmeltcomponents(varargin) % {{{
+ 			switch nargin
+ 				case 0
+ 				otherwise
+@@ -46,7 +46,7 @@
+ 			end
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			if ismember(MasstransportAnalysisEnum(),analyses),
+ 				md = checkfield(md,'fieldname','surfaceforcings.accumulation','timeseries',1,'NaN',1);
+@@ -73,22 +73,22 @@
+ 				md = checkfield(md,'fieldname','surfaceforcings.melt','size',[md.mesh.numberofvertices 1],'NaN',1);
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   surface forcings parameters with melt (SMB=accumulation-evaporation-melt+refreeze) :'));
+-			fielddisplay(obj,'accumulation','accumulated snow [m/yr ice eq]');
+-			fielddisplay(obj,'evaporation','amount of ice lost to evaporative processes [m/yr ice eq]');
+-			fielddisplay(obj,'melt','amount of ice melt in ice column [m/yr ice eq]');
+-			fielddisplay(obj,'refreeze','amount of ice melt refrozen in ice column [m/yr ice eq]');
++			fielddisplay(self,'accumulation','accumulated snow [m/yr ice eq]');
++			fielddisplay(self,'evaporation','amount of ice lost to evaporative processes [m/yr ice eq]');
++			fielddisplay(self,'melt','amount of ice melt in ice column [m/yr ice eq]');
++			fielddisplay(self,'refreeze','amount of ice melt refrozen in ice column [m/yr ice eq]');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBmeltcomponentsEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','accumulation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','evaporation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','melt','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','refreeze','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','accumulation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','evaporation','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','melt','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','refreeze','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/clusters/generic.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/generic.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/clusters/generic.m	(revision 19040)
+@@ -23,22 +23,22 @@
+ 		%}}}
+ 	end
+ 	methods
+-        function createxml(obj,fid) % {{{
++        function createxml(self,fid) % {{{
+             fprintf(fid, '\n\n');
+             fprintf(fid, '%s\n', '<!-- generic -->');
+             
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="name" type="',class(obj.name),'" default="',convert2str(obj.name),'">',	'     <section name="cluster" />','     <help> N/A </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="login" type="',class(obj.login),'" default="',convert2str(obj.login),'">',     '     <section name="cluster" />','     <help> N/A </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',	'<parameter key ="np" type="',class(obj.np),'" default="',convert2str(obj.np),'">',	'     <section name="cluster" />','     <help> N/A </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="port" type="',class(obj.port),'" default="',convert2str(obj.port),'">',	'     <section name="cluster" />','     <help> N/A </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="codepath" type="',class(obj.codepath),'" default="',convert2str(obj.codepath),'">',     '     <section name="cluster" />','     <help> N/A </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="name" type="',class(self.name),'" default="',convert2str(self.name),'">',	'     <section name="cluster" />','     <help> N/A </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="login" type="',class(self.login),'" default="',convert2str(self.login),'">',     '     <section name="cluster" />','     <help> N/A </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',	'<parameter key ="np" type="',class(self.np),'" default="',convert2str(self.np),'">',	'     <section name="cluster" />','     <help> N/A </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="port" type="',class(self.port),'" default="',convert2str(self.port),'">',	'     <section name="cluster" />','     <help> N/A </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="codepath" type="',class(self.codepath),'" default="',convert2str(self.codepath),'">',     '     <section name="cluster" />','     <help> N/A </help>','</parameter>');
+              
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="executionpath" type="',class(obj.executionpath),'" default="',convert2str(obj.executionpath),'">',	'     <section name="cluster" />','     <help> N/A </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="etcpath" type="',class(obj.etcpath),'" default="',convert2str(obj.etcpath),'">',     '     <section name="cluster" />','     <help> N/A </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="valgrind" type="',class(obj.valgrind),'" default="',convert2str(obj.valgrind),'">',	'     <section name="cluster" />','     <help> N/A </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="valgrindlib" type="',class(obj.valgrindlib),'" default="',convert2str(obj.valgrindlib),'">',     '     <section name="cluster" />','     <help> N/A </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="valgrindsup" type="',class(obj.valgrindsup),'" default="',convert2str(obj.valgrindsup),'">',     '     <section name="cluster" />','     <help> N/A </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',    	'<parameter key ="verbose" type="',class(obj.verbose),'" default="',convert2str(obj.verbose),'">',	'     <section name="cluster" />','     <help> N/A </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="executionpath" type="',class(self.executionpath),'" default="',convert2str(self.executionpath),'">',	'     <section name="cluster" />','     <help> N/A </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="etcpath" type="',class(self.etcpath),'" default="',convert2str(self.etcpath),'">',     '     <section name="cluster" />','     <help> N/A </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="valgrind" type="',class(self.valgrind),'" default="',convert2str(self.valgrind),'">',	'     <section name="cluster" />','     <help> N/A </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="valgrindlib" type="',class(self.valgrindlib),'" default="',convert2str(self.valgrindlib),'">',     '     <section name="cluster" />','     <help> N/A </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="valgrindsup" type="',class(self.valgrindsup),'" default="',convert2str(self.valgrindsup),'">',     '     <section name="cluster" />','     <help> N/A </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',    	'<parameter key ="verbose" type="',class(self.verbose),'" default="',convert2str(self.verbose),'">',	'     <section name="cluster" />','     <help> N/A </help>','</parameter>');
+              
+         end % }}}
+ 		function cluster=generic(varargin) % {{{
+Index: ../trunk-jpl/src/m/classes/mesh2dvertical.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mesh2dvertical.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/mesh2dvertical.m	(revision 19040)
+@@ -50,43 +50,43 @@
+ 		end% }}}
+ 	end
+ 	methods
+-		function createxml(obj,fid) % {{{
++		function createxml(self,fid) % {{{
+ 			fprintf(fid, '<!-- 2d Mesh (Vertical) -->\n');
+ 
+ 			%elements and vertices
+ 			fprintf(fid,'%s\n%s\n%s\n','       <frame key="1" label="Elements and vertices">','       <section name="mesh" />');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements" type="',class(obj.numberofelements),'" default="',convert2str(obj.numberofelements),'">','              <help> number of elements </help>','          </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices" type="',class(obj.numberofvertices),'" default="',convert2str(obj.numberofvertices),'">','              <help> number of vertices </help>','          </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements" type="',class(obj.elements),'" default="',convert2str(obj.elements),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x" type="',class(obj.x),'" default="',convert2str(obj.x),'">','     <section name="mesh" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y" type="',class(obj.y),'" default="',convert2str(obj.y),'">','     <section name="mesh" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="edges" type="',class(obj.edges),'" default="',convert2str(obj.edges),'">','     <section name="mesh" />','     <help> edges of the 2d mesh (vertex1 vertex2 element1 element2) </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberofedges" type="',class(obj.numberofedges),'" default="',convert2str(obj.numberofedges),'">','     <section name="mesh" />','     <help> number of edges of the 2d mesh </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofelements" type="',class(self.numberofelements),'" default="',convert2str(self.numberofelements),'">','              <help> number of elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="numberofvertices" type="',class(self.numberofvertices),'" default="',convert2str(self.numberofvertices),'">','              <help> number of vertices </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','          <parameter key ="elements" type="',class(self.elements),'" default="',convert2str(self.elements),'">','              <help> vertex indices of the mesh elements </help>','          </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x" type="',class(self.x),'" default="',convert2str(self.x),'">','     <section name="mesh" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y" type="',class(self.y),'" default="',convert2str(self.y),'">','     <section name="mesh" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="edges" type="',class(self.edges),'" default="',convert2str(self.edges),'">','     <section name="mesh" />','     <help> edges of the 2d mesh (vertex1 vertex2 element1 element2) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberofedges" type="',class(self.numberofedges),'" default="',convert2str(self.numberofedges),'">','     <section name="mesh" />','     <help> number of edges of the 2d mesh </help>','  </parameter>');
+ 			fprintf(fid,'%s\n%s\n','       </frame>');
+ 
+ 			% properties
+ 			fprintf(fid,'%s\n%s\n%s\n','<frame key="2" label="Properties">','<section name="mesh" />');             
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonboundary" type="',class(obj.vertexonboundary),'" default="',convert2str(obj.vertexonboundary),'">','     <section name="mesh" />','     <help> vertices on the boundary of the domain flag list </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonbase" type="',class(obj.vertexonbase),'" default="',convert2str(obj.vertexonbase),'">','     <section name="mesh" />','     <help> vertices on the bed of the domain flag list </help>','  </parameter>');            
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="segments" type="',class(obj.segments),'" default="',convert2str(obj.segments),'">','     <section name="mesh" />','     <help> edges on domain boundary (vertex1 vertex2 element) </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="segmentmarkers" type="',class(obj.segmentmarkers),'" default="',convert2str(obj.segmentmarkers),'">','     <section name="mesh" />','     <help> number associated to each segment </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexconnectivity" type="',class(obj.vertexconnectivity),'" default="',convert2str(obj.vertexconnectivity),'">','     <section name="mesh" />','     <help> list of vertices connected to vertex_i </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementconnectivity" type="',class(obj.elementconnectivity),'" default="',convert2str(obj.elementconnectivity),'">','     <section name="mesh" />','     <help> list of vertices connected to element_i </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="average_vertex_connectivity" type="',class(obj.average_vertex_connectivity),'" default="',convert2str(obj.average_vertex_connectivity),'">','     <section name="mesh" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonboundary" type="',class(self.vertexonboundary),'" default="',convert2str(self.vertexonboundary),'">','     <section name="mesh" />','     <help> vertices on the boundary of the domain flag list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonbase" type="',class(self.vertexonbase),'" default="',convert2str(self.vertexonbase),'">','     <section name="mesh" />','     <help> vertices on the bed of the domain flag list </help>','  </parameter>');            
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="segments" type="',class(self.segments),'" default="',convert2str(self.segments),'">','     <section name="mesh" />','     <help> edges on domain boundary (vertex1 vertex2 element) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="segmentmarkers" type="',class(self.segmentmarkers),'" default="',convert2str(self.segmentmarkers),'">','     <section name="mesh" />','     <help> number associated to each segment </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexconnectivity" type="',class(self.vertexconnectivity),'" default="',convert2str(self.vertexconnectivity),'">','     <section name="mesh" />','     <help> list of vertices connected to vertex_i </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementconnectivity" type="',class(self.elementconnectivity),'" default="',convert2str(self.elementconnectivity),'">','     <section name="mesh" />','     <help> list of vertices connected to element_i </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="average_vertex_connectivity" type="',class(self.average_vertex_connectivity),'" default="',convert2str(self.average_vertex_connectivity),'">','     <section name="mesh" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
+ 			fprintf(fid,'%s\n%s\n','</frame>');
+ 
+ 			%projection
+ 			fprintf(fid,'%s\n%s\n%s\n','<frame key="3" label="Projection">','<section name="mesh" />'); 
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lat" type="',class(obj.lat),'" default="',convert2str(obj.lat),'">','     <section name="mesh" />','     <help> vertices latitude [degrees] </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="long" type="',class(obj.long),'" default="',convert2str(obj.long),'">','     <section name="mesh" />','     <help> verticies longitude [degrees] </help>','  </parameter>');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="epsg" type="',class(obj.epsg),'" default="',convert2str(obj.epsg),'">','     <section name="mesh" />','     <help> Indicate epsg ''n'' or ''s'' </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lat" type="',class(self.lat),'" default="',convert2str(self.lat),'">','     <section name="mesh" />','     <help> vertices latitude [degrees] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="long" type="',class(self.long),'" default="',convert2str(self.long),'">','     <section name="mesh" />','     <help> verticies longitude [degrees] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="epsg" type="',class(self.epsg),'" default="',convert2str(self.epsg),'">','     <section name="mesh" />','     <help> Indicate epsg ''n'' or ''s'' </help>','  </parameter>');
+ 			fprintf(fid,'%s\n%s\n','</frame>');
+ 
+ 		end % }}}
+-		function obj = mesh2dvertical(varargin) % {{{
++		function self = mesh2dvertical(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+ 					inputstruct=varargin{1};
+ 					list1 = properties('mesh2dvertical');
+@@ -94,23 +94,23 @@
+ 					for i=1:length(list1)
+ 						fieldname = list1{i};
+ 						if ismember(fieldname,list2),
+-							obj.(fieldname) = inputstruct.(fieldname);
++							self.(fieldname) = inputstruct.(fieldname);
+ 						end
+ 					end
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%the connectivity is the averaged number of nodes linked to a
+ 			%given node through an edge. This connectivity is used to initially
+ 			%allocate memory to the stiffness matrix. A value of 16 seems to
+ 			%give a good memory/time ration. This value can be checked in
+ 			%trunk/test/Miscellaneous/runme.m
+-			obj.average_vertex_connectivity=25;
++			self.average_vertex_connectivity=25;
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			md = checkfield(md,'fieldname','mesh.x','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','mesh.y','NaN',1,'size',[md.mesh.numberofvertices 1]);
+@@ -130,54 +130,54 @@
+ 					md = checkmessage(md,'thermal not supported for 2d mesh');
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   2D tria Mesh (vertical):')); 
+ 
+ 			disp(sprintf('\n      Elements and vertices:'));
+-			fielddisplay(obj,'numberofelements','number of elements');
+-			fielddisplay(obj,'numberofvertices','number of vertices');
+-			fielddisplay(obj,'elements','vertex indices of the mesh elements');
+-			fielddisplay(obj,'x','vertices x coordinate [m]');
+-			fielddisplay(obj,'y','vertices y coordinate [m]');
+-			fielddisplay(obj,'edges','edges of the 2d mesh (vertex1 vertex2 element1 element2)');
+-			fielddisplay(obj,'numberofedges','number of edges of the 2d mesh');
++			fielddisplay(self,'numberofelements','number of elements');
++			fielddisplay(self,'numberofvertices','number of vertices');
++			fielddisplay(self,'elements','vertex indices of the mesh elements');
++			fielddisplay(self,'x','vertices x coordinate [m]');
++			fielddisplay(self,'y','vertices y coordinate [m]');
++			fielddisplay(self,'edges','edges of the 2d mesh (vertex1 vertex2 element1 element2)');
++			fielddisplay(self,'numberofedges','number of edges of the 2d mesh');
+ 
+ 			disp(sprintf('\n      Properties:'));
+-			fielddisplay(obj,'vertexonboundary','vertices on the boundary of the domain flag list');
+-			fielddisplay(obj,'vertexonbase','vertices on the bed of the domain flag list');
+-			fielddisplay(obj,'vertexonsurface','vertices on the surface of the domain flag list');
+-			fielddisplay(obj,'segments','edges on domain boundary (vertex1 vertex2 element)');
+-			fielddisplay(obj,'segmentmarkers','number associated to each segment');
+-			fielddisplay(obj,'vertexconnectivity','list of vertices connected to vertex_i');
+-			fielddisplay(obj,'elementconnectivity','list of vertices connected to element_i');
+-			fielddisplay(obj,'average_vertex_connectivity','average number of vertices connected to one vertex');
++			fielddisplay(self,'vertexonboundary','vertices on the boundary of the domain flag list');
++			fielddisplay(self,'vertexonbase','vertices on the bed of the domain flag list');
++			fielddisplay(self,'vertexonsurface','vertices on the surface of the domain flag list');
++			fielddisplay(self,'segments','edges on domain boundary (vertex1 vertex2 element)');
++			fielddisplay(self,'segmentmarkers','number associated to each segment');
++			fielddisplay(self,'vertexconnectivity','list of vertices connected to vertex_i');
++			fielddisplay(self,'elementconnectivity','list of vertices connected to element_i');
++			fielddisplay(self,'average_vertex_connectivity','average number of vertices connected to one vertex');
+ 
+ 			disp(sprintf('\n      Projection:'));
+-			fielddisplay(obj,'lat','vertices latitude [degrees]');
+-			fielddisplay(obj,'long','vertices longitude [degrees]');
+-			fielddisplay(obj,'epsg','EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)');
++			fielddisplay(self,'lat','vertices latitude [degrees]');
++			fielddisplay(self,'long','vertices longitude [degrees]');
++			fielddisplay(self,'epsg','EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'enum',DomainTypeEnum(),'data',StringToEnum(['Domain' domaintype(obj)]),'format','Integer');
+-			WriteData(fid,'enum',DomainDimensionEnum(),'data',dimension(obj),'format','Integer');
+-			WriteData(fid,'enum',MeshElementtypeEnum(),'data',StringToEnum(elementtype(obj)),'format','Integer');
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','x','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','y','format','DoubleMat','mattype',1);
+-			WriteData(fid,'enum',MeshZEnum(),'data',zeros(obj.numberofvertices,1),'format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','elements','format','DoubleMat','mattype',2);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','numberofelements','format','Integer');
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','numberofvertices','format','Integer');
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','vertexonbase','format','BooleanMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','vertexonsurface','format','BooleanMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','mesh','fieldname','average_vertex_connectivity','format','Integer');
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'enum',DomainTypeEnum(),'data',StringToEnum(['Domain' domaintype(self)]),'format','Integer');
++			WriteData(fid,'enum',DomainDimensionEnum(),'data',dimension(self),'format','Integer');
++			WriteData(fid,'enum',MeshElementtypeEnum(),'data',StringToEnum(elementtype(self)),'format','Integer');
++			WriteData(fid,'object',self,'class','mesh','fieldname','x','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','mesh','fieldname','y','format','DoubleMat','mattype',1);
++			WriteData(fid,'enum',MeshZEnum(),'data',zeros(self.numberofvertices,1),'format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','mesh','fieldname','elements','format','DoubleMat','mattype',2);
++			WriteData(fid,'object',self,'class','mesh','fieldname','numberofelements','format','Integer');
++			WriteData(fid,'object',self,'class','mesh','fieldname','numberofvertices','format','Integer');
++			WriteData(fid,'object',self,'class','mesh','fieldname','vertexonbase','format','BooleanMat','mattype',1);
++			WriteData(fid,'object',self,'class','mesh','fieldname','vertexonsurface','format','BooleanMat','mattype',1);
++			WriteData(fid,'object',self,'class','mesh','fieldname','average_vertex_connectivity','format','Integer');
+ 		end % }}}
+-		function t = domaintype(obj) % {{{
++		function t = domaintype(self) % {{{
+ 			t = '2Dvertical';
+ 		end % }}}
+-		function d = dimension(obj) % {{{
++		function d = dimension(self) % {{{
+ 			d = 2;
+ 		end % }}}
+-		function s = elementtype(obj) % {{{
++		function s = elementtype(self) % {{{
+ 			s = 'Tria';
+ 		end % }}}
+ 		function flags = vertexflags(self,value) % {{{
+Index: ../trunk-jpl/src/m/classes/friction.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/friction.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/friction.m	(revision 19040)
+@@ -10,27 +10,27 @@
+ 		q           = NaN;
+ 	end
+ 	methods
+-        function createxml(obj,fid) % {{{
++        function createxml(self,fid) % {{{
+             fprintf(fid, '\n\n');
+             fprintf(fid, '%s\n', '<!-- Friction: Sigma= drag^2 * Neff ^r * u ^s, with Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p -->');
+             fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Friction: Sigma= drag^2 * Neff ^r * u ^s, with Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p">','<section name="friction" />');   
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="coefficient" type="',   	class(obj.coefficient),'" default="',     	convert2str(obj.coefficient),'">',              '     <section name="friction" />','     <help> friction coefficient [SI] </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="p" type="',               class(obj.p),'" default="',                 convert2str(obj.p),'">',   '     <section name="friction" />','     <help> p exponent </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',        '<parameter key ="q" type="',               class(obj.q),'" default="',                 convert2str(obj.q),'">',            '     <section name="friction" />','     <help> q exponent </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="coefficient" type="',   	class(self.coefficient),'" default="',     	convert2str(self.coefficient),'">',              '     <section name="friction" />','     <help> friction coefficient [SI] </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="p" type="',               class(self.p),'" default="',                 convert2str(self.p),'">',   '     <section name="friction" />','     <help> p exponent </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',        '<parameter key ="q" type="',               class(self.q),'" default="',                 convert2str(self.q),'">',            '     <section name="friction" />','     <help> q exponent </help>','</parameter>');
+             fprintf(fid,'%s\n%s\n','</frame>');
+         end % }}}
+-		function obj = friction(varargin) % {{{
++		function self = friction(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return
+ 			if ~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(ThermalAnalysisEnum(),analyses), return; end
+@@ -38,20 +38,20 @@
+ 			md = checkfield(md,'fieldname','friction.q','NaN',1,'size',[md.mesh.numberofelements 1]);
+ 			md = checkfield(md,'fieldname','friction.p','NaN',1,'size',[md.mesh.numberofelements 1]);
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('Basal shear stress parameters: Sigma_b = coefficient^2 * Neff ^r * |u_b|^(s-1) * u_b\n(effective stress Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p)'));
+-			fielddisplay(obj,'coefficient','friction coefficient [SI]');
+-			fielddisplay(obj,'p','p exponent');
+-			fielddisplay(obj,'q','q exponent');
++			fielddisplay(self,'coefficient','friction coefficient [SI]');
++			fielddisplay(self,'p','p exponent');
++			fielddisplay(self,'q','q exponent');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'enum',FrictionLawEnum,'data',1,'format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','coefficient','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+-			%WriteData(fid,'object',obj,'fieldname','coefficient','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'fieldname','p','format','DoubleMat','mattype',2);
+-			WriteData(fid,'object',obj,'fieldname','q','format','DoubleMat','mattype',2);
++			WriteData(fid,'object',self,'fieldname','coefficient','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++			%WriteData(fid,'object',self,'fieldname','coefficient','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'fieldname','p','format','DoubleMat','mattype',2);
++			WriteData(fid,'object',self,'fieldname','q','format','DoubleMat','mattype',2);
+ 			
+ 
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/frictionweertman.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionweertman.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/frictionweertman.m	(revision 19040)
+@@ -9,49 +9,49 @@
+ 		m = NaN;
+ 	end
+ 	methods
+-        function createxml(obj,fid) % {{{
++        function createxml(self,fid) % {{{
+             fprintf(fid, '\n\n');
+             fprintf(fid, '%s\n', '<!-- Friction: Sigma= drag^2 * Neff ^r * u ^s, with Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p -->');
+             fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Friction: Sigma= drag^2 * Neff ^r * u ^s, with Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p">','<section name="frictionweertman" />');   
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="coefficient" type="',   	class(obj.coefficient),'" default="',     	convert2str(obj.coefficient),'">',              '     <section name="frictionweertman" />','     <help> frictionweertman coefficient [SI] </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="p" type="',               class(obj.p),'" default="',                 convert2str(obj.p),'">',   '     <section name="frictionweertman" />','     <help> p exponent </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',        '<parameter key ="q" type="',               class(obj.q),'" default="',                 convert2str(obj.q),'">',            '     <section name="frictionweertman" />','     <help> q exponent </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="coefficient" type="',   	class(self.coefficient),'" default="',     	convert2str(self.coefficient),'">',              '     <section name="frictionweertman" />','     <help> frictionweertman coefficient [SI] </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="p" type="',               class(self.p),'" default="',                 convert2str(self.p),'">',   '     <section name="frictionweertman" />','     <help> p exponent </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',        '<parameter key ="q" type="',               class(self.q),'" default="',                 convert2str(self.q),'">',            '     <section name="frictionweertman" />','     <help> q exponent </help>','</parameter>');
+             fprintf(fid,'%s\n%s\n','</frame>');
+         end % }}}
+-		function obj = frictionweertman(varargin) % {{{
++		function self = frictionweertman(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return
+ 			if ~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(ThermalAnalysisEnum(),analyses), return; end
+ 			md = checkfield(md,'fieldname','friction.C','timeseries',1,'NaN',1);
+ 			md = checkfield(md,'fieldname','friction.m','NaN',1,'size',[md.mesh.numberofelements 1]);
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp('Weertman sliding law parameters:');
+ 			disp('   Weertman''s sliding law reads:');
+ 			disp('      v_b = C * Sigma_b^m');
+ 			disp('   In ISSM, this law is rewritten as:');
+ 			disp('      Sigma_b = C^(-1/m) * |u_b|^(1/m-1)  u_b');
+ 			disp(' ');
+-			fielddisplay(obj,'C','friction coefficient [SI]');
+-			fielddisplay(obj,'m','m exponent');
++			fielddisplay(self,'C','friction coefficient [SI]');
++			fielddisplay(self,'m','m exponent');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'enum',FrictionLawEnum,'data',2,'format','Integer');
+-			WriteData(fid,'class','friction','object',obj,'fieldname','C','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'class','friction','object',obj,'fieldname','m','format','DoubleMat','mattype',2);
++			WriteData(fid,'class','friction','object',self,'fieldname','C','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'class','friction','object',self,'fieldname','m','format','DoubleMat','mattype',2);
+ 			
+ 
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/SMBgradients.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBgradients.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/SMBgradients.m	(revision 19040)
+@@ -11,10 +11,10 @@
+ 		b_neg  = NaN;
+ 	end
+ 	methods
+-		function obj = SMBgradients(varargin) % {{{
++		function self = SMBgradients(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+@@ -29,12 +29,12 @@
+ 			%Nothing done for now
+ 
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%Nothing for now
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			if ismember(MasstransportAnalysisEnum(),analyses),
+ 				md = checkfield(md,'fieldname','surfaceforcings.href','timeseries',1,'NaN',1);
+@@ -43,25 +43,25 @@
+ 				md = checkfield(md,'fieldname','surfaceforcings.b_neg','timeseries',1,'NaN',1);
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   surface forcings parameters:'));
+ 
+ 			disp(sprintf('\n   SMB gradients parameters:'));
+-			fielddisplay(obj,'href',' reference elevation from which deviation is used to calculate SMB adjustment in smb gradients method [m]');
+-			fielddisplay(obj,'smbref',' reference smb from which deviation is calculated in smb gradients method [mm/yr water equiv]');
+-			fielddisplay(obj,'b_pos',' slope of hs - smb regression line for accumulation regime required if smb gradients is activated');
+-			fielddisplay(obj,'b_neg',' slope of hs - smb regression line for ablation regime required if smb gradients is activated');
++			fielddisplay(self,'href',' reference elevation from which deviation is used to calculate SMB adjustment in smb gradients method [m]');
++			fielddisplay(self,'smbref',' reference smb from which deviation is calculated in smb gradients method [mm/yr water equiv]');
++			fielddisplay(self,'b_pos',' slope of hs - smb regression line for accumulation regime required if smb gradients is activated');
++			fielddisplay(self,'b_neg',' slope of hs - smb regression line for ablation regime required if smb gradients is activated');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBgradientsEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','href','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','smbref','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','b_pos','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','b_neg','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','href','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','smbref','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','b_pos','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','b_neg','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+ 
+ 		end % }}}
+ 	end
+Index: ../trunk-jpl/src/m/classes/frictionhydro.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionhydro.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/frictionhydro.m	(revision 19040)
+@@ -11,18 +11,18 @@
+ 		effective_pressure = NaN; 
+ 	end
+ 	methods
+-		function obj = frictionhydro(varargin) % {{{
++		function self = frictionhydro(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return
+ 			if ~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(ThermalAnalysisEnum(),analyses), return; end
+@@ -30,19 +30,19 @@
+ 			md = checkfield(md,'fieldname','friction.C','NaN',1,'size',[md.mesh.numberofelements 1]);
+ 			md = checkfield(md,'fieldname','friction.As','NaN',1,'size',[md.mesh.numberofelements 1]);
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('Effective Pressure based friction law described in Gagliardini 2007'));
+-			fielddisplay(obj,'q','friction law exponent q>=1');
+-			fielddisplay(obj,'C','friction law max value [SI]');
+-			fielddisplay(obj,'As','Sliding Parameter without cavitation [m Pa^-n s^-1]');
+-			fielddisplay(obj,'effective_pressure','Effective Pressure [Pa]');
++			fielddisplay(self,'q','friction law exponent q>=1');
++			fielddisplay(self,'C','friction law max value [SI]');
++			fielddisplay(self,'As','Sliding Parameter without cavitation [m Pa^-n s^-1]');
++			fielddisplay(self,'effective_pressure','Effective Pressure [Pa]');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 			WriteData(fid,'enum',FrictionLawEnum,'data',3,'format','Integer');
+-			WriteData(fid,'class','friction','object',obj,'fieldname','q','format','DoubleMat','mattype',2);
+-			WriteData(fid,'class','friction','object',obj,'fieldname','C','format','DoubleMat','mattype',2);
+-			WriteData(fid,'class','friction','object',obj,'fieldname','As','format','DoubleMat','mattype',2);
+-			WriteData(fid,'class','friction','object',obj,'fieldname','effective_pressure','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'class','friction','object',self,'fieldname','q','format','DoubleMat','mattype',2);
++			WriteData(fid,'class','friction','object',self,'fieldname','C','format','DoubleMat','mattype',2);
++			WriteData(fid,'class','friction','object',self,'fieldname','As','format','DoubleMat','mattype',2);
++			WriteData(fid,'class','friction','object',self,'fieldname','effective_pressure','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/modellist.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/modellist.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/modellist.m	(revision 19040)
+@@ -121,7 +121,7 @@
+ 			md_list=modellist(models);
+ 
+ 		end % }}}
+-		function obj = modellist(varargin) % {{{
++		function self = modellist(varargin) % {{{
+ 
+ 			%initialize list
+ 			if nargin==0,
+@@ -145,11 +145,11 @@
+ 					end
+ 				end
+ 
+-				obj.models  = celllist;
+-				obj.cluster = obj.models{1}.cluster;
++				self.models  = celllist;
++				self.cluster = self.models{1}.cluster;
+ 			end
+ 		end % }}}
+-		function val = get(obj, propName)% {{{
++		function val = get(self, propName)% {{{
+ 		%GET - gets model propertie from a specified object ans returns the value
+ 		% 
+ 		%   Usage:
+@@ -157,32 +157,32 @@
+ 
+ 			switch propName
+ 				case 'numberofelements'
+-					val = obj.numberofelements;
++					val = self.numberofelements;
+ 				case 'numberofnodes'
+-					val = obj.numberofnodes;
++					val = self.numberofnodes;
+ 				case 'elements' 
+-					val = obj.elements;
++					val = self.elements;
+ 				case 'x' 
+-					val = obj.x;
++					val = self.x;
+ 				case 'y' 
+-					val = obj.y;
++					val = self.y;
+ 				case 'z' 
+-					val = obj.z;
++					val = self.z;
+ 				otherwise
+ 					error(['get error message: ' propName,' is not a valid model property'])
+ 			end
+ 		end % }}}
+-		function obj = loadmultipleresultsfromcluster(obj) % {{{
++		function self = loadmultipleresultsfromcluster(self) % {{{
+ 			%LOADMULTIPLERESULTSFROMCLUSTER - load multiple results of solution sequences from cluster
+ 			%
+ 			%   Usage:
+-			%      obj=loadresultsfromcluster(obj);
++			%      self=loadresultsfromcluster(self);
+ 
+-			nummodels=length(obj.models);
++			nummodels=length(self.models);
+ 
+ 			%Get cluster settings
+-			cluster=obj.cluster;
+-			name=obj.name;
++			cluster=self.cluster;
++			name=self.name;
+ 			cluster_rc_location=which('cluster.rc');
+ 			[codepath,executionpath]=ClusterParameters(cluster,cluster_rc_location);
+ 
+@@ -199,7 +199,7 @@
+ 			%ok, go through list and load results from disk: 
+ 			for i=1:nummodels,
+ 				%load  results for this model
+-				obj.models{i}=loadresultsfromdisk(obj.models{i},[name '-' num2str(i) 'vs' num2str(nummodels) '.outbin']);
++				self.models{i}=loadresultsfromdisk(self.models{i},[name '-' num2str(i) 'vs' num2str(nummodels) '.outbin']);
+ 
+ 				delete([name '-' num2str(i) 'vs' num2str(nummodels) '.outbin']);
+ 			end
+@@ -207,16 +207,16 @@
+ 			%erase files 
+ 			delete('ModelResults.tar.gz');
+ 		end % }}}
+-		function obj = solve(obj,varargin)% {{{
++		function self = solve(self,varargin)% {{{
+ 			%SOLVE - apply solution sequence for  a list of models. Used in batch mode.
+ 			%
+ 			%   Usage:
+-			%      obj=solve(obj,varargin)
++			%      self=solve(self,varargin)
+ 			%      where varargin is a lit of paired arguments. 
+ 			%      arguments can be: 'analysis_type': 'stressbalance','thermal','masstransport','transient'
+ 			%
+ 			%   Examples:
+-			%      obj=solve(obj,'analysis_type','stressbalance');
++			%      self=solve(self,'analysis_type','stressbalance');
+ 
+ 			%recover options
+ 			options=pairoptions(varargin{:});
+@@ -225,13 +225,13 @@
+ 			options=process_solve_options(options);
+ 
+ 			%length of list
+-			nummodels=length(obj.models);
++			nummodels=length(self.models);
+ 
+ 			%name of queue: to make it unique, add a time stamp
+-			name=[obj.name '-' datestr(now,1) '-' datestr(now,'HH-MM-SS') ];
++			name=[self.name '-' datestr(now,1) '-' datestr(now,'HH-MM-SS') ];
+ 
+ 			%name of cluster will be first name of list
+-			cluster=obj.cluster;
++			cluster=self.cluster;
+ 
+ 			%Figure out parameters for this particular cluster
+ 			cluster_rc_location=which('cluster.rc');
+@@ -241,17 +241,17 @@
+ 			for i=1:nummodels,
+ 
+ 				%model
+-				mdex=obj.models{i};
++				mdex=self.models{i};
+ 
+ 				%recover some fields
+ 				mdex.analysis_type=options.analysis_type;
+ 
+ 				mdex.name=[name '-' num2str(i) 'vs' num2str(nummodels)];
+-				mdex.time=obj.time;
+-				mdex.queue=obj.queue;
+-				mdex.cluster=obj.cluster;
+-				if ~isnan(obj.np),
+-					mdex.np=obj.np;
++				mdex.time=self.time;
++				mdex.queue=self.queue;
++				mdex.cluster=self.cluster;
++				if ~isnan(self.np),
++					mdex.np=self.np;
+ 				end
+ 
+ 				%call solve in batch mode:
+@@ -262,7 +262,7 @@
+ 				end
+ 
+ 				%feed back
+-				obj.models{i}=mdex;
++				self.models{i}=mdex;
+ 			end
+ 
+ 			%locally, we are done.
+@@ -286,7 +286,7 @@
+ 			delete('ModelList.tar.gz');
+ 
+ 			%save name: 
+-			obj.name=name;
++			self.name=name;
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/seaiceinitialization.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/seaiceinitialization.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/seaiceinitialization.m	(revision 19040)
+@@ -19,7 +19,7 @@
+ 		mesh_y             = NaN;
+ 	end
+ 	methods
+-		function obj = seaiceinitialization(varargin) % {{{
++		function self = seaiceinitialization(varargin) % {{{
+ 			switch nargin
+ 				case 0
+ 					return;
+@@ -27,7 +27,7 @@
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 			md = checkfield(md,'fieldname','initialization.thickness','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
+ 			md = checkfield(md,'fieldname','initialization.concentration','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
+ 			md = checkfield(md,'fieldname','initialization.vx','NaN',1,'size',[md.mesh.numberofvertices 1]);
+@@ -41,34 +41,34 @@
+ 			md = checkfield(md,'fieldname','initialization.mesh_x','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','initialization.mesh_y','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   initial field values:'));
+-			fielddisplay(obj,'thickness','sea ice thickness [m]');
+-			fielddisplay(obj,'concentration','sea ice concentration (between 0 and 1)');
+-			fielddisplay(obj,'vx','x component of the ice velocity [m/s]');
+-			fielddisplay(obj,'vy','y component of the ice velocity [m/s]');
+-			fielddisplay(obj,'vx_coriolis','x component of the ice velocity used to calculate coriolis forces [m/s]');
+-			fielddisplay(obj,'vy_coriolis','y component of the ice velocity used to calculate coriolis forces [m/s]');
+-			fielddisplay(obj,'sigma_predictor_xx','Predictor for the xx component of the Cauchy stress tensor [Pa]');
+-			fielddisplay(obj,'sigma_predictor_yy','Predictor for the yy component of the Cauchy stress tensor [Pa]');
+-			fielddisplay(obj,'sigma_predictor_xy','Predictor for the xy component of the Cauchy stress tensor [Pa]');
+-			fielddisplay(obj,'damage','damage, between 0 (no damage) and 1 (fully damaged)');
+-			fielddisplay(obj,'mesh_x','x position of each vertex of the mesh using a Lagrangian approach');
+-			fielddisplay(obj,'mesh_y','y position of each vertex of the mesh using a Lagrangian approach');
++			fielddisplay(self,'thickness','sea ice thickness [m]');
++			fielddisplay(self,'concentration','sea ice concentration (between 0 and 1)');
++			fielddisplay(self,'vx','x component of the ice velocity [m/s]');
++			fielddisplay(self,'vy','y component of the ice velocity [m/s]');
++			fielddisplay(self,'vx_coriolis','x component of the ice velocity used to calculate coriolis forces [m/s]');
++			fielddisplay(self,'vy_coriolis','y component of the ice velocity used to calculate coriolis forces [m/s]');
++			fielddisplay(self,'sigma_predictor_xx','Predictor for the xx component of the Cauchy stress tensor [Pa]');
++			fielddisplay(self,'sigma_predictor_yy','Predictor for the yy component of the Cauchy stress tensor [Pa]');
++			fielddisplay(self,'sigma_predictor_xy','Predictor for the xy component of the Cauchy stress tensor [Pa]');
++			fielddisplay(self,'damage','damage, between 0 (no damage) and 1 (fully damaged)');
++			fielddisplay(self,'mesh_x','x position of each vertex of the mesh using a Lagrangian approach');
++			fielddisplay(self,'mesh_y','y position of each vertex of the mesh using a Lagrangian approach');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'data',obj.thickness,'format','DoubleMat','mattype',2,'enum',SeaiceThicknessEnum());
+-			WriteData(fid,'data',obj.concentration,'format','DoubleMat','mattype',2,'enum',SeaiceConcentrationEnum());
+-			WriteData(fid,'data',obj.vx,'format','DoubleMat','mattype',1,'enum',VxEnum);
+-			WriteData(fid,'data',obj.vy,'format','DoubleMat','mattype',1,'enum',VyEnum);
+-			WriteData(fid,'data',obj.vx_coriolis,'format','DoubleMat','mattype',1,'enum',VxStarEnum());
+-			WriteData(fid,'data',obj.vy_coriolis,'format','DoubleMat','mattype',1,'enum',VyStarEnum());
+-			WriteData(fid,'data',obj.sigma_predictor_xx,'format','DoubleMat','mattype',2,'enum',StressTensorPredictorxxEnum());
+-			WriteData(fid,'data',obj.sigma_predictor_yy,'format','DoubleMat','mattype',2,'enum',StressTensorPredictoryyEnum());
+-			WriteData(fid,'data',obj.sigma_predictor_xy,'format','DoubleMat','mattype',2,'enum',StressTensorPredictorxyEnum());
+-			WriteData(fid,'data',obj.damage,'format','DoubleMat','mattype',2,'enum',DamageEnum());
+-			WriteData(fid,'data',obj.mesh_x,'format','DoubleMat','mattype',1,'enum',MeshXEnum());
+-			WriteData(fid,'data',obj.mesh_y,'format','DoubleMat','mattype',1,'enum',MeshYEnum());
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'data',self.thickness,'format','DoubleMat','mattype',2,'enum',SeaiceThicknessEnum());
++			WriteData(fid,'data',self.concentration,'format','DoubleMat','mattype',2,'enum',SeaiceConcentrationEnum());
++			WriteData(fid,'data',self.vx,'format','DoubleMat','mattype',1,'enum',VxEnum);
++			WriteData(fid,'data',self.vy,'format','DoubleMat','mattype',1,'enum',VyEnum);
++			WriteData(fid,'data',self.vx_coriolis,'format','DoubleMat','mattype',1,'enum',VxStarEnum());
++			WriteData(fid,'data',self.vy_coriolis,'format','DoubleMat','mattype',1,'enum',VyStarEnum());
++			WriteData(fid,'data',self.sigma_predictor_xx,'format','DoubleMat','mattype',2,'enum',StressTensorPredictorxxEnum());
++			WriteData(fid,'data',self.sigma_predictor_yy,'format','DoubleMat','mattype',2,'enum',StressTensorPredictoryyEnum());
++			WriteData(fid,'data',self.sigma_predictor_xy,'format','DoubleMat','mattype',2,'enum',StressTensorPredictorxyEnum());
++			WriteData(fid,'data',self.damage,'format','DoubleMat','mattype',2,'enum',DamageEnum());
++			WriteData(fid,'data',self.mesh_x,'format','DoubleMat','mattype',1,'enum',MeshXEnum());
++			WriteData(fid,'data',self.mesh_y,'format','DoubleMat','mattype',1,'enum',MeshYEnum());
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/frictionweertmantemp.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionweertmantemp.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/frictionweertmantemp.m	(revision 19040)
+@@ -10,39 +10,39 @@
+ 		m = NaN;
+ 	end
+ 	methods
+-		function obj = frictionweertmantemp(varargin) % {{{
++		function self = frictionweertmantemp(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return
+ 			if ~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(ThermalAnalysisEnum(),analyses), return; end
+ 			md = checkfield(md,'fieldname','friction.C','timeseries',1,'NaN',1);
+ 			md = checkfield(md,'fieldname','friction.m','NaN',1,'size',[md.mesh.numberofelements 1]);
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp('Weertman sliding law parameters:');
+ 			disp('      Sigma_b = C^(-1/m) * |u_b|^(1/m-1)  u_b * 1/f(T)');
+ 			disp(' ');
+-			fielddisplay(obj,'gamma','submelt sliding parameter f(T) = exp((T-Tpmp)/gamma)');
+-			fielddisplay(obj,'C','friction coefficient [SI]');
+-			fielddisplay(obj,'m','m exponent');
++			fielddisplay(self,'gamma','submelt sliding parameter f(T) = exp((T-Tpmp)/gamma)');
++			fielddisplay(self,'C','friction coefficient [SI]');
++			fielddisplay(self,'m','m exponent');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'enum',FrictionLawEnum,'data',6,'format','Integer');
+-			WriteData(fid,'class','friction','object',obj,'fieldname','gamma','format','Double');
+-			WriteData(fid,'class','friction','object',obj,'fieldname','C','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'class','friction','object',obj,'fieldname','m','format','DoubleMat','mattype',2);
++			WriteData(fid,'class','friction','object',self,'fieldname','gamma','format','Double');
++			WriteData(fid,'class','friction','object',self,'fieldname','C','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'class','friction','object',self,'fieldname','m','format','DoubleMat','mattype',2);
+ 			
+ 
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/dependent.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/dependent.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/dependent.m	(revision 19040)
+@@ -14,71 +14,71 @@
+ 		nods                 = 0;
+ 	end
+ 	methods
+-		function obj = dependent(varargin) % {{{
++		function self = dependent(varargin) % {{{
+ 
+ 			%use provided options to change fields
+ 			options=pairoptions(varargin{:});
+ 
+-			obj.name=getfieldvalue(options,'name','');
+-			obj.type=getfieldvalue(options,'type','');
+-			obj.exp=getfieldvalue(options,'exp','');
+-			obj.segments=getfieldvalue(options,'segments',[]);
+-			obj.index=getfieldvalue(options,'index',-1);
+-			obj.nods=getfieldvalue(options,'nods',0);
++			self.name=getfieldvalue(options,'name','');
++			self.type=getfieldvalue(options,'type','');
++			self.exp=getfieldvalue(options,'exp','');
++			self.segments=getfieldvalue(options,'segments',[]);
++			self.index=getfieldvalue(options,'index',-1);
++			self.nods=getfieldvalue(options,'nods',0);
+ 
+ 			%if name is mass flux: 
+-			if strcmpi(obj.name,'MassFlux'),
++			if strcmpi(self.name,'MassFlux'),
+ 				%make sure that we supplied a file and that it exists! 
+-				if exist(obj.exp)~=2,
++				if exist(self.exp)~=2,
+ 					error('dependent checkconsistency: specified ''exp'' file does not exist!');
+ 				end
+ 				%process the file and retrieve segments
+ 				mesh=getfieldvalue(options,'mesh');
+-				obj.segments=MeshProfileIntersection(mesh.elements,mesh.x,mesh.y,obj.exp);
++				self.segments=MeshProfileIntersection(mesh.elements,mesh.x,mesh.y,self.exp);
+ 			end
+ 		end
+ 		%}}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 			%do nothing
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
+-			if strcmpi(obj.name,'MassFlux'),
+-				if isempty(obj.segments),
++		function md = checkconsistency(self,md,solution,analyses) % {{{
++			if strcmpi(self.name,'MassFlux'),
++				if isempty(self.segments),
+ 					error('dependent checkconsistency error: need segments to compute this dependent response');
+ 				end
+-				if obj.index<=0,
++				if self.index<=0,
+ 					error('dependent checkconsistency error: index for segments should be >=1');
+ 				end
+ 			end
+-			if ~isnan(obj.fos_reverse_index),
++			if ~isnan(self.fos_reverse_index),
+ 				if ~strcmpi(driver,'fos_reverse'),
+ 					error('cannot declare a dependent with a fos_reverse_index when the driver is not fos_reverse!');
+ 				end
+-				if obj.nods==0,
++				if self.nods==0,
+ 					error('dependent checkconsistency error: nods should be set to the size of the independent variable');
+ 				end
+ 			end
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   dependent variable:'));
+ 
+-			fielddisplay(obj,'name','variable name (must match corresponding Enum)');
+-			fielddisplay(obj,'type','type of variable (''vertex'' or ''scalar'')');
++			fielddisplay(self,'name','variable name (must match corresponding Enum)');
++			fielddisplay(self,'type','type of variable (''vertex'' or ''scalar'')');
+ 
+-			if ~isnan(obj.fos_reverse_index),
+-				fielddisplay(obj,'fos_reverse_index','index for fos_reverse driver of ADOLC');
++			if ~isnan(self.fos_reverse_index),
++				fielddisplay(self,'fos_reverse_index','index for fos_reverse driver of ADOLC');
+ 			end
+-			if ~isempty(obj.exp),
+-				fielddisplay(obj,'exp','file needed to compute dependent variable');
+-				fielddisplay(obj,'segments','mass flux segments');
++			if ~isempty(self.exp),
++				fielddisplay(self,'exp','file needed to compute dependent variable');
++				fielddisplay(self,'segments','mass flux segments');
+ 			end
+ 
+ 		end % }}}
+-		function scalar=typetoscalar(obj) % {{{
+-			if strcmpi(obj.type,'scalar'),
++		function scalar=typetoscalar(self) % {{{
++			if strcmpi(self.type,'scalar'),
+ 				scalar=0;
+-			elseif strcmpi(obj.type,'vertex'),
++			elseif strcmpi(self.type,'vertex'),
+ 				scalar=1;
+ 			end
+ 
+Index: ../trunk-jpl/src/m/classes/timestepping.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/timestepping.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/timestepping.m	(revision 19040)
+@@ -14,47 +14,47 @@
+ 		in_years        = 1;
+ 	end
+ 	methods
+-       function createxml(obj,fid) % {{{
++       function createxml(self,fid) % {{{
+             fprintf(fid, '\n\n');
+             fprintf(fid, '%s\n', '<!-- Timestepping -->');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="start_time" type="',              class(obj.start_time),'" default="',                  convert2str(obj.start_time),'">',              '     <section name="timestepping" />','     <help> simulation starting time [yr] </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="final_time" type="',            class(obj.final_time),'" default="',                convert2str(obj.final_time),'">',   '     <section name="timestepping" />','     <help> final time to stop the simulation [yr] </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="time_step" type="',      class(obj.time_step),'" default="',          convert2str(obj.time_step),'">',            '     <section name="timestepping" />','     <help> length of time steps [yr] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="start_time" type="',              class(self.start_time),'" default="',                  convert2str(self.start_time),'">',              '     <section name="timestepping" />','     <help> simulation starting time [yr] </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="final_time" type="',            class(self.final_time),'" default="',                convert2str(self.final_time),'">',   '     <section name="timestepping" />','     <help> final time to stop the simulation [yr] </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="time_step" type="',      class(self.time_step),'" default="',          convert2str(self.time_step),'">',            '     <section name="timestepping" />','     <help> length of time steps [yr] </help>','</parameter>');
+             % time_adapt 0 or 1 drop down
+             fprintf(fid,'%s\n%s\n%s\n%s\n','<parameter key ="time_adapt" type="alternative" optional="false">','     <section name="timestepping" />','     <help> use cfl condition to define time step ? (0 or 1)  </help>');
+             fprintf(fid, '%s\n',   '       <option value="0" type="string" default="true"></option>');
+             fprintf(fid, '%s\n%s\n',   '       <option value="1" type="string" default="false"></option>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="cfl_coefficient" type="',       class(obj.cfl_coefficient),'" default="',              convert2str(obj.cfl_coefficient),'">',              '     <section name="timestepping" />','     <help> coefficient applied to cfl condition </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="cfl_coefficient" type="',       class(self.cfl_coefficient),'" default="',              convert2str(self.cfl_coefficient),'">',              '     <section name="timestepping" />','     <help> coefficient applied to cfl condition </help>','</parameter>');
+             
+         end % }}}
+         
+-		function obj = timestepping(varargin) % {{{
++		function self = timestepping(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%time between 2 time steps
+-			obj.time_step=1./2.;
++			self.time_step=1./2.;
+ 
+ 			%final time
+-			obj.final_time=10.*obj.time_step;
++			self.final_time=10.*self.time_step;
+ 
+ 			%time adaptation? 
+-			obj.time_adapt=0;
+-			obj.cfl_coefficient=0.5;
++			self.time_adapt=0;
++			self.cfl_coefficient=0.5;
+ 
+ 			%should we interpolate forcings between timesteps?
+-			obj.interp_forcings=1;
++			self.interp_forcings=1;
+ 
+ 			%In years by default
+-			obj.in_years = 1;
++			self.in_years = 1;
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			md = checkfield(md,'fieldname','timestepping.start_time','numel',[1],'NaN',1);
+ 			md = checkfield(md,'fieldname','timestepping.final_time','numel',[1],'NaN',1);
+@@ -62,40 +62,40 @@
+ 			md = checkfield(md,'fieldname','timestepping.time_adapt','numel',[1],'values',[0 1]);
+ 			md = checkfield(md,'fieldname','timestepping.cfl_coefficient','numel',[1],'>',0,'<=',1);
+ 			md = checkfield(md,'fieldname','timestepping.interp_forcings','numel',[1],'values',[0 1]);
+-			if obj.final_time-obj.start_time<0,
++			if self.final_time-self.start_time<0,
+ 				md = checkmessage(md,'timestepping.final_time should be larger than timestepping.start_time');
+ 			end 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   timestepping parameters:'));
+ 
+-			if(obj.in_years)
++			if(self.in_years)
+ 				unit = 'yr';
+ 			else
+ 				unit = 's';
+ 			end
+-			fielddisplay(obj,'start_time',['simulation starting time [' unit ']']);
+-			fielddisplay(obj,'final_time',['final time to stop the simulation [' unit ']']);
+-			fielddisplay(obj,'time_step',['length of time steps [' unit ']']);
+-			fielddisplay(obj,'time_adapt','use cfl condition to define time step ? (0 or 1) ');
+-			fielddisplay(obj,'cfl_coefficient','coefficient applied to cfl condition');
+-			fielddisplay(obj,'interp_forcings','interpolate in time between requested forcing values ? (0 or 1)');
+-			fielddisplay(obj,'in_years','time unit, 1: years, 0: seconds');
++			fielddisplay(self,'start_time',['simulation starting time [' unit ']']);
++			fielddisplay(self,'final_time',['final time to stop the simulation [' unit ']']);
++			fielddisplay(self,'time_step',['length of time steps [' unit ']']);
++			fielddisplay(self,'time_adapt','use cfl condition to define time step ? (0 or 1) ');
++			fielddisplay(self,'cfl_coefficient','coefficient applied to cfl condition');
++			fielddisplay(self,'interp_forcings','interpolate in time between requested forcing values ? (0 or 1)');
++			fielddisplay(self,'in_years','time unit, 1: years, 0: seconds');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+-			if obj.in_years,
++			if self.in_years,
+ 				scale = 365.0*24.0*3600.0;
+ 			else
+ 				scale = 1.;
+ 			end
+-			WriteData(fid,'object',obj,'fieldname','start_time','format','Double','scale',scale);
+-			WriteData(fid,'object',obj,'fieldname','final_time','format','Double','scale',scale);
+-			WriteData(fid,'object',obj,'fieldname','time_step','format','Double','scale',scale);
+-			WriteData(fid,'object',obj,'fieldname','time_adapt','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','cfl_coefficient','format','Double');
+-			WriteData(fid,'object',obj,'fieldname','interp_forcings','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','start_time','format','Double','scale',scale);
++			WriteData(fid,'object',self,'fieldname','final_time','format','Double','scale',scale);
++			WriteData(fid,'object',self,'fieldname','time_step','format','Double','scale',scale);
++			WriteData(fid,'object',self,'fieldname','time_adapt','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','cfl_coefficient','format','Double');
++			WriteData(fid,'object',self,'fieldname','interp_forcings','format','Boolean');
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/private.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/private.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/private.m	(revision 19040)
+@@ -11,27 +11,27 @@
+ 		solution     = '';
+ 	end
+ 	methods
+-		function obj = private(varargin) % {{{
++		function self = private(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   private parameters: do not change'));
+ 
+-			fielddisplay(obj,'isconsistent','is model self consistent');
+-			fielddisplay(obj,'runtimename','name of the run launched');
+-			fielddisplay(obj,'bamg','structure with mesh properties constructed if bamg is used to mesh the domain');
+-			fielddisplay(obj,'solution','type of solution launched');
++			fielddisplay(self,'isconsistent','is model self consistent');
++			fielddisplay(self,'runtimename','name of the run launched');
++			fielddisplay(self,'bamg','structure with mesh properties constructed if bamg is used to mesh the domain');
++			fielddisplay(self,'solution','type of solution launched');
+ 
+ 		end % }}}
+ 	end
+Index: ../trunk-jpl/src/m/classes/snowpack.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/snowpack.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/snowpack.m	(revision 19040)
+@@ -104,10 +104,10 @@
+ 
+ 	end
+ 	methods
+-		function obj = snowpack(varargin) % {{{
++		function self = snowpack(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+ 					inputstruct=varargin{1};
+ 					list1 = properties('snowpack');
+@@ -115,108 +115,108 @@
+ 					for i=1:length(list1)
+ 						fieldname = list1{i};
+ 						if ismember(fieldname,list2),
+-							obj.(fieldname) = inputstruct.(fieldname);
++							self.(fieldname) = inputstruct.(fieldname);
+ 						end
+ 					end
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 		%snowpack:  %{{{
+-		obj.snowpack_meas_tss = 1;
+-		obj.snowpack_enforce_measured_snow_heights = 0;
+-		obj.snowpack_sw_mode = 0;
+-		obj.snowpack_incoming_longwave = 1;
+-		obj.snowpack_height_of_wind_value = 12.;
+-		obj.snowpack_height_of_meteo_values = 12.;
+-		obj.snowpack_neutral = 0;
+-		obj.snowpack_roughness_length = 0.002;
+-		obj.snowpack_number_slopes = 1;
+-		obj.snowpack_snow_redistribution = 1;
+-		obj.snowpack_calculation_step_length = 15.0;
+-		obj.snowpack_change_bc = 0;
+-		obj.snowpack_thresh_change_bc = -1.0;
+-		obj.snowpack_snp_soil = 0;
+-		obj.snowpack_soil_flux = 0;
+-		obj.snowpack_geo_heat = 0.06;
+-		obj.snowpack_canopy = 0;
++		self.snowpack_meas_tss = 1;
++		self.snowpack_enforce_measured_snow_heights = 0;
++		self.snowpack_sw_mode = 0;
++		self.snowpack_incoming_longwave = 1;
++		self.snowpack_height_of_wind_value = 12.;
++		self.snowpack_height_of_meteo_values = 12.;
++		self.snowpack_neutral = 0;
++		self.snowpack_roughness_length = 0.002;
++		self.snowpack_number_slopes = 1;
++		self.snowpack_snow_redistribution = 1;
++		self.snowpack_calculation_step_length = 15.0;
++		self.snowpack_change_bc = 0;
++		self.snowpack_thresh_change_bc = -1.0;
++		self.snowpack_snp_soil = 0;
++		self.snowpack_soil_flux = 0;
++		self.snowpack_geo_heat = 0.06;
++		self.snowpack_canopy = 0;
+ 		%}}}
+ 		%snowpackadvanced:  %{{{
+-		obj.snowpackadvanced_variant = 'ANTARCTICA'; % use 320 kg m-3 for fixed density
+-		obj.snowpackadvanced_hn_density = 'EVENT';
++		self.snowpackadvanced_variant = 'ANTARCTICA'; % use 320 kg m-3 for fixed density
++		self.snowpackadvanced_hn_density = 'EVENT';
+ 		%}}}
+ 		%general:  %{{{
+-		obj.general_pluginpath = '/usr/local/lib/meteoio/plugins/';
+-		obj.general_buff_chunk_size = 90;
+-		obj.general_buff_before = 1.5;
++		self.general_pluginpath = '/usr/local/lib/meteoio/plugins/';
++		self.general_buff_chunk_size = 90;
++		self.general_buff_before = 1.5;
+ 		%}}}
+ 		%input {{{
+-		obj.input_coordsys = 'ch1903';
+-		obj.input_coordparam = 'null';
+-		obj.input_time_zone = 8;
+-		obj.input_meteo = 'smet';
+-		obj.input_meteopath = './input';
+-		obj.input_station1 = 'domec.smet';
+-		obj.input_snowfile1 = 'domec.sno';
++		self.input_coordsys = 'ch1903';
++		self.input_coordparam = 'null';
++		self.input_time_zone = 8;
++		self.input_meteo = 'smet';
++		self.input_meteopath = './input';
++		self.input_station1 = 'domec.smet';
++		self.input_snowfile1 = 'domec.sno';
+ 		%}}}
+ 		%output {{{
+-		obj.output_coordsys = 'ch1903';
+-		obj.output_coordparam = 'null';
+-		obj.output_time_zone = 8;
+-		obj.output_meteopath = './output';
+-		obj.output_experiment = 'smet';
+-		obj.output_ts_write = 1;
+-		obj.output_ts_start = 0.0;
+-		obj.output_ts_days_between = 0.04166667;
+-		obj.output_profile = 'ascii';
+-		obj.output_prof_write = 1;
+-		obj.output_prof_start = 0.0;
+-		obj.output_prof_days_between = 0.04166667;
++		self.output_coordsys = 'ch1903';
++		self.output_coordparam = 'null';
++		self.output_time_zone = 8;
++		self.output_meteopath = './output';
++		self.output_experiment = 'smet';
++		self.output_ts_write = 1;
++		self.output_ts_start = 0.0;
++		self.output_ts_days_between = 0.04166667;
++		self.output_profile = 'ascii';
++		self.output_prof_write = 1;
++		self.output_prof_start = 0.0;
++		self.output_prof_days_between = 0.04166667;
+ 		%}}}
+ 		%interpolations1d %{{{
+-		obj.interpolations1d_window_size = 439200; %that is 5 d and 2 h; 1 d = 86400
+-		obj.interpolations1d_hnw_resample = 'none';
+-		obj.interpolations1d_hs_resample = 'linear';
+-		obj.interpolations1d_tsg_resample = 'linear';
+-		obj.interpolations1d_rho_hn_resample = 'none';
+-		obj.interpolations1d_vw_resample = 'nearest_neighbour';
+-		obj.interpolations1d_vw_args = 'extrapolate';
++		self.interpolations1d_window_size = 439200; %that is 5 d and 2 h; 1 d = 86400
++		self.interpolations1d_hnw_resample = 'none';
++		self.interpolations1d_hs_resample = 'linear';
++		self.interpolations1d_tsg_resample = 'linear';
++		self.interpolations1d_rho_hn_resample = 'none';
++		self.interpolations1d_vw_resample = 'nearest_neighbour';
++		self.interpolations1d_vw_args = 'extrapolate';
+ 		%}}}
+ 		%filters {{{
+-		obj.filters_ta_filter1 = 'min_max';
+-		obj.filters_ta_arg1 = [190 280];
+-		obj.filters_rh_filter1 = 'min_max';
+-		obj.filters_rh_arg1 = [0.01 1.2];
+-		obj.filters_rh_filter2 = 'min_max';
+-		obj.filters_rh_arg2 = {'soft' 0.01 1.0};
+-		obj.filters_iswr_filter1 = 'min_max';
+-		obj.filters_iswr_arg1 = [-10 1500];
+-		obj.filters_iswr_filter2 = 'min_max';
+-		obj.filters_iswr_arg2 = {'soft' 0 1500};
+-		obj.filters_rswr_filter1 = 'min_max';
+-		obj.filters_rswr_arg1 = [-10 1500];
+-		obj.filters_rswr_filter2 = 'min_max';
+-		obj.filters_rswr_arg2 = {'soft' 0 1500};
++		self.filters_ta_filter1 = 'min_max';
++		self.filters_ta_arg1 = [190 280];
++		self.filters_rh_filter1 = 'min_max';
++		self.filters_rh_arg1 = [0.01 1.2];
++		self.filters_rh_filter2 = 'min_max';
++		self.filters_rh_arg2 = {'soft' 0.01 1.0};
++		self.filters_iswr_filter1 = 'min_max';
++		self.filters_iswr_arg1 = [-10 1500];
++		self.filters_iswr_filter2 = 'min_max';
++		self.filters_iswr_arg2 = {'soft' 0 1500};
++		self.filters_rswr_filter1 = 'min_max';
++		self.filters_rswr_arg1 = [-10 1500];
++		self.filters_rswr_filter2 = 'min_max';
++		self.filters_rswr_arg2 = {'soft' 0 1500};
+ 
+ 		%for ta between 190 and 280 k;
+-		obj.filters_ilwr_filter1 = 'min_max';
+-		obj.filters_ilwr_arg1 = [30 355];
+-		obj.filters_ilwr_filter2 = 'min_max';
+-		obj.filters_ilwr_arg2 = {'soft' 35 350};
+-		obj.filters_tss_filter1 = 'min_max';
+-		obj.filters_tss_arg1 = [180 275];
+-		obj.filters_tsg_filter1 = 'min_max';
+-		obj.filters_tsg_arg1 = [200 275];
+-		obj.filters_vw_filter1 = 'min_max';
+-		obj.filters_vw_arg1 = [-2 70];
+-		obj.filters_vw_filter2 = 'min_max';
+-		obj.filters_vw_arg2 = {'soft' 0 50};
++		self.filters_ilwr_filter1 = 'min_max';
++		self.filters_ilwr_arg1 = [30 355];
++		self.filters_ilwr_filter2 = 'min_max';
++		self.filters_ilwr_arg2 = {'soft' 35 350};
++		self.filters_tss_filter1 = 'min_max';
++		self.filters_tss_arg1 = [180 275];
++		self.filters_tsg_filter1 = 'min_max';
++		self.filters_tsg_arg1 = [200 275];
++		self.filters_vw_filter1 = 'min_max';
++		self.filters_vw_arg1 = [-2 70];
++		self.filters_vw_filter2 = 'min_max';
++		self.filters_vw_arg2 = {'soft' 0 50};
+ 		%}}}
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 			%snowpack:  %{{{
+ 			md=checkfield(md,'fieldname','snowpack.snowpack_meas_tss','values',[0 1]);
+ 			md=checkfield(md,'fieldname','snowpack.snowpack_enforce_measured_snow_heights','values',[0 1]);
+@@ -336,144 +336,144 @@
+ 
+ 			%}}}
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 
+ 			disp(sprintf('   Snowpack solution parameters:'));
+ 			disp(sprintf('\n	%s','Snowpack parameters:')); % {{{
+-			fielddisplay(obj,'snowpack_meas_tss',{'A measured surface temperature is available and can be reliably ','used for various consistency tests (it needs to be set to true if enabling CHANGE_BC) (0 or 1)'});
+-			fielddisplay(obj,'snowpack_enforce_measured_snow_heights','Input mode by which a measurement of snow depth is used to drive the snow cover mass balance (0 or 1)');
+-			fielddisplay(obj,'snowpack_sw_mode',{'Define the shortwave radiation input:',...
++			fielddisplay(self,'snowpack_meas_tss',{'A measured surface temperature is available and can be reliably ','used for various consistency tests (it needs to be set to true if enabling CHANGE_BC) (0 or 1)'});
++			fielddisplay(self,'snowpack_enforce_measured_snow_heights','Input mode by which a measurement of snow depth is used to drive the snow cover mass balance (0 or 1)');
++			fielddisplay(self,'snowpack_sw_mode',{'Define the shortwave radiation input:',...
+ 				'0 Incoming shortwave radiation is measured and albedo estimated by the model',...
+ 				'1 Reflected shortwave radiation is available as input and albedo is estimated by the model (IMIS standard)',...
+ 				'2 Incoming and reflected shortwave radiation are both measured and the albedo is estimated from both measurements subject to plausibility checks.'});
+-			fielddisplay(obj,'snowpack_incoming_longwave','Use the provided incoming long wave on the virtual slopes? (0 or 1)');
+-			fielddisplay(obj,'snowpack_height_of_wind_value',{'The instrument height (or model layer height) for wind input data; note that height ',...
++			fielddisplay(self,'snowpack_incoming_longwave','Use the provided incoming long wave on the virtual slopes? (0 or 1)');
++			fielddisplay(self,'snowpack_height_of_wind_value',{'The instrument height (or model layer height) for wind input data; note that height ',...
+ 				'is above ground for a standard SNOWPACK application but above surface (snow or ground) for Alpine3D applications '});
+-			fielddisplay(obj,'snowpack_height_of_meteo_values',{'The instrument height (or model layer height) for meteorological input data except for wind,',...
++			fielddisplay(self,'snowpack_height_of_meteo_values',{'The instrument height (or model layer height) for meteorological input data except for wind,',...
+ 				'which may be at a different height; note that height is above ground for a standard SNOWPACK ',...
+ 				'application but above surface (snow or ground) for Alpine3D applications. '});
+-			fielddisplay(obj,'snowpack_neutral',{'Select the atmospheric stability correction model:',...
++			fielddisplay(self,'snowpack_neutral',{'Select the atmospheric stability correction model:',...
+ 				'-1 use a simplified Richardson number stability correction',...
+ 				'0 assume standard Monin-Obukhov bulk formulation for surface exchange iteration with Paulson, Stearns and Weidner (can be used with BC_CHANGE=0)',...
+ 				'1 force Monin-Obukhov formulation to assume neutral conditions regardless of the actual stratification; it has been shown to work well in ',...
+ 				'complex terrain settings. It should be used with BC_CHANGE=1, i.e., Dirichlet /* but also is recommended with Neumann b.c., i.e., BC_CHANGE=0.'});
+-			fielddisplay(obj,'snowpack_roughness_length',{'Aerodynamic roughness length as a parameter for the Monin-Obukhov bulk formulation;',...
++			fielddisplay(self,'snowpack_roughness_length',{'Aerodynamic roughness length as a parameter for the Monin-Obukhov bulk formulation;',...
+ 				'A typical value for complex terrain is 0.01 m and for snow covered flat sites 0.001 m. '});
+-			fielddisplay(obj,'snowpack_number_slopes',{'Based on meteorological input from a (flat field) automatic station or numerical weather model,',...
++			fielddisplay(self,'snowpack_number_slopes',{'Based on meteorological input from a (flat field) automatic station or numerical weather model,',...
+ 				'up to 8 expositions can be calculated in addition to the flat field if the corresponding *.sno files are provided. For example,',...
+ 				'if you provide a flat field *.snow file (mandatory), which is named KLO3.sno and you want 4 slopes to be calculated the corresponding',...
+ 				'slope files should be named KLO21.sno, ...,KLO24.sno '});
+-			fielddisplay(obj,'snowpack_snow_redistribution',{'Specifies if redistribution of snow is allowed from (upwind) expositions to lee slopes.',...
++			fielddisplay(self,'snowpack_snow_redistribution',{'Specifies if redistribution of snow is allowed from (upwind) expositions to lee slopes.',...
+ 				'In case just the flat field is calculated, snow erosion is enabled but only for "ENFORCE_MEASURED_SNOW_HEIGHTS".'});
+-				fielddisplay(obj,'snowpack_calculation_step_length',{'Internal time step (in minutes) used for model simulation. Please note that this MUST ',...
++				fielddisplay(self,'snowpack_calculation_step_length',{'Internal time step (in minutes) used for model simulation. Please note that this MUST ',...
+ 				'be the same as HNW::accumulate (the latter being in seconds) if re-acumulating precipitation, otherwise it would lead to wrong results.'});
+-			fielddisplay(obj,'snowpack_change_bc',{'Use measured surface temperature as Dirichlet temperature BC for sub-freezing snowpacks and switch to ',...
++			fielddisplay(self,'snowpack_change_bc',{'Use measured surface temperature as Dirichlet temperature BC for sub-freezing snowpacks and switch to ',...
+ 			'Neumann only for melting snowpacks. If set to false, assumes Neumann boundary conditions.'});
+-			fielddisplay(obj,'snowpack_thresh_change_bc','Threshold value (small number below freezing), which switches from Dirichlet to Neumann BCs if CHANGE_BC is selected');
+-			fielddisplay(obj,'snowpack_snp_soil','Soil layers as defined by the *.sno files are included in the simulation');
+-			fielddisplay(obj,'snowpack_soil_flux','Assume that the lower temperature boundary condition is given by GEO_HEAT (Neumann) and not by a measured temperature');
+-			fielddisplay(obj,'snowpack_geo_heat','Constant geothermal heat flux at great) depth W m-2): Lower flux boundary condition for temperature equation if BC is Neumann');
+-			fielddisplay(obj,'snowpack_canopy','Switch to tell the model that canopy is present (note that Canopy parameters should then be provided in the *.sno file)');
++			fielddisplay(self,'snowpack_thresh_change_bc','Threshold value (small number below freezing), which switches from Dirichlet to Neumann BCs if CHANGE_BC is selected');
++			fielddisplay(self,'snowpack_snp_soil','Soil layers as defined by the *.sno files are included in the simulation');
++			fielddisplay(self,'snowpack_soil_flux','Assume that the lower temperature boundary condition is given by GEO_HEAT (Neumann) and not by a measured temperature');
++			fielddisplay(self,'snowpack_geo_heat','Constant geothermal heat flux at great) depth W m-2): Lower flux boundary condition for temperature equation if BC is Neumann');
++			fielddisplay(self,'snowpack_canopy','Switch to tell the model that canopy is present (note that Canopy parameters should then be provided in the *.sno file)');
+ 			% }}}
+ 			disp(sprintf('\n	%s','Snowpackadvanced parameters:')); % {{{
+-			fielddisplay(obj,'snowpackadvanced_variant','variant selection (includes a choice of specific models, DEFAULT, ANTARCTICA and JAPAN )'); % use 320 kg m-3 for fixed density
+-			fielddisplay(obj,'snowpackadvanced_hn_density',{'Fixed value to be used as new snow density if a constant density model is chosen, otherwise the choices are "PARAMETERIZED" "EVENT" "MEASURED"'});
++			fielddisplay(self,'snowpackadvanced_variant','variant selection (includes a choice of specific models, DEFAULT, ANTARCTICA and JAPAN )'); % use 320 kg m-3 for fixed density
++			fielddisplay(self,'snowpackadvanced_hn_density',{'Fixed value to be used as new snow density if a constant density model is chosen, otherwise the choices are "PARAMETERIZED" "EVENT" "MEASURED"'});
+ 			% }}}
+ 			disp(sprintf('\n	%s','General parameters:')); % {{{
+-			fielddisplay(obj,'general_pluginpath','');
+-			fielddisplay(obj,'general_buff_chunk_size','Size in days of a chunk of data to read at once.');
+-			fielddisplay(obj,'general_buff_before','Alternate way of buffer centering: When rebuffering, the new date will be located BUFF_BEFORE days from the beginning of the buffer (therefore, it takes a value in days). ');
++			fielddisplay(self,'general_pluginpath','');
++			fielddisplay(self,'general_buff_chunk_size','Size in days of a chunk of data to read at once.');
++			fielddisplay(self,'general_buff_before','Alternate way of buffer centering: When rebuffering, the new date will be located BUFF_BEFORE days from the beginning of the buffer (therefore, it takes a value in days). ');
+ 			% }}}
+ 			disp(sprintf('\n	%s','Input  parameter:')); % {{{
+-			fielddisplay(obj,'input_coordsys','coordinates in the Swiss Grid (http://geomatics.ladetto.ch/ch1903_wgs84_de.pdf). One of CH1903,UTM,UPS,PROJ4 or LOCAL');
+-			fielddisplay(obj,'input_coordparam',' ');
+-			fielddisplay(obj,'input_time_zone',' ');
+-			fielddisplay(obj,'input_meteo','plugin for METEO data (one of BORMA,COSMO,GEOTOP,GRIB,GS,IMIS,SMET,SNOWPACK');
+-			fielddisplay(obj,'input_meteopath','string containing the path to the xml files.');
+-			fielddisplay(obj,'input_station1','Meteorology file for station number #');
+-			fielddisplay(obj,'input_snowfile1','File name for the initial snow profile for station number #');
++			fielddisplay(self,'input_coordsys','coordinates in the Swiss Grid (http://geomatics.ladetto.ch/ch1903_wgs84_de.pdf). One of CH1903,UTM,UPS,PROJ4 or LOCAL');
++			fielddisplay(self,'input_coordparam',' ');
++			fielddisplay(self,'input_time_zone',' ');
++			fielddisplay(self,'input_meteo','plugin for METEO data (one of BORMA,COSMO,GEOTOP,GRIB,GS,IMIS,SMET,SNOWPACK');
++			fielddisplay(self,'input_meteopath','string containing the path to the xml files.');
++			fielddisplay(self,'input_station1','Meteorology file for station number #');
++			fielddisplay(self,'input_snowfile1','File name for the initial snow profile for station number #');
+ 			% }}}
+ 			disp(sprintf('\n	%s','Output parameters:')); % {{{
+-			fielddisplay(obj,'output_coordsys','Coordinates in the Swiss Grid http://geomatics.ladetto.ch/ch1903_wgs84_de.pdf. One of CH1903,UTM,UPS,PROJ4 or LOCAL ');
+-			fielddisplay(obj,'output_coordparam','');
+-			fielddisplay(obj,'output_time_zone','');
+-			fielddisplay(obj,'output_meteopath','Path to the outputs (this path MUST exist, it won''t be created)');
+-			fielddisplay(obj,'output_experiment','Option to give an additional simulation specific output name to the run in addition to "STATION_NAME"');
+-			fielddisplay(obj,'output_ts_write','Write meteo data out? (0 or 1)');
+-			fielddisplay(obj,'output_ts_start','When to start writing meteo data out (offset, in days)');
+-			fielddisplay(obj,'output_ts_days_between','How often to write meteo data out (in days: 3 hours=.125, 1 hour=4.1666e-2)');
+-			fielddisplay(obj,'output_profile','How to write the profiles (default: ASCII, choice is ASCII,IMIS or ASCII IMIS)');
++			fielddisplay(self,'output_coordsys','Coordinates in the Swiss Grid http://geomatics.ladetto.ch/ch1903_wgs84_de.pdf. One of CH1903,UTM,UPS,PROJ4 or LOCAL ');
++			fielddisplay(self,'output_coordparam','');
++			fielddisplay(self,'output_time_zone','');
++			fielddisplay(self,'output_meteopath','Path to the outputs (this path MUST exist, it won''t be created)');
++			fielddisplay(self,'output_experiment','Option to give an additional simulation specific output name to the run in addition to "STATION_NAME"');
++			fielddisplay(self,'output_ts_write','Write meteo data out? (0 or 1)');
++			fielddisplay(self,'output_ts_start','When to start writing meteo data out (offset, in days)');
++			fielddisplay(self,'output_ts_days_between','How often to write meteo data out (in days: 3 hours=.125, 1 hour=4.1666e-2)');
++			fielddisplay(self,'output_profile','How to write the profiles (default: ASCII, choice is ASCII,IMIS or ASCII IMIS)');
+ )');
+-			fielddisplay(obj,'output_prof_write','Write profile data out? (0 or 1) ');
+-			fielddisplay(obj,'output_prof_start','When to start writing profile data out (offset, in days)');
+-			fielddisplay(obj,'output_prof_days_between','How often to write profile data out (in days: 3 hours=.125, 1 hour=4.1666e-2)');
++			fielddisplay(self,'output_prof_write','Write profile data out? (0 or 1) ');
++			fielddisplay(self,'output_prof_start','When to start writing profile data out (offset, in days)');
++			fielddisplay(self,'output_prof_days_between','How often to write profile data out (in days: 3 hours=.125, 1 hour=4.1666e-2)');
+ 			% }}}
+ 			disp(sprintf('\n	%s','Interpolations1d parameters:')); % {{{
+-			fielddisplay(obj,'interpolations1d_window_size','Affects resampling: expresses (in seconds) how far a valid point can be searched for when re-interpolating a missing value'); 
+-			fielddisplay(obj,'interpolations1d_hnw_resample','NONE, NEAREST_NEIGHBOUR, ACCUMULATE or LINEAR');
++			fielddisplay(self,'interpolations1d_window_size','Affects resampling: expresses (in seconds) how far a valid point can be searched for when re-interpolating a missing value'); 
++			fielddisplay(self,'interpolations1d_hnw_resample','NONE, NEAREST_NEIGHBOUR, ACCUMULATE or LINEAR');
+  ');
+-			fielddisplay(obj,'interpolations1d_hs_resample','Mean average processing. The mean average filter returns the mean value of all values within a user given time window. (NONE, NEAREST_NEIGHBOUR, ACCUMULATE or LINEAR)');
+-			fielddisplay(obj,'interpolations1d_tsg_resample','Mean average processing. The mean average filter returns the mean value of all values within a user given time window.(NONE, NEAREST_NEIGHBOUR, ACCUMULATE or LINEAR)');
+-			fielddisplay(obj,'interpolations1d_rho_hn_resample','(NONE, NEAREST_NEIGHBOUR, ACCUMULATE or LINEAR)');
+-			fielddisplay(obj,'interpolations1d_vw_resample','(NONE, NEAREST_NEIGHBOUR, ACCUMULATE or LINEAR)');
+-			fielddisplay(obj,'interpolations1d_vw_args','default nothing, otherwise, ''extrapolcate''');
++			fielddisplay(self,'interpolations1d_hs_resample','Mean average processing. The mean average filter returns the mean value of all values within a user given time window. (NONE, NEAREST_NEIGHBOUR, ACCUMULATE or LINEAR)');
++			fielddisplay(self,'interpolations1d_tsg_resample','Mean average processing. The mean average filter returns the mean value of all values within a user given time window.(NONE, NEAREST_NEIGHBOUR, ACCUMULATE or LINEAR)');
++			fielddisplay(self,'interpolations1d_rho_hn_resample','(NONE, NEAREST_NEIGHBOUR, ACCUMULATE or LINEAR)');
++			fielddisplay(self,'interpolations1d_vw_resample','(NONE, NEAREST_NEIGHBOUR, ACCUMULATE or LINEAR)');
++			fielddisplay(self,'interpolations1d_vw_args','default nothing, otherwise, ''extrapolcate''');
+ 			% }}}
+ 			disp(sprintf('\n	%s','Filters parameters:')); % {{{
+-			fielddisplay(obj,'filters_ta_filter1',' ');
+-			fielddisplay(obj,'filters_ta_arg1','');
+-			fielddisplay(obj,'filters_rh_filter1',' ');
+-			fielddisplay(obj,'filters_rh_arg1','');
+-			fielddisplay(obj,'filters_rh_filter2',' ');
+-			fielddisplay(obj,'filters_rh_arg2','');
+-			fielddisplay(obj,'filters_iswr_filter1',' ');
+-			fielddisplay(obj,'filters_iswr_arg1','');
+-			fielddisplay(obj,'filters_iswr_filter2',' ');
+-			fielddisplay(obj,'filters_iswr_arg2','');
+-			fielddisplay(obj,'filters_rswr_filter1',' ');
+-			fielddisplay(obj,'filters_rswr_arg1','');
+-			fielddisplay(obj,'filters_rswr_filter2',' ');
+-			fielddisplay(obj,'filters_rswr_arg2','');
++			fielddisplay(self,'filters_ta_filter1',' ');
++			fielddisplay(self,'filters_ta_arg1','');
++			fielddisplay(self,'filters_rh_filter1',' ');
++			fielddisplay(self,'filters_rh_arg1','');
++			fielddisplay(self,'filters_rh_filter2',' ');
++			fielddisplay(self,'filters_rh_arg2','');
++			fielddisplay(self,'filters_iswr_filter1',' ');
++			fielddisplay(self,'filters_iswr_arg1','');
++			fielddisplay(self,'filters_iswr_filter2',' ');
++			fielddisplay(self,'filters_iswr_arg2','');
++			fielddisplay(self,'filters_rswr_filter1',' ');
++			fielddisplay(self,'filters_rswr_arg1','');
++			fielddisplay(self,'filters_rswr_filter2',' ');
++			fielddisplay(self,'filters_rswr_arg2','');
+ 
+ 			%for ta between 190 and 280 k;
+-			fielddisplay(obj,'filters_ilwr_filter1',' ');
+-			fielddisplay(obj,'filters_ilwr_arg1','');
+-			fielddisplay(obj,'filters_ilwr_filter2',' ');
+-			fielddisplay(obj,'filters_ilwr_arg2','');
+-			fielddisplay(obj,'filters_tss_filter1',' ');
+-			fielddisplay(obj,'filters_tss_arg1','');
+-			fielddisplay(obj,'filters_tsg_filter1',' ');
+-			fielddisplay(obj,'filters_tsg_arg1','');
+-			fielddisplay(obj,'filters_vw_filter1',' ');
+-			fielddisplay(obj,'filters_vw_arg1','');
+-			fielddisplay(obj,'filters_vw_filter2',' ');
+-			fielddisplay(obj,'filters_vw_arg2','');
++			fielddisplay(self,'filters_ilwr_filter1',' ');
++			fielddisplay(self,'filters_ilwr_arg1','');
++			fielddisplay(self,'filters_ilwr_filter2',' ');
++			fielddisplay(self,'filters_ilwr_arg2','');
++			fielddisplay(self,'filters_tss_filter1',' ');
++			fielddisplay(self,'filters_tss_arg1','');
++			fielddisplay(self,'filters_tsg_filter1',' ');
++			fielddisplay(self,'filters_tsg_arg1','');
++			fielddisplay(self,'filters_vw_filter1',' ');
++			fielddisplay(self,'filters_vw_arg1','');
++			fielddisplay(self,'filters_vw_filter2',' ');
++			fielddisplay(self,'filters_vw_arg2','');
+ 			% }}}
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			yts=365.0*24.0*3600.0;
+ 
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','spcvx','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','spcvy','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','spcvz','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','restol','format','Double');
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','reltol','format','Double');
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','abstol','format','Double');
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','isnewton','format','Integer');
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','FSreconditioning','format','Double');
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','viscosity_overshoot','format','Double');
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','maxiter','format','Integer');
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','shelf_dampening','format','Integer');
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','vertex_pairing','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','penalty_factor','format','Double');
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','rift_penalty_lock','format','Integer');
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','rift_penalty_threshold','format','Integer');
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','referential','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','snowpack','fieldname','requested_outputs','format','StringArray');
+-			WriteData(fid,'data',obj.loadingforce(:,1),'format','DoubleMat','mattype',1,'enum',LoadingforceXEnum);
+-			WriteData(fid,'data',obj.loadingforce(:,2),'format','DoubleMat','mattype',1,'enum',LoadingforceYEnum);
+-			WriteData(fid,'data',obj.loadingforce(:,3),'format','DoubleMat','mattype',1,'enum',LoadingforceZEnum);
++			WriteData(fid,'object',self,'class','snowpack','fieldname','spcvx','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','snowpack','fieldname','spcvy','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','snowpack','fieldname','spcvz','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','snowpack','fieldname','restol','format','Double');
++			WriteData(fid,'object',self,'class','snowpack','fieldname','reltol','format','Double');
++			WriteData(fid,'object',self,'class','snowpack','fieldname','abstol','format','Double');
++			WriteData(fid,'object',self,'class','snowpack','fieldname','isnewton','format','Integer');
++			WriteData(fid,'object',self,'class','snowpack','fieldname','FSreconditioning','format','Double');
++			WriteData(fid,'object',self,'class','snowpack','fieldname','viscosity_overshoot','format','Double');
++			WriteData(fid,'object',self,'class','snowpack','fieldname','maxiter','format','Integer');
++			WriteData(fid,'object',self,'class','snowpack','fieldname','shelf_dampening','format','Integer');
++			WriteData(fid,'object',self,'class','snowpack','fieldname','vertex_pairing','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'class','snowpack','fieldname','penalty_factor','format','Double');
++			WriteData(fid,'object',self,'class','snowpack','fieldname','rift_penalty_lock','format','Integer');
++			WriteData(fid,'object',self,'class','snowpack','fieldname','rift_penalty_threshold','format','Integer');
++			WriteData(fid,'object',self,'class','snowpack','fieldname','referential','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','snowpack','fieldname','requested_outputs','format','StringArray');
++			WriteData(fid,'data',self.loadingforce(:,1),'format','DoubleMat','mattype',1,'enum',LoadingforceXEnum);
++			WriteData(fid,'data',self.loadingforce(:,2),'format','DoubleMat','mattype',1,'enum',LoadingforceYEnum);
++			WriteData(fid,'data',self.loadingforce(:,3),'format','DoubleMat','mattype',1,'enum',LoadingforceZEnum);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/rifts.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/rifts.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/rifts.m	(revision 19040)
+@@ -9,35 +9,35 @@
+ 		riftproperties = NaN;
+ 	end
+ 	methods
+-        function createxml(obj,fid) % {{{
++        function createxml(self,fid) % {{{
+             fprintf(fid, '\n\n');
+             fprintf(fid, '%s\n', '<!-- rifts -->');
+-			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="riftstruct" type="',              class(obj.riftstruct),'" default="',                  obj.riftstruct,'">',              '     <section name="rifts" />','     <help> structure containing all rift information (vertices coordinates, segments, type of melange, ...) </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="riftproperties" type="',            class(obj.riftproperties),'" default="',                obj.riftproperties,'">',   '     <section name="rifts" />','     <help> N/A </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="riftstruct" type="',              class(self.riftstruct),'" default="',                  self.riftstruct,'">',              '     <section name="rifts" />','     <help> structure containing all rift information (vertices coordinates, segments, type of melange, ...) </help>','</parameter>');
++            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="riftproperties" type="',            class(self.riftproperties),'" default="',                self.riftproperties,'">',   '     <section name="rifts" />','     <help> N/A </help>','</parameter>');
+     
+         end % }}}
+-		function obj = rifts(varargin) % {{{
++		function self = rifts(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
+-			if isempty(obj.riftstruct) | isnans(obj.riftstruct),
++		function md = checkconsistency(self,md,solution,analyses) % {{{
++			if isempty(self.riftstruct) | isnans(self.riftstruct),
+ 				numrifts=0;
+ 			else
+-				numrifts=numel(obj.riftstruct);
++				numrifts=numel(self.riftstruct);
+ 			end
+ 			if numrifts,
+ 				if ~(strcmp(domaintype(md.mesh),'2Dhorizontal')),
+ 					md = checkmessage(md,['models with rifts are only supported in 2d for now!']);
+ 				end
+-				if ~isstruct(obj.riftstruct),
++				if ~isstruct(self.riftstruct),
+ 					md = checkmessage(md,['rifts.riftstruct should be a structure!']);
+ 				end
+ 				if ~isempty(find(md.mesh.segmentmarkers>=2)),
+@@ -48,42 +48,42 @@
+ 					md = checkfield(md,'fieldname',sprintf('rifts.riftstruct(%d).fill',i),'values',[WaterEnum() AirEnum() IceEnum() MelangeEnum()]);
+ 				end
+ 			else
+-				if ~isnans(obj.riftstruct),
++				if ~isnans(self.riftstruct),
+ 					md = checkmessage(md,['riftstruct should be NaN since numrifts is 0!']);
+ 				end
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   rifts parameters:'));
+ 
+-			fielddisplay(obj,'riftstruct','structure containing all rift information (vertices coordinates, segments, type of melange, ...)');
+-			fielddisplay(obj,'riftproperties','');
++			fielddisplay(self,'riftstruct','structure containing all rift information (vertices coordinates, segments, type of melange, ...)');
++			fielddisplay(self,'riftproperties','');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			%Process rift info
+-			if isempty(obj.riftstruct) | isnans(obj.riftstruct),
++			if isempty(self.riftstruct) | isnans(self.riftstruct),
+ 				numrifts=0;
+ 			else
+-				numrifts=numel(obj.riftstruct);
++				numrifts=numel(self.riftstruct);
+ 			end
+ 			numpairs=0;
+ 			for i=1:numrifts,
+-				numpairs=numpairs+size(obj.riftstruct(i).penaltypairs,1);
++				numpairs=numpairs+size(self.riftstruct(i).penaltypairs,1);
+ 			end
+ 
+ 			% 2 for nodes + 2 for elements+ 2 for  normals + 1 for length + 1 for fill + 1 for friction + 1 for fraction + 1 for fractionincrement + 1 for state.
+ 			data=zeros(numpairs,12);
+ 			count=1;
+ 			for i=1:numrifts,
+-				numpairsforthisrift=size(obj.riftstruct(i).penaltypairs,1);
+-				data(count:count+numpairsforthisrift-1,1:7)=obj.riftstruct(i).penaltypairs;
+-				data(count:count+numpairsforthisrift-1,8)=obj.riftstruct(i).fill;
+-				data(count:count+numpairsforthisrift-1,9)=obj.riftstruct(i).friction;
+-				data(count:count+numpairsforthisrift-1,10)=obj.riftstruct(i).fraction;
+-				data(count:count+numpairsforthisrift-1,11)=obj.riftstruct(i).fractionincrement;
+-				data(count:count+numpairsforthisrift-1,12)=obj.riftstruct(i).state;
++				numpairsforthisrift=size(self.riftstruct(i).penaltypairs,1);
++				data(count:count+numpairsforthisrift-1,1:7)=self.riftstruct(i).penaltypairs;
++				data(count:count+numpairsforthisrift-1,8)=self.riftstruct(i).fill;
++				data(count:count+numpairsforthisrift-1,9)=self.riftstruct(i).friction;
++				data(count:count+numpairsforthisrift-1,10)=self.riftstruct(i).fraction;
++				data(count:count+numpairsforthisrift-1,11)=self.riftstruct(i).fractionincrement;
++				data(count:count+numpairsforthisrift-1,12)=self.riftstruct(i).state;
+ 				count=count+numpairsforthisrift;
+ 			end
+ 
+Index: ../trunk-jpl/src/m/classes/SMBhenning.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/SMBhenning.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/SMBhenning.m	(revision 19040)
+@@ -8,7 +8,7 @@
+ 		smbref = NaN;
+ 	end
+ 	methods
+-		function obj = SMBhenning(varargin) % {{{
++		function self = SMBhenning(varargin) % {{{
+ 			switch nargin
+ 				case 0
+ 				otherwise
+@@ -28,7 +28,7 @@
+ 			end
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			if ismember(MasstransportAnalysisEnum(),analyses),
+ 				md = checkfield(md,'fieldname','surfaceforcings.smbref','timeseries',1,'NaN',1);
+@@ -37,16 +37,16 @@
+ 				md = checkfield(md,'fieldname','surfaceforcings.smbref','size',[md.mesh.numberofvertices 1],'NaN',1);
+ 			end
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   surface forcings parameters:'));
+-			fielddisplay(obj,'smbref','reference smb from which deviation is calculated [m/yr ice eq]');
++			fielddisplay(self,'smbref','reference smb from which deviation is calculated [m/yr ice eq]');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBhenningEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','smbref','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','smbref','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/seaiceatm.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/seaiceatm.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/seaiceatm.m	(revision 19040)
+@@ -13,28 +13,28 @@
+ 		wind_vy            = NaN;
+ 	end
+ 	methods
+-		function obj = seaiceatm(varargin) % {{{
++		function self = seaiceatm(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%air density (kg/m^3)
+-			obj.rho_air=1.3;
++			self.rho_air=1.3;
+ 
+ 			%By default, we apply the full stress
+-			obj.air_coef = 1.;
++			self.air_coef = 1.;
+ 
+ 			%drag coefficients (different from Hibler 0.0012)
+-			obj.air_lin_drag_coef  = 0.;
+-			obj.air_quad_drag_coef = 0.003;
++			self.air_lin_drag_coef  = 0.;
++			self.air_quad_drag_coef = 0.003;
+ 
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 			md = checkfield(md,'fieldname','surfaceforcings.rho_air','NaN',1,'>',0.,'numel',1);
+ 			md = checkfield(md,'fieldname','surfaceforcings.air_coef','NaN',1,'>=',0.,'<=',1,'numel',1);
+ 			md = checkfield(md,'fieldname','surfaceforcings.air_lin_drag_coef','NaN',1,'>=',0.,'numel',1);
+@@ -42,24 +42,24 @@
+ 			md = checkfield(md,'fieldname','surfaceforcings.wind_vx','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','surfaceforcings.wind_vy','NaN',1,'size',[md.mesh.numberofvertices 1]);
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   Atmospheric forcings for sea ice:'));
+ 			disp(sprintf('\n     tau_a = air_coef*rho_air*(air_lin_drag_coef+air_quad_drag_coef*|v_wind|)*v_wind\n'));
+-			fielddisplay(obj,'rho_air','air density [kg/m^3]');
+-			fielddisplay(obj,'air_coef','atmospheric stress spin up coefficient (between 0 and 1)');
+-			fielddisplay(obj,'air_lin_drag_coef','air linear drag coefficient (no unit)');
+-			fielddisplay(obj,'air_quad_drag_coef','air quadratic drag coefficient [s/m]');
+-			fielddisplay(obj,'wind_vx','wind speed x-component at 10 m elevation [m/s]');
+-			fielddisplay(obj,'wind_vy','wind speed y-component at 10 m elevation [m/s]');
++			fielddisplay(self,'rho_air','air density [kg/m^3]');
++			fielddisplay(self,'air_coef','atmospheric stress spin up coefficient (between 0 and 1)');
++			fielddisplay(self,'air_lin_drag_coef','air linear drag coefficient (no unit)');
++			fielddisplay(self,'air_quad_drag_coef','air quadratic drag coefficient [s/m]');
++			fielddisplay(self,'wind_vx','wind speed x-component at 10 m elevation [m/s]');
++			fielddisplay(self,'wind_vy','wind speed y-component at 10 m elevation [m/s]');
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 			WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SeaiceatmEnum(),'format','Integer');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','rho_air','format','Double');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','air_coef','format','Double');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','air_lin_drag_coef','format','Double');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','air_quad_drag_coef','format','Double');
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','wind_vx','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','wind_vy','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','rho_air','format','Double');
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','air_coef','format','Double');
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','air_lin_drag_coef','format','Double');
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','air_quad_drag_coef','format','Double');
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','wind_vx','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','wind_vy','format','DoubleMat','mattype',1);
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/spheremesh.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/spheremesh.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/spheremesh.m	(revision 19040)
+@@ -21,24 +21,24 @@
+ 		average_vertex_connectivity = 0;
+ 	end
+ 	methods
+-		function obj = spheremesh(varargin) % {{{
++		function self = spheremesh(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%the connectivity is the avergaded number of nodes linked to a
+ 			%given node through an edge. This connectivity is used to initially
+ 			%allocate memory to the stiffness matrix. A value of 16 seems to
+ 			%give a good memory/time ration. This value can be checked in
+ 			%trunk/test/Miscellaneous/runme.m
+-			obj.average_vertex_connectivity=25;
++			self.average_vertex_connectivity=25;
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			md = checkfield(md,'fieldname','spheremesh.x','NaN',1,'size',[md.spheremesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','spheremesh.y','NaN',1,'size',[md.spheremesh.numberofvertices 1]);
+@@ -56,41 +56,41 @@
+ 			md = checkfield(md,'fieldname','spheremesh.numberofvertices','>',0);
+ 			md = checkfield(md,'fieldname','spheremesh.elementconnectivity','size',[md.spheremesh.numberofelements 3],'NaN',1);
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   Mesh:')); 
+ 
+ 			disp(sprintf('\n      Elements and vertices:'));
+-			fielddisplay(obj,'numberofelements','number of elements');
+-			fielddisplay(obj,'numberofvertices','number of vertices');
+-			fielddisplay(obj,'elements','vertex indices of the mesh elements');
+-			fielddisplay(obj,'x','vertices x coordinate [m]');
+-			fielddisplay(obj,'y','vertices y coordinate [m]');
+-			fielddisplay(obj,'z','vertices z coordinate [m]');
+-			fielddisplay(obj,'r','vertices r coordinate [m]');
+-			fielddisplay(obj,'theta','vertices theta coordinate [degrees]');
+-			fielddisplay(obj,'phi','vertices phi coordinate [degrees]');
++			fielddisplay(self,'numberofelements','number of elements');
++			fielddisplay(self,'numberofvertices','number of vertices');
++			fielddisplay(self,'elements','vertex indices of the mesh elements');
++			fielddisplay(self,'x','vertices x coordinate [m]');
++			fielddisplay(self,'y','vertices y coordinate [m]');
++			fielddisplay(self,'z','vertices z coordinate [m]');
++			fielddisplay(self,'r','vertices r coordinate [m]');
++			fielddisplay(self,'theta','vertices theta coordinate [degrees]');
++			fielddisplay(self,'phi','vertices phi coordinate [degrees]');
+ 
+ 			disp(sprintf('\n      Properties:'));
+-			fielddisplay(obj,'numberoflayers','number of extrusion layers');
++			fielddisplay(self,'numberoflayers','number of extrusion layers');
+ 
+-			fielddisplay(obj,'vertexconnectivity','list of vertices connected to vertex_i');
+-			fielddisplay(obj,'elementconnectivity','list of vertices connected to element_i');
+-			fielddisplay(obj,'average_vertex_connectivity','average number of vertices connected to one vertex');
++			fielddisplay(self,'vertexconnectivity','list of vertices connected to vertex_i');
++			fielddisplay(self,'elementconnectivity','list of vertices connected to element_i');
++			fielddisplay(self,'average_vertex_connectivity','average number of vertices connected to one vertex');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
+-			WriteData(fid,'object',obj,'fieldname','x','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'fieldname','y','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'fieldname','z','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'fieldname','r','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'fieldname','theta','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'fieldname','phi','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',obj,'fieldname','elements','format','DoubleMat','mattype',2);
+-			WriteData(fid,'object',obj,'fieldname','numberoflayers','format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','numberofelements','format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','numberofvertices','format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','elementconnectivity','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'fieldname','average_vertex_connectivity','format','Integer');
++		function marshall(self,md,fid) % {{{
++			WriteData(fid,'object',self,'fieldname','x','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'fieldname','y','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'fieldname','z','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'fieldname','r','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'fieldname','theta','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'fieldname','phi','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',self,'fieldname','elements','format','DoubleMat','mattype',2);
++			WriteData(fid,'object',self,'fieldname','numberoflayers','format','Integer');
++			WriteData(fid,'object',self,'fieldname','numberofelements','format','Integer');
++			WriteData(fid,'object',self,'fieldname','numberofvertices','format','Integer');
++			WriteData(fid,'object',self,'fieldname','elementconnectivity','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'fieldname','average_vertex_connectivity','format','Integer');
+ 		end % }}}
+ 	end
+ end
+Index: ../trunk-jpl/src/m/classes/masscon.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/masscon.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/masscon.m	(revision 19040)
+@@ -18,47 +18,47 @@
+ 	end
+ 	
+ 	methods
+-		function obj = masscon(varargin) % {{{
++		function self = masscon(varargin) % {{{
+ 			if nargin==0,
+-				obj=setdefaultparameters(obj);
++				self=setdefaultparameters(self);
+ 			else
+ 				%use provided options to change fields
+ 				options=pairoptions(varargin{:});
+ 
+ 				%get name
+-				obj.name=getfieldvalue(options,'name','');
+-				obj.levelset=getfieldvalue(options,'levelset');
+-				obj.definitionenum=getfieldvalue(options,'definitionenum');
++				self.name=getfieldvalue(options,'name','');
++				self.levelset=getfieldvalue(options,'levelset');
++				self.definitionenum=getfieldvalue(options,'definitionenum');
+ 
+ 			end
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+-			if ~ischar(obj.name),
++			if ~ischar(self.name),
+ 				error('masscon error message: ''name'' field should be a string!');
+ 			end
+ 			
+-			md = checkfield(md,'fieldname','obj.definitionenum','field',obj.definitionenum,'values',[Outputdefinition1Enum,Outputdefinition2Enum,Outputdefinition3Enum,Outputdefinition4Enum,Outputdefinition5Enum,Outputdefinition6Enum,Outputdefinition7Enum,Outputdefinition8Enum,Outputdefinition9Enum,Outputdefinition10Enum]);
++			md = checkfield(md,'fieldname','self.definitionenum','field',self.definitionenum,'values',[Outputdefinition1Enum,Outputdefinition2Enum,Outputdefinition3Enum,Outputdefinition4Enum,Outputdefinition5Enum,Outputdefinition6Enum,Outputdefinition7Enum,Outputdefinition8Enum,Outputdefinition9Enum,Outputdefinition10Enum]);
+ 
+-			md = checkfield(md,'fieldname','obj.levelset','field',obj.levelset,'timeseries',1,'NaN',1);
++			md = checkfield(md,'fieldname','self.levelset','field',self.levelset,'timeseries',1,'NaN',1);
+ 
+ 		end % }}}
+-		function md = disp(obj) % {{{
++		function md = disp(self) % {{{
+ 		
+ 			disp(sprintf('   Misfit:\n'));
+ 
+-			fielddisplay(obj,'name','identifier for this masscon response');
+-			fielddisplay(obj,'definitionenum','enum that identifies this output definition uniquely, from Outputdefinition[1-10]Enum');
+-			fielddisplay(obj,'levelset','levelset vectorial field which identifies the boundaries of the masscon');
++			fielddisplay(self,'name','identifier for this masscon response');
++			fielddisplay(self,'definitionenum','enum that identifies this output definition uniquely, from Outputdefinition[1-10]Enum');
++			fielddisplay(self,'levelset','levelset vectorial field which identifies the boundaries of the masscon');
+ 
+ 		end % }}}
+-		function md = marshall(obj,md,fid) % {{{
++		function md = marshall(self,md,fid) % {{{
+ 
+-		WriteData(fid,'object',obj,'fieldname','name','format','String');
+-		WriteData(fid,'object',obj,'fieldname','definitionenum','format','Integer');
+-		WriteData(fid,'object',obj,'fieldname','levelset','format','DoubleMat','mattype',1);
++		WriteData(fid,'object',self,'fieldname','name','format','String');
++		WriteData(fid,'object',self,'fieldname','definitionenum','format','Integer');
++		WriteData(fid,'object',self,'fieldname','levelset','format','DoubleMat','mattype',1);
+ 
+ 		end % }}}
+ 	end
+Index: ../trunk-jpl/src/m/classes/masstransport.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/masstransport.m	(revision 19039)
++++ ../trunk-jpl/src/m/classes/masstransport.m	(revision 19040)
+@@ -15,7 +15,7 @@
+ 		 requested_outputs      = {};
+ 	end
+ 	methods (Static)
+-		function obj = loadobj(obj) % {{{
++		function self = loadobj(self) % {{{
+ 			% This function is directly called by matlab when a model object is
+ 			% loaded. If the input is a struct it is an old version of this class and
+ 			% old fields must be recovered (make sure they are in the deprecated
+@@ -33,18 +33,17 @@
+ 				% This has been fixed in MATLAB 7.9 (R2009b) and later versions
+ 			end
+ 
+-			if isstruct(obj)
++			if isstruct(self)
+ 				disp('Recovering masstransport from older version');
+-				objstruct = obj;
+-				obj = structtoobj(masstransport(),objstruct);
++				self = structtoobj(masstransport(),self);
+ 			end
+ 		end% }}}
+ 	end
+ 	methods
+-		function obj = masstransport(varargin) % {{{
++		function self = masstransport(varargin) % {{{
+ 			switch nargin
+ 				case 0
+-					obj=setdefaultparameters(obj);
++					self=setdefaultparameters(self);
+ 				case 1
+ 					inputstruct=varargin{1};
+ 					list1 = properties('masstransport');
+@@ -52,7 +51,7 @@
+ 					for i=1:length(list1)
+ 						fieldname = list1{i};
+ 						if ismember(fieldname,list2),
+-							obj.(fieldname) = inputstruct.(fieldname);
++							self.(fieldname) = inputstruct.(fieldname);
+ 						end
+ 					end
+ 				otherwise
+@@ -64,24 +63,24 @@
+ 			list = {'Thickness','Surface','Base'};
+ 
+ 		end % }}}
+-		function obj = setdefaultparameters(obj) % {{{
++		function self = setdefaultparameters(self) % {{{
+ 
+ 			%Type of stabilization to use 0:nothing 1:artificial_diffusivity 3:Discontinuous Galerkin
+-			obj.stabilization=1;
++			self.stabilization=1;
+ 
+ 			%Factor applied to compute the penalties kappa=max(stiffness matrix)*10^penalty_factor
+-			obj.penalty_factor=3;
++			self.penalty_factor=3;
+ 
+ 			%Minimum ice thickness that can be used
+-			obj.min_thickness=1;
++			self.min_thickness=1;
+ 
+ 			%Hydrostatic adjustment
+-			obj.hydrostatic_adjustment='Absolute';
++			self.hydrostatic_adjustment='Absolute';
+ 
+ 			%default output
+-			obj.requested_outputs={'default'};
++			self.requested_outputs={'default'};
+ 		end % }}}
+-		function md = checkconsistency(obj,md,solution,analyses) % {{{
++		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+ 			%Early return
+ 			if ~ismember(MasstransportAnalysisEnum(),analyses) |  (solution==TransientSolutionEnum() & md.transient.ismasstransport==0), return; end
+@@ -94,38 +93,38 @@
+ 			md = checkfield(md,'fieldname','masstransport.requested_outputs','stringrow',1);
+ 
+ 		end % }}}
+-		function disp(obj) % {{{
++		function disp(self) % {{{
+ 			disp(sprintf('   Masstransport solution parameters:'));
+-			fielddisplay(obj,'spcthickness','thickness constraints (NaN means no constraint) [m]');
+-			fielddisplay(obj,'isfreesurface','do we use free surfaces (FS only) are mass conservation');
+-			fielddisplay(obj,'min_thickness','minimum ice thickness allowed [m]');
+-			fielddisplay(obj,'hydrostatic_adjustment','adjustment of ice shelves surface and bed elevations: ''Incremental'' or ''Absolute'' ');
+-			fielddisplay(obj,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding, 3: discontinuous Galerkin, 4: Flux Correction Transport');
++			fielddisplay(self,'spcthickness','thickness constraints (NaN means no constraint) [m]');
++			fielddisplay(self,'isfreesurface','do we use free surfaces (FS only) are mass conservation');
++			fielddisplay(self,'min_thickness','minimum ice thickness allowed [m]');
++			fielddisplay(self,'hydrostatic_adjustment','adjustment of ice shelves surface and bed elevations: ''Incremental'' or ''Absolute'' ');
++			fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: streamline upwinding, 3: discontinuous Galerkin, 4: Flux Correction Transport');
+ 
+ 			disp(sprintf('\n      %s','Penalty options:'));
+-			fielddisplay(obj,'penalty_factor','offset used by penalties: penalty = Kmax*10^offset');
+-			fielddisplay(obj,'vertex_pairing','pairs of vertices that are penalized');
+-			fielddisplay(obj,'requested_outputs','additional outputs requested');
++			fielddisplay(self,'penalty_factor','offset used by penalties: penalty = Kmax*10^offset');
++			fielddisplay(self,'vertex_pairing','pairs of vertices that are penalized');
++			fielddisplay(self,'requested_outputs','additional outputs requested');
+ 
+ 		end % }}}
+-		function marshall(obj,md,fid) % {{{
++		function marshall(self,md,fid) % {{{
+ 
+ 			yts=365.*24.*3600.;
+ 
+-			WriteData(fid,'object',obj,'fieldname','spcthickness','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+-			WriteData(fid,'object',obj,'fieldname','isfreesurface','format','Boolean');
+-			WriteData(fid,'object',obj,'fieldname','min_thickness','format','Double');
+-			WriteData(fid,'data',StringToEnum(obj.hydrostatic_adjustment),'format','Integer','enum',MasstransportHydrostaticAdjustmentEnum());
+-			WriteData(fid,'object',obj,'fieldname','stabilization','format','Integer');
+-			WriteData(fid,'object',obj,'fieldname','vertex_pairing','format','DoubleMat','mattype',3);
+-			WriteData(fid,'object',obj,'fieldname','penalty_factor','format','Double');
++			WriteData(fid,'object',self,'fieldname','spcthickness','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
++			WriteData(fid,'object',self,'fieldname','isfreesurface','format','Boolean');
++			WriteData(fid,'object',self,'fieldname','min_thickness','format','Double');
++			WriteData(fid,'data',StringToEnum(self.hydrostatic_adjustment),'format','Integer','enum',MasstransportHydrostaticAdjustmentEnum());
++			WriteData(fid,'object',self,'fieldname','stabilization','format','Integer');
++			WriteData(fid,'object',self,'fieldname','vertex_pairing','format','DoubleMat','mattype',3);
++			WriteData(fid,'object',self,'fieldname','penalty_factor','format','Double');
+ 			
+ 			%process requested outputs
+-			outputs = obj.requested_outputs;
++			outputs = self.requested_outputs;
+ 			pos  = find(ismember(outputs,'default'));
+ 			if ~isempty(pos),
+ 				outputs(pos) = [];                         %remove 'default' from outputs
+-				outputs      = [outputs defaultoutputs(obj,md)]; %add defaults
++				outputs      = [outputs defaultoutputs(self,md)]; %add defaults
+ 			end
+ 			WriteData(fid,'data',outputs,'enum',MasstransportRequestedOutputsEnum,'format','StringArray');
+ 		end % }}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-19040-19041.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19040-19041.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19040-19041.diff	(revision 19102)
@@ -0,0 +1,57 @@
+Index: ../trunk-jpl/src/m/classes/m1qn3inversion.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/m1qn3inversion.py	(revision 19040)
++++ ../trunk-jpl/src/m/classes/m1qn3inversion.py	(revision 19041)
+@@ -23,6 +23,7 @@
+ 			self.iscontrol                   = 0
+ 			self.incomplete_adjoint          = 0
+ 			self.control_parameters          = float('NaN')
++			self.control_scaling_factors     = float('NaN')
+ 			self.maxsteps                    = 0
+ 			self.maxiter                     = 0
+ 			self.dxmin                       = 0.
+@@ -42,6 +43,10 @@
+ 		elif len(args)==1 and args[0].__module__=='inversion':
+ 			print 'converting inversion to m1qn3inversion'
+ 			inv=args[0]
++			#first call setdefaultparameters: 
++			self.setdefaultparameters()
++
++			#then go fish whatever is available in the inversion object provided to the constructor
+ 			self.iscontrol                   = inv.iscontrol
+ 			self.incomplete_adjoint          = inv.incomplete_adjoint
+ 			self.control_parameters          = inv.control_parameters
+@@ -63,6 +68,7 @@
+ 		string="%s\n%s"%(string,fielddisplay(self,'iscontrol','is inversion activated?'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'incomplete_adjoint','1: linear viscosity, 0: non-linear viscosity'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'control_parameters','ex: [''FrictionCoefficient''], or [''MaterialsRheologyBbar'']'))
++		string="%s\n%s"%(string,fielddisplay(self,'control_scaling_factors','order of magnitude of each control (useful for multi-parameter optimization)'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'maxsteps','maximum number of iterations (gradient computation)'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'maxiter','maximum number of Function evaluation (forward run)'))
+ 		string="%s\n%s"%(string,fielddisplay(self,'dxmin','convergence criterion: two points less than dxmin from eachother (sup-norm) are considered identical'))
+@@ -95,6 +101,9 @@
+ 		#parameter to be inferred by control methods (only
+ 		#drag and B are supported yet)
+ 		self.control_parameters='FrictionCoefficient'
++		
++		#Scaling factor for each control
++		self.control_scaling_factors=1
+ 
+ 		#number of iterations
+ 		self.maxsteps=20
+@@ -121,6 +130,7 @@
+ 		md = checkfield(md,'fieldname','inversion.iscontrol','values',[0,1])
+ 		md = checkfield(md,'fieldname','inversion.incomplete_adjoint','values',[0,1])
+ 		md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',supportedcontrols())
++		md = checkfield(md,'fieldname','inversion.control_scaling_factors','size',[num_controls],'>',0,'NaN',1)
+ 		md = checkfield(md,'fieldname','inversion.maxsteps','numel',[1],'>=',0)
+ 		md = checkfield(md,'fieldname','inversion.maxiter','numel',[1],'>=',0)
+ 		md = checkfield(md,'fieldname','inversion.dxmin','numel',[1],'>',0.)
+@@ -147,6 +157,7 @@
+ 		if not self.iscontrol:
+ 			return
+ 		WriteData(fid,'object',self,'class','inversion','fieldname','incomplete_adjoint','format','Boolean')
++		WriteData(fid,'object',self,'class','inversion','fieldname','control_scaling_factors','format','DoubleMat','mattype',3)
+ 		WriteData(fid,'object',self,'class','inversion','fieldname','maxsteps','format','Integer')
+ 		WriteData(fid,'object',self,'class','inversion','fieldname','maxiter','format','Integer')
+ 		WriteData(fid,'object',self,'class','inversion','fieldname','dxmin','format','Double')
Index: /issm/oecreview/Archive/18296-19100/ISSM-19041-19042.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19041-19042.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19041-19042.diff	(revision 19102)
@@ -0,0 +1,78 @@
+Index: ../trunk-jpl/src/m/classes/frictionwaterlayer.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionwaterlayer.m	(revision 19041)
++++ ../trunk-jpl/src/m/classes/frictionwaterlayer.m	(revision 19042)
+@@ -16,7 +16,7 @@
+ 				case 0
+ 					self=setdefaultparameters(self);
+ 				case 1
+-					obj=structtoobj(frictionwaterlayer(),varargin{1});
++					self=structtoobj(frictionwaterlayer(),varargin{1});
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+Index: ../trunk-jpl/src/m/classes/linearbasalforcings.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/linearbasalforcings.m	(revision 19041)
++++ ../trunk-jpl/src/m/classes/linearbasalforcings.m	(revision 19042)
+@@ -24,7 +24,7 @@
+ 				case 0
+ 					self=setdefaultparameters(self);
+ 				case 1
+-					obj=structtoobj(linearbasalforcings(),varargin{1});
++					self=structtoobj(linearbasalforcings(),varargin{1});
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+Index: ../trunk-jpl/src/m/classes/frictiontemp.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictiontemp.m	(revision 19041)
++++ ../trunk-jpl/src/m/classes/frictiontemp.m	(revision 19042)
+@@ -16,7 +16,7 @@
+ 				case 0
+ 					self=setdefaultparameters(self);
+ 				case 1
+-					obj=structtoobj(frictiontemp(),varargin{1});
++					self=structtoobj(frictiontemp(),varargin{1});
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+Index: ../trunk-jpl/src/m/classes/adinversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/adinversion.m	(revision 19041)
++++ ../trunk-jpl/src/m/classes/adinversion.m	(revision 19042)
+@@ -30,7 +30,7 @@
+ 				case 0
+ 					self=setdefaultparameters(self);
+ 				case 1
+-					obj=structtoobj(adinversion(),varargin{1});
++					self=structtoobj(adinversion(),varargin{1});
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+Index: ../trunk-jpl/src/m/classes/inversionvalidation.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 19041)
++++ ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 19042)
+@@ -26,7 +26,7 @@
+ 				case 0
+ 					self=setdefaultparameters(self);
+ 				case 1
+-					obj=structtoobj(inversionvalidation(),varargin{1});
++					self=structtoobj(inversionvalidation(),varargin{1});
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
+Index: ../trunk-jpl/src/m/classes/hydrologyshreve.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologyshreve.m	(revision 19041)
++++ ../trunk-jpl/src/m/classes/hydrologyshreve.m	(revision 19042)
+@@ -25,7 +25,7 @@
+ 				case 0
+ 					self=setdefaultparameters(self);
+ 				case 1
+-					obj=structtoobj(self,varargin{1});
++					self=structtoobj(self,varargin{1});
+ 				otherwise
+ 					error('constructor not supported');
+ 			end
Index: /issm/oecreview/Archive/18296-19100/ISSM-19042-19043.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19042-19043.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19042-19043.diff	(revision 19102)
@@ -0,0 +1,366 @@
+Index: ../trunk-jpl/examples/Pig/Pig.par
+===================================================================
+--- ../trunk-jpl/examples/Pig/Pig.par	(revision 19042)
++++ ../trunk-jpl/examples/Pig/Pig.par	(revision 19043)
+@@ -6,7 +6,7 @@
+ md.miscellaneous.name='PIG';
+ md.mesh.hemisphere='s';
+ 
+-% {{{ NetCdf Loading
++%NetCdf Loading
+ disp('   Loading SeaRISE data from NetCDF');
+ ncdata='../Data/Antarctica_5km_withshelves_v0.75.nc';
+ x1    = ncread(ncdata,'x1');
+@@ -46,8 +46,8 @@
+ 
+ y2=(ymax-ny*spacing)+(0:1:ny)'*spacing; 
+ y2=double(y2);
+-% }}}
+-% {{{ Geometry
++
++%Geometry
+ disp('   Interpolating surface and ice base');
+ md.geometry.base    = InterpFromGridToMesh(x1,y1,topg,md.mesh.x,md.mesh.y,0);
+ md.geometry.surface = InterpFromGridToMesh(x1,y1,usrf,md.mesh.x,md.mesh.y,0);
+@@ -72,8 +72,8 @@
+ pos0=find(md.geometry.thickness<=0);
+ md.geometry.thickness(pos0)=1;
+ md.geometry.surface=md.geometry.thickness+md.geometry.base;
+-% }}} 
+-% {{{ Initialization parameters
++
++%Initialization parameters
+ disp('   Interpolating temperatures');
+ md.initialization.temperature=InterpFromGridToMesh(x1,y1,temp,md.mesh.x,md.mesh.y,0)+273.15+Temp_change;
+ clear temp;
+@@ -92,13 +92,11 @@
+ disp('   Set Pressure');
+ md.initialization.pressure=md.materials.rho_ice*md.constants.g*md.geometry.thickness;
+ 
+-% }}}
+-
+ disp('   Construct ice rheological properties');
+ md.materials.rheology_n=3*ones(md.mesh.numberofelements,1);
+ md.materials.rheology_B=paterson(md.initialization.temperature);
+ 
+-% {{{ Forcings
++%Forcings
+ disp('   Interpolating surface mass balance');
+ md.surfaceforcings.mass_balance=InterpFromGridToMesh(x1,y1,smb,md.mesh.x,md.mesh.y,0);
+ md.surfaceforcings.mass_balance=md.surfaceforcings.mass_balance*md.materials.rho_water/md.materials.rho_ice;
+@@ -107,9 +105,8 @@
+ disp('   Set geothermal heat flux');
+ md.basalforcings.geothermalflux=InterpFromGridToMesh(x1,y1,gflux,md.mesh.x,md.mesh.y,0);
+ clear gflux;
+-% }}}
+ 
+-% {{{ Friction and inversion set up
++%Friction and inversion set up
+ disp('   Construct basal friction parameters');
+ md.friction.coefficient=friction_coefficient*ones(md.mesh.numberofvertices,1);
+ md.friction.p=ones(md.mesh.numberofelements,1);
+@@ -123,13 +120,10 @@
+ md.inversion.vx_obs=vx_obs;
+ md.inversion.vy_obs=vy_obs;
+ md.inversion.vel_obs=vel_obs;
+-% }}}
+ 
+-
+ disp('   Set boundary conditions');
+ md=SetMarineIceSheetBC(md);
+ md.basalforcings.floatingice_melting_rate = zeros(md.mesh.numberofvertices,1);
+ md.basalforcings.groundedice_melting_rate = zeros(md.mesh.numberofvertices,1);
+ md.thermal.spctemperature     = [md.initialization.temperature;1]; %impose observed temperature on surface
+ md.masstransport.spcthickness    = NaN*ones(md.mesh.numberofvertices,1);
+-
+Index: ../trunk-jpl/examples/Pig/runme.m
+===================================================================
+--- ../trunk-jpl/examples/Pig/runme.m	(revision 19042)
++++ ../trunk-jpl/examples/Pig/runme.m	(revision 19043)
+@@ -3,7 +3,7 @@
+ 
+ %Run Steps
+ 
+-% {{{ Mesh Generation #1
++%Mesh Generation #1
+ if any(steps==1)
+ 
+ 	md.miscellaneous.name='PIG.Mesh_generation';
+@@ -72,9 +72,8 @@
+ 	% Save model
+ 	save ./Models/PIG.Mesh_generation md;
+ end
+-% }}}
+ 
+-% {{{ Masks #2
++%Masks #2
+ if any(steps==2) 
+ 
+ 	md = loadmodel('./Models/PIG.Mesh_generation');	
+@@ -103,9 +102,8 @@
+ 	% Save model
+ 	save ./Models/PIG.SetMask md;
+ end
+-% }}}
+ 
+-% {{{ Parameterization #3
++%Parameterization #3
+ if any(steps==3) 
+ 
+ 	md = loadmodel('./Models/PIG.SetMask');
+@@ -117,9 +115,8 @@
+ 	% Save model
+ 	save ./Models/PIG.Parameterization md;
+ end
+-% }}}
+ 
+-% {{{ Control Method #4
++%Control Method #4
+ if any(steps==4)
+ 
+ 	md = loadmodel('./Models/PIG.Parameterization');
+@@ -162,9 +159,8 @@
+ 	% Save model
+ 	save ./Models/PIG.Control_drag md;
+ end
+-% }}}
+ 
+-% {{{ Plot #5
++%Plot #5
+ if any(steps==5)
+ 
+ 	md = loadmodel('./Models/PIG.Control_drag');
+@@ -181,9 +177,8 @@
+ 		'caxis#1-2',([1.5,4000]),...
+ 		'colorbartitle#3','[m]', 'log#1-2',10);
+ end
+-% }}}
+ 
+-% {{{ HO #6
++%HO #6
+ if any(steps==6)
+ 
+ 	% Load Model
+@@ -199,9 +194,8 @@
+ 	% Save Model
+ 
+ end
+-% }}}
+ 
+-% {{{ Plot #7
++%Plot #7
+ if any(steps==7)
+ 
+ 	mdHO = loadmodel('./Models/PIG.ModelHO');
+@@ -225,4 +219,3 @@
+ 						'colorbartitle#all','[m/yr]',...
+ 						'layer#5',1, 'log#1', 10,'log#3', 10,'log#5', 10);
+ end
+-% }}}
+Index: ../trunk-jpl/examples/Pig/PigRegion.m
+===================================================================
+--- ../trunk-jpl/examples/Pig/PigRegion.m	(revision 19042)
++++ ../trunk-jpl/examples/Pig/PigRegion.m	(revision 19043)
+@@ -1,4 +1,4 @@
+-% {{{ Getting the velocity in PIG vicinity for the ExpDraw
++%Getting the velocity in PIG vicinity for the ExpDraw
+ 
+ % Load Velocities
+ % http://nsidc.org/data/nsidc-0484.html
+@@ -50,5 +50,3 @@
+ yred=y(id1y:id2y);
+ vel_obs=sqrt(vx_obs.^2.+vy_obs.^2.);
+ imagesc(xred,yred,vel_obs)
+-
+-%}}}
+Index: ../trunk-jpl/examples/ISMIP/CheatyRunme.m
+===================================================================
+--- ../trunk-jpl/examples/ISMIP/CheatyRunme.m	(revision 19042)
++++ ../trunk-jpl/examples/ISMIP/CheatyRunme.m	(revision 19043)
+@@ -9,7 +9,7 @@
+ 
+ %Run Steps
+ 
+-% {{{ Mesh Generation #1
++%Mesh Generation #1
+ if any(steps==1)
+ 
+ 	%initialize md as a new model #help model
+@@ -30,9 +30,8 @@
+ 	%->
+ 	save ./Models/ISMIP.Mesh_generation md;
+ end
+-% }}}
+ 
+-% {{{ Masks #2
++%Masks #2
+ if any(steps==2)
+ 
+ 	% load the preceding step #help loadmodel
+@@ -50,9 +49,8 @@
+ 	%->
+ 	save ./Models/ISMIP.SetMask md;
+ end
+-% }}}
+ 
+-% {{{ Parameterization #3
++%Parameterization #3
+ if any(steps==3)
+ 
+ 	% load the preceding step #help loadmodel
+@@ -68,9 +66,8 @@
+ 	%->
+ 	save ./Models/ISMIP.Parameterization md;
+ end
+-% }}}
+ 
+-% {{{ Extrusion #4
++%Extrusion #4
+ if any(steps==4)
+ 	
+ 	% load the preceding step #help loadmodel
+@@ -88,9 +85,8 @@
+ 	%->
+ 	save ./Models/ISMIP.Extrusion md;
+ end
+-% }}}
+ 
+-% {{{ Set the flow computing method #5
++%Set the flow computing method #5
+ if any(steps==5)
+ 
+ 	% load the preceding step #help loadmodel
+@@ -105,9 +101,8 @@
+ 	%->
+ 	save ./Models/ISMIP.SetFlow md;
+ end
+-% }}}
+ 
+-% {{{ Set Boundary Conditions #6
++%Set Boundary Conditions #6
+ if any(steps==6)
+ 
+ 	% load the preceding step #help loadmodel
+@@ -160,9 +155,8 @@
+ 	%->
+ 	save ./Models/ISMIP.BoundaryCondition md;
+ end
+-% }}}
+ 
+-% {{{ Solving #7
++%Solving #7
+ if any(steps==7)
+ 	% load the preceding step #help loadmodel
+ 	% path is given by the organizer with the name of the given step
+@@ -187,9 +181,8 @@
+ 	%->
+ 	plotmodel(md,'data',md.results.StressbalanceSolution.Vel)
+ end
+-% }}}
+ 
+-% {{{ Solving #8
++%Solving #8
+ if any(steps==8)
+ 	% load the preceding step #help loadmodel
+ 	% path is given by the organizer with the name of the given step
+@@ -226,4 +219,3 @@
+ 	%->
+ 	plotmodel(md,'data',md.results.TransientSolution(20).Vel)
+ end
+-% }}}
+Index: ../trunk-jpl/examples/ISMIP/runme.m
+===================================================================
+--- ../trunk-jpl/examples/ISMIP/runme.m	(revision 19042)
++++ ../trunk-jpl/examples/ISMIP/runme.m	(revision 19043)
+@@ -9,7 +9,7 @@
+ 
+ %Run Steps
+ 
+-% {{{ Mesh Generation #1
++%Mesh Generation #1
+ if any(steps==1) 
+ 
+ 	%initialize md as a new model #help model
+@@ -26,9 +26,8 @@
+ 	%->
+ 
+ end
+-% }}}
+ 
+-% {{{ Masks #2
++%Masks #2
+ if any(steps==2) 
+ 
+ 	% load the preceding step #help loadmodel
+@@ -46,9 +45,8 @@
+ 	%->
+ 
+ end
+-% }}}
+ 
+-% {{{ Parameterization #3
++%Parameterization #3
+ if any(steps==3) 
+ 
+ 	% load the preceding step #help loadmodel
+@@ -64,9 +62,8 @@
+ 	%->
+ 
+ end
+-% }}}
+ 
+-% {{{ Extrusion #4
++%Extrusion #4
+ if any(steps==4)
+ 	
+ 	% load the preceding step #help loadmodel
+@@ -84,10 +81,8 @@
+ 	%->
+ 
+ end
+-% }}}
+ 
+-% {{{ Set the flow computing method #5
+-
++%Set the flow computing method #5
+ if any(steps==5)
+ 
+ 	% load the preceding step #help loadmodel
+@@ -102,9 +97,8 @@
+ 	%->
+ 
+ end
+-% }}}
+ 
+-% {{{ Set Boundary Conditions #6
++%Set Boundary Conditions #6
+ if any(steps==6)
+ 
+ 	% load the preceding step #help loadmodel
+@@ -156,9 +150,8 @@
+ 	%->
+ 
+ end
+-% }}}
+ 
+-% {{{ Solving #7
++%Solving #7
+ if any(steps==7)
+ 	% load the preceding step #help loadmodel
+ 	% path is given by the organizer with the name of the given step
+@@ -182,9 +175,8 @@
+ 	% plot the surface velocities #plotdoc
+ 	%->
+ end
+-% }}}
+ 
+-% {{{ Solving #8
++%Solving #8
+ if any(steps==8)
+ 	% load the preceding step #help loadmodel
+ 	% path is given by the organizer with the name of the given step
+@@ -221,4 +213,3 @@
+ 	%->
+ 
+ end
+-% }}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-19043-19044.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19043-19044.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19043-19044.diff	(revision 19102)
@@ -0,0 +1,279 @@
+Index: ../trunk-jpl/src/m/plot/writejsfile.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/writejsfile.py	(revision 19043)
++++ ../trunk-jpl/src/m/plot/writejsfile.py	(revision 19044)
+@@ -1,3 +1,4 @@
++from writejsfield import writejsfield
+ def writejsfile(filename,model,keyname):
+ #WRITEJSFILE - write model file to javascript database
+ #
+@@ -6,23 +7,22 @@
+ #
+ 
+ 	nods=len(model.x)
+-	nel=len(model.index[1])
++	nel=len(model.index)
+ 	nx=len(model.contourx1)
+-	
+-	fid=open(filename,'w')
++	print(filename)	
++	fid=open(filename,'w', 0)
+ 
+ 	fid.write('model = {};\n')
+ 	fid.write('model["title"]="{0}";\n'.format(model.title))
+ 	fid.write('model["initialZoomFactor"]={0};\n'.format(model.initialZoomFactor))
+-	
+ 	#write index:
+ 	fid.write('<!-- model["index"]{{{-->\n')
+ 	fid.write('model["index"]=[')
+-	for i in xrange(1,nel-1):
+-		fid.write('[{0}, {1}, {2}],'.format(model.index[i][1],model.index[i][2],model.index[i][3]))
+-	fid.write('[{0}, {1}, {2}]];\n'.format(model.index[-1][1],model.index[-1][2],model.index[-1][3]))
++	for i in xrange(1, nel-1):
++		fid.write('[{0}, {1}, {2}],'.format(model.index[i][0],model.index[i][1],model.index[i][2]))
++	fid.write('[{0}, {1}, {2}]];\n'.format(model.index[-1][0],model.index[-1][1],model.index[-1][2]))
+ 	fid.write('<!--}}}-->\n')
+-	
++	print('writing model coordinates')
+ 	writejsfield(fid,'model["x"]',model.x,nods)
+ 	writejsfield(fid,'model["y"]',model.y,nods)
+ 	writejsfield(fid,'model["z"]',model.z,nods)
+@@ -34,7 +34,7 @@
+ 	writejsfield(fid,'model["contoury2"]',model.contoury2,nx)
+ 	writejsfield(fid,'model["contourz2"]',model.contourz2,nx)
+ 
+-
++	print('writing results')
+ 	results=model.results
+ 	fid.write('results={};\n')
+ 
+@@ -42,12 +42,12 @@
+ 		fid.write('result={};\n')
+ 		writejsfield(fid,'result["data"]',results[i].data,nods)
+ 		fid.write('<!--{{{-->\n')
+-		fid.write('result["caxis"]=[{0},{1}];\n'.format(results[i].caxis[1],results[i].caxis[2]))
++		fid.write('result["caxis"]=[{0},{1}];\n'.format(results[i].caxis[0],results[i].caxis[1]))
+ 		fid.write('result["label"]="{0}";\n'.format(results[i].label))
+ 		fid.write('result["shortlabel"]="{0}";\n'.format(results[i].shortlabel))
+ 		fid.write('result["unit"]="{0}";\n'.format(results[i].unit))
+ 		if len(results[i].data[2])>1:
+-			fid.write('result["time_range"]=[{0},{1}];\n'.format(results[i].time_range[1],results[i].time_range[2]))
++			fid.write('result["time_range"]=[{0},{1}];\n'.format(results[i].time_range[0],results[i].time_range[1]))
+ 		fid.write('results["{0}"]=result;\n'.format(i))
+ 		fid.write('<!--}}}-->\n')
+ 	fid.write('model.results=results;\n')
+Index: ../trunk-jpl/src/m/plot/writejsfield.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/writejsfield.py	(revision 19043)
++++ ../trunk-jpl/src/m/plot/writejsfield.py	(revision 19044)
+@@ -5,20 +5,21 @@
+ #      writejsfield(fid,name,variable)
+ #
+ 	#write array:
+-	if len(variable[2])==1:
+-		fid.write('<!-- {0}{{{-->\n'.format(name))
++	#if not isinstance(variable, list):
++	if True:
++		fid.write('<!-- {0}{{{{{{-->\n'.format(name))
+ 		fid.write('{0}=['.format(name))
+ 		for i in xrange(1, nods-1):
+-			fid.write('{0},',variable[i])
+-		fid.write('{0}];\n',variable[-1])
+-		fid.write('<!--}}}-->\n')
++			fid.write('{0},'.format(variable[i]))
++		fid.write('{0}];\n'.format(variable[-1]))
++		fid.write('<!--}}}}}}-->\n')
+ 	else:
+ 		#multi-sized array: 
+-		fid.write('<!-- {0}{{{-->\n'.format(name))
++		fid.write('<!-- {0}{{{{{{-->\n'.format(name))
+ 		fid.write('{0}=[]\n'.format(name))
+ 		for i in xrange(1, len(variable[2])):
+ 			fid.write('{0}["{1}"]=['.format(name,i))
+ 			for j in xrange(1, nods-1):
+-				fid.write('{0},'.format(variable[j,i]))
+-			fid.write('{0}];\n'.format(variable[-1,i]))
+-		fid.write('<!--}}}-->\n')
++				fid.write('{0},'.format(variable[j][i]))
++			fid.write('{0}];\n'.format(variable[-1][i]))
++		fid.write('<!--}}}}}}-->\n')
+Index: ../trunk-jpl/src/m/plot/export_gl.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/export_gl.py	(revision 19043)
++++ ../trunk-jpl/src/m/plot/export_gl.py	(revision 19044)
+@@ -1,47 +1,61 @@
+-def export_gl(md,varargin):
+-	return;
+-	templist=plotoptions(varargin[:]); 
++from plotoptions import plotoptions
++from checkplotoptions import checkplotoptions
++from model import model
++import numpy as np
++import math
++from writejsfile import writejsfile
++
++def export_gl(md,*varargin):
++	class ResultObj(object):
++	    def __getattr__(self, attr):
++		return self.__dict__.get(attr)
++	print ('getting options')
++	templist=plotoptions(varargin); 
+ 	optionslist=templist.list;
+ 	options=optionslist[1];
+ 	options=checkplotoptions(md,options);
+-
++	
+ 	#Setup unique directory in present dir: 
+-	directory=getfieldvalue(options,'directory','./');
+-	databasename=getfieldvalue(options,'database','webgl');
+-
++	print ('setting directory')
++	directory=options.getfieldvalue('directory','./');
++	databasename=options.getfieldvalue('database','Pig');
++	print(directory +databasename)	
+ 	#scaling factor: 
+-	scaling_factor=getfieldvalue(options,'scaling_factor',50);
++	print ('setting scaling factor')
++	scaling_factor=options.getfieldvalue('scaling_factor',50);
+ 
+ 	#Deal with title: 
+-	if options['title']:
+-		title=getfieldvalue(options,'title');
++	print ('setting title')
++	if options.exist('title'):
++		title=options.getfieldvalue('title');
+ 	else:
+ 		title='';
+ 
+ 	#initialize model: 
++	print ('initializing model')
+ 	model.title=title;
+-	model.initialZoomFactor=getfieldvalue(options,'zoom',-.25);
++	model.initialZoomFactor=options.getfieldvalue('zoom',-.25);
+ 
+ 	#Deal with contour {{{
+-	contour_lat1=md.mesh.lat(md.mesh.segments[:,1]);
+-	contour_lat2=md.mesh.lat(md.mesh.segments[:,2]);
+-	contour_long1=md.mesh.long(md.mesh.segments[:,1]);
+-	contour_long2=md.mesh.long(md.mesh.segments[:,2]);
+-	contour_surface1=md.geometry.surface(md.mesh.segments[:,1]);
+-	contour_surface2=md.geometry.surface(md.mesh.segments[:,2]);
++	print ('getting contour')
++	contour_lat1=md.mesh.lat.take(md.mesh.segments[:,0])
++	contour_lat2=md.mesh.lat.take(md.mesh.segments[:,1]);
++	contour_long1=md.mesh.long.take(md.mesh.segments[:,0]);
++	contour_long2=md.mesh.long.take(md.mesh.segments[:,1]);
++	contour_surface1=md.geometry.surface.take(md.mesh.segments[:,0]);
++	contour_surface2=md.geometry.surface.take(md.mesh.segments[:,1]);
+ 
+-	R1=6371000*ones(len(contour_surface1),1)+scaling_factor*contour_surface1;
+-	R2=6371000*ones(len(contour_surface2),1)+scaling_factor*contour_surface2;
++	R1=6371000*np.ones(len(contour_surface1))+scaling_factor*contour_surface1;
++	R2=6371000*np.ones(len(contour_surface2))+scaling_factor*contour_surface2;
+ 
+-	contourx1 = R1 * cosd(contour_lat1) * cosd(contour_long1);
+-	contoury1 = R1 * cosd(contour_lat1) * sind(contour_long1);
+-	contourz1 = R1 * sind(contour_lat1);
++	contourx1 = map(lambda r, lat, long: r * math.cos(math.radians(lat)) * math.cos(math.radians(long)), R1, contour_lat1, contour_long1);
++	contoury1 = map(lambda r, lat, long: r * math.cos(math.radians(lat)) * math.sin(math.radians(long)), R1, contour_lat1, contour_long1);
++	contourz1 = map(lambda r, lat: r * math.sin(math.radians(lat)), R1, contour_lat1);
+ 	
+-	contourx2 = R2 * cosd(contour_lat2) * cosd(contour_long2);
+-	contoury2 = R2 * cosd(contour_lat2) * sind(contour_long2);
+-	contourz2 = R2 * sind(contour_lat2);
++	contourx2 = map(lambda r, lat, long: r * math.cos(math.radians(lat)) * math.cos(math.radians(long)), R2, contour_lat2, contour_long2);
++	contoury2 = map(lambda r, lat, long: r * math.cos(math.radians(lat)) * math.sin(math.radians(long)), R2, contour_lat2, contour_long2);
++	contourz2 = map(lambda r, lat: r * math.sin(math.radians(lat)), R2, contour_lat2);
+ 
+-
+ 	model.contourx1=contourx1;
+ 	model.contoury1=contoury1;
+ 	model.contourz1=contourz1;
+@@ -51,61 +65,61 @@
+ 
+ 
+ 	#}}}
+-#Deal with mesh and results {{{
+-	
+-	
+-	lat=md.mesh.lat;
+-	long=md.mesh.long;
++	#Deal with mesh and results {{{
++	print ('getting mesh')
+ 	surface=md.geometry.surface;
+ 	numberofelements=md.mesh.numberofelements;
+ 	numberofvertices=md.mesh.numberofvertices;
+-
+-	R=6371000*ones(numberofvertices,1)+scaling_factor*surface;
+-
+-	x = R * cosd(lat) * cosd(long);
+-	y = R * cosd(lat) * sind(long);
+-	z = R * sind(lat);
+-
+-
++	R=6371000*np.ones(len(md.mesh.lat))+scaling_factor*surface.flatten();
++	
++	x = map(lambda r, lat, long: r * math.cos(math.radians(lat)) * math.cos(math.radians(long)), R, md.mesh.lat,md.mesh.long);
++	y = map(lambda r, lat, long: r * math.cos(math.radians(lat)) * math.sin(math.radians(long)), R, md.mesh.lat,md.mesh.long);
++	z = map(lambda r, lat: r * math.sin(math.radians(lat)), R, md.mesh.lat);
++	
+ 	#Deal with triangulation: 
++	print('getting triangulation')
+ 	model.index=md.mesh.elements;
+ 	model.x=x;
+ 	model.y=y;
+ 	model.z=z;
+ 	model.surface=surface;
+ 	
++	results = [""]
++	
+ 	#Deal with data: 
+-	results=struct([]);
++	print('getting data')
+ 	for i in xrange(1,len(optionslist)):
+ 		options=optionslist[i]; 
+ 		options=checkplotoptions(md,options);
+-		data=getfieldvalue(options,'data');
++		data=options.getfieldvalue('data');
++		results.append(ResultObj())
+ 		results[i].data=data;
+-		results[i].caxis=getfieldvalue(options,'caxis',[min(data), max(data)]);
++		results[i].caxis=options.getfieldvalue('caxis',[min(data), max(data)]);
+ 
+-		label=getfieldvalue(options,'label','');
+-		if strcmpi(label,''):
++		label=options.getfieldvalue('label','');
++		if label=='':
+ 			#create generic label: 
+-			label=['data', num2str(i)];
++			label=['data', str(i)];
+ 		results[i].label=label;
+ 
+-		shortlabel=getfieldvalue(options,'shortlabel','');
+-		if strcmpi(shortlabel,''):
++		shortlabel=options.getfieldvalue('shortlabel','');
++		if shortlabel=='':
+ 			#create generic short label: 
+-			shortlabel=['data', num2str(i)];
++			shortlabel=['data', str(i)];
+ 		results[i].shortlabel=shortlabel;
+-		
++
+ 		if len(data[2])>1:
+-			time_range=getfieldvalue(options,'time_range',[0, 100]);
++			time_range=options.getfieldvalue('time_range',[0, 100]);
+ 			results[i].time_range=time_range;
+ 
+-		unit=getfieldvalue(options,'unit','');
+-		if strcmpi(unit,''):
++		unit=options.getfieldvalue('unit','');
++		if unit=='':
+ 			#create generic unit: 
+ 			unit='SI';
+ 		results[i].unit=unit;
+ 	model.results=results;
+ 	
+ 	#Write model to javascript database file: 
++	print('writing to file')
+ 	writejsfile(directory + databasename + '.js',model,databasename);
+ #}}}
Index: /issm/oecreview/Archive/18296-19100/ISSM-19044-19045.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19044-19045.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19044-19045.diff	(revision 19102)
@@ -0,0 +1,104 @@
+Index: ../trunk-jpl/src/m/plot/writejsfile.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/writejsfile.py	(revision 19044)
++++ ../trunk-jpl/src/m/plot/writejsfile.py	(revision 19045)
+@@ -1,3 +1,4 @@
++import numpy
+ from writejsfield import writejsfield
+ def writejsfile(filename,model,keyname):
+ #WRITEJSFILE - write model file to javascript database
+@@ -46,7 +47,7 @@
+ 		fid.write('result["label"]="{0}";\n'.format(results[i].label))
+ 		fid.write('result["shortlabel"]="{0}";\n'.format(results[i].shortlabel))
+ 		fid.write('result["unit"]="{0}";\n'.format(results[i].unit))
+-		if len(results[i].data[2])>1:
++		if type(results[i].data)==numpy.float64:
+ 			fid.write('result["time_range"]=[{0},{1}];\n'.format(results[i].time_range[0],results[i].time_range[1]))
+ 		fid.write('results["{0}"]=result;\n'.format(i))
+ 		fid.write('<!--}}}-->\n')
+Index: ../trunk-jpl/src/m/plot/writejsfield.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/writejsfield.py	(revision 19044)
++++ ../trunk-jpl/src/m/plot/writejsfield.py	(revision 19045)
+@@ -1,3 +1,4 @@
++import numpy
+ def writejsfield(fid,name,variable,nods):
+ #WRITEJSFIELD - write variable to javascript file 
+ #
+@@ -6,7 +7,7 @@
+ #
+ 	#write array:
+ 	#if not isinstance(variable, list):
+-	if True:
++	if type(variable[0])==numpy.float64:
+ 		fid.write('<!-- {0}{{{{{{-->\n'.format(name))
+ 		fid.write('{0}=['.format(name))
+ 		for i in xrange(1, nods-1):
+Index: ../trunk-jpl/src/m/plot/export_gl.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/export_gl.py	(revision 19044)
++++ ../trunk-jpl/src/m/plot/export_gl.py	(revision 19045)
+@@ -9,6 +9,7 @@
+ 	class ResultObj(object):
+ 	    def __getattr__(self, attr):
+ 		return self.__dict__.get(attr)
++
+ 	print ('getting options')
+ 	templist=plotoptions(varargin); 
+ 	optionslist=templist.list;
+@@ -19,7 +20,7 @@
+ 	print ('setting directory')
+ 	directory=options.getfieldvalue('directory','./');
+ 	databasename=options.getfieldvalue('database','Pig');
+-	print(directory +databasename)	
++	
+ 	#scaling factor: 
+ 	print ('setting scaling factor')
+ 	scaling_factor=options.getfieldvalue('scaling_factor',50);
+@@ -48,29 +49,21 @@
+ 	R1=6371000*np.ones(len(contour_surface1))+scaling_factor*contour_surface1;
+ 	R2=6371000*np.ones(len(contour_surface2))+scaling_factor*contour_surface2;
+ 
+-	contourx1 = map(lambda r, lat, long: r * math.cos(math.radians(lat)) * math.cos(math.radians(long)), R1, contour_lat1, contour_long1);
+-	contoury1 = map(lambda r, lat, long: r * math.cos(math.radians(lat)) * math.sin(math.radians(long)), R1, contour_lat1, contour_long1);
+-	contourz1 = map(lambda r, lat: r * math.sin(math.radians(lat)), R1, contour_lat1);
++	model.contourx1 = map(lambda r, lat, long: r * math.cos(math.radians(lat)) * math.cos(math.radians(long)), R1, contour_lat1, contour_long1);
++	model.contoury1 = map(lambda r, lat, long: r * math.cos(math.radians(lat)) * math.sin(math.radians(long)), R1, contour_lat1, contour_long1);
++	model.contourz1 = map(lambda r, lat: r * math.sin(math.radians(lat)), R1, contour_lat1);
+ 	
+-	contourx2 = map(lambda r, lat, long: r * math.cos(math.radians(lat)) * math.cos(math.radians(long)), R2, contour_lat2, contour_long2);
+-	contoury2 = map(lambda r, lat, long: r * math.cos(math.radians(lat)) * math.sin(math.radians(long)), R2, contour_lat2, contour_long2);
+-	contourz2 = map(lambda r, lat: r * math.sin(math.radians(lat)), R2, contour_lat2);
++	model.contourx2 = map(lambda r, lat, long: r * math.cos(math.radians(lat)) * math.cos(math.radians(long)), R2, contour_lat2, contour_long2);
++	model.contoury2 = map(lambda r, lat, long: r * math.cos(math.radians(lat)) * math.sin(math.radians(long)), R2, contour_lat2, contour_long2);
++	model.contourz2 = map(lambda r, lat: r * math.sin(math.radians(lat)), R2, contour_lat2);
+ 
+-	model.contourx1=contourx1;
+-	model.contoury1=contoury1;
+-	model.contourz1=contourz1;
+-	model.contourx2=contourx2;
+-	model.contoury2=contoury2;
+-	model.contourz2=contourz2;
+-
+-
+ 	#}}}
+ 	#Deal with mesh and results {{{
+ 	print ('getting mesh')
+-	surface=md.geometry.surface;
++	surface=md.geometry.surface.flatten();
+ 	numberofelements=md.mesh.numberofelements;
+ 	numberofvertices=md.mesh.numberofvertices;
+-	R=6371000*np.ones(len(md.mesh.lat))+scaling_factor*surface.flatten();
++	R=6371000*np.ones(len(md.mesh.lat))+scaling_factor*surface;
+ 	
+ 	x = map(lambda r, lat, long: r * math.cos(math.radians(lat)) * math.cos(math.radians(long)), R, md.mesh.lat,md.mesh.long);
+ 	y = map(lambda r, lat, long: r * math.cos(math.radians(lat)) * math.sin(math.radians(long)), R, md.mesh.lat,md.mesh.long);
+@@ -91,7 +84,7 @@
+ 	for i in xrange(1,len(optionslist)):
+ 		options=optionslist[i]; 
+ 		options=checkplotoptions(md,options);
+-		data=options.getfieldvalue('data');
++		data=options.getfieldvalue('data').flatten();
+ 		results.append(ResultObj())
+ 		results[i].data=data;
+ 		results[i].caxis=options.getfieldvalue('caxis',[min(data), max(data)]);
Index: /issm/oecreview/Archive/18296-19100/ISSM-19045-19046.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19045-19046.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19045-19046.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/plot/export_gl.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/export_gl.py	(revision 19045)
++++ ../trunk-jpl/src/m/plot/export_gl.py	(revision 19046)
+@@ -101,7 +101,7 @@
+ 			shortlabel=['data', str(i)];
+ 		results[i].shortlabel=shortlabel;
+ 
+-		if len(data[2])>1:
++		if type(data[2])!=np.float64:
+ 			time_range=options.getfieldvalue('time_range',[0, 100]);
+ 			results[i].time_range=time_range;
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-19046-19047.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19046-19047.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19046-19047.diff	(revision 19102)
@@ -0,0 +1,1269 @@
+Index: ../trunk-jpl/src/c/modules/modules.h
+===================================================================
+--- ../trunk-jpl/src/c/modules/modules.h	(revision 19046)
++++ ../trunk-jpl/src/c/modules/modules.h	(revision 19047)
+@@ -11,6 +11,7 @@
+ #include "./Bamgx/Bamgx.h"
+ #include "./BamgConvertMeshx/BamgConvertMeshx.h"
+ #include "./BamgTriangulatex/BamgTriangulatex.h"
++#include "./Calvingx/Calvingx.h"
+ #include "./Chacox/Chacox.h"
+ #include "./ConfigureObjectsx/ConfigureObjectsx.h"
+ #include "./ContourToMeshx/ContourToMeshx.h"
+Index: ../trunk-jpl/src/c/modules/Calvingx/Calvingx.h
+===================================================================
+--- ../trunk-jpl/src/c/modules/Calvingx/Calvingx.h	(revision 0)
++++ ../trunk-jpl/src/c/modules/Calvingx/Calvingx.h	(revision 19047)
+@@ -0,0 +1,10 @@
++#ifndef _CALVINGX_H
++#define _CALVINGX_H
++
++#include "../../classes/classes.h"
++#include "../../analyses/analyses.h"
++
++/* local prototypes: */
++void Calvingx(FemModel* femmodel);
++
++#endif
+Index: ../trunk-jpl/src/c/modules/Calvingx/Calvingx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/Calvingx/Calvingx.cpp	(revision 0)
++++ ../trunk-jpl/src/c/modules/Calvingx/Calvingx.cpp	(revision 19047)
+@@ -0,0 +1,38 @@
++/*!\file Calvingx
++ * \brief: compute inverse method gradient
++ */
++
++#include "./Calvingx.h"
++#include "../../shared/shared.h"
++#include "../../toolkits/toolkits.h"
++
++void Calvingx(FemModel* femmodel){
++
++	/*Recover Calving law Enum*/
++	int calvinglaw;
++	femmodel->parameters->FindParam(&calvinglaw,CalvingLawEnum);
++
++	/*Calculate calving rate*/
++	switch(calvinglaw){
++		case DefaultCalvingEnum:
++			break;
++		case CalvingLevermannEnum:
++			if(VerboseModule()) _printf0_("   computing Levermann's calving rate\n");
++			femmodel->StrainRateparallelx();
++			femmodel->StrainRateperpendicularx();
++			femmodel->CalvingRateLevermannx();
++			break;
++		case CalvingPiEnum:
++			if(VerboseModule()) _printf0_("   computing Pi's calving rate\n");
++			femmodel->StrainRateparallelx();
++			femmodel->DeviatoricStressx();
++			femmodel->CalvingRatePix();
++			break;
++		case CalvingDevEnum:
++			femmodel->CalvingRateDevx();
++			femmodel->ElementOperationx(&Element::CalvingRateDev);
++			break;
++		default:
++			_error_("Caving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
++	}
++}
+Index: ../trunk-jpl/src/c/modules/Calvingx
+===================================================================
+--- ../trunk-jpl/src/c/modules/Calvingx	(revision 19046)
++++ ../trunk-jpl/src/c/modules/Calvingx	(revision 19047)
+
+Property changes on: ../trunk-jpl/src/c/modules/Calvingx
+___________________________________________________________________
+Added: svn:ignore
+## -0,0 +1,2 ##
++.deps
++.dirstamp
+Index: ../trunk-jpl/src/c/modules/ExpToLevelSetx
+===================================================================
+--- ../trunk-jpl/src/c/modules/ExpToLevelSetx	(revision 19046)
++++ ../trunk-jpl/src/c/modules/ExpToLevelSetx	(revision 19047)
+
+Property changes on: ../trunk-jpl/src/c/modules/ExpToLevelSetx
+___________________________________________________________________
+Modified: svn:ignore
+## -1 +1,2 ##
+ .deps
++.dirstamp
+Index: ../trunk-jpl/src/c/modules
+===================================================================
+--- ../trunk-jpl/src/c/modules	(revision 19046)
++++ ../trunk-jpl/src/c/modules	(revision 19047)
+
+Property changes on: ../trunk-jpl/src/c/modules
+___________________________________________________________________
+Added: svn:ignore
+## -0,0 +1 ##
++.deps
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 19046)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 19047)
+@@ -14,203 +14,97 @@
+ 
+ #Core sources
+ #Core sources{{{
+-issm_sources = ./datastructures/DataSet.h\
+-					./datastructures/DataSet.cpp\
+-					./datastructures/Object.h\
+-					./datastructures/datastructures.h\
+-					./classes/classes.h\
+-					./classes/gauss/Gauss.h\
+-					./classes/gauss/GaussSeg.h\
++issm_sources = ./datastructures/DataSet.cpp\
+ 					./classes/gauss/GaussSeg.cpp\
+-					./classes/gauss/GaussTria.h\
+ 					./classes/gauss/GaussTria.cpp\
+-					./classes/gauss/GaussTetra.h\
+ 					./classes/gauss/GaussTetra.cpp\
+-					./classes/gauss/GaussPenta.h\
+ 					./classes/gauss/GaussPenta.cpp\
+-					./classes/Update.h\
+-					./classes/FemModel.h\
+ 					./classes/FemModel.cpp\
+-					./classes/Material.h\
+-					./classes/Load.h\
+-					./classes/Contour.h\
+-					./classes/Loads/Friction.h\
+ 					./classes/Loads/Friction.cpp\
+-					./classes/Inputs/TransientInput.h\
+ 					./classes/Inputs/TransientInput.cpp\
+ 					./classes/Constraints/SpcTransient.cpp\
+-					./classes/Constraints/SpcTransient.h\
+-					./classes/IndependentObject.h\
+ 					./classes/IndependentObject.cpp\
+-					./classes/DependentObject.h\
+ 					./classes/DependentObject.cpp\
+-					./classes/DofIndexing.h\
+ 					./classes/DofIndexing.cpp\
+-					./classes/IoModel.h\
+ 					./classes/IoModel.cpp\
+-					./classes/Contours.h\
+ 					./classes/Contours.cpp\
+-					./classes/Nodes.h\
+ 					./classes/Nodes.cpp\
+-					./classes/Vertices.h\
+ 					./classes/Vertices.cpp\
+-					./classes/Node.h\
+ 					./classes/Node.cpp\
+-					./classes/Segment.h\
+-					./classes/Vertex.h\
+ 					./classes/Vertex.cpp\
+-					./classes/Hook.h\
+ 					./classes/Hook.cpp\
+-					./classes/ExternalResults/Results.h\
+ 					./classes/ExternalResults/Results.cpp\
+-					./classes/ExternalResults/ExternalResult.h\
+-					./classes/ExternalResults/GenericExternalResult.h\
+-					./classes/Elements/Element.h\
+ 					./classes/Elements/Element.cpp\
+-					./classes/Elements/Elements.h\
+ 					./classes/Elements/Elements.cpp\
+-					./classes/Elements/ElementHook.h\
+ 					./classes/Elements/ElementHook.cpp\
+-					./classes/Elements/Seg.h\
+ 					./classes/Elements/Seg.cpp\
+-					./classes/Elements/SegRef.h\
+ 					./classes/Elements/SegRef.cpp\
+-					./classes/Elements/Tria.h\
+ 					./classes/Elements/Tria.cpp\
+-					./classes/Elements/TriaRef.h\
+ 					./classes/Elements/TriaRef.cpp\
+-					./classes/Elements/Tetra.h\
+ 					./classes/Elements/Tetra.cpp\
+-					./classes/Elements/TetraRef.h\
+ 					./classes/Elements/TetraRef.cpp\
+-					./classes/Elements/Penta.h\
+ 					./classes/Elements/Penta.cpp\
+-					./classes/Elements/PentaRef.h\
+ 					./classes/Elements/PentaRef.cpp\
+-					./classes/Inputs/Inputs.h\
+ 					./classes/Inputs/Inputs.cpp\
+-					./classes/Inputs/Input.h\
+-					./classes/Inputs/InputLocal.h\
+-					./classes/Inputs/SegInput.h\
+ 					./classes/Inputs/SegInput.cpp\
+-					./classes/Inputs/TriaInput.h\
+ 					./classes/Inputs/TriaInput.cpp\
+-					./classes/Inputs/BoolInput.h\
+ 					./classes/Inputs/BoolInput.cpp\
+-					./classes/Inputs/IntInput.h\
+ 					./classes/Inputs/IntInput.cpp\
+-					./classes/Inputs/DoubleInput.h\
+ 					./classes/Inputs/DoubleInput.cpp\
+-					./classes/Inputs/DatasetInput.h\
+ 					./classes/Inputs/DatasetInput.cpp\
+-					./classes/Materials/Materials.h\
+ 					./classes/Materials/Materials.cpp\
+-					./classes/Materials/Matice.h\
+ 					./classes/Materials/Matice.cpp\
+-					./classes/Materials/Matseaice.h\
+ 					./classes/Materials/Matseaice.cpp\
+-					./classes/Materials/Matpar.h\
+ 					./classes/Materials/Matpar.cpp\
+-					./classes/Constraints/Constraints.h\
+ 					./classes/Constraints/Constraints.cpp\
+-					./classes/Constraints/Constraint.h\
+ 					./classes/Constraints/SpcStatic.cpp\
+-					./classes/Constraints/SpcStatic.h\
+ 					./classes/Constraints/SpcDynamic.cpp\
+-					./classes/Constraints/SpcDynamic.h\
+-					./classes/Loads/Loads.h\
+ 					./classes/Loads/Loads.cpp\
+ 					./classes/Loads/Penpair.cpp\
+-					./classes/Loads/Penpair.h\
+ 					./classes/Loads/Pengrid.cpp\
+-					./classes/Loads/Pengrid.h\
+ 					./classes/Loads/Numericalflux.cpp\
+-					./classes/Loads/Numericalflux.h\
+-					./classes/matrix/matrixobjects.h\
+-					./classes/matrix/ElementMatrix.h\
+ 					./classes/matrix/ElementMatrix.cpp\
+-					./classes/matrix/ElementVector.h\
+ 					./classes/matrix/ElementVector.cpp\
+-					./classes/Params/Parameters.h\
+ 					./classes/Params/Parameters.cpp\
+-					./classes/Params/Param.h\
+-					./classes/Params/GenericParam.h\
+ 					./classes/Params/BoolParam.cpp\
+-					./classes/Params/BoolParam.h\
+ 					./classes/Params/IntParam.cpp\
+-					./classes/Params/IntParam.h\
+ 					./classes/Params/IntVecParam.cpp\
+-					./classes/Params/IntVecParam.h\
+ 					./classes/Params/IntMatParam.cpp\
+-					./classes/Params/IntMatParam.h\
+ 					./classes/Params/DoubleParam.cpp\
+-					./classes/Params/DoubleParam.h\
+ 					./classes/Params/FileParam.cpp\
+-					./classes/Params/FileParam.h\
+ 					./classes/Params/StringArrayParam.cpp\
+-					./classes/Params/StringArrayParam.h\
+ 					./classes/Params/DoubleMatParam.cpp\
+-					./classes/Params/DoubleMatParam.h\
+ 					./classes/Params/DoubleTransientMatParam.cpp\
+-					./classes/Params/DoubleTransientMatParam.h\
+ 					./classes/Params/DoubleMatArrayParam.cpp\
+-					./classes/Params/DoubleMatArrayParam.h\
+ 					./classes/Params/DoubleVecParam.cpp\
+-					./classes/Params/DoubleVecParam.h\
+ 					./classes/Params/StringParam.cpp\
+-					./classes/Params/StringParam.h\
+-					./classes/Params/MatrixParam.h\
+ 					./classes/Params/MatrixParam.cpp\
+-					./classes/Params/VectorParam.h\
+ 					./classes/Params/VectorParam.cpp\
+-					./classes/Params/TransientParam.h\
+ 					./classes/Params/TransientParam.cpp\
+-					./classes/Params/DataSetParam.h\
+ 					./classes/Params/DataSetParam.cpp\
+-					./classes/Profiler.h\
+ 					./classes/Profiler.cpp\
+-					./shared/shared.h\
+-					./shared/MemOps/MemOps.h\
+ 					./shared/MemOps/MemOps.cpp\
+-					./shared/Matrix/matrix.h\
+ 					./shared/Matrix/MatrixUtils.cpp\
+-					./shared/io/io.h\
+-					./shared/io/Disk/diskio.h\
+ 					./shared/io/Disk/pfopen.cpp\
+ 					./shared/io/Disk/pfclose.cpp\
+ 					./shared/io/Disk/WriteLockFile.cpp\
+ 					./shared/io/Print/PrintfFunction.cpp\
+-					./shared/io/Print/Print.h\
+-					./shared/io/Comm/IssmComm.h\
+ 					./shared/io/Comm/IssmComm.cpp\
+ 					./shared/LatLong/Ll2xyx.cpp\
+ 					./shared/LatLong/Xy2llx.cpp\
+-					./shared/FSanalyticals/fsanalyticals.h\
+ 					./shared/FSanalyticals/fsanalyticals.cpp\
+-					./shared/Enum/Enum.h\
+-					./shared/Enum/EnumDefinitions.h\
+ 					./shared/Enum/EnumToStringx.cpp\
+ 					./shared/Enum/StringToEnumx.cpp\
+-					./shared/Numerics/numerics.h\
+-					./shared/Numerics/types.h\
+-					./shared/Numerics/constants.h\
+-					./shared/Numerics/Verbosity.h\
+ 					./shared/Numerics/Verbosity.cpp\
+-					./shared/Numerics/GaussPoints.h\
+ 					./shared/Numerics/GaussPoints.cpp\
+ 					./shared/Numerics/cross.cpp\
+-					./shared/Numerics/isnan.h\
+ 					./shared/Numerics/isnan.cpp\
+ 					./shared/Numerics/cubic.cpp\
+ 					./shared/Numerics/NewtonSolveDnorm.cpp\
+ 					./shared/Numerics/extrema.cpp\
+ 					./shared/Numerics/XZvectorsToCoordinateSystem.cpp\
+-					./shared/Numerics/OptPars.h\
+-					./shared/Exceptions/exceptions.h\
+ 					./shared/Exceptions/Exceptions.cpp\
+ 					./shared/Sorting/binary_search.cpp\
+-					./shared/Sorting/sorting.h\
+-					./shared/Elements/elements.h\
+ 					./shared/Elements/Cuffey.cpp\
+ 					./shared/Elements/StressIntensityIntegralWeight.cpp\
+ 					./shared/Elements/Paterson.cpp\
+@@ -221,41 +115,15 @@
+ 					./shared/Elements/ComputeDelta18oTemperaturePrecipitation.cpp\
+ 					./shared/Elements/ComputeMungsmTemperaturePrecipitation.cpp\
+ 					./shared/Elements/DrainageFunctionWaterfraction.cpp\
+-					./shared/String/sharedstring.h\
+ 					./shared/String/DescriptorIndex.cpp\
+-					./toolkits/metis/metisincludes.h\
+-					./toolkits/issm/issmtoolkit.h\
+-					./toolkits/issm/IssmToolkitUtils.h\
+ 					./toolkits/issm/IssmToolkitUtils.cpp\
+-					./toolkits/issm/IssmAbsMat.h\
+-					./toolkits/issm/IssmAbsVec.h\
+-					./toolkits/issm/IssmDenseMat.h\
+-					./toolkits/issm/IssmMat.h\
+-					./toolkits/issm/IssmSeqVec.h\
+-					./toolkits/issm/IssmVec.h\
+-					./toolkits/issm/IssmSolver.h\
+ 					./toolkits/issm/IssmSolver.cpp\
+-					./toolkits/issm/SparseRow.h\
+-					./toolkits/issm/Bucket.h\
+-					./toolkits/mpi/issmmpi.h\
+ 					./toolkits/mpi/issmmpi.cpp\
+-					./toolkits/mpi/commops/commops.h\
+ 					./toolkits/mpi/commops/DetermineLocalSize.cpp\
+ 					./toolkits/mpi/commops/DetermineGlobalSize.cpp\
+ 					./toolkits/mpi/commops/DetermineRowRankFromLocalSize.cpp\
+ 					./toolkits/mpi/commops/GetOwnershipBoundariesFromRange.cpp\
+-					./toolkits/adolc/adolcincludes.h\
+-					./toolkits/adolc/AdolcEdf.h\
+-					./toolkits/ToolkitOptions.h\
+ 					./toolkits/ToolkitOptions.cpp\
+-					./toolkits/triangle/triangleincludes.h\
+-					./toolkits/objects/toolkitobjects.h\
+-					./toolkits/objects/Matrix.h\
+-					./toolkits/objects/Vector.h\
+-					./toolkits/objects/Solver.h\
+-					./toolkitsenums.h\
+-					./toolkits.h\
+-					./modules/ModelProcessorx/ModelProcessorx.h\
+ 					./modules/ModelProcessorx/ModelProcessorx.cpp\
+ 					./modules/ModelProcessorx/ElementsAndVerticesPartitioning.cpp\
+ 					./modules/ModelProcessorx/NodesPartitioning.cpp\
+@@ -269,78 +137,41 @@
+ 					./modules/ModelProcessorx/CreateNumberNodeToElementConnectivity.cpp\
+ 					./modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp\
+ 					./modules/ModelProcessorx/CreateNodes.cpp\
+-					./modules/ParseToolkitsOptionsx/ParseToolkitsOptionsx.h\
+ 					./modules/ParseToolkitsOptionsx/ParseToolkitsOptionsx.cpp\
+-					./modules/NodesDofx/NodesDofx.h\
+ 					./modules/NodesDofx/NodesDofx.cpp\
+-					./modules/NodalValuex/NodalValuex.h\
+ 					./modules/NodalValuex/NodalValuex.cpp\
+-					./modules/VerticesDofx/VerticesDofx.h\
+ 					./modules/VerticesDofx/VerticesDofx.cpp\
+-					./modules/VertexCoordinatesx/VertexCoordinatesx.h\
+ 					./modules/VertexCoordinatesx/VertexCoordinatesx.cpp\
+-					./modules/OutputResultsx/OutputResultsx.h\
+ 					./modules/OutputResultsx/OutputResultsx.cpp\
+-					./modules/InputDepthAverageAtBasex/InputDepthAverageAtBasex.h\
+ 					./modules/InputDepthAverageAtBasex/InputDepthAverageAtBasex.cpp\
+-					./modules/InputDuplicatex/InputDuplicatex.h\
+ 					./modules/InputDuplicatex/InputDuplicatex.cpp\
+-					./modules/InputExtrudex/InputExtrudex.h\
+ 					./modules/InputExtrudex/InputExtrudex.cpp\
+-					./modules/InputScalex/InputScalex.h\
+ 					./modules/InputScalex/InputScalex.cpp\
+-					./modules/SurfaceAreax/SurfaceAreax.h\
+ 					./modules/SurfaceAreax/SurfaceAreax.cpp\
+-					./modules/AllocateSystemMatricesx/AllocateSystemMatricesx.h\
+ 					./modules/AllocateSystemMatricesx/AllocateSystemMatricesx.cpp\
+-					./modules/CreateJacobianMatrixx/CreateJacobianMatrixx.h\
+ 					./modules/CreateJacobianMatrixx/CreateJacobianMatrixx.cpp\
+-					./modules/SystemMatricesx/SystemMatricesx.h\
+ 					./modules/SystemMatricesx/SystemMatricesx.cpp\
+-					./modules/CreateNodalConstraintsx/CreateNodalConstraintsx.h\
+ 					./modules/CreateNodalConstraintsx/CreateNodalConstraintsx.cpp\
+-					./modules/UpdateDynamicConstraintsx/UpdateDynamicConstraintsx.h\
+ 					./modules/UpdateDynamicConstraintsx/UpdateDynamicConstraintsx.cpp\
+-					./modules/IoModelToConstraintsx/IoModelToConstraintsx.h\
+ 					./modules/IoModelToConstraintsx/IoModelToConstraintsx.cpp\
+-					./modules/SetActiveNodesLSMx/SetActiveNodesLSMx.h\
+ 					./modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp\
+-					./modules/InputUpdateFromConstantx/InputUpdateFromConstantx.h\
+ 					./modules/InputUpdateFromConstantx/InputUpdateFromConstantx.cpp\
+-					./modules/InputUpdateFromSolutionx/InputUpdateFromSolutionx.h\
+ 					./modules/InputUpdateFromSolutionx/InputUpdateFromSolutionx.cpp\
+-					./modules/GetSolutionFromInputsx/GetSolutionFromInputsx.h\
+ 					./modules/GetSolutionFromInputsx/GetSolutionFromInputsx.cpp\
+-					./modules/GetVectorFromInputsx/GetVectorFromInputsx.h\
+ 					./modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp\
+-					./modules/InputUpdateFromVectorx/InputUpdateFromVectorx.h\
+ 					./modules/InputUpdateFromVectorx/InputUpdateFromVectorx.cpp\
+-					./modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.h\
+ 					./modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp\
+-					./modules/ConfigureObjectsx/ConfigureObjectsx.h\
+ 					./modules/ConfigureObjectsx/ConfigureObjectsx.cpp\
+-					./modules/SpcNodesx/SpcNodesx.h\
+ 					./modules/SpcNodesx/SpcNodesx.cpp\
+-					./modules/SurfaceMassBalancex/SurfaceMassBalancex.h\
+ 					./modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp\
+-					./modules/MeshPartitionx/MeshPartitionx.h\
+ 					./modules/Reducevectorgtofx/Reducevectorgtofx.cpp\
+-					./modules/Reducevectorgtofx/Reducevectorgtofx.h\
+-					./modules/Reduceloadx/Reduceloadx.h\
+ 					./modules/Reduceloadx/Reduceloadx.cpp\
+ 					./modules/ConstraintsStatex/ConstraintsStatex.cpp\
+-					./modules/ConstraintsStatex/ConstraintsStatex.h\
+-					./modules/ConstraintsStatex/ConstraintsStateLocal.h\
+-					./modules/ResetConstraintsx/ResetConstraintsx.h\
+ 					./modules/ResetConstraintsx/ResetConstraintsx.cpp\
+-					./modules/ResetFSBasalBoundaryConditionx/ResetFSBasalBoundaryConditionx.h\
+ 					./modules/ResetFSBasalBoundaryConditionx/ResetFSBasalBoundaryConditionx.cpp\
+ 					./modules/Solverx/Solverx.cpp\
+-					./modules/Solverx/Solverx.h\
+ 					./modules/VecMergex/VecMergex.cpp\
+-					./modules/VecMergex/VecMergex.h\
+ 					./modules/Mergesolutionfromftogx/Mergesolutionfromftogx.cpp\
+-					./modules/Mergesolutionfromftogx/Mergesolutionfromftogx.h\
+ 					./cores/ProcessArguments.cpp\
+ 					./cores/ResetBoundaryConditions.cpp\
+ 					./cores/WrapperCorePointerFromSolutionEnum.cpp\
+@@ -349,9 +180,7 @@
+ 					./cores/adgradient_core.cpp\
+ 					./main/EnvironmentInit.cpp\
+ 					./main/EnvironmentFinalize.cpp\
+-					./analyses/EnumToAnalysis.h\
+ 					./analyses/EnumToAnalysis.cpp\
+-					./analyses/Analysis.h\
+ 					./solutionsequences/solutionsequence_la.cpp\
+ 					./solutionsequences/solutionsequence_la_theta.cpp\
+ 					./solutionsequences/solutionsequence_linear.cpp\
+@@ -359,14 +188,9 @@
+ 					./solutionsequences/solutionsequence_newton.cpp\
+ 					./solutionsequences/solutionsequence_fct.cpp\
+ 					./solutionsequences/convergence.cpp\
+-					./classes/Options/Options.h\
+ 					./classes/Options/Options.cpp\
+-					./classes/Options/Option.h\
+-					./classes/Options/GenericOption.h\
+ 					./classes/Options/OptionUtilities.cpp\
+-					./classes/Options/OptionUtilities.h\
+ 					./classes/RiftStruct.cpp\
+-					./classes/RiftStruct.h\
+ 					./modules/ModelProcessorx/Transient/UpdateElementsTransient.cpp \
+ 					./cores/transient_core.cpp\
+ 					./cores/steadystate_core.cpp\
+@@ -377,40 +201,23 @@
+ 					./cores/thermal_core.cpp\
+ 					./solutionsequences/solutionsequence_thermal_nonlinear.cpp\
+ 					./modules/ControlInputSetGradientx/ControlInputSetGradientx.cpp\
+-					./modules/ControlInputSetGradientx/ControlInputSetGradientx.h\
+ 					./modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp\
+-					./modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.h\
+ 					./modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.cpp\
+-					./modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.h\
+ 					./modules/ModelProcessorx/Control/CreateParametersControl.cpp\
+ 					./modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp\
+-					./modules/InputControlUpdatex/InputControlUpdatex.h\
+ 					./modules/InputControlUpdatex/InputControlUpdatex.cpp\
+-					./modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.h\
+ 					./modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp\
+-					./modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.h\
+ 					./modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp\
+-					./modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.h\
+ 					./modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp\
+-					./modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.h\
+ 					./modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp\
+-					./modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.h\
+ 					./modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp\
+-					./modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.h\
+ 					./modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp\
+-					./modules/Gradjx/Gradjx.h\
+ 					./modules/Gradjx/Gradjx.cpp\
+ 					./modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp\
+-					./modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.h\
+ 					./modules/ThicknessAlongGradientx/ThicknessAlongGradientx.cpp\
+-					./modules/ThicknessAlongGradientx/ThicknessAlongGradientx.h\
+ 					./modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.cpp\
+-					./modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.h\
+ 					./modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.cpp\
+-					./modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.h\
+ 					./modules/RheologyBAbsGradientx/RheologyBAbsGradientx.cpp\
+-					./modules/RheologyBAbsGradientx/RheologyBAbsGradientx.h\
+-					./classes/Inputs/ControlInput.h\
+ 					./classes/Inputs/ControlInput.cpp\
+ 					./shared/Numerics/BrentSearch.cpp\
+ 					./cores/control_core.cpp\
+@@ -439,109 +246,59 @@
+ 					./modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp\
+ 					./classes/Loads/Riftfront.cpp\
+ 					./modules/ConstraintsStatex/RiftConstraintsState.cpp\
+-					./classes/Massfluxatgate.h \
+-					./classes/Misfit.h \
+-					./classes/Masscon.h \
+ 					./modules/ModelProcessorx/CreateOutputDefinitions.cpp\
+-					./modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.h\
+ 					./modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.cpp\
+-					./classes/Inputs/PentaInput.h\
+ 					./classes/Inputs/PentaInput.cpp\
+-					./classes/Inputs/TetraInput.h\
+-					./classes/Inputs/TetraInput.cpp\
+-					#}}}
++					./classes/Inputs/TetraInput.cpp
++#}}}
+ #DAKOTA sources  {{{
+ if DAKOTA
+-issm_sources +=  ./modules/InputUpdateFromDakotax/InputUpdateFromDakotax.h\
+-					  ./modules/InputUpdateFromDakotax/InputUpdateFromDakotax.cpp\
+-					  ./modules/InputUpdateFromVectorDakotax/InputUpdateFromVectorDakotax.h\
++issm_sources +=  ./modules/InputUpdateFromDakotax/InputUpdateFromDakotax.cpp\
+ 					  ./modules/InputUpdateFromVectorDakotax/InputUpdateFromVectorDakotax.cpp\
+-					  ./modules/InputUpdateFromMatrixDakotax/InputUpdateFromMatrixDakotax.h\
+ 					  ./modules/InputUpdateFromMatrixDakotax/InputUpdateFromMatrixDakotax.cpp\
+ 					  ./modules/AverageOntoPartitionx/AverageOntoPartitionx.cpp\
+-					  ./modules/AverageOntoPartitionx/AverageOntoPartitionx.h\
+ 					  ./modules/ModelProcessorx/Dakota/CreateParametersDakota.cpp\
+ 					  ./modules/ModelProcessorx/Dakota/UpdateElementsAndMaterialsDakota.cpp\
+ 					  ./cores/dakota_core.cpp\
+-					  ./cores/DakotaSpawnCore.h\
+ 					  ./cores/DakotaSpawnCore.cpp
+ endif
+ #}}}
+ #BAMG sources  {{{
+ if BAMG
+-issm_sources += ./bamg/bamgobjects.h\
+-					 ./bamg/BamgGeom.h\
+-					 ./bamg/BamgGeom.cpp\
+-					 ./bamg/BamgMesh.h\
++issm_sources += ./bamg/BamgGeom.cpp\
+ 					 ./bamg/BamgMesh.cpp\
+-					 ./bamg/BamgOpts.h\
+ 					 ./bamg/BamgOpts.cpp\
+-					 ./bamg/CrackedEdge.h\
+ 					 ./bamg/CrackedEdge.cpp\
+-					 ./bamg/Curve.h\
+ 					 ./bamg/Curve.cpp\
+-					 ./bamg/Direction.h\
+ 					 ./bamg/Direction.cpp\
+-					 ./bamg/DoubleAndInt.h\
+-					 ./bamg/Edge.h\
+ 					 ./bamg/Edge.cpp\
+-					 ./bamg/GeomEdge.h\
+ 					 ./bamg/GeomEdge.cpp\
+-					 ./bamg/GeomSubDomain.h\
+ 					 ./bamg/GeomSubDomain.cpp\
+-					 ./bamg/GeomVertex.h\
+ 					 ./bamg/GeomVertex.cpp\
+ 					 ./bamg/Geometry.cpp\
+-					 ./bamg/Geometry.h\
+ 					 ./bamg/ListofIntersectionTriangles.cpp\
+-					 ./bamg/ListofIntersectionTriangles.h\
+ 					 ./bamg/EigenMetric.cpp\
+ 					 ./bamg/Metric.cpp\
+-					 ./bamg/Metric.h\
+ 					 ./bamg/BamgQuadtree.cpp\
+-					 ./bamg/BamgQuadtree.h\
+-					 ./bamg/R2.h\
+ 					 ./bamg/SetOfE4.cpp\
+-					 ./bamg/SetOfE4.h\
+-					 ./bamg/SubDomain.h\
+ 					 ./bamg/SubDomain.cpp\
+-					 ./bamg/AdjacentTriangle.h\
+ 					 ./bamg/AdjacentTriangle.cpp\
+ 					 ./bamg/Triangle.cpp\
+-					 ./bamg/det.h \
+-					 ./bamg/Triangle.h\
+ 					 ./bamg/BamgVertex.cpp\
+-					 ./bamg/BamgVertex.h\
+-					 ./bamg/VertexOnEdge.h\
+ 					 ./bamg/VertexOnEdge.cpp\
+-					 ./bamg/VertexOnGeom.h\
+ 					 ./bamg/VertexOnGeom.cpp\
+-					 ./bamg/VertexOnVertex.h\
+ 					 ./bamg/VertexOnVertex.cpp\
+ 					 ./bamg/Mesh.cpp\
+-					 ./bamg/Mesh.h\
+-					 ./shared/Bamg/Abs.h \
+-					 ./shared/Bamg/BigPrimeNumber.h\
+ 					 ./shared/Bamg/BigPrimeNumber.cpp\
+-					 ./shared/Bamg/BinaryRand.h \
+-					 ./shared/Bamg/Exchange.h \
+-					 ./shared/Bamg/extrema.h \
+-					 ./shared/Bamg/HeapSort.h \
+-					 ./shared/Bamg/OppositeAngle.h \
+ 					 ./modules/Bamgx/Bamgx.cpp\
+-					 ./modules/Bamgx/Bamgx.h\
+ 					 ./modules/BamgConvertMeshx/BamgConvertMeshx.cpp\
+-					 ./modules/BamgConvertMeshx/BamgConvertMeshx.h\
+-					 ./modules/BamgTriangulatex/BamgTriangulatex.cpp\
+-					 ./modules/BamgTriangulatex/BamgTriangulatex.h
++					 ./modules/BamgTriangulatex/BamgTriangulatex.cpp
+ endif
+ #}}}
+ #Petsc sources  {{{
+ if PETSC
+ issm_sources += ./toolkits/petsc\
+ 					./toolkits/petsc/patches\
+-					./toolkits/petsc/patches/SolverEnum.h\
+-					./toolkits/petsc/patches/petscpatches.h\
+ 					./toolkits/petsc/patches/VecToMPISerial.cpp\
+ 					./toolkits/petsc/patches/MatToSerial.cpp\
+ 					./toolkits/petsc/patches/VecMerge.cpp\
+@@ -556,28 +313,19 @@
+ 					./toolkits/petsc/patches/ISSMToPetscMatrixType.cpp\
+ 					./toolkits/petsc/patches/ISSMToPetscInsertMode.cpp\
+ 					./toolkits/petsc/patches/ISSMToPetscNormMode.cpp\
+-					./toolkits/petsc/objects/petscobjects.h\
+-					./toolkits/petsc/objects/PetscMat.h\
+ 					./toolkits/petsc/objects/PetscMat.cpp\
+-					./toolkits/petsc/objects/PetscVec.h\
+ 					./toolkits/petsc/objects/PetscVec.cpp\
+-					./toolkits/petsc/objects/PetscSolver.cpp\
+-					./toolkits/petsc/objects/PetscSolver.h\
+-					./toolkits/petsc/petscincludes.h
++					./toolkits/petsc/objects/PetscSolver.cpp
+ endif
+ #}}}
+ #Mumps sources  {{{
+ if MUMPS
+-issm_sources += ./toolkits/mumps\
+-					./toolkits/mumps/mumpsincludes.h\
+-					./toolkits/mumps/MumpsSolve.cpp
++issm_sources += ./toolkits/mumps/MumpsSolve.cpp
+ endif
+ #}}}
+ #Gsl sources  {{{
+ if GSL
+-issm_sources += ./toolkits/gsl\
+-					./toolkits/gsl/gslincludes.h\
+-					./toolkits/gsl/DenseGslSolve.cpp
++issm_sources += ./toolkits/gsl/DenseGslSolve.cpp
+ endif
+ #}}}
+ #proj.4 sources  {{{
+@@ -676,6 +424,7 @@
+ endif
+ if LEVELSET
+ issm_sources += ./analyses/LevelsetAnalysis.cpp
++issm_sources += ./modules/Calvingx/Calvingx.cpp
+ endif
+ if EXTRAPOLATION
+ issm_sources += ./analyses/ExtrapolationAnalysis.cpp
+@@ -698,16 +447,9 @@
+ 					./modules/GiaDeflectionCorex/what0.f
+ endif
+ #}}}
+-#Mpi sources  {{{
+-if MPI
+-issm_sources += ./toolkits/issm/IssmMpiDenseMat.h\
+-					 ./toolkits/issm/IssmMpiVec.h
+-endif
+-#}}}
+ #Metis sources  {{{
+ if METIS
+-issm_sources += ./toolkits/metis/patches/metispatches.h\
+-					./toolkits/metis/patches/METIS_PartMeshNodalPatch.cpp
++issm_sources += ./toolkits/metis/patches/METIS_PartMeshNodalPatch.cpp
+ endif
+ #}}}
+ 
+@@ -716,159 +458,94 @@
+ 
+ #}}}
+ #Kml sources  {{{
+-kml_sources = ./modules/Exp2Kmlx/Exp2Kmlx.h\
+-				  ./modules/Exp2Kmlx/Exp2Kmlx.cpp\
+-				  ./modules/Kml2Expx/Kml2Expx.h\
++kml_sources = ./modules/Exp2Kmlx/Exp2Kmlx.cpp\
+ 				  ./modules/Kml2Expx/Kml2Expx.cpp\
+-				  ./modules/Shp2Kmlx/Shp2Kmlx.h\
+ 				  ./modules/Shp2Kmlx/Shp2Kmlx.cpp\
+-				  ./modules/KMLFileReadx/KMLFileReadx.h\
+ 				  ./modules/KMLFileReadx/KMLFileReadx.cpp\
+-				  ./modules/KMLMeshWritex/KMLMeshWritex.h\
+ 				  ./modules/KMLMeshWritex/KMLMeshWritex.cpp\
+-				  ./modules/KMLOverlayx/KMLOverlayx.h\
+ 				  ./modules/KMLOverlayx/KMLOverlayx.cpp\
+-				  ./kml/kmlobjects.h\
+ 				  ./kml/KML_Attribute.cpp\
+-				  ./kml/KML_Attribute.h\
+ 				  ./kml/KML_Comment.cpp\
+-				  ./kml/KML_Comment.h\
+ 				  ./kml/KML_ColorStyle.cpp\
+-				  ./kml/KML_ColorStyle.h\
+ 				  ./kml/KML_Container.cpp\
+-				  ./kml/KML_Container.h\
+ 				  ./kml/KML_Document.cpp\
+-				  ./kml/KML_Document.h\
+ 				  ./kml/KML_Feature.cpp\
+-				  ./kml/KML_Feature.h\
+ 				  ./kml/KML_File.cpp\
+-				  ./kml/KML_File.h\
+ 				  ./kml/KML_Folder.cpp\
+-				  ./kml/KML_Folder.h\
+ 				  ./kml/KML_Geometry.cpp\
+-				  ./kml/KML_Geometry.h\
+ 				  ./kml/KML_GroundOverlay.cpp\
+-				  ./kml/KML_GroundOverlay.h\
+ 				  ./kml/KML_Icon.cpp\
+-				  ./kml/KML_Icon.h\
+ 				  ./kml/KML_LatLonBox.cpp\
+-				  ./kml/KML_LatLonBox.h\
+ 				  ./kml/KML_LinearRing.cpp\
+-				  ./kml/KML_LinearRing.h\
+ 				  ./kml/KML_LineString.cpp\
+-				  ./kml/KML_LineString.h\
+ 				  ./kml/KML_LineStyle.cpp\
+-				  ./kml/KML_LineStyle.h\
+ 				  ./kml/KML_MultiGeometry.cpp\
+-				  ./kml/KML_MultiGeometry.h\
+ 				  ./kml/KML_Object.cpp\
+-				  ./kml/KML_Object.h\
+ 				  ./kml/KML_Overlay.cpp\
+-				  ./kml/KML_Overlay.h\
+ 				  ./kml/KML_Point.cpp\
+-				  ./kml/KML_Point.h\
+ 				  ./kml/KML_Placemark.cpp\
+-				  ./kml/KML_Placemark.h\
+ 				  ./kml/KML_Polygon.cpp\
+-				  ./kml/KML_Polygon.h\
+ 				  ./kml/KML_PolyStyle.cpp\
+-				  ./kml/KML_PolyStyle.h\
+ 				  ./kml/KML_Style.cpp\
+-				  ./kml/KML_Style.h\
+ 				  ./kml/KML_StyleSelector.cpp\
+-				  ./kml/KML_StyleSelector.h\
+ 				  ./kml/KML_SubStyle.cpp\
+-				  ./kml/KML_SubStyle.h\
+ 				  ./kml/KML_Unknown.cpp\
+-				  ./kml/KML_Unknown.h\
+-				  ./kml/KMLFileReadUtils.cpp\
+-				  ./kml/KMLFileReadUtils.h
++				  ./kml/KMLFileReadUtils.cpp
+ #}}}
+ #Modules sources{{{
+-modules_sources= ./shared/Threads/issm_threads.h\
+-			./shared/Threads/LaunchThread.cpp\
++modules_sources= ./shared/Threads/LaunchThread.cpp\
+ 			./shared/Threads/PartitionRange.cpp\
+-			./shared/Exp/exp.h\
+ 			./shared/Exp/exp.cpp\
+-			./shared/TriMesh/trimesh.h\
+ 			./shared/TriMesh/AssociateSegmentToElement.cpp\
+ 			./shared/TriMesh/GridInsideHole.cpp\
+ 			./shared/TriMesh/OrderSegments.cpp\
+ 			./shared/TriMesh/SplitMeshForRifts.cpp\
+ 			./shared/TriMesh/TriMeshUtils.cpp\
+-			./modules/TriaSearchx/TriaSearchx.h\
+ 			./modules/TriaSearchx/TriaSearchx.cpp\
+-			./modules/TriMeshx/TriMeshx.h\
+ 			./modules/TriMeshx/TriMeshx.cpp\
+-			./modules/TriMeshProcessRiftsx/TriMeshProcessRiftsx.h\
+ 			./modules/TriMeshProcessRiftsx/TriMeshProcessRiftsx.cpp\
+-			./modules/PointCloudFindNeighborsx/PointCloudFindNeighborsx.h\
+ 			./modules/PointCloudFindNeighborsx/PointCloudFindNeighborsx.cpp\
+ 			./modules/PointCloudFindNeighborsx/PointCloudFindNeighborsxt.cpp\
+ 			./modules/InterpFromGridToMeshx/InterpFromGridToMeshx.cpp\
+-			./modules/InterpFromGridToMeshx/InterpFromGridToMeshx.h\
+ 			./modules/InterpFromMesh2dx/InterpFromMesh2dx.cpp\
+ 			./modules/InterpFromMesh2dx/InterpFromMesh2dxt.cpp\
+-			./modules/InterpFromMesh2dx/InterpFromMesh2dx.h\
+ 			./modules/InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.cpp\
+-			./modules/InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.h\
+ 			./modules/InterpFromMeshToMesh3dx/InterpFromMeshToMesh3dx.cpp\
+-			./modules/InterpFromMeshToMesh3dx/InterpFromMeshToMesh3dx.h\
+ 			./modules/InterpFromMeshToGridx/InterpFromMeshToGridx.cpp\
+-			./modules/InterpFromMeshToGridx/InterpFromMeshToGridx.h\
+ 			./modules/MeshProfileIntersectionx/MeshProfileIntersectionx.cpp\
+-			./modules/MeshProfileIntersectionx/MeshProfileIntersectionx.h\
+ 			./modules/ContourToMeshx/ContourToMeshx.cpp\
+ 			./modules/ContourToMeshx/ContourToMeshxt.cpp\
+-			./modules/ContourToMeshx/ContourToMeshx.h\
+ 			./modules/ExpToLevelSetx/ExpToLevelSetx.cpp\
+ 			./modules/ExpToLevelSetx/ExpToLevelSetxt.cpp\
+-			./modules/ExpToLevelSetx/ExpToLevelSetx.h\
+ 			./modules/ContourToNodesx/ContourToNodesx.cpp\
+-			./modules/ContourToNodesx/ContourToNodesx.h\
+ 			./modules/NodeConnectivityx/NodeConnectivityx.cpp\
+-			./modules/NodeConnectivityx/NodeConnectivityx.h\
+ 			./modules/ElementConnectivityx/ElementConnectivityx.cpp\
+-			./modules/ElementConnectivityx/ElementConnectivityx.h\
+-			./modules/PropagateFlagsFromConnectivityx/PropagateFlagsFromConnectivityx.cpp\
+-			./modules/PropagateFlagsFromConnectivityx/PropagateFlagsFromConnectivityx.h
++			./modules/PropagateFlagsFromConnectivityx/PropagateFlagsFromConnectivityx.cpp
+ if CHACO
+-modules_sources+= ./modules/Chacox/Chacox.h\
+-						./modules/Chacox/Chacox.cpp\
++modules_sources+= ./modules/Chacox/Chacox.cpp\
+ 						./modules/Chacox/input_parse.cpp\
+ 						./modules/Chacox/chaco_seconds.cpp\
+ 						./modules/Chacox/user_params.cpp
+ endif
+ if SCOTCH
+-modules_sources+= ./modules/Scotchx/Scotchx.cpp\
+-						./modules/Scotchx/Scotchx.h
++modules_sources+= ./modules/Scotchx/Scotchx.cpp
+ endif
+ #}}}
+ 
+ #kriging (WRAPPER and executable)
+ #Kriging sources  {{{
+ if KRIGING
+-issm_sources +=./classes/kriging/Observations.h\
+-					./classes/kriging/Observations.cpp\
+-					./classes/kriging/Variogram.h \
+-					./classes/kriging/GaussianVariogram.h\
++issm_sources += ./classes/kriging/Observations.cpp\
+ 					./classes/kriging/GaussianVariogram.cpp\
+-					./classes/kriging/ExponentialVariogram.h\
+ 					./classes/kriging/ExponentialVariogram.cpp\
+-					./classes/kriging/SphericalVariogram.h\
+ 					./classes/kriging/SphericalVariogram.cpp\
+-					./classes/kriging/PowerVariogram.h\
+ 					./classes/kriging/PowerVariogram.cpp\
+-					./classes/kriging/Quadtree.h\
+ 					./classes/kriging/Quadtree.cpp\
+-					./classes/kriging/Covertree.h\
+ 					./classes/kriging/Covertree.cpp\
+-					./classes/kriging/Observation.h\
+ 					./classes/kriging/Observation.cpp\
+ 					./modules/Krigingx/pKrigingx.cpp
+ 
+ modules_sources +=./modules/Krigingx/Krigingx.cpp\
+-						./modules/Krigingx/Krigingx.h\
+ 						./modules/Krigingx/pKrigingx.cpp
+ endif
+ #}}}
+@@ -947,12 +624,12 @@
+ LDADD += $(FLIBS) $(FORTRANLIB)
+ endif
+ 
+-issm_SOURCES = main/issm.h main/globals.h main/issm.cpp
++issm_SOURCES = main/issm.cpp
+ issm_CXXFLAGS= -fPIC
+ 
+ if KRIGING
+ bin_PROGRAMS += kriging
+-kriging_SOURCES = main/issm.h main/globals.h main/kriging.cpp
++kriging_SOURCES = main/kriging.cpp
+ kriging_CXXFLAGS= -fPIC $(CXXFLAGS) $(CXXOPTFLAGS) $(COPTFLAGS) 
+ endif
+ #}}}
+Index: ../trunk-jpl/src/c/cores/transient_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/transient_core.cpp	(revision 19046)
++++ ../trunk-jpl/src/c/cores/transient_core.cpp	(revision 19047)
+@@ -24,7 +24,7 @@
+ 	bool       save_results,dakota_analysis;
+ 	bool       time_adapt=false;
+ 	int        output_frequency;
+-	int        domaintype,groundingline_migration,calvinglaw;
++	int        domaintype,groundingline_migration;
+ 	int        numoutputs         = 0;
+ 	Analysis  *analysis = NULL;
+ 	char**     requested_outputs = NULL;
+@@ -53,7 +53,6 @@
+ 	femmodel->parameters->FindParam(&ishydrology,TransientIshydrologyEnum);
+ 	femmodel->parameters->FindParam(&isFS,FlowequationIsFSEnum);
+ 	femmodel->parameters->FindParam(&iscalving,TransientIscalvingEnum);
+-	femmodel->parameters->FindParam(&calvinglaw,CalvingLawEnum);
+ 	if(isgroundingline) femmodel->parameters->FindParam(&groundingline_migration,GroundinglineMigrationEnum);
+ 	femmodel->parameters->FindParam(&numoutputs,TransientNumRequestedOutputsEnum);
+ 	if(numoutputs) femmodel->parameters->FindParam(&requested_outputs,&numoutputs,TransientRequestedOutputsEnum);
+@@ -102,30 +101,7 @@
+ 		}
+ 
+ 		if(islevelset){
+-			if(iscalving){
+-				switch(calvinglaw){
+-					case DefaultCalvingEnum:
+-						break;
+-					case CalvingLevermannEnum:
+-						if(VerboseSolution()) _printf0_("   computing Levermann's calving rate\n");
+-						femmodel->StrainRateparallelx();
+-						femmodel->StrainRateperpendicularx();
+-						femmodel->CalvingRateLevermannx();
+-						break;
+-					case CalvingPiEnum:
+-						if(VerboseSolution()) _printf0_("   computing Pi's calving rate\n");
+-						femmodel->StrainRateparallelx();
+-						femmodel->DeviatoricStressx();
+-						femmodel->CalvingRatePix();
+-						break;
+-					case CalvingDevEnum:
+-						femmodel->CalvingRateDevx();
+-						femmodel->ElementOperationx(&Element::CalvingRateDev);
+-						break;
+-					default:
+-						_error_("Caving law "<<EnumToStringx(calvinglaw)<<" not supported yet");
+-				}
+-			}
++			if(iscalving) Calvingx(femmodel);
+ 			if(VerboseSolution()) _printf0_("   computing levelset transport\n");
+ 			/* smoothen slope of lsf for computation of normal on ice domain*/
+ 			levelsetfunctionslope_core(femmodel);
+Index: ../trunk-jpl/src/c
+===================================================================
+--- ../trunk-jpl/src/c	(revision 19046)
++++ ../trunk-jpl/src/c	(revision 19047)
+
+Property changes on: ../trunk-jpl/src/c
+___________________________________________________________________
+Modified: svn:ignore
+## -15,6 +15,6 ##
+ g++results
+ probe.results
+ stXXXX*
+-.deps
+-.dirstamp
++*.deps
++*.dirstamp
+ .libs
+Index: ../trunk-jpl/src/wrappers/python/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/wrappers/python/Makefile.am	(revision 19046)
++++ ../trunk-jpl/src/wrappers/python/Makefile.am	(revision 19047)
+@@ -1,5 +1,5 @@
+ AM_CPPFLAGS = @DAKOTAINCL@ @PETSCINCL@ @MPIINCL@ @SPOOLESINCL@ @METISINCL@ @TRIANGLEINCL@ @CHACOINCL@ @SCOTCHINCL@ @SHAPELIBINCL@ @PYTHONINCL@ @PYTHON_NUMPYINCL@ @AMPIINCL@
+-#AUTOMAKE_OPTIONS = subdir-objects
++AUTOMAKE_OPTIONS = subdir-objects
+ 
+ EXEEXT=$(PYTHONWRAPPEREXT)
+ 
+@@ -9,9 +9,7 @@
+ #python io{{{
+ lib_LTLIBRARIES = libISSMPython.la
+ 
+-io_sources= ./include/pythonincludes.h\
+-				./io/pythonio.h\
+-				./io/WritePythonData.cpp\
++io_sources= ./io/WritePythonData.cpp\
+ 				./io/CheckNumPythonArguments.cpp\
+ 				./io/FetchPythonData.cpp
+ 
+@@ -91,67 +89,51 @@
+ AM_CXXFLAGS += $(CXXOPTFLAGS) 
+ #}}}
+ #Bin sources {{{
+-BamgConvertMesh_la_SOURCES = ../BamgConvertMesh/BamgConvertMesh.cpp\
+-									  ../BamgConvertMesh/BamgConvertMesh.h
++BamgConvertMesh_la_SOURCES = ../BamgConvertMesh/BamgConvertMesh.cpp
+ BamgConvertMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-BamgMesher_la_SOURCES = ../BamgMesher/BamgMesher.cpp\
+-								../BamgMesher/BamgMesher.h
++BamgMesher_la_SOURCES = ../BamgMesher/BamgMesher.cpp
+ BamgMesher_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-ContourToMesh_la_SOURCES = ../ContourToMesh/ContourToMesh.cpp\
+-									 ../ContourToMesh/ContourToMesh.h
++ContourToMesh_la_SOURCES = ../ContourToMesh/ContourToMesh.cpp
+ ContourToMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-ContourToNodes_la_SOURCES = ../ContourToNodes/ContourToNodes.cpp\
+-									 ../ContourToNodes/ContourToNodes.h
++ContourToNodes_la_SOURCES = ../ContourToNodes/ContourToNodes.cpp
+ ContourToNodes_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-ElementConnectivity_la_SOURCES = ../ElementConnectivity/ElementConnectivity.cpp\
+-											../ElementConnectivity/ElementConnectivity.h
++ElementConnectivity_la_SOURCES = ../ElementConnectivity/ElementConnectivity.cpp
+ ElementConnectivity_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-EnumToString_la_SOURCES = ../EnumToString/EnumToString.cpp\
+-								  ../EnumToString/EnumToString.h
++EnumToString_la_SOURCES = ../EnumToString/EnumToString.cpp
+ EnumToString_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-InterpFromMeshToMesh2d_la_SOURCES = ../InterpFromMeshToMesh2d/InterpFromMeshToMesh2d.cpp\
+-												../InterpFromMeshToMesh2d/InterpFromMeshToMesh2d.h
++InterpFromMeshToMesh2d_la_SOURCES = ../InterpFromMeshToMesh2d/InterpFromMeshToMesh2d.cpp
+ InterpFromMeshToMesh2d_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-InterpFromMeshToMesh3d_la_SOURCES = ../InterpFromMeshToMesh3d/InterpFromMeshToMesh3d.cpp\
+-												../InterpFromMeshToMesh3d/InterpFromMeshToMesh3d.h
++InterpFromMeshToMesh3d_la_SOURCES = ../InterpFromMeshToMesh3d/InterpFromMeshToMesh3d.cpp
+ InterpFromMeshToMesh3d_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-InterpFromGridToMesh_la_SOURCES = ../InterpFromGridToMesh/InterpFromGridToMesh.cpp\
+-												../InterpFromGridToMesh/InterpFromGridToMesh.h
++InterpFromGridToMesh_la_SOURCES = ../InterpFromGridToMesh/InterpFromGridToMesh.cpp
+ InterpFromGridToMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-InterpFromMeshToGrid_la_SOURCES = ../InterpFromMeshToGrid/InterpFromMeshToGrid.cpp\
+-												../InterpFromMeshToGrid/InterpFromMeshToGrid.h
++InterpFromMeshToGrid_la_SOURCES = ../InterpFromMeshToGrid/InterpFromMeshToGrid.cpp
+ InterpFromMeshToGrid_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-IssmConfig_la_SOURCES = ../IssmConfig/IssmConfig.cpp\
+-											 ../IssmConfig/IssmConfig.h
++IssmConfig_la_SOURCES = ../IssmConfig/IssmConfig.cpp
+ IssmConfig_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB)
+ 
+-MeshProfileIntersection_la_SOURCES = ../MeshProfileIntersection/MeshProfileIntersection.cpp\
+-										../MeshProfileIntersection/MeshProfileIntersection.h
++MeshProfileIntersection_la_SOURCES = ../MeshProfileIntersection/MeshProfileIntersection.cpp
+ MeshProfileIntersection_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-NodeConnectivity_la_SOURCES = ../NodeConnectivity/NodeConnectivity.cpp\
+-										../NodeConnectivity/NodeConnectivity.h
++NodeConnectivity_la_SOURCES = ../NodeConnectivity/NodeConnectivity.cpp
+ NodeConnectivity_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-StringToEnum_la_SOURCES = ../StringToEnum/StringToEnum.cpp\
+-								  ../StringToEnum/StringToEnum.h
++StringToEnum_la_SOURCES = ../StringToEnum/StringToEnum.cpp
+ StringToEnum_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-TriMesh_la_SOURCES = ../TriMesh/TriMesh.cpp\
+-							../TriMesh/TriMesh.h
++TriMesh_la_SOURCES = ../TriMesh/TriMesh.cpp
+ TriMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(TRIANGLELIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-TriMeshProcessRifts_la_SOURCES = ../TriMeshProcessRifts/TriMeshProcessRifts.cpp\
+-											../TriMeshProcessRifts/TriMeshProcessRifts.h
++TriMeshProcessRifts_la_SOURCES = ../TriMeshProcessRifts/TriMeshProcessRifts.cpp
+ TriMeshProcessRifts_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ #}}}
+Index: ../trunk-jpl/src/wrappers/M1qn3
+===================================================================
+--- ../trunk-jpl/src/wrappers/M1qn3	(revision 19046)
++++ ../trunk-jpl/src/wrappers/M1qn3	(revision 19047)
+
+Property changes on: ../trunk-jpl/src/wrappers/M1qn3
+___________________________________________________________________
+Modified: svn:ignore
+## -1 +1,2 ##
+ .deps
++.dirstamp
+Index: ../trunk-jpl/src/wrappers/matlab/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/wrappers/matlab/Makefile.am	(revision 19046)
++++ ../trunk-jpl/src/wrappers/matlab/Makefile.am	(revision 19047)
+@@ -9,9 +9,7 @@
+ #matlab io{{{
+ lib_LTLIBRARIES = libISSMMatlab.la
+ 
+-io_sources= ./include/matlabincludes.h\
+-				./io/matlabio.h\
+-				./io/CheckNumMatlabArguments.cpp\
++io_sources= ./io/CheckNumMatlabArguments.cpp\
+ 				./io/WriteMatlabData.cpp\
+ 				./io/FetchMatlabData.cpp
+ 
+@@ -122,152 +120,115 @@
+ libISSMApi_la_LDFLAGS = -static 
+ endif
+ 
+-BamgMesher_la_SOURCES = ../BamgMesher/BamgMesher.cpp\
+-								../BamgMesher/BamgMesher.h
++BamgMesher_la_SOURCES = ../BamgMesher/BamgMesher.cpp
+ BamgMesher_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-BamgConvertMesh_la_SOURCES = ../BamgConvertMesh/BamgConvertMesh.cpp\
+-									  ../BamgConvertMesh/BamgConvertMesh.h
++BamgConvertMesh_la_SOURCES = ../BamgConvertMesh/BamgConvertMesh.cpp
+ BamgConvertMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-BamgTriangulate_la_SOURCES = ../BamgTriangulate/BamgTriangulate.cpp\
+-									  ../BamgTriangulate/BamgTriangulate.h
++BamgTriangulate_la_SOURCES = ../BamgTriangulate/BamgTriangulate.cpp
+ BamgTriangulate_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-Chaco_la_SOURCES = ../Chaco/Chaco.cpp\
+-						 ../Chaco/Chaco.h
++Chaco_la_SOURCES = ../Chaco/Chaco.cpp
+ Chaco_la_LIBADD = ${deps} $(MPILIB) $(CHACOLIB) $(GSLLIB) $(PROJ4LIB) $(PETSCLIB)
+ 
+-ContourToMesh_la_SOURCES = ../ContourToMesh/ContourToMesh.cpp\
+-									../ContourToMesh/ContourToMesh.h
++ContourToMesh_la_SOURCES = ../ContourToMesh/ContourToMesh.cpp
+ ContourToMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-ExpToLevelSet_la_SOURCES = ../ExpToLevelSet/ExpToLevelSet.cpp\
+-									../ExpToLevelSet/ExpToLevelSet.h
++ExpToLevelSet_la_SOURCES = ../ExpToLevelSet/ExpToLevelSet.cpp
+ ExpToLevelSet_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+ 
+-ContourToNodes_la_SOURCES = ../ContourToNodes/ContourToNodes.cpp\
+-									 ../ContourToNodes/ContourToNodes.h
++ContourToNodes_la_SOURCES = ../ContourToNodes/ContourToNodes.cpp
+ ContourToNodes_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-ElementConnectivity_la_SOURCES = ../ElementConnectivity/ElementConnectivity.cpp\
+-											../ElementConnectivity/ElementConnectivity.h
++ElementConnectivity_la_SOURCES = ../ElementConnectivity/ElementConnectivity.cpp
+ ElementConnectivity_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-EnumToString_la_SOURCES = ../EnumToString/EnumToString.cpp\
+-								  ../EnumToString/EnumToString.h
++EnumToString_la_SOURCES = ../EnumToString/EnumToString.cpp
+ EnumToString_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-StringToEnum_la_SOURCES = ../StringToEnum/StringToEnum.cpp\
+-								  ../StringToEnum/StringToEnum.h
++StringToEnum_la_SOURCES = ../StringToEnum/StringToEnum.cpp
+ StringToEnum_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-InterpFromGridToMesh_la_SOURCES = ../InterpFromGridToMesh/InterpFromGridToMesh.cpp\
+-											 ../InterpFromGridToMesh/InterpFromGridToMesh.h
++InterpFromGridToMesh_la_SOURCES = ../InterpFromGridToMesh/InterpFromGridToMesh.cpp
+ InterpFromGridToMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-InterpFromMeshToMesh2d_la_SOURCES = ../InterpFromMeshToMesh2d/InterpFromMeshToMesh2d.cpp\
+-												../InterpFromMeshToMesh2d/InterpFromMeshToMesh2d.h
++InterpFromMeshToMesh2d_la_SOURCES = ../InterpFromMeshToMesh2d/InterpFromMeshToMesh2d.cpp
+ InterpFromMeshToMesh2d_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-InterpFromMeshToMesh3d_la_SOURCES = ../InterpFromMeshToMesh3d/InterpFromMeshToMesh3d.cpp\
+-												../InterpFromMeshToMesh3d/InterpFromMeshToMesh3d.h
++InterpFromMeshToMesh3d_la_SOURCES = ../InterpFromMeshToMesh3d/InterpFromMeshToMesh3d.cpp
+ InterpFromMeshToMesh3d_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-InterpFromMeshToGrid_la_SOURCES = ../InterpFromMeshToGrid/InterpFromMeshToGrid.cpp\
+-											 ../InterpFromMeshToGrid/InterpFromMeshToGrid.h
++InterpFromMeshToGrid_la_SOURCES = ../InterpFromMeshToGrid/InterpFromMeshToGrid.cpp
+ InterpFromMeshToGrid_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-InterpFromMesh2d_la_SOURCES = ../InterpFromMesh2d/InterpFromMesh2d.cpp\
+-										../InterpFromMesh2d/InterpFromMesh2d.h
++InterpFromMesh2d_la_SOURCES = ../InterpFromMesh2d/InterpFromMesh2d.cpp
+ InterpFromMesh2d_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-IssmConfig_la_SOURCES = ../IssmConfig/IssmConfig.cpp\
+-										../IssmConfig/IssmConfig.h
++IssmConfig_la_SOURCES = ../IssmConfig/IssmConfig.cpp
+ IssmConfig_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB)
+ 
+-KMLFileRead_la_SOURCES = ../KMLFileRead/KMLFileRead.cpp\
+-								 ../KMLFileRead/KMLFileRead.h
++KMLFileRead_la_SOURCES = ../KMLFileRead/KMLFileRead.cpp
+ KMLFileRead_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-KMLMeshWrite_la_SOURCES = ../KMLMeshWrite/KMLMeshWrite.cpp\
+-								  ../KMLMeshWrite/KMLMeshWrite.h
++KMLMeshWrite_la_SOURCES = ../KMLMeshWrite/KMLMeshWrite.cpp
+ KMLMeshWrite_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-KMLOverlay_la_SOURCES = ../KMLOverlay/KMLOverlay.cpp\
+-								../KMLOverlay/KMLOverlay.h
++KMLOverlay_la_SOURCES = ../KMLOverlay/KMLOverlay.cpp
+ KMLOverlay_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-Xy2ll_la_SOURCES = ../Xy2ll/Xy2ll.cpp\
+-						 ../Xy2ll/Xy2ll.h
++Xy2ll_la_SOURCES = ../Xy2ll/Xy2ll.cpp
+ Xy2ll_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-Ll2xy_la_SOURCES = ../Ll2xy/Ll2xy.cpp\
+-						 ../Ll2xy/Ll2xy.h
++Ll2xy_la_SOURCES = ../Ll2xy/Ll2xy.cpp
+ Ll2xy_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-ExpSimplify_la_SOURCES = ../ExpSimplify/ExpSimplify.cpp\
+-							../ExpSimplify/ExpSimplify.h
++ExpSimplify_la_SOURCES = ../ExpSimplify/ExpSimplify.cpp
+ ExpSimplify_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-Exp2Kml_la_SOURCES = ../Exp2Kml/Exp2Kml.cpp\
+-							../Exp2Kml/Exp2Kml.h
++Exp2Kml_la_SOURCES = ../Exp2Kml/Exp2Kml.cpp
+ Exp2Kml_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-Kml2Exp_la_SOURCES = ../Kml2Exp/Kml2Exp.cpp\
+-							../Kml2Exp/Kml2Exp.h
++Kml2Exp_la_SOURCES = ../Kml2Exp/Kml2Exp.cpp
+ Kml2Exp_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-Kriging_la_SOURCES = ../Kriging/Kriging.cpp\
+-							../Kriging/Kriging.h
++Kriging_la_SOURCES = ../Kriging/Kriging.cpp
+ Kriging_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-MeshPartition_la_SOURCES = ../MeshPartition/MeshPartition.cpp\
+-									../MeshPartition/MeshPartition.h
++MeshPartition_la_SOURCES = ../MeshPartition/MeshPartition.cpp
+ MeshPartition_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(METISLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-M1qn3_la_SOURCES = ../M1qn3/M1qn3.cpp\
+-									../M1qn3/M1qn3.h
++M1qn3_la_SOURCES = ../M1qn3/M1qn3.cpp
+ M1qn3_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(METISLIB) $(M1QN3LIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-MeshProfileIntersection_la_SOURCES = ../MeshProfileIntersection/MeshProfileIntersection.cpp\
+-												 ../MeshProfileIntersection/MeshProfileIntersection.h
++MeshProfileIntersection_la_SOURCES = ../MeshProfileIntersection/MeshProfileIntersection.cpp
+ MeshProfileIntersection_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-NodeConnectivity_la_SOURCES = ../NodeConnectivity/NodeConnectivity.cpp\
+-										../NodeConnectivity/NodeConnectivity.h
++NodeConnectivity_la_SOURCES = ../NodeConnectivity/NodeConnectivity.cpp
+ NodeConnectivity_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-PointCloudFindNeighbors_la_SOURCES = ../PointCloudFindNeighbors/PointCloudFindNeighbors.cpp\
+-												 ../PointCloudFindNeighbors/PointCloudFindNeighbors.h
++PointCloudFindNeighbors_la_SOURCES = ../PointCloudFindNeighbors/PointCloudFindNeighbors.cpp
+ PointCloudFindNeighbors_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(MULTITHREADINGLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-PropagateFlagsFromConnectivity_la_SOURCES = ../PropagateFlagsFromConnectivity/PropagateFlagsFromConnectivity.cpp\
+-														  ../PropagateFlagsFromConnectivity/PropagateFlagsFromConnectivity.h
++PropagateFlagsFromConnectivity_la_SOURCES = ../PropagateFlagsFromConnectivity/PropagateFlagsFromConnectivity.cpp
+ PropagateFlagsFromConnectivity_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-Scotch_la_SOURCES = ../Scotch/Scotch.cpp\
+-						  ../Scotch/Scotch.h
++Scotch_la_SOURCES = ../Scotch/Scotch.cpp
+ Scotch_la_LIBADD = ${deps} $(SCOTCHLIB) $(MPILIB) $(BLASLAPACKLIB)
+ 
+-ShpRead_la_SOURCES = ../ShpRead/ShpRead.cpp\
+-							../ShpRead/ShpRead.h
++ShpRead_la_SOURCES = ../ShpRead/ShpRead.cpp
+ ShpRead_la_LIBADD = ${deps} $(SHAPELIBLIB) $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-Shp2Kml_la_SOURCES = ../Shp2Kml/Shp2Kml.cpp\
+-							../Shp2Kml/Shp2Kml.h
++Shp2Kml_la_SOURCES = ../Shp2Kml/Shp2Kml.cpp
+ Shp2Kml_la_LIBADD = ${deps} $(SHAPELIBLIB) $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-TriaSearch_la_SOURCES = ../TriaSearch/TriaSearch.cpp\
+-								../TriaSearch/TriaSearch.h
++TriaSearch_la_SOURCES = ../TriaSearch/TriaSearch.cpp
+ TriaSearch_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-TriMesh_la_SOURCES = ../TriMesh/TriMesh.cpp\
+-							../TriMesh/TriMesh.h
++TriMesh_la_SOURCES = ../TriMesh/TriMesh.cpp
+ TriMesh_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(TRIANGLELIB) $(GSLLIB) $(PROJ4LIB)
+ 
+-TriMeshProcessRifts_la_SOURCES = ../TriMeshProcessRifts/TriMeshProcessRifts.cpp\
+-											../TriMeshProcessRifts/TriMeshProcessRifts.h
++TriMeshProcessRifts_la_SOURCES = ../TriMeshProcessRifts/TriMeshProcessRifts.cpp
+ TriMeshProcessRifts_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)
+ #}}}
+Index: ../trunk-jpl/src/wrappers/ExpToLevelSet
+===================================================================
+--- ../trunk-jpl/src/wrappers/ExpToLevelSet	(revision 19046)
++++ ../trunk-jpl/src/wrappers/ExpToLevelSet	(revision 19047)
+
+Property changes on: ../trunk-jpl/src/wrappers/ExpToLevelSet
+___________________________________________________________________
+Modified: svn:ignore
+## -1 +1,2 ##
+ .deps
++.dirstamp
+Index: ../trunk-jpl/src/wrappers
+===================================================================
+--- ../trunk-jpl/src/wrappers	(revision 19046)
++++ ../trunk-jpl/src/wrappers	(revision 19047)
+
+Property changes on: ../trunk-jpl/src/wrappers
+___________________________________________________________________
+Modified: svn:ignore
+## -15,3 +15,4 ##
+ *.mexw32.manifest
+ *.mexw32.map
+ *.exe.manifest
++.dirstamp
Index: /issm/oecreview/Archive/18296-19100/ISSM-19047-19048.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19047-19048.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19047-19048.diff	(revision 19102)
@@ -0,0 +1,1777 @@
+Index: ../trunk-jpl/src/m/dev/issmversion.m
+===================================================================
+--- ../trunk-jpl/src/m/dev/issmversion.m	(revision 19047)
++++ ../trunk-jpl/src/m/dev/issmversion.m	(revision 19048)
+@@ -16,7 +16,7 @@
+ disp(['Build date: ' IssmConfig('PACKAGE_BUILD_DATE')]);
+ disp(['Compiled on ' IssmConfig('HOST_VENDOR') ' ' IssmConfig('HOST_OS') ' ' IssmConfig('HOST_ARCH') ' by ' IssmConfig('USER_NAME')]);
+ disp([' ']);
+-disp(['Copyright (c) 2009-2014 California Institute of Technology']);
++disp(['Copyright (c) 2009-2015 California Institute of Technology']);
+ disp([' ']);
+ disp(['    to get started type: issmdoc']);
+ disp([' ']);
+Index: ../trunk-jpl/src/m/classes/initialization.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/initialization.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/initialization.m	(revision 19048)
+@@ -35,6 +35,21 @@
+ 			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','<parameter key ="watercolumn" type="',class(self.watercolumn),'" default="',self.watercolumn,'">','     <section name="initialization" />','     <help> thickness of subglacial water [m] </help>','</parameter>');
+ 			fprintf(fid,'%s\n%s\n','</frame>');
+ 		end % }}}
++		function self = extrude(self,md) % {{{
++			self.vx=project3d(md,'vector',self.vx,'type','node');
++			self.vy=project3d(md,'vector',self.vy,'type','node');
++			self.vz=project3d(md,'vector',self.vz,'type','node');
++			self.vel=project3d(md,'vector',self.vel,'type','node');
++			self.temperature=project3d(md,'vector',self.temperature,'type','node');
++			self.waterfraction=project3d(md,'vector',self.waterfraction,'type','node');
++			self.watercolumn=project3d(md,'vector',self.watercolumn,'type','node','layer',1);
++			self.sediment_head=project3d(md,'vector',self.sediment_head,'type','node','layer',1);
++			self.epl_head=project3d(md,'vector',self.epl_head,'type','node','layer',1);
++			self.epl_thickness=project3d(md,'vector',self.epl_thickness,'type','node','layer',1);
++
++			%Lithostatic pressure by default
++			self.pressure=md.constants.g*md.materials.rho_ice*(md.geometry.surface-md.mesh.z);
++		end % }}}
+ 		function self = initialization(varargin) % {{{
+ 			switch nargin
+ 				case 0
+Index: ../trunk-jpl/src/m/classes/m1qn3inversion.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/m1qn3inversion.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/m1qn3inversion.py	(revision 19048)
+@@ -1,4 +1,5 @@
+ import numpy
++from project3d import project3d
+ from fielddisplay import fielddisplay
+ from EnumDefinitions import *
+ from StringToEnum import StringToEnum
+@@ -93,6 +94,19 @@
+ 		string="%s\n%s"%(string,'   503: ThicknessAbsGradient')
+ 		return string
+ 		#}}}
++	def extrude(self,md): # {{{
++		self.vx_obs=project3d(md,'vector',self.vx_obs,'type','node')
++		self.vy_obs=project3d(md,'vector',self.vy_obs,'type','node')
++		self.vel_obs=project3d(md,'vector',self.vel_obs,'type','node')
++		self.thickness_obs=project3d(md,'vector',self.thickness_obs,'type','node')
++		if not numpy.any(numpy.isnan(self.cost_functions_coefficients)):
++			self.cost_functions_coefficients=project3d(md,'vector',self.cost_functions_coefficients,'type','node')
++		if not numpy.any(numpy.isnan(self.min_parameters)):
++			self.min_parameters=project3d(md,'vector',self.min_parameters,'type','node')
++		if not numpy.any(numpy.isnan(self.max_parameters)):
++			self.max_parameters=project3d(md,'vector',self.max_parameters,'type','node')
++		return self
++	#}}}
+ 	def setdefaultparameters(self): # {{{
+ 		
+ 		#default is incomplete adjoint for now
+Index: ../trunk-jpl/src/m/classes/thermal.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/thermal.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/thermal.py	(revision 19048)
+@@ -1,4 +1,5 @@
+ import numpy
++from project3d import project3d
+ from fielddisplay import fielddisplay
+ from EnumDefinitions import *
+ from checkfield import checkfield
+@@ -42,6 +43,14 @@
+ 		string="%s\n%s"%(string,fielddisplay(self,'requested_outputs','additional outputs requested'))
+ 		return string
+ 		#}}}
++	def extrude(self,md): # {{{
++		self.spctemperature=project3d(md,'vector',self.spctemperature,'type','node','layer',md.mesh.numberoflayers,'padding',numpy.nan)
++		if isinstance(md.initialization.temperature,numpy.ndarray) and numpy.size(md.initialization.temperature,axis=0)==md.mesh.numberofvertices:
++			self.spctemperature=numpy.nan*numpy.ones((md.mesh.numberofvertices,1))
++			pos=numpy.nonzero(md.mesh.vertexonsurface)[0]
++			self.spctemperature[pos]=md.initialization.temperature[pos]    #impose observed temperature on surface
++		return self
++	#}}}
+ 	def defaultoutputs(self,md): # {{{
+ 
+ 		if self.isenthalpy:
+Index: ../trunk-jpl/src/m/classes/gia.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/gia.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/gia.py	(revision 19048)
+@@ -1,4 +1,5 @@
+ from fielddisplay import fielddisplay
++from project3d import project3d
+ from EnumDefinitions import *
+ from checkfield import checkfield
+ from WriteData import WriteData
+@@ -29,6 +30,11 @@
+ 		string="%s\n%s"%(string,fielddisplay(self,'cross_section_shape',"1: square-edged, 2: elliptical-edged surface"))
+ 		return string
+ 		#}}}
++	def extrude(self,md): # {{{
++		self.mantle_viscosity=project3d(md,'vector',self.mantle_viscosity,'type','node')
++		self.lithosphere_thickness=project3d(md,'vector',self.lithosphere_thickness,'type','node')
++		return self
++	#}}}
+ 	def setdefaultparameters(self): # {{{
+ 
+ 		self.cross_section_shape=1; 
+Index: ../trunk-jpl/src/m/classes/matdamageice.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/matdamageice.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/matdamageice.py	(revision 19048)
+@@ -1,4 +1,5 @@
+ from fielddisplay import fielddisplay
++from project3d import project3d
+ from EnumDefinitions import MaterialsEnum, MatdamageiceEnum, MaterialsRheologyLawEnum, MaterialsRhoSeawaterEnum
+ from StringToEnum import StringToEnum
+ from checkfield import checkfield
+@@ -62,6 +63,11 @@
+ 
+ 		return string
+ 		#}}}
++	def extrude(self,md): # {{{
++		self.rheology_B=project3d(md,'vector',self.rheology_B,'type','node')
++		self.rheology_n=project3d(md,'vector',self.rheology_n,'type','element')
++		return self
++	#}}}
+ 	def setdefaultparameters(self): # {{{
+ 		#ice density (kg/m^3)
+ 		self.rho_ice=917.
+Index: ../trunk-jpl/src/m/classes/frictionweertman.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionweertman.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/frictionweertman.py	(revision 19048)
+@@ -1,4 +1,5 @@
+ from fielddisplay import fielddisplay
++from project3d import project3d
+ from EnumDefinitions import *
+ from checkfield import checkfield
+ from WriteData import WriteData
+Index: ../trunk-jpl/src/m/classes/frictionwaterlayer.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionwaterlayer.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/frictionwaterlayer.m	(revision 19048)
+@@ -35,6 +35,12 @@
+ 			md = checkfield(md,'fieldname','thermal.spctemperature','timeseries',1,'>=',0.);
+ 
+ 		end % }}}
++		function self = extrude(self,md) % {{{
++			self.coefficient=project3d(md,'vector',self.coefficient,'type','node','layer',1);
++			self.p=project3d(md,'vector',self.p,'type','element');
++			self.q=project3d(md,'vector',self.q,'type','element');
++			self.water_layer=project3d(md,'vector',self.water_layer,'type','node','layer',1);
++		end % }}}
+ 		function disp(self) % {{{
+ 			disp(sprintf('Basal shear stress parameters: tau_b = coefficient^2 * Neff ^r * |u_b|^(s-1) * u_b * 1/f(T)\n(effective stress Neff=rho_ice*g*thickness+rho_water*g*(bed+water_layer), r=q/p and s=1/p)'));
+ 			fielddisplay(self,'coefficient','frictiontemp coefficient [SI]');
+Index: ../trunk-jpl/src/m/classes/calving.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/calving.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/calving.py	(revision 19048)
+@@ -1,4 +1,5 @@
+ from fielddisplay import fielddisplay
++from project3d import project3d
+ from EnumDefinitions import *
+ from StringToEnum import StringToEnum
+ from checkfield import checkfield
+@@ -30,6 +31,11 @@
+ 
+ 		return string
+ 		#}}}
++	def extrude(self,md): # {{{
++		self.calvingrate=project3d(md,'vector',self.calvingrate,'type','node')
++		self.meltingrate=project3d(md,'vector',self.meltingrate,'type','node')
++		return self
++	#}}}
+ 	def setdefaultparameters(self): # {{{
+ 
+ 		#stabilization = 2 by default
+Index: ../trunk-jpl/src/m/classes/m1qn3inversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 19048)
+@@ -26,6 +26,15 @@
+ 
+ 	end
+ 	methods
++		function self = extrude(self,md) % {{{
++			self.vx_obs=project3d(md,'vector',self.vx_obs,'type','node');
++			self.vy_obs=project3d(md,'vector',self.vy_obs,'type','node');
++			self.vel_obs=project3d(md,'vector',self.vel_obs,'type','node');
++			self.thickness_obs=project3d(md,'vector',self.thickness_obs,'type','node');
++			if numel(self.cost_functions_coefficients)>1,self.cost_functions_coefficients=project3d(md,'vector',self.cost_functions_coefficients,'type','node');end;
++			if numel(self.min_parameters)>1,self.min_parameters=project3d(md,'vector',self.min_parameters,'type','node');end;
++			if numel(self.max_parameters)>1,self.max_parameters=project3d(md,'vector',self.max_parameters,'type','node');end;
++		end % }}}
+ 		function self = m1qn3inversion(varargin) % {{{
+ 			switch nargin
+ 				case 0
+Index: ../trunk-jpl/src/m/classes/thermal.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/thermal.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/thermal.m	(revision 19048)
+@@ -17,30 +17,38 @@
+ 		requested_outputs = {};
+ 	end
+ 	methods
+-        function createxml(self,fid) % {{{
+-            fprintf(fid, '<!-- thermal -->\n');            
+-                    
+-            % thermal solution parameters
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Thermal solution parameters">','<section name="thermal" />');                    
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="spctemperature" type="',class(self.spctemperature),'" default="',convert2str(self.spctemperature),'">','     <section name="thermal" />','     <help> temperature constraints (NaN means no constraint) [K] </help>','  </parameter>');
+-                
+-            % penalty_threshold drop-down (0, 1, or 2)
+-            fprintf(fid,'%s\n%s\n%s\n%s\n','  <parameter key ="penalty_threshold" type="alternative"  optional="false">','     <section name="thermal" />','     <help> 0: no, 1: artificial_diffusivity, 2: SUPG </help>');
+-            fprintf(fid,'%s\n','       <option value="0" type="string" default="true"> </option>');
+-            fprintf(fid,'%s\n','       <option value="1" type="string" default="false"> </option>');
+-            fprintf(fid,'%s\n%s\n','       <option value="2" type="string" default="false"> </option>','</parameter>');
++		function createxml(self,fid) % {{{
++			fprintf(fid, '<!-- thermal -->\n');            
+ 
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="stabilization" type="',class(self.stabilization),'" default="',convert2str(self.stabilization),'">','     <section name="thermal" />','     <help> maximum number of non linear iterations </help>','  </parameter>');
+-				fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="reltol" type="',class(self.reltol),'" default="',convert2str(self.reltol),'">','     <section name="steadystate" />','     <help> relative tolerance criterion [K] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="maxiter" type="',class(self.maxiter),'" default="',convert2str(self.maxiter),'">','     <section name="thermal" />','     <help> stabilize unstable thermal constraints that keep zigzagging after n iteration (default is 0, no stabilization) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="penalty_lock" type="',class(self.penalty_lock),'" default="',convert2str(self.penalty_lock),'">','     <section name="thermal" />','     <help> threshold to declare convergence of thermal solution (default is 0)  </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="penalty_factor" type="',class(self.penalty_factor),'" default="',convert2str(self.penalty_factor),'">','     <section name="thermal" />','     <help> scaling exponent (default is 3) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isenthalpy" type="',class(self.isenthalpy),'" default="',convert2str(self.isenthalpy),'">','     <section name="thermal" />','     <help> use an enthalpy formulation to include temperate ice (default is 0) </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isdynamicbasalspc" type="',class(self.isdynamicbasalspc),'" default="',convert2str(self.isdynamicbasalspc),'">','     <section name="thermal" />','     <help> enable dynamic setting of basal forcing. recommended for enthalpy formulation (default is 0)  </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="requested_outputs" type="',class(self.requested_outputs),'" default="',convert2str(self.requested_outputs),'">','     <section name="thermal" />','     <help> additional outputs requested </help>','  </parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');    
+-        
+-        end % }}}
++			% thermal solution parameters
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Thermal solution parameters">','<section name="thermal" />');                    
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="spctemperature" type="',class(self.spctemperature),'" default="',convert2str(self.spctemperature),'">','     <section name="thermal" />','     <help> temperature constraints (NaN means no constraint) [K] </help>','  </parameter>');
++
++			% penalty_threshold drop-down (0, 1, or 2)
++			fprintf(fid,'%s\n%s\n%s\n%s\n','  <parameter key ="penalty_threshold" type="alternative"  optional="false">','     <section name="thermal" />','     <help> 0: no, 1: artificial_diffusivity, 2: SUPG </help>');
++			fprintf(fid,'%s\n','       <option value="0" type="string" default="true"> </option>');
++			fprintf(fid,'%s\n','       <option value="1" type="string" default="false"> </option>');
++			fprintf(fid,'%s\n%s\n','       <option value="2" type="string" default="false"> </option>','</parameter>');
++
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="stabilization" type="',class(self.stabilization),'" default="',convert2str(self.stabilization),'">','     <section name="thermal" />','     <help> maximum number of non linear iterations </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="reltol" type="',class(self.reltol),'" default="',convert2str(self.reltol),'">','     <section name="steadystate" />','     <help> relative tolerance criterion [K] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="maxiter" type="',class(self.maxiter),'" default="',convert2str(self.maxiter),'">','     <section name="thermal" />','     <help> stabilize unstable thermal constraints that keep zigzagging after n iteration (default is 0, no stabilization) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="penalty_lock" type="',class(self.penalty_lock),'" default="',convert2str(self.penalty_lock),'">','     <section name="thermal" />','     <help> threshold to declare convergence of thermal solution (default is 0)  </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="penalty_factor" type="',class(self.penalty_factor),'" default="',convert2str(self.penalty_factor),'">','     <section name="thermal" />','     <help> scaling exponent (default is 3) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isenthalpy" type="',class(self.isenthalpy),'" default="',convert2str(self.isenthalpy),'">','     <section name="thermal" />','     <help> use an enthalpy formulation to include temperate ice (default is 0) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isdynamicbasalspc" type="',class(self.isdynamicbasalspc),'" default="',convert2str(self.isdynamicbasalspc),'">','     <section name="thermal" />','     <help> enable dynamic setting of basal forcing. recommended for enthalpy formulation (default is 0)  </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="requested_outputs" type="',class(self.requested_outputs),'" default="',convert2str(self.requested_outputs),'">','     <section name="thermal" />','     <help> additional outputs requested </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');    
++
++		end % }}}
++		function self = extrude(self,md) % {{{
++			self.spctemperature=project3d(md,'vector',self.spctemperature,'type','node','layer',md.mesh.numberoflayers,'padding',NaN);
++			if (length(md.initialization.temperature)==md.mesh.numberofvertices),
++				self.spctemperature=NaN(md.mesh.numberofvertices,1);
++				pos=find(md.mesh.vertexonsurface);
++				self.spctemperature(pos)=md.initialization.temperature(pos); %impose observed temperature on surface
++			end
++		end % }}}
+ 		function self = thermal(varargin) % {{{
+ 			switch nargin
+ 				case 0
+Index: ../trunk-jpl/src/m/classes/initialization.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/initialization.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/initialization.py	(revision 19048)
+@@ -1,4 +1,5 @@
+ import numpy
++from project3d import project3d
+ from fielddisplay import fielddisplay
+ from EnumDefinitions import *
+ from checkfield import checkfield
+@@ -47,6 +48,22 @@
+ 
+ 		return string
+ 		#}}}
++	def extrude(self,md): # {{{
++		self.vx=project3d(md,'vector',self.vx,'type','node')
++		self.vy=project3d(md,'vector',self.vy,'type','node')
++		self.vz=project3d(md,'vector',self.vz,'type','node')
++		self.vel=project3d(md,'vector',self.vel,'type','node')
++		self.temperature=project3d(md,'vector',self.temperature,'type','node')
++		self.waterfraction=project3d(md,'vector',self.waterfraction,'type','node')
++		self.watercolumn=project3d(md,'vector',self.watercolumn,'type','node')
++		self.sediment_head=project3d(md,'vector',self.sediment_head,'type','node','layer',1)
++		self.epl_head=project3d(md,'vector',self.epl_head,'type','node','layer',1)
++		self.epl_thickness=project3d(md,'vector',self.epl_thickness,'type','node','layer',1)
++
++		#Lithostatic pressure by default
++		self.pressure=md.constants.g*md.materials.rho_ice*(md.geometry.surface-md.mesh.z.reshape(-1,1))
++		return self
++	#}}}
+ 	def setdefaultparameters(self): # {{{
+ 		return self
+ 	#}}}
+Index: ../trunk-jpl/src/m/classes/mask.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/mask.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/mask.py	(revision 19048)
+@@ -1,5 +1,6 @@
+ import numpy
+ from fielddisplay import fielddisplay
++from project3d import project3d
+ from EnumDefinitions import *
+ from checkfield import checkfield
+ from WriteData import WriteData
+@@ -27,6 +28,11 @@
+ 		string="%s\n%s"%(string,fielddisplay(self,"ice_levelset","presence of ice if < 0, icefront position if = 0, no ice if > 0"))
+ 		return string
+ 		#}}}
++	def extrude(self,md): # {{{
++		self.ice_levelset=project3d(md,'vector',self.ice_levelset,'type','node')
++		self.groundedice_levelset=project3d(md,'vector',self.groundedice_levelset,'type','node')
++		return self
++	#}}}
+ 	def setdefaultparameters(self): # {{{
+ 		return self
+ 	#}}}
+Index: ../trunk-jpl/src/m/classes/calvinglevermann.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvinglevermann.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/calvinglevermann.py	(revision 19048)
+@@ -29,6 +29,11 @@
+ 
+ 		return string
+ 		#}}}
++	def extrude(self,md): # {{{
++		self.coeff=project3d(md,'vector',self.coeff,'type','node')
++		self.meltingrate=project3d(md,'vector',self.meltingrate,'type','node')
++		return self
++	#}}}
+ 	def setdefaultparameters(self): # {{{
+ 
+ 		#stabilization = 2 by default
+Index: ../trunk-jpl/src/m/classes/qmu.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/qmu.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/qmu.m	(revision 19048)
+@@ -23,35 +23,38 @@
+ 		vertex_weight               = NaN;
+ 	end
+ 	methods
+-        function createxml(self,fid) % {{{
+-            fprintf(fid, '<!-- qmu -->\n');            
+-                    
+-            % qmu solution parameters
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="qmu parameters">','<section name="qmu" />');                    
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isdakota" type="',class(self.isdakota),'" default="',convert2str(self.isdakota),'">','     <section name="qmu" />','     <help> is qmu analysis activated? </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="variables" type="',class(self.variables),'" default="',convert2str(self.variables),'">','     <section name="qmu" />','     <help> (arrays of each variable class) </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="responses" type="',class(self.responses),'" default="',convert2str(self.responses),'">','     <section name="qmu" />','     <help> (arrays of each response class) </help>','  </parameter>');
+-                
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberofresponses" type="',class(self.numberofresponses),'" default="',convert2str(self.numberofresponses),'">','     <section name="qmu" />','     <help> number of responses </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="params" type="',class(self.params),'" default="',convert2str(self.params),'">','     <section name="qmu" />','     <help> (array of method-independent parameters)  </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="results" type="',class(self.results),'" default="',convert2str(self.results),'">','     <section name="qmu" />','     <help> (information from dakota files) </help>','  </parameter>');
+-                
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="partition" type="',class(self.partition),'" default="',convert2str(self.partition),'">','     <section name="qmu" />','     <help> user provided mesh partitioning, defaults to metis if not specified </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberofpartitions" type="',class(self.numberofpartitions),'" default="',convert2str(self.numberofpartitions),'">','     <section name="qmu" />','     <help> number of partitions for semi-discrete qmu  </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="variabledescriptors" type="',class(self.variabledescriptors),'" default="',convert2str(self.variabledescriptors),'">','     <section name="qmu" />','     <help>  </help>','  </parameter>');
+-            
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="responsedescriptors" type="',class(self.responsedescriptors),'" default="',convert2str(self.responsedescriptors),'">','     <section name="qmu" />','     <help> use an enthalpy formulation to include temperate ice (default is 0) </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="method" type="',class(self.method),'" default="',convert2str(self.method),'">','     <section name="qmu" />','     <help> array of dakota_method class </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="mass_flux_profile_directory" type="',class(self.mass_flux_profile_directory),'" default="',convert2str(self.mass_flux_profile_directory),'">','     <section name="qmu" />','     <help> directory for mass flux profiles </help>','  </parameter>');
+-                
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="mass_flux_profiles" type="',class(self.mass_flux_profiles),'" default="',convert2str(self.mass_flux_profiles),'">','     <section name="qmu" />','     <help>  </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="mass_flux_segments" type="',class(self.mass_flux_segments),'" default="',convert2str(self.mass_flux_segments),'">','     <section name="qmu" />','     <help>  </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="adjacency" type="',class(self.adjacency),'" default="',convert2str(self.adjacency),'">','     <section name="qmu" />','     <help> additional outputs requested </help>','  </parameter>');
+-                fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertex_weight" type="',class(self.vertex_weight),'" default="',convert2str(self.vertex_weight),'">','     <section name="qmu" />','     <help> weight applied to each mesh vertex </help>','  </parameter>');
+-            
+-            fprintf(fid,'%s\n%s\n','</frame>');    
+-        
+-        end % }}}        
++		function createxml(self,fid) % {{{
++			fprintf(fid, '<!-- qmu -->\n');            
++
++			% qmu solution parameters
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="qmu parameters">','<section name="qmu" />');                    
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="isdakota" type="',class(self.isdakota),'" default="',convert2str(self.isdakota),'">','     <section name="qmu" />','     <help> is qmu analysis activated? </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="variables" type="',class(self.variables),'" default="',convert2str(self.variables),'">','     <section name="qmu" />','     <help> (arrays of each variable class) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="responses" type="',class(self.responses),'" default="',convert2str(self.responses),'">','     <section name="qmu" />','     <help> (arrays of each response class) </help>','  </parameter>');
++
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberofresponses" type="',class(self.numberofresponses),'" default="',convert2str(self.numberofresponses),'">','     <section name="qmu" />','     <help> number of responses </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="params" type="',class(self.params),'" default="',convert2str(self.params),'">','     <section name="qmu" />','     <help> (array of method-independent parameters)  </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="results" type="',class(self.results),'" default="',convert2str(self.results),'">','     <section name="qmu" />','     <help> (information from dakota files) </help>','  </parameter>');
++
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="partition" type="',class(self.partition),'" default="',convert2str(self.partition),'">','     <section name="qmu" />','     <help> user provided mesh partitioning, defaults to metis if not specified </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberofpartitions" type="',class(self.numberofpartitions),'" default="',convert2str(self.numberofpartitions),'">','     <section name="qmu" />','     <help> number of partitions for semi-discrete qmu  </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="variabledescriptors" type="',class(self.variabledescriptors),'" default="',convert2str(self.variabledescriptors),'">','     <section name="qmu" />','     <help>  </help>','  </parameter>');
++
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="responsedescriptors" type="',class(self.responsedescriptors),'" default="',convert2str(self.responsedescriptors),'">','     <section name="qmu" />','     <help> use an enthalpy formulation to include temperate ice (default is 0) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="method" type="',class(self.method),'" default="',convert2str(self.method),'">','     <section name="qmu" />','     <help> array of dakota_method class </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="mass_flux_profile_directory" type="',class(self.mass_flux_profile_directory),'" default="',convert2str(self.mass_flux_profile_directory),'">','     <section name="qmu" />','     <help> directory for mass flux profiles </help>','  </parameter>');
++
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="mass_flux_profiles" type="',class(self.mass_flux_profiles),'" default="',convert2str(self.mass_flux_profiles),'">','     <section name="qmu" />','     <help>  </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="mass_flux_segments" type="',class(self.mass_flux_segments),'" default="',convert2str(self.mass_flux_segments),'">','     <section name="qmu" />','     <help>  </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="adjacency" type="',class(self.adjacency),'" default="',convert2str(self.adjacency),'">','     <section name="qmu" />','     <help> additional outputs requested </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertex_weight" type="',class(self.vertex_weight),'" default="',convert2str(self.vertex_weight),'">','     <section name="qmu" />','     <help> weight applied to each mesh vertex </help>','  </parameter>');
++
++			fprintf(fid,'%s\n%s\n','</frame>');    
++
++		end % }}}        
++		function self = extrude(self,md) % {{{
++			self.partition=project3d(md,'vector',self.partition','type','node');
++		end % }}}
+ 		function self = qmu(varargin) % {{{
+ 			switch nargin
+ 				case 0
+Index: ../trunk-jpl/src/m/classes/matice.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/matice.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/matice.m	(revision 19048)
+@@ -70,6 +70,10 @@
+ 
+ 
+ 		end % }}}
++		function self = extrude(self,md) % {{{
++			self.rheology_B=project3d(md,'vector',self.rheology_B,'type','node');
++			self.rheology_n=project3d(md,'vector',self.rheology_n,'type','element');
++		end % }}}
+ 		function self = matice(varargin) % {{{
+ 			switch nargin
+ 				case 0
+Index: ../trunk-jpl/src/m/classes/masstransport.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/masstransport.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/masstransport.py	(revision 19048)
+@@ -1,4 +1,5 @@
+ from fielddisplay import fielddisplay
++from project3d import project3d
+ from EnumDefinitions import *
+ from StringToEnum import StringToEnum
+ from checkfield import checkfield
+@@ -37,6 +38,10 @@
+ 
+ 		return string
+ 		#}}}
++	def extrude(self,md): # {{{
++		self.spcthickness=project3d(md,'vector',self.spcthickness,'type','node')
++		return self
++	#}}}
+ 	def defaultoutputs(self,md): # {{{
+ 
+ 		return ['Thickness','Surface','Base']
+Index: ../trunk-jpl/src/m/classes/calving.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calving.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/calving.m	(revision 19048)
+@@ -28,6 +28,10 @@
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
++		function self = extrude(self,md) % {{{
++			self.calvingrate=project3d(md,'vector',self.calvingrate,'type','node');
++			self.meltingrate=project3d(md,'vector',self.meltingrate,'type','node');
++		end % }}}
+ 		function self = setdefaultparameters(self) % {{{
+ 
+ 			%stabilization = 2 by default
+Index: ../trunk-jpl/src/m/classes/inversionvalidation.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/inversionvalidation.m	(revision 19048)
+@@ -21,6 +21,15 @@
+ 		surface_obs                 = NaN
+ 	end
+ 	methods
++		function self = extrude(self,md) % {{{
++			self.vx_obs=project3d(md,'vector',self.vx_obs,'type','node');
++			self.vy_obs=project3d(md,'vector',self.vy_obs,'type','node');
++			self.vel_obs=project3d(md,'vector',self.vel_obs,'type','node');
++			self.thickness_obs=project3d(md,'vector',self.thickness_obs,'type','node');
++			if numel(self.cost_functions_coefficients)>1,self.cost_functions_coefficients=project3d(md,'vector',self.cost_functions_coefficients,'type','node');end;
++			if numel(self.min_parameters)>1,self.min_parameters=project3d(md,'vector',self.min_parameters,'type','node');end;
++			if numel(self.max_parameters)>1,self.max_parameters=project3d(md,'vector',self.max_parameters,'type','node');end;
++		end % }}}
+ 		function self = inversionvalidation(varargin) % {{{
+ 			switch nargin
+ 				case 0
+Index: ../trunk-jpl/src/m/classes/geometry.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/geometry.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/geometry.py	(revision 19048)
+@@ -1,3 +1,4 @@
++from project3d import project3d
+ from fielddisplay import fielddisplay
+ from EnumDefinitions import *
+ from checkfield import checkfield
+@@ -31,6 +32,14 @@
+ 		string="%s\n%s"%(string,fielddisplay(self,'bed','bed elevation [m]'))
+ 		return string
+ 		#}}}
++	def extrude(self,md): # {{{
++		self.surface=project3d(md,'vector',self.surface,'type','node')
++		self.thickness=project3d(md,'vector',self.thickness,'type','node')
++		self.hydrostatic_ratio=project3d(md,'vector',self.hydrostatic_ratio,'type','node')
++		self.base=project3d(md,'vector',self.base,'type','node')
++		self.bed=project3d(md,'vector',self.bed,'type','node')
++		return self
++	#}}}
+ 	def setdefaultparameters(self): # {{{
+ 		return self
+ 	#}}}
+Index: ../trunk-jpl/src/m/classes/stressbalance.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/stressbalance.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/stressbalance.m	(revision 19048)
+@@ -69,6 +69,14 @@
+ 
+ 			fprintf(fid,'%s\n%s\n','</frame>'); 
+ 		end % }}}
++		function self = extrude(self,md) % {{{
++			self.spcvx=project3d(md,'vector',self.spcvx,'type','node');
++			self.spcvy=project3d(md,'vector',self.spcvy,'type','node');
++			self.spcvz=project3d(md,'vector',self.spcvz,'type','node');
++			self.referential=project3d(md,'vector',self.referential,'type','node');
++			self.loadingforce=project3d(md,'vector',self.loadingforce,'type','node');
++
++		end % }}}
+ 		function self = stressbalance(varargin) % {{{
+ 			switch nargin
+ 				case 0
+Index: ../trunk-jpl/src/m/classes/hydrologyshreve.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologyshreve.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/hydrologyshreve.py	(revision 19048)
+@@ -26,6 +26,9 @@
+ 		string="%s\n%s"%(string,fielddisplay(self,'stabilization','artificial diffusivity (default is 1). can be more than 1 to increase diffusivity.'))
+ 		return string
+ 		#}}}
++	def extrude(self,md): # {{{
++		return self
++	#}}}
+ 	def setdefaultparameters(self): # {{{
+ 		
+ 		#Type of stabilization to use 0:nothing 1:artificial_diffusivity
+Index: ../trunk-jpl/src/m/classes/hydrologyshreve.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologyshreve.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/hydrologyshreve.m	(revision 19048)
+@@ -9,17 +9,19 @@
+ 		stabilization  = 0;
+ 	end
+ 	methods
+-        function createxml(self,fid) % {{{
+-            fprintf(fid, '\n\n');
+-            fprintf(fid, '%s\n', '<!-- Hydrology -->');
+-            
+-            % Convergence criteria            
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Hydrologyshreve solution parameters">','<section name="hydrologyshreve" />');                    
+-            
++		function createxml(self,fid) % {{{
++			fprintf(fid, '\n\n');
++			fprintf(fid, '%s\n', '<!-- Hydrology -->');
++
++			% Convergence criteria            
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Hydrologyshreve solution parameters">','<section name="hydrologyshreve" />');                    
++
+ 			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcwatercolumn" type="',      class(self.spcwatercolumn),'" default="',        convert2str(self.spcwatercolumn),'">',	'     <section name="hydrologyshreve" />','     <help> water thickness constraints (NaN means no constraint) [m] </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="stabilization" type="',         class(self.stabilization),'" default="',           convert2str(self.stabilization),'">',	'     <section name="hydrologyshreve" />','     <help> artificial diffusivity (default is 1). can be more than 1 to increase diffusivity. </help>','</parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-        end % }}}
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="stabilization" type="',         class(self.stabilization),'" default="',           convert2str(self.stabilization),'">',	'     <section name="hydrologyshreve" />','     <help> artificial diffusivity (default is 1). can be more than 1 to increase diffusivity. </help>','</parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++		end % }}}
++		function self = extrude(self,md) % {{{
++		end % }}}
+ 		function self = hydrologyshreve(varargin) % {{{
+ 			switch nargin
+ 				case 0
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 19048)
+@@ -749,106 +749,28 @@
+ 
+ 			%Ok, now deal with the other fields from the 2d mesh:
+ 
++			%bedinfo and surface info
++			md.mesh.vertexonbase=project3d(md,'vector',ones(md.mesh.numberofvertices2d,1),'type','node','layer',1);
++			md.mesh.vertexonsurface=project3d(md,'vector',ones(md.mesh.numberofvertices2d,1),'type','node','layer',md.mesh.numberoflayers);
++			md.mesh.vertexonboundary=project3d(md,'vector',md.mesh.vertexonboundary,'type','node');
++
+ 			%lat long
+ 			md.mesh.lat=project3d(md,'vector',md.mesh.lat,'type','node');
+ 			md.mesh.long=project3d(md,'vector',md.mesh.long,'type','node');
+ 
+-			%drag coefficient is limited to nodes that are on the bedrock.
+-			if isa(md.friction,'friction'),
+-				md.friction.coefficient=project3d(md,'vector',md.friction.coefficient,'type','node','layer',1);
+-				md.friction.p=project3d(md,'vector',md.friction.p,'type','element');
+-				md.friction.q=project3d(md,'vector',md.friction.q,'type','element');
+-			elseif isa(md.friction,'frictionhydro'),
+-				md.friction.q=project3d(md,'vector',md.friction.q,'type','element');
+-				md.friction.C=project3d(md,'vector',md.friction.C,'type','element');
+-				md.friction.As=project3d(md,'vector',md.friction.As,'type','element');
+-				md.friction.effective_pressure=project3d(md,'vector',md.friction.effective_pressure,'type','node','layer',1);
+-			elseif isa(md.friction,'frictionwaterlayer'),
+-				md.friction.coefficient=project3d(md,'vector',md.friction.coefficient,'type','node','layer',1);
+-				md.friction.p=project3d(md,'vector',md.friction.p,'type','element');
+-				md.friction.q=project3d(md,'vector',md.friction.q,'type','element');
+-				md.friction.water_layer=project3d(md,'vector',md.friction.water_layer,'type','node','layer',1);
+-			elseif isa(md.friction,'frictionweertman'),
+-				md.friction.C=project3d(md,'vector',md.friction.C,'type','node','layer',1);
+-				md.friction.m=project3d(md,'vector',md.friction.m,'type','element');
+-	    end
+-	 
+-			%observations
+-			md.inversion.vx_obs=project3d(md,'vector',md.inversion.vx_obs,'type','node');
+-			md.inversion.vy_obs=project3d(md,'vector',md.inversion.vy_obs,'type','node');
+-			md.inversion.vel_obs=project3d(md,'vector',md.inversion.vel_obs,'type','node');
+-			md.inversion.thickness_obs=project3d(md,'vector',md.inversion.thickness_obs,'type','node');
++			md.geometry=extrude(md.geometry,md);
++			md.friction  = extrude(md.friction,md);
++			md.inversion = extrude(md.inversion,md);
+ 			md.surfaceforcings = extrude(md.surfaceforcings,md);
+-			md.balancethickness.thickening_rate=project3d(md,'vector',md.balancethickness.thickening_rate,'type','node');
++			md.initialization = extrude(md.initialization,md);
+ 
+-			%results
+-			if ~isnan(md.initialization.vx),md.initialization.vx=project3d(md,'vector',md.initialization.vx,'type','node');end;
+-			if ~isnan(md.initialization.vy),md.initialization.vy=project3d(md,'vector',md.initialization.vy,'type','node');end;
+-			if ~isnan(md.initialization.vz),md.initialization.vz=project3d(md,'vector',md.initialization.vz,'type','node');end;
+-			if ~isnan(md.initialization.vel),md.initialization.vel=project3d(md,'vector',md.initialization.vel,'type','node');end;
+-			if ~isnan(md.initialization.temperature),md.initialization.temperature=project3d(md,'vector',md.initialization.temperature,'type','node');end;
+-			if ~isnan(md.initialization.waterfraction),md.initialization.waterfraction=project3d(md,'vector',md.initialization.waterfraction,'type','node');end;
+-      if ~isnan(md.initialization.watercolumn),md.initialization.watercolumn=project3d(md,'vector',md.initialization.watercolumn,'type','node','layer',1);end;
+-      if ~isnan(md.initialization.sediment_head),md.initialization.sediment_head=project3d(md,'vector',md.initialization.sediment_head,'type','node','layer',1);end;
+-      if ~isnan(md.initialization.epl_head),md.initialization.epl_head=project3d(md,'vector',md.initialization.epl_head,'type','node','layer',1);end;
+-      if ~isnan(md.initialization.epl_thickness),md.initialization.epl_thickness=project3d(md,'vector',md.initialization.epl_thickness,'type','node','layer',1);end;
++			md.flowequation.extrude(md);
++			md.stressbalance=extrude(md.stressbalance,md);
++			md.thermal.extrude(md);
++			md.masstransport.extrude(md);
++			md.calving=extrude(md.calving,md);
++			md.hydrology = extrude(md.hydrology,md);
+ 
+-			%bedinfo and surface info
+-			md.mesh.vertexonbase=project3d(md,'vector',ones(md.mesh.numberofvertices2d,1),'type','node','layer',1);
+-			md.mesh.vertexonsurface=project3d(md,'vector',ones(md.mesh.numberofvertices2d,1),'type','node','layer',md.mesh.numberoflayers);
+-
+-			%elementstype
+-			if ~isnan(md.flowequation.element_equation)
+-				oldelements_type=md.flowequation.element_equation;
+-				md.flowequation.element_equation=zeros(number_el3d,1);
+-				md.flowequation.element_equation=project3d(md,'vector',oldelements_type,'type','element');
+-			end
+-
+-			%verticestype
+-			if ~isnan(md.flowequation.vertex_equation)
+-				oldvertices_type=md.flowequation.vertex_equation;
+-				md.flowequation.vertex_equation=zeros(number_nodes3d,1);
+-				md.flowequation.vertex_equation=project3d(md,'vector',oldvertices_type,'type','node');
+-			end
+-			md.flowequation.borderSSA=project3d(md,'vector',md.flowequation.borderSSA,'type','node');
+-			md.flowequation.borderHO=project3d(md,'vector',md.flowequation.borderHO,'type','node');
+-			md.flowequation.borderFS=project3d(md,'vector',md.flowequation.borderFS,'type','node');
+-
+-			%boundary conditions
+-			md.stressbalance.spcvx=project3d(md,'vector',md.stressbalance.spcvx,'type','node');
+-			md.stressbalance.spcvy=project3d(md,'vector',md.stressbalance.spcvy,'type','node');
+-			md.stressbalance.spcvz=project3d(md,'vector',md.stressbalance.spcvz,'type','node');
+-			md.thermal.spctemperature=project3d(md,'vector',md.thermal.spctemperature,'type','node','layer',md.mesh.numberoflayers,'padding',NaN);
+-			if (length(md.initialization.temperature)==md.mesh.numberofvertices),
+-				md.thermal.spctemperature=NaN*ones(md.mesh.numberofvertices,1);
+-				if isprop(md.mesh,'vertexonsurface'),
+-					pos=find(md.mesh.vertexonsurface);
+-					md.thermal.spctemperature(pos)=md.initialization.temperature(pos); %impose observed temperature on surface
+-				end
+-			end
+-			md.masstransport.spcthickness=project3d(md,'vector',md.masstransport.spcthickness,'type','node');
+-			md.balancethickness.spcthickness=project3d(md,'vector',md.balancethickness.spcthickness,'type','node');
+-			md.damage.spcdamage=project3d(md,'vector',md.damage.spcdamage,'type','node');
+-			md.stressbalance.referential=project3d(md,'vector',md.stressbalance.referential,'type','node');
+-			md.stressbalance.loadingforce=project3d(md,'vector',md.stressbalance.loadingforce,'type','node');
+-
+-			% Calving variables
+-			if isa(md.calving,'calving'),md.calving.calvingrate=project3d(md,'vector',md.calving.calvingrate,'type','node');end;
+-			if ~isnan(md.calving.meltingrate),md.calving.meltingrate=project3d(md,'vector',md.calving.meltingrate,'type','node');end;
+-			if isa(md.calving,'calvinglevermann'),md.calving.coeff=project3d(md,'vector',md.calving.coeff,'type','node');end;
+-			if isa(md.calving,'calvingpi'),md.calving.coeff=project3d(md,'vector',md.calving.coeff,'type','node');end;
+-
+-			% Hydrologydc variables
+-			if isa(md.hydrology,'hydrologydc');
+-				md.hydrology.spcsediment_head=project3d(md,'vector',md.hydrology.spcsediment_head,'type','node','layer',1);
+-				md.hydrology.mask_eplactive_node=project3d(md,'vector',md.hydrology.mask_eplactive_node,'type','node','layer',1);
+-				md.hydrology.sediment_transmitivity=project3d(md,'vector',md.hydrology.sediment_transmitivity,'type','node','layer',1);
+-				md.hydrology.basal_moulin_input=project3d(md,'vector',md.hydrology.basal_moulin_input,'type','node','layer',1);
+-				if(md.hydrology.isefficientlayer==1);
+-					md.hydrology.spcepl_head=project3d(md,'vector',md.hydrology.spcepl_head,'type','node','layer',1);
+-		    end
+-	    end
+-
+ 			%connectivity
+ 			if ~isnan(md.mesh.elementconnectivity)
+ 				md.mesh.elementconnectivity=repmat(md.mesh.elementconnectivity,numlayers-1,1);
+@@ -860,41 +782,12 @@
+ 				md.mesh.elementconnectivity(find(isnan(md.mesh.elementconnectivity)))=0;
+ 			end
+ 
+-			%materials
+-			md.materials.rheology_B=project3d(md,'vector',md.materials.rheology_B,'type','node');
+-			md.materials.rheology_n=project3d(md,'vector',md.materials.rheology_n,'type','element');
+-				
+-			%damage
+-			md.damage.D=project3d(md,'vector',md.damage.D,'type','node');
++			md.materials=extrude(md.materials,md);
++			md.damage=extrude(md.damage,md);
++			md.mask=extrude(md.mask,md);
++			md.qmu=extrude(md.qmu,md);
++			md.basalforcings=extrude(md.basalforcings,md);
+ 
+-			%parameters
+-			md.geometry.surface=project3d(md,'vector',md.geometry.surface,'type','node');
+-			md.geometry.thickness=project3d(md,'vector',md.geometry.thickness,'type','node');
+-			md.gia.mantle_viscosity=project3d(md,'vector',md.gia.mantle_viscosity,'type','node');
+-			md.gia.lithosphere_thickness=project3d(md,'vector',md.gia.lithosphere_thickness,'type','node');
+-			md.geometry.hydrostatic_ratio=project3d(md,'vector',md.geometry.hydrostatic_ratio,'type','node');
+-			md.geometry.base=project3d(md,'vector',md.geometry.base,'type','node');
+-			md.geometry.bed=project3d(md,'vector',md.geometry.bed,'type','node');
+-			md.mesh.vertexonboundary=project3d(md,'vector',md.mesh.vertexonboundary,'type','node');
+-			md.mask.groundedice_levelset=project3d(md,'vector',md.mask.groundedice_levelset,'type','node');
+-			md.mask.ice_levelset=project3d(md,'vector',md.mask.ice_levelset,'type','node');
+-			if ~isnan(md.inversion.cost_functions_coefficients),md.inversion.cost_functions_coefficients=project3d(md,'vector',md.inversion.cost_functions_coefficients,'type','node');end;
+-			if ~isnan(md.inversion.min_parameters),md.inversion.min_parameters=project3d(md,'vector',md.inversion.min_parameters,'type','node');end;
+-			if ~isnan(md.inversion.max_parameters),md.inversion.max_parameters=project3d(md,'vector',md.inversion.max_parameters,'type','node');end;
+-			if ~isnan(md.qmu.partition),md.qmu.partition=project3d(md,'vector',md.qmu.partition','type','node');end
+-
+-			%Put lithostatic pressure if there is an existing pressure
+-			if ~isnan(md.initialization.pressure),
+-				md.initialization.pressure=md.constants.g*md.materials.rho_ice*(md.geometry.surface-md.mesh.z);
+-	    end
+-
+-			%special for thermal modeling:
+-			md.basalforcings.groundedice_melting_rate=project3d(md,'vector',md.basalforcings.groundedice_melting_rate,'type','node','layer',1); 
+-			md.basalforcings.floatingice_melting_rate=project3d(md,'vector',md.basalforcings.floatingice_melting_rate,'type','node','layer',1); 
+-			if ~isnan(md.basalforcings.geothermalflux)
+-				md.basalforcings.geothermalflux=project3d(md,'vector',md.basalforcings.geothermalflux,'type','node','layer',1); %bedrock only gets geothermal flux
+-			end
+-
+ 			%increase connectivity if less than 25:
+ 			if md.mesh.average_vertex_connectivity<=25,
+ 				md.mesh.average_vertex_connectivity=100;
+Index: ../trunk-jpl/src/m/classes/inversion.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversion.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/inversion.py	(revision 19048)
+@@ -1,4 +1,5 @@
+ import numpy
++from project3d import project3d
+ from fielddisplay import fielddisplay
+ from EnumDefinitions import *
+ from StringToEnum import StringToEnum
+@@ -71,6 +72,19 @@
+ 		string="%s\n%s"%(string,'   503: ThicknessAbsGradient')
+ 		return string
+ 		#}}}
++	def extrude(self,md): # {{{
++		self.vx_obs=project3d(md,'vector',self.vx_obs,'type','node')
++		self.vy_obs=project3d(md,'vector',self.vy_obs,'type','node')
++		self.vel_obs=project3d(md,'vector',self.vel_obs,'type','node')
++		self.thickness_obs=project3d(md,'vector',self.thickness_obs,'type','node')
++		if not numpy.any(numpy.isnan(self.cost_functions_coefficients)):
++			self.cost_functions_coefficients=project3d(md,'vector',self.cost_functions_coefficients,'type','node')
++		if not numpy.any(numpy.isnan(self.min_parameters)):
++			self.min_parameters=project3d(md,'vector',self.min_parameters,'type','node')
++		if not numpy.any(numpy.isnan(self.max_parameters)):
++			self.max_parameters=project3d(md,'vector',self.max_parameters,'type','node')
++		return self
++	#}}}
+ 	def setdefaultparameters(self): # {{{
+ 		
+ 		#default is incomplete adjoint for now
+Index: ../trunk-jpl/src/m/classes/flowequation.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/flowequation.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/flowequation.py	(revision 19048)
+@@ -1,5 +1,6 @@
+ import numpy
+ import copy
++from project3d import project3d
+ from fielddisplay import fielddisplay
+ from EnumDefinitions import *
+ from checkfield import checkfield
+@@ -57,6 +58,14 @@
+ 		string="%s\n%s"%(string,fielddisplay(self,'borderFS',"vertices on FS' border (for tiling)"))
+ 		return string
+ 		#}}}
++	def extrude(self,md): # {{{
++		self.element_equation=project3d(md,'vector',self.element_equation,'type','element')
++		self.vertex_equation=project3d(md,'vector',self.vertex_equation,'type','node')
++		self.borderSSA=project3d(md,'vector',self.borderSSA,'type','node')
++		self.borderHO=project3d(md,'vector',self.borderHO,'type','node')
++		self.borderFS=project3d(md,'vector',self.borderFS,'type','node')
++		return self
++	#}}}
+ 	def setdefaultparameters(self): # {{{
+ 
+ 		#P1 for SSA
+Index: ../trunk-jpl/src/m/classes/basalforcings.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/basalforcings.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/basalforcings.py	(revision 19048)
+@@ -1,4 +1,5 @@
+ from fielddisplay import fielddisplay
++from project3d import project3d
+ from EnumDefinitions import *
+ from checkfield import checkfield
+ from WriteData import WriteData
+@@ -29,6 +30,12 @@
+ 		string="%s\n%s"%(string,fielddisplay(self,"geothermalflux","geothermal heat flux [W/m^2]"))
+ 		return string
+ 		#}}}
++	def extrude(self,md): # {{{
++		self.groundedice_melting_rate=project3d(md,'vector',self.groundedice_melting_rate,'type','node','layer',1)
++		self.floatingice_melting_rate=project3d(md,'vector',self.floatingice_melting_rate,'type','node','layer',1)
++		self.geothermalflux=project3d(md,'vector',self.geothermalflux,'type','node','layer',1)    #bedrock only gets geothermal flux
++		return self
++	#}}}
+ 	def initialize(self,md): # {{{
+ 
+ 		if numpy.all(numpy.isnan(self.groundedice_melting_rate)):
+Index: ../trunk-jpl/src/m/classes/calvingpi.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvingpi.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/calvingpi.m	(revision 19048)
+@@ -28,6 +28,10 @@
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
++		function self = extrude(self,md) % {{{
++			self.coeff=project3d(md,'vector',self.coeff,'type','node');
++			self.meltingrate=project3d(md,'vector',self.meltingrate,'type','node');
++		end % }}}
+ 		function self = setdefaultparameters(self) % {{{
+ 
+ 			%stabilization = 2 by default
+Index: ../trunk-jpl/src/m/classes/flowequation.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/flowequation.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/flowequation.m	(revision 19048)
+@@ -106,6 +106,13 @@
+ 
+ 			fprintf(fid,'%s\n%s\n','</frame>');
+ 		end % }}}
++		function self = extrude(self,md) % {{{
++			self.element_equation=project3d(md,'vector',self.element_equation,'type','element');
++			self.vertex_equation=project3d(md,'vector',self.vertex_equation,'type','node');
++			self.borderSSA=project3d(md,'vector',self.borderSSA,'type','node');
++			self.borderHO=project3d(md,'vector',self.borderHO,'type','node');
++			self.borderFS=project3d(md,'vector',self.borderFS,'type','node');
++		end % }}}
+ 		function self = flowequation(varargin) % {{{
+ 			switch nargin
+ 				case 0
+Index: ../trunk-jpl/src/m/classes/basalforcings.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/basalforcings.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/basalforcings.m	(revision 19048)
+@@ -10,13 +10,18 @@
+ 		geothermalflux            = NaN;
+ 	end
+ 	methods
+-        function createxml(self,fid) % {{{
+-            fprintf(fid, '\n\n');
+-            fprintf(fid, '%s\n', '<!-- basalforcings -->');
+-			 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="melting_rate" type="',            class(self.melting_rate),'" default="',              num2str(self.melting_rate),'">',              '     <section name="basalforcings" />','     <help> basal melting rate (positive if melting) [m/yr] </help>','</parameter>');
+-             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',        '<parameter key ="geothermalflux" type="',          class(self.geothermalflux),'" default="',            num2str(self.geothermalflux),'">',            '     <section name="basalforcings" />','     <help> geothermal heat flux [W/m^2] </help>','</parameter>');
+-             
+-        end % }}}
++		function createxml(self,fid) % {{{
++			fprintf(fid, '\n\n');
++			fprintf(fid, '%s\n', '<!-- basalforcings -->');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="melting_rate" type="',            class(self.melting_rate),'" default="',              num2str(self.melting_rate),'">',              '     <section name="basalforcings" />','     <help> basal melting rate (positive if melting) [m/yr] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',        '<parameter key ="geothermalflux" type="',          class(self.geothermalflux),'" default="',            num2str(self.geothermalflux),'">',            '     <section name="basalforcings" />','     <help> geothermal heat flux [W/m^2] </help>','</parameter>');
++
++		end % }}}
++		function self = extrude(self,md) % {{{
++			self.groundedice_melting_rate=project3d(md,'vector',self.groundedice_melting_rate,'type','node','layer',1); 
++			self.floatingice_melting_rate=project3d(md,'vector',self.floatingice_melting_rate,'type','node','layer',1); 
++			self.geothermalflux=project3d(md,'vector',self.geothermalflux,'type','node','layer',1); %bedrock only gets geothermal flux
++		end % }}}
+ 		function self = basalforcings(varargin) % {{{
+ 			switch nargin
+ 				case 0
+Index: ../trunk-jpl/src/m/classes/damage.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/damage.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/damage.m	(revision 19048)
+@@ -84,7 +84,6 @@
+ 			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',        '<parameter key ="penalty_factor" type="',      class(self.penalty_factor),'" default="',            num2str(self.penalty_factor),'">',            '     <section name="damage" />','     <help> scaling exponent (default is 3) </help>','</parameter>');
+ 
+ 		end % }}}
+-        
+ 		function self = damage(varargin) % {{{
+ 			switch nargin
+ 				case 0
+@@ -103,6 +102,10 @@
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
++		function self = extrude(self,md) % {{{
++			self.D=project3d(md,'vector',self.D,'type','node');
++			self.spcdamage=project3d(md,'vector',self.spcdamage,'type','node');
++		end % }}}
+ 		function self = setdefaultparameters(self) % {{{
+ 
+ 			%damage parameters: 
+Index: ../trunk-jpl/src/m/classes/taoinversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/taoinversion.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/taoinversion.m	(revision 19048)
+@@ -28,6 +28,15 @@
+ 		surface_obs               = NaN
+ 	end
+ 	methods
++		function self = extrude(self,md) % {{{
++			self.vx_obs=project3d(md,'vector',self.vx_obs,'type','node');
++			self.vy_obs=project3d(md,'vector',self.vy_obs,'type','node');
++			self.vel_obs=project3d(md,'vector',self.vel_obs,'type','node');
++			self.thickness_obs=project3d(md,'vector',self.thickness_obs,'type','node');
++			if numel(self.cost_functions_coefficients)>1,self.cost_functions_coefficients=project3d(md,'vector',self.cost_functions_coefficients,'type','node');end;
++			if numel(self.min_parameters)>1,self.min_parameters=project3d(md,'vector',self.min_parameters,'type','node');end;
++			if numel(self.max_parameters)>1,self.max_parameters=project3d(md,'vector',self.max_parameters,'type','node');end;
++		end % }}}
+ 		function self = taoinversion(varargin) % {{{
+ 			switch nargin
+ 				case 0
+Index: ../trunk-jpl/src/m/classes/hydrologydc.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologydc.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/hydrologydc.m	(revision 19048)
+@@ -36,6 +36,15 @@
+ 		eplflip_lock             = 0;
+   end
+ 	methods
++		function self = extrude(self,md) % {{{
++			self.spcsediment_head=project3d(md,'vector',self.spcsediment_head,'type','node','layer',1);
++			self.mask_eplactive_node=project3d(md,'vector',self.mask_eplactive_node,'type','node','layer',1);
++			self.sediment_transmitivity=project3d(md,'vector',self.sediment_transmitivity,'type','node','layer',1);
++			self.basal_moulin_input=project3d(md,'vector',self.basal_moulin_input,'type','node','layer',1);
++			if(self.isefficientlayer==1);
++				self.spcepl_head=project3d(md,'vector',self.spcepl_head,'type','node','layer',1);
++			end
++		end % }}}
+ 		% {{{ function self = hydrologydc(varargin) 
+ 		function self = hydrologydc(varargin) 
+ 			switch nargin
+@@ -43,7 +52,7 @@
+ 					self=setdefaultparameters(self);
+ 				otherwise
+ 					error('constructor not supported');
+-	    end
++			end
+ 		end 
+ 		% }}}
+ 		function self = initialize(self,md) % {{{
+@@ -56,7 +65,7 @@
+ 		% {{{ function self = setdefaultparameters(self) 
+ 		function self = setdefaultparameters(self) 
+ 
+-		%Parameters from de Fleurian 2014
++			%Parameters from de Fleurian 2014
+ 			self.water_compressibility    = 5.04e-10;
+ 			self.isefficientlayer         = 1;
+ 			self.penalty_factor           = 3;
+@@ -85,7 +94,7 @@
+ 		% }}}
+ 		% {{{ function md = checkconsistency(self,md,solution,analyses) 
+ 		function md = checkconsistency(self,md,solution,analyses) 
+-		%Early return
++			%Early return
+ 			if ~ismember(HydrologyDCInefficientAnalysisEnum(),analyses) & ~ismember(HydrologyDCEfficientAnalysisEnum(),analyses),
+ 				return;
+ 			end
+@@ -100,10 +109,10 @@
+ 			md = checkfield(md,'fieldname','hydrology.transfer_flag','numel',[1],'values',[0 1]);
+ 			if self.sedimentlimit_flag==1,
+ 				md = checkfield(md,'fieldname','hydrology.sedimentlimit','>',0,'numel',1);
+-	    end
++			end
+ 			if self.transfer_flag==1,
+ 				md = checkfield(md,'fieldname','hydrology.leakage_factor','>',0,'numel',1);
+-	    end
++			end
+ 			md = checkfield(md,'fieldname','hydrology.basal_moulin_input','NaN',1,'timeseries',1);
+ 
+ 			md = checkfield(md,'fieldname','hydrology.spcsediment_head','timeseries',1);
+@@ -126,7 +135,7 @@
+ 				if (self.epl_colapse_thickness>self.epl_initial_thickness),
+ 					md = checkmessage(md,'Colapsing thickness for EPL larger than initial thickness');
+ 				end 
+-	    end
++			end
+ 		end 
+ 		% }}}
+ 		% {{{ function disp(self)
+@@ -146,13 +155,13 @@
+ 			disp(sprintf('%55s  3: normal stress',' '));
+ 			if self.sedimentlimit_flag==1,
+ 				fielddisplay(self,'sedimentlimit','user defined upper limit for the inefficient layer [m]');
+-	    end
++			end
+ 			fielddisplay(self,'transfer_flag',['what kind of transfer method is applied between the layers']);
+ 			disp(sprintf('%55s  0: no transfer',' '));
+ 			disp(sprintf('%55s  1: constant leakage factor: %s',' ','leakage_factor'));
+ 			if self.transfer_flag==1,
+ 				fielddisplay(self,'leakage_factor','user defined leakage factor [m]');
+-	    end
++			end
+ 			fielddisplay(self,'basal_moulin_input','water flux at a given point [m3 s-1]');
+ 			disp(sprintf('   - for the sediment layer'));
+ 			fielddisplay(self,'spcsediment_head','sediment water head constraints (NaN means no constraint) [m above MSL]');
+@@ -173,7 +182,7 @@
+ 				fielddisplay(self,'epl_max_thickness','epl maximal thickness [m]');
+ 				fielddisplay(self,'epl_conductivity','epl conductivity [m^2/s]');
+ 				fielddisplay(self,'eplflip_lock','lock the epl activation to avoid fli-floping (default is 0, no stabilization)');
+-	    end
++			end
+ 
+ 		end 
+ 		% }}}
+@@ -190,10 +199,10 @@
+ 			WriteData(fid,'object',self,'fieldname','transfer_flag','format','Integer');
+ 			if self.sedimentlimit_flag==1,
+ 				WriteData(fid,'object',self,'fieldname','sedimentlimit','format','Double');
+-	    end
++			end
+ 			if self.transfer_flag==1,
+ 				WriteData(fid,'object',self,'fieldname','leakage_factor','format','Double');
+-	    end
++			end
+ 			WriteData(fid,'object',self,'fieldname','basal_moulin_input','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1)
+ 
+ 			WriteData(fid,'object',self,'fieldname','spcsediment_head','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+@@ -213,8 +222,8 @@
+ 				WriteData(fid,'object',self,'fieldname','epl_max_thickness','format','Double');
+ 				WriteData(fid,'object',self,'fieldname','epl_conductivity','format','Double');
+ 				WriteData(fid,'object',self,'fieldname','eplflip_lock','format','Integer');
+-	    end
++			end
+ 		end 
+-% }}}
+-  end
++		% }}}
++	end
+ end
+Index: ../trunk-jpl/src/m/classes/calvinglevermann.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/calvinglevermann.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/calvinglevermann.m	(revision 19048)
+@@ -28,6 +28,10 @@
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
++		function self = extrude(self,md) % {{{
++			self.coeff=project3d(md,'vector',self.coeff,'type','node');
++			self.meltingrate=project3d(md,'vector',self.meltingrate,'type','node');
++		end % }}}
+ 		function self = setdefaultparameters(self) % {{{
+ 
+ 			%stabilization = 2 by default
+Index: ../trunk-jpl/src/m/classes/mask.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mask.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/mask.m	(revision 19048)
+@@ -21,12 +21,16 @@
+ 		end% }}}
+ 	end
+ 	methods
+-        function createxml(self,fid) % {{{
+-            fprintf(fid, '\n\n');
+-            fprintf(fid, '%s\n', '<!-- mask -->');
++		function createxml(self,fid) % {{{
++			fprintf(fid, '\n\n');
++			fprintf(fid, '%s\n', '<!-- mask -->');
+ 			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="groundedice_levelset" type="',class(self.groundedice_levelset),'" default="',self.groundedice_levelset,'">','     <section name="mask" />','     <help> is ice grounded ? grounded ice if > 0, grounding line position if = 0, floating ice if &amp;lt; 0 </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','<parameter key ="ice_levelset" type="',class(self.ice_levelset),'" default="',self.ice_levelset,'">','     <section name="mask" />','     <help> presence of ice if > 0, icefront position if = 0, no ice if &amp;lt; 0 </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','<parameter key ="ice_levelset" type="',class(self.ice_levelset),'" default="',self.ice_levelset,'">','     <section name="mask" />','     <help> presence of ice if > 0, icefront position if = 0, no ice if &amp;lt; 0 </help>','</parameter>');
+ 		end % }}}
++		function self = extrude(self,md) % {{{
++			self.groundedice_levelset=project3d(md,'vector',self.groundedice_levelset,'type','node');
++			self.ice_levelset=project3d(md,'vector',self.ice_levelset,'type','node');
++		end % }}}
+ 		function self = mask(varargin) % {{{
+ 			switch nargin
+ 				case 0
+Index: ../trunk-jpl/src/m/classes/matdamageice.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/matdamageice.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/matdamageice.m	(revision 19048)
+@@ -63,6 +63,10 @@
+ 
+ 
+ 		end % }}}
++		function self = extrude(self,md) % {{{
++			self.rheology_B=project3d(md,'vector',self.rheology_B,'type','node');
++			self.rheology_n=project3d(md,'vector',self.rheology_n,'type','element');
++		end % }}}
+ 		function self = matdamageice(varargin) % {{{
+ 			switch nargin
+ 				case 0
+Index: ../trunk-jpl/src/m/classes/damage.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/damage.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/damage.py	(revision 19048)
+@@ -1,4 +1,5 @@
+ from fielddisplay import fielddisplay
++from project3d import project3d
+ from EnumDefinitions import *
+ from StringToEnum import StringToEnum
+ from checkfield import checkfield
+@@ -73,6 +74,11 @@
+ 
+ 		return s
+ 	# }}}
++	def extrude(self,md): # {{{
++		self.D=project3d(md,'vector',self.D,'type','node')
++		self.spcdamage=project3d(md,'vector',self.spcdamage,'type','node')
++		return self
++	#}}}
+ 	def setdefaultparameters(self):    # {{{
+ 
+ 		#damage parameters: 
+Index: ../trunk-jpl/src/m/classes/inversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/inversion.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/inversion.m	(revision 19048)
+@@ -84,6 +84,15 @@
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
++		function self = extrude(self,md) % {{{
++			self.vx_obs=project3d(md,'vector',self.vx_obs,'type','node');
++			self.vy_obs=project3d(md,'vector',self.vy_obs,'type','node');
++			self.vel_obs=project3d(md,'vector',self.vel_obs,'type','node');
++			self.thickness_obs=project3d(md,'vector',self.thickness_obs,'type','node');
++			if numel(self.cost_functions_coefficients)>1,self.cost_functions_coefficients=project3d(md,'vector',self.cost_functions_coefficients,'type','node');end;
++			if numel(self.min_parameters)>1,self.min_parameters=project3d(md,'vector',self.min_parameters,'type','node');end;
++			if numel(self.max_parameters)>1,self.max_parameters=project3d(md,'vector',self.max_parameters,'type','node');end;
++		end % }}}
+ 		function self = setdefaultparameters(self) % {{{
+ 
+ 			%default is incomplete adjoint for now
+Index: ../trunk-jpl/src/m/classes/geometry.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/geometry.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/geometry.m	(revision 19048)
+@@ -32,18 +32,24 @@
+ 		end% }}}
+ 	end
+ 	methods
+-        %function createxml(self,fid)
+-        function createxml(self, fid)% {{{
+-            fprintf(fid, '\n\n');
+-            fprintf(fid, '%s\n', '<!-- geometry -->');
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Geometry parameters">','<section name="geometry" />'); 
++		function createxml(self, fid)% {{{
++			fprintf(fid, '\n\n');
++			fprintf(fid, '%s\n', '<!-- geometry -->');
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Geometry parameters">','<section name="geometry" />'); 
+ 			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="surface" type="','path','" optional="','false','">','     <section name="geometry" />','     <help> surface elevation [m] </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="thickness" type="','path','" optional="','false','">','     <section name="geometry" />','     <help> ice thickness [m] </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="bed" type="','path','" optional="','false','">','     <section name="geometry" />','     <help> bed elevation [m] </help>','</parameter>');
+-            %fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="bathymetry" type="',class(self.bathymetry),'" default="',convert2str(self.bathymetry),'">','     <section name="geometry" />','     <help> bathymetry elevation [m] </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','<parameter key ="hydrostatic_ratio" type="',class(self.hydrostatic_ratio),'" default="',convert2str(self.hydrostatic_ratio),'">','     <section name="geometry" />','     <help> coefficient for ice shelves; thickness correction: hydrostatic_ratio H_obs+ (1-hydrostatic_ratio) H_hydro </help>','</parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-        end % }}}
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="thickness" type="','path','" optional="','false','">','     <section name="geometry" />','     <help> ice thickness [m] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="bed" type="','path','" optional="','false','">','     <section name="geometry" />','     <help> bed elevation [m] </help>','</parameter>');
++			%fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="bathymetry" type="',class(self.bathymetry),'" default="',convert2str(self.bathymetry),'">','     <section name="geometry" />','     <help> bathymetry elevation [m] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','<parameter key ="hydrostatic_ratio" type="',class(self.hydrostatic_ratio),'" default="',convert2str(self.hydrostatic_ratio),'">','     <section name="geometry" />','     <help> coefficient for ice shelves; thickness correction: hydrostatic_ratio H_obs+ (1-hydrostatic_ratio) H_hydro </help>','</parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++		end % }}}
++		function self = extrude(self,md) % {{{
++			self.surface=project3d(md,'vector',self.surface,'type','node');
++			self.thickness=project3d(md,'vector',self.thickness,'type','node');
++			self.hydrostatic_ratio=project3d(md,'vector',self.hydrostatic_ratio,'type','node');
++			self.base=project3d(md,'vector',self.base,'type','node');
++			self.bed=project3d(md,'vector',self.bed,'type','node');
++		end % }}}
+ 		function self = geometry(varargin) % {{{
+ 			switch nargin
+ 				case 0
+Index: ../trunk-jpl/src/m/classes/gia.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/gia.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/gia.m	(revision 19048)
+@@ -10,21 +10,25 @@
+ 		cross_section_shape           = 0;
+ 	end
+ 	methods
+-         function createxml(self,fid) % {{{
+-            fprintf(fid, '<!-- gia -->\n');            
+-                    
+-            % gia solution parameters
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="gia parameters">','<section name="gia" />');                    
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="mantle_viscosity" type="',class(self.mantle_viscosity),'" default="',convert2str(self.mantle_viscosity),'">','     <section name="gia" />','     <help> mantle viscosity[Pa s] </help>','  </parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lithosphere_thickness" type="',class(self.lithosphere_thickness),'" default="',convert2str(self.lithosphere_thickness),'">','     <section name="gia" />','     <help> lithosphere thickness (km) </help>','  </parameter>');
+-            %cross_section_shape drop-down (1 o r 2)
+-            fprintf(fid,'%s\n%s\n%s\n%s\n','  <parameter key ="cross_section_shape" type="alternative" optional="false">','     <section name="gia" />','     <help> 1: square-edged (default). 2: elliptical.  See iedge in GiaDeflectionCore </help>');
+-            fprintf(fid,'%s\n','       <option value="1" type="string" default="true"> </option>');
+-            fprintf(fid,'%s\n%s\n','       <option value="2" type="string" default="false"> </option>','</parameter>');
+-            
+-            fprintf(fid,'%s\n%s\n','</frame>');    
+-        
+-        end % }}}
++		function createxml(self,fid) % {{{
++			fprintf(fid, '<!-- gia -->\n');            
++
++			% gia solution parameters
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="gia parameters">','<section name="gia" />');                    
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="mantle_viscosity" type="',class(self.mantle_viscosity),'" default="',convert2str(self.mantle_viscosity),'">','     <section name="gia" />','     <help> mantle viscosity[Pa s] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lithosphere_thickness" type="',class(self.lithosphere_thickness),'" default="',convert2str(self.lithosphere_thickness),'">','     <section name="gia" />','     <help> lithosphere thickness (km) </help>','  </parameter>');
++			%cross_section_shape drop-down (1 o r 2)
++			fprintf(fid,'%s\n%s\n%s\n%s\n','  <parameter key ="cross_section_shape" type="alternative" optional="false">','     <section name="gia" />','     <help> 1: square-edged (default). 2: elliptical.  See iedge in GiaDeflectionCore </help>');
++			fprintf(fid,'%s\n','       <option value="1" type="string" default="true"> </option>');
++			fprintf(fid,'%s\n%s\n','       <option value="2" type="string" default="false"> </option>','</parameter>');
++
++			fprintf(fid,'%s\n%s\n','</frame>');    
++
++		end % }}}
++		function self = extrude(self,md) % {{{
++			self.mantle_viscosity=project3d(md,'vector',self.mantle_viscosity,'type','node');
++			self.lithosphere_thickness=project3d(md,'vector',self.lithosphere_thickness,'type','node');
++		end % }}}
+ 		function self = gia(varargin) % {{{
+ 			switch nargin
+ 				case 0
+Index: ../trunk-jpl/src/m/classes/friction.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/friction.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/friction.py	(revision 19048)
+@@ -1,4 +1,5 @@
+ from fielddisplay import fielddisplay
++from project3d import project3d
+ from EnumDefinitions import *
+ from checkfield import checkfield
+ from WriteData import WriteData
+@@ -28,6 +29,12 @@
+ 		string="%s\n%s"%(string,fielddisplay(self,"q","q exponent"))
+ 		return string
+ 		#}}}
++	def extrude(self,md): # {{{
++		self.coefficient=project3d(md,'vector',self.coefficient,'type','node','layer',1)
++		self.p=project3d(md,'vector',self.p,'type','element')
++		self.q=project3d(md,'vector',self.q,'type','element')
++		return self
++	#}}}
+ 	def setdefaultparameters(self): # {{{
+ 		return self
+ 	#}}}
+Index: ../trunk-jpl/src/m/classes/friction.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/friction.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/friction.m	(revision 19048)
+@@ -10,15 +10,20 @@
+ 		q           = NaN;
+ 	end
+ 	methods
+-        function createxml(self,fid) % {{{
+-            fprintf(fid, '\n\n');
+-            fprintf(fid, '%s\n', '<!-- Friction: Sigma= drag^2 * Neff ^r * u ^s, with Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p -->');
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Friction: Sigma= drag^2 * Neff ^r * u ^s, with Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p">','<section name="friction" />');   
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="coefficient" type="',   	class(self.coefficient),'" default="',     	convert2str(self.coefficient),'">',              '     <section name="friction" />','     <help> friction coefficient [SI] </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="p" type="',               class(self.p),'" default="',                 convert2str(self.p),'">',   '     <section name="friction" />','     <help> p exponent </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',        '<parameter key ="q" type="',               class(self.q),'" default="',                 convert2str(self.q),'">',            '     <section name="friction" />','     <help> q exponent </help>','</parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-        end % }}}
++		function createxml(self,fid) % {{{
++			fprintf(fid, '\n\n');
++			fprintf(fid, '%s\n', '<!-- Friction: Sigma= drag^2 * Neff ^r * u ^s, with Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p -->');
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Friction: Sigma= drag^2 * Neff ^r * u ^s, with Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p">','<section name="friction" />');   
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="coefficient" type="',   	class(self.coefficient),'" default="',     	convert2str(self.coefficient),'">',              '     <section name="friction" />','     <help> friction coefficient [SI] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="p" type="',               class(self.p),'" default="',                 convert2str(self.p),'">',   '     <section name="friction" />','     <help> p exponent </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',        '<parameter key ="q" type="',               class(self.q),'" default="',                 convert2str(self.q),'">',            '     <section name="friction" />','     <help> q exponent </help>','</parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++		end % }}}
++		function self = extrude(self,md) % {{{
++			self.coefficient=project3d(md,'vector',self.coefficient,'type','node','layer',1);
++			self.p=project3d(md,'vector',self.p,'type','element');
++			self.q=project3d(md,'vector',self.q,'type','element');
++		end % }}}
+ 		function self = friction(varargin) % {{{
+ 			switch nargin
+ 				case 0
+Index: ../trunk-jpl/src/m/classes/frictionweertman.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionweertman.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/frictionweertman.m	(revision 19048)
+@@ -9,15 +9,15 @@
+ 		m = NaN;
+ 	end
+ 	methods
+-        function createxml(self,fid) % {{{
+-            fprintf(fid, '\n\n');
+-            fprintf(fid, '%s\n', '<!-- Friction: Sigma= drag^2 * Neff ^r * u ^s, with Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p -->');
+-            fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Friction: Sigma= drag^2 * Neff ^r * u ^s, with Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p">','<section name="frictionweertman" />');   
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="coefficient" type="',   	class(self.coefficient),'" default="',     	convert2str(self.coefficient),'">',              '     <section name="frictionweertman" />','     <help> frictionweertman coefficient [SI] </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="p" type="',               class(self.p),'" default="',                 convert2str(self.p),'">',   '     <section name="frictionweertman" />','     <help> p exponent </help>','</parameter>');
+-            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',        '<parameter key ="q" type="',               class(self.q),'" default="',                 convert2str(self.q),'">',            '     <section name="frictionweertman" />','     <help> q exponent </help>','</parameter>');
+-            fprintf(fid,'%s\n%s\n','</frame>');
+-        end % }}}
++		function createxml(self,fid) % {{{
++			fprintf(fid, '\n\n');
++			fprintf(fid, '%s\n', '<!-- Friction: Sigma= drag^2 * Neff ^r * u ^s, with Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p -->');
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Friction: Sigma= drag^2 * Neff ^r * u ^s, with Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p">','<section name="frictionweertman" />');   
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="coefficient" type="',   	class(self.coefficient),'" default="',     	convert2str(self.coefficient),'">',              '     <section name="frictionweertman" />','     <help> frictionweertman coefficient [SI] </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="p" type="',               class(self.p),'" default="',                 convert2str(self.p),'">',   '     <section name="frictionweertman" />','     <help> p exponent </help>','</parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',        '<parameter key ="q" type="',               class(self.q),'" default="',                 convert2str(self.q),'">',            '     <section name="frictionweertman" />','     <help> q exponent </help>','</parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++		end % }}}
+ 		function self = frictionweertman(varargin) % {{{
+ 			switch nargin
+ 				case 0
+@@ -26,6 +26,10 @@
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
++		function self = extrude(self,md) % {{{
++			md.friction.C=project3d(md,'vector',md.friction.C,'type','node','layer',1);
++			md.friction.m=project3d(md,'vector',md.friction.m,'type','element');
++		end % }}}
+ 		function self = setdefaultparameters(self) % {{{
+ 
+ 		end % }}}
+Index: ../trunk-jpl/src/m/classes/hydrologydc.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/hydrologydc.py	(revision 19048)
+@@ -1,4 +1,5 @@
+ import numpy
++from project3d import project3d
+ from fielddisplay import fielddisplay
+ from EnumDefinitions import *
+ from checkfield import checkfield
+@@ -46,7 +47,6 @@
+ 		#set defaults
+ 		self.setdefaultparameters()
+ 	#}}}
+-
+ 	def __repr__(self): # {{{
+ 		string='   hydrology Dual Porous Continuum Equivalent parameters:'
+ 		string='   - general parameters'
+@@ -94,6 +94,16 @@
+ 			string="%s\n%s"%(string,fielddisplay(self,'eplflip_lock','lock epl activity to avoid flip-floping (default is 0, no stabilization)'))
+ 		return string
+ #}}}
++	def extrude(self,md): # {{{
++		self.spcsediment_head=project3d(md,'vector',self.spcsediment_head,'type','node','layer',1)
++		self.spcepl_head=project3d(md,'vector',self.spcepl_head,'type','node','layer',1)
++		self.mask_eplactive_node=project3d(md,'vector',self.mask_eplactive_node,'type','node','layer',1)
++		self.sediment_transmitivity=project3d(md,'vector',self.sediment_transmitivity,'type','node','layer',1)
++		self.basal_moulin_input=project3d(md,'vector',self.basal_moulin_input,'type','node','layer',1)
++		if self.isefficientlayer==1 :
++			self.spcepl_head=project3d(md,'vector',self.spcepl_head,'type','node','layer',1)
++		return self
++	#}}}
+ 	def setdefaultparameters(self): #{{{ 
+ 
+ 		#Parameters from de Fleurian 2014
+@@ -124,7 +134,6 @@
+ 		
+ 		return self
+ 	# }}}
+-
+ 	def initialize(self,md): # {{{
+ 		if numpy.all(numpy.isnan(self.basal_moulin_input)):
+ 			self.basal_moulin_input=numpy.zeros((md.mesh.numberofvertices,1))
+Index: ../trunk-jpl/src/m/classes/frictionhydro.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/frictionhydro.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/frictionhydro.m	(revision 19048)
+@@ -30,6 +30,12 @@
+ 			md = checkfield(md,'fieldname','friction.C','NaN',1,'size',[md.mesh.numberofelements 1]);
+ 			md = checkfield(md,'fieldname','friction.As','NaN',1,'size',[md.mesh.numberofelements 1]);
+ 		end % }}}
++		function self = extrude(self,md) % {{{
++			self.q=project3d(md,'vector',self.q,'type','element');
++			self.C=project3d(md,'vector',self.C,'type','element');
++			self.As=project3d(md,'vector',self.As,'type','element');
++			self.effective_pressure=project3d(md,'vector',self.effective_pressure,'type','node','layer',1);
++		end % }}}
+ 		function disp(self) % {{{
+ 			disp(sprintf('Effective Pressure based friction law described in Gagliardini 2007'));
+ 			fielddisplay(self,'q','friction law exponent q>=1');
+Index: ../trunk-jpl/src/m/classes/model.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/model.py	(revision 19048)
+@@ -594,103 +594,30 @@
+ 
+ 		#Ok, now deal with the other fields from the 2d mesh:
+ 
++		#bedinfo and surface info
++		md.mesh.vertexonbase=project3d(md,'vector',numpy.ones(md.mesh.numberofvertices2d,bool),'type','node','layer',1)
++		md.mesh.vertexonsurface=project3d(md,'vector',numpy.ones(md.mesh.numberofvertices2d,bool),'type','node','layer',md.mesh.numberoflayers)
++		md.mesh.vertexonboundary=project3d(md,'vector',md.mesh.vertexonboundary,'type','node')
++
+ 		#lat long
+ 		md.mesh.lat=project3d(md,'vector',md.mesh.lat,'type','node')
+ 		md.mesh.long=project3d(md,'vector',md.mesh.long,'type','node')
+ 
+-		#drag coefficient is limited to nodes that are on the bedrock.
+-		md.friction.coefficient=project3d(md,'vector',md.friction.coefficient,'type','node','layer',1)
+-
+-		#p and q (same deal, except for element that are on the bedrock: )
+-		md.friction.p=project3d(md,'vector',md.friction.p,'type','element')
+-		md.friction.q=project3d(md,'vector',md.friction.q,'type','element')
+-
+-		#observations
+-		md.inversion.vx_obs=project3d(md,'vector',md.inversion.vx_obs,'type','node')
+-		md.inversion.vy_obs=project3d(md,'vector',md.inversion.vy_obs,'type','node')
+-		md.inversion.vel_obs=project3d(md,'vector',md.inversion.vel_obs,'type','node')
+-		md.inversion.thickness_obs=project3d(md,'vector',md.inversion.thickness_obs,'type','node')
++		md.geometry.extrude(md)
++		md.friction.extrude(md)
++		md.inversion.extrude(md)
+ 		md.surfaceforcings.extrude(md)
+-		md.balancethickness.thickening_rate=project3d(md,'vector',md.balancethickness.thickening_rate,'type','node')
++		md.initialization.extrude(md)
++		md.flowequation.extrude(md)
+ 
+-		#results
+-		if not numpy.any(numpy.isnan(md.initialization.vx)):
+-			md.initialization.vx=project3d(md,'vector',md.initialization.vx,'type','node')
+-		if not numpy.any(numpy.isnan(md.initialization.vy)):
+-			md.initialization.vy=project3d(md,'vector',md.initialization.vy,'type','node')
+-		if not numpy.any(numpy.isnan(md.initialization.vz)):
+-			md.initialization.vz=project3d(md,'vector',md.initialization.vz,'type','node')
+-		if not numpy.any(numpy.isnan(md.initialization.vel)):
+-			md.initialization.vel=project3d(md,'vector',md.initialization.vel,'type','node')
+-		if not numpy.any(numpy.isnan(md.initialization.temperature)):
+-			md.initialization.temperature=project3d(md,'vector',md.initialization.temperature,'type','node')
+-		if not numpy.any(numpy.isnan(md.initialization.waterfraction)):
+-			md.initialization.waterfraction=project3d(md,'vector',md.initialization.waterfraction,'type','node')
+-		if not numpy.any(numpy.isnan(md.initialization.watercolumn)):
+-			md.initialization.watercolumn=project3d(md,'vector',md.initialization.watercolumn,'type','node')
+-                if not numpy.any(numpy.isnan(md.initialization.sediment_head)):
+-                        md.initialization.sediment_head=project3d(md,'vector',md.initialization.sediment_head,'type','node','layer',1)
+-                if not numpy.any(numpy.isnan(md.initialization.epl_head)):
+-                        md.initialization.epl_head=project3d(md,'vector',md.initialization.epl_head,'type','node','layer',1)
+-                if not numpy.any(numpy.isnan(md.initialization.epl_thickness)):
+-                        md.initialization.epl_thickness=project3d(md,'vector',md.initialization.epl_thickness,'type','node','layer',1)
++		md.stressbalance.extrude(md)
++		md.thermal.extrude(md)
++		md.masstransport.extrude(md)
+ 
+-		#bedinfo and surface info
+-		md.mesh.vertexonbase=project3d(md,'vector',numpy.ones(md.mesh.numberofvertices2d,bool),'type','node','layer',1)
+-		md.mesh.vertexonsurface=project3d(md,'vector',numpy.ones(md.mesh.numberofvertices2d,bool),'type','node','layer',md.mesh.numberoflayers)
+-
+-		#elementstype
+-		if not numpy.any(numpy.isnan(md.flowequation.element_equation)):
+-			oldelements_type=md.flowequation.element_equation
+-			md.flowequation.element_equation=numpy.zeros(number_el3d,int)
+-			md.flowequation.element_equation=project3d(md,'vector',oldelements_type,'type','element')
+-
+-		#verticestype
+-		if not numpy.any(numpy.isnan(md.flowequation.vertex_equation)):
+-			oldvertices_type=md.flowequation.vertex_equation
+-			md.flowequation.vertex_equation=numpy.zeros(number_nodes3d,int)
+-			md.flowequation.vertex_equation=project3d(md,'vector',oldvertices_type,'type','node')
+-
+-		md.flowequation.borderSSA=project3d(md,'vector',md.flowequation.borderSSA,'type','node')
+-		md.flowequation.borderHO=project3d(md,'vector',md.flowequation.borderHO,'type','node')
+-		md.flowequation.borderFS=project3d(md,'vector',md.flowequation.borderFS,'type','node')
+-
+-		#boundary conditions
+-		md.stressbalance.spcvx=project3d(md,'vector',md.stressbalance.spcvx,'type','node')
+-		md.stressbalance.spcvy=project3d(md,'vector',md.stressbalance.spcvy,'type','node')
+-		md.stressbalance.spcvz=project3d(md,'vector',md.stressbalance.spcvz,'type','node')
+-		md.thermal.spctemperature=project3d(md,'vector',md.thermal.spctemperature,'type','node','layer',md.mesh.numberoflayers,'padding',numpy.nan)
+-		if isinstance(md.initialization.temperature,numpy.ndarray) and numpy.size(md.initialization.temperature,axis=0)==md.mesh.numberofvertices:
+-			md.thermal.spctemperature=numpy.nan*numpy.ones((md.mesh.numberofvertices,1))
+-			if hasattr(md.mesh,'vertexonsurface'):
+-				pos=numpy.nonzero(md.mesh.vertexonsurface)[0]
+-				md.thermal.spctemperature[pos]=md.initialization.temperature[pos]    #impose observed temperature on surface
+-		md.masstransport.spcthickness=project3d(md,'vector',md.masstransport.spcthickness,'type','node')
+-		md.balancethickness.spcthickness=project3d(md,'vector',md.balancethickness.spcthickness,'type','node')
+-		md.damage.spcdamage=project3d(md,'vector',md.damage.spcdamage,'type','node')
+-		md.stressbalance.referential=project3d(md,'vector',md.stressbalance.referential,'type','node')
+-		md.stressbalance.loadingforce=project3d(md,'vector',md.stressbalance.loadingforce,'type','node')
+-
+ 		# Calving variables
+-		if isinstance(md.calving,calving):
+-			md.calving.calvingrate=project3d(md,'vector',md.calving.calvingrate,'type','node')
+-		if isinstance(md.calving,calvinglevermann):
+-			md.calving.coeff=project3d(md,'vector',md.calving.coeff,'type','node')
+-		#if isinstance(md.calving,calvingpi):
+-		#	md.calving.coeff=project3d(md,'vector',md.calving.coeff,'type','node')
+-		if not numpy.any(numpy.isnan(md.calving.meltingrate)):
+-			md.calving.meltingrate=project3d(md,'vector',md.calving.meltingrate,'type','node')
++		md.hydrology.extrude(md)
++		md.calving.extrude(md)
+ 
+-		# Hydrologydc variables
+-		if hasattr(md.hydrology,'hydrologydc'):
+-			md.hydrology.spcsediment_head=project3d(md,'vector',md.hydrology.spcsediment_head,'type','node','layer',1)
+-			md.hydrology.spcepl_head=project3d(md,'vector',md.hydrology.spcepl_head,'type','node','layer',1)
+-			md.hydrology.mask_eplactive_node=project3d(md,'vector',md.hydrology.mask_eplactive_node,'type','node','layer',1)
+-			md.hydrology.sediment_transmitivity=project3d(md,'vector',md.hydrology.sediment_transmitivity,'type','node','layer',1)
+-			md.hydrology.basal_moulin_input=project3d(md,'vector',md.hydrology.basal_moulin_input,'type','node','layer',1)
+-			if md.hydrology.isefficientlayer==1 :
+-				md.hydrology.spcepl_head=project3d(md,'vector',md.hydrology.spcepl_head,'type','node','layer',1)
+-
+ 		#connectivity
+ 		md.mesh.elementconnectivity=numpy.tile(md.mesh.elementconnectivity,(numlayers-1,1))
+ 		md.mesh.elementconnectivity[numpy.nonzero(md.mesh.elementconnectivity==0)]=-sys.maxint-1
+@@ -700,43 +627,13 @@
+ 						=md.mesh.elementconnectivity[i*md.mesh.numberofelements2d:(i+1)*md.mesh.numberofelements2d,:]+md.mesh.numberofelements2d
+ 				md.mesh.elementconnectivity[numpy.nonzero(md.mesh.elementconnectivity<0)]=0
+ 
+-		#materials
+-		md.materials.rheology_B=project3d(md,'vector',md.materials.rheology_B,'type','node')
+-		md.materials.rheology_n=project3d(md,'vector',md.materials.rheology_n,'type','element')
++		md.materials.extrude(md)
++		md.damage.extrude(md)
++		md.gia.extrude(md)
++		md.mask.extrude(md)
++		md.qmu.extrude(md)
++		md.basalforcings.extrude(md)
+ 
+-		#damage
+-		md.damage.D=project3d(md,'vector',md.damage.D,'type','node')
+-
+-		#parameters
+-		md.geometry.surface=project3d(md,'vector',md.geometry.surface,'type','node')
+-		md.geometry.thickness=project3d(md,'vector',md.geometry.thickness,'type','node')
+-		md.gia.mantle_viscosity=project3d(md,'vector',md.gia.mantle_viscosity,'type','node')
+-		md.gia.lithosphere_thickness=project3d(md,'vector',md.gia.lithosphere_thickness,'type','node')
+-		md.geometry.hydrostatic_ratio=project3d(md,'vector',md.geometry.hydrostatic_ratio,'type','node')
+-		md.geometry.base=project3d(md,'vector',md.geometry.base,'type','node')
+-		md.geometry.bed=project3d(md,'vector',md.geometry.bed,'type','node')
+-		md.mesh.vertexonboundary=project3d(md,'vector',md.mesh.vertexonboundary,'type','node')
+-		md.mask.ice_levelset=project3d(md,'vector',md.mask.ice_levelset,'type','node')
+-		md.mask.groundedice_levelset=project3d(md,'vector',md.mask.groundedice_levelset,'type','node')
+-		if not numpy.any(numpy.isnan(md.inversion.cost_functions_coefficients)):
+-			md.inversion.cost_functions_coefficients=project3d(md,'vector',md.inversion.cost_functions_coefficients,'type','node')
+-		if not numpy.any(numpy.isnan(md.inversion.min_parameters)):
+-			md.inversion.min_parameters=project3d(md,'vector',md.inversion.min_parameters,'type','node')
+-		if not numpy.any(numpy.isnan(md.inversion.max_parameters)):
+-			md.inversion.max_parameters=project3d(md,'vector',md.inversion.max_parameters,'type','node')
+-		if not numpy.any(numpy.isnan(md.qmu.partition)):
+-			md.qmu.partition=project3d(md,'vector',numpy.transpose(md.qmu.partition),'type','node')
+-
+-		#Put lithostatic pressure if there is an existing pressure
+-		if not numpy.any(numpy.isnan(md.initialization.pressure)):
+-			md.initialization.pressure=md.constants.g*md.materials.rho_ice*(md.geometry.surface-md.mesh.z.reshape(-1,1))
+-
+-		#special for thermal modeling:
+-		md.basalforcings.groundedice_melting_rate=project3d(md,'vector',md.basalforcings.groundedice_melting_rate,'type','node','layer',1)
+-		md.basalforcings.floatingice_melting_rate=project3d(md,'vector',md.basalforcings.floatingice_melting_rate,'type','node','layer',1)
+-		if not numpy.any(numpy.isnan(md.basalforcings.geothermalflux)):
+-			md.basalforcings.geothermalflux=project3d(md,'vector',md.basalforcings.geothermalflux,'type','node','layer',1)    #bedrock only gets geothermal flux
+-
+ 		#increase connectivity if less than 25:
+ 		if md.mesh.average_vertex_connectivity<=25:
+ 			md.mesh.average_vertex_connectivity=100
+Index: ../trunk-jpl/src/m/classes/stressbalance.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/stressbalance.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/stressbalance.py	(revision 19048)
+@@ -1,6 +1,7 @@
+ import numpy
+ import sys
+ import copy
++from project3d import project3d
+ from fielddisplay import fielddisplay
+ from EnumDefinitions import *
+ from checkfield import checkfield
+@@ -74,6 +75,15 @@
+ 
+ 		return string
+ 		#}}}
++	def extrude(self,md): # {{{
++		self.spcvx=project3d(md,'vector',self.spcvx,'type','node')
++		self.spcvy=project3d(md,'vector',self.spcvy,'type','node')
++		self.spcvz=project3d(md,'vector',self.spcvz,'type','node')
++		self.referential=project3d(md,'vector',self.referential,'type','node')
++		self.loadingforce=project3d(md,'vector',self.loadingforce,'type','node')
++
++		return self
++	#}}}
+ 	def setdefaultparameters(self): # {{{
+ 		#maximum of non-linear iterations.
+ 		self.maxiter=100
+Index: ../trunk-jpl/src/m/classes/qmu.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/qmu.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/qmu.py	(revision 19048)
+@@ -1,4 +1,5 @@
+ import numpy
++from project3d import project3d
+ from collections import OrderedDict
+ from fielddisplay import fielddisplay
+ from EnumDefinitions import *
+@@ -36,38 +37,13 @@
+ 		self.setdefaultparameters()
+ 
+ 		#}}}
+-	def setdefaultparameters(self): # {{{
+-		return self
+-	#}}}
+-	def checkconsistency(self,md,solution,analyses):    # {{{
+-
+-		#Early return
+-		if not md.qmu.isdakota:
+-			return
+-
+-		if not md.qmu.params.evaluation_concurrency==1:
+-			md.checkmessage("concurrency should be set to 1 when running dakota in library mode")
+-		if md.qmu.partition:
+-			if not numpy.size(md.qmu.partition)==md.mesh.numberofvertices:
+-				md.checkmessage("user supplied partition for qmu analysis should have size md.mesh.numberofvertices x 1")
+-			if not min(md.qmu.partition)==0:
+-				md.checkmessage("partition vector not indexed from 0 on")
+-			if max(md.qmu.partition)>=md.qmu.numberofpartitions:
+-				md.checkmessage("for qmu analysis, partitioning vector cannot go over npart, number of partition areas")
+-
+-		if not m.strcmpi(md.cluster.name,'none'):
+-			if not md.settings.waitonlock:
+-				md.checkmessage("waitonlock should be activated when running qmu in parallel mode!")
+-
+-		return md
+-	# }}}
+ 	def __repr__(self):    # {{{
+ 		s ='   qmu parameters:\n'
+ 
+ 		s+="%s\n" % fielddisplay(self,'isdakota','is qmu analysis activated?')
+ 		for i,variable in enumerate(self.variables.iteritems()):
+ 			s+="         variables%s:  (arrays of each variable class)\n" % \
+-				string_dim(self.variables,i)
++					string_dim(self.variables,i)
+ 			fnames=vars(variable)
+ 			maxlen=0
+ 			for fname in fnames:
+@@ -75,11 +51,11 @@
+ 
+ 			for fname in fnames:
+ 				s+="'            %-*s:    [%ix%i]    '%s'\n" % \
+-					(maxlen+1,fname,size(getattr(variable,fname)),type(getattr(variable,fname)))
++						(maxlen+1,fname,size(getattr(variable,fname)),type(getattr(variable,fname)))
+ 
+ 		for i,response in enumerate(self.responses.iteritems()):
+ 			s+="         responses%s:  (arrays of each response class)\n" % \
+-				string_dim(self.responses,i)
++					string_dim(self.responses,i)
+ 			fnames=vars(response)
+ 			maxlen=0
+ 			for fname in fnames:
+@@ -87,18 +63,18 @@
+ 
+ 			for fname in fnames:
+ 				s+="            %-*s:    [%ix%i]    '%s'\n" % \
+-					(maxlen+1,fname,size(getattr(response,fname)),type(getattr(response,fname)))
++						(maxlen+1,fname,size(getattr(response,fname)),type(getattr(response,fname)))
+ 
+ 		s+="%s\n" % fielddisplay(self,'numberofresponses','number of responses') 
+ 
+ 		for i,method in enumerate(self.method.iteritems()):
+ 			if isinstance(method,'dakota_method'):
+ 				s+="            method%s :    '%s'\n" % \
+-					(string_dim(method,i),method.method)
++						(string_dim(method,i),method.method)
+ 
+ 		for i,param in enumerate(self.params.iteritems()):
+ 			s+="         params%s:  (array of method-independent parameters)\n" % \
+-				string_dim(self.params,i)
++					string_dim(self.params,i)
+ 			fnames=vars(param)
+ 			maxlen=0
+ 			for fname in fnames:
+@@ -106,11 +82,11 @@
+ 
+ 			for fname in fnames:
+ 				s+="            %-*s: %s\n" % \
+-					(maxlen+1,fname,any2str(getattr(param,fname)))
++						(maxlen+1,fname,any2str(getattr(param,fname)))
+ 
+ 		for i,result in enumerate(self.results.iteritems()):
+ 			s+="         results%s:  (information from dakota files)\n" % \
+-				string_dim(self.results,i)
++					string_dim(self.results,i)
+ 			fnames=vars(result)
+ 			maxlen=0
+ 			for fname in fnames:
+@@ -118,7 +94,7 @@
+ 
+ 			for fname in fnames:
+ 				s+="            %-*s:    [%ix%i]    '%s'\n" % \
+-					(maxlen+1,fname,size(getattr(result,fname)),type(getattr(result,fname)))
++						(maxlen+1,fname,size(getattr(result,fname)),type(getattr(result,fname)))
+ 
+ 		s+="%s\n" % fielddisplay(self,'partition','user provided mesh partitioning, defaults to metis if not specified') 
+ 		s+="%s\n" % fielddisplay(self,'numberofpartitions','number of partitions for semi-discrete qmu') 
+@@ -133,6 +109,35 @@
+ 
+ 		return s
+ 	# }}}
++	def extrude(self,md): # {{{
++		self.partition=project3d(md,'vector',numpy.transpose(self.partition),'type','node')
++		return self
++	#}}}
++	def setdefaultparameters(self): # {{{
++		return self
++	#}}}
++	def checkconsistency(self,md,solution,analyses):    # {{{
++
++		#Early return
++		if not md.qmu.isdakota:
++			return
++
++		if not md.qmu.params.evaluation_concurrency==1:
++			md.checkmessage("concurrency should be set to 1 when running dakota in library mode")
++		if md.qmu.partition:
++			if not numpy.size(md.qmu.partition)==md.mesh.numberofvertices:
++				md.checkmessage("user supplied partition for qmu analysis should have size md.mesh.numberofvertices x 1")
++			if not min(md.qmu.partition)==0:
++				md.checkmessage("partition vector not indexed from 0 on")
++			if max(md.qmu.partition)>=md.qmu.numberofpartitions:
++				md.checkmessage("for qmu analysis, partitioning vector cannot go over npart, number of partition areas")
++
++		if not m.strcmpi(md.cluster.name,'none'):
++			if not md.settings.waitonlock:
++				md.checkmessage("waitonlock should be activated when running qmu in parallel mode!")
++
++		return md
++	# }}}
+ 	def marshall(self,md,fid):    # {{{
+ 		WriteData(fid,'object',self,'fieldname','isdakota','format','Boolean')
+ 		if not self.isdakota:
+Index: ../trunk-jpl/src/m/classes/matice.py
+===================================================================
+--- ../trunk-jpl/src/m/classes/matice.py	(revision 19047)
++++ ../trunk-jpl/src/m/classes/matice.py	(revision 19048)
+@@ -1,4 +1,5 @@
+ from fielddisplay import fielddisplay
++from project3d import project3d
+ from EnumDefinitions import *
+ from StringToEnum import StringToEnum
+ from checkfield import checkfield
+@@ -62,6 +63,11 @@
+ 
+ 		return string
+ 		#}}}
++	def extrude(self,md): # {{{
++		self.rheology_B=project3d(md,'vector',self.rheology_B,'type','node')
++		self.rheology_n=project3d(md,'vector',self.rheology_n,'type','element')
++		return self
++	#}}}
+ 	def setdefaultparameters(self): # {{{
+ 		#ice density (kg/m^3)
+ 		self.rho_ice=917.
+Index: ../trunk-jpl/src/m/classes/masstransport.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/masstransport.m	(revision 19047)
++++ ../trunk-jpl/src/m/classes/masstransport.m	(revision 19048)
+@@ -58,6 +58,9 @@
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
++		function self = extrude(self,md) % {{{
++			self.spcthickness=project3d(md,'vector',self.spcthickness,'type','node');
++		end % }}}
+ 		function list = defaultoutputs(self,md) % {{{
+ 
+ 			list = {'Thickness','Surface','Base'};
Index: /issm/oecreview/Archive/18296-19100/ISSM-19048-19049.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19048-19049.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19048-19049.diff	(revision 19102)
@@ -0,0 +1,4892 @@
+Index: ../trunk-jpl/test/NightlyRun/test118.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test118.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test118.py	(revision 19049)
+@@ -1,26 +0,0 @@
+-from model import *
+-from triangle import *
+-from meshconvert import *
+-from setmask import *
+-from parameterize import *
+-from setflowequation import *
+-from EnumDefinitions import *
+-from solve import *
+-from MatlabFuncs import *
+-
+-md=triangle(model(),'../Exp/Square.exp',150000)
+-md=meshconvert(md)
+-md=setmask(md,'all','')
+-md=parameterize(md,'../Par/SquareShelfConstrained.py')
+-md.balancethickness.stabilization=3
+-md.initialization.vy=md.initialization.vy+400.
+-md=setflowequation(md,'SSA','all')
+-md.cluster=generic('name',oshostname(),'np',3)
+-md=solve(md,BalancethicknessSolutionEnum())
+-
+-#Fields and tolerances to track changes
+-field_names     =['Thickness']
+-field_tolerances=[1e-13]
+-field_values=[\
+-	md.results.BalancethicknessSolution.Thickness,\
+-	]
+Index: ../trunk-jpl/test/NightlyRun/test610.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test610.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test610.py	(revision 19049)
+@@ -1,24 +0,0 @@
+-import numpy
+-from model import *
+-from EnumDefinitions import *
+-from MatlabFuncs import *
+-from triangle import *
+-from setmask import *
+-from parameterize import *
+-from setflowequation import *
+-from solve import *
+-
+-md=triangle(model(),'../Exp/79North.exp',10000.)
+-md=setmask(md,'../Exp/79NorthShelf.exp','')
+-md=parameterize(md,'../Par/79North.py')
+-md.extrude(3,1.)
+-md=setflowequation(md,'SSA','all')
+-md.cluster=generic('name',oshostname(),'np',3)
+-md=solve(md,BalancethicknessSolutionEnum())
+-
+-#Fields and tolerances to track changes
+-field_names     =['Thickness']
+-field_tolerances=[1e-12]
+-field_values=[\
+-	md.results.BalancethicknessSolution.Thickness,\
+-	]
+Index: ../trunk-jpl/test/NightlyRun/test117.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test117.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test117.m	(revision 19049)
+@@ -1,17 +0,0 @@
+-md=triangle(model(),'../Exp/Square.exp',150000.);
+-md=setmask(md,'all','');
+-md=parameterize(md,'../Par/SquareShelfConstrained.par');
+-md=extrude(md,5,1.);
+-%Add boundary conditions on thickness on the border
+-pos=find(md.mesh.vertexonboundary);
+-md.balancethickness.spcthickness(pos)=md.geometry.thickness(pos);
+-md=setflowequation(md,'SSA','all');
+-md.cluster=generic('name',oshostname(),'np',3);
+-md=solve(md,BalancethicknessSolutionEnum());
+-
+-%Fields and tolerances to track changes
+-field_names     ={'Thickness'};
+-field_tolerances={1e-13};
+-field_values={...
+-	(md.results.BalancethicknessSolution.Thickness),...
+-	};
+Index: ../trunk-jpl/test/NightlyRun/test118.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test118.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test118.m	(revision 19049)
+@@ -1,16 +0,0 @@
+-md=triangle(model(),'../Exp/Square.exp',150000.);
+-md=meshconvert(md);
+-md=setmask(md,'all','');
+-md=parameterize(md,'../Par/SquareShelfConstrained.par');
+-md.balancethickness.stabilization=3;
+-md.initialization.vy=md.initialization.vy+400;
+-md=setflowequation(md,'SSA','all');
+-md.cluster=generic('name',oshostname(),'np',3);
+-md=solve(md,BalancethicknessSolutionEnum());
+-
+-%Fields and tolerances to track changes
+-field_names     ={'Thickness'};
+-field_tolerances={1e-13};
+-field_values={...
+-	(md.results.BalancethicknessSolution.Thickness),...
+-	};
+Index: ../trunk-jpl/test/NightlyRun/test609.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test609.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test609.m	(revision 19049)
+@@ -1,15 +0,0 @@
+-md=triangle(model(),'../Exp/79North.exp',10000.);
+-md=meshconvert(md);
+-md=setmask(md,'../Exp/79NorthShelf.exp','');
+-md=parameterize(md,'../Par/79North.par');
+-md=setflowequation(md,'SSA','all');
+-md.balancethickness.stabilization=3;
+-md.cluster=generic('name',oshostname(),'np',3);
+-md=solve(md,BalancethicknessSolutionEnum());
+-
+-%Fields and tolerances to track changes
+-field_names     ={'Thickness'};
+-field_tolerances={1e-13};
+-field_values={...
+-	(md.results.BalancethicknessSolution.Thickness),...
+-	};
+Index: ../trunk-jpl/test/NightlyRun/test610.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test610.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test610.m	(revision 19049)
+@@ -1,14 +0,0 @@
+-md=triangle(model(),'../Exp/79North.exp',10000.);
+-md=setmask(md,'../Exp/79NorthShelf.exp','');
+-md=parameterize(md,'../Par/79North.par');
+-md=extrude(md,3,1.);
+-md=setflowequation(md,'SSA','all');
+-md.cluster=generic('name',oshostname(),'np',3);
+-md=solve(md,BalancethicknessSolutionEnum());
+-
+-%Fields and tolerances to track changes
+-field_names     ={'Thickness'};
+-field_tolerances={1e-12};
+-field_values={...
+-	(md.results.BalancethicknessSolution.Thickness),...
+-	};
+Index: ../trunk-jpl/test/NightlyRun/test609.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test609.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test609.py	(revision 19049)
+@@ -1,26 +0,0 @@
+-import numpy
+-from model import *
+-from EnumDefinitions import *
+-from MatlabFuncs import *
+-from triangle import *
+-from meshconvert import *
+-from setmask import *
+-from parameterize import *
+-from setflowequation import *
+-from solve import *
+-
+-md=triangle(model(),'../Exp/79North.exp',10000.)
+-md=meshconvert(md)
+-md=setmask(md,'../Exp/79NorthShelf.exp','')
+-md=parameterize(md,'../Par/79North.py')
+-md=setflowequation(md,'SSA','all')
+-md.balancethickness.stabilization=3
+-md.cluster=generic('name',oshostname(),'np',3)
+-md=solve(md,BalancethicknessSolutionEnum())
+-
+-#Fields and tolerances to track changes
+-field_names     =['Thickness']
+-field_tolerances=[1e-13]
+-field_values=[\
+-	md.results.BalancethicknessSolution.Thickness,\
+-	]
+Index: ../trunk-jpl/test/NightlyRun/test117.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test117.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test117.py	(revision 19049)
+@@ -1,27 +0,0 @@
+-import numpy
+-from model import *
+-from triangle import *
+-from setmask import *
+-from parameterize import *
+-from setflowequation import *
+-from EnumDefinitions import *
+-from solve import *
+-from MatlabFuncs import *
+-
+-md=triangle(model(),'../Exp/Square.exp',150000)
+-md=setmask(md,'all','')
+-md=parameterize(md,'../Par/SquareShelfConstrained.py')
+-md.extrude(5,1.)
+-#Add boundary conditions on thickness on the border
+-pos=numpy.nonzero(md.mesh.vertexonboundary)
+-md.balancethickness.spcthickness[pos]=md.geometry.thickness[pos]
+-md=setflowequation(md,'SSA','all')
+-md.cluster=generic('name',oshostname(),'np',3)
+-md=solve(md,BalancethicknessSolutionEnum())
+-
+-#Fields and tolerances to track changes
+-field_names     =['Thickness']
+-field_tolerances=[1e-13]
+-field_values=[\
+-	md.results.BalancethicknessSolution.Thickness,\
+-	]
+Index: ../trunk-jpl/test/NightlyRun/test202.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test202.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test202.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressSSA3d
+ from MatlabFuncs import *
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test121.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test121.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test121.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedEnthalpyTran
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test511.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test511.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test511.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: PigCMBFS
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test404.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test404.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test404.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfStressFS
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test323.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test323.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test323.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedTranCflSSA2d
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test401.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test401.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test401.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfStressSSA2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test320.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test320.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test320.m	(revision 19049)
+@@ -1,3 +1,7 @@
++%Test Name: SquareSheetConstrainedMasstransp2dDG
++SquareSheetConstrainedCMDragSSA3d
++%Test Name: SquareSheetConstrainedMasstransp2dDG
++SquareSheetConstrainedCMDragSSA3d
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test216.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test216.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test216.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressSSA2dRift
+ from MatlabFuncs import *
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test109.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test109.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test109.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedTherTran
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test222.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test222.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test222.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressSSA2dTransientIncrHydro
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test303.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test303.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test303.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedStressSIASSA2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test205.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test205.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test205.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressMHOPenalties
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test124.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test124.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test124.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedTranFSFreeSurface
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test606.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test606.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test606.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: 79NorthBedSlop2d
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test107.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test107.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test107.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedMasstransp3d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test337.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test337.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test337.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedSmbComponents3d
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test801.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test801.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test801.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ValleyGlacierLevelsetSSA2d
+ md=triangle(model(),'../Exp/Square.exp',50000);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/ValleyGlacierShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test703.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test703.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test703.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: FlowbandFSsheetshelfTrans
+ %mesh parameters
+ x =[-5:.5:5]';
+ [b h sea]=NowickiProfile(x);
+Index: ../trunk-jpl/test/NightlyRun/test605.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test605.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test605.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: 79NorthSurfSlop3d
+ md=triangle(model(),'../Exp/79North.exp',10000.);
+ md=setmask(md,'../Exp/79NorthShelf.exp','');
+ md=parameterize(md,'../Par/79North.par');
+Index: ../trunk-jpl/test/NightlyRun/test426.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test426.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test426.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfGroundingLine3dAggressive
+ md=triangle(model(),'../Exp/Square.exp',350000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test507.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test507.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test507.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: PigTranFS
+ md=triangle(model(),'../Exp/Pig.exp',30000.);
+ md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
+ md=parameterize(md,'../Par/Pig.par');
+Index: ../trunk-jpl/test/NightlyRun/test328.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test328.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test328.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedSmbGradients2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test409.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test409.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test409.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfTranMHOPenalties
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test2001.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test2001.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test2001.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedGia2d
+ import numpy
+ import copy
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test3001.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3001.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3001.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedStressSSA2dAdolc
+ md=triangle(model(),'../Exp/Square.exp',50000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test1205.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1205.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1205.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: EISMINTRoundIceSheetStaticSIA
+ import numpy
+ from model import *
+ from roundmesh import *
+Index: ../trunk-jpl/test/NightlyRun/test1202.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1202.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1202.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: EISMINTStress1
+ %Test on the stressbalance model and the masstransport in 2d.
+ printingflag=false;
+ 
+Index: ../trunk-jpl/test/NightlyRun/test1104.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1104.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1104.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ISMIPBFS
+ %This test is a test from the ISMP-HOM Intercomparison project.
+ %Pattyn and Payne 2006
+ 
+Index: ../trunk-jpl/test/NightlyRun/test3108.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3108.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3108.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedTherSteaAdolcMumps
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test1602.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1602.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1602.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfHORotation
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test2071.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test2071.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test2071.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: GiaBenchmarksAB2dC1
+ % Benchmark experiments (Figure A2c Ivins and James, 1999, Geophys. J. Int.) 
+ md=triangle(model(),'../Exp/RoundFrontEISMINT.exp',200000.);
+ md=setmask(md,'','');
+Index: ../trunk-jpl/test/NightlyRun/test3107.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3107.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3107.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedMasstransp3dAdolcMumps
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test3009.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3009.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3009.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedTherTranAdolc
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test211.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test211.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test211.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTranFS
+ from MatlabFuncs import *
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test104.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test104.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test104.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedStressFS
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test601.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test601.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test601.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: 79NorthMasstransp2d
+ from model import *
+ from EnumDefinitions import *
+ from MatlabFuncs import *
+Index: ../trunk-jpl/test/NightlyRun/test332.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test332.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test332.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedHydrologyDC
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test410.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test410.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test410.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfSteaSSA3d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test225.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test225.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test225.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressHOTransientIncrNonHydro
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test306.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test306.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test306.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedStressSIASSA3d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test312.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test312.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test312.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedTherStea
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test231.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test231.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test231.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranForcePos3d
+ md=triangle(model(),'../Exp/Square.exp',350000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test803.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test803.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test803.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: ValleyGlacierLevelsetEnthalpyHO3d
+ from model import *
+ from triangle import *
+ from squaremesh import *
+Index: ../trunk-jpl/test/NightlyRun/test214.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test214.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test214.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfCMBHO
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test116.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test116.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test116.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedBalThic2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test291.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test291.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test291.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressFSP4z
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test508.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test508.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test508.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: PigSteaSSA3d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test427.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test427.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test427.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfGroundingLine3dSoft
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test239.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test239.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test239.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTranForceNoInterp3d
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test290.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test290.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test290.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressFSP2P1
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test516.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test516.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test516.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: PigTherSteaSUPG
+ md=triangle(model(),'../Exp/Pig.exp',30000.);
+ md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
+ md=parameterize(md,'../Par/Pig.par');
+Index: ../trunk-jpl/test/NightlyRun/test435.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test435.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test435.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: MISMIP3DHO
+ md=triangle(model(),'../Exp/Square.exp',100000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test418.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test418.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test418.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfDiadSSA3dDakotaAreaAverage
+ %test partitioning, and partition averaging
+ md=triangle(model(),'../Exp/Square.exp',30000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+Index: ../trunk-jpl/test/NightlyRun/test337.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test337.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test337.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedSmbComponents3d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test239.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test239.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test239.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranForceNoInterp3d
+ md=triangle(model(),'../Exp/Square.exp',350000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test3103.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3103.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3103.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedStressHOAdolcMumps
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test3010.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3010.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3010.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedTranSSA2dAdolc
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test1107.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1107.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1107.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: ISMIPDHO
+ import numpy
+ import shutil
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test220.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test220.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test220.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressHOFS3dTiling
+ from MatlabFuncs import *
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test301.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test301.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test301.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedStressSSA2d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test113.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test113.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test113.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedSurfSlope3d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test503.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test503.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test503.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: PigStressFS
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test422.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test422.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test422.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfStressSSAFS3dTiling
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test315.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test315.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test315.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedTranSIA3d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test208.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test208.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test208.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTranSSA2d
+ from MatlabFuncs import *
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test321.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test321.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test321.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedCMDragHO
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test402.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test402.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test402.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfStressSSA3d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test304.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test304.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test304.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedStressSSA3d
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test223.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test223.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test223.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressSSA2dTransientIncrNonHydro
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test206.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test206.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test206.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTherStea
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test274.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test274.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test274.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressSSA2dDamageRift
+ import numpy
+ from model import model
+ from triangle import triangle
+Index: ../trunk-jpl/test/NightlyRun/test108.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test108.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test108.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedTherStea
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test329.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test329.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test329.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedSmbGradients3d
+ import numpy
+ import copy
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test802.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test802.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test802.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ValleyGlacierLevelsetThermalSSA3d
+ md=triangle(model(),'../Exp/Square.exp',50000);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/ValleyGlacierShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test606.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test606.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test606.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: 79NorthBedSlop2d
+ md=triangle(model(),'../Exp/79North.exp',10000.);
+ md=setmask(md,'../Exp/79NorthShelf.exp','');
+ md=parameterize(md,'../Par/79North.par');
+Index: ../trunk-jpl/test/NightlyRun/test427.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test427.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test427.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfGroundingLine3dSoft
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test508.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test508.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test508.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: PigSteaSSA3d
+ md=triangle(model(),'../Exp/Pig.exp',35000.);
+ md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
+ md=parameterize(md,'../Par/Pig.par');
+Index: ../trunk-jpl/test/NightlyRun/test329.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test329.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test329.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedSmbGradients3d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test1102.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1102.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1102.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: ISMIPAFS
+ import numpy
+ import shutil
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test3005.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3005.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3005.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedMasstransp2dAdolc
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test1304.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1304.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1304.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: ThermalGeothermalFlux
+ import numpy
+ import sys
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test3002.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3002.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3002.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedStressSSA3dAdolc
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test1301.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1301.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1301.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ThermalMelting
+ % This file can be run to check that the melting in simple conduction is correctly modeled.
+ % There is no velocity (no advection) the only thermal boundary conditions are an imposed temperature
+ % at upper surface and an impose flux at its base. The result must be a linear temperature from the upper to the lower
+Index: ../trunk-jpl/test/NightlyRun/test1203.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1203.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1203.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: EISMINTStress2
+ %Test on the stressbalance model and the masstransport in 2d
+ printingflag=false;
+ 
+Index: ../trunk-jpl/test/NightlyRun/test1105.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1105.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1105.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ISMIPCHO
+ %This test is a test from the ISMP-HOM Intercomparison project.
+ %Pattyn and Payne 2006
+ printingflag=false;
+Index: ../trunk-jpl/test/NightlyRun/test3019.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3019.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3019.py	(revision 19049)
+@@ -1,3 +1,7 @@
++#Test Name: SquareShelfConstrainedTherTranAdolcReverseVsForward
++SquareShelfConstrainedTherTranAdolcReverseVsForward
++#Test Name: SquareShelfConstrainedTherTranAdolcReverseVsForward
++SquareShelfConstrainedTherTranAdolcReverseVsForward
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test2072.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test2072.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test2072.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: GiaBenchmarksAB2dC2
+ % Benchmark experiments (Figure A2c Ivins and James, 1999, Geophys. J. Int.) 
+ md=triangle(model(),'../Exp/RoundFrontEISMINT.exp',200000.);
+ md=setmask(md,'','');
+Index: ../trunk-jpl/test/NightlyRun/test3108.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3108.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3108.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedTherSteaAdolcMumps
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test122.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test122.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test122.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedTransHOEnth
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test203.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test203.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test203.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressHO
+ from MatlabFuncs import *
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test431.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test431.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test431.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfSteaEnthalpySSA3d
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test512.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test512.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test512.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: PigCMDragHO
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test324.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test324.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test324.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedTranCflSIA3d
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test405.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test405.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test405.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfStressMHOPenalties
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test217.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test217.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test217.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrained
+ from MatlabFuncs import *
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test411.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test411.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test411.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfSteaHO
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test232.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test232.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test232.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTherTranForcTemp
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test313.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test313.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test313.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedTherTran
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test215.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test215.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test215.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfCMBFS
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test607.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test607.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test607.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: 79NorthBedSlop3d
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test338.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test338.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test338.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedSmbMeltComponents2d
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test419.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test419.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test419.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfStressSSAHOTiling
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test291.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test291.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test291.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressFSP4z
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test274.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test274.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test274.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressSSA2dDamageRift
+ md=triangle(model(),'../Exp/SquareHole.exp','../Exp/Rifts.exp',50000.);
+ md=meshprocessrifts(md,'../Exp/Square.exp');
+ md=setmask(md,'all','');
+Index: ../trunk-jpl/test/NightlyRun/test436.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test436.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test436.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfSteaEnthalpyLliboutryDuvalHO
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test338.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test338.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test338.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedSmbMeltComponents2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test419.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test419.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test419.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfStressSSAHOTiling
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test1501.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1501.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1501.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTranSawTooth2d
+ import numpy
+ import sys
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test1206.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1206.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1206.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: EISMINTRoundIceSheetStaticHO
+ import numpy
+ from model import *
+ from roundmesh import *
+Index: ../trunk-jpl/test/NightlyRun/test3109.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3109.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3109.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedTherTranAdolcMumps
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test2081.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test2081.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test2081.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: GiaBenchmarksAB2dD1
+ % Benchmark experiments (Figure A2d Ivins and James, 1999, Geophys. J. Int.) 
+ md=triangle(model(),'../Exp/RoundFrontEISMINT.exp',200000.);
+ md=setmask(md,'','');
+Index: ../trunk-jpl/test/NightlyRun/test3019.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3019.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3019.m	(revision 19049)
+@@ -1,3 +1,7 @@
++%Test Name: SquareShelfConstrainedTherTranAdolcReverseVsForward
++SquareShelfConstrainedTherTranAdolcReverseVsForward
++%Test Name: SquareShelfConstrainedTherTranAdolcReverseVsForward
++SquareShelfConstrainedTherTranAdolcReverseVsForward
+ %test reverse scalar vs forward vectorial drivers in ADOLC, using the test3009 setup, equivalent to test109 setup.
+ md=triangle(model(),'../Exp/Square.exp',100000.);
+ md=setmask(md,'all','');
+Index: ../trunk-jpl/test/NightlyRun/test212.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test212.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test212.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfCMBSSA2d
+ from MatlabFuncs import *
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test101.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test101.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test101.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedStressSSA2d
+ md=triangle(model(),'../Exp/Square.exp',50000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test105.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test105.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test105.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedMasstransp2d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test602.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test602.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test602.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: 79NorthMasstransp2dDG
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test333.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test333.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test333.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetHydrologyDCTwoLayers
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test307.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test307.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test307.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedStressHO
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test226.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test226.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test226.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTranCflSSA2d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test420.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test420.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test420.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfDakotaScaledResponse
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test501.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test501.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test501.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: PigStressSSA2d
+ md=triangle(model(),'../Exp/Pig.exp',20000.);
+ md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
+ md=parameterize(md,'../Par/Pig.par');
+Index: ../trunk-jpl/test/NightlyRun/test119.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test119.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test119.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareBamgMesh
+ import numpy
+ import time
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test322.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test322.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test322.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedCMDragFS
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test403.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test403.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test403.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfStressHO
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test804.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test804.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test804.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: ValleyGlacierLevelsetCalvingSIA2d
+ from model import *
+ from triangle import *
+ from squaremesh import *
+Index: ../trunk-jpl/test/NightlyRun/test224.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test224.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test224.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressHOTransientIncrHydro
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test305.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test305.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test305.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedStressSIA3d
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test207.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test207.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test207.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTherTran
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test292.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test292.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test292.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTranSSA2dFloatingMeltParam
+ from MatlabFuncs import *
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test509.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test509.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test509.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: PigSteaHO
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test428.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test428.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test428.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfStressSSA2dNewton
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test109.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test109.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test109.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedTherTran
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test803.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test803.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test803.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ValleyGlacierLevelsetEnthalpyHO3d
+ md=triangle(model(),'../Exp/Square.exp',50000);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/ValleyGlacierShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test607.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test607.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test607.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: 79NorthBedSlop3d
+ md=triangle(model(),'../Exp/79North.exp',10000.);
+ md=setmask(md,'../Exp/79NorthShelf.exp','');
+ md=parameterize(md,'../Par/79North.par');
+Index: ../trunk-jpl/test/NightlyRun/test509.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test509.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test509.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: PigSteaHO
+ md=triangle(model(),'../Exp/Pig.exp',30000.);
+ md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
+ md=parameterize(md,'../Par/Pig.par');
+Index: ../trunk-jpl/test/NightlyRun/test428.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test428.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test428.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfStressSSA2dNewton
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test1201.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1201.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1201.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: EISMINTMassConservation
+ import numpy
+ from model import *
+ from bamg import *
+Index: ../trunk-jpl/test/NightlyRun/test3104.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3104.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3104.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedStressFSAdolcMumps
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test3101.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3101.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3101.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedStressSSA2dAdolcMumps
+ md=triangle(model(),'../Exp/Square.exp',50000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test3020.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3020.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3020.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedTranAdolcReverseVsForward
+ %This test runs test3020 with autodiff on, and checks that 
+ %the value of the scalar forward difference match a step-wise differential
+ 
+Index: ../trunk-jpl/test/NightlyRun/test1302.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1302.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1302.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ThermalAdvection
+ % This file can be run to check that the advection-diffusion  is correctly modeled.
+ % There is u=v=0 and w=cst everywhere the only thermal boundary conditions are an imposed temperature
+ % at upper surface and an impose flux at its base.
+Index: ../trunk-jpl/test/NightlyRun/test1108.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1108.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1108.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: ISMIPDFS
+ import numpy
+ from model import *
+ from bamg import *
+Index: ../trunk-jpl/test/NightlyRun/test3003.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3003.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3003.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedStressHOAdolc
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test1204.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1204.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1204.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: EISMINTTran2
+ %Test on the stressbalance model and the masstransport in 2d
+ printingflag=false;
+ 
+Index: ../trunk-jpl/test/NightlyRun/test1106.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1106.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1106.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ISMIPCFS
+ %This test is a test from the ISMP-HOM Intercomparison project.
+ %Pattyn and Payne 2006
+ 
+Index: ../trunk-jpl/test/NightlyRun/test2073.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test2073.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test2073.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: GiaBenchmarksAB2dC3
+ % Benchmark experiments (Figure A2c Ivins and James, 1999, Geophys. J. Int.) 
+ md=triangle(model(),'../Exp/RoundFrontEISMINT.exp',200000.);
+ md=setmask(md,'','');
+Index: ../trunk-jpl/test/NightlyRun/test3109.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3109.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3109.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedTherTranAdolcMumps
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test221.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test221.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test221.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressSSAFS3dTiling
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test302.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test302.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test302.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedStressSIA2d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test110.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test110.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test110.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedTranSSA2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test114.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test114.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test114.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedBedSlop2d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test611.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test611.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test611.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: 79NorthCMBalThic2dCG
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test530.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test530.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test530.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: PigBalVel1
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test504.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test504.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test504.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: PigTranSSA2d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test423.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test423.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test423.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: RoundSheetShelfGLMigrationSSA2d
+ import numpy
+ from model import *
+ from roundmesh import *
+Index: ../trunk-jpl/test/NightlyRun/test510.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test510.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test510.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: PigSteaFS
+ md=triangle(model(),'../Exp/Pig.exp',20000.);
+ md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
+ md=parameterize(md,'../Par/Pig.par');
+Index: ../trunk-jpl/test/NightlyRun/test316.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test316.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test316.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedTranSSA2d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test412.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test412.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test412.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfDiadSSA3dDakota
+ md=triangle(model(),'../Exp/Square.exp',300000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test209.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test209.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test209.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTranSSA3d
+ from MatlabFuncs import *
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test314.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test314.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test314.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedTranSIA2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test233.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test233.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test233.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranHOForcTemp
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test216.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test216.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test216.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressSSA2dRift
+ md=triangle(model(),'../Exp/SquareHole.exp','../Exp/Rifts.exp',50000.);
+ md=meshprocessrifts(md,'../Exp/Square.exp');
+ md=setmask(md,'all','');
+Index: ../trunk-jpl/test/NightlyRun/test275.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test275.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test275.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfDamageEvolutionSSA2d
+ import numpy
+ from triangle import triangle
+ from model import model
+Index: ../trunk-jpl/test/NightlyRun/test292.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test292.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test292.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranSSA2dFloatingMeltParam
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test437.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test437.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test437.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ThermalEnthBasalcondsTrans
+ md=triangle(model(),'../Exp/Square.exp',300000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareThermal.par');
+Index: ../trunk-jpl/test/NightlyRun/test275.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test275.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test275.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfDamageEvolutionSSA2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md.materials=matdamageice();
+Index: ../trunk-jpl/test/NightlyRun/test339.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test339.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test339.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedSmbMeltComponents3d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test1103.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1103.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1103.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: ISMIPBHO
+ import numpy
+ import shutil
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test4001.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test4001.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test4001.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: IceOcean
+ %ISSM/MITgcm coupled set-up
+ %
+ %Script control parameters
+Index: ../trunk-jpl/test/NightlyRun/test3110.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3110.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3110.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedTranSSA2dAdolcMumps
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test3006.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3006.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3006.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedMasstransp2dDGAdolc
+ from model import *
+ from triangle import *
+ from meshconvert import *
+Index: ../trunk-jpl/test/NightlyRun/test2082.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test2082.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test2082.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: GiaBenchmarksAB2dD2
+ % Benchmark experiments (Figure A2d Ivins and James, 1999, Geophys. J. Int.) 
+ md=triangle(model(),'../Exp/RoundFrontEISMINT.exp',200000.);
+ md=setmask(md,'','');
+Index: ../trunk-jpl/test/NightlyRun/test311.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test311.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test311.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedMasstransp3d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test230.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test230.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test230.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTranForceNeg3d
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test204.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test204.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test204.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressFS
+ from MatlabFuncs import *
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test102.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test102.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test102.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedStressSSA3d
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test513.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test513.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test513.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: PigCMDragSteaSSA3d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test432.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test432.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test432.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfSteaEnthalpyHO
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test270.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test270.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test270.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressSSA2dDamage
+ import numpy
+ from model import model
+ from triangle import triangle
+Index: ../trunk-jpl/test/NightlyRun/test406.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test406.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test406.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfTherStea
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test325.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test325.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test325.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedEnthalpyStea
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test502.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test502.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test502.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: PigStressHO
+ md=triangle(model(),'../Exp/Pig.exp',20000.);
+ md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
+ md=parameterize(md,'../Par/Pig.par');
+Index: ../trunk-jpl/test/NightlyRun/test421.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test421.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test421.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfStressHOFS3dTiling
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test340.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test340.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test340.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedCMtaoDragHO
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test404.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test404.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test404.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfStressFS
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test323.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test323.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test323.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedTranCflSSA2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test225.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test225.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test225.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressHOTransientIncrNonHydro
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test306.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test306.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test306.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedStressSIASSA3d
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test608.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test608.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test608.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: 79NorthBalThic2d
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test208.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test208.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test208.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranSSA2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test339.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test339.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test339.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedSmbMeltComponents3d
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test804.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test804.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test804.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ValleyGlacierLevelsetCalvingSIA2d
+ md=triangle(model(),'../Exp/Square.exp',50000);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/ValleyGlacierShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test608.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test608.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test608.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: 79NorthBalThic2d
+ md=triangle(model(),'../Exp/79North.exp',10000.);
+ md=setmask(md,'../Exp/79NorthShelf.exp','');
+ md=parameterize(md,'../Par/79North.par');
+Index: ../trunk-jpl/test/NightlyRun/test429.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test429.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test429.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfStressHONewton
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test3001.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3001.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3001.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedStressSSA2dAdolc
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test1502.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1502.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1502.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTranSawTooth3d
+ import numpy
+ import sys
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test3015.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3015.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3015.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedMasstransp2dAdolcForwardDifference
+ import numpy
+ import copy
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test3102.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3102.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3102.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedStressSSA3dAdolcMumps
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test1401.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1401.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1401.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: AdaptiveMeshRefinement1
+ %test the anisotropic mesh adaptation
+ %function to capture = exp(-(sqrt((md.mesh.x+0.1).^2+(md.mesh.y+0.1).^2)-0.75).^2*10.^6)+((md.mesh.x+0.1).^2+(md.mesh.y+0.1).^2)/2.;
+ printingflag=false;
+Index: ../trunk-jpl/test/NightlyRun/test1207.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1207.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1207.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: EISMINTRoundIceSheetStaticFS
+ import numpy
+ from model import *
+ from roundmesh import *
+Index: ../trunk-jpl/test/NightlyRun/test1303.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1303.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1303.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ThermalConduction
+ % This file can be run to check that the conduction is correctly modeled.
+ % There is no velocity (no advection) the only thermal boundary conditions are an imposed temperature
+ % at the lower and upper surface. The result must be a linear temperature from the upper to the lower
+Index: ../trunk-jpl/test/NightlyRun/test3004.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3004.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3004.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedStressFSAdolc
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test1205.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1205.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1205.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: EISMINTRoundIceSheetStaticSIA
+ %The aim of this program is to compare a model with an analytical solution given in SSA EISMINT : Lessons in Ice-Sheet Modeling.
+ printingflag=false;
+ 
+Index: ../trunk-jpl/test/NightlyRun/test1107.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1107.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1107.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ISMIPDHO
+ %This test is a test from the ISMP-HOM Intercomparison project.
+ %Pattyn and Payne 2006
+ printingflag=false;
+Index: ../trunk-jpl/test/NightlyRun/test401.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test401.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test401.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfStressSSA2d
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test320.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test320.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test320.py	(revision 19049)
+@@ -1,3 +1,7 @@
++#Test Name: SquareSheetConstrainedMasstransp2dDG
++SquareSheetConstrainedCMDragSSA3d
++#Test Name: SquareSheetConstrainedMasstransp2dDG
++SquareSheetConstrainedCMDragSSA3d
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test213.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test213.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test213.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfCMBSSA3d
+ from MatlabFuncs import *
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test106.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test106.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test106.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedMasstransp2dDG
+ from model import *
+ from triangle import *
+ from meshconvert import *
+Index: ../trunk-jpl/test/NightlyRun/test111.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test111.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test111.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedTranHO
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test603.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test603.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test603.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: 79NorthMasstransp3d
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test415.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test415.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test415.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfCMDragSteaSSA3d
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test511.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test511.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test511.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: PigCMBFS
+ md=triangle(model(),'../Exp/Pig.exp',11000.);
+ md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
+ md=parameterize(md,'../Par/Pig.par');
+Index: ../trunk-jpl/test/NightlyRun/test227.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test227.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test227.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTranCflHO
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test308.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test308.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test308.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedStressFS
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test413.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test413.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test413.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfDiadSSA3dDakotaPart
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test332.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test332.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test332.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedHydrologyDC
+ md=triangle(model(),'../Exp/Square.exp',100000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test805.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test805.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test805.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: ValleyGlacierLevelsetEnthCalvingHO3d
+ from model import *
+ from triangle import *
+ from squaremesh import *
+Index: ../trunk-jpl/test/NightlyRun/test315.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test315.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test315.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedTranSIA3d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test234.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test234.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test234.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranForceNeg2dDakotaSamp
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test455.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test455.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test455.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfStressHOHigherOrder
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test217.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test217.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test217.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrained
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test429.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test429.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test429.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfStressHONewton
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test119.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test119.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test119.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareBamgMesh
+ 
+ %Simple mesh
+ md=bamg(model(),'domain','../Exp/Square.exp','hmax',100000.,'rand',false);
+Index: ../trunk-jpl/test/NightlyRun/test455.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test455.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test455.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfStressHOHigherOrder
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test3010.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3010.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3010.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedTranSSA2dAdolc
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test1202.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1202.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1202.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: EISMINTStress1
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test3105.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3105.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3105.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedMasstransp2dAdolcMumps
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test2083.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test2083.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test2083.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: GiaBenchmarksAB2dD3
+ % Benchmark experiments (Figure A2d Ivins and James, 1999, Geophys. J. Int.) 
+ md=triangle(model(),'../Exp/RoundFrontEISMINT.exp',200000.);
+ md=setmask(md,'','');
+Index: ../trunk-jpl/test/NightlyRun/test101.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test101.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test101.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedStressSSA2d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test410.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test410.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test410.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfSteaSSA3d
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test222.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test222.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test222.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressSSA2dTransientIncrHydro
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test303.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test303.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test303.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedStressSIASSA2d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test201.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test201.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test201.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressSSA2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test120.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test120.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test120.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedEnthalpyStea
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test115.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test115.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test115.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedBedSlop3d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test103.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test103.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test103.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedStressHO
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test531.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test531.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test531.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: PigBalVel2
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test450.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test450.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test450.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfStressSSAHigherOrder
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test505.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test505.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test505.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: PigTranSSA3d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test424.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test424.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test424.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfGroundingLine2dAggressive
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test601.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test601.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test601.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: 79NorthMasstransp2d
+ md=triangle(model(),'../Exp/79North.exp',10000.);
+ md=setmask(md,'../Exp/79NorthShelf.exp','');
+ md=parameterize(md,'../Par/79North.par');
+Index: ../trunk-jpl/test/NightlyRun/test317.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test317.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test317.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedTranHO
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test236.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test236.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test236.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTranIspddIsdeltaSSA2d
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test341.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test341.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test341.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedCMm1qn3DragHO
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test422.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test422.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test422.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfStressSSAFS3dTiling
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test503.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test503.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test503.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: PigStressFS
+ md=triangle(model(),'../Exp/Pig.exp',20000.);
+ md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
+ md=parameterize(md,'../Par/Pig.par');
+Index: ../trunk-jpl/test/NightlyRun/test324.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test324.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test324.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedTranCflSIA3d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test405.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test405.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test405.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfStressMHOPenalties
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test307.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test307.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test307.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedStressHO
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test226.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test226.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test226.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranCflSSA2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test209.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test209.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test209.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranSSA3d
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test805.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test805.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test805.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ValleyGlacierLevelsetEnthCalvingHO3d
+ md=triangle(model(),'../Exp/Square.exp',50000);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/ValleyGlacierShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test285.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test285.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test285.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressHOHigherOrder
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test1104.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1104.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1104.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: ISMIPBFS
+ import numpy
+ from model import *
+ from squaremesh import *
+Index: ../trunk-jpl/test/NightlyRun/test1601.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1601.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1601.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfSSA2dRotation
+ import numpy
+ import sys
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test3007.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3007.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3007.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedMasstransp3dAdolc
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test1402.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1402.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1402.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: AdaptiveMeshRefinement2
+ %test the anisotropic mesh adaptation
+ printingflag=false;
+ 
+Index: ../trunk-jpl/test/NightlyRun/test3103.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3103.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3103.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedStressHOAdolcMumps
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test3005.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3005.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3005.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedMasstransp2dAdolc
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test1304.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1304.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1304.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ThermalGeothermalFlux
+ % This file can be run to check that the geothermal flux in simple conduction is correctly modeled.
+ % There is no velocity (no advection) the only thermal boundary conditions are an imposed temperature
+ % at upper surface and an impose flux at its base. The result must be a linear temperature from the upper to the lower
+Index: ../trunk-jpl/test/NightlyRun/test1206.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1206.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1206.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: EISMINTRoundIceSheetStaticHO
+ %The aim of this program is to compare a model with an analytical solution given in SSA EISMINT : Lessons in Ice-Sheet Modeling.
+ printingflag=false;
+ 
+Index: ../trunk-jpl/test/NightlyRun/test1108.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1108.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1108.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ISMIPDFS
+ %This test is a test from the ISMP-HOM Intercomparison project.
+ %Pattyn and Payne 2006
+ 
+Index: ../trunk-jpl/test/NightlyRun/test110.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test110.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test110.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedTranSSA2d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test231.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test231.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test231.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTranForcePos3d
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test312.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test312.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test312.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedTherStea
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test210.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test210.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test210.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranHO
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test205.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test205.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test205.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressMHOPenalties
+ from MatlabFuncs import *
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test112.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test112.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test112.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedSurfSlop2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test271.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test271.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test271.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressSSA2dDamageTran
+ import numpy 
+ from triangle import triangle
+ from model import model
+Index: ../trunk-jpl/test/NightlyRun/test433.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test433.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test433.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: RoundSheetShelfGLMigrationSSA3d
+ import numpy
+ from model import *
+ from roundmesh import *
+Index: ../trunk-jpl/test/NightlyRun/test514.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test514.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test514.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: PigBamgMesh
+ import numpy
+ import copy
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test326.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test326.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test326.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedEnthalpyTran
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test407.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test407.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test407.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfTherTran
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test219.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test219.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test219.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressSSAHOTiling
+ from MatlabFuncs import *
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test431.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test431.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test431.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfSteaEnthalpySSA3d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test512.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test512.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test512.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: PigCMDragHO
+ md=triangle(model(),'../Exp/Pig.exp',20000.);
+ md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
+ md=parameterize(md,'../Par/Pig.par');
+Index: ../trunk-jpl/test/NightlyRun/test333.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test333.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test333.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetHydrologyDCTwoLayers
+ md=triangle(model(),'../Exp/Square.exp',100000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test414.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test414.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test414.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfDiadSSA3dDakotaMassFlux
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test235.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test235.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test235.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranForceNeg2dDakotaLocal
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test316.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test316.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test316.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedTranSSA2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test285.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test285.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test285.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressHOHigherOrder
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test218.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test218.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test218.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedDakotaB
+ md=squaremesh(model(),1000000,1000000,5,5);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf2.par');
+Index: ../trunk-jpl/test/NightlyRun/test3002.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3002.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3002.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedStressSSA3dAdolc
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test1301.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1301.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1301.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: ThermalMelting
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test1208.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1208.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1208.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: EISMINTA
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test321.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test321.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test321.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedCMDragHO
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test402.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test402.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test402.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfStressSSA3d
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test214.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test214.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test214.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfCMBHO
+ from MatlabFuncs import *
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test107.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test107.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test107.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedMasstransp3d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test121.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test121.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test121.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedEnthalpyTran
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test202.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test202.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test202.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressSSA3d
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test104.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test104.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test104.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedStressFS
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test280.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test280.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test280.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressSSA2dHigherOrder
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test604.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test604.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test604.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: 79NorthSurfSlop2d
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test416.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test416.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test416.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfCMDragSteaHO
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test228.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test228.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test228.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTranForceNeg2d
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test309.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test309.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test309.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedMasstransp2d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test602.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test602.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test602.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: 79NorthMasstransp2dDG
+ md=triangle(model(),'../Exp/79North.exp',10000.);
+ md=meshconvert(md);
+ md=setmask(md,'../Exp/79NorthShelf.exp','');
+Index: ../trunk-jpl/test/NightlyRun/test423.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test423.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test423.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: RoundSheetShelfGLMigrationSSA2d
+ radius=1.e6;
+ shelfextent=2.e5;
+ 
+Index: ../trunk-jpl/test/NightlyRun/test504.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test504.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test504.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: PigTranSSA2d
+ md=triangle(model(),'../Exp/Pig.exp',20000.);
+ md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
+ md=parameterize(md,'../Par/Pig.par');
+Index: ../trunk-jpl/test/NightlyRun/test325.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test325.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test325.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedEnthalpyStea
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test406.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test406.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test406.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfTherStea
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test806.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test806.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test806.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfLevelsetCalvingSSA2dLevermann
+ from model import *
+ from triangle import *
+ from squaremesh import *
+Index: ../trunk-jpl/test/NightlyRun/test308.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test308.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test308.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedStressFS
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test227.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test227.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test227.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranCflHO
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test806.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test806.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test806.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfLevelsetCalvingSSA2dLevermann
+ md=triangle(model(),'../Exp/Square.exp',50000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test1203.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1203.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1203.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: EISMINTStress2
+ import numpy
+ import sys
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test1101.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1101.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1101.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ISMIPAHO
+ %This test is a test from the ISMP-HOM Intercomparison project.
+ %Pattyn and Payne 2006
+ printingflag=false;
+Index: ../trunk-jpl/test/NightlyRun/test3106.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3106.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3106.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedMasstransp2dDGAdolcMumps
+ from model import *
+ from triangle import *
+ from meshconvert import *
+Index: ../trunk-jpl/test/NightlyRun/test1501.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1501.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1501.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranSawTooth2d
+ printingflag = false;
+ 
+ md=triangle(model(),'../Exp/Square.exp',350000.);
+Index: ../trunk-jpl/test/NightlyRun/test2051.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test2051.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test2051.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: GiaBenchmarksAB2dA1
+ % Benchmark experiments (Figure A2a Ivins and James, 1999, Geophys. J. Int.) 
+ md=triangle(model(),'../Exp/RoundFrontEISMINT.exp',200000.);
+ md=setmask(md,'','');
+Index: ../trunk-jpl/test/NightlyRun/test3104.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3104.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3104.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedStressFSAdolcMumps
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test3006.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3006.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3006.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedMasstransp2dDGAdolc
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=meshconvert(md);
+ md=setmask(md,'all','');
+Index: ../trunk-jpl/test/NightlyRun/test1207.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1207.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1207.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: EISMINTRoundIceSheetStaticFS
+ %The aim of this program is to compare a model with an analytical solution given in SSA EISMINT : Lessons in Ice-Sheet Modeling.
+ printingflag=false;
+ 
+Index: ../trunk-jpl/test/NightlyRun/test1109.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1109.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1109.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ISMIPE
+ %This test is a test from the ISMP-HOM Intercomparison project.
+ %TestE 
+ %Four tests to run: - Pattyn frozen
+Index: ../trunk-jpl/test/NightlyRun/test102.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test102.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test102.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedStressSSA3d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test411.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test411.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test411.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfSteaHO
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test304.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test304.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test304.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedStressSSA3d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test223.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test223.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test223.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressSSA2dTransientIncrNonHydro
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test211.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test211.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test211.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranFS
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test116.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test116.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test116.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedBalThic2d
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test113.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test113.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test113.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedSurfSlope3d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test801.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test801.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test801.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: ValleyGlacierLevelsetSSA2d
+ from model import *
+ from triangle import *
+ from squaremesh import *
+Index: ../trunk-jpl/test/NightlyRun/test613.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test613.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test613.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: 79NorthCMBalThicVxVy
+ import numpy
+ import copy
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test425.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test425.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test425.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfGroundingLine2dSoft
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test506.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test506.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test506.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: PigTranHO
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test237.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test237.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test237.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTranIspddIsdeltaSSA3d
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test318.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test318.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test318.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedSteaSIA3d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test530.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test530.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test530.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: PigBalVel1
+ md=triangle(model(),'../Exp/Pig.exp',20000.);
+ md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
+ md=parameterize(md,'../Par/Pig.par');
+Index: ../trunk-jpl/test/NightlyRun/test611.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test611.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test611.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: 79NorthCMBalThic2dCG
+ md=triangle(model(),'../Exp/79North.exp',10000.);
+ md=setmask(md,'../Exp/79NorthShelf.exp','');
+ md=parameterize(md,'../Par/79North.par');
+Index: ../trunk-jpl/test/NightlyRun/test270.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test270.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test270.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressSSA2dDamage
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md.materials=matdamageice();
+Index: ../trunk-jpl/test/NightlyRun/test432.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test432.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test432.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfSteaEnthalpyHO
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test513.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test513.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test513.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: PigCMDragSteaSSA3d
+ md=triangle(model(),'../Exp/Pig.exp',30000.);
+ md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
+ md=parameterize(md,'../Par/Pig.par');
+Index: ../trunk-jpl/test/NightlyRun/test334.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test334.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test334.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedExtrudedHydrologyDC
+ md=triangle(model(),'../Exp/Square.exp',100000.);
+ md=setmask(md,'','');
+ md.transient=deactivateall(md.transient);
+Index: ../trunk-jpl/test/NightlyRun/test415.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test415.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test415.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfCMDragSteaSSA3d
+ md=triangle(model(),'../Exp/Square.exp',170000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test236.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test236.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test236.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranIspddIsdeltaSSA2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test317.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test317.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test317.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedTranHO
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test219.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test219.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test219.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressSSAHOTiling
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test3020.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3020.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3020.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedTranAdolcReverseVsForward
+ import numpy
+ import copy
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test3101.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3101.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3101.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedStressSSA2dAdolcMumps
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test1110.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1110.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1110.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ISMIPF
+ %This test is a test from the ISMP-HOM Intercomparison project.
+ %TestF 
+ printingflag=false;
+Index: ../trunk-jpl/test/NightlyRun/test1105.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1105.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1105.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: ISMIPCHO
+ import numpy
+ import shutil
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test2001.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test2001.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test2001.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedGia2d
+ %GIA test, inspired on test101
+ md=triangle(model(),'../Exp/Square.exp',100000.);
+ md=setmask(md,'','');
+Index: ../trunk-jpl/test/NightlyRun/test1602.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1602.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1602.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfHORotation
+ import numpy
+ import sys
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test3008.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3008.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3008.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedTherSteaAdolc
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test3015.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3015.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3015.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedMasstransp2dAdolcForwardDifference
+ %This test runs test3005 with autodiff on, and checks that 
+ %the value of the scalar forward difference match a step-wise differential
+ 
+Index: ../trunk-jpl/test/NightlyRun/test111.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test111.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test111.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedTranHO
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/IdToName.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/IdToName.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/IdToName.m	(revision 19049)
+@@ -4,267 +4,17 @@
+ %   Usage:
+ %      name=IdToName(id);
+ 
+-switch id,
+-	case 101, name='SquareShelfConstrainedStressSSA2d';
+-	case 102, name='SquareShelfConstrainedStressSSA3d';
+-	case 103, name='SquareShelfConstrainedStressHO';
+-	case 104, name='SquareShelfConstrainedStressFS';
+-	case 105, name='SquareShelfConstrainedMasstransp2d';
+-	case 106, name='SquareShelfConstrainedMasstransp2dDG';
+-	case 107, name='SquareShelfConstrainedMasstransp3d';
+-	case 108, name='SquareShelfConstrainedTherStea';
+-	case 109, name='SquareShelfConstrainedTherTran';
+-	case 110, name='SquareShelfConstrainedTranSSA2d';
+-	case 111, name='SquareShelfConstrainedTranHO';
+-	case 112, name='SquareShelfConstrainedSurfSlop2d';
+-	case 113, name='SquareShelfConstrainedSurfSlope3d';
+-	case 114, name='SquareShelfConstrainedBedSlop2d';
+-	case 115, name='SquareShelfConstrainedBedSlop3d';
+-	case 116, name='SquareShelfConstrainedBalThic2d';
+-	case 117, name='SquareShelfConstrainedBalThic3d';
+-	case 118, name='SquareShelfConstrainedBalThic2dDG';
+-	case 119, name='SquareBamgMesh';
+-	case 120, name='SquareShelfConstrainedEnthalpyStea';
+-	case 121, name='SquareShelfConstrainedEnthalpyTran';
+-	case 122, name='SquareShelfConstrainedTransHOEnth';
+-	case 123, name='SquareShelfConstrainedTranMisfitSurface';
+-	case 124, name='SquareShelfConstrainedTranFSFreeSurface';
+-	case 201, name='SquareShelfStressSSA2d';
+-	case 202, name='SquareShelfStressSSA3d';
+-	case 203, name='SquareShelfStressHO';
+-	case 204, name='SquareShelfStressFS';
+-	case 205, name='SquareShelfStressMHOPenalties';
+-	case 206, name='SquareShelfTherStea';
+-	case 207, name='SquareShelfTherTran';
+-	case 208, name='SquareShelfTranSSA2d';
+-	case 209, name='SquareShelfTranSSA3d';
+-	case 210, name='SquareShelfTranHO';
+-	case 211, name='SquareShelfTranFS';
+-	case 212, name='SquareShelfCMBSSA2d';
+-	case 213, name='SquareShelfCMBSSA3d';
+-	case 214, name='SquareShelfCMBHO';
+-	case 215, name='SquareShelfCMBFS';
+-	case 216, name='SquareShelfStressSSA2dRift';
+-	case 217, name='SquareShelfConstrained';
+-	case 218, name='SquareShelfConstrainedDakotaB';
+-	case 219, name='SquareShelfStressSSAHOTiling';
+-	case 220, name='SquareShelfStressHOFS3dTiling';
+-	case 221, name='SquareShelfStressSSAFS3dTiling';
+-	case 222, name='SquareShelfStressSSA2dTransientIncrHydro';
+-	case 223, name='SquareShelfStressSSA2dTransientIncrNonHydro';
+-	case 224, name='SquareShelfStressHOTransientIncrHydro';
+-	case 225, name='SquareShelfStressHOTransientIncrNonHydro';
+-	case 226, name='SquareShelfTranCflSSA2d';
+-	case 227, name='SquareShelfTranCflHO';
+-	case 228, name='SquareShelfTranForceNeg2d';
+-	case 229, name='SquareShelfTranForcePos2d';
+-	case 230, name='SquareShelfTranForceNeg3d';
+-	case 231, name='SquareShelfTranForcePos3d';
+-	case 232, name='SquareShelfTherTranForcTemp';
+-	case 233, name='SquareShelfTranHOForcTemp';
+-	case 234, name='SquareShelfTranForceNeg2dDakotaSamp';
+-	case 235, name='SquareShelfTranForceNeg2dDakotaLocal';
+-	case 236, name='SquareShelfTranIspddIsdeltaSSA2d';
+-	case 237, name='SquareShelfTranIspddIsdeltaSSA3d';
+-	case 238, name='SquareShelfTranForceNoInterp2d';
+-	case 239, name='SquareShelfTranForceNoInterp3d';
+-	case 270, name='SquareShelfStressSSA2dDamage';
+-	case 271, name='SquareShelfStressSSA2dDamageTran';
+-	case 272, name='SquareShelfCMZSSA2dDamage';
+-	case 274, name='SquareShelfStressSSA2dDamageRift';
+-	case 275, name='SquareShelfDamageEvolutionSSA2d';
+-	case 276, name='SquareShelfDamageEvolutionSSA2dP2';
+-	case 280, name='SquareShelfStressSSA2dHigherOrder';
+-	case 285, name='SquareShelfStressHOHigherOrder';
+-	case 290, name='SquareShelfStressFSP2P1';
+-	case 291, name='SquareShelfStressFSP4z';
+-	case 292, name='SquareShelfTranSSA2dFloatingMeltParam';
+-	case 301, name='SquareSheetConstrainedStressSSA2d';
+-	case 302, name='SquareSheetConstrainedStressSIA2d';
+-	case 303, name='SquareSheetConstrainedStressSIASSA2d';
+-	case 304, name='SquareSheetConstrainedStressSSA3d';
+-	case 305, name='SquareSheetConstrainedStressSIA3d';
+-	case 306, name='SquareSheetConstrainedStressSIASSA3d';
+-	case 307, name='SquareSheetConstrainedStressHO';
+-	case 308, name='SquareSheetConstrainedStressFS';
+-	case 309, name='SquareSheetConstrainedMasstransp2d';
+-	case 320, name='SquareSheetConstrainedMasstransp2dDG';
+-	case 311, name='SquareSheetConstrainedMasstransp3d';
+-	case 312, name='SquareSheetConstrainedTherStea';
+-	case 313, name='SquareSheetConstrainedTherTran';
+-	case 314, name='SquareSheetConstrainedTranSIA2d';
+-	case 315, name='SquareSheetConstrainedTranSIA3d';
+-	case 316, name='SquareSheetConstrainedTranSSA2d';
+-	case 317, name='SquareSheetConstrainedTranHO';
+-	case 318, name='SquareSheetConstrainedSteaSIA3d';
+-	case 319, name='SquareSheetConstrainedCMDragSSA2d';
+-	case 320, name='SquareSheetConstrainedCMDragSSA3d';
+-	case 321, name='SquareSheetConstrainedCMDragHO';
+-	case 322, name='SquareSheetConstrainedCMDragFS';
+-	case 323, name='SquareSheetConstrainedTranCflSSA2d';
+-	case 324, name='SquareSheetConstrainedTranCflSIA3d';
+-	case 325, name='SquareSheetConstrainedEnthalpyStea';
+-	case 326, name='SquareSheetConstrainedEnthalpyTran';
+-	case 327, name='SquareSheetConstrainedTransHOEnth';
+-	case 328, name='SquareSheetConstrainedSmbGradients2d';
+-	case 329, name='SquareSheetConstrainedSmbGradients3d';
+-	case 332, name='SquareSheetConstrainedHydrologyDC';
+-	case 333, name='SquareSheetHydrologyDCTwoLayers';
+-	case 334, name='SquareSheetConstrainedExtrudedHydrologyDC';
+-	case 335, name='SquareSheetExtrudedHydrologyDCTwoLayers';
+-	case 336, name='SquareSheetConstrainedSmbComponents2d';
+-	case 337, name='SquareSheetConstrainedSmbComponents3d';
+-	case 338, name='SquareSheetConstrainedSmbMeltComponents2d';
+-	case 339, name='SquareSheetConstrainedSmbMeltComponents3d';
+-	case 340, name='SquareSheetConstrainedCMtaoDragHO';
+-	case 341, name='SquareSheetConstrainedCMm1qn3DragHO';
+-	case 401, name='SquareSheetShelfStressSSA2d';
+-	case 402, name='SquareSheetShelfStressSSA3d';
+-	case 403, name='SquareSheetShelfStressHO';
+-	case 404, name='SquareSheetShelfStressFS';
+-	case 405, name='SquareSheetShelfStressMHOPenalties';
+-	case 406, name='SquareSheetShelfTherStea';
+-	case 407, name='SquareSheetShelfTherTran';
+-	case 408, name='SquareSheetShelfTranSSA2d';
+-	case 409, name='SquareSheetShelfTranMHOPenalties';
+-	case 410, name='SquareSheetShelfSteaSSA3d';
+-	case 411, name='SquareSheetShelfSteaHO';
+-	case 412, name='SquareSheetShelfDiadSSA3dDakota';
+-	case 413, name='SquareSheetShelfDiadSSA3dDakotaPart';
+-	case 414, name='SquareSheetShelfDiadSSA3dDakotaMassFlux';
+-	case 415, name='SquareSheetShelfCMDragSteaSSA3d';
+-	case 416, name='SquareSheetShelfCMDragSteaHO';
+-	case 417, name='SquareSheetShelfDiadSSA3dDakotaSamp';
+-	case 418, name='SquareSheetShelfDiadSSA3dDakotaAreaAverage';
+-	case 419, name='SquareSheetShelfStressSSAHOTiling';
+-	case 420, name='SquareSheetShelfDakotaScaledResponse';
+-	case 421, name='SquareSheetShelfStressHOFS3dTiling';
+-	case 422, name='SquareSheetShelfStressSSAFS3dTiling';
+-	case 423, name='RoundSheetShelfGLMigrationSSA2d';
+-	case 424, name='SquareSheetShelfGroundingLine2dAggressive';
+-	case 425, name='SquareSheetShelfGroundingLine2dSoft';
+-	case 426, name='SquareSheetShelfGroundingLine3dAggressive';
+-	case 427, name='SquareSheetShelfGroundingLine3dSoft';
+-	case 428, name='SquareSheetShelfStressSSA2dNewton';
+-	case 429, name='SquareSheetShelfStressHONewton';
+-	case 431, name='SquareSheetShelfSteaEnthalpySSA3d';
+-	case 432, name='SquareSheetShelfSteaEnthalpyHO';
+-	case 433, name='RoundSheetShelfGLMigrationSSA3d';
+-	case 434, name='SquareSheetShelfL1L2';
+-	case 435, name='MISMIP3DHO';
+-	case 436, name='SquareSheetShelfSteaEnthalpyLliboutryDuvalHO';
+-	case 437, name='ThermalEnthBasalcondsTrans';
+-	case 450, name='SquareSheetShelfStressSSAHigherOrder';
+-	case 455, name='SquareSheetShelfStressHOHigherOrder';
+-	case 501, name='PigStressSSA2d';
+-	case 502, name='PigStressHO';
+-	case 503, name='PigStressFS';
+-	case 504, name='PigTranSSA2d';
+-	case 505, name='PigTranSSA3d';
+-	case 506, name='PigTranHO';
+-	case 507, name='PigTranFS';
+-	case 508, name='PigSteaSSA3d';
+-	case 509, name='PigSteaHO';
+-	case 510, name='PigSteaFS';
+-	case 530, name='PigBalVel1';
+-	case 531, name='PigBalVel2';
+-	case 511, name='PigCMBFS';
+-	case 512, name='PigCMDragHO';
+-	case 513, name='PigCMDragSteaSSA3d';
+-	case 514, name='PigBamgMesh';
+-	case 515, name='PigTherTranSUPG';
+-	case 516, name='PigTherSteaSUPG';
+-	case 601, name='79NorthMasstransp2d';
+-	case 602, name='79NorthMasstransp2dDG';
+-	case 603, name='79NorthMasstransp3d';
+-	case 604, name='79NorthSurfSlop2d';
+-	case 605, name='79NorthSurfSlop3d';
+-	case 606, name='79NorthBedSlop2d';
+-	case 607, name='79NorthBedSlop3d';
+-	case 608, name='79NorthBalThic2d';
+-	case 609, name='79NorthBalThic2dDG';
+-	case 610, name='79NorthBalThic3d';
+-	case 611, name='79NorthCMBalThic2dCG';
+-	case 613, name='79NorthCMBalThicVxVy';
+-	case 701, name='FlowbandFSshelf';
+-	case 702, name='FlowbandFSsheetshelf';
+-	case 703, name='FlowbandFSsheetshelfTrans';
+-	case 801, name='ValleyGlacierLevelsetSSA2d';
+-	case 802, name='ValleyGlacierLevelsetThermalSSA3d';
+-	case 803, name='ValleyGlacierLevelsetEnthalpyHO3d';
+-	case 804, name='ValleyGlacierLevelsetCalvingSIA2d';
+-	case 805, name='ValleyGlacierLevelsetEnthCalvingHO3d';
+-	case 806, name='SquareShelfLevelsetCalvingSSA2dLevermann';
+-	case 807, name='SquareShelfLevelsetMeltingSSA2d';
+-	case 1101, name='ISMIPAHO';
+-	case 1102, name='ISMIPAFS';
+-	case 1103, name='ISMIPBHO';
+-	case 1104, name='ISMIPBFS';
+-	case 1105, name='ISMIPCHO';
+-	case 1106, name='ISMIPCFS';
+-	case 1107, name='ISMIPDHO';
+-	case 1108, name='ISMIPDFS';
+-	case 1109, name='ISMIPE';
+-	case 1110, name='ISMIPF';
+-	case 1201, name='EISMINTMassConservation';
+-	case 1202, name='EISMINTStress1';
+-	case 1203, name='EISMINTStress2';
+-	case 1204, name='EISMINTTran2';
+-	case 1205, name='EISMINTRoundIceSheetStaticSIA';
+-	case 1206, name='EISMINTRoundIceSheetStaticHO';
+-	case 1207, name='EISMINTRoundIceSheetStaticFS';
+-	case 1208, name='EISMINTA';
+-	case 1301, name='ThermalMelting';
+-	case 1302, name='ThermalAdvection';
+-	case 1303, name='ThermalConduction';
+-	case 1304, name='ThermalGeothermalFlux';
+-	case 1401, name='AdaptiveMeshRefinement1';
+-	case 1402, name='AdaptiveMeshRefinement2';
+-	case 1501, name='SquareShelfTranSawTooth2d';
+-	case 1502, name='SquareShelfTranSawTooth3d';
+-	case 1601, name='SquareShelfSSA2dRotation';
+-	case 1602, name='SquareSheetShelfHORotation';
+-	case 2001, name='SquareSheetConstrainedGia2d';
+-	case 2051, name='GiaBenchmarksAB2dA1';
+-	case 2052, name='GiaBenchmarksAB2dA2';
+-	case 2053, name='GiaBenchmarksAB2dA3';
+-	case 2061, name='GiaBenchmarksAB2dB1';
+-	case 2062, name='GiaBenchmarksAB2dB2';
+-	case 2063, name='GiaBenchmarksAB2dB3';
+-	case 2071, name='GiaBenchmarksAB2dC1';
+-	case 2072, name='GiaBenchmarksAB2dC2';
+-	case 2073, name='GiaBenchmarksAB2dC3';
+-	case 2081, name='GiaBenchmarksAB2dD1';
+-	case 2082, name='GiaBenchmarksAB2dD2';
+-	case 2083, name='GiaBenchmarksAB2dD3';
+-	case 3001, name='SquareShelfConstrainedStressSSA2dAdolc';
+-	case 3002, name='SquareShelfConstrainedStressSSA3dAdolc';
+-	case 3003, name='SquareShelfConstrainedStressHOAdolc';
+-	case 3004, name='SquareShelfConstrainedStressFSAdolc';
+-	case 3005, name='SquareShelfConstrainedMasstransp2dAdolc';
+-	case 3006, name='SquareShelfConstrainedMasstransp2dDGAdolc';
+-	case 3007, name='SquareShelfConstrainedMasstransp3dAdolc';
+-	case 3008, name='SquareShelfConstrainedTherSteaAdolc';
+-	case 3009, name='SquareShelfConstrainedTherTranAdolc';
+-	case 3010, name='SquareShelfConstrainedTranSSA2dAdolc';
+-	case 3015, name='SquareShelfConstrainedMasstransp2dAdolcForwardDifference';
+-	case 3019, name='SquareShelfConstrainedTherTranAdolcReverseVsForward';
+-	case 3020, name='SquareShelfConstrainedTranAdolcReverseVsForward';
+-	case 3101, name='SquareShelfConstrainedStressSSA2dAdolcMumps';
+-	case 3102, name='SquareShelfConstrainedStressSSA3dAdolcMumps';
+-	case 3103, name='SquareShelfConstrainedStressHOAdolcMumps';
+-	case 3104, name='SquareShelfConstrainedStressFSAdolcMumps';
+-	case 3105, name='SquareShelfConstrainedMasstransp2dAdolcMumps';
+-	case 3106, name='SquareShelfConstrainedMasstransp2dDGAdolcMumps';
+-	case 3107, name='SquareShelfConstrainedMasstransp3dAdolcMumps';
+-	case 3108, name='SquareShelfConstrainedTherSteaAdolcMumps';
+-	case 3109, name='SquareShelfConstrainedTherTranAdolcMumps';
+-	case 3110, name='SquareShelfConstrainedTranSSA2dAdolcMumps';
+-	case 3115, name='SquareShelfConstrainedMasstransp2dAdolcForwardDifferenceMumps';
+-	case 3019, name='SquareShelfConstrainedTherTranAdolcReverseVsForward';
+-	case 3120, name='SquareShelfConstrainedTranAdolcReverseVsForwardMumps';
+-	case 4001, name='IceOcean';
++filename = ['test' num2str(id) '.m'];
+ 
++if ~exist(filename,'file')
++	error(['file ' filename ' does not exist']);
++end
+ 
+-	otherwise, name='N/A';
++string='%TestName:';
++fid=fopen(filename,'r');
++A=fscanf(fid,'%s',3);
++if ~strncmp(A,string,numel(string)) | numel(A)<numel(string)+2,
++	error(['Test file ' filename ' does to start with a test name']);
+ end
++name = A(numel(string)+1:end);
++fclose(fid);
+Index: ../trunk-jpl/test/NightlyRun/test501.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test501.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test501.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: PigStressSSA2d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test232.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test232.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test232.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTherTranForcTemp
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test313.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test313.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test313.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedTherTran
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test301.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test301.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test301.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedStressSSA2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test220.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test220.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test220.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressHOFS3dTiling
+ md=triangle(model(),'../Exp/Square.exp',120000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf2.par');
+Index: ../trunk-jpl/test/NightlyRun/test206.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test206.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test206.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTherStea
+ from MatlabFuncs import *
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test122.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test122.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test122.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedTransHOEnth
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test203.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test203.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test203.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressHO
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test105.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test105.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test105.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedMasstransp2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test272.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test272.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test272.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfCMZSSA2dDamage
+ import numpy
+ from model import model
+ from triangle import triangle
+Index: ../trunk-jpl/test/NightlyRun/test434.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test434.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test434.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfL1L2
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test515.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test515.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test515.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: PigTherTranSUPG
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test327.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test327.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test327.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedTransHOEnth
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test408.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test408.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test408.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfTranSSA2d
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test701.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test701.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test701.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: FlowbandFSshelf
+ x =[1:100:3000]';
+ h=linspace(1000,300,numel(x))';
+ b=-917/1023*h;
+Index: ../trunk-jpl/test/NightlyRun/test603.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test603.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test603.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: 79NorthMasstransp3d
+ md=triangle(model(),'../Exp/79North.exp',10000.);
+ md=setmask(md,'../Exp/79NorthShelf.exp','');
+ md=parameterize(md,'../Par/79North.par');
+Index: ../trunk-jpl/test/NightlyRun/test424.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test424.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test424.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfGroundingLine2dAggressive
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test505.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test505.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test505.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: PigTranSSA3d
+ md=triangle(model(),'../Exp/Pig.exp',30000.);
+ md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
+ md=parameterize(md,'../Par/Pig.par');
+Index: ../trunk-jpl/test/NightlyRun/test326.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test326.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test326.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedEnthalpyTran
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test407.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test407.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test407.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfTherTran
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test228.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test228.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test228.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranForceNeg2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test309.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test309.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test309.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedMasstransp2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test807.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test807.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test807.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfLevelsetMeltingSSA2d
+ md=triangle(model(),'../Exp/Square.exp',50000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test3110.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3110.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3110.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedTranSSA2dAdolcMumps
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test3003.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3003.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3003.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedStressHOAdolc
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test1302.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1302.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1302.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: ThermalAdvection
+ import numpy
+ import sys
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test1102.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1102.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1102.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ISMIPAFS
+ %This test is a test from the ISMP-HOM Intercomparison project.
+ %Pattyn and Payne 2006
+ printingflag=false;
+Index: ../trunk-jpl/test/NightlyRun/test1502.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1502.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1502.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranSawTooth3d
+ printingflag = false;
+ 
+ md=triangle(model(),'../Exp/Square.exp',350000.);
+Index: ../trunk-jpl/test/NightlyRun/test2052.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test2052.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test2052.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: GiaBenchmarksAB2dA2
+ % Benchmark experiments (Figure A2a Ivins and James, 1999, Geophys. J. Int.) 
+ md=triangle(model(),'../Exp/RoundFrontEISMINT.exp',200000.);
+ md=setmask(md,'','');
+Index: ../trunk-jpl/test/NightlyRun/test3105.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3105.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3105.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedMasstransp2dAdolcMumps
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test3007.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3007.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3007.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedMasstransp3dAdolc
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test1208.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1208.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1208.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: EISMINTA
+ %EISMINT benchmark experiment A
+ numlayers=8;
+ resolution=50000.;
+Index: ../trunk-jpl/test/NightlyRun/test120.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test120.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test120.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedEnthalpyStea
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test201.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test201.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test201.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressSSA2d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test510.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test510.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test510.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: PigSteaFS
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test322.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test322.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test322.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedCMDragFS
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test403.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test403.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test403.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfStressHO
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test215.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test215.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test215.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfCMBFS
+ from MatlabFuncs import *
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test212.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test212.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test212.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfCMBSSA2d
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test108.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test108.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test108.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedTherStea
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test114.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test114.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test114.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedBedSlop2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test605.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test605.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test605.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: 79NorthSurfSlop3d
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test336.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test336.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test336.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedSmbComponents2d
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test229.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test229.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test229.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTranForcePos2d
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test450.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test450.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test450.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfStressSSAHigherOrder
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test531.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test531.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test531.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: PigBalVel2
+ md=triangle(model(),'../Exp/Pig.exp',20000.);
+ md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
+ md=parameterize(md,'../Par/Pig.par');
+Index: ../trunk-jpl/test/NightlyRun/test271.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test271.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test271.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressSSA2dDamageTran
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md.materials=matdamageice();
+Index: ../trunk-jpl/test/NightlyRun/test433.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test433.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test433.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: RoundSheetShelfGLMigrationSSA3d
+ radius=1.e6;
+ shelfextent=2.e5;
+ 
+Index: ../trunk-jpl/test/NightlyRun/test514.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test514.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test514.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: PigBamgMesh
+ %Simple mesh 1
+ hVertices=10000.*ones(27,1);
+ hVertices(1:5)=1000.;
+Index: ../trunk-jpl/test/NightlyRun/test335.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test335.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test335.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetExtrudedHydrologyDCTwoLayers
+ md=triangle(model(),'../Exp/Square.exp',100000.);
+ md=setmask(md,'','');
+ md.transient=deactivateall(md.transient);
+Index: ../trunk-jpl/test/NightlyRun/test416.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test416.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test416.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfCMDragSteaHO
+ md=triangle(model(),'../Exp/Square.exp',170000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test807.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test807.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test807.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfLevelsetMeltingSSA2d
+ from model import *
+ from triangle import *
+ from squaremesh import *
+Index: ../trunk-jpl/test/NightlyRun/test237.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test237.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test237.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranIspddIsdeltaSSA3d
+ md=triangle(model(),'../Exp/Square.exp',600000.);%180000
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test318.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test318.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test318.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedSteaSIA3d
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test1204.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1204.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1204.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: EISMINTTran2
+ import numpy
+ import sys
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test3107.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3107.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3107.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedMasstransp3dAdolcMumps
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test210.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test210.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test210.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTranHO
+ from MatlabFuncs import *
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test103.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test103.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test103.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedStressHO
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test305.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test305.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test305.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedStressSIA3d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test224.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test224.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test224.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressHOTransientIncrHydro
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test302.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test302.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test302.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedStressSIA2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test221.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test221.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test221.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressSSAFS3dTiling
+ md=triangle(model(),'../Exp/Square.exp',120000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf2.par');
+Index: ../trunk-jpl/test/NightlyRun/test123.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test123.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test123.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedTranMisfitSurface
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test204.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test204.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test204.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressFS
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test802.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test802.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test802.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: ValleyGlacierLevelsetThermalSSA3d
+ from model import *
+ from triangle import *
+ from squaremesh import *
+Index: ../trunk-jpl/test/NightlyRun/test290.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test290.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test290.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfStressFSP2P1
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test106.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test106.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test106.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedMasstransp2dDG
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=meshconvert(md);
+ md=setmask(md,'all','');
+Index: ../trunk-jpl/test/NightlyRun/test426.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test426.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test426.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfGroundingLine3dAggressive
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test507.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test507.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test507.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: PigTranFS
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test238.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test238.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test238.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTranForceNoInterp2d
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test319.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test319.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test319.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedCMDragSSA2d
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test702.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test702.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test702.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: FlowbandFSsheetshelf
+ %mesh parameters
+ x =[-5:.5:5]';
+ [b h sea]=NowickiProfile(x);
+Index: ../trunk-jpl/test/NightlyRun/test280.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test280.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test280.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfStressSSA2dHigherOrder
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test604.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test604.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test604.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: 79NorthSurfSlop2d
+ md=triangle(model(),'../Exp/79North.exp',10000.);
+ md=setmask(md,'../Exp/79NorthShelf.exp','');
+ md=parameterize(md,'../Par/79North.par');
+Index: ../trunk-jpl/test/NightlyRun/test425.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test425.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test425.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfGroundingLine2dSoft
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test506.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test506.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test506.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: PigTranHO
+ md=triangle(model(),'../Exp/Pig.exp',30000.);
+ md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
+ md=parameterize(md,'../Par/Pig.par');
+Index: ../trunk-jpl/test/NightlyRun/test327.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test327.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test327.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedTransHOEnth
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test408.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test408.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test408.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfTranSSA2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test229.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test229.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test229.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranForcePos2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test3102.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3102.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3102.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedStressSSA3dAdolcMumps
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test1106.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1106.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1106.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: ISMIPCFS
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test1201.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1201.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1201.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: EISMINTMassConservation
+ %This test is a test from the EISMINT for Ice shelves Vincent Rommelaere 1996.
+ printingflag=false;
+ 
+Index: ../trunk-jpl/test/NightlyRun/test1103.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1103.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1103.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: ISMIPBHO
+ %This test is a test from the ISMP-HOM Intercomparison project.
+ %Pattyn and Payne 2006
+ printingflag=false;
+Index: ../trunk-jpl/test/NightlyRun/test3009.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3009.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3009.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedTherTranAdolc
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test1601.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1601.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1601.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfSSA2dRotation
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test2053.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test2053.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test2053.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: GiaBenchmarksAB2dA3
+ % Benchmark experiments (Figure A2a Ivins and James, 1999, Geophys. J. Int.) 
+ md=triangle(model(),'../Exp/RoundFrontEISMINT.exp',200000.);
+ md=setmask(md,'','');
+Index: ../trunk-jpl/test/NightlyRun/test3106.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3106.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3106.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedMasstransp2dDGAdolcMumps
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=meshconvert(md);
+ md=setmask(md,'all','');
+Index: ../trunk-jpl/test/NightlyRun/test3008.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3008.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3008.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedTherSteaAdolc
+ md=triangle(model(),'../Exp/Square.exp',180000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/IdToName.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/IdToName.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/IdToName.py	(revision 19049)
+@@ -8,250 +8,10 @@
+ 	       name=IdToName(id)
+ 	"""
+ 
+-	idname={
+-	101 : 'SquareShelfConstrainedStressSSA2d',
+-	102 : 'SquareShelfConstrainedStressSSA3d',
+-	103 : 'SquareShelfConstrainedStressHO',
+-	104 : 'SquareShelfConstrainedStressFS',
+-	105 : 'SquareShelfConstrainedMasstransp2d',
+-	106 : 'SquareShelfConstrainedMasstransp2dDG',
+-	107 : 'SquareShelfConstrainedMasstransp3d',
+-	108 : 'SquareShelfConstrainedTherStea',
+-	109 : 'SquareShelfConstrainedTherTran',
+-	110 : 'SquareShelfConstrainedTranSSA2d',
+-	111 : 'SquareShelfConstrainedTranHO',
+-	112 : 'SquareShelfConstrainedSurfSlop2d',
+-	113 : 'SquareShelfConstrainedSurfSlope3d',
+-	114 : 'SquareShelfConstrainedBedSlop2d',
+-	115 : 'SquareShelfConstrainedBedSlop3d',
+-	116 : 'SquareShelfConstrainedBalThic2d',
+-	117 : 'SquareShelfConstrainedBalThic3d',
+-	118 : 'SquareShelfConstrainedBalThic2dDG',
+-	119 : 'SquareBamgMesh',
+-	120 : 'SquareShelfConstrainedEnthalpyStea',
+-	121 : 'SquareShelfConstrainedEnthalpyTran',
+-	122 : 'SquareShelfConstrainedTransHOEnth',
+-	201 : 'SquareShelfStressSSA2d',
+-	202 : 'SquareShelfStressSSA3d',
+-	203 : 'SquareShelfStressHO',
+-	204 : 'SquareShelfStressFS',
+-	205 : 'SquareShelfStressMHOPenalties',
+-	206 : 'SquareShelfTherStea',
+-	207 : 'SquareShelfTherTran',
+-	208 : 'SquareShelfTranSSA2d',
+-	209 : 'SquareShelfTranSSA3d',
+-	210 : 'SquareShelfTranHO',
+-	211 : 'SquareShelfTranFS',
+-	212 : 'SquareShelfCMBSSA2d',
+-	213 : 'SquareShelfCMBSSA3d',
+-	214 : 'SquareShelfCMBHO',
+-	215 : 'SquareShelfCMBFS',
+-	216 : 'SquareShelfStressSSA2dRift',
+-	217 : 'SquareShelfConstrained',
+-	218 : 'SquareShelfConstrainedDakotaB',
+-	219 : 'SquareShelfStressSSAHOTiling',
+-	220 : 'SquareShelfStressHOFS3dTiling',
+-	221 : 'SquareShelfStressSSAFS3dTiling',
+-	222 : 'SquareShelfStressSSA2dTransientIncrHydro',
+-	223 : 'SquareShelfStressSSA2dTransientIncrNonHydro',
+-	224 : 'SquareShelfStressHOTransientIncrHydro',
+-	225 : 'SquareShelfStressHOTransientIncrNonHydro',
+-	226 : 'SquareShelfTranCflSSA2d',
+-	227 : 'SquareShelfTranCflHO',
+-	228 : 'SquareShelfTranForceNeg2d',
+-	229  : 'SquareShelfTranForcePos2d',
+-	230  : 'SquareShelfTranForceNeg3d',
+-	231  : 'SquareShelfTranForcePos3d',
+-	232  : 'SquareShelfTherTranForcTemp',
+-	233  : 'SquareShelfTranHOForcTemp',
+-	234  : 'SquareShelfTranForceNeg2dDakotaSamp',
+-	235  : 'SquareShelfTranForceNeg2dDakotaLocal',
+-	236  : 'SquareShelfTranIspddIsdeltaSSA2d',
+-	237  : 'SquareShelfTranIspddIsdeltaSSA3d',
+-	270  : 'SquareShelfStressSSA2dDamage',
+-	272  : 'SquareShelfCMZSSA2dDamage',
+-	274  : 'SquareShelfStressSSA2dDamageRift',
+-	275  : 'SquareShelfDamageEvolutionSSA2d',
+-	276  : 'SquareShelfDamageEvolutionSSA2dP2',
+-	280  : 'SquareShelfStressSSA2dHigherOrder',
+-	285  : 'SquareShelfStressHOHigherOrder',
+-	290  : 'SquareShelfStressFSP2P1',
+-	291  : 'SquareShelfStressFSP4z',
+-	292  : 'SquareShelfTranSSA2dFloatingMeltParam',
+-	301  : 'SquareSheetConstrainedStressSSA2d',
+-	302  : 'SquareSheetConstrainedStressSIA2d',
+-	303  : 'SquareSheetConstrainedStressSIASSA2d',
+-	304  : 'SquareSheetConstrainedStressSSA3d',
+-	305  : 'SquareSheetConstrainedStressSIA3d',
+-	306  : 'SquareSheetConstrainedStressSIASSA3d',
+-	307  : 'SquareSheetConstrainedStressHO',
+-	308  : 'SquareSheetConstrainedStressFS',
+-	309  : 'SquareSheetConstrainedMasstransp2d',
+-	320  : 'SquareSheetConstrainedMasstransp2dDG',
+-	311  : 'SquareSheetConstrainedMasstransp3d',
+-	312  : 'SquareSheetConstrainedTherStea',
+-	313  : 'SquareSheetConstrainedTherTran',
+-	314  : 'SquareSheetConstrainedTranSIA2d',
+-	315  : 'SquareSheetConstrainedTranSIA3d',
+-	316  : 'SquareSheetConstrainedTranSSA2d',
+-	317  : 'SquareSheetConstrainedTranHO',
+-	318  : 'SquareSheetConstrainedSteaSIA3d',
+-	319  : 'SquareSheetConstrainedCMDragSSA2d',
+-	320  : 'SquareSheetConstrainedCMDragSSA3d',
+-	321  : 'SquareSheetConstrainedCMDragHO',
+-	322  : 'SquareSheetConstrainedCMDragFS',
+-	323  : 'SquareSheetConstrainedTranCflSSA2d',
+-	324  : 'SquareSheetConstrainedTranCflSIA3d',
+-	325  : 'SquareSheetConstrainedEnthalpyStea',
+-	326  : 'SquareSheetConstrainedEnthalpyTran',
+-	327  : 'SquareSheetConstrainedTransHOEnth',
+-	328  : 'SquareSheetConstrainedSmbGradients2d',
+-	329  : 'SquareSheetConstrainedSmbGradients3d',
+-	332  : 'SquareSheetConstrainedHydrologyDC',
+-	333  : 'SquareSheetHydrologyDCTwoLayers',
+-	401  : 'SquareSheetShelfStressSSA2d',
+-	402  : 'SquareSheetShelfStressSSA3d',
+-	403  : 'SquareSheetShelfStressHO',
+-	404  : 'SquareSheetShelfStressFS',
+-	405  : 'SquareSheetShelfStressMHOPenalties',
+-	406  : 'SquareSheetShelfTherStea',
+-	407  : 'SquareSheetShelfTherTran',
+-	408  : 'SquareSheetShelfTranSSA2d',
+-	409  : 'SquareSheetShelfTranMHOPenalties',
+-	410  : 'SquareSheetShelfSteaSSA3d',
+-	411  : 'SquareSheetShelfSteaHO',
+-	412  : 'SquareSheetShelfDiadSSA3dDakota',
+-	413  : 'SquareSheetShelfDiadSSA3dDakotaPart',
+-	414  : 'SquareSheetShelfDiadSSA3dDakotaMassFlux',
+-	415  : 'SquareSheetShelfCMDragSteaSSA3d',
+-	416  : 'SquareSheetShelfCMDragSteaHO',
+-	417  : 'SquareSheetShelfDiadSSA3dDakotaSamp',
+-	418  : 'SquareSheetShelfDiadSSA3dDakotaAreaAverage',
+-	419  : 'SquareSheetShelfStressSSAHOTiling',
+-	420  : 'SquareSheetShelfDakotaScaledResponse',
+-	421  : 'SquareSheetShelfStressHOFS3dTiling',
+-	422  : 'SquareSheetShelfStressSSAFS3dTiling',
+-	423  : 'RoundSheetShelfGLMigrationSSA2d',
+-	424  : 'SquareSheetShelfGroundingLine2dAggressive',
+-	425  : 'SquareSheetShelfGroundingLine2dSoft',
+-	426  : 'SquareSheetShelfGroundingLine3dAggressive',
+-	427  : 'SquareSheetShelfGroundingLine3dSoft',
+-	428  : 'SquareSheetShelfStressSSA2dNewton',
+-	429  : 'SquareSheetShelfStressHONewton',
+-	431  : 'SquareSheetShelfSteaEnthalpySSA3d',
+-	432  : 'SquareSheetShelfSteaEnthalpyHO',
+-	433  : 'RoundSheetShelfGLMigrationSSA3d',
+-	434  : 'SquareSheetShelfL1L2',
+-	450  : 'SquareSheetShelfStressSSAHigherOrder',
+-	455  : 'SquareSheetShelfStressHOHigherOrder',
+-	501  : 'PigStressSSA2d',
+-	502  : 'PigStressHO',
+-	503  : 'PigStressFS',
+-	504  : 'PigTranSSA2d',
+-	505  : 'PigTranSSA3d',
+-	506  : 'PigTranHO',
+-	507  : 'PigTranFS',
+-	508  : 'PigSteaSSA3d',
+-	509  : 'PigSteaHO',
+-	510  : 'PigSteaFS',
+-	511  : 'PigCMBFS',
+-	512  : 'PigCMDragHO',
+-	513  : 'PigCMDragSteaSSA3d',
+-	514  : 'PigBamgMesh',
+-	515  : 'PigTherTranSUPG',
+-	516  : 'PigTherSteaSUPG',
+-	530  : 'PigBalVel1',
+-	531  : 'PigBalVel2',
+-	601  : '79NorthMasstransp2d',
+-	602  : '79NorthMasstransp2dDG',
+-	603  : '79NorthMasstransp3d',
+-	604  : '79NorthSurfSlop2d',
+-	605  : '79NorthSurfSlop3d',
+-	606  : '79NorthBedSlop2d',
+-	607  : '79NorthBedSlop3d',
+-	608  : '79NorthBalThic2d',
+-	609  : '79NorthBalThic2dDG',
+-	610  : '79NorthBalThic3d',
+-	611  : '79NorthCMBalThic2dCG',
+-	613  : '79NorthCMBalThicVxVy',
+-	801  : 'ValleyGlacierLevelsetSSA2d',	
+-	802  : 'ValleyGlacierLevelsetThermalSSA3d',	
+-	803  : 'ValleyGlacierLevelsetEnthalpyHO3d',	
+-	804  : 'ValleyGlacierLevelsetCalvingSIA2d',	
+-	805  : 'ValleyGlacierLevelsetEnthCalvingHO3d',	
+-	806  : 'SquareShelfLevelsetCalvingSSA2dLevermann',	
+-	807  : 'SquareShelfLevelsetMeltingSSA2d',
+-	1101 : 'ISMIPAHO',
+-	1102 : 'ISMIPAFS',
+-	1103 : 'ISMIPBHO',
+-	1104 : 'ISMIPBFS',
+-	1105 : 'ISMIPCHO',
+-	1106 : 'ISMIPCFS',
+-	1107 : 'ISMIPDHO',
+-	1108 : 'ISMIPDFS',
+-	1109 : 'ISMIPE',
+-	1110 : 'ISMIPF',
+-	1201 : 'EISMINTMassConservation',
+-	1202 : 'EISMINTStress1',
+-	1203 : 'EISMINTStress2',
+-	1204 : 'EISMINTTran2',
+-	1205 : 'EISMINTRoundIceSheetStaticSIA',
+-	1206 : 'EISMINTRoundIceSheetStaticHO',
+-	1207 : 'EISMINTRoundIceSheetStaticFS',
+-	1208 : 'EISMINTA',
+-	1301 : 'ThermalMelting',
+-	1302 : 'ThermalAdvection',
+-	1303 : 'ThermalConduction',
+-	1304 : 'ThermalGeothermalFlux',
+-	1401 : 'AdaptiveMeshRefinement1',
+-	1402 : 'AdaptiveMeshRefinement2',
+-	1501 : 'SquareShelfTranSawTooth2d',
+-	1502 : 'SquareShelfTranSawTooth3d',
+-	1601 : 'SquareShelfSSA2dRotation',
+-	1602 : 'SquareSheetShelfHORotation',
+-	2001 : 'SquareSheetConstrainedGia2d',
+-	2051 : 'GiaBenchmarksAB2dA1',
+-	2052 : 'GiaBenchmarksAB2dA2',
+-	2053 : 'GiaBenchmarksAB2dA3',
+-	2061 : 'GiaBenchmarksAB2dB1',
+-	2062 : 'GiaBenchmarksAB2dB2',
+-	2063 : 'GiaBenchmarksAB2dB3',
+-	2071 : 'GiaBenchmarksAB2dC1',
+-	2072 : 'GiaBenchmarksAB2dC2',
+-	2073 : 'GiaBenchmarksAB2dC3',
+-	2081 : 'GiaBenchmarksAB2dD1',
+-	2082 : 'GiaBenchmarksAB2dD2',
+-	2083 : 'GiaBenchmarksAB2dD3',
+-	3001 : 'SquareShelfConstrainedStressSSA2dAdolc',
+-	3002 : 'SquareShelfConstrainedStressSSA3dAdolc',
+-	3003 : 'SquareShelfConstrainedStressHOAdolc',
+-	3004 : 'SquareShelfConstrainedStressFSAdolc',
+-	3005 : 'SquareShelfConstrainedMasstransp2dAdolc',
+-	3006 : 'SquareShelfConstrainedMasstransp2dDGAdolc',
+-	3007 : 'SquareShelfConstrainedMasstransp3dAdolc',
+-	3008 : 'SquareShelfConstrainedTherSteaAdolc',
+-	3009 : 'SquareShelfConstrainedTherTranAdolc',
+-	3010 : 'SquareShelfConstrainedTranSSA2dAdolc',
+-	3015 : 'SquareShelfConstrainedMasstransp2dAdolcForwardDifference',
+-	3019 : 'SquareShelfConstrainedTherTranAdolcReverseVsForward',
+-	3020 : 'SquareShelfConstrainedTranAdolcReverseVsForward',
+-	3101 : 'SquareShelfConstrainedStressSSA2dAdolcMumps',
+-	3102 : 'SquareShelfConstrainedStressSSA3dAdolcMumps',
+-	3103 : 'SquareShelfConstrainedStressHOAdolcMumps',
+-	3104 : 'SquareShelfConstrainedStressFSAdolcMumps',
+-	3105 : 'SquareShelfConstrainedMasstransp2dAdolcMumps',
+-	3106 : 'SquareShelfConstrainedMasstransp2dDGAdolcMumps',
+-	3107 : 'SquareShelfConstrainedMasstransp3dAdolcMumps',
+-	3108 : 'SquareShelfConstrainedTherSteaAdolcMumps',
+-	3109 : 'SquareShelfConstrainedTherTranAdolcMumps',
+-	3110 : 'SquareShelfConstrainedTranSSA2dAdolcMumps',
+-	3115 : 'SquareShelfConstrainedMasstransp2dAdolcForwardDifferenceMumps',
+-	3119 : 'SquareShelfConstrainedTherTranAdolcReverseVsForwardMumps',
+-	3120 : 'SquareShelfConstrainedTranAdolcReverseVsForwardMumps',
+-	3300 : 'SquareSheetHydrologyDCTwoLayersVolumeControl',
+-	}
++	infile  = open('test' + str(id) + '.py','r')
++	file_text  = infile.readlines()
+ 
+-	if not id == 0:
+-		return idname.get(id,'N/A')
+-	else:
+-		return idname
++	string='#Test Name:';
++	name=file_text[0]
++	name=name[len(string)+1:-1]
++	return name
+Index: ../trunk-jpl/test/NightlyRun/test112.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test112.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test112.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedSurfSlop2d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test421.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test421.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test421.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfStressHOFS3dTiling
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test502.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test502.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test502.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: PigStressHO
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test233.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test233.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test233.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTranHOForcTemp
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test314.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test314.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test314.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedTranSIA2d
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test230.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test230.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test230.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranForceNeg3d
+ md=triangle(model(),'../Exp/Square.exp',350000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test207.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test207.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test207.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfTherTran
+ from MatlabFuncs import *
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test311.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test311.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test311.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedMasstransp3d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test213.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test213.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test213.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfCMBSSA3d
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test115.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test115.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test115.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfConstrainedBedSlop3d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelfConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test516.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test516.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test516.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: PigTherSteaSUPG
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test328.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test328.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test328.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedSmbGradients2d
+ import numpy
+ import copy
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test409.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test409.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test409.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetShelfTranMHOPenalties
+ import numpy
+ from model import *
+ from EnumDefinitions import *
+Index: ../trunk-jpl/test/NightlyRun/test613.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test613.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test613.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: 79NorthCMBalThicVxVy
+ md=triangle(model(),'../Exp/79North.exp',10000.);
+ md=meshconvert(md);
+ md=setmask(md,'../Exp/79NorthShelf.exp','');
+Index: ../trunk-jpl/test/NightlyRun/test272.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test272.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test272.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfCMZSSA2dDamage
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md.materials=matdamageice();
+Index: ../trunk-jpl/test/NightlyRun/test434.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test434.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test434.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfL1L2
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test515.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test515.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test515.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: PigTherTranSUPG
+ md=triangle(model(),'../Exp/Pig.exp',30000.);
+ md=setmask(md,'../Exp/PigShelves.exp','../Exp/PigIslands.exp');
+ md=parameterize(md,'../Par/Pig.par');
+Index: ../trunk-jpl/test/NightlyRun/test336.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test336.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test336.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedSmbComponents2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test417.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test417.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test417.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetShelfDiadSSA3dDakotaSamp
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test238.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test238.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test238.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareShelfTranForceNoInterp2d
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'all','');
+ md=parameterize(md,'../Par/SquareShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test319.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test319.m	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test319.m	(revision 19049)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedCMDragSSA2d
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test1101.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1101.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1101.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: ISMIPAHO
+ import numpy
+ import shutil
+ from model import *
+Index: ../trunk-jpl/test/NightlyRun/test3004.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test3004.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test3004.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: SquareShelfConstrainedStressFSAdolc
+ from model import *
+ from triangle import *
+ from setmask import *
+Index: ../trunk-jpl/test/NightlyRun/test1303.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test1303.py	(revision 19048)
++++ ../trunk-jpl/test/NightlyRun/test1303.py	(revision 19049)
+@@ -1,3 +1,4 @@
++#Test Name: ThermalConduction
+ import numpy
+ import sys
+ from model import *
Index: /issm/oecreview/Archive/18296-19100/ISSM-19049-19050.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19049-19050.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19049-19050.diff	(revision 19102)
@@ -0,0 +1,18 @@
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 19049)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 19050)
+@@ -764,10 +764,10 @@
+ 			md.surfaceforcings = extrude(md.surfaceforcings,md);
+ 			md.initialization = extrude(md.initialization,md);
+ 
+-			md.flowequation.extrude(md);
++			md.flowequation=md.flowequation.extrude(md);
+ 			md.stressbalance=extrude(md.stressbalance,md);
+-			md.thermal.extrude(md);
+-			md.masstransport.extrude(md);
++			md.thermal=md.thermal.extrude(md);
++			md.masstransport=md.masstransport.extrude(md);
+ 			md.calving=extrude(md.calving,md);
+ 			md.hydrology = extrude(md.hydrology,md);
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-19050-19051.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19050-19051.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19050-19051.diff	(revision 19102)
@@ -0,0 +1,62 @@
+Index: ../trunk-jpl/test/NightlyRun/test320.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test320.m	(revision 19050)
++++ ../trunk-jpl/test/NightlyRun/test320.m	(revision 19051)
+@@ -1,7 +1,5 @@
+-%Test Name: SquareSheetConstrainedMasstransp2dDG
++%Test Name: SquareSheetConstrainedCMDragSSA3d
+ SquareSheetConstrainedCMDragSSA3d
+-%Test Name: SquareSheetConstrainedMasstransp2dDG
+-SquareSheetConstrainedCMDragSSA3d
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
+Index: ../trunk-jpl/test/NightlyRun/test310.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test310.py	(revision 19050)
++++ ../trunk-jpl/test/NightlyRun/test310.py	(revision 19051)
+@@ -1,3 +1,4 @@
++#Test Name: SquareSheetConstrainedMasstransp2dDG
+ from model import *
+ from triangle import *
+ from meshconvert import *
+Index: ../trunk-jpl/test/NightlyRun/test320.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test320.py	(revision 19050)
++++ ../trunk-jpl/test/NightlyRun/test320.py	(revision 19051)
+@@ -1,7 +1,4 @@
+-#Test Name: SquareSheetConstrainedMasstransp2dDG
+-SquareSheetConstrainedCMDragSSA3d
+-#Test Name: SquareSheetConstrainedMasstransp2dDG
+-SquareSheetConstrainedCMDragSSA3d
++#Test Name: SquareSheetConstrainedCMDragSSA3d
+ import numpy
+ from model import *
+ from triangle import *
+Index: ../trunk-jpl/test/NightlyRun/test438.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test438.m	(revision 19050)
++++ ../trunk-jpl/test/NightlyRun/test438.m	(revision 19051)
+@@ -1,3 +1,4 @@
++%Test Name: TransientFrictionWaterlayer2D
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test439.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test439.m	(revision 19050)
++++ ../trunk-jpl/test/NightlyRun/test439.m	(revision 19051)
+@@ -1,3 +1,4 @@
++%Test Name: TransientFrictionWaterlayer3D
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=setmask(md,'../Exp/SquareShelf.exp','');
+ md=parameterize(md,'../Par/SquareSheetShelf.par');
+Index: ../trunk-jpl/test/NightlyRun/test310.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test310.m	(revision 19050)
++++ ../trunk-jpl/test/NightlyRun/test310.m	(revision 19051)
+@@ -1,3 +1,4 @@
++%Test Name: SquareSheetConstrainedMasstransp2dDG
+ md=triangle(model(),'../Exp/Square.exp',150000.);
+ md=meshconvert(md);
+ md=setmask(md,'','');
Index: /issm/oecreview/Archive/18296-19100/ISSM-19051-19052.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19051-19052.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19051-19052.diff	(revision 19102)
@@ -0,0 +1,73 @@
+Index: ../trunk-jpl/test/NightlyRun/runme.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/runme.m	(revision 19051)
++++ ../trunk-jpl/test/NightlyRun/runme.m	(revision 19052)
+@@ -128,12 +128,12 @@
+ %Loop over tests and launch sequence
+ root=pwd;
+ for id=test_ids,
++	disp(sprintf('%s%i%s','----------------starting:',id,'-----------------------'));
+ 	try,
+-
+ 		%Execute test
+ 		eval(['cd ' root ]);
++		id_string='N/A';
+ 		id_string=IdToName(id);
+-		disp(sprintf('%s%i%s','----------------starting:',id,'-----------------------'));
+ 		eval(['test' num2str(id)]);
+ 
+ 		%UPDATE ARCHIVE?
+@@ -248,9 +248,6 @@
+ 				end
+ 			end
+ 		end
+-		
+-		disp(sprintf('%s%i%s','----------------finished:',id,'-----------------------'));
+-
+ 	catch me,
+ 
+ 		%something went wrong, print failure message:
+@@ -267,6 +264,6 @@
+ 			rethrow(me);
+ 			if(getfieldvalue(options,'stoponerror',0)), disp('STOP'); return; end
+ 		end
+-		disp(sprintf('%s%i%s','----------------finished:',id,'-----------------------'));
+ 	end
++	disp(sprintf('%s%i%s','----------------finished:',id,'-----------------------'));
+ end
+Index: ../trunk-jpl/test/NightlyRun/runme.py
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/runme.py	(revision 19051)
++++ ../trunk-jpl/test/NightlyRun/runme.py	(revision 19052)
+@@ -128,12 +128,12 @@
+ 	#Loop over tests and launch sequence
+ 	root=os.getcwd()
+ 	for id in test_ids:
++		print "----------------starting:%i-----------------------" % id
+ 		try:
+ 
+ 			#Execute test
+ 			os.chdir(root)
+ 			id_string=IdToName(id)
+-			print "----------------starting:%i-----------------------" % id
+ 			execfile('test'+str(id)+'.py',globals())
+ 
+ 			#UPDATE ARCHIVE?
+@@ -220,7 +220,6 @@
+ 							raise RuntimeError(me2)
+ 
+ 				f.close()
+-				print "----------------finished:%i-----------------------" % id
+ 
+ 		except Exception as me:
+ 
+@@ -242,8 +241,8 @@
+ 			else:
+ 				print 'FAILURE difference: N/A test id: %i test name: %s field: %s' % (id,id_string,'N/A')
+ 				raise RuntimeError(me)
+-			print "----------------finished:%i-----------------------" % id
+ 
++		print "----------------finished:%i-----------------------" % id
+ 	return
+ 
+ import argparse
Index: /issm/oecreview/Archive/18296-19100/ISSM-19052-19053.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19052-19053.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19052-19053.diff	(revision 19102)
@@ -0,0 +1,10 @@
+Index: ../trunk-jpl/test/NightlyRun/test320.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/test320.m	(revision 19052)
++++ ../trunk-jpl/test/NightlyRun/test320.m	(revision 19053)
+@@ -1,5 +1,4 @@
+ %Test Name: SquareSheetConstrainedCMDragSSA3d
+-SquareSheetConstrainedCMDragSSA3d
+ md=triangle(model(),'../Exp/Square.exp',200000.);
+ md=setmask(md,'','');
+ md=parameterize(md,'../Par/SquareSheetConstrained.par');
Index: /issm/oecreview/Archive/18296-19100/ISSM-19053-19054.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19053-19054.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19053-19054.diff	(revision 19102)
@@ -0,0 +1,24 @@
+Index: ../trunk-jpl/src/wrappers/python/include/wrapper_macros.h
+===================================================================
+--- ../trunk-jpl/src/wrappers/python/include/wrapper_macros.h	(revision 19053)
++++ ../trunk-jpl/src/wrappers/python/include/wrapper_macros.h	(revision 19054)
+@@ -14,7 +14,7 @@
+ #ifdef _HAVE_PYTHON_
+ /* MODULEBOOT/MODULEEND {{{*/
+ 
+-/*The following macros hide the error exception handling in a matlab module. Just put 
++/*The following macros hide the error exception handling in a python module. Just put 
+  * MODULEBOOT(); and MODULEEND(); at the beginning and end of a module, and c++ exceptions 
+  * will be trapped*/
+ #define MODULEBOOT(); \
+Index: ../trunk-jpl/src/wrappers/python/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/wrappers/python/Makefile.am	(revision 19053)
++++ ../trunk-jpl/src/wrappers/python/Makefile.am	(revision 19054)
+@@ -1,5 +1,5 @@
+ AM_CPPFLAGS = @DAKOTAINCL@ @PETSCINCL@ @MPIINCL@ @SPOOLESINCL@ @METISINCL@ @TRIANGLEINCL@ @CHACOINCL@ @SCOTCHINCL@ @SHAPELIBINCL@ @PYTHONINCL@ @PYTHON_NUMPYINCL@ @AMPIINCL@
+-AUTOMAKE_OPTIONS = subdir-objects
++#AUTOMAKE_OPTIONS = subdir-objects
+ 
+ EXEEXT=$(PYTHONWRAPPEREXT)
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-19054-19055.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19054-19055.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19054-19055.diff	(revision 19102)
@@ -0,0 +1,219 @@
+Index: ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.m
+===================================================================
+--- ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.m	(revision 0)
++++ ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.m	(revision 19055)
+@@ -0,0 +1,151 @@
++
++function export_netCDF(md,filename)	
++	
++%Now going on Real treatment
++	if exist(filename),
++		disp(sprintf('File %s allready exist', filename));
++		prompt = 'Give a new name or "delete" to replace: ';
++		newname = input(prompt,'s');
++		if strcmp(newname,'delete')
++			delete(filename)
++		else
++			disp(sprintf('New file name is %s ', newname));
++			filename=newname
++	  end
++  end
++	%open file and write description
++	mode = netcdf.getConstant('NETCDF4');
++	mode = bitor(mode,netcdf.getConstant('NOCLOBBER'));%NOCLOBBER to avoid overwrite
++	ncid = netcdf.create(filename,mode);
++	netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'Title',['Results for run ' md.miscellaneous.name]);
++	netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'Date',['Created ' datestr(now)]);
++	
++	%gather geometry and timestepping as dimensions
++	Duration=md.timestepping.final_time-md.timestepping.start_time;
++	if Duration>0 && md.timestepping.time_step*md.settings.output_frequency>0,
++		StepNum=Duration/(md.timestepping.time_step*md.settings.output_frequency);
++	else
++		StepNum=1;
++  end							
++ 
++	%define netcdf dimensions
++	DimSize(1).index=netcdf.defDim(ncid,'EltNum',md.mesh.numberofelements);
++	DimSize(2).index=netcdf.defDim(ncid,'VertNum',md.mesh.numberofvertices);
++	DimSize(3).index=netcdf.defDim(ncid,'VertperElt',size(md.mesh.elements,2));
++	
++	for i=1:length(DimSize),
++		[DimSize(i).name,DimSize(i).value]=netcdf.inqDim(ncid,DimSize(i).index);
++		DimValue(i)=DimSize(i).value;% putting vallues in an array for
++                                 % further use
++  end
++ 
++	%Needs a first turn arround for var def
++ 
++	%get all model classes and create respective groups
++	groups=fieldnames(md);
++	for i=1:length(groups),
++		%disp(sprintf('group name in tree %s ',groups{i}));
++		groupID=netcdf.defGrp(ncid,groups{i});
++		%In each group gather the fields of the class
++		groupfields=fields(md.(groups{i}));
++		%Special treatment for the results
++		if strcmp(groups(i),'results'),
++			for j=1:length(groupfields)%looping on the different solutions
++				%disp(sprintf('=====Field name in tree %s ',groupfields{j}));
++				if length(md.results.(groupfields{j}))>1,
++					%the solution have several timestep get last timesteps and output frequency
++					last_step = length(md.results.(groupfields{j}));
++					step_freq = md.settings.output_frequency;
++					%grab first time step
++					subfields=fields(md.results.(groupfields{j})(1));
++					for k=1:length(subfields),
++						netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype','results');
++						if ~strcmp(subfields(k),'errlog') && ~strcmp(subfields(k),'outlog') && ~strcmp(subfields(k),'SolutionType'),
++							disp(sprintf('==========SubField name in tree %s ',subfields{k}));
++							Var=md.results.(groupfields{1})(1).(subfields{k});
++							[truc,DimSize,DimValue]=DefCreateVar(ncid,Var,groupID,subfields{k},DimSize,DimValue);
++							%CreateVar(Var,True,last_step,step_freq)
++			      end
++		      end
++				elseif length(md.results.(groupfields{j}))==1,
++					%only one timestep
++					subfields=fields(md.results.(groupfields{j}));
++					for k=1:length(subfields),
++						disp(sprintf('==========SubField name in tree %s ',subfields{k}));
++						netcdf.putAtt(groupID,netcdf.getConstant('GLOBAL'),'classtype','results');
++						if ~strcmp(subfields(k),'errlog') && ~strcmp(subfields(k),'outlog') && ~strcmp(subfields(k),'SolutionType'),
++							Var=md.results.(groupfields{1})(1).(subfields{k});
++							[truc,DimSize,DimValue]=DefCreateVar(ncid,Var,groupID,subfields{k},DimSize,DimValue);
++			      end
++		      end
++				else
++					print 'Result format not suported'
++		    end
++	    end
++		else
++			for j=1:length(groupfields),
++				disp(sprintf('=====Field name in tree %s ',groupfields{j}));
++				netcdf.putAtt(groupID,netcdf.getConstant('GLOBAL'),'classtype',class(md.(groups{i})));
++				Var=md.(groups{i}).(groupfields{j});
++				[truc,DimSize,DimValue]=DefCreateVar(ncid,Var,groupID,groupfields{j},DimSize,DimValue);
++	    end
++	  end	
++  end
++	netcdf.close(ncid);
++end
++
++function [varclass,DimSize,DimValue]=DefCreateVar(ncid,Var,groupID,field,DimSize,DimValue)
++	varclass=class(Var);
++	varsize=size(Var);
++	varlength=length(Var);
++	if isa(Var,'logical'),
++		if Var,
++			LogicString='True';
++		else,
++			LogicString='False';
++  	end
++		netcdf.putAtt(groupID,netcdf.getConstant('GLOBAL'),field,LogicString);
++	elseif isa(Var,'char'),
++		netcdf.putAtt(groupID,netcdf.getConstant('GLOBAL'),field,Var);
++	elseif isa(Var,'double'), %dealing with arrays
++		[dims,DimSize,DimValue]=GetDims(ncid,Var,groupID,field,DimSize,DimValue);
++ 		varid = netcdf.defVar(groupID,field,'double',dims);
++		if length(Var)==0,
++			netcdf.putVar(groupID,varid,NaN);
++		else
++			netcdf.putVar(groupID,varid,Var);
++  	end
++	elseif isa(Var,'cell'),
++		disp(sprintf('no support for class %s for field %s so far',varclass,field));
++	elseif isa(Var,'struct'),
++		disp(sprintf('no support for class %s for field %s so far',varclass,field));
++	else
++		disp(sprintf('no support for class %s of field %s',varclass,field));
++  end
++	return
++end
++
++function [dims,DimSize,DimValue]=GetDims(ncid,Var,groupID,field,DimSize,DimValue)
++	dims=[];
++	varlength=length(Var);
++	varsize=size(Var);
++	MatOrVec=varsize>1; %checking if we have a matrix (1 1) are vector (1 0)
++	for i=1:sum(MatOrVec), %loop on the number of (non 1) dimensions
++		currentdim=varsize(i);
++		dimexist=DimValue==currentdim;
++		if sum(dimexist)==0, %dimension is new to us, need to create it
++			dimname=strcat(field,int2str(i));
++			dimindex=length(DimSize)+1;
++			DimSize(dimindex).index=netcdf.defDim(ncid,dimname,currentdim);
++			[DimSize(dimindex).name,DimSize(dimindex).value]=netcdf.inqDim(ncid,DimSize(dimindex).index);
++			dims(i)=DimSize(dimindex).index;
++			DimValue(dimindex)=currentdim;
++		else
++			dimindex=find(dimexist);
++			if DimSize(dimindex).value~=currentdim,
++				error('Indexation problem with the dimension structure')
++  	  end
++	  end
++		dims(i)=DimSize(dimindex).index;
++  end
++end
+
+Property changes on: ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.m
+___________________________________________________________________
+Added: svn:executable
+## -0,0 +1 ##
++*
+\ No newline at end of property
+Index: ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py
+===================================================================
+--- ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py	(revision 19054)
++++ ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py	(revision 19055)
+@@ -13,16 +13,16 @@
+ 	#retriev the dimension tuple from a dictionnary
+ 	def GetDim(var,shape,i,istime):
+ 		output=[]
+-		for dim in range(0,i):
+-			if type(shape[0])==int:
++		for dim in range(0,i): #loop on the dimensions
++			if type(shape[0])==int: 
+ 				try:
+-					output=output+[str(DimDict[shape[dim]])]
+-				except KeyError:
++					output=output+[str(DimDict[shape[dim]])] #test if the dimension allready exist
++				except KeyError: #if not create it
+ 					if (shape[dim])>1:
+-						NewDim=NCData.createDimension(str(field),(shape[dim]))
+-						DimDict[len(NewDim)]=str(field)
++						NewDim=NCData.createDimension(str(field)+str(dim),(shape[dim]))
++						DimDict[len(NewDim)]=str(field)+str(dim)
+ 						output=output+[str(DimDict[shape[dim]])]
+-						print 'Defining dimension ' +str(shape[dim]) +' for '+str(field)
++						print 'Defining dimension ' +str(shape[dim]) +' for '+str(field)+str(dim)
+ 			elif type(shape[0])==str:#dealling with a dictionnary
+ 				try:
+ 					output=[str(DimDict[numpy.shape(shape)[0]])]+['DictDim']
+@@ -128,26 +128,10 @@
+ 	EltNum=NCData.createDimension('EltNum',md.mesh.numberofelements)
+ 	VertNum=NCData.createDimension('VertNum',md.mesh.numberofvertices)
+ 	VertperElt=NCData.createDimension('VertperElt',numpy.shape(md.mesh.elements)[1])
+-	if type(md.mesh) is mesh2d:
+-		DimNum=NCData.createDimension('DimNum',2)
+-	elif type(md.mesh) is mesh3dprisms:
+-		DimNum=NCData.createDimension('DimNum',3)
+-	else:
+-		print 'I can not get the Dimension of the problem'
+-	EdgeNum=NCData.createDimension('EdgeNum',md.mesh.numberofedges)
+-	Time=NCData.createDimension('Time',StepNum)
+-	SegNum=NCData.createDimension('SegNum',numpy.shape(md.mesh.segmentmarkers)[0])
+-	InvSteps=NCData.createDimension('InvSteps',md.inversion.nsteps)
+-	DictDim=NCData.createDimension('DictDim',2)
+ 
+ 	DimDict = {len(EltNum):'EltNum',
+ 						 len(VertNum):'VertNum',
+-						 len(VertperElt):'VertperElt',
+-						 len(DimNum):'DimNum',
+-						 len(EdgeNum):'EdgeNum',
+-						 len(Time):'Time',
+-						 len(SegNum):'SegNum',
+-						 len(InvSteps):'InvSteps'}
++						 len(VertperElt):'VertperElt'}
+ 
+ 	TypeDict = {float:'f8',
+ 							'float64':'f8',
Index: /issm/oecreview/Archive/18296-19100/ISSM-19055-19056.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19055-19056.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19055-19056.diff	(revision 19102)
@@ -0,0 +1,114 @@
+Index: ../trunk-jpl/src/m/plot/writejsfile.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/writejsfile.py	(revision 19055)
++++ ../trunk-jpl/src/m/plot/writejsfile.py	(revision 19056)
+@@ -19,7 +19,7 @@
+ 	#write index:
+ 	fid.write('<!-- model["index"]{{{-->\n')
+ 	fid.write('model["index"]=[')
+-	for i in xrange(1, nel-1):
++	for i in xrange(0, nel-1):
+ 		fid.write('[{0}, {1}, {2}],'.format(model.index[i][0],model.index[i][1],model.index[i][2]))
+ 	fid.write('[{0}, {1}, {2}]];\n'.format(model.index[-1][0],model.index[-1][1],model.index[-1][2]))
+ 	fid.write('<!--}}}-->\n')
+@@ -39,7 +39,7 @@
+ 	results=model.results
+ 	fid.write('results={};\n')
+ 
+-	for i in xrange(1,len(results)):
++	for i in xrange(0,len(results)):
+ 		fid.write('result={};\n')
+ 		writejsfield(fid,'result["data"]',results[i].data,nods)
+ 		fid.write('<!--{{{-->\n')
+Index: ../trunk-jpl/src/m/plot/writejsfield.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/writejsfield.py	(revision 19055)
++++ ../trunk-jpl/src/m/plot/writejsfield.py	(revision 19056)
+@@ -10,7 +10,7 @@
+ 	if type(variable[0])==numpy.float64:
+ 		fid.write('<!-- {0}{{{{{{-->\n'.format(name))
+ 		fid.write('{0}=['.format(name))
+-		for i in xrange(1, nods-1):
++		for i in xrange(0, nods-1):
+ 			fid.write('{0},'.format(variable[i]))
+ 		fid.write('{0}];\n'.format(variable[-1]))
+ 		fid.write('<!--}}}}}}-->\n')
+@@ -18,7 +18,7 @@
+ 		#multi-sized array: 
+ 		fid.write('<!-- {0}{{{{{{-->\n'.format(name))
+ 		fid.write('{0}=[]\n'.format(name))
+-		for i in xrange(1, len(variable[2])):
++		for i in xrange(0, len(variable[2])):
+ 			fid.write('{0}["{1}"]=['.format(name,i))
+ 			for j in xrange(1, nods-1):
+ 				fid.write('{0},'.format(variable[j][i]))
+Index: ../trunk-jpl/src/m/plot/export_gl.py
+===================================================================
+--- ../trunk-jpl/src/m/plot/export_gl.py	(revision 19055)
++++ ../trunk-jpl/src/m/plot/export_gl.py	(revision 19056)
+@@ -15,20 +15,22 @@
+ 	optionslist=templist.list;
+ 	options=optionslist[1];
+ 	options=checkplotoptions(md,options);
++	#print (templist,options)
++	#templist contains options 0-3. Use in the future to rework.
+ 	
+ 	#Setup unique directory in present dir: 
+ 	print ('setting directory')
+-	directory=options.getfieldvalue('directory','./');
+-	databasename=options.getfieldvalue('database','Pig');
++	directory=optionslist[0].getfieldvalue('directory');
++	databasename=optionslist[0].getfieldvalue('database');
+ 	
+ 	#scaling factor: 
+ 	print ('setting scaling factor')
+-	scaling_factor=options.getfieldvalue('scaling_factor',50);
++	scaling_factor=optionslist[0].getfieldvalue('scaling_factor');
+ 
+ 	#Deal with title: 
+ 	print ('setting title')
+-	if options.exist('title'):
+-		title=options.getfieldvalue('title');
++	if optionslist[0].exist('title'):
++		title=optionslist[0].getfieldvalue('title');
+ 	else:
+ 		title='';
+ 
+@@ -39,12 +41,16 @@
+ 
+ 	#Deal with contour {{{
+ 	print ('getting contour')
+-	contour_lat1=md.mesh.lat.take(md.mesh.segments[:,0])
+-	contour_lat2=md.mesh.lat.take(md.mesh.segments[:,1]);
+-	contour_long1=md.mesh.long.take(md.mesh.segments[:,0]);
+-	contour_long2=md.mesh.long.take(md.mesh.segments[:,1]);
+-	contour_surface1=md.geometry.surface.take(md.mesh.segments[:,0]);
+-	contour_surface2=md.geometry.surface.take(md.mesh.segments[:,1]);
++	print (md.mesh.segments)
++	segmenets0 = map(lambda s: s - 1, md.mesh.segments[:,0]);
++	segmenets1 = map(lambda s: s - 1, md.mesh.segments[:,1]);
++	
++	contour_lat1=md.mesh.lat.take(segmenets0)
++	contour_lat2=md.mesh.lat.take(segmenets1);
++	contour_long1=md.mesh.long.take(segmenets0);
++	contour_long2=md.mesh.long.take(segmenets1);
++	contour_surface1=md.geometry.surface.take(segmenets0);
++	contour_surface2=md.geometry.surface.take(segmenets1);
+ 
+ 	R1=6371000*np.ones(len(contour_surface1))+scaling_factor*contour_surface1;
+ 	R2=6371000*np.ones(len(contour_surface2))+scaling_factor*contour_surface2;
+@@ -77,11 +83,11 @@
+ 	model.z=z;
+ 	model.surface=surface;
+ 	
+-	results = [""]
+-	
++	results = []
++	print(optionslist)	
+ 	#Deal with data: 
+ 	print('getting data')
+-	for i in xrange(1,len(optionslist)):
++	for i in xrange(0,len(optionslist)):
+ 		options=optionslist[i]; 
+ 		options=checkplotoptions(md,options);
+ 		data=options.getfieldvalue('data').flatten();
Index: /issm/oecreview/Archive/18296-19100/ISSM-19056-19057.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19056-19057.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19056-19057.diff	(revision 19102)
@@ -0,0 +1,32 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19056)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19057)
+@@ -702,7 +702,7 @@
+ 			vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+ 		}
+ 
+-		/*If mask was already one, keep one*/
++		/*If mask was already one, keep one or colapse*/
+ 		else if(old_active[i]>0.){
+ 			
+ 			vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+@@ -714,18 +714,12 @@
+ 					vec_mask->SetValue(basalelement->nodes[i]->Sid(),0.,INS_VAL);
+ 					epl_thickness[i]=init_thick;
+ 				}
+-				else{
+-					vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+-				}
+ 			}
+ 		}
+ 		/*Increase of the efficient system is needed if the epl head reach the maximum value (sediment max value for now)*/
+ 		GetHydrologyDCInefficientHmax(&h_max,basalelement,basalelement->nodes[i]);
+ 		if(eplhead[i]>=h_max && active_element){
+ 			for(j=0;j<numnodes;j++){
+-				if(old_active[j]>0.){
+-					vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+-				}
+ 				/*Increase of the domain is on the downstream node in term of sediment head*/
+ 				if(sedhead[j] == sedheadmin){
+ 					if(old_active[j]==0) eplzigzag_counter[basalelement->nodes[j]->Lid()] ++;
Index: /issm/oecreview/Archive/18296-19100/ISSM-19057-19058.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19057-19058.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19057-19058.diff	(revision 19102)
@@ -0,0 +1,218 @@
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh	(revision 19057)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh	(revision 19058)
+@@ -1,21 +1,19 @@
+ #!/bin/bash
+ set -eu
+ 
+-#WARNING: make sure you have the right mpi:
+-#mpi-selector --query
+-#default:openmpi_intel-1.5.4_psm
++#WARNING: make sure you have the right mpi
+ 
+ #Some cleanup
+-rm -rf install petsc-3.5.2 src
++rm -rf install petsc-3.5.3 src
+ mkdir install src
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.3.tar.gz' 'petsc-3.5.3.tar.gz'
+ 
+ #Untar and move petsc to install directory
+-tar -zxvf  petsc-3.5.2.tar.gz
+-mv petsc-3.5.2/* src/
+-rm -rf petsc-3.5.2
++tar -zxvf  petsc-3.5.3.tar.gz
++mv petsc-3.5.3/* src/
++rm -rf petsc-3.5.3
+ 
+ #configure
+ cd src
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh	(revision 19057)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh	(revision 19058)
+@@ -2,16 +2,16 @@
+ set -eu
+ 
+ #Some cleanup
+-rm -rf install petsc-3.5.2 src
++rm -rf install petsc-3.5.3 src
+ mkdir install src
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.3.tar.gz' 'petsc-3.5.3.tar.gz'
+ 
+ #Untar and move petsc to install directory
+-tar -zxvf  petsc-3.5.2.tar.gz
+-mv petsc-3.5.2/* src/
+-rm -rf petsc-3.5.2
++tar -zxvf  petsc-3.5.3.tar.gz
++mv petsc-3.5.3/* src/
++rm -rf petsc-3.5.3
+ 
+ #configure
+ cd src
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-linux64.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-linux64.sh	(revision 19057)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-linux64.sh	(revision 19058)
+@@ -2,16 +2,16 @@
+ set -eu
+ 
+ #Some cleanup
+-rm -rf install petsc-3.5.2 src
++rm -rf install petsc-3.5.3 src
+ mkdir install src
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.3.tar.gz' 'petsc-3.5.3.tar.gz'
+ 
+ #Untar and move petsc to install directory
+-tar -zxvf  petsc-3.5.2.tar.gz
+-mv petsc-3.5.2/* src/
+-rm -rf petsc-3.5.2
++tar -zxvf  petsc-3.5.3.tar.gz
++mv petsc-3.5.3/* src/
++rm -rf petsc-3.5.3
+ 
+ #configure
+ cd src
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh	(revision 19057)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh	(revision 19058)
+@@ -2,20 +2,18 @@
+ set -eu
+ 
+ #WARNING: make sure you have the right mpi:
+-#mpi-selector --query
+-#default:openmpi_intel-1.5.4_psm
+ 
+ #Some cleanup
+-rm -rf install petsc-3.5.2 src
++rm -rf install petsc-3.5.3 src
+ mkdir install src
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.3.tar.gz' 'petsc-3.5.3.tar.gz'
+ 
+ #Untar and move petsc to install directory
+-tar -zxvf  petsc-3.5.2.tar.gz
+-mv petsc-3.5.2/* src/
+-rm -rf petsc-3.5.2
++tar -zxvf  petsc-3.5.3.tar.gz
++mv petsc-3.5.3/* src/
++rm -rf petsc-3.5.3
+ 
+ #configure
+ cd src
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-win7.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-win7.sh	(revision 19057)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-win7.sh	(revision 19058)
+@@ -2,16 +2,16 @@
+ set -eu
+ 
+ #Some cleanup
+-rm -rf install petsc-3.5.2 src
++rm -rf install petsc-3.5.3 src
+ mkdir install src
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.3.tar.gz' 'petsc-3.5.3.tar.gz'
+ 
+ #Untar and move petsc to install directory
+-tar -zxvf  petsc-3.5.2.tar.gz
+-mv petsc-3.5.2/* src/
+-rm -rf petsc-3.5.2
++tar -zxvf  petsc-3.5.3.tar.gz
++mv petsc-3.5.3/* src/
++rm -rf petsc-3.5.3
+ 
+ export PETSC_DIR=`cygpath -u "$ISSM_DIR/externalpackages/petsc/src"`
+ export PREFIX_DIR=`cygpath -u "$ISSM_DIR/externalpackages/petsc/install"`
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh	(revision 19057)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh	(revision 19058)
+@@ -2,16 +2,16 @@
+ set -eu
+ 
+ #Some cleanup
+-rm -rf install petsc-3.5.2 src
++rm -rf install petsc-3.5.3 src
+ mkdir install src
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.3.tar.gz' 'petsc-3.5.3.tar.gz'
+ 
+ #Untar and move petsc to install directory
+-tar -zxvf  petsc-3.5.2.tar.gz
+-mv petsc-3.5.2/* src/
+-rm -rf petsc-3.5.2
++tar -zxvf  petsc-3.5.3.tar.gz
++mv petsc-3.5.3/* src/
++rm -rf petsc-3.5.3
+ 
+ #configure
+ cd src
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-linux64-static.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-linux64-static.sh	(revision 19057)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-linux64-static.sh	(revision 19058)
+@@ -2,16 +2,16 @@
+ set -eu
+ 
+ #Some cleanup
+-rm -rf install petsc-3.5.2 src
++rm -rf install petsc-3.5.3 src
+ mkdir install src
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.3.tar.gz' 'petsc-3.5.3.tar.gz'
+ 
+ #Untar and move petsc to install directory
+-tar -zxvf  petsc-3.5.2.tar.gz
+-mv petsc-3.5.2/* src/
+-rm -rf petsc-3.5.2
++tar -zxvf  petsc-3.5.3.tar.gz
++mv petsc-3.5.3/* src/
++rm -rf petsc-3.5.3
+ 
+ #configure
+ cd src
+Index: ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh
+===================================================================
+--- ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh	(revision 19057)
++++ ../trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh	(revision 19058)
+@@ -2,16 +2,16 @@
+ set -eu
+ 
+ #Some cleanup
+-rm -rf install petsc-3.5.2 src
++rm -rf install petsc-3.5.3 src
+ mkdir install src
+ 
+ #Download from ISSM server
+-$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.2.tar.gz' 'petsc-3.5.2.tar.gz'
++$ISSM_DIR/scripts/DownloadExternalPackage.py 'http://issm.jpl.nasa.gov/files/externalpackages/petsc-lite-3.5.3.tar.gz' 'petsc-3.5.3.tar.gz'
+ 
+ #Untar and move petsc to install directory
+-tar -zxvf  petsc-3.5.2.tar.gz
+-mv petsc-3.5.2/* src/
+-rm -rf petsc-3.5.2
++tar -zxvf  petsc-3.5.3.tar.gz
++mv petsc-3.5.3/* src/
++rm -rf petsc-3.5.3
+ 
+ #configure
+ cd src
Index: /issm/oecreview/Archive/18296-19100/ISSM-19058-19059.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19058-19059.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19058-19059.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/c/shared/Enum/Synchronize.sh
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/Synchronize.sh	(revision 19058)
++++ ../trunk-jpl/src/c/shared/Enum/Synchronize.sh	(revision 19059)
+@@ -73,7 +73,7 @@
+ HAVE_"  toupper($1)"=no \n\
+ if test \"x$"  toupper($1)"\" = \"xyes\"; then\n\
+ 	HAVE_"  toupper($1)"=yes\n\
+-	AC_DEFINE([_HAVE_"  toupper($1)"_],[1],[with " $1"capability])\n\
++	AC_DEFINE([_HAVE_"  toupper($1)"_],[1],[with " $1" capability])\n\
+ fi\n\
+ AM_CONDITIONAL([" toupper($1)"], [test x$HAVE_" toupper($1)" = xyes])\n\
+ AC_MSG_RESULT($HAVE_" toupper($1)")\n\
Index: /issm/oecreview/Archive/18296-19100/ISSM-19059-19060.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19059-19060.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19059-19060.diff	(revision 19102)
@@ -0,0 +1,14 @@
+Index: ../trunk-jpl/externalpackages/distribute/README
+===================================================================
+--- ../trunk-jpl/externalpackages/distribute/README	(revision 0)
++++ ../trunk-jpl/externalpackages/distribute/README	(revision 19060)
+@@ -0,0 +1,9 @@
++At: https://pypi.python.org/pypi/setuptools
++
++Installation Instructions
++
++The recommended way to bootstrap setuptools on any system is to download ez_setup.py and run it using the target Python environment. Different operating systems have different recommended techniques to accomplish this basic routine, so below are some examples to get you started.
++
++Setuptools requires Python 2.6 or later. To install setuptools on Python 2.4 or Python 2.5, use the bootstrap script for Setuptools 1.x.
++
++The link provided to ez_setup.py is a bookmark to bootstrap script for the latest known stable release.
Index: /issm/oecreview/Archive/18296-19100/ISSM-19060-19061.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19060-19061.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19060-19061.diff	(revision 19102)
@@ -0,0 +1,106 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Element.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 19060)
++++ ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 19061)
+@@ -203,6 +203,7 @@
+ 		virtual void       GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid)=0;
+ 		virtual void       GetVerticesCoordinatesBase(IssmDouble** xyz_list)=0;
+ 		virtual void       GetVerticesCoordinatesTop(IssmDouble** xyz_list)=0;
++		virtual IssmDouble IceMass(void)=0;
+ 		virtual IssmDouble IceVolume(void)=0;
+ 		virtual IssmDouble IceVolumeAboveFloatation(void)=0;
+ 		virtual void       InputControlUpdate(IssmDouble scalar,bool save_parameter)=0;
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 19060)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 19061)
+@@ -1623,6 +1623,18 @@
+ 	}
+ }
+ /*}}}*/
++IssmDouble Tria::IceMass(void){/*{{{*/
++
++	IssmDouble rho_ice; 
++	
++	if(!IsIceInElement())return 0.; //do not contribute to the volume of the ice!
++
++	/*recover ice density: */
++	rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
++
++	return rho_ice*this->IceVolume();
++}
++/*}}}*/
+ IssmDouble Tria::IceVolume(void){/*{{{*/
+ 
+ 	/*The volume of a truncated prism is area_base * 1/numedges sum(length of edges)*/
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 19060)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.h	(revision 19061)
+@@ -89,6 +89,7 @@
+ 		void        GetVerticesCoordinatesTop(IssmDouble** pxyz_list);
+ 		bool        HasEdgeOnBase();
+ 		bool        HasEdgeOnSurface();
++		IssmDouble  IceMass(void);
+ 		IssmDouble  IceVolume(void);
+ 		IssmDouble  IceVolumeAboveFloatation(void);
+ 		void        InputControlUpdate(IssmDouble scalar,bool save_parameter);
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 19060)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 19061)
+@@ -1286,6 +1286,18 @@
+ 	*pxyz_list = xyz_list;
+ 
+ }/*}}}*/
++IssmDouble Penta::IceMass(void){/*{{{*/
++
++	IssmDouble rho_ice; 
++	
++	if(!IsIceInElement())return 0.; //do not contribute to the volume of the ice!
++
++	/*recover ice density: */
++	rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum);
++
++	return rho_ice*this->IceVolume();
++}
++/*}}}*/
+ IssmDouble Penta::IceVolume(void){/*{{{*/
+ 
+ 	/*The volume of a troncated prism is base * 1/3 sum(length of edges)*/
+Index: ../trunk-jpl/src/c/classes/Elements/Penta.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 19060)
++++ ../trunk-jpl/src/c/classes/Elements/Penta.h	(revision 19061)
+@@ -86,6 +86,7 @@
+ 		void           GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid);
+ 		void           GetVerticesCoordinatesBase(IssmDouble** pxyz_list);
+ 		void           GetVerticesCoordinatesTop(IssmDouble** pxyz_list);
++		IssmDouble     IceMass(void);
+ 		IssmDouble     IceVolume(void);
+ 		IssmDouble     IceVolumeAboveFloatation(void);
+ 		void           InputControlUpdate(IssmDouble scalar,bool save_parameter);
+Index: ../trunk-jpl/src/c/classes/Elements/Seg.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 19060)
++++ ../trunk-jpl/src/c/classes/Elements/Seg.h	(revision 19061)
+@@ -77,6 +77,7 @@
+ 		void        GetVerticesCoordinates(IssmDouble** pxyz_list);
+ 		void        GetVerticesCoordinatesBase(IssmDouble** pxyz_list){_error_("not implemented yet");};
+ 		void        GetVerticesCoordinatesTop(IssmDouble** pxyz_list){_error_("not implemented yet");};
++		IssmDouble  IceMass(void){_error_("not implemented yet");};
+ 		IssmDouble  IceVolume(void){_error_("not implemented yet");};
+ 		IssmDouble  IceVolumeAboveFloatation(void){_error_("not implemented yet");};
+ 		void        InputControlUpdate(IssmDouble scalar,bool save_parameter){_error_("not implemented yet");};
+Index: ../trunk-jpl/src/c/classes/Elements/Tetra.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 19060)
++++ ../trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 19061)
+@@ -83,6 +83,7 @@
+ 		void        GradientIndexing(int* indexing,int control_index){_error_("not implemented yet");};
+ 		bool        HasFaceOnBase();
+ 		bool        HasFaceOnSurface();
++		IssmDouble  IceMass(void){_error_("not implemented yet");};
+ 		IssmDouble  IceVolume(void){_error_("not implemented yet");};
+ 		IssmDouble  IceVolumeAboveFloatation(void){_error_("not implemented yet");};
+ 		bool        IsFaceOnBoundary(void){_error_("not implemented yet");};
Index: /issm/oecreview/Archive/18296-19100/ISSM-19061-19062.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19061-19062.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19061-19062.diff	(revision 19102)
@@ -0,0 +1,55 @@
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 19061)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 19062)
+@@ -693,6 +693,7 @@
+ 
+ 		case DivergenceEnum:               this->Divergencex(responses); break;
+ 		case MaxDivergenceEnum:            this->MaxDivergencex(responses); break;
++		case IceMassEnum:                  this->IceMassx(responses); break;
+ 		case IceVolumeEnum:                this->IceVolumex(responses); break;
+ 		case IceVolumeAboveFloatationEnum: this->IceVolumeAboveFloatationx(responses); break;
+ 		case MinVelEnum:                   this->MinVelx(responses); break;
+@@ -776,6 +777,7 @@
+ 					/*Scalar output*/
+ 					case DivergenceEnum:               this->Divergencex(&double_result);               break;
+ 					case MaxDivergenceEnum:            this->MaxDivergencex(&double_result);            break;
++					case IceMassEnum:                this->IceMassx(&double_result);                break;
+ 					case IceVolumeEnum:                this->IceVolumex(&double_result);                break;
+ 					case IceVolumeAboveFloatationEnum: this->IceVolumeAboveFloatationx(&double_result); break;
+ 					case MinVelEnum:                   this->MinVelx(&double_result);                   break;
+@@ -1393,6 +1395,22 @@
+ 	*pmax=uLmax;
+ 
+ }/*}}}*/
++void FemModel::IceMassx(IssmDouble* pM){/*{{{*/
++
++	IssmDouble local_ice_mass = 0;
++	IssmDouble total_ice_mass;
++
++	for(int i=0;i<this->elements->Size();i++){
++		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
++		local_ice_mass+=element->IceMass();
++	}
++	ISSM_MPI_Reduce(&local_ice_mass,&total_ice_mass,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
++	ISSM_MPI_Bcast(&total_ice_mass,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
++
++	/*Assign output pointers: */
++	*pM=total_ice_mass;
++
++}/*}}}*/
+ void FemModel::IceVolumex(IssmDouble* pV){/*{{{*/
+ 
+ 	IssmDouble local_ice_volume = 0;
+Index: ../trunk-jpl/src/c/classes/FemModel.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.h	(revision 19061)
++++ ../trunk-jpl/src/c/classes/FemModel.h	(revision 19062)
+@@ -78,6 +78,7 @@
+ 		void TotalSmbx(IssmDouble* pSmb);
+ 		void Divergencex(IssmDouble* pdiv);
+ 		void MaxDivergencex(IssmDouble* pdiv);
++		void IceMassx(IssmDouble* pV);
+ 		void IceVolumex(IssmDouble* pV);
+ 		void IceVolumeAboveFloatationx(IssmDouble* pV);
+ 		void ElementResponsex(IssmDouble* presponse,int response_enum);
Index: /issm/oecreview/Archive/18296-19100/ISSM-19062-19063.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19062-19063.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19062-19063.diff	(revision 19102)
@@ -0,0 +1,170 @@
+Index: ../trunk-jpl/src/c/classes/Misfit.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Misfit.h	(revision 19062)
++++ ../trunk-jpl/src/c/classes/Misfit.h	(revision 19063)
+@@ -14,7 +14,10 @@
+ #include "./FemModel.h"
+ #include "../modules/SurfaceAreax/SurfaceAreax.h"
+ #include "../classes/Params/Parameters.h"
++#include "../classes/Inputs/Input.h"
++#include "../classes/gauss/Gauss.h"
+ /*}}}*/
++IssmDouble OutputDefinitionsResponsex(FemModel* femmodel,int output_enum);
+ 
+ class Misfit: public Object, public Definition{
+ 
+@@ -26,6 +29,7 @@
+ 		int         observation_enum;
+ 		int         weights_enum;
+ 		char*       timeinterpolation;
++		bool        local;     
+ 		
+ 		IssmDouble  misfit; //value carried over in time.
+ 		int         lock; // if lock is on, we just return the value stored in "misfit".  this is used so we don't compute misfit past the final_time
+@@ -39,12 +43,13 @@
+ 			this->observation_enum = UNDEF;
+ 			this->weights_enum = UNDEF;
+ 			this->timeinterpolation=NULL;
++			this->local=true;
+ 			this->misfit=0;
+ 			this->lock=0;
+ 
+ 		}
+ 		/*}}}*/
+-		Misfit(char* in_name, int in_definitionenum, int in_model_enum, int in_observation_enum, char* in_timeinterpolation, int in_weights_enum){/*{{{*/
++		Misfit(char* in_name, int in_definitionenum, int in_model_enum, int in_observation_enum, char* in_timeinterpolation, bool in_local, int in_weights_enum){/*{{{*/
+ 
+ 			this->definitionenum=in_definitionenum;
+ 			this->name   = xNew<char>(strlen(in_name)+1);
+@@ -56,6 +61,7 @@
+ 			this->model_enum=in_model_enum;
+ 			this->observation_enum=in_observation_enum;
+ 			this->weights_enum=in_weights_enum;
++			this->local=in_local;
+ 			
+ 			this->misfit=0;
+ 			this->lock=0;
+@@ -75,6 +81,7 @@
+ 			_printf_("    observation_enum: " << observation_enum << " " << EnumToStringx(observation_enum) << "\n");
+ 			_printf_("    weights_enum: " << weights_enum << " " << EnumToStringx(weights_enum) << "\n");
+ 			_printf_("    timeinterpolation: " << timeinterpolation << "\n");
++			_printf_("    local: " << local << "\n");
+ 		}
+ 		/*}}}*/
+ 		void DeepEcho(void){/*{{{*/
+@@ -90,7 +97,7 @@
+ 		}
+ 		/*}}}*/
+ 		Object* copy() {/*{{{*/
+-			Misfit* mf = new Misfit(this->name,this->definitionenum, this->model_enum,this->observation_enum,this->timeinterpolation,this->weights_enum);
++			Misfit* mf = new Misfit(this->name,this->definitionenum, this->model_enum,this->observation_enum,this->timeinterpolation,this->local,this->weights_enum);
+ 			mf->misfit=this->misfit;
+ 			mf->lock=this->lock;
+ 			return (Object*) mf;
+@@ -111,48 +118,76 @@
+ 		}
+ 		/*}}}*/
+ 		 IssmDouble Response(FemModel* femmodel){/*{{{*/
+-
+-			 int i;
+-			 IssmDouble misfit_t=0.;
+-			 IssmDouble all_misfit_t=0.;
++				 
++			 /*diverse: */
++			 IssmDouble time,starttime,finaltime;
+ 			 IssmDouble dt;
+-			 IssmDouble area_t=0.;
+-			 IssmDouble all_area_t;
+-			 IssmDouble time,starttime,finaltime;
+-
++			 
++			 /*recover time parameters: */
+ 			 femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
+ 			 femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum);
+ 			 femmodel->parameters->FindParam(&time,TimeEnum);
++			 femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
+ 
+-			 /*If we are locked, return time average: */
+-			 if(this->lock)return misfit/(time-starttime);
++			 if (this->local){ /*local computation: {{{*/
+ 
++				 int i;
++				 IssmDouble misfit_t=0.;
++				 IssmDouble all_misfit_t=0.;
++				 IssmDouble area_t=0.;
++				 IssmDouble all_area_t;
+ 
+-			 for(i=0;i<femmodel->elements->Size();i++){
+-				 Element* element=(Element*)femmodel->elements->GetObjectByOffset(i);
+-				 misfit_t+=element->Misfit(model_enum,observation_enum,weights_enum);
+-				 area_t+=element->MisfitArea(weights_enum);
+-			 }
++			
++				 /*If we are locked, return time average: */
++				 if(this->lock)return misfit/(time-starttime);
+ 
+-			 ISSM_MPI_Allreduce ( (void*)&misfit_t,(void*)&all_misfit_t,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
+-			 ISSM_MPI_Allreduce ( (void*)&area_t,(void*)&all_area_t,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
+-			 area_t=all_area_t;
+-			 misfit_t=all_misfit_t;
+-			 
+-			 /*Divide by surface area if not nill!: */
+-			 if (area_t!=0) misfit_t=misfit_t/area_t;
++				 for(i=0;i<femmodel->elements->Size();i++){
++					 Element* element=(Element*)femmodel->elements->GetObjectByOffset(i);
++					 misfit_t+=element->Misfit(model_enum,observation_enum,weights_enum);
++					 area_t+=element->MisfitArea(weights_enum);
++				 }
+ 
+-			 /*Recover delta_t: */
+-			 femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
++				 ISSM_MPI_Allreduce ( (void*)&misfit_t,(void*)&all_misfit_t,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
++				 ISSM_MPI_Allreduce ( (void*)&area_t,(void*)&all_area_t,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
++				 area_t=all_area_t;
++				 misfit_t=all_misfit_t;
++				 
++				 /*Divide by surface area if not nill!: */
++				 if (area_t!=0) misfit_t=misfit_t/area_t;
+ 
+-			 /*Add this time's contribution to curent misfit: */
+-			 misfit+=dt*misfit_t;
++				 /*Add this time's contribution to curent misfit: */
++				 misfit+=dt*misfit_t;
+ 
+-			 /*Do we lock? i.e. are we at final_time? :*/
+-			 if(time==finaltime)this->lock=1;
++				 /*Do we lock? i.e. are we at final_time? :*/
++				 if(time==finaltime)this->lock=1;
+ 
+-			 /*What we return is the value of misfit / time: */
+-			 return misfit/(time-starttime);
++				 /*What we return is the value of misfit / time: */
++				 return misfit/(time-starttime);
++			 } /*}}}*/
++			 else{ /*global computation: {{{ */
++				 
++				 IssmDouble model, observation;
++				 
++				 /*If we are locked, return time average: */
++				 if(this->lock)return misfit/(time-starttime);
++
++				 /*First, the global  model response: */
++				 model=OutputDefinitionsResponsex(femmodel,this->model_enum);
++				 /*Now, the observation is buried inside the elements, go fish it in the first element (cludgy, needs fixing): */
++				 Element* element=(Element*)femmodel->elements->GetObjectByOffset(0); _assert_(element);
++				 Input* input = element->GetInput(observation_enum); _assert_(input);
++				 input->GetInputAverage(&observation);
++				 
++				 /*Add this time's contribution to curent misfit: */
++				 misfit+=dt*(model-observation);
++				 
++				 /*Do we lock? i.e. are we at final_time? :*/
++				 if(time==finaltime)this->lock=1;
++				 
++				 /*What we return is the value of misfit / time: */
++				 return misfit/(time-starttime);
++			 } /*}}}*/
++
+ 		 }
+ 			/*}}}*/
+ };
Index: /issm/oecreview/Archive/18296-19100/ISSM-19063-19064.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19063-19064.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19063-19064.diff	(revision 19102)
@@ -0,0 +1,14 @@
+Index: ../trunk-jpl/src/m/plot/plot_rifts.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/plot_rifts.m	(revision 19063)
++++ ../trunk-jpl/src/m/plot/plot_rifts.m	(revision 19064)
+@@ -62,6 +62,9 @@
+ if is2d
+ 	A=elements(:,1); B=elements(:,2); C=elements(:,3); 
+ 	patch( 'Faces', [A B C], 'Vertices', [x y z],'FaceVertexCData', [1 1 1],'FaceColor','none','EdgeColor','black');
++elseif isplanet,
++	A=elements(:,1); B=elements(:,2); C=elements(:,3); 
++	patch( 'Faces', [A B C], 'Vertices', [x y z],'FaceVertexCData', [1 1 1],'FaceColor','none','EdgeColor','black');
+ else
+ 	A=elements(:,1); B=elements(:,2); C=elements(:,3); D=elements(:,4); E=elements(:,5); F=elements(:,6);
+ 	patch( 'Faces', [A B C], 'Vertices', [x y z],'FaceVertexCData', [1 1 1],'FaceColor','none','EdgeColor','black');
Index: /issm/oecreview/Archive/18296-19100/ISSM-19064-19065.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19064-19065.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19064-19065.diff	(revision 19102)
@@ -0,0 +1,52 @@
+Index: ../trunk-jpl/src/m/enum/MisfitLocalEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MisfitLocalEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/MisfitLocalEnum.m	(revision 19065)
+@@ -0,0 +1,11 @@
++function macro=MisfitLocalEnum()
++%MISFITLOCALENUM - Enum of MisfitLocal
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=MisfitLocalEnum()
++
++macro=StringToEnum('MisfitLocal');
+Index: ../trunk-jpl/src/m/enum/IceMassEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/IceMassEnum.m	(revision 0)
++++ ../trunk-jpl/src/m/enum/IceMassEnum.m	(revision 19065)
+@@ -0,0 +1,11 @@
++function macro=IceMassEnum()
++%ICEMASSENUM - Enum of IceMass
++%
++%   WARNING: DO NOT MODIFY THIS FILE
++%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
++%            Please read src/c/shared/Enum/README for more information
++%
++%   Usage:
++%      macro=IceMassEnum()
++
++macro=StringToEnum('IceMass');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 19064)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 19065)
+@@ -767,6 +767,7 @@
+ def MisfitModelEnumEnum(): return StringToEnum("MisfitModelEnum")[0]
+ def MisfitObservationEnum(): return StringToEnum("MisfitObservation")[0]
+ def MisfitObservationEnumEnum(): return StringToEnum("MisfitObservationEnum")[0]
++def MisfitLocalEnum(): return StringToEnum("MisfitLocal")[0]
+ def MisfitTimeinterpolationEnum(): return StringToEnum("MisfitTimeinterpolation")[0]
+ def MisfitWeightsEnum(): return StringToEnum("MisfitWeights")[0]
+ def MisfitWeightsEnumEnum(): return StringToEnum("MisfitWeightsEnum")[0]
+@@ -787,6 +788,7 @@
+ def MinVzEnum(): return StringToEnum("MinVz")[0]
+ def MaxVzEnum(): return StringToEnum("MaxVz")[0]
+ def MaxAbsVzEnum(): return StringToEnum("MaxAbsVz")[0]
++def IceMassEnum(): return StringToEnum("IceMass")[0]
+ def IceVolumeEnum(): return StringToEnum("IceVolume")[0]
+ def IceVolumeAboveFloatationEnum(): return StringToEnum("IceVolumeAboveFloatation")[0]
+ def TotalSmbEnum(): return StringToEnum("TotalSmb")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-19065-19066.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19065-19066.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19065-19066.diff	(revision 19102)
@@ -0,0 +1,76 @@
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 19065)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 19066)
+@@ -790,6 +790,7 @@
+ 	MisfitModelEnumEnum,
+ 	MisfitObservationEnum,
+ 	MisfitObservationEnumEnum,
++	MisfitLocalEnum,
+ 	MisfitTimeinterpolationEnum,
+ 	MisfitWeightsEnum,
+ 	MisfitWeightsEnumEnum,
+@@ -812,6 +813,7 @@
+ 	MinVzEnum,
+ 	MaxVzEnum,
+ 	MaxAbsVzEnum,
++	IceMassEnum,
+ 	IceVolumeEnum,
+ 	IceVolumeAboveFloatationEnum,
+ 	TotalSmbEnum,
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 19065)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 19066)
+@@ -775,6 +775,7 @@
+ 		case MisfitModelEnumEnum : return "MisfitModelEnum";
+ 		case MisfitObservationEnum : return "MisfitObservation";
+ 		case MisfitObservationEnumEnum : return "MisfitObservationEnum";
++		case MisfitLocalEnum : return "MisfitLocal";
+ 		case MisfitTimeinterpolationEnum : return "MisfitTimeinterpolation";
+ 		case MisfitWeightsEnum : return "MisfitWeights";
+ 		case MisfitWeightsEnumEnum : return "MisfitWeightsEnum";
+@@ -795,6 +796,7 @@
+ 		case MinVzEnum : return "MinVz";
+ 		case MaxVzEnum : return "MaxVz";
+ 		case MaxAbsVzEnum : return "MaxAbsVz";
++		case IceMassEnum : return "IceMass";
+ 		case IceVolumeEnum : return "IceVolume";
+ 		case IceVolumeAboveFloatationEnum : return "IceVolumeAboveFloatation";
+ 		case TotalSmbEnum : return "TotalSmb";
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 19065)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 19066)
+@@ -793,6 +793,7 @@
+ 	      else if (strcmp(name,"MisfitModelEnum")==0) return MisfitModelEnumEnum;
+ 	      else if (strcmp(name,"MisfitObservation")==0) return MisfitObservationEnum;
+ 	      else if (strcmp(name,"MisfitObservationEnum")==0) return MisfitObservationEnumEnum;
++	      else if (strcmp(name,"MisfitLocal")==0) return MisfitLocalEnum;
+ 	      else if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
+ 	      else if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
+ 	      else if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
+@@ -813,6 +814,7 @@
+ 	      else if (strcmp(name,"MinVz")==0) return MinVzEnum;
+ 	      else if (strcmp(name,"MaxVz")==0) return MaxVzEnum;
+ 	      else if (strcmp(name,"MaxAbsVz")==0) return MaxAbsVzEnum;
++	      else if (strcmp(name,"IceMass")==0) return IceMassEnum;
+ 	      else if (strcmp(name,"IceVolume")==0) return IceVolumeEnum;
+ 	      else if (strcmp(name,"IceVolumeAboveFloatation")==0) return IceVolumeAboveFloatationEnum;
+ 	      else if (strcmp(name,"TotalSmb")==0) return TotalSmbEnum;
+@@ -872,12 +874,12 @@
+ 	      else if (strcmp(name,"NearestInterp")==0) return NearestInterpEnum;
+ 	      else if (strcmp(name,"XY")==0) return XYEnum;
+ 	      else if (strcmp(name,"XYZ")==0) return XYZEnum;
+-	      else if (strcmp(name,"Dense")==0) return DenseEnum;
+-	      else if (strcmp(name,"MpiDense")==0) return MpiDenseEnum;
+          else stage=8;
+    }
+    if(stage==8){
+-	      if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum;
++	      if (strcmp(name,"Dense")==0) return DenseEnum;
++	      else if (strcmp(name,"MpiDense")==0) return MpiDenseEnum;
++	      else if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum;
+ 	      else if (strcmp(name,"Seq")==0) return SeqEnum;
+ 	      else if (strcmp(name,"Mpi")==0) return MpiEnum;
+ 	      else if (strcmp(name,"Mumps")==0) return MumpsEnum;
Index: /issm/oecreview/Archive/18296-19100/ISSM-19066-19067.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19066-19067.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19066-19067.diff	(revision 19102)
@@ -0,0 +1,61 @@
+Index: ../trunk-jpl/src/m/classes/misfit.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/misfit.m	(revision 19066)
++++ ../trunk-jpl/src/m/classes/misfit.m	(revision 19067)
+@@ -7,6 +7,7 @@
+ %                    'observation_enum',SurfaceObservationsEnum,...
+ %                    'observation',md.geometry.surface,...
+ %                    'timeinterpolation','nearestneighbor',...
++%                    'local',1,...
+ %                    'weights',ones(md.mesh.numberofvertices,1),...
+ %                    'weights_enum',WeightsSurfaceObservationsEnum);
+ %
+@@ -21,6 +22,7 @@
+ 		observation       = NaN; %observed field that we compare the model against
+ 		observation_enum  = NaN; %enum for observed field.
+ 		timeinterpolation = '';
++		local             = 1;
+ 		weights           = NaN; %weight coefficients for every vertex
+ 		weights_enum      = NaN; %enum to identify this particular set of weights
+ 		cumulated         = NaN; %do we cumulate misfit through time?
+@@ -40,6 +42,7 @@
+ 				self.model_enum=getfieldvalue(options,'model_enum');
+ 				self.observation=getfieldvalue(options,'observation',NaN);
+ 				self.observation_enum=getfieldvalue(options,'observation_enum');
++				self.local=getfieldvalue(options,'local',1);
+ 				self.timeinterpolation=getfieldvalue(options,'timeinterpolation','nearestneighbor');
+ 				self.weights=getfieldvalue(options,'weights',NaN);
+ 				self.weights_enum=getfieldvalue(options,'weights_enum',NaN);
+@@ -47,6 +50,7 @@
+ 			end
+ 		end % }}}
+ 		function self = setdefaultparameters(self) % {{{
++			self.local=1;
+ 			self.timeinterpolation='nearestneighbor';
+ 		end % }}}
+ 		function md = checkconsistency(self,md,solution,analyses) % {{{
+@@ -54,7 +58,7 @@
+ 			if ~ischar(self.name),
+ 				error('misfit error message: ''name'' field should be a string!');
+ 			end
+-			md = checkfield(md,'fieldname','self.definitionenum','field',self.definitionenum,'values',[Outputdefinition1Enum,Outputdefinition2Enum,Outputdefinition3Enum,Outputdefinition4Enum,Outputdefinition5Enum,Outputdefinition6Enum,Outputdefinition7Enum,Outputdefinition8Enum,Outputdefinition9Enum,Outputdefinition10Enum]);
++			md = checkfield(md,'fieldname','self.definitionenum','field',self.definitionenum,'values',[Outputdefinition1Enum:Outputdefinition100Enum]);
+ 
+ 			if ~ischar(self.timeinterpolation),
+ 				error('misfit error message: ''timeinterpolation'' field should be a string!');
+@@ -73,6 +77,7 @@
+ 			fielddisplay(self,'model_enum','enum for field that is modeled');
+ 			fielddisplay(self,'observation','observed field that we compare the model against');
+ 			fielddisplay(self,'observation_enum','observation enum');
++			fielddisplay(self,'local','is the response local to the elements, or global? (default is 1)''');
+ 			fielddisplay(self,'timeinterpolation','interpolation routine used to interpolate misfit between two time steps (default is ''nearestneighbor''');
+ 			fielddisplay(self,'weights','weights (at vertices) to apply to the misfit');
+ 			fielddisplay(self,'weights_enum','enum for weights for identification purposes');
+@@ -85,6 +90,7 @@
+ 		WriteData(fid,'object',self,'fieldname','model_enum','format','Integer');
+ 		WriteData(fid,'object',self,'fieldname','observation','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 		WriteData(fid,'object',self,'fieldname','observation_enum','format','Integer');
++		WriteData(fid,'object',self,'fieldname','local','format','Integer');
+ 		WriteData(fid,'object',self,'fieldname','timeinterpolation','format','String');
+ 		WriteData(fid,'object',self,'fieldname','weights','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+ 		WriteData(fid,'object',self,'fieldname','weights_enum','format','Integer');
Index: /issm/oecreview/Archive/18296-19100/ISSM-19067-19068.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19067-19068.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19067-19068.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/m/classes/independent.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/independent.m	(revision 19067)
++++ ../trunk-jpl/src/m/classes/independent.m	(revision 19068)
+@@ -52,6 +52,7 @@
+ 
+ 			fielddisplay(self,'name','variable name (must match corresponding Enum)');
+ 			fielddisplay(self,'type','type of variable (''vertex'' or ''scalar'')');
++			fielddisplay(self,'nods','size of dependent variables');
+ 			if ~isnan(self.fos_forward_index),
+ 				fielddisplay(self,'fos_forward_index','index for fos_foward driver of ADOLC');
+ 			end
Index: /issm/oecreview/Archive/18296-19100/ISSM-19068-19069.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19068-19069.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19068-19069.diff	(revision 19102)
@@ -0,0 +1,14 @@
+Index: ../trunk-jpl/src/m/classes/flowequation.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/flowequation.m	(revision 19068)
++++ ../trunk-jpl/src/m/classes/flowequation.m	(revision 19069)
+@@ -157,6 +157,9 @@
+ 			if strcmp(domaintype(md.mesh),'2Dhorizontal')
+ 				md = checkfield(md,'fieldname','flowequation.vertex_equation','size',[md.mesh.numberofvertices 1],'values',[1:2]);
+ 				md = checkfield(md,'fieldname','flowequation.element_equation','size',[md.mesh.numberofelements 1],'values',[1:2]);
++			elseif strcmp(domaintype(md.mesh),'3Dsurface')
++				md = checkfield(md,'fieldname','flowequation.vertex_equation','size',[md.mesh.numberofvertices 1],'values',[1:2]);
++				md = checkfield(md,'fieldname','flowequation.element_equation','size',[md.mesh.numberofelements 1],'values',[1:2]);
+ 			elseif strcmp(domaintype(md.mesh),'2Dvertical')
+ 				md = checkfield(md,'fieldname','flowequation.vertex_equation','size',[md.mesh.numberofvertices 1],'values',[2,4,5]);
+ 				md = checkfield(md,'fieldname','flowequation.element_equation','size',[md.mesh.numberofelements 1],'values',[2,4,5]);
Index: /issm/oecreview/Archive/18296-19100/ISSM-19069-19070.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19069-19070.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19069-19070.diff	(revision 19102)
@@ -0,0 +1,36 @@
+Index: ../trunk-jpl/src/m/classes/m1qn3inversion.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 19069)
++++ ../trunk-jpl/src/m/classes/m1qn3inversion.m	(revision 19070)
+@@ -26,15 +26,6 @@
+ 
+ 	end
+ 	methods
+-		function self = extrude(self,md) % {{{
+-			self.vx_obs=project3d(md,'vector',self.vx_obs,'type','node');
+-			self.vy_obs=project3d(md,'vector',self.vy_obs,'type','node');
+-			self.vel_obs=project3d(md,'vector',self.vel_obs,'type','node');
+-			self.thickness_obs=project3d(md,'vector',self.thickness_obs,'type','node');
+-			if numel(self.cost_functions_coefficients)>1,self.cost_functions_coefficients=project3d(md,'vector',self.cost_functions_coefficients,'type','node');end;
+-			if numel(self.min_parameters)>1,self.min_parameters=project3d(md,'vector',self.min_parameters,'type','node');end;
+-			if numel(self.max_parameters)>1,self.max_parameters=project3d(md,'vector',self.max_parameters,'type','node');end;
+-		end % }}}
+ 		function self = m1qn3inversion(varargin) % {{{
+ 			switch nargin
+ 				case 0
+@@ -45,6 +36,15 @@
+ 					error('constructor not supported');
+ 			end
+ 		end % }}}
++		function self = extrude(self,md) % {{{
++			self.vx_obs=project3d(md,'vector',self.vx_obs,'type','node');
++			self.vy_obs=project3d(md,'vector',self.vy_obs,'type','node');
++			self.vel_obs=project3d(md,'vector',self.vel_obs,'type','node');
++			self.thickness_obs=project3d(md,'vector',self.thickness_obs,'type','node');
++			if numel(self.cost_functions_coefficients)>1,self.cost_functions_coefficients=project3d(md,'vector',self.cost_functions_coefficients,'type','node');end;
++			if numel(self.min_parameters)>1,self.min_parameters=project3d(md,'vector',self.min_parameters,'type','node');end;
++			if numel(self.max_parameters)>1,self.max_parameters=project3d(md,'vector',self.max_parameters,'type','node');end;
++		end % }}}
+ 		function self = setdefaultparameters(self) % {{{
+ 
+ 			%default is incomplete adjoint for now
Index: /issm/oecreview/Archive/18296-19100/ISSM-19070-19071.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19070-19071.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19070-19071.diff	(revision 19102)
@@ -0,0 +1,26 @@
+Index: ../trunk-jpl/src/m/classes/massconaxpby.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/massconaxpby.m	(revision 19070)
++++ ../trunk-jpl/src/m/classes/massconaxpby.m	(revision 19071)
+@@ -50,7 +50,7 @@
+ 			if ~ischar(self.namex), error('masscon error message: ''namex'' field should be a string!'); end
+ 			if ~ischar(self.namey), error('masscon error message: ''namey'' field should be a string!'); end
+ 			
+-			md = checkfield(md,'fieldname','self.definitionenum','field',self.definitionenum,'values',[Outputdefinition1Enum,Outputdefinition2Enum,Outputdefinition3Enum,Outputdefinition4Enum,Outputdefinition5Enum,Outputdefinition6Enum,Outputdefinition7Enum,Outputdefinition8Enum,Outputdefinition9Enum,Outputdefinition10Enum]);
++			md = checkfield(md,'fieldname','self.definitionenum','field',self.definitionenum,'values',[Outputdefinition1Enum:Outputdefinition100Enum]);
+ 
+ 			md = checkfield(md,'fieldname','self.alpha','field',self.alpha,'NaN',1,'size',[1 1]);
+ 			md = checkfield(md,'fieldname','self.betaa','field',self.beta,'NaN',1,'size',[1 1]);
+Index: ../trunk-jpl/src/m/classes/masscon.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/masscon.m	(revision 19070)
++++ ../trunk-jpl/src/m/classes/masscon.m	(revision 19071)
+@@ -40,7 +40,7 @@
+ 				error('masscon error message: ''name'' field should be a string!');
+ 			end
+ 			
+-			md = checkfield(md,'fieldname','self.definitionenum','field',self.definitionenum,'values',[Outputdefinition1Enum,Outputdefinition2Enum,Outputdefinition3Enum,Outputdefinition4Enum,Outputdefinition5Enum,Outputdefinition6Enum,Outputdefinition7Enum,Outputdefinition8Enum,Outputdefinition9Enum,Outputdefinition10Enum]);
++			md = checkfield(md,'fieldname','self.definitionenum','field',self.definitionenum,'values',[Outputdefinition1Enum:Outputdefinition100Enum]);
+ 
+ 			md = checkfield(md,'fieldname','self.levelset','field',self.levelset,'timeseries',1,'NaN',1);
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-19071-19072.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19071-19072.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19071-19072.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/externalpackages/numpy
+===================================================================
+--- ../trunk-jpl/externalpackages/numpy	(revision 19071)
++++ ../trunk-jpl/externalpackages/numpy	(revision 19072)
+
+Property changes on: ../trunk-jpl/externalpackages/numpy
+___________________________________________________________________
+Modified: svn:ignore
+## -1,3 +1,4 ##
++numpy*
+ numpy-*
+ *.gz
+ *.zip
Index: /issm/oecreview/Archive/18296-19100/ISSM-19072-19073.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19072-19073.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19072-19073.diff	(revision 19102)
@@ -0,0 +1,28 @@
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 19072)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 19073)
+@@ -65,6 +65,7 @@
+ 				int*         misfit_observation_enum_s  = NULL;
+ 				int*         misfit_observation_M_s    = NULL;
+ 				int*         misfit_observation_N_s    = NULL;
++				int*         misfit_local_s = NULL;
+ 				char**       misfit_timeinterpolation_s = NULL;
+ 				IssmDouble** misfit_weights_s           = NULL;
+ 				int*         misfit_weights_M_s    = NULL;
+@@ -78,13 +79,14 @@
+ 				iomodel->FetchMultipleData(&misfit_observation_s,&misfit_observation_M_s,&misfit_observation_N_s,&nummisfits,MisfitObservationEnum);
+ 				iomodel->FetchMultipleData(&misfit_observation_enum_s,&nummisfits,MisfitObservationEnumEnum);
+ 				iomodel->FetchMultipleData(&misfit_timeinterpolation_s,&nummisfits,MisfitTimeinterpolationEnum);
++				iomodel->FetchMultipleData(&misfit_local_s,&nummisfits,MisfitLocalEnum);
+ 				iomodel->FetchMultipleData(&misfit_weights_s,&misfit_weights_M_s,&misfit_weights_N_s,&nummisfits,MisfitWeightsEnum);
+ 				iomodel->FetchMultipleData(&misfit_weights_enum_s,&nummisfits,MisfitWeightsEnumEnum);
+ 
+ 				for(j=0;j<nummisfits;j++){
+ 
+ 					/*First create a misfit object for that specific enum (misfit_model_enum_s[j]):*/
+-					output_definitions->AddObject(new Misfit(misfit_name_s[j],misfit_definitionenums_s[j],misfit_model_enum_s[j],misfit_observation_enum_s[j],misfit_timeinterpolation_s[j],misfit_weights_enum_s[j]));
++					output_definitions->AddObject(new Misfit(misfit_name_s[j],misfit_definitionenums_s[j],misfit_model_enum_s[j],misfit_observation_enum_s[j],misfit_timeinterpolation_s[j],(bool)misfit_local_s[j],misfit_weights_enum_s[j]));
+ 
+ 					/*Now, for this particular misfit object, make sure we plug into the elements: the observation, and the weights.*/
+ 					for(i=0;i<elements->Size();i++){
Index: /issm/oecreview/Archive/18296-19100/ISSM-19073-19074.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19073-19074.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19073-19074.diff	(revision 19102)
@@ -0,0 +1,17 @@
+Index: ../trunk-jpl/src/m/plot/processmesh.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/processmesh.m	(revision 19073)
++++ ../trunk-jpl/src/m/plot/processmesh.m	(revision 19074)
+@@ -20,6 +20,12 @@
+ 	return;
+ end
+ 
++%special case for mesh 3dsurface
++if strcmp(domaintype(md.mesh),'3Dsurface'),
++	[x y z elements is2d isplanet] = processmesh(md.mesh,options);
++	return;
++end
++
+ if ~strcmpi(getfieldvalue(options,'coord','xy'),'latlon'),
+ 	x=md.mesh.x;
+ 	if isprop(md.mesh,'x2d'), x2d=md.mesh.x2d; end
Index: /issm/oecreview/Archive/18296-19100/ISSM-19074-19075.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19074-19075.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19074-19075.diff	(revision 19102)
@@ -0,0 +1,14 @@
+Index: ../trunk-jpl/src/m/plot/applyoptions.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/applyoptions.m	(revision 19074)
++++ ../trunk-jpl/src/m/plot/applyoptions.m	(revision 19075)
+@@ -60,6 +60,9 @@
+ 		end
+ 	elseif strcmp(domaintype(md.mesh),'2Dvertical'),
+ 		axis auto tight
++	elseif strcmp(domaintype(md.mesh),'3Dsurface'),
++		axis auto tight
++
+ 	elseif strcmp(domaintype(md.mesh),'2Dhorizontal'),
+ 		axis tight equal;
+ 	else
Index: /issm/oecreview/Archive/18296-19100/ISSM-19075-19076.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19075-19076.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19075-19076.diff	(revision 19102)
@@ -0,0 +1,216 @@
+Index: ../trunk-jpl/src/m/classes/mesh3dsurface.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mesh3dsurface.m	(revision 0)
++++ ../trunk-jpl/src/m/classes/mesh3dsurface.m	(revision 19076)
+@@ -0,0 +1,211 @@
++%MESH3DSURFACE class definition
++%
++%   Usage:
++%      mesh3dsurface=mesh3dsurface();
++
++classdef mesh3dsurface
++	properties (SetAccess=public) 
++		x                           = NaN;
++		y                           = NaN;
++		z                           = NaN;
++		elements                    = NaN;
++		numberofelements            = 0;
++		numberofvertices            = 0;
++		numberofedges               = 0;
++
++		lat                         = NaN;
++		long                        = NaN;
++		r                           = NaN;
++
++		vertexonboundary            = NaN;
++		edges                       = NaN;
++		segments                    = NaN;
++		segmentmarkers              = NaN;
++		vertexconnectivity          = NaN;
++		elementconnectivity         = NaN;
++		average_vertex_connectivity = 0;
++
++		extractedvertices           = NaN;
++		extractedelements           = NaN;
++	end
++	methods (Static)
++		function self = loadobj(self) % {{{
++			% This function is directly called by matlab when a model selfect is
++			% loaded. Update old properties here
++
++			%2014 Oct. 1st
++			if isstruct(self),
++				oldself=self;
++				%Assign property values from struct
++				self=structtoobj(mesh3dsurface(),oldself);
++				if isfield(oldself,'hemisphere'),
++					disp('md.mesh.hemisphere has been automatically converted to EPSG code');
++					if strcmpi(oldself.hemisphere,'n'),
++						self.epsg=3413;
++					else
++						self.epsg=3031;
++					end
++				end
++			end
++
++		end% }}}
++	end
++	methods
++		function self = mesh3dsurface(varargin) % {{{
++			switch nargin
++				case 0
++					self=setdefaultparameters(self);
++				case 1
++					self=mesh3dsurface();
++					object=varargin{1};
++					fields=fieldnames(object);
++					for i=1:length(fields)
++						field=fields{i};
++						if ismember(field,properties('mesh3dsurface')),
++							self.(field)=object.(field);
++						end
++					end
++				otherwise
++					error('constructor not supported');
++			end
++		end % }}}
++		function obj = setdefaultparameters(obj) % {{{
++
++			%the connectivity is the averaged number of nodes linked to a
++			%given node through an edge. This connectivity is used to initially
++			%allocate memory to the stiffness matrix. A value of 16 seems to
++			%give a good memory/time ration. This value can be checked in
++			%trunk/test/Miscellaneous/runme.m
++			obj.average_vertex_connectivity=25;
++		end % }}}
++		function md = checkconsistency(obj,md,solution,analyses) % {{{
++
++			md = checkfield(md,'fieldname','mesh.x','NaN',1,'size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','mesh.y','NaN',1,'size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','mesh.z','NaN',1,'size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','mesh.lat','NaN',1,'size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','mesh.long','NaN',1,'size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','mesh.r','NaN',1,'size',[md.mesh.numberofvertices 1]);
++			md = checkfield(md,'fieldname','mesh.elements','NaN',1,'>',0,'values',1:md.mesh.numberofvertices);
++			md = checkfield(md,'fieldname','mesh.elements','size',[md.mesh.numberofelements 3]);
++			if any(~ismember(1:md.mesh.numberofvertices,sort(unique(md.mesh.elements(:)))));
++				md = checkmessage(md,'orphan nodes have been found. Check the mesh outline');
++			end
++			md = checkfield(md,'fieldname','mesh.numberofelements','>',0);
++			md = checkfield(md,'fieldname','mesh.numberofvertices','>',0);
++			md = checkfield(md,'fieldname','mesh.average_vertex_connectivity','>=',9,'message','''mesh.average_vertex_connectivity'' should be at least 9 in 2d');
++
++			switch(solution),
++				case ThermalSolutionEnum(),
++					md = checkmessage(md,'thermal not supported for 2d mesh');
++			end
++		end % }}}
++		function disp(obj) % {{{
++			disp(sprintf('   2D tria Mesh (horizontal):')); 
++
++			disp(sprintf('\n      Elements and vertices:'));
++			fielddisplay(obj,'numberofelements','number of elements');
++			fielddisplay(obj,'numberofvertices','number of vertices');
++			fielddisplay(obj,'elements','vertex indices of the mesh elements');
++			fielddisplay(obj,'x','vertices x coordinate [m]');
++			fielddisplay(obj,'y','vertices y coordinate [m]');
++			fielddisplay(obj,'z','vertices z coordinate [m]');
++			fielddisplay(obj,'lat','vertices latitude [degrees]');
++			fielddisplay(obj,'long','vertices longitude [degrees]');
++			fielddisplay(obj,'r','vertices radius [m]');
++			
++			fielddisplay(obj,'edges','edges of the 2d mesh (vertex1 vertex2 element1 element2)');
++			fielddisplay(obj,'numberofedges','number of edges of the 2d mesh');
++
++			disp(sprintf('\n      Properties:'));
++			fielddisplay(obj,'vertexonboundary','vertices on the boundary of the domain flag list');
++			fielddisplay(obj,'segments','edges on domain boundary (vertex1 vertex2 element)');
++			fielddisplay(obj,'segmentmarkers','number associated to each segment');
++			fielddisplay(obj,'vertexconnectivity','list of vertices connected to vertex_i');
++			fielddisplay(obj,'elementconnectivity','list of vertices connected to element_i');
++			fielddisplay(obj,'average_vertex_connectivity','average number of vertices connected to one vertex');
++
++			disp(sprintf('\n      Extracted model:'));
++			fielddisplay(obj,'extractedvertices','vertices extracted from the model');
++			fielddisplay(obj,'extractedelements','elements extracted from the model'); 
++		end % }}}
++		function createxml(obj,fid) % {{{
++			fprintf(fid, '<!-- #D surface Mesh -->\n');
++
++			%elements and vertices
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Elements and vertices">','<section name="mesh" />');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="numberofelements" type="',class(obj.numberofelements),'" default="',convert2str(obj.numberofelements),'">','     <section name="mesh" />','     <help> number of elements </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="numberofvertices" type="',class(obj.numberofvertices),'" default="',convert2str(obj.numberofvertices),'">','     <section name="mesh" />','     <help> number of vertices </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n','  <parameter key ="elements" type="',class(obj.elements),'" default="',convert2str(obj.elements),'">','     <section name="mesh" />','     <help> vertex indices of the mesh elements </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="x" type="',class(obj.x),'" default="',convert2str(obj.x),'">','     <section name="mesh" />','     <help> vertices x coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="y" type="',class(obj.y),'" default="',convert2str(obj.y),'">','     <section name="mesh" />','     <help> vertices y coordinate [m] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="edges" type="',class(obj.edges),'" default="',convert2str(obj.edges),'">','     <section name="mesh" />','     <help> edges of the 2d mesh (vertex1 vertex2 element1 element2) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="numberofedges" type="',class(obj.numberofedges),'" default="',convert2str(obj.numberofedges),'">','     <section name="mesh" />','     <help> number of edges of the 2d mesh </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++
++			% properties
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="2" label="Properties">','<section name="mesh" />');             
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexonboundary" type="',class(obj.vertexonboundary),'" default="',convert2str(obj.vertexonboundary),'">','     <section name="mesh" />','     <help> vertices on the boundary of the domain flag list </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="segments" type="',class(obj.segments),'" default="',convert2str(obj.segments),'">','     <section name="mesh" />','     <help> edges on domain boundary (vertex1 vertex2 element) </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="segmentmarkers" type="',class(obj.segmentmarkers),'" default="',convert2str(obj.segmentmarkers),'">','     <section name="mesh" />','     <help> number associated to each segment </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="vertexconnectivity" type="',class(obj.vertexconnectivity),'" default="',convert2str(obj.vertexconnectivity),'">','     <section name="mesh" />','     <help> list of vertices connected to vertex_i </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="elementconnectivity" type="',class(obj.elementconnectivity),'" default="',convert2str(obj.elementconnectivity),'">','     <section name="mesh" />','     <help> list of vertices connected to element_i </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="average_vertex_connectivity" type="',class(obj.average_vertex_connectivity),'" default="',convert2str(obj.average_vertex_connectivity),'">','     <section name="mesh" />','     <help> average number of vertices connected to one vertex </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++
++			%extracted model
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="3" label="Extracted Model">','<section name="mesh" />'); 
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedvertices" type="',class(obj.extractedvertices),'" default="',convert2str(obj.extractedvertices),'">','     <section name="mesh" />','     <help> vertices extracted from the model </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="extractedelements" type="',class(obj.extractedelements),'" default="',convert2str(obj.extractedelements),'">','     <section name="mesh" />','     <help> elements extracted from the model </help>','  </parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++
++			%projection
++			fprintf(fid,'%s\n%s\n%s\n','<frame key="4" label="Projection">','<section name="mesh" />'); 
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="lat" type="',class(obj.lat),'" default="',convert2str(obj.lat),'">','     <section name="mesh" />','     <help> vertices latitude [degrees] </help>','  </parameter>');
++			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','  <parameter key ="long" type="',class(obj.long),'" default="',convert2str(obj.long),'">','     <section name="mesh" />','     <help> verticies longitude [degrees] </help>','  </parameter>');
++			% choice (epsg) 'n' or 's'
++			fprintf(fid,'%s\n%s\n%s\n','  <parameter key ="epsg" type="alternative" optional="false">','     <section name="mesh" />','     <help> Indicate epsg ''n'' or ''s'' </help>');
++			fprintf(fid,'%s\n','       <option value="n" type="string" default="true"> </option>');
++			fprintf(fid,'%s\n','       <option value="s" type="string" default="false"> </option>');
++			fprintf(fid,'%s\n','  </parameter>');
++			fprintf(fid,'%s\n%s\n','</frame>');
++
++		end % }}}
++		function marshall(obj,md,fid) % {{{
++			WriteData(fid,'enum',DomainTypeEnum(),'data',StringToEnum(['Domain' domaintype(obj)]),'format','Integer');
++			WriteData(fid,'enum',DomainDimensionEnum(),'data',dimension(obj),'format','Integer');
++			WriteData(fid,'enum',MeshElementtypeEnum(),'data',StringToEnum(elementtype(obj)),'format','Integer');
++			WriteData(fid,'object',obj,'class','mesh','fieldname','x','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'class','mesh','fieldname','y','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'class','mesh','fieldname','z','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'class','mesh','fieldname','lat','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'class','mesh','fieldname','long','format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'class','mesh','fieldname','r','format','DoubleMat','mattype',1);
++			WriteData(fid,'enum',MeshZEnum(),'data',zeros(obj.numberofvertices,1),'format','DoubleMat','mattype',1);
++			WriteData(fid,'object',obj,'class','mesh','fieldname','elements','format','DoubleMat','mattype',2);
++			WriteData(fid,'object',obj,'class','mesh','fieldname','numberofelements','format','Integer');
++			WriteData(fid,'object',obj,'class','mesh','fieldname','numberofvertices','format','Integer');
++			WriteData(fid,'object',obj,'class','mesh','fieldname','average_vertex_connectivity','format','Integer');
++			WriteData(fid,'object',obj,'class','mesh','fieldname','vertexonboundary','format','DoubleMat','mattype',1);
++		end % }}}
++		function t = domaintype(obj) % {{{
++			t = '3Dsurface';
++		end % }}}
++		function d = dimension(obj) % {{{
++			d = 2;
++		end % }}}
++		function s = elementtype(obj) % {{{
++			s = 'Tria';
++		end % }}}
++		function [x y z elements is2d isplanet] = processmesh(self,options) % {{{
++
++			isplanet = 1;
++			is2d     = 0;
++
++			elements = self.elements;
++			x        = self.x;
++			y        = self.y;
++			z        = self.z;
++		end % }}}
++	end
++end
Index: /issm/oecreview/Archive/18296-19100/ISSM-19076-19077.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19076-19077.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19076-19077.diff	(revision 19102)
@@ -0,0 +1,31 @@
+Index: ../trunk-jpl/src/m/mesh/bamg.m
+===================================================================
+--- ../trunk-jpl/src/m/mesh/bamg.m	(revision 19076)
++++ ../trunk-jpl/src/m/mesh/bamg.m	(revision 19077)
+@@ -348,7 +348,25 @@
+ 
+ 	%Now, build the connectivity tables for this mesh.
+ 	md.mesh.vertexonboundary=zeros(md.mesh.numberofvertices,1); md.mesh.vertexonboundary(md.mesh.segments(:,1:2))=1;
+-else
++
++elseif getfieldvalue(options,'3dsurface',0),
++	
++	md.mesh=mesh3dsurface();
++	md.mesh.x=bamgmesh_out.Vertices(:,1);
++	md.mesh.y=bamgmesh_out.Vertices(:,2);
++	md.mesh.z=md.mesh.x; md.mesh.z(:)=0;
++	md.mesh.elements=bamgmesh_out.Triangles(:,1:3);
++	md.mesh.edges=bamgmesh_out.IssmEdges;
++	md.mesh.segments=bamgmesh_out.IssmSegments(:,1:3);
++	md.mesh.segmentmarkers=bamgmesh_out.IssmSegments(:,4);
++
++	%Fill in rest of fields:
++	md.mesh.numberofelements=size(md.mesh.elements,1);
++	md.mesh.numberofvertices=length(md.mesh.x);
++	md.mesh.numberofedges=size(md.mesh.edges,1);
++	md.mesh.vertexonboundary=zeros(md.mesh.numberofvertices,1); md.mesh.vertexonboundary(md.mesh.segments(:,1:2))=1;
++
++else 
+ 	md.mesh=mesh2d();
+ 	md.mesh.x=bamgmesh_out.Vertices(:,1);
+ 	md.mesh.y=bamgmesh_out.Vertices(:,2);
Index: /issm/oecreview/Archive/18296-19100/ISSM-19077-19078.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19077-19078.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19077-19078.diff	(revision 19102)
@@ -0,0 +1,20 @@
+Index: ../trunk-jpl/src/m/contrib/hack/resultstomatrix.m
+===================================================================
+--- ../trunk-jpl/src/m/contrib/hack/resultstomatrix.m	(revision 19077)
++++ ../trunk-jpl/src/m/contrib/hack/resultstomatrix.m	(revision 19078)
+@@ -48,6 +48,7 @@
+ 
+ 	newtime=getfieldvalue(options,'time',[]);
+ 	newmatrix=zeros(nods+1,length(newtime));
++	newmatrix(end,:)=newtime;
+ 	if ~isempty(newtime),
+ 		%we are asked to reinterpolate to this new time: 
+ 
+@@ -57,7 +58,6 @@
+ 			ts=resample(ts,newtime);
+ 			warning on;
+ 			newmatrix(i,:)=ts.Data;
+-			newmatrix(end,:)=ts.Time;
+ 		end
+ 
+ 		matrix=newmatrix;
Index: /issm/oecreview/Archive/18296-19100/ISSM-19078-19079.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19078-19079.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19078-19079.diff	(revision 19102)
@@ -0,0 +1,16 @@
+Index: ../trunk-jpl/src/m/contrib/hack/resultstomatrix.m
+===================================================================
+--- ../trunk-jpl/src/m/contrib/hack/resultstomatrix.m	(revision 19078)
++++ ../trunk-jpl/src/m/contrib/hack/resultstomatrix.m	(revision 19079)
+@@ -47,9 +47,9 @@
+ 	end
+ 
+ 	newtime=getfieldvalue(options,'time',[]);
+-	newmatrix=zeros(nods+1,length(newtime));
+-	newmatrix(end,:)=newtime;
+ 	if ~isempty(newtime),
++		newmatrix=zeros(nods+1,length(newtime));
++		newmatrix(end,:)=newtime;
+ 		%we are asked to reinterpolate to this new time: 
+ 
+ 		for i=1:nods,
Index: /issm/oecreview/Archive/18296-19100/ISSM-19079-19080.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19079-19080.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19079-19080.diff	(revision 19102)
@@ -0,0 +1,293 @@
+Index: ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.m
+===================================================================
+--- ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.m	(revision 19079)
++++ ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.m	(revision 19080)
+@@ -1,4 +1,3 @@
+-
+ function export_netCDF(md,filename)	
+ 	
+ %Now going on Real treatment
+@@ -14,8 +13,8 @@
+ 	  end
+   end
+ 	%open file and write description
+-	mode = netcdf.getConstant('NETCDF4');
+-	mode = bitor(mode,netcdf.getConstant('NOCLOBBER'));%NOCLOBBER to avoid overwrite
++	mode = netcdf.getConstant('NC_NETCDF4');
++	mode = bitor(mode,netcdf.getConstant('NC_NOCLOBBER'));%NOCLOBBER to avoid overwrite
+ 	ncid = netcdf.create(filename,mode);
+ 	netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'Title',['Results for run ' md.miscellaneous.name]);
+ 	netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'Date',['Created ' datestr(now)]);
+@@ -32,6 +31,9 @@
+ 	DimSize(1).index=netcdf.defDim(ncid,'EltNum',md.mesh.numberofelements);
+ 	DimSize(2).index=netcdf.defDim(ncid,'VertNum',md.mesh.numberofvertices);
+ 	DimSize(3).index=netcdf.defDim(ncid,'VertperElt',size(md.mesh.elements,2));
++	DimSize(4).index=netcdf.defDim(ncid,'Time',StepNum);
++	DimSize(5).index=netcdf.defDim(ncid,'StringLength',20);
++	DimSize(6).index=netcdf.defDim(ncid,'StructLength',2);
+ 	
+ 	for i=1:length(DimSize),
+ 		[DimSize(i).name,DimSize(i).value]=netcdf.inqDim(ncid,DimSize(i).index);
+@@ -44,38 +46,36 @@
+ 	%get all model classes and create respective groups
+ 	groups=fieldnames(md);
+ 	for i=1:length(groups),
+-		%disp(sprintf('group name in tree %s ',groups{i}));
++		disp(sprintf('group name in tree %s ',groups{i}));
+ 		groupID=netcdf.defGrp(ncid,groups{i});
+ 		%In each group gather the fields of the class
+ 		groupfields=fields(md.(groups{i}));
+ 		%Special treatment for the results
+ 		if strcmp(groups(i),'results'),
+ 			for j=1:length(groupfields)%looping on the different solutions
+-				%disp(sprintf('=====Field name in tree %s ',groupfields{j}));
++																 %disp(sprintf('=====Field name in tree %s ',groupfields{j}));
+ 				if length(md.results.(groupfields{j}))>1,
+ 					%the solution have several timestep get last timesteps and output frequency
+ 					last_step = length(md.results.(groupfields{j}));
+-					step_freq = md.settings.output_frequency;
+ 					%grab first time step
+ 					subfields=fields(md.results.(groupfields{j})(1));
+ 					for k=1:length(subfields),
+ 						netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype','results');
+ 						if ~strcmp(subfields(k),'errlog') && ~strcmp(subfields(k),'outlog') && ~strcmp(subfields(k),'SolutionType'),
+-							disp(sprintf('==========SubField name in tree %s ',subfields{k}));
+-							Var=md.results.(groupfields{1})(1).(subfields{k});
+-							[truc,DimSize,DimValue]=DefCreateVar(ncid,Var,groupID,subfields{k},DimSize,DimValue);
+-							%CreateVar(Var,True,last_step,step_freq)
++							%disp(sprintf('==========SubField name in tree %s ',subfields{k}));
++							Var=md.results.(groupfields{j})(1).(subfields{k});
++							[DimSize,DimValue]=DefCreateVar(ncid,Var,groupID,subfields{k},DimSize,DimValue,true,last_step,md,groupfields{j});
+ 			      end
+ 		      end
+ 				elseif length(md.results.(groupfields{j}))==1,
+ 					%only one timestep
+ 					subfields=fields(md.results.(groupfields{j}));
+ 					for k=1:length(subfields),
+-						disp(sprintf('==========SubField name in tree %s ',subfields{k}));
+-						netcdf.putAtt(groupID,netcdf.getConstant('GLOBAL'),'classtype','results');
++						%disp(sprintf('==========SubField name in tree %s ',subfields{k}));
++						netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype','results');
+ 						if ~strcmp(subfields(k),'errlog') && ~strcmp(subfields(k),'outlog') && ~strcmp(subfields(k),'SolutionType'),
+ 							Var=md.results.(groupfields{1})(1).(subfields{k});
+-							[truc,DimSize,DimValue]=DefCreateVar(ncid,Var,groupID,subfields{k},DimSize,DimValue);
++							[DimSize,DimValue]=DefCreateVar(ncid,Var,groupID,subfields{k},DimSize,DimValue,false);
+ 			      end
+ 		      end
+ 				else
+@@ -84,17 +84,17 @@
+ 	    end
+ 		else
+ 			for j=1:length(groupfields),
+-				disp(sprintf('=====Field name in tree %s ',groupfields{j}));
+-				netcdf.putAtt(groupID,netcdf.getConstant('GLOBAL'),'classtype',class(md.(groups{i})));
++				%disp(sprintf('=====Field name in tree %s ',groupfields{j}));
++				netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype',class(md.(groups{i})));
+ 				Var=md.(groups{i}).(groupfields{j});
+-				[truc,DimSize,DimValue]=DefCreateVar(ncid,Var,groupID,groupfields{j},DimSize,DimValue);
++				[DimSize,DimValue]=DefCreateVar(ncid,Var,groupID,groupfields{j},DimSize,DimValue,false);
+ 	    end
+ 	  end	
+   end
+ 	netcdf.close(ncid);
+ end
+ 
+-function [varclass,DimSize,DimValue]=DefCreateVar(ncid,Var,groupID,field,DimSize,DimValue)
++function [DimSize,DimValue]=DefCreateVar(ncid,Var,groupID,field,DimSize,DimValue,istime,last,md,midfield)
+ 	varclass=class(Var);
+ 	varsize=size(Var);
+ 	varlength=length(Var);
+@@ -104,48 +104,133 @@
+ 		else,
+ 			LogicString='False';
+   	end
+-		netcdf.putAtt(groupID,netcdf.getConstant('GLOBAL'),field,LogicString);
++		netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),field,LogicString);
+ 	elseif isa(Var,'char'),
+-		netcdf.putAtt(groupID,netcdf.getConstant('GLOBAL'),field,Var);
++		netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),field,Var);
+ 	elseif isa(Var,'double'), %dealing with arrays
+-		[dims,DimSize,DimValue]=GetDims(ncid,Var,groupID,field,DimSize,DimValue);
+- 		varid = netcdf.defVar(groupID,field,'double',dims);
+-		if length(Var)==0,
+-			netcdf.putVar(groupID,varid,NaN);
++		[dims,DimSize,DimValue]=GetDims(ncid,Var,groupID,field,DimSize,DimValue,istime);
++ 		varid = netcdf.defVar(groupID,field,'NC_DOUBLE',dims);
++		if istime,
++			VarTab=Var;
++			for i=2:last,
++				TimeVar=md.results.(midfield)(i).(field);
++				VarTab=[VarTab TimeVar];
++	    end
++			netcdf.putVar(groupID,varid,VarTab);
+ 		else
+-			netcdf.putVar(groupID,varid,Var);
+-  	end
++			if length(Var)==0,
++				netcdf.putVar(groupID,varid,NaN);
++			else
++				netcdf.putVar(groupID,varid,Var);
++	    end
++	  end
+ 	elseif isa(Var,'cell'),
+-		disp(sprintf('no support for class %s for field %s so far',varclass,field));
++		[dims,DimSize,DimValue]=GetDims(ncid,Var,groupID,field,DimSize,DimValue,istime);
++		%dirty hack to be able to pass strings
++		varid = netcdf.defVar(groupID,field,'NC_CHAR',dims);
++		for i=1:length(Var),
++			startpoint=zeros(size(Var));
++			startpoint(:,i)=i-1;
++			if length(Var)>1,
++				endpoint=[min(length(Var{i}),20) 1];
++			else
++				endpoint=min(length(Var{i}),20);
++	    end
++			if length(Var{i})>20,
++				netcdf.putVar(groupID,varid,startpoint,endpoint,Var{i}(1:20))
++			else
++				netcdf.putVar(groupID,varid,startpoint,endpoint,Var{i})
++	    end
++	  end
+ 	elseif isa(Var,'struct'),
+-		disp(sprintf('no support for class %s for field %s so far',varclass,field));
++		%Start by getting the structure fields and size
++		locfields=fields(Var);
++		[dims,DimSize,DimValue]=GetDims(ncid,Var,groupID,locfields,DimSize,DimValue,istime);
++		varid = netcdf.defVar(groupID,field,'NC_CHAR',dims);
++		for i=1:length(locfields),
++			for j=1:2,
++				if j==1,
++					startpoint=[0,0,i-1];
++					CharVar=locfields{i};
++				else
++					startpoint=[0,1,i-1];
++					if isa(Var.(locfields{i}),'char'),
++						CharVar=Var.(locfields{i});
++					else
++						CharVar=num2str(Var.(locfields{i}));
++		      end
++		    end
++				endpoint=[min(length(CharVar),20),1,1];
++				if length(CharVar)>20,
++					netcdf.putVar(groupID,varid,startpoint,endpoint,CharVar(1:20))
++				else
++					netcdf.putVar(groupID,varid,startpoint,endpoint,CharVar)
++		    end
++	    end
++	  end
+ 	else
+ 		disp(sprintf('no support for class %s of field %s',varclass,field));
+   end
+ 	return
+ end
+ 
+-function [dims,DimSize,DimValue]=GetDims(ncid,Var,groupID,field,DimSize,DimValue)
++function [dims,DimSize,DimValue]=GetDims(ncid,Var,groupID,field,DimSize,DimValue,istime)
+ 	dims=[];
+-	varlength=length(Var);
+-	varsize=size(Var);
+-	MatOrVec=varsize>1; %checking if we have a matrix (1 1) are vector (1 0)
+-	for i=1:sum(MatOrVec), %loop on the number of (non 1) dimensions
+-		currentdim=varsize(i);
+-		dimexist=DimValue==currentdim;
+-		if sum(dimexist)==0, %dimension is new to us, need to create it
+-			dimname=strcat(field,int2str(i));
+-			dimindex=length(DimSize)+1;
+-			DimSize(dimindex).index=netcdf.defDim(ncid,dimname,currentdim);
+-			[DimSize(dimindex).name,DimSize(dimindex).value]=netcdf.inqDim(ncid,DimSize(dimindex).index);
++	%specific treatment for structures
++	if isa(Var,'struct')
++		varsize=size(field); %we pass here the fields of the current structure
++		MatOrVec=varsize>1; %checking if we have a matrix (1 1) or vector (1 0)
++		for i=1:sum(MatOrVec), %loop on the number of (non 1) dimensions
++			currentdim=varsize(i);
++			dimexist=DimValue==currentdim;
++			if sum(dimexist)==0, %dimension is new to us, need to create it
++				dimname=strcat(field{1},int2str(i));
++				dimindex=length(DimSize)+1;
++				DimSize(dimindex).index=netcdf.defDim(ncid,dimname,currentdim);
++				[DimSize(dimindex).name,DimSize(dimindex).value]=netcdf.inqDim(ncid,DimSize(dimindex).index);
++				dims(i)=DimSize(dimindex).index;
++				DimValue(dimindex)=currentdim;
++			else
++				dimindex=find(dimexist);
++				if DimSize(dimindex).value~=currentdim,
++					error('Indexation problem with the dimension structure')
++		    end
++	    end
+ 			dims(i)=DimSize(dimindex).index;
+-			DimValue(dimindex)=currentdim;
++	  end
++		dims=[DimSize(6).index dims];
++	else
++		%with a cell array need to grab the transposed size to work
++		if isa(Var,'cell'),
++			varsize=size(Var');
+ 		else
+-			dimindex=find(dimexist);
+-			if DimSize(dimindex).value~=currentdim,
+-				error('Indexation problem with the dimension structure')
+-  	  end
+-	  end
+-		dims(i)=DimSize(dimindex).index;
++			varsize=size(Var);
++    end
++		MatOrVec=varsize>1; %checking if we have a matrix (1 1) or vector (1 0)
++		for i=1:sum(MatOrVec), %loop on the number of (non 1) dimensions
++			currentdim=varsize(i);
++			dimexist=DimValue==currentdim;
++			if sum(dimexist)==0, %dimension is new to us, need to create it
++				dimname=strcat(field,int2str(i));
++				dimindex=length(DimSize)+1;
++				DimSize(dimindex).index=netcdf.defDim(ncid,dimname,currentdim);
++				[DimSize(dimindex).name,DimSize(dimindex).value]=netcdf.inqDim(ncid,DimSize(dimindex).index);
++				dims(i)=DimSize(dimindex).index;
++				DimValue(dimindex)=currentdim;
++			else
++				dimindex=find(dimexist);
++				if DimSize(dimindex).value~=currentdim,
++					error('Indexation problem with the dimension structure')
++		    end
++	    end
++			dims(i)=DimSize(dimindex).index;
++    end
+   end
++	if istime,
++		dims=[dims DimSize(4).index];%adding the time dimension if necessary
++  end
++	%if we have a cell variable we need to add a stringlength dimension 
++	if isa(Var,'cell') || isa(Var,'struct'),
++		dims=[DimSize(5).index dims];
++  end
+ end
+Index: ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py
+===================================================================
+--- ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py	(revision 19079)
++++ ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py	(revision 19080)
+@@ -87,8 +87,9 @@
+ 				for time in range(freq-1,last,freq):
+ 					if time!=0:
+ 						timevar=md.results.__dict__[supfield].__getitem__(time).__dict__[field]
+-#						print 'Treating '+str(group)+'.'+str(supfield)+'.'+str(field)+' for time '+str(time)
++						print 'Treating '+str(group)+'.'+str(supfield)+'.'+str(field)+' for time '+str(time)
+ 						vartab=numpy.column_stack((vartab,timevar))
++				print numpy.shape(vartab)
+ 				try:
+ 					ncvar[:,:]=vartab[:,:]
+ 				except ValueError:
+@@ -128,10 +129,14 @@
+ 	EltNum=NCData.createDimension('EltNum',md.mesh.numberofelements)
+ 	VertNum=NCData.createDimension('VertNum',md.mesh.numberofvertices)
+ 	VertperElt=NCData.createDimension('VertperElt',numpy.shape(md.mesh.elements)[1])
++	Time=NCData.createDimension('Time',StepNum)
++	DictDim=NCData.createDimension('DictDim',2) 
+ 
+ 	DimDict = {len(EltNum):'EltNum',
+ 						 len(VertNum):'VertNum',
+-						 len(VertperElt):'VertperElt'}
++						 len(VertperElt):'VertperElt',
++						 len(Time):'Time',
++						 len(DictDim):'DictDim'}
+ 
+ 	TypeDict = {float:'f8',
+ 							'float64':'f8',
Index: /issm/oecreview/Archive/18296-19100/ISSM-19080-19081.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19080-19081.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19080-19081.diff	(revision 19102)
@@ -0,0 +1,18 @@
+Index: ../trunk-jpl/src/m/classes/clusters/generic.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/clusters/generic.m	(revision 19080)
++++ ../trunk-jpl/src/m/classes/clusters/generic.m	(revision 19081)
+@@ -43,6 +43,13 @@
+         end % }}}
+ 		function cluster=generic(varargin) % {{{
+ 
++			%Change the defaults if ispc
++			if ispc,
++				cluster.codepath      = [issmdir() '\bin'];
++				cluster.etcpath       = [issmdir() '\etc'];
++				cluster.executionpath = [issmdir() '\execution'];
++			end
++
+ 			%use provided options to change fields
+ 			options=pairoptions(varargin{:});
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-19081-19082.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19081-19082.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19081-19082.diff	(revision 19102)
@@ -0,0 +1,22 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19081)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19082)
+@@ -722,8 +722,15 @@
+ 			for(j=0;j<numnodes;j++){
+ 				/*Increase of the domain is on the downstream node in term of sediment head*/
+ 				if(sedhead[j] == sedheadmin){
+-					if(old_active[j]==0) eplzigzag_counter[basalelement->nodes[j]->Lid()] ++;
+-					vec_mask->SetValue(basalelement->nodes[j]->Sid(),1.,INS_VAL);
++					if(old_active[j]==0) {
++						eplzigzag_counter[basalelement->nodes[j]->Lid()] ++;
++						if(eplzigzag_counter[basalelement->nodes[i]->Lid()]<eplflip_lock |eplflip_lock==0){
++							vec_mask->SetValue(basalelement->nodes[j]->Sid(),1.,INS_VAL);
++						}
++						else{
++							vec_mask->SetValue(basalelement->nodes[j]->Sid(),0.,INS_VAL);
++						}
++					}
+ 				}
+ 			}
+ 		}
Index: /issm/oecreview/Archive/18296-19100/ISSM-19082-19083.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19082-19083.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19082-19083.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/plot/plot_tensor_principalaxis.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/plot_tensor_principalaxis.m	(revision 19082)
++++ ../trunk-jpl/src/m/plot/plot_tensor_principalaxis.m	(revision 19083)
+@@ -28,7 +28,7 @@
+ 
+ %take the center of each element if ~isonnode
+ if datatype==1,
+-	x=mean(md.mesh.x(md.mesh.elements'))'; y=mean(md.mesh.y(md.mesh.elements'))'; z=mean(md.mesh.z(md.mesh.elements'))';
++	x=mean(x(elements'))'; y=mean(y(elements'))'; z=mean(z(elements'))';
+ end
+ 
+ %plot quivers
Index: /issm/oecreview/Archive/18296-19100/ISSM-19083-19084.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19083-19084.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19083-19084.diff	(revision 19102)
@@ -0,0 +1,25 @@
+Index: ../trunk-jpl/src/m/plot/processdata.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/processdata.m	(revision 19083)
++++ ../trunk-jpl/src/m/plot/processdata.m	(revision 19084)
+@@ -188,6 +188,20 @@
+ 	data(1:density:end,:)=databak(1:density:end,:);
+ 	clear databak
+ end
++if datatype==3,
++	%Mask?
++	if exist(options,'mask'),
++		flags=getfieldvalue(options,'mask');
++		pos=find(~flags);
++		if length(flags)==md.mesh.numberofvertices,
++			data(pos,:)=NaN;
++		elseif length(flags)==md.mesh.numberofelements
++			data(md.mesh.elements(pos,:),:)=NaN;
++		else
++			disp('plotmodel warning: mask length not supported yet (supported length are md.mesh.numberofvertices and md.mesh.numberofelements');
++		end
++	end
++end
+ 
+ %OK, if datatype=0 error out
+ if datatype==0,
Index: /issm/oecreview/Archive/18296-19100/ISSM-19084-19085.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19084-19085.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19084-19085.diff	(revision 19102)
@@ -0,0 +1,31 @@
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 19084)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 19085)
+@@ -358,20 +358,16 @@
+ 
+ 		/*Get Eigen values*/
+ 		Matrix2x2Eigen(&lambda1,&lambda2,&ex,&ey,epsilon[0],epsilon[2],epsilon[1]);
+-
+-		/*Process Eigen values*/
+-		lambda1>0? lambda1 = pow(lambda1,.3) : lambda1=0.;
+-		lambda2>0? lambda2 = pow(lambda2,.3) : lambda2=0.;
+-		lambda1 = lambda1*5.e-2;
+-		lambda2 = lambda2*5.e-2;
+ 		_assert_(!xIsNan<IssmDouble>(lambda1));
+ 		_assert_(!xIsNan<IssmDouble>(lambda2));
+ 
++		/*Process Eigen values (only account for extension)*/
++		lambda1 = max(lambda1,0.);
++		lambda2 = max(lambda2,0.);
++
+ 		/*Assign values*/
+-		//calvingratex[iv]=ex*lambda1 - ey*lambda2;
+-		//calvingratey[iv]=ey*lambda1 + ex*lambda2;
+-		calvingratex[iv]=vx/vel*(lambda1 + lambda2);
+-		calvingratey[iv]=vy/vel*(lambda1 + lambda2);
++		calvingratex[iv]=vx*pow(lambda1 + lambda2,1./3.)*3.e+2;
++		calvingratey[iv]=vy*pow(lambda1 + lambda2,1./3.)*3.e+2;
+ 		calvingrate[iv]=sqrt(calvingratex[iv]*calvingratex[iv] + calvingratey[iv]*calvingratey[iv]);
+ 	}
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-19085-19086.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19085-19086.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19085-19086.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/src/m/plot/manualcb.m
+===================================================================
+--- ../trunk-jpl/src/m/plot/manualcb.m	(revision 19085)
++++ ../trunk-jpl/src/m/plot/manualcb.m	(revision 19086)
+@@ -101,7 +101,7 @@
+ end
+ 
+ if exist(options,'title'),
+-	title(getfieldvalue(options,'title'),'FontSize',fontsize);
++	title(getfieldvalue(options,'title'),'FontSize',getfieldvalue(options,'titlefontsize',fontsize));
+ end
+ if exist(options,'ylabel'),
+ 	if strcmpi(getfieldvalue(options,'orientation','vertical'),'horizontal'),
Index: /issm/oecreview/Archive/18296-19100/ISSM-19086-19087.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19086-19087.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19086-19087.diff	(revision 19102)
@@ -0,0 +1,2725 @@
+Index: ../trunk-jpl/src/c/analyses/SeaiceAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SeaiceAnalysis.h	(revision 19086)
++++ ../trunk-jpl/src/c/analyses/SeaiceAnalysis.h	(revision 19087)
+@@ -1,38 +0,0 @@
+-/*! \file SeaiceAnalysis.h 
+- *  \brief: header file for generic external result object
+- */
+-
+-#ifndef _SeaiceAnalysis_
+-#define _SeaiceAnalysis_
+-
+-/*Headers*/
+-#include "./Analysis.h"
+-
+-class SeaiceAnalysis: public Analysis{
+-
+-	public:
+-		/*Model processing*/
+-		void CreateConstraints(Constraints* constraints,IoModel* iomodel);
+-		void CreateLoads(Loads* loads, IoModel* iomodel);
+-		void CreateNodes(Nodes* nodes,IoModel* iomodel);
+-		int  DofsPerNode(int** doflist,int domaintype,int approximation);
+-		void UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+-		void UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum);
+-
+-		/*Finite element Analysis*/
+-		void           Core(FemModel* femmodel);
+-		void           CreateCTensor(IssmDouble* C,Element* element,Gauss* gauss);
+-		ElementVector* CreateDVector(Element* element);
+-		ElementMatrix* CreateJacobianMatrix(Element* element);
+-		ElementMatrix* CreateKMatrix(Element* element);
+-		ElementVector* CreatePVector(Element* element);
+-		void           GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void           GetM(IssmDouble* M,Element* element,IssmDouble* xyz_list,Gauss* gauss);
+-		void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
+-		void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
+-		void           InputUpdateFromSolution(IssmDouble* solution,Element* element);
+-		void           PostProcess(FemModel* femmodel);
+-		void           UpdateConstraints(FemModel* femmodel);
+-		void           UpdateDamageAndStress(FemModel* femmodel);
+-};
+-#endif
+Index: ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 19086)
++++ ../trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp	(revision 19087)
+@@ -1,769 +0,0 @@
+-#include "./SeaiceAnalysis.h"
+-#include "../toolkits/toolkits.h"
+-#include "../classes/classes.h"
+-#include "../shared/shared.h"
+-#include "../modules/modules.h"
+-
+-/*Model processing*/
+-void SeaiceAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
+-
+-	const int finiteelement = P1Enum;
+-	IoModelToConstraintsx(constraints,iomodel,SeaiceSpcvxEnum,SeaiceAnalysisEnum,finiteelement,0);
+-	IoModelToConstraintsx(constraints,iomodel,SeaiceSpcvyEnum,SeaiceAnalysisEnum,finiteelement,1);
+-}/*}}}*/
+-void SeaiceAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/
+-	return;
+-}/*}}}*/
+-void SeaiceAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
+-
+-	::CreateNodes(nodes,iomodel,SeaiceAnalysisEnum,P1Enum);
+-
+-}/*}}}*/
+-int  SeaiceAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
+-	return 2;
+-}/*}}}*/
+-void SeaiceAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+-
+-	/*Make sure we are in 2D horizontal*/
+-	if(iomodel->domaintype!=Domain2DhorizontalEnum) _error_("Only 2D model are supported");
+-
+-	/*Update the elements so that they are aware of this analysis*/
+-	int counter=0;
+-	for(int i=0;i<iomodel->numberofelements;i++){
+-		if(iomodel->my_elements[i]){
+-			Element* element=(Element*)elements->GetObjectByOffset(counter);
+-			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+-			counter++;
+-		}
+-	}
+-
+-	/*Push to the elements all the inputs that we need*/
+-	iomodel->FetchDataToInput(elements,SeaiceThicknessEnum);
+-	iomodel->FetchDataToInput(elements,SeaiceConcentrationEnum);
+-	iomodel->FetchDataToInput(elements,BasalforcingsOceanSshEnum);
+-	iomodel->FetchDataToInput(elements,BasalforcingsOceanVxEnum);
+-	iomodel->FetchDataToInput(elements,BasalforcingsOceanVyEnum);
+-	iomodel->FetchDataToInput(elements,SurfaceforcingsWindVxEnum);
+-	iomodel->FetchDataToInput(elements,SurfaceforcingsWindVyEnum);
+-	iomodel->FetchDataToInput(elements,DamageEnum);
+-	iomodel->FetchDataToInput(elements,VxStarEnum);
+-	iomodel->FetchDataToInput(elements,VyStarEnum);
+-	iomodel->FetchDataToInput(elements,VxEnum);
+-	iomodel->FetchDataToInput(elements,VyEnum);
+-	iomodel->FetchDataToInput(elements,SeaiceCoriolisFactorEnum);
+-	iomodel->FetchDataToInput(elements,StressTensorPredictorxxEnum);
+-	iomodel->FetchDataToInput(elements,StressTensorPredictoryyEnum);
+-	iomodel->FetchDataToInput(elements,StressTensorPredictorxyEnum);
+-	iomodel->FetchDataToInput(elements,MeshXEnum);
+-	iomodel->FetchDataToInput(elements,MeshYEnum);
+-}/*}}}*/
+-void SeaiceAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+-	parameters->AddObject(iomodel->CopyConstantObject(SeaiceMinConcentrationEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(SeaiceMinThicknessEnum));
+-	parameters->AddObject(iomodel->CopyConstantObject(SeaiceMaxThicknessEnum));
+-}/*}}}*/
+-
+-/*Finite Element Analysis*/
+-void           SeaiceAnalysis::Core(FemModel* femmodel){/*{{{*/
+-	_error_("not implemented");
+-}/*}}}*/
+-ElementVector* SeaiceAnalysis::CreateDVector(Element* element){/*{{{*/
+-	/*Default, return NULL*/
+-	return NULL;
+-}/*}}}*/
+-ElementMatrix* SeaiceAnalysis::CreateJacobianMatrix(Element* element){/*{{{*/
+-_error_("Not implemented");
+-}/*}}}*/
+-ElementMatrix* SeaiceAnalysis::CreateKMatrix(Element* element){/*{{{*/
+-
+-	/* Check if there is ice in this element */
+-	Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input);
+-	IssmDouble c_min; element->FindParam(&c_min,SeaiceMinConcentrationEnum);
+-	if(concentration_input->Max()<=c_min) return NULL;
+-
+-	/*Intermediaries */
+-	IssmDouble  Jdet,D_scalar,dt,thickness,concentration;
+-	IssmDouble  ocean_coef,rho_ocean,ocean_lin_drag_coef,ocean_quad_drag_coef;
+-	IssmDouble  vx,vy,oceanvx,oceanvy,vnorm,ocean_turning_angle;
+-	IssmDouble  C[3][3];
+-	IssmDouble* xyz_list = NULL;
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-	int numdof   = numnodes*2;
+-
+-	/*Initialize Element vector and other vectors*/
+-	ElementMatrix* Ke      = element->NewElementMatrix();
+-	IssmDouble*    B       = xNew<IssmDouble>(3*numdof);
+-	IssmDouble*    M       = xNew<IssmDouble>(numdof);
+-
+-	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinates(&xyz_list);
+-	element->FindParam(&dt,TimesteppingTimeStepEnum);
+-	element->FindParam(&rho_ocean,BasalforcingsRhoOceanEnum);
+-	element->FindParam(&ocean_coef,BasalforcingsOceanCoefEnum);
+-	element->FindParam(&ocean_lin_drag_coef,BasalforcingsOceanLinDragCoefEnum);
+-	element->FindParam(&ocean_quad_drag_coef,BasalforcingsOceanQuadDragCoefEnum);
+-	element->FindParam(&ocean_turning_angle,BasalforcingsOceanTurningAngleEnum);
+-	IssmDouble rho_i                  = element->GetMaterialParameter(MaterialsRhoIceEnum);
+-	IssmDouble time_relaxation_stress = element->GetMaterialParameter(MaterialsTimeRelaxationStressEnum);
+-	Input*     thickness_input = element->GetInput(SeaiceThicknessEnum);       _assert_(thickness_input);
+-	Input*     vx_input        = element->GetInput(VxEnum);                    _assert_(vx_input);
+-	Input*     vy_input        = element->GetInput(VyEnum);                    _assert_(vy_input);
+-	Input*     oceanvx_input   = element->GetInput(BasalforcingsOceanVxEnum);  _assert_(oceanvx_input);
+-	Input*     oceanvy_input   = element->GetInput(BasalforcingsOceanVyEnum);  _assert_(oceanvy_input);
+-
+-	/*Get minimum inertia to avoid 0 in the line, and time_ratio*/
+-	IssmDouble minimum_inertia = rho_i*0.01;
+-	IssmDouble time_ratio=(1-dt/time_relaxation_stress);
+-
+-	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=element->NewGauss(2);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-
+-		gauss->GaussPoint(ig);
+-
+-		/*Get Jacobian Determinant and thickness*/
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		thickness_input->GetInputValue(&thickness,gauss);
+-		concentration_input->GetInputValue(&concentration,gauss);
+-
+-		/*Create first part of the stiffness matrix*/
+-		this->GetM(M,element,xyz_list,gauss);
+-		D_scalar=(rho_i*thickness+minimum_inertia)/dt*gauss->weight*Jdet;
+-		TripleMultiply(M,1,numdof,1,
+-					&D_scalar,1,1,0,
+-					M,1,numdof,0,
+-					&Ke->values[0],1);
+-
+-		/*Create Elastic part*/
+-		this->GetB(B,element,xyz_list,gauss);
+-		this->CreateCTensor(&C[0][0],element,gauss);
+-		for(int i=0;i<3;i++){
+-			for(int j=0;j<3;j++){
+-				C[i][j] = dt*thickness*time_ratio*gauss->weight*Jdet*C[i][j];
+-			}
+-		}
+-		TripleMultiply(B,3,numdof,1,
+-					&C[0][0],3,3,0,
+-					B,3,numdof,0,
+-					&Ke->values[0],1);
+-
+-		/*Create Ocean forcing part*/
+-		oceanvx_input->GetInputValue(&oceanvx,gauss);
+-		oceanvy_input->GetInputValue(&oceanvy,gauss);
+-		vx_input->GetInputValue(&vx,gauss);
+-		vy_input->GetInputValue(&vy,gauss);
+-		vnorm = sqrt(pow(oceanvx-vx,2) + pow(oceanvy-vy,2));
+-		D_scalar = concentration*ocean_coef*rho_ocean*(ocean_lin_drag_coef+ocean_quad_drag_coef*vnorm)*cos(ocean_turning_angle)*gauss->weight*Jdet;
+-		TripleMultiply(M,1,numdof,1,
+-					&D_scalar,1,1,0,
+-					M,1,numdof,0,
+-					&Ke->values[0],1);
+-	}
+-
+-	/*Clean up and return*/
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(B);
+-	xDelete<IssmDouble>(M);
+-	delete gauss;
+-	return Ke;
+-}
+-/*}}}*/
+-ElementVector* SeaiceAnalysis::CreatePVector(Element* element){/*{{{*/
+-
+-	/* Check if there is ice in this element */
+-	Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input);
+-	IssmDouble c_min; element->FindParam(&c_min,SeaiceMinConcentrationEnum);
+-	if(concentration_input->Max()<=c_min) return NULL;
+-
+-	/*Intermediaries */
+-	IssmDouble  air_coef,ocean_coef,constant_part,time_relaxation_stress;
+-	IssmDouble  rho_ice,rho_air,rho_ocean,gravity,omega;
+-	IssmDouble  vx,vy,vxstar,vystar,windvx,windvy,oceanvx,oceanvy,vnorm;
+-	IssmDouble  air_lin_drag_coef,air_quad_drag_coef;
+-	IssmDouble  ocean_lin_drag_coef,ocean_quad_drag_coef;
+-	IssmDouble  concentration,thickness,coriolis_factor,dt,Jdet,D_scalar;
+-	IssmDouble  sigma_xx,sigma_yy,sigma_xy,sigma_vec[3];
+-	IssmDouble  ocean_turning_angle,dssh[2];
+-	IssmDouble* xyz_list = NULL;
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-	int numdof   = 2*numnodes;
+-
+-	/*Initialize Element vector and vectors*/
+-	ElementVector* pe      = element->NewElementVector();
+-	IssmDouble*    B       = xNew<IssmDouble>(3*numdof);
+-	IssmDouble*    basis   = xNew<IssmDouble>(numnodes);
+-	IssmDouble     D[3][3] = {0.};
+-
+-	/*Retrieve all inputs and parameters*/
+-	element->GetVerticesCoordinates(&xyz_list);
+-	element->FindParam(&dt,TimesteppingTimeStepEnum);
+-	element->FindParam(&rho_air,SurfaceforcingsRhoAirEnum);
+-	element->FindParam(&air_coef,SurfaceforcingsAirCoefEnum);
+-	element->FindParam(&air_lin_drag_coef,SurfaceforcingsAirLinDragCoefEnum);
+-	element->FindParam(&air_quad_drag_coef,SurfaceforcingsAirQuadDragCoefEnum);
+-	element->FindParam(&rho_ocean,BasalforcingsRhoOceanEnum);
+-	element->FindParam(&ocean_coef,BasalforcingsOceanCoefEnum);
+-	element->FindParam(&ocean_lin_drag_coef,BasalforcingsOceanLinDragCoefEnum);
+-	element->FindParam(&ocean_quad_drag_coef,BasalforcingsOceanQuadDragCoefEnum);
+-	element->FindParam(&ocean_turning_angle,BasalforcingsOceanTurningAngleEnum);
+-	rho_ice                = element->GetMaterialParameter(MaterialsRhoIceEnum);
+-	gravity                = element->GetMaterialParameter(ConstantsGEnum);
+-	omega                  = element->GetMaterialParameter(ConstantsOmegaEnum);
+-	time_relaxation_stress = element->GetMaterialParameter(MaterialsTimeRelaxationStressEnum);
+-	Input* thickness_input     = element->GetInput(SeaiceThicknessEnum);       _assert_(thickness_input);
+-	Input* coriolis_fact_input = element->GetInput(SeaiceCoriolisFactorEnum);  _assert_(coriolis_fact_input);
+-	Input* vx_input            = element->GetInput(VxEnum);                    _assert_(vx_input);
+-	Input* vy_input            = element->GetInput(VyEnum);                    _assert_(vy_input);
+-	Input* vxstar_input        = element->GetInput(VxStarEnum);                _assert_(vxstar_input);
+-	Input* vystar_input        = element->GetInput(VyStarEnum);                _assert_(vystar_input);
+-	Input* windvx_input        = element->GetInput(SurfaceforcingsWindVxEnum); _assert_(windvx_input);
+-	Input* windvy_input        = element->GetInput(SurfaceforcingsWindVyEnum); _assert_(windvy_input);
+-	Input* oceanvx_input       = element->GetInput(BasalforcingsOceanVxEnum);  _assert_(oceanvx_input);
+-	Input* oceanvy_input       = element->GetInput(BasalforcingsOceanVyEnum);  _assert_(oceanvy_input);
+-	Input* oceanssh_input      = element->GetInput(BasalforcingsOceanSshEnum); _assert_(oceanssh_input);
+-	Input* sigma_xx_input      = element->GetInput(StressTensorxxEnum);        _assert_(sigma_xx_input);
+-	Input* sigma_yy_input      = element->GetInput(StressTensoryyEnum);        _assert_(sigma_yy_input);
+-	Input* sigma_xy_input      = element->GetInput(StressTensorxyEnum);        _assert_(sigma_xy_input);
+-
+-	/*Calculate time_ratio*/
+-	IssmDouble time_ratio=(1-dt/time_relaxation_stress);
+-
+-	/* Start  looping on the number of gaussian points: */
+-	Gauss* gauss=element->NewGauss(2);
+-	for(int ig=gauss->begin();ig<gauss->end();ig++){
+-
+-		gauss->GaussPoint(ig);
+-
+-		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+-		element->NodalFunctions(basis, gauss);
+-		this->GetB(B,element,xyz_list,gauss);
+-
+-		/*Get all inputs on gauss point*/
+-		thickness_input->GetInputValue(&thickness,gauss);
+-		concentration_input->GetInputValue(&concentration,gauss);
+-		coriolis_fact_input->GetInputValue(&coriolis_factor,gauss);
+-		vx_input->GetInputValue(&vx,gauss);
+-		vy_input->GetInputValue(&vy,gauss);
+-		vxstar_input->GetInputValue(&vxstar,gauss);
+-		vystar_input->GetInputValue(&vystar,gauss);
+-		windvx_input->GetInputValue(&windvx,gauss);
+-		windvy_input->GetInputValue(&windvy,gauss);
+-		oceanvx_input->GetInputValue(&oceanvx,gauss);
+-		oceanvy_input->GetInputValue(&oceanvy,gauss);
+-		sigma_xx_input->GetInputValue(&sigma_xx,gauss);
+-		sigma_yy_input->GetInputValue(&sigma_yy,gauss);
+-		sigma_xy_input->GetInputValue(&sigma_xy,gauss);
+-		oceanssh_input->GetInputDerivativeValue(&dssh[0],xyz_list,gauss);
+-
+-		/*Previous speed (finite differencing)*/
+-		for(int i=0;i<numnodes;i++){
+-			pe->values[i*2+0]+=Jdet*gauss->weight*rho_ice*thickness*vx*basis[i];
+-			pe->values[i*2+1]+=Jdet*gauss->weight*rho_ice*thickness*vy*basis[i];
+-		}
+-
+-		/*Atmospheric forcing*/
+-		vnorm    = sqrt(windvx*windvx + windvy*windvy);
+-		constant_part = concentration*air_coef*rho_air*(air_lin_drag_coef+air_quad_drag_coef*vnorm);
+-		for(int i=0;i<numnodes;i++){
+-			pe->values[i*2+0] += constant_part*windvx*Jdet*gauss->weight*basis[i];
+-			pe->values[i*2+1] += constant_part*windvy*Jdet*gauss->weight*basis[i];
+-		}
+-
+-		/*Ocean forcing*/
+-		vnorm = sqrt(pow(oceanvx-vx,2) + pow(oceanvy-vy,2));
+-		constant_part = concentration*ocean_coef*rho_ocean*(ocean_lin_drag_coef+ocean_quad_drag_coef*vnorm);
+-		for(int i=0;i<numnodes;i++){
+-			pe->values[i*2+0] += constant_part*omega*(oceanvy-vy)*sin(ocean_turning_angle)*Jdet*gauss->weight*basis[i];
+-			pe->values[i*2+1] += constant_part*omega*(vx-oceanvx)*sin(ocean_turning_angle)*Jdet*gauss->weight*basis[i];
+-
+-			pe->values[i*2+0] += constant_part*oceanvx*cos(ocean_turning_angle)*Jdet*gauss->weight*basis[i];
+-			pe->values[i*2+1] += constant_part*oceanvy*cos(ocean_turning_angle)*Jdet*gauss->weight*basis[i];
+-
+-			pe->values[i*2+0] += (-rho_ice*thickness*gravity*omega*dssh[0])*Jdet*gauss->weight*basis[i];
+-			pe->values[i*2+1] += (-rho_ice*thickness*gravity*omega*dssh[1])*Jdet*gauss->weight*basis[i];
+-		}
+-
+-		/*Coriolis forces (use ustar)*/
+-		for(int i=0;i<numnodes;i++){
+-			pe->values[i*2+0] += (-rho_ice*thickness*coriolis_factor*vystar)*Jdet*gauss->weight*basis[i];
+-			pe->values[i*2+1] += (+rho_ice*thickness*coriolis_factor*vxstar)*Jdet*gauss->weight*basis[i];
+-		}
+-		
+-		/*Add elastic part of previous time step*/
+-		sigma_vec[0] = sigma_xx;
+-		sigma_vec[1] = sigma_yy;
+-		sigma_vec[2] = sigma_xy;
+-		D[0][0] = D[1][1] = D[2][2] = time_ratio*thickness*Jdet*gauss->weight;
+-		TripleMultiply(B,3,numdof,1,
+-					&D[0][0],3,3,0,
+-					&sigma_vec[0],3,1,0,
+-					&pe->values[0],1);
+-	}
+-
+-	/*Clean up and return*/
+-	xDelete<IssmDouble>(xyz_list);
+-	xDelete<IssmDouble>(basis);
+-	xDelete<IssmDouble>(B);
+-	delete gauss;
+-	return pe;
+-}/*}}}*/
+-void           SeaiceAnalysis::CreateCTensor(IssmDouble* C,Element* element,Gauss* gauss){/*{{{*/
+-
+-	/*Intermediaries*/
+-	IssmDouble D[3][3];
+-	IssmDouble damage,concentration;
+-
+-	/*Get Material parameters*/
+-	IssmDouble poisson          = element->GetMaterialParameter(MaterialsPoissonEnum);
+-	IssmDouble young_modulus    = element->GetMaterialParameter(MaterialsYoungModulusEnum);
+-	IssmDouble ridging_exponent = element->GetMaterialParameter(MaterialsRidgingExponentEnum);
+-
+-	/*Get damage input at this location*/
+-	Input* damage_input        = element->GetInput(DamageEnum);              _assert_(damage_input);
+-	Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input);
+-	damage_input->GetInputValue(&damage,gauss);
+-	concentration_input->GetInputValue(&concentration,gauss);
+-
+-	/*Build D tensor once for all*/
+-	D[0][0] = 1.;      D[0][1] = poisson; D[0][2] = 0.;
+-	D[1][0] = poisson; D[1][1] = 1.;      D[1][2] = 0.;
+-	D[2][0] = 0.;      D[2][1] = 0;       D[2][2] = (1.-poisson)/2.;
+-	for(int i=0;i<3;i++){
+-		for(int j=0;j<3;j++){
+-			D[i][j] = D[i][j]/(1-poisson*poisson);
+-		}
+-	}
+-
+-	/*Get f(A), E*/
+-	IssmDouble f = exp(ridging_exponent*(1.-concentration));
+-	IssmDouble E = young_modulus*(1.-damage)*f;
+-
+-	/*Let's build C = E*D */
+-	for(int i=0;i<3;i++){
+-		for(int j=0;j<3;j++){
+-			C[i*3+j] = E*D[i][j];
+-		}
+-	}
+-}/*}}}*/
+-void           SeaiceAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+-	/*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 
+-	 * For node i, Bi can be expressed in the actual coordinate system
+-	 * by: 
+-	 *       Bi=[ dN/dx           0    ] 
+-	 *          [   0           dN/dy  ]      
+-	 *          [ 1/2*dN/dy  1/2*dN/dx ]     
+-	 * where N is the basis function for node i.
+-	 *
+-	 * We assume B has been allocated already           */
+-
+-	/*Fetch number of nodes for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-
+-	/*Get nodal functions derivatives*/
+-	IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);
+-	element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+-
+-	/*Build B: */
+-	for(int i=0;i<numnodes;i++){
+-		B[2*numnodes*0+2*i+0] = dbasis[0*numnodes+i];
+-		B[2*numnodes*0+2*i+1] = 0.;
+-		B[2*numnodes*1+2*i+0] = 0.;
+-		B[2*numnodes*1+2*i+1] = dbasis[1*numnodes+i];
+-		//B[2*numnodes*2+2*i+0] = .5*dbasis[1*numnodes+i];
+-		//B[2*numnodes*2+2*i+1] = .5*dbasis[0*numnodes+i];
+-		B[2*numnodes*2+2*i+0] = dbasis[1*numnodes+i];
+-		B[2*numnodes*2+2*i+1] = dbasis[0*numnodes+i];
+-	}
+-
+-	/*Clean-up*/
+-	xDelete<IssmDouble>(dbasis);
+-}/*}}}*/
+-void           SeaiceAnalysis::GetM(IssmDouble* M,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
+-	/*Compute M  matrix. M=[M1 M2 M3] where Mi is of size 3*NDOF2. 
+-	 * For node i, Mi can be expressed in the actual coordinate system
+-	 * by: 
+-	 *       Mi=[ N  N ] 
+-	 * where N is the basis function for node i.
+-	 *
+-	 * We assume M has been allocated already           */
+-
+-	/*Fetch number of nodes for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-
+-	/*Get nodal functions derivatives*/
+-	IssmDouble* basis=xNew<IssmDouble>(numnodes);
+-	element->NodalFunctions(basis,gauss);
+-
+-	/*Build M: */
+-	for(int i=0;i<numnodes;i++){
+-		M[2*i+0] = basis[i];
+-		M[2*i+1] = basis[i];
+-	}
+-
+-	/*Clean-up*/
+-	xDelete<IssmDouble>(basis);
+-}/*}}}*/
+-void           SeaiceAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+-	   _error_("not implemented yet");
+-}/*}}}*/
+-void           SeaiceAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
+-	_error_("Not implemented yet");
+-}/*}}}*/
+-void           SeaiceAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
+-
+-	/*Intermediaries*/
+-	int* doflist=NULL;
+-
+-	/*Fetch number of nodes and dof for this finite element*/
+-	int numnodes = element->GetNumberOfNodes();
+-	int numdof   = numnodes*2;
+-
+-	/*Fetch dof list and allocate solution vectors*/
+-	element->GetDofList(&doflist,SSAApproximationEnum,GsetEnum);
+-	IssmDouble* values    = xNew<IssmDouble>(numdof);
+-	IssmDouble* vx        = xNew<IssmDouble>(numnodes);
+-	IssmDouble* vy        = xNew<IssmDouble>(numnodes);
+-	IssmDouble* vel       = xNew<IssmDouble>(numnodes);
+-
+-	/*Use the dof list to index into the solution vector: */
+-	for(int i=0;i<numdof;i++) values[i]=solution[doflist[i]];
+-
+-	/*Ok, we have vx and vy in values, fill in vx and vy arrays: */
+-	for(int i=0;i<numnodes;i++){
+-		vx[i]=values[i*2+0];
+-		vy[i]=values[i*2+1];
+-		if(xIsNan<IssmDouble>(vx[i])) _error_("NaN found in solution vector");
+-		if(xIsNan<IssmDouble>(vy[i])) _error_("NaN found in solution vector");
+-	}
+-
+-	/*Compute vel*/
+-	for(int i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i]);
+-
+-	/*Add vx and vy as inputs to the tria element: */
+-	element->AddInput(VxEnum,vx,element->GetElementType());
+-	element->AddInput(VyEnum,vy,element->GetElementType());
+-	element->AddInput(VelEnum,vel,element->GetElementType());
+-
+-	/*Free ressources:*/
+-	xDelete<IssmDouble>(vel);
+-	xDelete<IssmDouble>(vy);
+-	xDelete<IssmDouble>(vx);
+-	xDelete<IssmDouble>(values);
+-	xDelete<int>(doflist);
+-}/*}}}*/
+-void           SeaiceAnalysis::PostProcess(FemModel* femmodel){/*{{{*/
+-
+-	/*Intermediaties*/
+-	IssmDouble *xyz_list = NULL;
+-	IssmDouble *xyz_list_old = NULL;
+-	IssmDouble *xyz_list_new = NULL;
+-	IssmDouble  dt,meshx,meshy,vx,vy,eps_xx,eps_yy,eps_zz,area_old,area_new;
+-	IssmDouble  time_relaxation_stress,time_relaxation_damage,damage,concentration,thickness;
+-	IssmDouble  sigma_dot_xx,sigma_dot_yy,sigma_dot_xy;
+-	IssmDouble  sigma_pred_xx,sigma_pred_yy,sigma_pred_xy;
+-	IssmDouble  sigma_xx,sigma_yy,sigma_xy;
+-	IssmDouble  min_c,min_h,max_h;
+-	IssmDouble  epsilon[3]; /*eps_xx,eps_yy,eps_xy*/
+-	IssmDouble  C[3][3];
+-
+-	/*Fetch the parameters once for all*/
+-	femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
+-	femmodel->parameters->FindParam(&min_c,SeaiceMinConcentrationEnum);
+-	femmodel->parameters->FindParam(&min_h,SeaiceMinThicknessEnum);
+-	femmodel->parameters->FindParam(&max_h,SeaiceMaxThicknessEnum);
+-
+-	/*Loop over the elements of this partition and update accordingly*/
+-	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-
+-		/*Get some inputs needed for the update*/
+-		element->GetVerticesCoordinates(&xyz_list);
+-		time_relaxation_stress = element->GetMaterialParameter(MaterialsTimeRelaxationStressEnum);
+-		time_relaxation_damage = element->GetMaterialParameter(MaterialsTimeRelaxationDamageEnum);
+-		Input* meshx_input = element->GetInput(MeshXEnum); _assert_(meshx_input);
+-		Input* meshy_input = element->GetInput(MeshYEnum); _assert_(meshy_input);
+-		Input* vx_input    = element->GetInput(VxEnum);    _assert_(vx_input);
+-		Input* vy_input    = element->GetInput(VyEnum);    _assert_(vy_input);
+-
+-		/*Preallocate future inputs*/
+-		int numvertices=element->GetNumberOfVertices();
+-		IssmDouble* meshx_new_list = xNew<IssmDouble>(numvertices);
+-		IssmDouble* meshy_new_list = xNew<IssmDouble>(numvertices);
+-		xyz_list_old = xNew<IssmDouble>(numvertices*3);
+-		xyz_list_new = xNew<IssmDouble>(numvertices*3);
+-
+-		/*1. update vertex positions (using a Gauss object for convenience)*/
+-		Gauss* gauss=element->NewGauss();
+-		for (int iv=0;iv<numvertices;iv++){
+-			gauss->GaussVertex(iv);
+-
+-			meshx_input->GetInputValue(&meshx,gauss);
+-			meshy_input->GetInputValue(&meshy,gauss);
+-			vx_input->GetInputValue(&vx,gauss);
+-			vy_input->GetInputValue(&vy,gauss);
+-
+-			meshx_new_list[iv] = meshx + vx*dt;
+-			meshy_new_list[iv] = meshy + vy*dt;
+-
+-			xyz_list_old[iv*3+0] = meshx;
+-			xyz_list_old[iv*3+1] = meshy;
+-			xyz_list_old[iv*3+2] = 0.;
+-
+-			xyz_list_new[iv*3+0] = meshx_new_list[iv];
+-			xyz_list_new[iv*3+1] = meshy_new_list[iv];
+-			xyz_list_new[iv*3+2] = 0.;
+-		}
+-		element->AddInput(MeshXEnum,meshx_new_list,P1Enum);
+-		element->AddInput(MeshYEnum,meshy_new_list,P1Enum);
+-
+-		/*Now we are going to use a point in the center of the element, because we are P0 for the stress*/
+-		gauss->GaussNode(P0Enum,0);
+-
+-		/*Calculate sigma_dot*/
+-		sigma_dot_xx=sigma_dot_yy=sigma_dot_xy=0.;
+-		this->CreateCTensor(&C[0][0],element,gauss);
+-		element->StrainRateSSA(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
+-		for(int j=0;j<3;j++){
+-			sigma_dot_xx += C[0][j]*epsilon[0];
+-			sigma_dot_yy += C[1][j]*epsilon[1];
+-			sigma_dot_xy += C[2][j]*epsilon[2];
+-		}
+-
+-		/*Get predicted stress state*/
+-		Input* sigma_xx_input = element->GetInput(StressTensorPredictorxxEnum); _assert_(sigma_xx_input);
+-		Input* sigma_yy_input = element->GetInput(StressTensorPredictoryyEnum); _assert_(sigma_yy_input);
+-		Input* sigma_xy_input = element->GetInput(StressTensorPredictorxyEnum); _assert_(sigma_xy_input);
+-		sigma_xx_input->GetInputAverage(&sigma_xx);
+-		sigma_yy_input->GetInputAverage(&sigma_yy);
+-		sigma_xy_input->GetInputAverage(&sigma_xy);
+-
+-		/*Calculate new stress and push to element*/
+-		sigma_xx = sigma_xx + dt*(sigma_dot_xx - sigma_xx/time_relaxation_stress);
+-		sigma_yy = sigma_yy + dt*(sigma_dot_yy - sigma_yy/time_relaxation_stress);
+-		sigma_xy = sigma_xy + dt*(sigma_dot_xy - sigma_xy/time_relaxation_stress);
+-		element->AddInput(StressTensorxxEnum,&sigma_xx,P0Enum);
+-		element->AddInput(StressTensoryyEnum,&sigma_yy,P0Enum);
+-		element->AddInput(StressTensorxyEnum,&sigma_xy,P0Enum);
+-
+-		/*Update Damage According*/
+-		Input* damage_input = element->GetInput(DamageEnum); _assert_(damage_input);
+-		damage_input->GetInputAverage(&damage);
+-		damage = damage*(1.-dt/time_relaxation_damage);
+-		element->AddInput(DamageEnum,&damage,P0Enum);
+-
+-		/*Prepare new predictor*/
+-		this->CreateCTensor(&C[0][0],element,gauss); /*C is updated now that there is a new damage in inputs*/
+-		for(int j=0;j<3;j++){
+-			sigma_pred_xx += C[0][j]*epsilon[0];
+-			sigma_pred_yy += C[1][j]*epsilon[1];
+-			sigma_pred_xy += C[2][j]*epsilon[2];
+-		}
+-		element->AddInput(StressTensorPredictorxxEnum,&sigma_pred_xx,P0Enum);
+-		element->AddInput(StressTensorPredictoryyEnum,&sigma_pred_yy,P0Enum);
+-		element->AddInput(StressTensorPredictorxyEnum,&sigma_pred_xy,P0Enum);
+-
+-		/*Calculate Old and new area (FIXME: for now we assume trianlges...)*/
+-		element->JacobianDeterminant(&area_old,xyz_list_old,gauss);
+-		element->JacobianDeterminant(&area_new,xyz_list_new,gauss);
+-		area_old = area_old/SQRT3;
+-		area_new = area_new/SQRT3;
+-
+-		/*Update ice thickness and concentration using element distortion*/
+-		Input* thickness_input     = element->GetInput(SeaiceThicknessEnum);     _assert_(thickness_input);
+-		Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input);
+-		thickness_input->GetInputAverage(&thickness);
+-		concentration_input->GetInputAverage(&concentration);
+-		IssmDouble ice_area   = concentration*area_old;
+-		IssmDouble ice_volume = thickness*area_old;
+-		if(concentration>min_c){
+-			concentration = ice_area  /area_new;
+-			thickness     = ice_volume/area_new;
+-
+-			/* lower bounds */
+-			concentration = ((concentration>min_c)?(concentration):(min_c));
+-			thickness     = ((thickness    >min_h)?(thickness    ):(min_h));
+-
+-			/* upper bounds (only for the concentration) */
+-			concentration    = ((concentration<1.   )?(concentration):(1));
+-			thickness        = ((thickness    <max_h)?(thickness    ):(max_h));
+-		}
+-		element->AddInput(SeaiceConcentrationEnum,&concentration,P0Enum);
+-		element->AddInput(SeaiceThicknessEnum,&thickness,P0Enum);
+-
+-		/*Clean up*/
+-		xDelete<IssmDouble>(meshx_new_list);
+-		xDelete<IssmDouble>(meshy_new_list);
+-		xDelete<IssmDouble>(xyz_list);
+-		xDelete<IssmDouble>(xyz_list_old);
+-		xDelete<IssmDouble>(xyz_list_new);
+-	}
+-
+-}/*}}}*/
+-void           SeaiceAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
+-
+-	/*Intermediaries*/
+-	IssmDouble          c_min;
+-	Vector<IssmDouble>* mask        = NULL;
+-	IssmDouble*         serial_mask = NULL;
+-
+-	/*Get minimum concentration allowed*/
+-	femmodel->parameters->FindParam(&c_min,SeaiceMinConcentrationEnum);
+-
+-	/*Step 1: update mask of active nodes*/
+-	mask=new Vector<IssmDouble>(femmodel->nodes->NumberOfNodes(SeaiceAnalysisEnum));
+-	for (int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-
+-		/*Get current concentration of element and decide whether it is an active element*/
+-		int    numnodes            = element->GetNumberOfNodes();
+-		Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input);
+-		if(concentration_input->Max()>c_min){
+-			for(int in=0;in<numnodes;in++) mask->SetValue(element->nodes[in]->Sid(),1.,INS_VAL);
+-		}
+-	}
+-
+-	/*Assemble and serialize*/
+-	mask->Assemble();
+-	serial_mask=mask->ToMPISerial();
+-	delete mask;
+-
+-	/*Update node activation accordingly*/
+-	int counter =0;
+-	for(int i=0;i<femmodel->nodes->Size();i++){
+-		Node* node=xDynamicCast<Node*>(femmodel->nodes->GetObjectByOffset(i));
+-		if(node->InAnalysis(SeaiceAnalysisEnum)){
+-			if(serial_mask[node->Sid()]==1.){
+-				node->Activate();
+-				counter++;
+-			}
+-			else{
+-				node->Deactivate();
+-			}
+-		}
+-	}
+-	xDelete<IssmDouble>(serial_mask);
+-
+-	/*Display number of active nodes*/
+-	int sum_counter;
+-	ISSM_MPI_Reduce(&counter,&sum_counter,1,ISSM_MPI_INT,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+-	if(VerboseSolution()) _printf0_("   Number of active nodes: "<< sum_counter <<"\n");
+-}/*}}}*/
+-void           SeaiceAnalysis::UpdateDamageAndStress(FemModel* femmodel){/*{{{*/
+-	/* The damage variable is updated as a function of the actual elastic deformation
+-	 * In both cases, a Coulombic enveloppe is used, define by the cohesion C, tan(phi) and tract_coef.
+-	 * In both cases, a maximal compressive strength is fixed at compr_max
+-	 * The enveloppe is defined in N/m^2.
+-	 * The coeficients of the internal stress are then multiplied by the ice thickness to be used in the vertical integrated momentiom equation.
+-	 */
+-
+-	/* Mohr-Coulomb criterion calculation
+-	 * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-	 *                                                                   
+-	 *                            sigma_s                                
+-	 *        Mohr.Coulomb branch     |                                  
+-	 *                     \          |                                  
+-	 *                      * |       |                                  
+-	 *                        *       |   cohesion (C=cfix+calea)        
+-	 *                        | *     |  /                               
+-	 *                        |   *   | /    tract                       
+-	 *                        |     * |/    /                            
+-	 *             -comp_max  |       *    /                             
+-	 *                      \ |       | * /                              
+-	 *                       \|      0| | *                              
+-	 *             -------------------------*------------ sigma_n        
+-	 *                        |       | | *                              
+-	 *                        |       | *                                
+-	 *                        |       *                                  
+-	 *                        |     * |                                  
+-	 *                        |   *   |                                  
+-	 *                        | *     |                                  
+-	 *                        *       |                                  
+-	 *                      * |       |                                  
+-	 *                    *           |                                  
+-	 *                                |                                  
+-	 *                                |                                  
+-	 *                                                                   
+-	 * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-	 */
+-
+-	/*Intermediaties*/
+-	IssmDouble sigma_xx,sigma_yy,sigma_xy,sigma_s,sigma_n,sigma_target;
+-	IssmDouble compression_coef,traction_coef,cohesion,tan_phi;
+-	IssmDouble traction,compression_max;
+-	IssmDouble damage_test,damage_new,damage,tmp;
+-
+-	/*Loop over the elements of this partition and update accordingly*/
+-	for(int i=0;i<femmodel->elements->Size();i++){
+-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-
+-		/*Get Mohr-Coulomb parameters*/
+-		compression_coef = element->GetMaterialParameter(MaterialsCompressionCoefEnum);
+-		traction_coef    = element->GetMaterialParameter(MaterialsTractionCoefEnum);
+-		cohesion         = element->GetMaterialParameter(MaterialsCohesionEnum); //C
+-		tan_phi          = element->GetMaterialParameter(MaterialsInternalFrictionCoefEnum); //mu = tan(phi)
+-
+-		/*Get current stress state*/
+-		Input*   sigma_xx_input = element->GetInput(StressTensorPredictorxxEnum); _assert_(sigma_xx_input);
+-		Input*   sigma_yy_input = element->GetInput(StressTensorPredictoryyEnum); _assert_(sigma_yy_input);
+-		Input*   sigma_xy_input = element->GetInput(StressTensorPredictorxyEnum); _assert_(sigma_xy_input);
+-		sigma_xx_input->GetInputAverage(&sigma_xx);
+-		sigma_yy_input->GetInputAverage(&sigma_yy);
+-		sigma_xy_input->GetInputAverage(&sigma_xy);
+-
+-		/* Compute the invariants of the elastic deformation and instantaneous deformation rate */
+-		sigma_s=sqrt(pow((sigma_xx-sigma_yy)/2.,2)+pow(sigma_xy,2));
+-		sigma_n=(sigma_xx+sigma_yy)/2.;
+-
+-		/* same maximal tensile strength */
+-		traction=traction_coef*cohesion/tan_phi;
+-		compression_max=compression_coef*cohesion;
+-
+-		/* estimate the internal constraints using the current elastic deformation */
+-		Input* damage_input    = element->GetInput(DamageEnum); _assert_(damage_input);
+-		damage_input->GetInputAverage(&damage);
+-		damage_test = damage;
+-		damage_new  = damage;
+-		if(sigma_n>traction || sigma_n<-compression_max){
+-			if(sigma_n>traction){
+-				sigma_target=traction;
+-			}
+-			else{
+-				sigma_target=-compression_max;
+-			}
+-
+-			tmp=1.-sigma_target/sigma_n*(1.-damage);
+-			if(tmp<1. && tmp>damage_new){
+-				damage_test=((damage_test>tmp)?(damage_test):(tmp)); /* max(damage_test,tmp); */
+-			}
+-		}
+-		if(sigma_s>cohesion-sigma_n*tan_phi){
+-			tmp=1.0-cohesion/(sigma_s+sigma_n*tan_phi)*(1-damage);
+-			if(tmp<1. && tmp>damage_new){
+-				damage_test=((damage_test>tmp)?(damage_test):(tmp)); /*max(damage_test,tmp); */
+-			}
+-		}
+-
+-		/* The damage variable is changed */
+-		damage_new=damage_test;
+-		element->AddInput(DamageEnum,&damage_new,P0Enum);
+-
+-		/* Recompute the internal stress*/
+-		if(damage<1.){
+-			sigma_xx = (1.-damage_new)/(1.-damage)*sigma_xx;
+-			sigma_yy = (1.-damage_new)/(1.-damage)*sigma_yy;
+-			sigma_xy = (1.-damage_new)/(1.-damage)*sigma_xy;
+-		}
+-		else{
+-			sigma_xx = 0.;
+-			sigma_yy = 0.;
+-			sigma_xy = 0.;
+-		}
+-		element->AddInput(StressTensorxxEnum,&sigma_xx,P0Enum);
+-		element->AddInput(StressTensoryyEnum,&sigma_yy,P0Enum);
+-		element->AddInput(StressTensorxyEnum,&sigma_xy,P0Enum);
+-	}
+-}/*}}}*/
+Index: ../trunk-jpl/src/c/analyses/EnumToAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/EnumToAnalysis.cpp	(revision 19086)
++++ ../trunk-jpl/src/c/analyses/EnumToAnalysis.cpp	(revision 19087)
+@@ -97,9 +97,6 @@
+ 		#ifdef _HAVE_GIA_
+ 		case GiaAnalysisEnum : return new GiaAnalysis();
+ 		#endif
+-		#ifdef _HAVE_SEAICE_
+-		case SeaiceAnalysisEnum : return new SeaiceAnalysis();
+-		#endif
+ 		#ifdef _HAVE_MESHDEFORMATION_
+ 		case MeshdeformationAnalysisEnum : return new MeshdeformationAnalysis();
+ 		#endif
+Index: ../trunk-jpl/src/c/analyses/analyses.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/analyses.h	(revision 19086)
++++ ../trunk-jpl/src/c/analyses/analyses.h	(revision 19087)
+@@ -32,7 +32,6 @@
+ #include "./MeltingAnalysis.h"
+ #include "./MeshdeformationAnalysis.h"
+ #include "./SmoothAnalysis.h"
+-#include "./SeaiceAnalysis.h"
+ #include "./StressbalanceAnalysis.h"
+ #include "./StressbalanceSIAAnalysis.h"
+ #include "./StressbalanceVerticalAnalysis.h"
+Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 19086)
++++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 19087)
+@@ -429,8 +429,6 @@
+ 	UzawaPressureAnalysisEnum,
+ 	GiaSolutionEnum,
+ 	GiaAnalysisEnum,
+-	SeaiceSolutionEnum,
+-	SeaiceAnalysisEnum,
+ 	MeshdeformationSolutionEnum,
+ 	MeshdeformationAnalysisEnum,
+ 	LevelsetAnalysisEnum,
+@@ -917,47 +915,6 @@
+ 	LevelsetfunctionSlopeYEnum,
+ 	LevelsetfunctionPicardEnum,
+ 	/*}}}*/
+-	/*Sea Ice {{{*/
+-	SeaiceatmEnum,
+-	SeaiceoceanEnum,
+-	SeaiceThicknessEnum,
+-	SeaiceConcentrationEnum,
+-	SeaiceMinConcentrationEnum,
+-	SeaiceMinThicknessEnum,
+-	SeaiceMaxThicknessEnum,
+-	SeaiceSpcvxEnum,
+-	SeaiceSpcvyEnum,
+-	SeaiceCoriolisFactorEnum,
+-	BasalforcingsRhoOceanEnum,
+-	BasalforcingsOceanCoefEnum,
+-	BasalforcingsOceanLinDragCoefEnum,
+-	BasalforcingsOceanQuadDragCoefEnum,
+-	BasalforcingsOceanTurningAngleEnum,
+-	BasalforcingsOceanSshEnum,
+-	BasalforcingsOceanVxEnum,
+-	BasalforcingsOceanVyEnum,
+-	SurfaceforcingsRhoAirEnum,
+-	SurfaceforcingsAirCoefEnum,
+-	SurfaceforcingsAirLinDragCoefEnum,
+-	SurfaceforcingsAirQuadDragCoefEnum,
+-	SurfaceforcingsWindVxEnum,
+-	SurfaceforcingsWindVyEnum,
+-	MatseaiceEnum,
+-	MaterialsPoissonEnum,
+-	MaterialsYoungModulusEnum,
+-	MaterialsTimeRelaxationStressEnum,
+-	MaterialsTimeRelaxationDamageEnum,
+-	MaterialsRidgingExponentEnum,
+-	MaterialsCohesionEnum,
+-	MaterialsInternalFrictionCoefEnum,
+-	MaterialsCompressionCoefEnum,
+-	MaterialsTractionCoefEnum,
+-	VxStarEnum,
+-	VyStarEnum,
+-	StressTensorPredictorxxEnum,
+-	StressTensorPredictoryyEnum,
+-	StressTensorPredictorxyEnum,
+-	/*}}}*/
+ 	MaximumNumberOfDefinitionsEnum
+ };
+ 
+Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 19086)
++++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 19087)
+@@ -432,8 +432,6 @@
+ 		case UzawaPressureAnalysisEnum : return "UzawaPressureAnalysis";
+ 		case GiaSolutionEnum : return "GiaSolution";
+ 		case GiaAnalysisEnum : return "GiaAnalysis";
+-		case SeaiceSolutionEnum : return "SeaiceSolution";
+-		case SeaiceAnalysisEnum : return "SeaiceAnalysis";
+ 		case MeshdeformationSolutionEnum : return "MeshdeformationSolution";
+ 		case MeshdeformationAnalysisEnum : return "MeshdeformationAnalysis";
+ 		case LevelsetAnalysisEnum : return "LevelsetAnalysis";
+@@ -877,45 +875,6 @@
+ 		case LevelsetfunctionSlopeXEnum : return "LevelsetfunctionSlopeX";
+ 		case LevelsetfunctionSlopeYEnum : return "LevelsetfunctionSlopeY";
+ 		case LevelsetfunctionPicardEnum : return "LevelsetfunctionPicard";
+-		case SeaiceatmEnum : return "Seaiceatm";
+-		case SeaiceoceanEnum : return "Seaiceocean";
+-		case SeaiceThicknessEnum : return "SeaiceThickness";
+-		case SeaiceConcentrationEnum : return "SeaiceConcentration";
+-		case SeaiceMinConcentrationEnum : return "SeaiceMinConcentration";
+-		case SeaiceMinThicknessEnum : return "SeaiceMinThickness";
+-		case SeaiceMaxThicknessEnum : return "SeaiceMaxThickness";
+-		case SeaiceSpcvxEnum : return "SeaiceSpcvx";
+-		case SeaiceSpcvyEnum : return "SeaiceSpcvy";
+-		case SeaiceCoriolisFactorEnum : return "SeaiceCoriolisFactor";
+-		case BasalforcingsRhoOceanEnum : return "BasalforcingsRhoOcean";
+-		case BasalforcingsOceanCoefEnum : return "BasalforcingsOceanCoef";
+-		case BasalforcingsOceanLinDragCoefEnum : return "BasalforcingsOceanLinDragCoef";
+-		case BasalforcingsOceanQuadDragCoefEnum : return "BasalforcingsOceanQuadDragCoef";
+-		case BasalforcingsOceanTurningAngleEnum : return "BasalforcingsOceanTurningAngle";
+-		case BasalforcingsOceanSshEnum : return "BasalforcingsOceanSsh";
+-		case BasalforcingsOceanVxEnum : return "BasalforcingsOceanVx";
+-		case BasalforcingsOceanVyEnum : return "BasalforcingsOceanVy";
+-		case SurfaceforcingsRhoAirEnum : return "SurfaceforcingsRhoAir";
+-		case SurfaceforcingsAirCoefEnum : return "SurfaceforcingsAirCoef";
+-		case SurfaceforcingsAirLinDragCoefEnum : return "SurfaceforcingsAirLinDragCoef";
+-		case SurfaceforcingsAirQuadDragCoefEnum : return "SurfaceforcingsAirQuadDragCoef";
+-		case SurfaceforcingsWindVxEnum : return "SurfaceforcingsWindVx";
+-		case SurfaceforcingsWindVyEnum : return "SurfaceforcingsWindVy";
+-		case MatseaiceEnum : return "Matseaice";
+-		case MaterialsPoissonEnum : return "MaterialsPoisson";
+-		case MaterialsYoungModulusEnum : return "MaterialsYoungModulus";
+-		case MaterialsTimeRelaxationStressEnum : return "MaterialsTimeRelaxationStress";
+-		case MaterialsTimeRelaxationDamageEnum : return "MaterialsTimeRelaxationDamage";
+-		case MaterialsRidgingExponentEnum : return "MaterialsRidgingExponent";
+-		case MaterialsCohesionEnum : return "MaterialsCohesion";
+-		case MaterialsInternalFrictionCoefEnum : return "MaterialsInternalFrictionCoef";
+-		case MaterialsCompressionCoefEnum : return "MaterialsCompressionCoef";
+-		case MaterialsTractionCoefEnum : return "MaterialsTractionCoef";
+-		case VxStarEnum : return "VxStar";
+-		case VyStarEnum : return "VyStar";
+-		case StressTensorPredictorxxEnum : return "StressTensorPredictorxx";
+-		case StressTensorPredictoryyEnum : return "StressTensorPredictoryy";
+-		case StressTensorPredictorxyEnum : return "StressTensorPredictorxy";
+ 		case MaximumNumberOfDefinitionsEnum : return "MaximumNumberOfDefinitions";
+ 		default : return "unknown";
+ 
+Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 19086)
++++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 19087)
+@@ -441,8 +441,6 @@
+ 	      else if (strcmp(name,"UzawaPressureAnalysis")==0) return UzawaPressureAnalysisEnum;
+ 	      else if (strcmp(name,"GiaSolution")==0) return GiaSolutionEnum;
+ 	      else if (strcmp(name,"GiaAnalysis")==0) return GiaAnalysisEnum;
+-	      else if (strcmp(name,"SeaiceSolution")==0) return SeaiceSolutionEnum;
+-	      else if (strcmp(name,"SeaiceAnalysis")==0) return SeaiceAnalysisEnum;
+ 	      else if (strcmp(name,"MeshdeformationSolution")==0) return MeshdeformationSolutionEnum;
+ 	      else if (strcmp(name,"MeshdeformationAnalysis")==0) return MeshdeformationAnalysisEnum;
+ 	      else if (strcmp(name,"LevelsetAnalysis")==0) return LevelsetAnalysisEnum;
+@@ -505,12 +503,12 @@
+ 	      else if (strcmp(name,"Pengrid")==0) return PengridEnum;
+ 	      else if (strcmp(name,"Penpair")==0) return PenpairEnum;
+ 	      else if (strcmp(name,"Profiler")==0) return ProfilerEnum;
++	      else if (strcmp(name,"MatrixParam")==0) return MatrixParamEnum;
++	      else if (strcmp(name,"Masscon")==0) return MassconEnum;
+          else stage=5;
+    }
+    if(stage==5){
+-	      if (strcmp(name,"MatrixParam")==0) return MatrixParamEnum;
+-	      else if (strcmp(name,"Masscon")==0) return MassconEnum;
+-	      else if (strcmp(name,"MassconName")==0) return MassconNameEnum;
++	      if (strcmp(name,"MassconName")==0) return MassconNameEnum;
+ 	      else if (strcmp(name,"MassconDefinitionenum")==0) return MassconDefinitionenumEnum;
+ 	      else if (strcmp(name,"MassconLevelset")==0) return MassconLevelsetEnum;
+ 	      else if (strcmp(name,"Massconaxpby")==0) return MassconaxpbyEnum;
+@@ -628,12 +626,12 @@
+ 	      else if (strcmp(name,"DeviatoricStress")==0) return DeviatoricStressEnum;
+ 	      else if (strcmp(name,"DeviatoricStressxx")==0) return DeviatoricStressxxEnum;
+ 	      else if (strcmp(name,"DeviatoricStressxy")==0) return DeviatoricStressxyEnum;
++	      else if (strcmp(name,"DeviatoricStressxz")==0) return DeviatoricStressxzEnum;
++	      else if (strcmp(name,"DeviatoricStressyy")==0) return DeviatoricStressyyEnum;
+          else stage=6;
+    }
+    if(stage==6){
+-	      if (strcmp(name,"DeviatoricStressxz")==0) return DeviatoricStressxzEnum;
+-	      else if (strcmp(name,"DeviatoricStressyy")==0) return DeviatoricStressyyEnum;
+-	      else if (strcmp(name,"DeviatoricStressyz")==0) return DeviatoricStressyzEnum;
++	      if (strcmp(name,"DeviatoricStressyz")==0) return DeviatoricStressyzEnum;
+ 	      else if (strcmp(name,"DeviatoricStresszz")==0) return DeviatoricStresszzEnum;
+ 	      else if (strcmp(name,"StrainRate")==0) return StrainRateEnum;
+ 	      else if (strcmp(name,"StrainRatexx")==0) return StrainRatexxEnum;
+@@ -751,12 +749,12 @@
+ 	      else if (strcmp(name,"Outputdefinition69")==0) return Outputdefinition69Enum;
+ 	      else if (strcmp(name,"Outputdefinition70")==0) return Outputdefinition70Enum;
+ 	      else if (strcmp(name,"Outputdefinition71")==0) return Outputdefinition71Enum;
++	      else if (strcmp(name,"Outputdefinition72")==0) return Outputdefinition72Enum;
++	      else if (strcmp(name,"Outputdefinition73")==0) return Outputdefinition73Enum;
+          else stage=7;
+    }
+    if(stage==7){
+-	      if (strcmp(name,"Outputdefinition72")==0) return Outputdefinition72Enum;
+-	      else if (strcmp(name,"Outputdefinition73")==0) return Outputdefinition73Enum;
+-	      else if (strcmp(name,"Outputdefinition74")==0) return Outputdefinition74Enum;
++	      if (strcmp(name,"Outputdefinition74")==0) return Outputdefinition74Enum;
+ 	      else if (strcmp(name,"Outputdefinition75")==0) return Outputdefinition75Enum;
+ 	      else if (strcmp(name,"Outputdefinition76")==0) return Outputdefinition76Enum;
+ 	      else if (strcmp(name,"Outputdefinition77")==0) return Outputdefinition77Enum;
+@@ -874,12 +872,12 @@
+ 	      else if (strcmp(name,"NearestInterp")==0) return NearestInterpEnum;
+ 	      else if (strcmp(name,"XY")==0) return XYEnum;
+ 	      else if (strcmp(name,"XYZ")==0) return XYZEnum;
++	      else if (strcmp(name,"Dense")==0) return DenseEnum;
++	      else if (strcmp(name,"MpiDense")==0) return MpiDenseEnum;
+          else stage=8;
+    }
+    if(stage==8){
+-	      if (strcmp(name,"Dense")==0) return DenseEnum;
+-	      else if (strcmp(name,"MpiDense")==0) return MpiDenseEnum;
+-	      else if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum;
++	      if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum;
+ 	      else if (strcmp(name,"Seq")==0) return SeqEnum;
+ 	      else if (strcmp(name,"Mpi")==0) return MpiEnum;
+ 	      else if (strcmp(name,"Mumps")==0) return MumpsEnum;
+@@ -898,45 +896,6 @@
+ 	      else if (strcmp(name,"LevelsetfunctionSlopeX")==0) return LevelsetfunctionSlopeXEnum;
+ 	      else if (strcmp(name,"LevelsetfunctionSlopeY")==0) return LevelsetfunctionSlopeYEnum;
+ 	      else if (strcmp(name,"LevelsetfunctionPicard")==0) return LevelsetfunctionPicardEnum;
+-	      else if (strcmp(name,"Seaiceatm")==0) return SeaiceatmEnum;
+-	      else if (strcmp(name,"Seaiceocean")==0) return SeaiceoceanEnum;
+-	      else if (strcmp(name,"SeaiceThickness")==0) return SeaiceThicknessEnum;
+-	      else if (strcmp(name,"SeaiceConcentration")==0) return SeaiceConcentrationEnum;
+-	      else if (strcmp(name,"SeaiceMinConcentration")==0) return SeaiceMinConcentrationEnum;
+-	      else if (strcmp(name,"SeaiceMinThickness")==0) return SeaiceMinThicknessEnum;
+-	      else if (strcmp(name,"SeaiceMaxThickness")==0) return SeaiceMaxThicknessEnum;
+-	      else if (strcmp(name,"SeaiceSpcvx")==0) return SeaiceSpcvxEnum;
+-	      else if (strcmp(name,"SeaiceSpcvy")==0) return SeaiceSpcvyEnum;
+-	      else if (strcmp(name,"SeaiceCoriolisFactor")==0) return SeaiceCoriolisFactorEnum;
+-	      else if (strcmp(name,"BasalforcingsRhoOcean")==0) return BasalforcingsRhoOceanEnum;
+-	      else if (strcmp(name,"BasalforcingsOceanCoef")==0) return BasalforcingsOceanCoefEnum;
+-	      else if (strcmp(name,"BasalforcingsOceanLinDragCoef")==0) return BasalforcingsOceanLinDragCoefEnum;
+-	      else if (strcmp(name,"BasalforcingsOceanQuadDragCoef")==0) return BasalforcingsOceanQuadDragCoefEnum;
+-	      else if (strcmp(name,"BasalforcingsOceanTurningAngle")==0) return BasalforcingsOceanTurningAngleEnum;
+-	      else if (strcmp(name,"BasalforcingsOceanSsh")==0) return BasalforcingsOceanSshEnum;
+-	      else if (strcmp(name,"BasalforcingsOceanVx")==0) return BasalforcingsOceanVxEnum;
+-	      else if (strcmp(name,"BasalforcingsOceanVy")==0) return BasalforcingsOceanVyEnum;
+-	      else if (strcmp(name,"SurfaceforcingsRhoAir")==0) return SurfaceforcingsRhoAirEnum;
+-	      else if (strcmp(name,"SurfaceforcingsAirCoef")==0) return SurfaceforcingsAirCoefEnum;
+-	      else if (strcmp(name,"SurfaceforcingsAirLinDragCoef")==0) return SurfaceforcingsAirLinDragCoefEnum;
+-	      else if (strcmp(name,"SurfaceforcingsAirQuadDragCoef")==0) return SurfaceforcingsAirQuadDragCoefEnum;
+-	      else if (strcmp(name,"SurfaceforcingsWindVx")==0) return SurfaceforcingsWindVxEnum;
+-	      else if (strcmp(name,"SurfaceforcingsWindVy")==0) return SurfaceforcingsWindVyEnum;
+-	      else if (strcmp(name,"Matseaice")==0) return MatseaiceEnum;
+-	      else if (strcmp(name,"MaterialsPoisson")==0) return MaterialsPoissonEnum;
+-	      else if (strcmp(name,"MaterialsYoungModulus")==0) return MaterialsYoungModulusEnum;
+-	      else if (strcmp(name,"MaterialsTimeRelaxationStress")==0) return MaterialsTimeRelaxationStressEnum;
+-	      else if (strcmp(name,"MaterialsTimeRelaxationDamage")==0) return MaterialsTimeRelaxationDamageEnum;
+-	      else if (strcmp(name,"MaterialsRidgingExponent")==0) return MaterialsRidgingExponentEnum;
+-	      else if (strcmp(name,"MaterialsCohesion")==0) return MaterialsCohesionEnum;
+-	      else if (strcmp(name,"MaterialsInternalFrictionCoef")==0) return MaterialsInternalFrictionCoefEnum;
+-	      else if (strcmp(name,"MaterialsCompressionCoef")==0) return MaterialsCompressionCoefEnum;
+-	      else if (strcmp(name,"MaterialsTractionCoef")==0) return MaterialsTractionCoefEnum;
+-	      else if (strcmp(name,"VxStar")==0) return VxStarEnum;
+-	      else if (strcmp(name,"VyStar")==0) return VyStarEnum;
+-	      else if (strcmp(name,"StressTensorPredictorxx")==0) return StressTensorPredictorxxEnum;
+-	      else if (strcmp(name,"StressTensorPredictoryy")==0) return StressTensorPredictoryyEnum;
+-	      else if (strcmp(name,"StressTensorPredictorxy")==0) return StressTensorPredictorxyEnum;
+ 	      else if (strcmp(name,"MaximumNumberOfDefinitions")==0) return MaximumNumberOfDefinitionsEnum;
+          else stage=9;
+    }
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 19086)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 19087)
+@@ -67,9 +67,7 @@
+ 	parameters->AddObject(iomodel->CopyConstantObject(InversionIscontrolEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(InversionTypeEnum));
+ 	parameters->AddObject(iomodel->CopyConstantObject(CalvingLawEnum));
+-	if(solution_type==SeaiceSolutionEnum){
+-	}
+-	else{
++	{/*This is specific to ice...*/
+ 		parameters->AddObject(iomodel->CopyConstantObject(MeshElementtypeEnum));
+ 		parameters->AddObject(iomodel->CopyConstantObject(SteadystateReltolEnum));
+ 		parameters->AddObject(iomodel->CopyConstantObject(SteadystateMaxiterEnum));
+@@ -159,12 +157,6 @@
+ 		case SMBmeltcomponentsEnum:
+ 			/*Nothing to add to parameters*/
+ 			break;
+-		case SeaiceatmEnum:
+-			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsRhoAirEnum));
+-			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsAirCoefEnum));
+-			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsAirLinDragCoefEnum));
+-			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsAirQuadDragCoefEnum));
+-			break;
+ 		default:
+ 			_error_("Surface mass balance model "<<EnumToStringx(smb_model)<<" not supported yet");
+ 	}
+@@ -181,13 +173,6 @@
+ 			parameters->AddObject(iomodel->CopyConstantObject(BasalforcingsDeepwaterElevationEnum));
+ 			parameters->AddObject(iomodel->CopyConstantObject(BasalforcingsUpperwaterElevationEnum));
+ 			break;
+-		case SeaiceoceanEnum:
+-			parameters->AddObject(iomodel->CopyConstantObject(BasalforcingsRhoOceanEnum));
+-			parameters->AddObject(iomodel->CopyConstantObject(BasalforcingsOceanCoefEnum));
+-			parameters->AddObject(iomodel->CopyConstantObject(BasalforcingsOceanLinDragCoefEnum));
+-			parameters->AddObject(iomodel->CopyConstantObject(BasalforcingsOceanQuadDragCoefEnum));
+-			parameters->AddObject(iomodel->CopyConstantObject(BasalforcingsOceanTurningAngleEnum));
+-			break;
+ 		default:
+ 			_error_("Basal forcing model "<<EnumToStringx(smb_model)<<" not supported yet");
+ 	}
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp	(revision 19086)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp	(revision 19087)
+@@ -78,10 +78,6 @@
+ 					_error_("Mesh not supported yet");
+ 			}
+ 			break;
+-		case MatseaiceEnum:
+-			iomodel->FetchDataToInput(elements,DamageEnum);
+-			for (i=0;i<iomodel->numberofelements;i++) if(iomodel->my_elements[i]) materials->AddObject(new Matseaice(i+1,i,iomodel));
+-			break;
+ 		default:
+ 			_error_("Materials "<<EnumToStringx(materials_type)<<" not supported");
+ 	}
+Index: ../trunk-jpl/src/c/Makefile.am
+===================================================================
+--- ../trunk-jpl/src/c/Makefile.am	(revision 19086)
++++ ../trunk-jpl/src/c/Makefile.am	(revision 19087)
+@@ -54,7 +54,6 @@
+ 					./classes/Inputs/DatasetInput.cpp\
+ 					./classes/Materials/Materials.cpp\
+ 					./classes/Materials/Matice.cpp\
+-					./classes/Materials/Matseaice.cpp\
+ 					./classes/Materials/Matpar.cpp\
+ 					./classes/Constraints/Constraints.cpp\
+ 					./classes/Constraints/SpcStatic.cpp\
+@@ -409,10 +408,6 @@
+ if DEPTHAVERAGE
+ issm_sources += ./analyses/DepthAverageAnalysis.cpp
+ endif
+-if SEAICE
+-issm_sources += ./cores/seaice_core.cpp
+-issm_sources += ./analyses/SeaiceAnalysis.cpp
+-endif
+ if THERMAL
+ issm_sources += ./analyses/ThermalAnalysis.cpp
+ endif
+Index: ../trunk-jpl/src/c/cores/seaice_core.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/seaice_core.cpp	(revision 19086)
++++ ../trunk-jpl/src/c/cores/seaice_core.cpp	(revision 19087)
+@@ -1,37 +0,0 @@
+-/*!\file: seaice_core.cpp
+- * \brief: core of the seaice solution 
+- */ 
+-
+-#include "./cores.h"
+-#include "../toolkits/toolkits.h"
+-#include "../classes/classes.h"
+-#include "../shared/shared.h"
+-#include "../modules/modules.h"
+-#include "../solutionsequences/solutionsequences.h"
+-
+-void seaice_core(FemModel* femmodel){
+-
+-	/*parameters: */
+-	bool           save_results;
+-	SeaiceAnalysis analysis = SeaiceAnalysis();
+-
+-	/*recover parameters: */
+-	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+-
+-	/*Launch solution sequence for the only analysis we are interested in*/
+-	femmodel->SetCurrentConfiguration(SeaiceAnalysisEnum);
+-	analysis.UpdateDamageAndStress(femmodel);
+-	solutionsequence_linear(femmodel);
+-	analysis.PostProcess(femmodel);
+-
+-	if(save_results){
+-		if(VerboseSolution()) _printf0_("   saving results\n");
+-		int outputs[14] = {VxEnum,VyEnum,VelEnum,
+-			SeaiceConcentrationEnum,SeaiceThicknessEnum,DamageEnum,
+-			StressTensorPredictorxxEnum,StressTensorPredictoryyEnum,StressTensorPredictorxyEnum,
+-			StressTensorxxEnum,StressTensoryyEnum,StressTensorxyEnum,
+-			MeshXEnum,MeshYEnum};
+-		femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],14);
+-	}
+-
+-}
+Index: ../trunk-jpl/src/c/cores/CorePointerFromSolutionEnum.cpp
+===================================================================
+--- ../trunk-jpl/src/c/cores/CorePointerFromSolutionEnum.cpp	(revision 19086)
++++ ../trunk-jpl/src/c/cores/CorePointerFromSolutionEnum.cpp	(revision 19087)
+@@ -68,9 +68,6 @@
+ 		case DamageEvolutionSolutionEnum:
+ 			solutioncore=&damage_core;
+ 			break;
+-		case SeaiceSolutionEnum:
+-			solutioncore=&seaice_core;
+-			break;
+ 		default:
+ 			_error_("solution type: " << EnumToStringx(solutiontype) << " not supported yet!");
+ 			break;
+Index: ../trunk-jpl/src/c/cores/cores.h
+===================================================================
+--- ../trunk-jpl/src/c/cores/cores.h	(revision 19086)
++++ ../trunk-jpl/src/c/cores/cores.h	(revision 19087)
+@@ -46,7 +46,6 @@
+ void dummy_core(FemModel* femmodel);
+ void gia_core(FemModel* femmodel);
+ void damage_core(FemModel* femmodel);
+-void seaice_core(FemModel* femmodel);
+ IssmDouble objectivefunction(IssmDouble search_scalar,FemModel* femmodel);
+ 
+ //optimization
+Index: ../trunk-jpl/src/c/classes/Materials/Matseaice.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Matseaice.h	(revision 19086)
++++ ../trunk-jpl/src/c/classes/Materials/Matseaice.h	(revision 19087)
+@@ -1,75 +0,0 @@
+-/*!\file Matseaice.h
+- * \brief: header file for matice object
+- */
+-
+-#ifndef MATSEAICE_H_
+-#define MATSEAICE_H_
+-
+-/*Headers:*/
+-/*{{{*/
+-#include "./Material.h"
+-#include "../Hook.h"
+-class IoModel;
+-class Elements;
+-class Element;
+-class Loads;
+-class Nodes;
+-class Vertices;
+-class Materials;
+-class Parameters;
+-/*}}}*/
+-
+-class Matseaice: public Material{
+-
+-	private: 
+-		int      mid;
+-		Hook    *helement;
+-		Element *element;
+-
+-	public:
+-		/*Matseaice constructors, destructors: {{{*/
+-		Matseaice();
+-		Matseaice(int mid,int i, IoModel* iomodel);
+-		~Matseaice();
+-		/*}}}*/
+-		/*Object virtual functions definitions:{{{ */
+-		void  Echo();
+-		void  DeepEcho();
+-		int   Id(); 
+-		int   ObjectEnum();
+-		Object* copy();
+-		/*}}}*/
+-		/*Update virtual funictions definitions: {{{*/
+-		void  InputUpdateFromVector(IssmDouble* vector, int name, int type){_error_("not implemented");};
+-		void  InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrow, int ncols, int name, int type){_error_("not implemented");};
+-		void  InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){_error_("not implemented");};
+-		void  InputUpdateFromConstant(IssmDouble constant, int name){_error_("not implemented");};
+-		void  InputUpdateFromConstant(int constant, int name){_error_("not implemented");};
+-		void  InputUpdateFromConstant(bool constant, int name){_error_("not implemented");};
+-		void  InputUpdateFromIoModel(int index, IoModel* iomodel){_error_("not implemented");};
+-		/*}}}*/
+-		/*Material virtual functions resolution: {{{*/
+-		void   Configure(Elements* elements);
+-		Material*  copy2(Element* element);
+-		void       SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
+-		void       GetViscosity(IssmDouble* pviscosity, IssmDouble eps_eff){_error_("not supported for this material");};
+-		void       GetViscosity_B(IssmDouble* pviscosity, IssmDouble eps_eff){_error_("not supported for this material");};
+-		void       GetViscosity_D(IssmDouble* pviscosity, IssmDouble eps_eff){_error_("not supported for this material");};
+-		void       GetViscosityBar(IssmDouble* pviscosity, IssmDouble eps_eff){_error_("not supported for this material");};
+-		void       GetViscosityComplement(IssmDouble* pviscosity_complement, IssmDouble* pepsilon){_error_("not supported for this material");};
+-		void       GetViscosityDComplement(IssmDouble*, IssmDouble*){_error_("not supported for this material");};
+-		void       GetViscosityDerivativeEpsSquare(IssmDouble* pmu_prime, IssmDouble* pepsilon){_error_("not supported for this material");};
+-		void       GetViscosity2dDerivativeEpsSquare(IssmDouble* pmu_prime, IssmDouble* pepsilon){_error_("not supported for this material");};
+-		IssmDouble GetA(){_error_("not supported for this material");};
+-		IssmDouble GetAbar(){_error_("not supported for this material");};
+-		IssmDouble GetB(){_error_("not supported for this material");};
+-		IssmDouble GetBbar(){_error_("not supported for this material");};
+-		IssmDouble GetD(){_error_("not supported for this material");};
+-		IssmDouble GetDbar(){_error_("not supported for this material");};
+-		IssmDouble GetN(){_error_("not supported for this material");};
+-		bool       IsDamage(){_error_("not supported for this material");};
+-		void       ResetHooks();
+-		/*}}}*/
+-};
+-
+-#endif  /* _MATICE_H_ */
+Index: ../trunk-jpl/src/c/classes/Materials/Matseaice.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Matseaice.cpp	(revision 19086)
++++ ../trunk-jpl/src/c/classes/Materials/Matseaice.cpp	(revision 19087)
+@@ -1,136 +0,0 @@
+-/*!\file Matseaice.c
+- * \brief: implementation of the Matseaice object
+- */
+-
+-#ifdef HAVE_CONFIG_H
+-	#include <config.h>
+-#else
+-#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+-#endif
+-
+-#include "./Matseaice.h"
+-#include "./Materials.h"
+-#include "../Inputs/Input.h"
+-#include "../Inputs/Inputs.h"
+-#include "../Inputs/TriaInput.h"
+-#include "../Inputs/PentaInput.h"
+-#include "../Inputs/ControlInput.h"
+-#include "../Elements/Element.h"
+-#include "../Elements/Tria.h"
+-#include "../Elements/Penta.h"
+-#include "../Params/Parameters.h"
+-#include "../Vertex.h"
+-#include "../Hook.h"
+-#include "../Node.h"
+-#include "../IoModel.h"
+-#include "../../shared/shared.h"
+-
+-/*Matseaice constructors and destructor*/
+-Matseaice::Matseaice(){/*{{{*/
+-	this->helement=NULL;
+-	this->element=NULL;
+-	return;
+-}
+-/*}}}*/
+-Matseaice::Matseaice(int matseaice_mid,int index, IoModel* iomodel){/*{{{*/
+-
+-	/*Intermediaries:*/
+-	int    matseaice_eid;
+-
+-	/*Initialize id*/
+-	this->mid=matseaice_mid;
+-
+-	/*Hooks: */
+-	matseaice_eid=index+1;
+-	this->helement=new Hook(&matseaice_eid,1);
+-	this->element=NULL;
+-
+-	return;
+-}
+-/*}}}*/
+-Matseaice::~Matseaice(){/*{{{*/
+-	delete helement;
+-	return;
+-}
+-/*}}}*/
+-
+-/*Object virtual functions definitions:*/
+-void Matseaice::Echo(void){/*{{{*/
+-
+-	_printf_("Matseaice:\n");
+-	_printf_("   mid: " << mid << "\n");
+-	_printf_("   element:\n");
+-	helement->Echo();
+-}
+-/*}}}*/
+-void Matseaice::DeepEcho(void){/*{{{*/
+-
+-	_printf_("Matseaice:\n");
+-	_printf_("   mid: " << mid << "\n");
+-	_printf_("   element:\n");
+-	helement->Echo();
+-}		
+-/*}}}*/
+-int  Matseaice::Id(void){ return mid; }/*{{{*/
+-/*}}}*/
+-int Matseaice::ObjectEnum(void){/*{{{*/
+-
+-	return MatseaiceEnum;
+-
+-}
+-/*}}}*/
+-Object* Matseaice::copy() {/*{{{*/
+-
+-	/*Output*/
+-	Matseaice* matseaice=NULL;
+-
+-	/*Initialize output*/
+-	matseaice=new Matseaice();
+-
+-	/*copy fields: */
+-	matseaice->mid=this->mid;
+-	matseaice->helement=(Hook*)this->helement->copy();
+-	matseaice->element =(Element*)this->helement->delivers();
+-
+-	return matseaice;
+-}
+-/*}}}*/
+-Material* Matseaice::copy2(Element* element_in) {/*{{{*/
+-
+-	/*Output*/
+-	Matseaice* matseaice=NULL;
+-
+-	/*Initialize output*/
+-	matseaice=new Matseaice();
+-
+-	/*copy fields: */
+-	matseaice->mid=this->mid;
+-	matseaice->helement=(Hook*)this->helement->copy();
+-	matseaice->element =element_in;
+-
+-	return matseaice;
+-}
+-/*}}}*/
+-
+-/*Matseaice management*/
+-void  Matseaice::Configure(Elements* elementsin){/*{{{*/
+-
+-	/*Take care of hooking up all objects for this element, ie links the objects in the hooks to their respective 
+-	 * datasets, using internal ids and offsets hidden in hooks: */
+-	helement->configure((DataSet*)elementsin);
+-	this->element  = (Element*)helement->delivers();
+-}
+-/*}}}*/
+-void  Matseaice::SetCurrentConfiguration(Elements* elementsin,Loads* loadsin,Nodes* nodesin,Vertices* verticesin,Materials* materialsin,Parameters* parametersin){/*{{{*/
+-
+-}
+-/*}}}*/
+-void  Matseaice::ResetHooks(){/*{{{*/
+-
+-	this->element=NULL;
+-
+-	/*Get Element type*/
+-	this->helement->reset();
+-
+-}
+-/*}}}*/
+Index: ../trunk-jpl/src/c/classes/Materials/Matpar.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 19086)
++++ ../trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 19087)
+@@ -99,20 +99,6 @@
+ 			iomodel->Constant(&this->mantle_shear_modulus,MaterialsMantleShearModulusEnum);
+ 			iomodel->Constant(&this->mantle_density,MaterialsMantleDensityEnum);
+ 			break;
+-		case MatseaiceEnum:
+-			iomodel->Constant(&this->rho_ice,MaterialsRhoIceEnum);
+-			iomodel->Constant(&this->poisson,MaterialsPoissonEnum);
+-			iomodel->Constant(&this->young_modulus,MaterialsYoungModulusEnum);
+-			iomodel->Constant(&this->ridging_exponent,MaterialsRidgingExponentEnum);
+-			iomodel->Constant(&this->cohesion,MaterialsCohesionEnum);
+-			iomodel->Constant(&this->internal_friction_coef,MaterialsInternalFrictionCoefEnum);
+-			iomodel->Constant(&this->compression_coef,MaterialsCompressionCoefEnum);
+-			iomodel->Constant(&this->traction_coef,MaterialsTractionCoefEnum);
+-			iomodel->Constant(&this->g,ConstantsGEnum);
+-			iomodel->Constant(&this->omega,ConstantsOmegaEnum);
+-			iomodel->Constant(&this->time_relaxation_stress,MaterialsTimeRelaxationStressEnum);
+-			iomodel->Constant(&this->time_relaxation_damage,MaterialsTimeRelaxationDamageEnum);
+-			break;
+ 		default:
+ 			_error_("Material "<< EnumToStringx(materials_type) <<" not supported yet");
+ 	}
+@@ -408,13 +394,6 @@
+ 		case HydrologydcEplMaxThicknessEnum:         return this->epl_max_thickness;
+ 		case HydrologydcWaterCompressibilityEnum:    return this->water_compressibility;
+ 		case ConstantsGEnum:                         return this->g;
+-		case MaterialsPoissonEnum:                   return this->poisson;
+-		case MaterialsYoungModulusEnum:              return this->young_modulus;
+-		case MaterialsRidgingExponentEnum:				return this->ridging_exponent;
+-		case MaterialsCohesionEnum:		            return this->cohesion;
+-		case MaterialsInternalFrictionCoefEnum:		return this->internal_friction_coef;
+-		case MaterialsCompressionCoefEnum:				return this->compression_coef;
+-		case MaterialsTractionCoefEnum:					return this->traction_coef;
+ 		case SurfaceforcingsDesfacEnum:              return this->desfac;
+ 		case SurfaceforcingsS0pEnum:                 return this->s0p;
+ 		case SurfaceforcingsS0tEnum:                 return this->s0t;
+@@ -424,9 +403,6 @@
+ 		case MaterialsLithosphereDensityEnum:        return this->lithosphere_density;
+ 		case MaterialsMantleDensityEnum:             return this->mantle_density;
+ 		case MaterialsMantleShearModulusEnum:        return this->mantle_shear_modulus;
+-		case ConstantsOmegaEnum:							return this->omega;
+-		case MaterialsTimeRelaxationStressEnum:		return this->time_relaxation_stress;
+-		case MaterialsTimeRelaxationDamageEnum:		return this->time_relaxation_damage;
+ 		default: _error_("Enum "<<EnumToStringx(enum_in)<<" not supported yet");
+ 	}
+ 
+Index: ../trunk-jpl/src/c/classes/classes.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/classes.h	(revision 19086)
++++ ../trunk-jpl/src/c/classes/classes.h	(revision 19087)
+@@ -79,7 +79,6 @@
+ #include "./Materials/Materials.h"
+ #include "./Materials/Material.h"
+ #include "./Materials/Matice.h"
+-#include "./Materials/Matseaice.h"
+ #include "./Materials/Matpar.h"
+ 
+ /*Params: */
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 19086)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 19087)
+@@ -587,10 +587,6 @@
+ 			}
+ 			break;
+ 
+-		case SeaiceSolutionEnum:
+-			analyses_temp[numanalyses++]=SeaiceAnalysisEnum;
+-			break;
+-
+ 		default:
+ 			_error_("solution type: " << EnumToStringx(solutiontype) << " not supported yet!");
+ 			break;
+Index: ../trunk-jpl/src/m/classes/matseaice.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/matseaice.m	(revision 19086)
++++ ../trunk-jpl/src/m/classes/matseaice.m	(revision 19087)
+@@ -1,111 +0,0 @@
+-%MATSEAICE class definition
+-%
+-%   Usage:
+-%      matseaice=matseaice();
+-
+-classdef matseaice
+-	properties (SetAccess=public) 
+-		rho_ice                = 0.;
+-		poisson                = 0.;
+-		young_modulus          = 0.;
+-		ridging_exponent       = 0.;
+-		cohesion               = 0.;
+-		internal_friction_coef = 0.;
+-		compression_coef       = 0.;
+-		traction_coef          = 0.;
+-		time_relaxation_stress  = 0.;
+-		time_relaxation_damage  = 0.;
+-	end
+-	methods
+-		function self = matseaice(varargin) % {{{
+-			switch nargin
+-				case 0
+-					self=setdefaultparameters(self);
+-				case 1
+-					inputstruct=varargin{1};
+-					list1 = properties('matseaice');
+-					list2 = fieldnames(inputstruct);
+-					for i=1:length(list1)
+-						fieldname = list1{i};
+-						if ismember(fieldname,list2),
+-							self.(fieldname) = inputstruct.(fieldname);
+-						end
+-					end
+-				otherwise
+-					error('constructor not supported');
+-			end
+-		end % }}}
+-		function self = setdefaultparameters(self) % {{{
+-
+-			%Ice density
+-			self.rho_ice = 917.; %kg/m^3
+-
+-			%poisson modulus
+-			self.poisson=0.3;
+-
+-			%Young modulus
+-			self.young_modulus=9.e+9;
+-
+-			%ridging exponent
+-			self.ridging_exponent=-20.;
+-
+-			%Cohesion (Weiss 2007)
+-			self.cohesion = 40.e+3; %40 kPa
+-
+-			%internal_friction_coef 
+-			self.internal_friction_coef=0.7;
+-
+-			%compression_coef (Bouillon and Rampal 2014)
+-			self.compression_coef=5./2;
+-
+-			%traction_coef (Bouillon and Rampal 2014)
+-			self.traction_coef=5./6.;
+-
+-			%Time relaxation stress
+-			%1e20 for the elastic case (perfect memory of the stress), equal to the timestep for the viscous case (no memory of the stress)
+-			self.time_relaxation_stress=1.e+20;
+-
+-			%Time relaxation damage
+-			%1e20 for the brittle case (perfect memory of the damage), equal to the timestep for the plastic case (no memory of the damage)
+-			self.time_relaxation_damage=1.e+20;
+-
+-		end % }}}
+-		function md = checkconsistency(self,md,solution,analyses) % {{{
+-			md = checkfield(md,'fieldname','materials.rho_ice','NaN',1,'>',0,'numel',1);
+-			md = checkfield(md,'fieldname','materials.poisson','NaN',1,'>',0,'<',.5,'numel',1);
+-			md = checkfield(md,'fieldname','materials.young_modulus','NaN',1,'>',0,'numel',1);
+-			md = checkfield(md,'fieldname','materials.ridging_exponent','NaN',1,'<',0,'numel',1);
+-			md = checkfield(md,'fieldname','materials.cohesion','NaN',1,'>',0,'numel',1);
+-			md = checkfield(md,'fieldname','materials.internal_friction_coef','NaN',1,'>',0,'numel',1);
+-			md = checkfield(md,'fieldname','materials.compression_coef','NaN',1,'>',1,'numel',1);
+-			md = checkfield(md,'fieldname','materials.traction_coef','NaN',1,'>',0,'<',1,'numel',1);
+-			md = checkfield(md,'fieldname','materials.time_relaxation_stress','NaN',1,'>',md.timestepping.time_step,'numel',1);
+-		end % }}}
+-		function disp(self) % {{{
+-			disp(sprintf('   Sea Ice Material:'));
+-			fielddisplay(self,'rho_ice','ice density [kg/m^3]');
+-			fielddisplay(self,'poisson','poisson ratio for undamaged ice [no unit]');
+-			fielddisplay(self,'young_modulus','Young modulus for undamaged ice [Pa]');
+-			fielddisplay(self,'ridging_exponent','Riging exponent (c, Hibler parameter) [no unit]');
+-			fielddisplay(self,'cohesion','cohesion (C) [Pa]');
+-			fielddisplay(self,'internal_friction_coef','Mohr-Coulomb internal friction coefficient (mu=tan(phi)) [no unit]');
+-			fielddisplay(self,'compression_coef','Ratio between cutoff compressive strength and the cohesion [no unit]');
+-			fielddisplay(self,'traction_coef','Ratio between cutoff tensile strength and Mohr-Coulomb tensile strength [no unit]');
+-			fielddisplay(self,'time_relaxation_stress','Relaxation time for stress (1e+20: elastic, dt: viscous) [s]');
+-			fielddisplay(self,'time_relaxation_damage','Relaxation time for damage (1e+20: brittle, dt: plastic) [s]');
+-		end % }}}
+-		function marshall(self,md,fid) % {{{
+-			WriteData(fid,'enum',MaterialsEnum(),'data',MatseaiceEnum(),'format','Integer');
+-			WriteData(fid,'object',self,'class','materials','fieldname','rho_ice','format','Double');
+-			WriteData(fid,'object',self,'class','materials','fieldname','poisson','format','Double');
+-			WriteData(fid,'object',self,'class','materials','fieldname','young_modulus','format','Double');
+-			WriteData(fid,'object',self,'class','materials','fieldname','ridging_exponent','format','Double');
+-			WriteData(fid,'object',self,'class','materials','fieldname','cohesion','format','Double');
+-			WriteData(fid,'object',self,'class','materials','fieldname','internal_friction_coef','format','Double');
+-			WriteData(fid,'object',self,'class','materials','fieldname','compression_coef','format','Double');
+-			WriteData(fid,'object',self,'class','materials','fieldname','traction_coef','format','Double');
+-			WriteData(fid,'object',self,'class','materials','fieldname','time_relaxation_stress','format','Double');
+-			WriteData(fid,'object',self,'class','materials','fieldname','time_relaxation_damage','format','Double');
+-		end % }}}
+-	end
+-end
+Index: ../trunk-jpl/src/m/classes/seaiceocean.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/seaiceocean.m	(revision 19086)
++++ ../trunk-jpl/src/m/classes/seaiceocean.m	(revision 19087)
+@@ -1,76 +0,0 @@
+-%SEAICEOCEAN Class definition
+-%
+-%   Usage:
+-%      seaiceocean=seaiceocean();
+-
+-classdef seaiceocean
+-	properties (SetAccess=public) 
+-		rho_ocean            = 0.;
+-		ocean_coef           = 0.;
+-		ocean_lin_drag_coef  = 0.;
+-		ocean_quad_drag_coef = 0.;
+-		ocean_turning_angle  = 0.;
+-		ocean_ssh            = NaN;
+-		ocean_vx             = NaN;
+-		ocean_vy             = NaN;
+-	end
+-	methods
+-		function self = seaiceocean(varargin) % {{{
+-			switch nargin
+-				case 0
+-					self=setdefaultparameters(self);
+-				otherwise
+-					error('constructor not supported');
+-			end
+-		end % }}}
+-		function self = setdefaultparameters(self) % {{{
+-
+-			%ocean density (kg/m^3)
+-			self.rho_ocean=1025.;
+-
+-			%By default, we apply the full stress
+-			self.ocean_coef = 1.;
+-
+-			%drag coefficients (different from Hibler 0.0055)
+-			self.ocean_lin_drag_coef  = 0.;
+-			self.ocean_quad_drag_coef = 0.004;
+-
+-			%Turning angle in degrees (McPhee 1998)
+-			self.ocean_turning_angle = deg2rad(25.);
+-
+-		end % }}}
+-		function md = checkconsistency(self,md,solution,analyses) % {{{
+-			md = checkfield(md,'fieldname','basalforcings.rho_ocean','NaN',1,'>',0.,'numel',1);
+-			md = checkfield(md,'fieldname','basalforcings.ocean_coef','NaN',1,'>=',0.,'<=',1.,'numel',1);
+-			md = checkfield(md,'fieldname','basalforcings.ocean_lin_drag_coef','NaN',1,'>=',0.,'numel',1);
+-			md = checkfield(md,'fieldname','basalforcings.ocean_quad_drag_coef','NaN',1,'>=',0.,'numel',1);
+-			md = checkfield(md,'fieldname','basalforcings.ocean_turning_angle','NaN',1,'>=',0.,'<',90,'numel',1);
+-			md = checkfield(md,'fieldname','basalforcings.ocean_ssh','NaN',1,'size',[md.mesh.numberofvertices 1]);
+-			md = checkfield(md,'fieldname','basalforcings.ocean_vx','NaN',1,'size',[md.mesh.numberofvertices 1]);
+-			md = checkfield(md,'fieldname','basalforcings.ocean_vy','NaN',1,'size',[md.mesh.numberofvertices 1]);
+-		end % }}}
+-		function disp(self) % {{{
+-			disp(sprintf('   Ocean forcings for sea ice:'));
+-			%disp(sprintf('\n     tau_b = ocean_coef*rho_ocean*...'));
+-			fielddisplay(self,'rho_ocean','ocean density [kg/m^3]');
+-			fielddisplay(self,'ocean_coef','ocean stress spin up coefficient (between 0 and 1)');
+-			fielddisplay(self,'ocean_lin_drag_coef','ocean linear drag coefficient [Pa/(m/s)]');
+-			fielddisplay(self,'ocean_quad_drag_coef','ocean quadratic drag coefficient [Pa/(m/s)^2]');
+-			fielddisplay(self,'ocean_turning_angle','ocean turning angle [rad]');
+-			fielddisplay(self,'ocean_ssh','ocean sea surface height [m]');
+-			fielddisplay(self,'ocean_vx','ocean speed x-component [m/s]');
+-			fielddisplay(self,'ocean_vy','ocean speed y-component [m/s]');
+-		end % }}}
+-		function marshall(self,md,fid) % {{{
+-			WriteData(fid,'enum',BasalforcingsEnum(),'data',SeaiceoceanEnum(),'format','Integer');
+-			WriteData(fid,'object',self,'class','basalforcings','fieldname','rho_ocean','format','Double');
+-			WriteData(fid,'object',self,'class','basalforcings','fieldname','ocean_coef','format','Double');
+-			WriteData(fid,'object',self,'class','basalforcings','fieldname','ocean_lin_drag_coef','format','Double');
+-			WriteData(fid,'object',self,'class','basalforcings','fieldname','ocean_quad_drag_coef','format','Double');
+-			WriteData(fid,'object',self,'class','basalforcings','fieldname','ocean_turning_angle','format','Double');
+-			WriteData(fid,'object',self,'class','basalforcings','fieldname','ocean_ssh','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',self,'class','basalforcings','fieldname','ocean_vx','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',self,'class','basalforcings','fieldname','ocean_vy','format','DoubleMat','mattype',1);
+-		end % }}}
+-	end
+-end
+Index: ../trunk-jpl/src/m/classes/seaice.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/seaice.m	(revision 19086)
++++ ../trunk-jpl/src/m/classes/seaice.m	(revision 19087)
+@@ -1,64 +0,0 @@
+-%SEAICE class definition
+-%
+-%   Usage:
+-%      seaice=seaice();
+-
+-classdef seaice
+-	properties (SetAccess=public) 
+-		min_concentration = 0.;
+-		min_thickness     = 0.;
+-		max_thickness     = 0.;
+-		spcvx             = NaN;
+-		spcvy             = NaN;
+-		coriolis_factor   = NaN;
+-	end
+-	methods
+-		function self = seaice(varargin) % {{{
+-			switch nargin
+-				case 0
+-					self=setdefaultparameters(self);
+-					return;
+-				otherwise
+-					error('constructor not supported');
+-			end
+-		end % }}}
+-		function md = checkconsistency(self,md,solution,analyses) % {{{
+-			if solution~=SeaiceSolutionEnum(), return; end
+-			md = checkfield(md,'fieldname','seaice.min_concentration','NaN',1,'>=',0,'numel',1);
+-			md = checkfield(md,'fieldname','seaice.min_thickness','NaN',1,'>=',0,'numel',1);
+-			md = checkfield(md,'fieldname','seaice.max_thickness','NaN',1,'>',0,'numel',1);
+-			md = checkfield(md,'fieldname','seaice.spcvx','size',[md.mesh.numberofvertices 1]);
+-			md = checkfield(md,'fieldname','seaice.spcvy','size',[md.mesh.numberofvertices 1]);
+-			md = checkfield(md,'fieldname','seaice.coriolis_factor','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
+-		end % }}}
+-		function self = setdefaultparameters(self) % {{{
+-
+-			%Minimum ice concentration allowed in the simulation
+-			self.min_concentration=0.;
+-
+-			%Minimum ice thickness allowed in the simulation
+-			self.min_thickness=0.;
+-
+-			%Maxmimum ice thickness allowed in the simulation
+-			self.max_thickness=25.;
+-
+-		end % }}}
+-		function disp(self) % {{{
+-			disp(sprintf('   seaice parameters:'));
+-			fielddisplay(self,'min_concentration','minimum ice concentration allowed in the simulation [no unit]');
+-			fielddisplay(self,'min_thickness','minimum ice thickness allowed in the simulation [m]');
+-			fielddisplay(self,'max_thickness','maximum ice thickness allowed in the simulation [m]');
+-			fielddisplay(self,'spcvx','x-axis velocity constraint (NaN means no constraint) [m/s]');
+-			fielddisplay(self,'spcvy','y-axis velocity constraint (NaN means no constraint) [m/s]');
+-			fielddisplay(self,'coriolis_factor','factor applied to Coriolis forces (latitude dependent)');
+-		end % }}}
+-		function marshall(self,md,fid) % {{{
+-			WriteData(fid,'object',self,'fieldname','min_concentration','format','Double');
+-			WriteData(fid,'object',self,'fieldname','min_thickness','format','Double');
+-			WriteData(fid,'object',self,'fieldname','max_thickness','format','Double');
+-			WriteData(fid,'object',self,'fieldname','spcvx','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',self,'fieldname','spcvy','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',self,'fieldname','coriolis_factor','format','DoubleMat','mattype',2);
+-		end % }}}
+-	end
+-end
+Index: ../trunk-jpl/src/m/classes/seaiceinitialization.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/seaiceinitialization.m	(revision 19086)
++++ ../trunk-jpl/src/m/classes/seaiceinitialization.m	(revision 19087)
+@@ -1,74 +0,0 @@
+-%SEAICEINITIALIZATION class definition
+-%
+-%   Usage:
+-%      seaiceinitialization=seaiceinitialization();
+-
+-classdef seaiceinitialization
+-	properties (SetAccess=public) 
+-		thickness          = NaN;
+-		concentration      = NaN;
+-		vx                 = NaN;
+-		vy                 = NaN;
+-		vx_coriolis        = NaN;
+-		vy_coriolis        = NaN;
+-		sigma_predictor_xx = NaN;
+-		sigma_predictor_yy = NaN;
+-		sigma_predictor_xy = NaN;
+-		damage             = NaN;
+-		mesh_x             = NaN;
+-		mesh_y             = NaN;
+-	end
+-	methods
+-		function self = seaiceinitialization(varargin) % {{{
+-			switch nargin
+-				case 0
+-					return;
+-				otherwise
+-					error('constructor not supported');
+-			end
+-		end % }}}
+-		function md = checkconsistency(self,md,solution,analyses) % {{{
+-			md = checkfield(md,'fieldname','initialization.thickness','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
+-			md = checkfield(md,'fieldname','initialization.concentration','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
+-			md = checkfield(md,'fieldname','initialization.vx','NaN',1,'size',[md.mesh.numberofvertices 1]);
+-			md = checkfield(md,'fieldname','initialization.vy','NaN',1,'size',[md.mesh.numberofvertices 1]);
+-			md = checkfield(md,'fieldname','initialization.vx_coriolis','NaN',1,'size',[md.mesh.numberofvertices 1]);
+-			md = checkfield(md,'fieldname','initialization.vy_coriolis','NaN',1,'size',[md.mesh.numberofvertices 1]);
+-			md = checkfield(md,'fieldname','initialization.sigma_predictor_xx','NaN',1,'>=',0,'<',1,'size',[md.mesh.numberofelements 1]);
+-			md = checkfield(md,'fieldname','initialization.sigma_predictor_yy','NaN',1,'>=',0,'<',1,'size',[md.mesh.numberofelements 1]);
+-			md = checkfield(md,'fieldname','initialization.sigma_predictor_xy','NaN',1,'>=',0,'<',1,'size',[md.mesh.numberofelements 1]);
+-			md = checkfield(md,'fieldname','initialization.damage','NaN',1,'>=',0,'<',1,'size',[md.mesh.numberofelements 1]);
+-			md = checkfield(md,'fieldname','initialization.mesh_x','NaN',1,'size',[md.mesh.numberofvertices 1]);
+-			md = checkfield(md,'fieldname','initialization.mesh_y','NaN',1,'size',[md.mesh.numberofvertices 1]);
+-		end % }}}
+-		function disp(self) % {{{
+-			disp(sprintf('   initial field values:'));
+-			fielddisplay(self,'thickness','sea ice thickness [m]');
+-			fielddisplay(self,'concentration','sea ice concentration (between 0 and 1)');
+-			fielddisplay(self,'vx','x component of the ice velocity [m/s]');
+-			fielddisplay(self,'vy','y component of the ice velocity [m/s]');
+-			fielddisplay(self,'vx_coriolis','x component of the ice velocity used to calculate coriolis forces [m/s]');
+-			fielddisplay(self,'vy_coriolis','y component of the ice velocity used to calculate coriolis forces [m/s]');
+-			fielddisplay(self,'sigma_predictor_xx','Predictor for the xx component of the Cauchy stress tensor [Pa]');
+-			fielddisplay(self,'sigma_predictor_yy','Predictor for the yy component of the Cauchy stress tensor [Pa]');
+-			fielddisplay(self,'sigma_predictor_xy','Predictor for the xy component of the Cauchy stress tensor [Pa]');
+-			fielddisplay(self,'damage','damage, between 0 (no damage) and 1 (fully damaged)');
+-			fielddisplay(self,'mesh_x','x position of each vertex of the mesh using a Lagrangian approach');
+-			fielddisplay(self,'mesh_y','y position of each vertex of the mesh using a Lagrangian approach');
+-		end % }}}
+-		function marshall(self,md,fid) % {{{
+-			WriteData(fid,'data',self.thickness,'format','DoubleMat','mattype',2,'enum',SeaiceThicknessEnum());
+-			WriteData(fid,'data',self.concentration,'format','DoubleMat','mattype',2,'enum',SeaiceConcentrationEnum());
+-			WriteData(fid,'data',self.vx,'format','DoubleMat','mattype',1,'enum',VxEnum);
+-			WriteData(fid,'data',self.vy,'format','DoubleMat','mattype',1,'enum',VyEnum);
+-			WriteData(fid,'data',self.vx_coriolis,'format','DoubleMat','mattype',1,'enum',VxStarEnum());
+-			WriteData(fid,'data',self.vy_coriolis,'format','DoubleMat','mattype',1,'enum',VyStarEnum());
+-			WriteData(fid,'data',self.sigma_predictor_xx,'format','DoubleMat','mattype',2,'enum',StressTensorPredictorxxEnum());
+-			WriteData(fid,'data',self.sigma_predictor_yy,'format','DoubleMat','mattype',2,'enum',StressTensorPredictoryyEnum());
+-			WriteData(fid,'data',self.sigma_predictor_xy,'format','DoubleMat','mattype',2,'enum',StressTensorPredictorxyEnum());
+-			WriteData(fid,'data',self.damage,'format','DoubleMat','mattype',2,'enum',DamageEnum());
+-			WriteData(fid,'data',self.mesh_x,'format','DoubleMat','mattype',1,'enum',MeshXEnum());
+-			WriteData(fid,'data',self.mesh_y,'format','DoubleMat','mattype',1,'enum',MeshYEnum());
+-		end % }}}
+-	end
+-end
+Index: ../trunk-jpl/src/m/classes/seaiceatm.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/seaiceatm.m	(revision 19086)
++++ ../trunk-jpl/src/m/classes/seaiceatm.m	(revision 19087)
+@@ -1,65 +0,0 @@
+-%SEAICEATM Class definition
+-%
+-%   Usage:
+-%      seaiceatm=seaiceatm();
+-
+-classdef seaiceatm
+-	properties (SetAccess=public) 
+-		rho_air            = 0.;
+-		air_coef           = 0.;
+-		air_lin_drag_coef  = 0.;
+-		air_quad_drag_coef = 0.;
+-		wind_vx            = NaN;
+-		wind_vy            = NaN;
+-	end
+-	methods
+-		function self = seaiceatm(varargin) % {{{
+-			switch nargin
+-				case 0
+-					self=setdefaultparameters(self);
+-				otherwise
+-					error('constructor not supported');
+-			end
+-		end % }}}
+-		function self = setdefaultparameters(self) % {{{
+-
+-			%air density (kg/m^3)
+-			self.rho_air=1.3;
+-
+-			%By default, we apply the full stress
+-			self.air_coef = 1.;
+-
+-			%drag coefficients (different from Hibler 0.0012)
+-			self.air_lin_drag_coef  = 0.;
+-			self.air_quad_drag_coef = 0.003;
+-
+-		end % }}}
+-		function md = checkconsistency(self,md,solution,analyses) % {{{
+-			md = checkfield(md,'fieldname','surfaceforcings.rho_air','NaN',1,'>',0.,'numel',1);
+-			md = checkfield(md,'fieldname','surfaceforcings.air_coef','NaN',1,'>=',0.,'<=',1,'numel',1);
+-			md = checkfield(md,'fieldname','surfaceforcings.air_lin_drag_coef','NaN',1,'>=',0.,'numel',1);
+-			md = checkfield(md,'fieldname','surfaceforcings.air_quad_drag_coef','NaN',1,'>=',0.,'numel',1);
+-			md = checkfield(md,'fieldname','surfaceforcings.wind_vx','NaN',1,'size',[md.mesh.numberofvertices 1]);
+-			md = checkfield(md,'fieldname','surfaceforcings.wind_vy','NaN',1,'size',[md.mesh.numberofvertices 1]);
+-		end % }}}
+-		function disp(self) % {{{
+-			disp(sprintf('   Atmospheric forcings for sea ice:'));
+-			disp(sprintf('\n     tau_a = air_coef*rho_air*(air_lin_drag_coef+air_quad_drag_coef*|v_wind|)*v_wind\n'));
+-			fielddisplay(self,'rho_air','air density [kg/m^3]');
+-			fielddisplay(self,'air_coef','atmospheric stress spin up coefficient (between 0 and 1)');
+-			fielddisplay(self,'air_lin_drag_coef','air linear drag coefficient (no unit)');
+-			fielddisplay(self,'air_quad_drag_coef','air quadratic drag coefficient [s/m]');
+-			fielddisplay(self,'wind_vx','wind speed x-component at 10 m elevation [m/s]');
+-			fielddisplay(self,'wind_vy','wind speed y-component at 10 m elevation [m/s]');
+-		end % }}}
+-		function marshall(self,md,fid) % {{{
+-			WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SeaiceatmEnum(),'format','Integer');
+-			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','rho_air','format','Double');
+-			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','air_coef','format','Double');
+-			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','air_lin_drag_coef','format','Double');
+-			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','air_quad_drag_coef','format','Double');
+-			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','wind_vx','format','DoubleMat','mattype',1);
+-			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','wind_vy','format','DoubleMat','mattype',1);
+-		end % }}}
+-	end
+-end
+Index: ../trunk-jpl/src/m/classes/model.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/model.m	(revision 19086)
++++ ../trunk-jpl/src/m/classes/model.m	(revision 19087)
+@@ -39,8 +39,6 @@
+ 		calving          = 0;
+ 		gia              = 0;
+ 
+-		seaice           = 0;
+-
+ 		autodiff         = 0;
+ 		flaim            = 0;
+ 		inversion        = 0;
+@@ -126,10 +124,6 @@
+ 					md.mesh=mesh2dvertical(md.mesh);
+ 				end
+ 			end
+-			%2014 September 11
+-			if isa(md.seaice,'double');
+-				md.seaice=seaice();
+-			end
+ 			%2014 November 12
+ 			if isa(md.calving,'double');
+ 				md.calving=calving();
+@@ -143,24 +137,8 @@
+ 				case 0
+ 					md=setdefaultparameters(md);
+ 				case 1
+-					if strcmpi(varargin{1},'seaice'),
+-						md=setdefaultparameters(md);
++					error('model constructor not supported yet');
+ 
+-						%Specific subject for sea ice model
+-						md.materials       = matseaice();
+-						md.surfaceforcings = seaiceatm();
+-						md.basalforcings   = seaiceocean();
+-						md.initialization  = seaiceinitialization();
+-
+-						%Change some of the defauls
+-						md.timestepping.in_years   = false;
+-						md.timestepping.time_step  = 600;
+-						md.timestepping.final_time = 600;
+-						md.constants.g             = 9.80616; %Same as TOPAZ
+-					else
+-						error('model constructor not supported yet');
+-					end
+-
+ 				otherwise
+ 					error('model constructor error message: 0 of 1 argument only in input.');
+ 				end
+@@ -1091,7 +1069,6 @@
+ 			md.transient        = transient();
+ 			md.calving          = calving();
+ 			md.gia              = gia();
+-			md.seaice           = seaice();
+ 			md.autodiff         = autodiff();
+ 			md.flaim            = flaim();
+ 			md.inversion        = inversion();
+@@ -1270,7 +1247,6 @@
+ 			disp(sprintf('%19s: %-22s -- %s','results'         ,['[1x1 ' class(self.results) ']'],'model results'));
+ 			disp(sprintf('%19s: %-22s -- %s','radaroverlay'    ,['[1x1 ' class(self.radaroverlay) ']'],'radar image for plot overlay'));
+ 			disp(sprintf('%19s: %-22s -- %s','miscellaneous'   ,['[1x1 ' class(self.miscellaneous) ']'],'miscellaneous fields'));
+-			disp(sprintf('%19s: %-22s -- %s','seaice'       ,['[1x1 ' class(self.seaice) ']'],'parameters for Sea Ice solution'));
+ 		end % }}}
+ 		function memory(self) % {{{
+ 
+Index: ../trunk-jpl/src/m/enum/MaterialsYoungModulusEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsYoungModulusEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/MaterialsYoungModulusEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=MaterialsYoungModulusEnum()
+-%MATERIALSYOUNGMODULUSENUM - Enum of MaterialsYoungModulus
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=MaterialsYoungModulusEnum()
+-
+-macro=StringToEnum('MaterialsYoungModulus');
+Index: ../trunk-jpl/src/m/enum/BasalforcingsOceanLinDragCoefEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BasalforcingsOceanLinDragCoefEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/BasalforcingsOceanLinDragCoefEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=BasalforcingsOceanLinDragCoefEnum()
+-%BASALFORCINGSOCEANLINDRAGCOEFENUM - Enum of BasalforcingsOceanLinDragCoef
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=BasalforcingsOceanLinDragCoefEnum()
+-
+-macro=StringToEnum('BasalforcingsOceanLinDragCoef');
+Index: ../trunk-jpl/src/m/enum/MaterialsCohesionEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsCohesionEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/MaterialsCohesionEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=MaterialsCohesionEnum()
+-%MATERIALSCOHESIONENUM - Enum of MaterialsCohesion
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=MaterialsCohesionEnum()
+-
+-macro=StringToEnum('MaterialsCohesion');
+Index: ../trunk-jpl/src/m/enum/StressTensorPredictorxxEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressTensorPredictorxxEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/StressTensorPredictorxxEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=StressTensorPredictorxxEnum()
+-%STRESSTENSORPREDICTORXXENUM - Enum of StressTensorPredictorxx
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=StressTensorPredictorxxEnum()
+-
+-macro=StringToEnum('StressTensorPredictorxx');
+Index: ../trunk-jpl/src/m/enum/MaterialsTimeRelaxationDamageEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsTimeRelaxationDamageEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/MaterialsTimeRelaxationDamageEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=MaterialsTimeRelaxationDamageEnum()
+-%MATERIALSTIMERELAXATIONDAMAGEENUM - Enum of MaterialsTimeRelaxationDamage
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=MaterialsTimeRelaxationDamageEnum()
+-
+-macro=StringToEnum('MaterialsTimeRelaxationDamage');
+Index: ../trunk-jpl/src/m/enum/SeaiceCoriolisFactorEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceCoriolisFactorEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/SeaiceCoriolisFactorEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=SeaiceCoriolisFactorEnum()
+-%SEAICECORIOLISFACTORENUM - Enum of SeaiceCoriolisFactor
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SeaiceCoriolisFactorEnum()
+-
+-macro=StringToEnum('SeaiceCoriolisFactor');
+Index: ../trunk-jpl/src/m/enum/BasalforcingsRhoOceanEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BasalforcingsRhoOceanEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/BasalforcingsRhoOceanEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=BasalforcingsRhoOceanEnum()
+-%BASALFORCINGSRHOOCEANENUM - Enum of BasalforcingsRhoOcean
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=BasalforcingsRhoOceanEnum()
+-
+-macro=StringToEnum('BasalforcingsRhoOcean');
+Index: ../trunk-jpl/src/m/enum/MaterialsInternalFrictionCoefEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsInternalFrictionCoefEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/MaterialsInternalFrictionCoefEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=MaterialsInternalFrictionCoefEnum()
+-%MATERIALSINTERNALFRICTIONCOEFENUM - Enum of MaterialsInternalFrictionCoef
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=MaterialsInternalFrictionCoefEnum()
+-
+-macro=StringToEnum('MaterialsInternalFrictionCoef');
+Index: ../trunk-jpl/src/m/enum/SeaiceConcentrationEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceConcentrationEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/SeaiceConcentrationEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=SeaiceConcentrationEnum()
+-%SEAICECONCENTRATIONENUM - Enum of SeaiceConcentration
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SeaiceConcentrationEnum()
+-
+-macro=StringToEnum('SeaiceConcentration');
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsWindVxEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsWindVxEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsWindVxEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=SurfaceforcingsWindVxEnum()
+-%SURFACEFORCINGSWINDVXENUM - Enum of SurfaceforcingsWindVx
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SurfaceforcingsWindVxEnum()
+-
+-macro=StringToEnum('SurfaceforcingsWindVx');
+Index: ../trunk-jpl/src/m/enum/VyStarEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/VyStarEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/VyStarEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=VyStarEnum()
+-%VYSTARENUM - Enum of VyStar
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=VyStarEnum()
+-
+-macro=StringToEnum('VyStar');
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsAirLinDragCoefEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsAirLinDragCoefEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsAirLinDragCoefEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=SurfaceforcingsAirLinDragCoefEnum()
+-%SURFACEFORCINGSAIRLINDRAGCOEFENUM - Enum of SurfaceforcingsAirLinDragCoef
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SurfaceforcingsAirLinDragCoefEnum()
+-
+-macro=StringToEnum('SurfaceforcingsAirLinDragCoef');
+Index: ../trunk-jpl/src/m/enum/SeaiceSolutionEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceSolutionEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/SeaiceSolutionEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=SeaiceSolutionEnum()
+-%SEAICESOLUTIONENUM - Enum of SeaiceSolution
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SeaiceSolutionEnum()
+-
+-macro=StringToEnum('SeaiceSolution');
+Index: ../trunk-jpl/src/m/enum/MaterialsPoissonEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsPoissonEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/MaterialsPoissonEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=MaterialsPoissonEnum()
+-%MATERIALSPOISSONENUM - Enum of MaterialsPoisson
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=MaterialsPoissonEnum()
+-
+-macro=StringToEnum('MaterialsPoisson');
+Index: ../trunk-jpl/src/m/enum/MaterialsCompressionCoefEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsCompressionCoefEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/MaterialsCompressionCoefEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=MaterialsCompressionCoefEnum()
+-%MATERIALSCOMPRESSIONCOEFENUM - Enum of MaterialsCompressionCoef
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=MaterialsCompressionCoefEnum()
+-
+-macro=StringToEnum('MaterialsCompressionCoef');
+Index: ../trunk-jpl/src/m/enum/StressTensorPredictorxyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressTensorPredictorxyEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/StressTensorPredictorxyEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=StressTensorPredictorxyEnum()
+-%STRESSTENSORPREDICTORXYENUM - Enum of StressTensorPredictorxy
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=StressTensorPredictorxyEnum()
+-
+-macro=StringToEnum('StressTensorPredictorxy');
+Index: ../trunk-jpl/src/m/enum/BasalforcingsOceanCoefEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BasalforcingsOceanCoefEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/BasalforcingsOceanCoefEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=BasalforcingsOceanCoefEnum()
+-%BASALFORCINGSOCEANCOEFENUM - Enum of BasalforcingsOceanCoef
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=BasalforcingsOceanCoefEnum()
+-
+-macro=StringToEnum('BasalforcingsOceanCoef');
+Index: ../trunk-jpl/src/m/enum/MaterialsTractionCoefEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsTractionCoefEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/MaterialsTractionCoefEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=MaterialsTractionCoefEnum()
+-%MATERIALSTRACTIONCOEFENUM - Enum of MaterialsTractionCoef
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=MaterialsTractionCoefEnum()
+-
+-macro=StringToEnum('MaterialsTractionCoef');
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsAirCoefEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsAirCoefEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsAirCoefEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=SurfaceforcingsAirCoefEnum()
+-%SURFACEFORCINGSAIRCOEFENUM - Enum of SurfaceforcingsAirCoef
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SurfaceforcingsAirCoefEnum()
+-
+-macro=StringToEnum('SurfaceforcingsAirCoef');
+Index: ../trunk-jpl/src/m/enum/BasalforcingsOceanVxEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BasalforcingsOceanVxEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/BasalforcingsOceanVxEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=BasalforcingsOceanVxEnum()
+-%BASALFORCINGSOCEANVXENUM - Enum of BasalforcingsOceanVx
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=BasalforcingsOceanVxEnum()
+-
+-macro=StringToEnum('BasalforcingsOceanVx');
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsWindVyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsWindVyEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsWindVyEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=SurfaceforcingsWindVyEnum()
+-%SURFACEFORCINGSWINDVYENUM - Enum of SurfaceforcingsWindVy
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SurfaceforcingsWindVyEnum()
+-
+-macro=StringToEnum('SurfaceforcingsWindVy');
+Index: ../trunk-jpl/src/m/enum/SeaiceatmEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceatmEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/SeaiceatmEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=SeaiceatmEnum()
+-%SEAICEATMENUM - Enum of Seaiceatm
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SeaiceatmEnum()
+-
+-macro=StringToEnum('Seaiceatm');
+Index: ../trunk-jpl/src/m/enum/SeaiceMaxThicknessEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceMaxThicknessEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/SeaiceMaxThicknessEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=SeaiceMaxThicknessEnum()
+-%SEAICEMAXTHICKNESSENUM - Enum of SeaiceMaxThickness
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SeaiceMaxThicknessEnum()
+-
+-macro=StringToEnum('SeaiceMaxThickness');
+Index: ../trunk-jpl/src/m/enum/SeaiceAnalysisEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceAnalysisEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/SeaiceAnalysisEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=SeaiceAnalysisEnum()
+-%SEAICEANALYSISENUM - Enum of SeaiceAnalysis
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SeaiceAnalysisEnum()
+-
+-macro=StringToEnum('SeaiceAnalysis');
+Index: ../trunk-jpl/src/m/enum/MaterialsRidgingExponentEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsRidgingExponentEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/MaterialsRidgingExponentEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=MaterialsRidgingExponentEnum()
+-%MATERIALSRIDGINGEXPONENTENUM - Enum of MaterialsRidgingExponent
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=MaterialsRidgingExponentEnum()
+-
+-macro=StringToEnum('MaterialsRidgingExponent');
+Index: ../trunk-jpl/src/m/enum/StressTensorPredictoryyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/StressTensorPredictoryyEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/StressTensorPredictoryyEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=StressTensorPredictoryyEnum()
+-%STRESSTENSORPREDICTORYYENUM - Enum of StressTensorPredictoryy
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=StressTensorPredictoryyEnum()
+-
+-macro=StringToEnum('StressTensorPredictoryy');
+Index: ../trunk-jpl/src/m/enum/BasalforcingsOceanVyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BasalforcingsOceanVyEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/BasalforcingsOceanVyEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=BasalforcingsOceanVyEnum()
+-%BASALFORCINGSOCEANVYENUM - Enum of BasalforcingsOceanVy
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=BasalforcingsOceanVyEnum()
+-
+-macro=StringToEnum('BasalforcingsOceanVy');
+Index: ../trunk-jpl/src/m/enum/SeaiceThicknessEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceThicknessEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/SeaiceThicknessEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=SeaiceThicknessEnum()
+-%SEAICETHICKNESSENUM - Enum of SeaiceThickness
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SeaiceThicknessEnum()
+-
+-macro=StringToEnum('SeaiceThickness');
+Index: ../trunk-jpl/src/m/enum/BasalforcingsOceanSshEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BasalforcingsOceanSshEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/BasalforcingsOceanSshEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=BasalforcingsOceanSshEnum()
+-%BASALFORCINGSOCEANSSHENUM - Enum of BasalforcingsOceanSsh
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=BasalforcingsOceanSshEnum()
+-
+-macro=StringToEnum('BasalforcingsOceanSsh');
+Index: ../trunk-jpl/src/m/enum/SeaiceSpcvxEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceSpcvxEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/SeaiceSpcvxEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=SeaiceSpcvxEnum()
+-%SEAICESPCVXENUM - Enum of SeaiceSpcvx
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SeaiceSpcvxEnum()
+-
+-macro=StringToEnum('SeaiceSpcvx');
+Index: ../trunk-jpl/src/m/enum/BasalforcingsOceanQuadDragCoefEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BasalforcingsOceanQuadDragCoefEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/BasalforcingsOceanQuadDragCoefEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=BasalforcingsOceanQuadDragCoefEnum()
+-%BASALFORCINGSOCEANQUADDRAGCOEFENUM - Enum of BasalforcingsOceanQuadDragCoef
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=BasalforcingsOceanQuadDragCoefEnum()
+-
+-macro=StringToEnum('BasalforcingsOceanQuadDragCoef');
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsRhoAirEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsRhoAirEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsRhoAirEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=SurfaceforcingsRhoAirEnum()
+-%SURFACEFORCINGSRHOAIRENUM - Enum of SurfaceforcingsRhoAir
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SurfaceforcingsRhoAirEnum()
+-
+-macro=StringToEnum('SurfaceforcingsRhoAir');
+Index: ../trunk-jpl/src/m/enum/SurfaceforcingsAirQuadDragCoefEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SurfaceforcingsAirQuadDragCoefEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/SurfaceforcingsAirQuadDragCoefEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=SurfaceforcingsAirQuadDragCoefEnum()
+-%SURFACEFORCINGSAIRQUADDRAGCOEFENUM - Enum of SurfaceforcingsAirQuadDragCoef
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SurfaceforcingsAirQuadDragCoefEnum()
+-
+-macro=StringToEnum('SurfaceforcingsAirQuadDragCoef');
+Index: ../trunk-jpl/src/m/enum/SeaiceMinThicknessEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceMinThicknessEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/SeaiceMinThicknessEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=SeaiceMinThicknessEnum()
+-%SEAICEMINTHICKNESSENUM - Enum of SeaiceMinThickness
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SeaiceMinThicknessEnum()
+-
+-macro=StringToEnum('SeaiceMinThickness');
+Index: ../trunk-jpl/src/m/enum/SeaiceoceanEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceoceanEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/SeaiceoceanEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=SeaiceoceanEnum()
+-%SEAICEOCEANENUM - Enum of Seaiceocean
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SeaiceoceanEnum()
+-
+-macro=StringToEnum('Seaiceocean');
+Index: ../trunk-jpl/src/m/enum/BasalforcingsOceanTurningAngleEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/BasalforcingsOceanTurningAngleEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/BasalforcingsOceanTurningAngleEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=BasalforcingsOceanTurningAngleEnum()
+-%BASALFORCINGSOCEANTURNINGANGLEENUM - Enum of BasalforcingsOceanTurningAngle
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=BasalforcingsOceanTurningAngleEnum()
+-
+-macro=StringToEnum('BasalforcingsOceanTurningAngle');
+Index: ../trunk-jpl/src/m/enum/SeaiceSpcvyEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceSpcvyEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/SeaiceSpcvyEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=SeaiceSpcvyEnum()
+-%SEAICESPCVYENUM - Enum of SeaiceSpcvy
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SeaiceSpcvyEnum()
+-
+-macro=StringToEnum('SeaiceSpcvy');
+Index: ../trunk-jpl/src/m/enum/SeaiceMinConcentrationEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/SeaiceMinConcentrationEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/SeaiceMinConcentrationEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=SeaiceMinConcentrationEnum()
+-%SEAICEMINCONCENTRATIONENUM - Enum of SeaiceMinConcentration
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=SeaiceMinConcentrationEnum()
+-
+-macro=StringToEnum('SeaiceMinConcentration');
+Index: ../trunk-jpl/src/m/enum/VxStarEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/VxStarEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/VxStarEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=VxStarEnum()
+-%VXSTARENUM - Enum of VxStar
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=VxStarEnum()
+-
+-macro=StringToEnum('VxStar');
+Index: ../trunk-jpl/src/m/enum/MaterialsTimeRelaxationStressEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MaterialsTimeRelaxationStressEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/MaterialsTimeRelaxationStressEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=MaterialsTimeRelaxationStressEnum()
+-%MATERIALSTIMERELAXATIONSTRESSENUM - Enum of MaterialsTimeRelaxationStress
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=MaterialsTimeRelaxationStressEnum()
+-
+-macro=StringToEnum('MaterialsTimeRelaxationStress');
+Index: ../trunk-jpl/src/m/enum/MatseaiceEnum.m
+===================================================================
+--- ../trunk-jpl/src/m/enum/MatseaiceEnum.m	(revision 19086)
++++ ../trunk-jpl/src/m/enum/MatseaiceEnum.m	(revision 19087)
+@@ -1,11 +0,0 @@
+-function macro=MatseaiceEnum()
+-%MATSEAICEENUM - Enum of Matseaice
+-%
+-%   WARNING: DO NOT MODIFY THIS FILE
+-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+-%            Please read src/c/shared/Enum/README for more information
+-%
+-%   Usage:
+-%      macro=MatseaiceEnum()
+-
+-macro=StringToEnum('Matseaice');
+Index: ../trunk-jpl/src/m/enum/EnumDefinitions.py
+===================================================================
+--- ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 19086)
++++ ../trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 19087)
+@@ -424,8 +424,6 @@
+ def UzawaPressureAnalysisEnum(): return StringToEnum("UzawaPressureAnalysis")[0]
+ def GiaSolutionEnum(): return StringToEnum("GiaSolution")[0]
+ def GiaAnalysisEnum(): return StringToEnum("GiaAnalysis")[0]
+-def SeaiceSolutionEnum(): return StringToEnum("SeaiceSolution")[0]
+-def SeaiceAnalysisEnum(): return StringToEnum("SeaiceAnalysis")[0]
+ def MeshdeformationSolutionEnum(): return StringToEnum("MeshdeformationSolution")[0]
+ def MeshdeformationAnalysisEnum(): return StringToEnum("MeshdeformationAnalysis")[0]
+ def LevelsetAnalysisEnum(): return StringToEnum("LevelsetAnalysis")[0]
+@@ -869,43 +867,4 @@
+ def LevelsetfunctionSlopeXEnum(): return StringToEnum("LevelsetfunctionSlopeX")[0]
+ def LevelsetfunctionSlopeYEnum(): return StringToEnum("LevelsetfunctionSlopeY")[0]
+ def LevelsetfunctionPicardEnum(): return StringToEnum("LevelsetfunctionPicard")[0]
+-def SeaiceatmEnum(): return StringToEnum("Seaiceatm")[0]
+-def SeaiceoceanEnum(): return StringToEnum("Seaiceocean")[0]
+-def SeaiceThicknessEnum(): return StringToEnum("SeaiceThickness")[0]
+-def SeaiceConcentrationEnum(): return StringToEnum("SeaiceConcentration")[0]
+-def SeaiceMinConcentrationEnum(): return StringToEnum("SeaiceMinConcentration")[0]
+-def SeaiceMinThicknessEnum(): return StringToEnum("SeaiceMinThickness")[0]
+-def SeaiceMaxThicknessEnum(): return StringToEnum("SeaiceMaxThickness")[0]
+-def SeaiceSpcvxEnum(): return StringToEnum("SeaiceSpcvx")[0]
+-def SeaiceSpcvyEnum(): return StringToEnum("SeaiceSpcvy")[0]
+-def SeaiceCoriolisFactorEnum(): return StringToEnum("SeaiceCoriolisFactor")[0]
+-def BasalforcingsRhoOceanEnum(): return StringToEnum("BasalforcingsRhoOcean")[0]
+-def BasalforcingsOceanCoefEnum(): return StringToEnum("BasalforcingsOceanCoef")[0]
+-def BasalforcingsOceanLinDragCoefEnum(): return StringToEnum("BasalforcingsOceanLinDragCoef")[0]
+-def BasalforcingsOceanQuadDragCoefEnum(): return StringToEnum("BasalforcingsOceanQuadDragCoef")[0]
+-def BasalforcingsOceanTurningAngleEnum(): return StringToEnum("BasalforcingsOceanTurningAngle")[0]
+-def BasalforcingsOceanSshEnum(): return StringToEnum("BasalforcingsOceanSsh")[0]
+-def BasalforcingsOceanVxEnum(): return StringToEnum("BasalforcingsOceanVx")[0]
+-def BasalforcingsOceanVyEnum(): return StringToEnum("BasalforcingsOceanVy")[0]
+-def SurfaceforcingsRhoAirEnum(): return StringToEnum("SurfaceforcingsRhoAir")[0]
+-def SurfaceforcingsAirCoefEnum(): return StringToEnum("SurfaceforcingsAirCoef")[0]
+-def SurfaceforcingsAirLinDragCoefEnum(): return StringToEnum("SurfaceforcingsAirLinDragCoef")[0]
+-def SurfaceforcingsAirQuadDragCoefEnum(): return StringToEnum("SurfaceforcingsAirQuadDragCoef")[0]
+-def SurfaceforcingsWindVxEnum(): return StringToEnum("SurfaceforcingsWindVx")[0]
+-def SurfaceforcingsWindVyEnum(): return StringToEnum("SurfaceforcingsWindVy")[0]
+-def MatseaiceEnum(): return StringToEnum("Matseaice")[0]
+-def MaterialsPoissonEnum(): return StringToEnum("MaterialsPoisson")[0]
+-def MaterialsYoungModulusEnum(): return StringToEnum("MaterialsYoungModulus")[0]
+-def MaterialsTimeRelaxationStressEnum(): return StringToEnum("MaterialsTimeRelaxationStress")[0]
+-def MaterialsTimeRelaxationDamageEnum(): return StringToEnum("MaterialsTimeRelaxationDamage")[0]
+-def MaterialsRidgingExponentEnum(): return StringToEnum("MaterialsRidgingExponent")[0]
+-def MaterialsCohesionEnum(): return StringToEnum("MaterialsCohesion")[0]
+-def MaterialsInternalFrictionCoefEnum(): return StringToEnum("MaterialsInternalFrictionCoef")[0]
+-def MaterialsCompressionCoefEnum(): return StringToEnum("MaterialsCompressionCoef")[0]
+-def MaterialsTractionCoefEnum(): return StringToEnum("MaterialsTractionCoef")[0]
+-def VxStarEnum(): return StringToEnum("VxStar")[0]
+-def VyStarEnum(): return StringToEnum("VyStar")[0]
+-def StressTensorPredictorxxEnum(): return StringToEnum("StressTensorPredictorxx")[0]
+-def StressTensorPredictoryyEnum(): return StringToEnum("StressTensorPredictoryy")[0]
+-def StressTensorPredictorxyEnum(): return StringToEnum("StressTensorPredictorxy")[0]
+ def MaximumNumberOfDefinitionsEnum(): return StringToEnum("MaximumNumberOfDefinitions")[0]
Index: /issm/oecreview/Archive/18296-19100/ISSM-19087-19088.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19087-19088.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19087-19088.diff	(revision 19102)
@@ -0,0 +1,39 @@
+Index: ../trunk-jpl/test/NightlyRun/IdToName.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/IdToName.m	(revision 19087)
++++ ../trunk-jpl/test/NightlyRun/IdToName.m	(revision 19088)
+@@ -1,9 +1,34 @@
+ function name=IdToName(id);
+ %IDTONAME- return name of test
++%  
++%   if id=0, the full list of test is returned
+ %
+ %   Usage:
+ %      name=IdToName(id);
+ 
++if id==0,
++	flist=dir;%use dir, as it seems to act OS independent
++	list_ids=[];
++	for i=1:numel(flist),
++		if ( strncmp(flist(i).name,'test',4) &...                         %File name must start with 'test'
++				strncmp(fliplr(flist(i).name),fliplr('.m'),2)&...           %File name must end by '.m'
++				~strcmp(flist(i).name,'test.m'))                            %File name must be different than 'test.m'
++			id=str2num(flist(i).name(5:end-2));
++			if isempty(id),
++				disp(['WARNING: ignore file ' flist(i).name ]);
++			else
++				list_ids(end+1)=eval(flist(i).name(5:end-2));                  %Keep test id only (skip 'test' and '.m')
++			end
++		end
++	end
++	list_ids=sort(list_ids);
++	for i=list_ids,
++		name=IdToName(i);
++		disp(['test ' num2str(i,'%5i\n') ' : ' name]);
++	end
++	return;
++end
++
+ filename = ['test' num2str(id) '.m'];
+ 
+ if ~exist(filename,'file')
Index: /issm/oecreview/Archive/18296-19100/ISSM-19088-19089.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19088-19089.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19088-19089.diff	(revision 19102)
@@ -0,0 +1,16 @@
+Index: ../trunk-jpl/test/NightlyRun/IdToName.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/IdToName.m	(revision 19088)
++++ ../trunk-jpl/test/NightlyRun/IdToName.m	(revision 19089)
+@@ -4,9 +4,10 @@
+ %   if id=0, the full list of test is returned
+ %
+ %   Usage:
++%      name=IdToName();
+ %      name=IdToName(id);
+ 
+-if id==0,
++if nargin==0 | id==0,
+ 	flist=dir;%use dir, as it seems to act OS independent
+ 	list_ids=[];
+ 	for i=1:numel(flist),
Index: /issm/oecreview/Archive/18296-19100/ISSM-19089-19090.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19089-19090.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19089-19090.diff	(revision 19102)
@@ -0,0 +1,69 @@
+Index: ../trunk-jpl/src/m/consistency/ismodelselfconsistent.m
+===================================================================
+--- ../trunk-jpl/src/m/consistency/ismodelselfconsistent.m	(revision 19089)
++++ ../trunk-jpl/src/m/consistency/ismodelselfconsistent.m	(revision 19090)
+@@ -90,9 +90,6 @@
+ 	case DamageEvolutionSolutionEnum(),
+ 		analyses=[DamageEvolutionAnalysisEnum()];
+ 
+-	case SeaiceSolutionEnum(),
+-		analyses=[SeaiceAnalysisEnum()];
+-
+ 	otherwise
+ 		error('%s%s%s',' solution type: ',EnumToString(solutiontype),' not supported yet!');
+ 
+Index: ../trunk-jpl/src/m/classes/stressbalance.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/stressbalance.m	(revision 19089)
++++ ../trunk-jpl/src/m/classes/stressbalance.m	(revision 19090)
+@@ -219,10 +219,6 @@
+ 
+ 			WriteData(fid,'object',self,'class','stressbalance','fieldname','vertex_pairing','format','DoubleMat','mattype',3);
+ 
+-			if md.private.solution==SeaiceSolutionEnum,
+-				return;
+-			end
+-
+ 			yts=365.0*24.0*3600.0;
+ 
+ 			WriteData(fid,'object',self,'class','stressbalance','fieldname','spcvx','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+Index: ../trunk-jpl/src/m/classes/mask.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/mask.m	(revision 19089)
++++ ../trunk-jpl/src/m/classes/mask.m	(revision 19090)
+@@ -43,9 +43,6 @@
+ 
+ 		end % }}}
+ 		function md = checkconsistency(self,md,solution,analyses) % {{{
+-			if (solution==SeaiceSolutionEnum()),
+-				return;
+-			end
+ 
+ 			md = checkfield(md,'fieldname','mask.groundedice_levelset','size',[md.mesh.numberofvertices 1]);
+ 			md = checkfield(md,'fieldname','mask.ice_levelset'        ,'size',[md.mesh.numberofvertices 1]);
+@@ -71,10 +68,6 @@
+ 			WriteData(fid,'object',self,'fieldname','groundedice_levelset','format','DoubleMat','mattype',1);
+ 			WriteData(fid,'object',self,'fieldname','ice_levelset','format','DoubleMat','mattype',1);
+ 
+-			if(md.private.solution==SeaiceSolutionEnum()),
+-				return;
+-			end
+-
+ 			% get mask of vertices of elements with ice
+ 			isice=md.mask.ice_levelset<=0.;
+ 			vlist = zeros(md.mesh.numberofvertices,1);
+Index: ../trunk-jpl/src/m/classes/geometry.m
+===================================================================
+--- ../trunk-jpl/src/m/classes/geometry.m	(revision 19089)
++++ ../trunk-jpl/src/m/classes/geometry.m	(revision 19090)
+@@ -63,10 +63,6 @@
+ 		end % }}}
+ 		function md = checkconsistency(self,md,solution,analyses) % {{{
+ 
+-			if (solution==SeaiceSolutionEnum()),
+-				return;
+-			end
+-
+ 			if (solution==TransientSolutionEnum() & md.transient.isgia) | (solution==GiaSolutionEnum()),
+ 				md = checkfield(md,'fieldname','geometry.thickness','timeseries',1,'NaN',1,'>=',0);
+ 			else
Index: /issm/oecreview/Archive/18296-19100/ISSM-19090-19091.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19090-19091.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19090-19091.diff	(revision 19102)
@@ -0,0 +1,157 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19090)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19091)
+@@ -645,7 +645,7 @@
+ 	xDelete<IssmDouble>(dbasis);
+ }/*}}}*/
+ 
+-void  HydrologyDCEfficientAnalysis::HydrologyEPLGetMask(Vector<IssmDouble>* vec_mask, int* eplzigzag_counter, Element* element){
++void  HydrologyDCEfficientAnalysis::HydrologyEPLGetMask(Vector<IssmDouble>* vec_mask, Vector<IssmDouble>* recurence, int* eplzigzag_counter, Element* element){
+ 
+ 	bool        active_element;
+ 	int         i,j;
+@@ -671,6 +671,8 @@
+ 
+ 	int         eplflip_lock;
+ 	int         numnodes      =basalelement->GetNumberOfNodes();
++	IssmDouble  new_active;
++	IssmDouble  recurent;
+ 	IssmDouble* epl_thickness =xNew<IssmDouble>(numnodes);
+ 	IssmDouble* old_active    =xNew<IssmDouble>(numnodes);
+ 	IssmDouble* sedhead       =xNew<IssmDouble>(numnodes);
+@@ -696,44 +698,55 @@
+ 	for(i=1;i<numnodes;i++) if(sedhead[i]<=sedheadmin)sedheadmin=sedhead[i];
+ 
+ 	for(i=0;i<numnodes;i++){
+-		/*Activate EPL if residual is >0 */
++
++		/*Dealing with the initial value to define zigzaging, preceding iteration the first time we see the node and current evolving vector after*/
++		recurence->GetValue(&recurent,basalelement->nodes[i]->Sid());
++		if (recurent>0)vec_mask->GetValue(&old_active[i],basalelement->nodes[i]->Sid());
++		new_active=old_active[i];
++		recurence->SetValue(basalelement->nodes[i]->Sid(),1.,ADD_VAL);
++
++		/*Now starting to look at the activations*/
+ 		if(residual[i]>0.){
+-			if(old_active[i]==0) eplzigzag_counter[basalelement->nodes[i]->Lid()] ++;
+ 			vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
++			new_active=1.0;
+ 		}
+-
+ 		/*If mask was already one, keep one or colapse*/
+ 		else if(old_active[i]>0.){
+-			
+ 			vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
++			new_active=1.0;
+ 			/*If epl thickness gets under colapse thickness, close the layer*/
+ 			if(epl_thickness[i]<colapse_thick){
+-				eplzigzag_counter[basalelement->nodes[i]->Lid()] ++;
+-				/*Avoid flipfloping between open and closed states*/
+-				if(eplzigzag_counter[basalelement->nodes[i]->Lid()]<eplflip_lock |eplflip_lock==0){
+-					vec_mask->SetValue(basalelement->nodes[i]->Sid(),0.,INS_VAL);
+-					epl_thickness[i]=init_thick;
+-				}
++				vec_mask->SetValue(basalelement->nodes[i]->Sid(),0.,INS_VAL);
++				new_active=0.0;
+ 			}
+ 		}
++
++		if(basalelement->nodes[i]->Sid()==42){
++			printf("old active is %e, and new active is %e, with counter= %i\n",old_active[i],new_active,eplzigzag_counter[basalelement->nodes[i]->Lid()]);
++		}
+ 		/*Increase of the efficient system is needed if the epl head reach the maximum value (sediment max value for now)*/
+ 		GetHydrologyDCInefficientHmax(&h_max,basalelement,basalelement->nodes[i]);
+ 		if(eplhead[i]>=h_max && active_element){
+ 			for(j=0;j<numnodes;j++){
+ 				/*Increase of the domain is on the downstream node in term of sediment head*/
+ 				if(sedhead[j] == sedheadmin){
+-					if(old_active[j]==0) {
+-						eplzigzag_counter[basalelement->nodes[j]->Lid()] ++;
+-						if(eplzigzag_counter[basalelement->nodes[i]->Lid()]<eplflip_lock |eplflip_lock==0){
+-							vec_mask->SetValue(basalelement->nodes[j]->Sid(),1.,INS_VAL);
+-						}
+-						else{
+-							vec_mask->SetValue(basalelement->nodes[j]->Sid(),0.,INS_VAL);
+-						}
+-					}
++					vec_mask->SetValue(basalelement->nodes[j]->Sid(),1.,INS_VAL);
+ 				}
+ 			}
+ 		}
++		/*Now checking for nodes zigzaging between open and close*/
++		if (old_active[i] != new_active){
++			eplzigzag_counter[basalelement->nodes[i]->Lid()] ++;
++			/*If node changed too much of state, fix it to it's last known state*/
++			if(eplzigzag_counter[basalelement->nodes[i]->Lid()]>eplflip_lock & eplflip_lock!=0){
++				vec_mask->SetValue(basalelement->nodes[i]->Sid(),old_active[i],INS_VAL);
++				new_active=old_active[i];
++			}
++		}
++			/*If node is now closed bring its thickness back to initial*/
++		if (new_active==0.){
++			epl_thickness[i]=init_thick;
++		}
+ 	}
+ 	basalelement->AddInput(HydrologydcEplThicknessEnum,epl_thickness,basalelement->GetElementType());
+ 
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h	(revision 19090)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h	(revision 19091)
+@@ -39,7 +39,7 @@
+ 		IssmDouble SedimentStoring(Element* element);
+ 		IssmDouble GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* thick_input, Input* base_input);
+ 		IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* thick_input, Input* base_input);
+-		void HydrologyEPLGetMask(Vector<IssmDouble>* vec_mask, int* eplzigzag_counter, Element* element);
++		void HydrologyEPLGetMask(Vector<IssmDouble>* vec_mask, Vector<IssmDouble>* recurence, int* eplzigzag_counter, Element* element);
+ 		void HydrologyEPLGetActive(Vector<IssmDouble>* active_vec, Element* element);
+ 		void GetHydrologyDCInefficientHmax(IssmDouble* ph_max,Element* element, Node* innode);
+ 		void ComputeEPLThickness(FemModel* femmodel);
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp	(revision 19090)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp	(revision 19091)
+@@ -91,7 +91,7 @@
+ 		femmodel->UpdateConstraintsx();
+ 		femmodel->parameters->SetParam(HydrologySedimentEnum,HydrologyLayerEnum);
+ 		
+-		/*Reset constraint on the ZigZag Lock, this thing doesn't work, it have to disapear*/
++		/*Reset constraint on the ZigZag Lock*/
+ 		ResetConstraintsx(femmodel);
+ 
+ 		/*{{{*//*Treating the sediment*/
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 19090)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 19091)
+@@ -1912,6 +1912,7 @@
+ void FemModel::HydrologyEPLupdateDomainx(IssmDouble* pEplcount){ /*{{{*/
+ 
+ 	Vector<IssmDouble>* mask							= NULL;
++	Vector<IssmDouble>* recurence  				= NULL;
+ 	IssmDouble*         serial_mask				= NULL;
+ 	Vector<IssmDouble>* active						= NULL;
+ 	IssmDouble*         serial_active			= NULL;
+@@ -1921,11 +1922,11 @@
+ 	HydrologyDCInefficientAnalysis* inefanalysis =  new HydrologyDCInefficientAnalysis();
+ 	/*Step 1: update mask, the mask might be extended by residual and/or using downstream sediment head*/
+ 	mask=new Vector<IssmDouble>(this->nodes->NumberOfNodes(HydrologyDCEfficientAnalysisEnum));
++	recurence=new Vector<IssmDouble>(this->nodes->NumberOfNodes(HydrologyDCEfficientAnalysisEnum));
+ 	this->parameters->FindParam(&eplzigzag_counter,NULL,EplZigZagCounterEnum); 
+-
+ 	for (int i=0;i<elements->Size();i++){
+ 		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+-		effanalysis->HydrologyEPLGetMask(mask,eplzigzag_counter,element);
++		effanalysis->HydrologyEPLGetMask(mask,recurence,eplzigzag_counter,element);
+ 	}
+ 	this->parameters->SetParam(eplzigzag_counter,this->nodes->Size(),EplZigZagCounterEnum);
+ 	/*Assemble and serialize*/
+@@ -1933,6 +1934,7 @@
+ 	serial_mask=mask->ToMPISerial();
+ 	xDelete<int>(eplzigzag_counter);
+ 	delete mask;
++	delete recurence;
+ 
+ 	/*Update Mask*/
+ 	InputUpdateFromVectorx(this,serial_mask,HydrologydcMaskEplactiveNodeEnum,NodeSIdEnum);
Index: /issm/oecreview/Archive/18296-19100/ISSM-19091-19092.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19091-19092.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19091-19092.diff	(revision 19102)
@@ -0,0 +1,15 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19091)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19092)
+@@ -720,10 +720,6 @@
+ 				new_active=0.0;
+ 			}
+ 		}
+-
+-		if(basalelement->nodes[i]->Sid()==42){
+-			printf("old active is %e, and new active is %e, with counter= %i\n",old_active[i],new_active,eplzigzag_counter[basalelement->nodes[i]->Lid()]);
+-		}
+ 		/*Increase of the efficient system is needed if the epl head reach the maximum value (sediment max value for now)*/
+ 		GetHydrologyDCInefficientHmax(&h_max,basalelement,basalelement->nodes[i]);
+ 		if(eplhead[i]>=h_max && active_element){
Index: /issm/oecreview/Archive/18296-19100/ISSM-19092-19093.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19092-19093.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19092-19093.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/test/NightlyRun/IdFromString.m
+===================================================================
+--- ../trunk-jpl/test/NightlyRun/IdFromString.m	(revision 19092)
++++ ../trunk-jpl/test/NightlyRun/IdFromString.m	(revision 19093)
+@@ -17,7 +17,7 @@
+ ids=[];
+ 
+ %Grep string
+-[dummy ids_raw]=system(['cat IdToName.m | grep ' string ' | awk ''{print $2 }'' | sed -e "s/(id==//g" | sed -e "s/),//g"']);
++[dummy ids_raw]=system(['find ./ -name "test[0-9]*.m" | xargs grep "%Test Name:" | grep ' string ' | sed -e "s/test/ /g" -e "s/\.m:/ /g" | awk {''print $2''}']);
+ 
+ %return if no test found
+ if isempty(ids_raw),
Index: /issm/oecreview/Archive/18296-19100/ISSM-19093-19094.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19093-19094.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19093-19094.diff	(revision 19102)
@@ -0,0 +1,397 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19093)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19094)
+@@ -671,8 +671,6 @@
+ 
+ 	int         eplflip_lock;
+ 	int         numnodes      =basalelement->GetNumberOfNodes();
+-	IssmDouble  new_active;
+-	IssmDouble  recurent;
+ 	IssmDouble* epl_thickness =xNew<IssmDouble>(numnodes);
+ 	IssmDouble* old_active    =xNew<IssmDouble>(numnodes);
+ 	IssmDouble* sedhead       =xNew<IssmDouble>(numnodes);
+@@ -699,25 +697,23 @@
+ 
+ 	for(i=0;i<numnodes;i++){
+ 
+-		/*Dealing with the initial value to define zigzaging, preceding iteration the first time we see the node and current evolving vector after*/
+-		recurence->GetValue(&recurent,basalelement->nodes[i]->Sid());
+-		if (recurent>0)vec_mask->GetValue(&old_active[i],basalelement->nodes[i]->Sid());
+-		new_active=old_active[i];
+-		recurence->SetValue(basalelement->nodes[i]->Sid(),1.,ADD_VAL);
++		/*If node is now closed bring its thickness back to initial*/
++		if (old_active[i]==0.){
++			epl_thickness[i]=init_thick;
++		}
+ 
+ 		/*Now starting to look at the activations*/
+ 		if(residual[i]>0.){
+ 			vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+-			new_active=1.0;
++			if(old_active[i]==0.)	recurence->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+ 		}
+ 		/*If mask was already one, keep one or colapse*/
+ 		else if(old_active[i]>0.){
+ 			vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+-			new_active=1.0;
+ 			/*If epl thickness gets under colapse thickness, close the layer*/
+ 			if(epl_thickness[i]<colapse_thick){
+ 				vec_mask->SetValue(basalelement->nodes[i]->Sid(),0.,INS_VAL);
+-				new_active=0.0;
++				recurence->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+ 			}
+ 		}
+ 		/*Increase of the efficient system is needed if the epl head reach the maximum value (sediment max value for now)*/
+@@ -727,22 +723,10 @@
+ 				/*Increase of the domain is on the downstream node in term of sediment head*/
+ 				if(sedhead[j] == sedheadmin){
+ 					vec_mask->SetValue(basalelement->nodes[j]->Sid(),1.,INS_VAL);
++					if(old_active[i]==0.)	recurence->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
+ 				}
+ 			}
+ 		}
+-		/*Now checking for nodes zigzaging between open and close*/
+-		if (old_active[i] != new_active){
+-			eplzigzag_counter[basalelement->nodes[i]->Lid()] ++;
+-			/*If node changed too much of state, fix it to it's last known state*/
+-			if(eplzigzag_counter[basalelement->nodes[i]->Lid()]>eplflip_lock & eplflip_lock!=0){
+-				vec_mask->SetValue(basalelement->nodes[i]->Sid(),old_active[i],INS_VAL);
+-				new_active=old_active[i];
+-			}
+-		}
+-			/*If node is now closed bring its thickness back to initial*/
+-		if (new_active==0.){
+-			epl_thickness[i]=init_thick;
+-		}
+ 	}
+ 	basalelement->AddInput(HydrologydcEplThicknessEnum,epl_thickness,basalelement->GetElementType());
+ 
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 19093)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 19094)
+@@ -555,7 +555,7 @@
+ 	Element* element;
+ 
+ 	Vector<IssmDouble>* vec_dist_zerolevelset = NULL;
+-	GetVectorFromInputsx(&vec_dist_zerolevelset, femmodel, MaskIceLevelsetEnum, VertexEnum);
++	GetVectorFromInputsx(&vec_dist_zerolevelset, femmodel, MaskIceLevelsetEnum, VertexPIdEnum);
+ 	
+ 	/* set NaN on elements intersected by zero levelset */
+ 	for(i=0;i<femmodel->elements->Size();i++){
+Index: ../trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.cpp	(revision 19093)
++++ ../trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.cpp	(revision 19094)
+@@ -416,7 +416,7 @@
+ 	int numvertices=femmodel->vertices->NumberOfVertices();
+ 
+ 	Vector<IssmDouble>* vec_dist_zerolevelset = NULL;
+-	GetVectorFromInputsx(&vec_dist_zerolevelset, femmodel, MaskIceLevelsetEnum, VertexEnum);
++	GetVectorFromInputsx(&vec_dist_zerolevelset, femmodel, MaskIceLevelsetEnum, VertexPIdEnum);
+ 	
+ 	/* set distance on elements intersected by zero levelset */
+ 	for(i=0;i<femmodel->elements->Size();i++){
+Index: ../trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp	(revision 19093)
++++ ../trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp	(revision 19094)
+@@ -141,7 +141,7 @@
+ 	vec_phi=new Vector<IssmDouble>(vertices->NumberOfVertices());
+ 	for(i=0;i<elements->Size();i++){
+ 		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+-		element->GetVectorFromInputs(vec_phi,MaskGroundediceLevelsetEnum);
++		element->GetVectorFromInputs(vec_phi,MaskGroundediceLevelsetEnum,VertexPIdEnum);
+ 	}
+ 	vec_phi->Assemble();
+ 	phi=vec_phi->ToMPISerial();
+Index: ../trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp	(revision 19093)
++++ ../trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp	(revision 19094)
+@@ -6,24 +6,25 @@
+ #include "../../shared/shared.h"
+ #include "../../toolkits/toolkits.h"
+ 
+-void GetVectorFromInputsx( Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type){
++void GetVectorFromInputsx(Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type){
+ 
+ 	int i;
+ 	Vector<IssmDouble>* vector=NULL;
+ 
+-	if(type==VertexEnum){
+-
+-		/*Allocate vector*/
++	switch(type){
++	case VertexPIdEnum: case VertexSIdEnum:
+ 		vector=new Vector<IssmDouble>(femmodel->vertices->NumberOfVertices());
+-
+-		/*Look up in elements*/
+-		for(i=0;i<femmodel->elements->Size();i++){
+-			Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+-			element->GetVectorFromInputs(vector,name);
+-		}
++		break;
++	case NodesEnum:case NodeSIdEnum:
++		vector=new Vector<IssmDouble>(femmodel->nodes->NumberOfNodes());
++		break;
++	default:
++			_error_("vector type: " << EnumToStringx(type) << " not supported yet!");
+ 	}
+-	else{
+-		_error_("vector type: " << EnumToStringx(type) << " not supported yet!");
++	/*Look up in elements*/
++	for(i=0;i<femmodel->elements->Size();i++){
++		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
++		element->GetVectorFromInputs(vector,name,type);
+ 	}
+ 
+ 	vector->Assemble();
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_la.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_la.cpp	(revision 19093)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_la.cpp	(revision 19094)
+@@ -43,8 +43,8 @@
+ 	Vector<IssmDouble>* vel           = NULL;
+ 	Vector<IssmDouble>* vel_old       = NULL;
+ 	Vector<IssmDouble>* vel_old_local = NULL;
+-	GetVectorFromInputsx(&vel,femmodel,VxEnum,VertexEnum);
+-	GetVectorFromInputsx(&pug,femmodel,PressureEnum,VertexEnum);
++	GetVectorFromInputsx(&vel,femmodel,VxEnum,VertexPIdEnum);
++	GetVectorFromInputsx(&pug,femmodel,PressureEnum,VertexPIdEnum);
+ 
+ 	while(true){
+ 		count++;
+@@ -69,7 +69,7 @@
+ 
+ 			/*Update solution*/
+ 			InputUpdateFromSolutionx(femmodel,ug); delete ug;
+-			GetVectorFromInputsx(&vel,femmodel,VxEnum,VertexEnum);
++			GetVectorFromInputsx(&vel,femmodel,VxEnum,VertexPIdEnum);
+ 			/*Check for convergence*/
+ 			Vector<IssmDouble>* dvel_local=vel_old_local->Duplicate(); vel_old_local->Copy(dvel_local); dvel_local->AYPX(vel,-1.0);
+ 			IssmDouble ndu=dvel_local->Norm(NORM_TWO);   delete dvel_local;
+@@ -100,7 +100,7 @@
+ 
+ 		/*Update solution*/
+ 		InputUpdateFromSolutionx(femmodel,pug); delete pug;
+-		GetVectorFromInputsx(&pug,femmodel,PressureEnum,VertexEnum);
++		GetVectorFromInputsx(&pug,femmodel,PressureEnum,VertexPIdEnum);
+ 
+ 		/*Check for convergence*/
+ 		Vector<IssmDouble>* dvel=vel_old_local->Duplicate(); vel_old_local->Copy(dvel); dvel->AYPX(vel,-1.0);
+Index: ../trunk-jpl/src/c/solutionsequences/solutionsequence_la_theta.cpp
+===================================================================
+--- ../trunk-jpl/src/c/solutionsequences/solutionsequence_la_theta.cpp	(revision 19093)
++++ ../trunk-jpl/src/c/solutionsequences/solutionsequence_la_theta.cpp	(revision 19094)
+@@ -40,7 +40,7 @@
+ 	GetSolutionFromInputsx(&ug,femmodel);
+ 	Vector<IssmDouble>* vx     = NULL;
+ 	Vector<IssmDouble>* vx_old = NULL;
+-	GetVectorFromInputsx(&vx,femmodel,VxEnum,VertexEnum);
++	GetVectorFromInputsx(&vx,femmodel,VxEnum,VertexPIdEnum);
+ 
+ 	while(true){
+ 		count++;
+@@ -68,7 +68,7 @@
+ 		/*Update d and tau accordingly*/
+ 		analysis->InputUpdateFromSolutionFSXTH_d(  femmodel->elements,femmodel->parameters);
+ 		analysis->InputUpdateFromSolutionFSXTH_tau(femmodel->elements,femmodel->parameters);
+-		GetVectorFromInputsx(&vx,femmodel,VxEnum,VertexEnum);
++		GetVectorFromInputsx(&vx,femmodel,VxEnum,VertexPIdEnum);
+ 
+ 		/*Check for convergence*/
+ 		//Vector<IssmDouble>* dug=ug_old->Duplicate(); ug_old->Copy(dug); dug->AYPX(ug,-1.0);
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 19093)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 19094)
+@@ -610,8 +610,8 @@
+ 	IssmDouble         *bed     = NULL;
+ 
+ 	/*get vertex vectors for bed and thickness: */
+-	GetVectorFromInputsx(&surface  ,this, SurfaceEnum,VertexEnum);
+-	GetVectorFromInputsx(&bed      ,this, BaseEnum,    VertexEnum);
++	GetVectorFromInputsx(&surface  ,this, SurfaceEnum,VertexPIdEnum);
++	GetVectorFromInputsx(&bed      ,this, BaseEnum,   VertexPIdEnum);
+ 
+ 	/*Allocate vector*/
+ 	Vector<IssmDouble> *vx=new Vector<IssmDouble>(vertices->NumberOfVertices());
+@@ -1830,7 +1830,7 @@
+ 		if(flag==ScaledEnum){
+ 
+ 			/*this response was scaled. pick up the response from the inputs: */
+-			GetVectorFromInputsx(&vertex_response,this, StringToEnumx(root),VertexEnum);
++			GetVectorFromInputsx(&vertex_response,this, StringToEnumx(root),VertexPIdEnum);
+ 
+ 			/*Now, average it onto the partition nodes: */
+ 			AverageOntoPartitionx(&qmu_response,elements,nodes,vertices,loads,materials,parameters,vertex_response);
+@@ -1913,25 +1913,45 @@
+ 
+ 	Vector<IssmDouble>* mask							= NULL;
+ 	Vector<IssmDouble>* recurence  				= NULL;
++	Vector<IssmDouble>* active						= NULL;
+ 	IssmDouble*         serial_mask				= NULL;
+-	Vector<IssmDouble>* active						= NULL;
++	IssmDouble*         serial_rec  			= NULL;
+ 	IssmDouble*         serial_active			= NULL;
++	IssmDouble*         old_active        = NULL;
+ 	int*                eplzigzag_counter =	NULL;
+-		
++	int                 eplflip_lock;
++	
+ 	HydrologyDCEfficientAnalysis* effanalysis =  new HydrologyDCEfficientAnalysis();
+ 	HydrologyDCInefficientAnalysis* inefanalysis =  new HydrologyDCInefficientAnalysis();
++
+ 	/*Step 1: update mask, the mask might be extended by residual and/or using downstream sediment head*/
+ 	mask=new Vector<IssmDouble>(this->nodes->NumberOfNodes(HydrologyDCEfficientAnalysisEnum));
+ 	recurence=new Vector<IssmDouble>(this->nodes->NumberOfNodes(HydrologyDCEfficientAnalysisEnum));
+ 	this->parameters->FindParam(&eplzigzag_counter,NULL,EplZigZagCounterEnum); 
++	this->parameters->FindParam(&eplflip_lock,HydrologydcEplflipLockEnum); 
++	GetVectorFromInputsx(&old_active,this,HydrologydcMaskEplactiveNodeEnum,NodeSIdEnum);
++	
+ 	for (int i=0;i<elements->Size();i++){
+ 		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+ 		effanalysis->HydrologyEPLGetMask(mask,recurence,eplzigzag_counter,element);
+ 	}
++	/*check for changes and increment zigzag counter, change the mask if necessary*/
++	recurence->Assemble();
++	serial_rec=recurence->ToMPISerial();
++	for (int i=0;i<nodes->Size();i++){
++		Node* node=xDynamicCast<Node*>(nodes->GetObjectByOffset(i));
++		if(serial_rec[node->Sid()]==1.)eplzigzag_counter[node->Lid()] ++;
++		if(eplzigzag_counter[node->Lid()]>eplflip_lock & eplflip_lock!=0){
++			mask->SetValue(node->Sid(),old_active[node->Sid()],INS_VAL);
++		}
++	}
++
++	
+ 	this->parameters->SetParam(eplzigzag_counter,this->nodes->Size(),EplZigZagCounterEnum);
+ 	/*Assemble and serialize*/
+ 	mask->Assemble();
+-	serial_mask=mask->ToMPISerial();
++	serial_mask=mask->ToMPISerial();	
++	
+ 	xDelete<int>(eplzigzag_counter);
+ 	delete mask;
+ 	delete recurence;
+Index: ../trunk-jpl/src/c/classes/Elements/Element.h
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 19093)
++++ ../trunk-jpl/src/c/classes/Elements/Element.h	(revision 19094)
+@@ -95,7 +95,7 @@
+ 		void               GetNodesLidList(int* lidlist);
+ 		void               GetNodesSidList(int* sidlist);
+ 		void               GetPhi(IssmDouble* phi, IssmDouble*  epsilon, IssmDouble viscosity);
+-		void               GetVectorFromInputs(Vector<IssmDouble>* vector, int name_enum);
++		void               GetVectorFromInputs(Vector<IssmDouble>* vector, int name_enum, int type);
+ 		void	             GetVertexPidList(int* pidlist);
+ 		void               GetVerticesConnectivityList(int* connectivitylist);
+ 		void               GetVerticesCoordinates(IssmDouble** xyz_list);
+Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 19093)
++++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 19094)
+@@ -1942,7 +1942,6 @@
+ 		break;
+ 
+ 	case NodesEnum:
+-
+ 		/*Get number of nodes and dof list: */
+ 		numnodes = this->NumberofNodes(this->element_type);
+ 		values   = xNew<IssmDouble>(numnodes);
+@@ -1956,7 +1955,6 @@
+ 		break;
+ 
+ 	case NodeSIdEnum:
+-
+ 		/*Get number of nodes and dof list: */
+ 		numnodes = this->NumberofNodes(this->element_type);
+ 		values   = xNew<IssmDouble>(numnodes);
+Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 19093)
++++ ../trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 19094)
+@@ -861,20 +861,71 @@
+ 	*phi=4.*epsilon_eff*epsilon_eff*viscosity;
+ }
+ /*}}}*/
+-void       Element::GetVectorFromInputs(Vector<IssmDouble>* vector,int input_enum){/*{{{*/
++/* void       Element::GetVectorFromInputs(Vector<IssmDouble>* vector,int input_enum){/\*{{{*\/ */
+ 
++/* 	/\*Fetch number vertices for this element and allocate arrays*\/ */
++/* 	int numvertices = this->GetNumberOfVertices(); */
++/* 	int*        vertexpidlist = xNew<int>(numvertices); */
++/* 	IssmDouble* values        = xNew<IssmDouble>(numvertices); */
++
++/* 	/\*Fill in values*\/ */
++/* 	this->GetVertexPidList(vertexpidlist); */
++/* 	this->GetInputListOnVertices(values,input_enum); */
++/* 	vector->SetValues(numvertices,vertexpidlist,values,INS_VAL); */
++
++/* 	/\*Clean up*\/ */
++/* 	xDelete<int>(vertexpidlist); */
++/* 	xDelete<IssmDouble>(values); */
++
++/* } */
++/* /\*}}}*\/ */
++void       Element::GetVectorFromInputs(Vector<IssmDouble>* vector,int input_enum,int type){/*{{{*/
++
+ 	/*Fetch number vertices for this element and allocate arrays*/
+-	int numvertices = this->GetNumberOfVertices();
+-	int*        vertexpidlist = xNew<int>(numvertices);
+-	IssmDouble* values        = xNew<IssmDouble>(numvertices);
++	int         numvertices = this->GetNumberOfVertices();
++	int         numnodes    = this->GetNumberOfNodes();
++	int*        doflist     = NULL;
++	IssmDouble* values      = NULL;
+ 
+-	/*Fill in values*/
+-	this->GetVertexPidList(vertexpidlist);
+-	this->GetInputListOnVertices(values,input_enum);
+-	vector->SetValues(numvertices,vertexpidlist,values,INS_VAL);
+-
++	switch(type){
++	case VertexPIdEnum:
++		doflist = xNew<int>(numvertices);
++		values = xNew<IssmDouble>(numvertices);
++		/*Fill in values*/
++		this->GetVertexPidList(doflist);
++		this->GetInputListOnVertices(values,input_enum);
++		vector->SetValues(numvertices,doflist,values,INS_VAL);
++		break;
++	case VertexSIdEnum:
++		doflist = xNew<int>(numvertices);
++		values = xNew<IssmDouble>(numvertices);
++		/*Fill in values*/
++		this->GetVerticesSidList(doflist);
++		this->GetInputListOnVertices(values,input_enum);
++		vector->SetValues(numvertices,doflist,values,INS_VAL);
++		break;
++	case NodesEnum:
++		doflist = xNew<int>(numnodes);
++		values = xNew<IssmDouble>(numnodes);
++		/*Fill in values*/
++		this->GetInputListOnNodes(values,input_enum);
++		this->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
++		vector->SetValues(numnodes,doflist,values,INS_VAL);
++		break;
++	case NodeSIdEnum:
++		doflist = xNew<int>(numnodes);
++		values = xNew<IssmDouble>(numnodes);
++		/*Fill in values*/
++		this->GetNodesSidList(doflist);
++		this->GetInputListOnNodes(values,input_enum);
++		vector->SetValues(numnodes,doflist,values,INS_VAL);
++		break;
++	default:
++		_error_("type " << type << " (" << EnumToStringx(type) << ") not implemented yet");
++	}
++	
+ 	/*Clean up*/
+-	xDelete<int>(vertexpidlist);
++	xDelete<int>(doflist);
+ 	xDelete<IssmDouble>(values);
+ 
+ }
Index: /issm/oecreview/Archive/18296-19100/ISSM-19094-19095.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19094-19095.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19094-19095.diff	(revision 19102)
@@ -0,0 +1,47 @@
+Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19094)
++++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 19095)
+@@ -666,10 +666,7 @@
+ 			break;
+ 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+ 	}
+-
+ 	/*Intermediaries*/
+-
+-	int         eplflip_lock;
+ 	int         numnodes      =basalelement->GetNumberOfNodes();
+ 	IssmDouble* epl_thickness =xNew<IssmDouble>(numnodes);
+ 	IssmDouble* old_active    =xNew<IssmDouble>(numnodes);
+@@ -683,8 +680,6 @@
+ 	Input* active_element_input=basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input);
+ 	active_element_input->GetInputValue(&active_element);
+ 
+-	basalelement->parameters->FindParam(&eplflip_lock,HydrologydcEplflipLockEnum); 
+-
+ 	basalelement-> GetInputListOnVertices(&old_active[0],HydrologydcMaskEplactiveNodeEnum);	
+ 	basalelement-> GetInputListOnVertices(&epl_thickness[0],HydrologydcEplThicknessEnum);	
+ 	basalelement-> GetInputListOnVertices(&sedhead[0],SedimentHeadEnum);
+@@ -694,9 +689,7 @@
+ 	/*Get minimum sediment head of the element*/
+ 	sedheadmin=sedhead[0];
+ 	for(i=1;i<numnodes;i++) if(sedhead[i]<=sedheadmin)sedheadmin=sedhead[i];
+-
+ 	for(i=0;i<numnodes;i++){
+-
+ 		/*If node is now closed bring its thickness back to initial*/
+ 		if (old_active[i]==0.){
+ 			epl_thickness[i]=init_thick;
+Index: ../trunk-jpl/src/c/classes/FemModel.cpp
+===================================================================
+--- ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 19094)
++++ ../trunk-jpl/src/c/classes/FemModel.cpp	(revision 19095)
+@@ -1953,6 +1953,8 @@
+ 	serial_mask=mask->ToMPISerial();	
+ 	
+ 	xDelete<int>(eplzigzag_counter);
++	xDelete<IssmDouble>(serial_rec);
++	xDelete<IssmDouble>(old_active);
+ 	delete mask;
+ 	delete recurence;
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-19095-19096.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19095-19096.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19095-19096.diff	(revision 19102)
@@ -0,0 +1,463 @@
+Index: ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.m
+===================================================================
+--- ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.m	(revision 19095)
++++ ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.m	(revision 19096)
+@@ -28,12 +28,12 @@
+   end							
+  
+ 	%define netcdf dimensions
+-	DimSize(1).index=netcdf.defDim(ncid,'EltNum',md.mesh.numberofelements);
+-	DimSize(2).index=netcdf.defDim(ncid,'VertNum',md.mesh.numberofvertices);
+-	DimSize(3).index=netcdf.defDim(ncid,'VertperElt',size(md.mesh.elements,2));
+-	DimSize(4).index=netcdf.defDim(ncid,'Time',StepNum);
+-	DimSize(5).index=netcdf.defDim(ncid,'StringLength',20);
+-	DimSize(6).index=netcdf.defDim(ncid,'StructLength',2);
++	DimSize(1).index=netcdf.defDim(ncid,'Dimension1',md.mesh.numberofelements);
++	DimSize(2).index=netcdf.defDim(ncid,'Dimension2',md.mesh.numberofvertices);
++	DimSize(3).index=netcdf.defDim(ncid,'Dimension3',size(md.mesh.elements,2));
++	DimSize(4).index=netcdf.defDim(ncid,'Dimension4',StepNum);
++	DimSize(5).index=netcdf.defDim(ncid,'Dimension5',40);
++	DimSize(6).index=netcdf.defDim(ncid,'Dimension6',2);
+ 	
+ 	for i=1:length(DimSize),
+ 		[DimSize(i).name,DimSize(i).value]=netcdf.inqDim(ncid,DimSize(i).index);
+@@ -52,19 +52,21 @@
+ 		groupfields=fields(md.(groups{i}));
+ 		%Special treatment for the results
+ 		if strcmp(groups(i),'results'),
+-			for j=1:length(groupfields)%looping on the different solutions
+-																 %disp(sprintf('=====Field name in tree %s ',groupfields{j}));
++			for j=1:length(groupfields)%looping on the differents solutions
++				netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype','results');
++				subgroupID=netcdf.defGrp(groupID,groupfields{j});
++				netcdf.putAtt(subgroupID,netcdf.getConstant('NC_GLOBAL'),'classtype',groupfields{j});
++				%disp(sprintf('=====Field name in tree %s ',groupfields{j}));
+ 				if length(md.results.(groupfields{j}))>1,
+ 					%the solution have several timestep get last timesteps and output frequency
+ 					last_step = length(md.results.(groupfields{j}));
+ 					%grab first time step
+ 					subfields=fields(md.results.(groupfields{j})(1));
+ 					for k=1:length(subfields),
+-						netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype','results');
+ 						if ~strcmp(subfields(k),'errlog') && ~strcmp(subfields(k),'outlog') && ~strcmp(subfields(k),'SolutionType'),
+ 							%disp(sprintf('==========SubField name in tree %s ',subfields{k}));
+ 							Var=md.results.(groupfields{j})(1).(subfields{k});
+-							[DimSize,DimValue]=DefCreateVar(ncid,Var,groupID,subfields{k},DimSize,DimValue,true,last_step,md,groupfields{j});
++							[DimSize,DimValue]=DefCreateVar(ncid,Var,subgroupID,subfields{k},DimSize,DimValue,true,last_step,md,groupfields{j});
+ 			      end
+ 		      end
+ 				elseif length(md.results.(groupfields{j}))==1,
+@@ -72,7 +74,6 @@
+ 					subfields=fields(md.results.(groupfields{j}));
+ 					for k=1:length(subfields),
+ 						%disp(sprintf('==========SubField name in tree %s ',subfields{k}));
+-						netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype','results');
+ 						if ~strcmp(subfields(k),'errlog') && ~strcmp(subfields(k),'outlog') && ~strcmp(subfields(k),'SolutionType'),
+ 							Var=md.results.(groupfields{1})(1).(subfields{k});
+ 							[DimSize,DimValue]=DefCreateVar(ncid,Var,groupID,subfields{k},DimSize,DimValue,false);
+@@ -84,7 +85,7 @@
+ 	    end
+ 		else
+ 			for j=1:length(groupfields),
+-				%disp(sprintf('=====Field name in tree %s ',groupfields{j}));
++				disp(sprintf('=====Field name in tree %s ',groupfields{j}));
+ 				netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype',class(md.(groups{i})));
+ 				Var=md.(groups{i}).(groupfields{j});
+ 				[DimSize,DimValue]=DefCreateVar(ncid,Var,groupID,groupfields{j},DimSize,DimValue,false);
+@@ -128,46 +129,56 @@
+ 		[dims,DimSize,DimValue]=GetDims(ncid,Var,groupID,field,DimSize,DimValue,istime);
+ 		%dirty hack to be able to pass strings
+ 		varid = netcdf.defVar(groupID,field,'NC_CHAR',dims);
+-		for i=1:length(Var),
+-			startpoint=zeros(size(Var));
+-			startpoint(:,i)=i-1;
+-			if length(Var)>1,
+-				endpoint=[min(length(Var{i}),20) 1];
+-			else
+-				endpoint=min(length(Var{i}),20);
++		if length(Var)==0,
++			netcdf.putVar(groupID,varid,0,9,'emptycell')
++		else
++			for i=1:length(Var),
++				startpoint=zeros(size(Var));
++				startpoint(:,i)=i-1;
++				if length(Var)>1,
++					endpoint=[min(length(Var{i}),40) 1];
++				else
++					endpoint=min(length(Var{i}),40);
++		    end
++				if length(Var{i})>40,
++					netcdf.putVar(groupID,varid,startpoint,endpoint,Var{i}(1:40))
++					disp(sprintf('some variable have been truncated'));
++			  else
++					netcdf.putVar(groupID,varid,startpoint,endpoint,Var{i})
++	      end
+ 	    end
+-			if length(Var{i})>20,
+-				netcdf.putVar(groupID,varid,startpoint,endpoint,Var{i}(1:20))
+-			else
+-				netcdf.putVar(groupID,varid,startpoint,endpoint,Var{i})
+-	    end
+ 	  end
+ 	elseif isa(Var,'struct'),
+ 		%Start by getting the structure fields and size
+ 		locfields=fields(Var);
+ 		[dims,DimSize,DimValue]=GetDims(ncid,Var,groupID,locfields,DimSize,DimValue,istime);
+ 		varid = netcdf.defVar(groupID,field,'NC_CHAR',dims);
+-		for i=1:length(locfields),
+-			for j=1:2,
+-				if j==1,
+-					startpoint=[0,0,i-1];
+-					CharVar=locfields{i};
+-				else
+-					startpoint=[0,1,i-1];
+-					if isa(Var.(locfields{i}),'char'),
+-						CharVar=Var.(locfields{i});
++		if length(locfields)==0,
++			netcdf.putVar(groupID,varid,[0,0],[11,1],'emptystruct')
++		else
++			for i=1:length(locfields),
++				for j=1:2,
++					if j==1,
++						startpoint=[0,0,i-1];
++						CharVar=locfields{i};
+ 					else
+-						CharVar=num2str(Var.(locfields{i}));
++						startpoint=[0,1,i-1];
++						if isa(Var.(locfields{i}),'char'),
++							CharVar=Var.(locfields{i});
++						else
++							CharVar=num2str(Var.(locfields{i}));
++			      end
+ 		      end
++					endpoint=[min(length(CharVar),40),1,1];
++					if length(CharVar)>40,
++						netcdf.putVar(groupID,varid,startpoint,endpoint,CharVar(1:40))
++						disp(sprintf('some variable have been truncated'));
++					else
++						netcdf.putVar(groupID,varid,startpoint,endpoint,CharVar)
++		      end
+ 		    end
+-				endpoint=[min(length(CharVar),20),1,1];
+-				if length(CharVar)>20,
+-					netcdf.putVar(groupID,varid,startpoint,endpoint,CharVar(1:20))
+-				else
+-					netcdf.putVar(groupID,varid,startpoint,endpoint,CharVar)
+-		    end
+ 	    end
+-	  end
++		end
+ 	else
+ 		disp(sprintf('no support for class %s of field %s',varclass,field));
+   end
+@@ -184,7 +195,7 @@
+ 			currentdim=varsize(i);
+ 			dimexist=DimValue==currentdim;
+ 			if sum(dimexist)==0, %dimension is new to us, need to create it
+-				dimname=strcat(field{1},int2str(i));
++				dimname=strcat('Dimension',int2str(length(DimValue)+1));
+ 				dimindex=length(DimSize)+1;
+ 				DimSize(dimindex).index=netcdf.defDim(ncid,dimname,currentdim);
+ 				[DimSize(dimindex).name,DimSize(dimindex).value]=netcdf.inqDim(ncid,DimSize(dimindex).index);
+@@ -211,7 +222,7 @@
+ 			currentdim=varsize(i);
+ 			dimexist=DimValue==currentdim;
+ 			if sum(dimexist)==0, %dimension is new to us, need to create it
+-				dimname=strcat(field,int2str(i));
++				dimname=strcat('Dimension',int2str(length(DimValue)+1));
+ 				dimindex=length(DimSize)+1;
+ 				DimSize(dimindex).index=netcdf.defDim(ncid,dimname,currentdim);
+ 				[DimSize(dimindex).name,DimSize(dimindex).value]=netcdf.inqDim(ncid,DimSize(dimindex).index);
+@@ -231,6 +242,6 @@
+   end
+ 	%if we have a cell variable we need to add a stringlength dimension 
+ 	if isa(Var,'cell') || isa(Var,'struct'),
+-		dims=[DimSize(5).index dims];
++		dims=[DimSize(5).index dims]
+   end
+ end
+Index: ../trunk-jpl/src/m/contrib/netCDF/read_netCDF.m
+===================================================================
+--- ../trunk-jpl/src/m/contrib/netCDF/read_netCDF.m	(revision 0)
++++ ../trunk-jpl/src/m/contrib/netCDF/read_netCDF.m	(revision 19096)
+@@ -0,0 +1,134 @@
++function self=read_netCDF(filename)
++
++% Different types in the netcdf standard are:
++%   2 for char
++%   4 for integer
++%   6 for doubles	
++	
++	ncid=netcdf.open(filename,'NC_NOWRITE');
++	groupIDs=netcdf.inqGrps(ncid);%retrieve group IDs
++	self=model;
++	%loop on groups
++	for i=1:length(groupIDs)
++		whichclass = netcdf.getAtt(groupIDs(i),netcdf.getConstant('NC_GLOBAL'),'classtype');
++		groupName = netcdf.inqGrpName(groupIDs(i));		
++		%results needs a special treatment as it is a structure
++		if strcmp(whichclass,'results'),
++			subgroupIDs=netcdf.inqGrps(groupIDs(i));%retrieve group IDs
++			%define the model structure
++			self=setfield(self,groupName,struct);
++			for j=1:length(subgroupIDs)
++				subclass = netcdf.getAtt(subgroupIDs(j),netcdf.getConstant('NC_GLOBAL'),'classtype');
++				self.results=setfield(self.results,subclass,struct);
++				[ndims nvar natts]=netcdf.inq(groupIDs(j));
++				varIDs=netcdf.inqVarIDs(subgroupIDs(j));
++				%first loop on group atributes
++				for k=1:natts,
++					attname = netcdf.inqAttName(subgroupIDs(j),netcdf.getConstant('NC_GLOBAL'),k-1);
++					[xtype,attlen] = netcdf.inqAtt(subgroupIDs(j),netcdf.getConstant('NC_GLOBAL'),attname);
++					%disp(sprintf('In %s, Treating attribute %s of type %i',subclass,attname,xtype));
++					%classtype have done is job, no need to keep it any more
++					if ~strcmp(attname,'classtype'),
++						attval=netcdf.getAtt(subgroupIDs(i),netcdf.getConstant('NC_GLOBAL'),attname);
++						if strcmp(attval,'False'),
++							self.(groupName).(subclass).(attname)=false;
++						elseif strcmp(attval,'True')
++							self.(groupName).(subclass).(attname)=true;
++						else
++							self.(groupName).(subclass).(attname)=attval;
++			      end
++		      end
++		    end
++				%now loop on variable in group
++				for k=1:length(varIDs),
++					[varname, xtype, varDimIDs, varAtts] =netcdf.inqVar(subgroupIDs(j),varIDs(k));
++					%disp(sprintf('In %s, Treating variable %s of type %i',whichclass,varname,xtype));
++					%time dimension seems to be last in our construction
++					for l=1:length(varDimIDs),
++						[dimname, dimlen] = netcdf.inqDim(ncid,varDimIDs(l));
++						count(l)=[dimlen];
++		      end
++					startpoint=zeros(size(varDimIDs));
++					timestep=count(end);
++					count(end)=1;
++					for l=1:timestep,
++						data=netcdf.getVar(subgroupIDs(j),varIDs(k),startpoint,count);
++						self.(groupName).(subclass)(l).(varname)=data;
++						startpoint(end)=startpoint(end)+1;
++						self.(groupName).(subclass)(l).('errlog')='';
++						self.(groupName).(subclass)(l).('outlog')='';
++						self.(groupName).(subclass)(l).('SolutionType')=subclass;
++		     end
++				 clear count
++		    end
++	    end
++			%toolkits too require a specific treatment
++		elseif strcmp(whichclass,'toolkits'),
++			%just one variable here
++			varID=netcdf.inqVarIDs(groupIDs(i));
++			[varname, xtype, varDimIDs, varAtts] =netcdf.inqVar(groupIDs(i),varID);
++			%disp(sprintf('In %s, Treating variable %s of type %i',whichclass,varname,xtype));
++			[dimname,numoffields] = netcdf.inqDim(ncid,varDimIDs(end));
++			self.(groupName)=eval(whichclass);
++			for j=1:numoffields,
++				varval=netcdf.getVar(groupIDs(i),varID,[0,1,j-1],[40,1,1])';
++				fieldname=netcdf.getVar(groupIDs(i),varID,[0,0,j-1],[40,1,1])';
++				varval=cellstr(varval);
++				fieldname=cellstr(fieldname);
++				[val, status]=str2num(varval{1});
++				if strcmp(varval{1},'false') |strcmp(varval{1},'true')  ,
++					status=0;
++		    end
++				if status==1,
++					self.(groupName).(varname).(fieldname{1})=val;
++				else
++					self.(groupName).(varname).(fieldname{1})=varval{1};
++			 end
++	   end
++			%Now for the other fields
++
++		else,
++			%define the model structure
++			self.(groupName)=eval(whichclass);
++			varIDs=netcdf.inqVarIDs(groupIDs(i));
++			[ndims nvar natts]=netcdf.inq(groupIDs(i));
++			%first loop on group atributes
++			for j=1:natts,
++				attname = netcdf.inqAttName(groupIDs(i),netcdf.getConstant('NC_GLOBAL'),j-1);
++				[xtype,attlen] = netcdf.inqAtt(groupIDs(i),netcdf.getConstant('NC_GLOBAL'),attname);
++				%disp(sprintf('In %s, Treating attribute %s of type %i',whichclass,attname,xtype));
++				%classtype have done is job, no need to keep it any more
++				if ~strcmp(attname,'classtype'),
++					attval=netcdf.getAtt(groupIDs(i),netcdf.getConstant('NC_GLOBAL'),attname);
++					if strcmp(attval,'False'),
++						self.(groupName).(attname)=false;
++					elseif strcmp(attval,'True')
++						self.(groupName).(attname)=true;
++					else
++					self.(groupName).(attname)=attval;
++		    end
++		  end
++	  end
++			%now loop on variable in group
++			for j=1:length(varIDs),
++				[varname, xtype, varDimIDs, varAtts] =netcdf.inqVar(groupIDs(i),varIDs(j));
++				%disp(sprintf('In %s, Treating variable %s of type %i',whichclass,varname,xtype));			
++				%if the value is a single string, we need to transpose it (cross check with python file is necessary)
++				if xtype==2
++					varval=netcdf.getVar(groupIDs(i),varIDs(j))';
++					varval=cellstr(varval)';
++					if strcmp(varval{1},'emptystruct'),
++						self.(groupName).(varname)=struct;
++					elseif strcmp(varval{1},'emptycell'),
++						self.(groupName).(varname)=cell(0,0);
++					else
++						self.(groupName).(varname)=varval;
++					end
++				else
++					self.(groupName).(varname)=netcdf.getVar(groupIDs(i),varIDs(j));
++		    end
++		  end
++	  end
++  end
++	netcdf.close(ncid)
++end
+\ No newline at end of file
+Index: ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py
+===================================================================
+--- ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py	(revision 19095)
++++ ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py	(revision 19096)
+@@ -19,26 +19,28 @@
+ 					output=output+[str(DimDict[shape[dim]])] #test if the dimension allready exist
+ 				except KeyError: #if not create it
+ 					if (shape[dim])>1:
+-						NewDim=NCData.createDimension(str(field)+str(dim),(shape[dim]))
+-						DimDict[len(NewDim)]=str(field)+str(dim)
++						index=len(DimDict)+1
++						NewDim=NCData.createDimension('Dimension'+str(index),(shape[dim]))
++						DimDict[len(NewDim)]='Dimension'+str(index)
+ 						output=output+[str(DimDict[shape[dim]])]
+ 						print 'Defining dimension ' +str(shape[dim]) +' for '+str(field)+str(dim)
+ 			elif type(shape[0])==str:#dealling with a dictionnary
+ 				try:
+ 					output=[str(DimDict[numpy.shape(shape)[0]])]+['DictDim']
+ 				except KeyError:
+-					NewDim=NCData.createDimension(str(field),numpy.shape(shape)[0])
+-					DimDict[len(NewDim)]=str(field)
+-					output=[str(DimDict[numpy.shape(dict.keys(var))[0]])]+['DictDim']
++					index=len(DimDict)+1
++					NewDim=NCData.createDimension('Dimension'+str(index),numpy.shape(shape)[0])
++					DimDict[len(NewDim)]='Dimension'+str(index)
++					output=[str(DimDict[numpy.shape(dict.keys(var))[0]])]+['Dimension5']
+ 					print 'Defining dimension ' +str(numpy.shape(shape)[0]) +' for '+str(field)
+ 				break
+ 		if istime:
+-			output=output+['Time']
++			output=output+['Dimension4']
+ 		return tuple(output)
+ 	#============================================================================
+ 
+   #Define the variables
+-	def CreateVar(var,istime,*step_args):
++	def CreateVar(var,Group,istime,*step_args):
+ 		#grab type
+ 		try:
+ 			val_type=str(var.dtype)
+@@ -55,11 +57,11 @@
+ 
+ 		#treating scalar string or bool as atribute
+ 		if val_type==str or val_type==bool:
+-			NCgroup.__setattr__(str(field), str(var))
++			Group.__setattr__(str(field), str(var))
+ 
+ 		#treating list as string table
+ 		elif val_type==list:
+-			ncvar = NCgroup.createVariable(str(field),str,GetDim(var,val_shape,val_dim,istime),zlib=True)
++			ncvar = Group.createVariable(str(field),str,GetDim(var,val_shape,val_dim,istime),zlib=True)
+ 			for elt in range(0,val_dim):
+ 				try:
+ 					ncvar[elt] = var[elt]
+@@ -67,18 +69,18 @@
+ 					ncvar[0]= " "
+ 		#treating bool tables as string tables
+ 		elif val_type=='bool':
+-			ncvar = NCgroup.createVariable(str(field),str,GetDim(var,val_shape,val_dim,istime),zlib=True)
++			ncvar = Group.createVariable(str(field),str,GetDim(var,val_shape,val_dim,istime),zlib=True)
+ 			for elt in range(0,val_shape[0]):
+ 				ncvar[elt] = str(var[elt])
+ 		#treating dictionaries as string tables of dim 2
+ 		elif val_type==collections.OrderedDict:
+-			ncvar = NCgroup.createVariable(str(field),str,GetDim(var,val_shape,val_dim,istime),zlib=True)
++			ncvar = Group.createVariable(str(field),str,GetDim(var,val_shape,val_dim,istime),zlib=True)
+ 			for elt in range(0,val_dim):
+ 				ncvar[elt,0]=dict.keys(var)[elt]
+ 				ncvar[elt,1]=str(dict.values(var)[elt]) #converting to str to avoid potential problems
+ 		#Now dealing with numeric variables
+ 		else:
+-			ncvar = NCgroup.createVariable(str(field),TypeDict[val_type],GetDim(var,val_shape,val_dim,istime),zlib=True)
++			ncvar = Group.createVariable(str(field),TypeDict[val_type],GetDim(var,val_shape,val_dim,istime),zlib=True)
+ 			
+ 			if istime:
+ 				last=step_args[0]
+@@ -126,17 +128,17 @@
+ 	else:
+ 		StepNum=1
+ 		
+-	EltNum=NCData.createDimension('EltNum',md.mesh.numberofelements)
+-	VertNum=NCData.createDimension('VertNum',md.mesh.numberofvertices)
+-	VertperElt=NCData.createDimension('VertperElt',numpy.shape(md.mesh.elements)[1])
+-	Time=NCData.createDimension('Time',StepNum)
+-	DictDim=NCData.createDimension('DictDim',2) 
++	Dimension1=NCData.createDimension('Dimension1',md.mesh.numberofelements)
++	Dimension2=NCData.createDimension('Dimension2',md.mesh.numberofvertices)
++	Dimension3=NCData.createDimension('Dimension3',numpy.shape(md.mesh.elements)[1])
++	Dimension4=NCData.createDimension('Dimension4',StepNum)
++	Dimension5=NCData.createDimension('Dimension5',2) 
+ 
+-	DimDict = {len(EltNum):'EltNum',
+-						 len(VertNum):'VertNum',
+-						 len(VertperElt):'VertperElt',
+-						 len(Time):'Time',
+-						 len(DictDim):'DictDim'}
++	DimDict = {len(Dimension1):'Dimension1',
++						 len(Dimension2):'Dimension2',
++						 len(Dimension3):'Dimension3',
++						 len(Dimension4):'Dimension4',
++						 len(Dimension5):'Dimension5'}
+ 
+ 	TypeDict = {float:'f8',
+ 							'float64':'f8',
+@@ -153,6 +155,9 @@
+ 		#Special treatment for the results
+ 		if str(group)=='results':
+ 			for supfield in fields:#looping on the different solutions
++				NCgroup.__setattr__('classtype', "results")
++				Subgroup=NCgroup.createGroup(str(supfield))
++				Subgroup.__setattr__('classtype',str(supfield))
+ 				if type(md.results.__dict__[supfield])==list:#the solution have several timestep
+ 					#get last timesteps and output frequency
+ 					last_step = numpy.size(md.results.__dict__[supfield])
+@@ -160,19 +165,17 @@
+ 					#grab first time step
+ 					subfields=dict.keys(md.results.__dict__[supfield].__getitem__(0).__dict__)
+ 					for field in subfields:
+-						NCgroup.__setattr__('classtype', "results")
+ 						if str(field)!='errlog' and str(field)!='outlog' and str(field)!='SolutionType':
+ 							Var=md.results.__dict__[supfield].__getitem__(0).__dict__[field]
+-							CreateVar(Var,True,last_step,step_freq)
++							CreateVar(Var,Subgroup,True,last_step,step_freq)
+ 					
+ 				elif type(md.results.__dict__[supfield])==results:#only one timestep
+ 					subfields=dict.keys(md.results.__dict__[supfield].__dict__)
+ 					for field in subfields:
+-						NCgroup.__setattr__('classtype', "results")
+ 						if str(field)!='errlog' and str(field)!='outlog' and str(field)!='SolutionType':
+ #							print 'Treating '+str(group)+'.'+str(supfield)+'.'+str(field)
+ 							Var=md.results.__dict__[supfield].__dict__[field]
+-							CreateVar(Var,False)
++							CreateVar(Var,Subgroup,False)
+ 				else:
+ 					print 'Result format not suported'
+ 		else:
+@@ -181,7 +184,7 @@
+ #				print 'Treating ' +str(group)+'.'+str(field)
+ 				NCgroup.__setattr__('classtype', md.__dict__[group].__class__.__name__)
+ 				Var=md.__dict__[group].__dict__[field]
+-				CreateVar(Var,False)
++				CreateVar(Var,NCgroup,False)
+ 	NCData.close()
+ 
+ 
Index: /issm/oecreview/Archive/18296-19100/ISSM-19096-19097.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19096-19097.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19096-19097.diff	(revision 19102)
@@ -0,0 +1,262 @@
+Index: ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py
+===================================================================
+--- ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py	(revision 19096)
++++ ../trunk-jpl/src/m/contrib/netCDF/export_netCDF.py	(revision 19097)
+@@ -7,106 +7,7 @@
+ from results import *
+ from os import path, remove
+ 
+-def netCDFExp(md,filename):
+-
+-	#defining some sub-functions
+-	#retriev the dimension tuple from a dictionnary
+-	def GetDim(var,shape,i,istime):
+-		output=[]
+-		for dim in range(0,i): #loop on the dimensions
+-			if type(shape[0])==int: 
+-				try:
+-					output=output+[str(DimDict[shape[dim]])] #test if the dimension allready exist
+-				except KeyError: #if not create it
+-					if (shape[dim])>1:
+-						index=len(DimDict)+1
+-						NewDim=NCData.createDimension('Dimension'+str(index),(shape[dim]))
+-						DimDict[len(NewDim)]='Dimension'+str(index)
+-						output=output+[str(DimDict[shape[dim]])]
+-						print 'Defining dimension ' +str(shape[dim]) +' for '+str(field)+str(dim)
+-			elif type(shape[0])==str:#dealling with a dictionnary
+-				try:
+-					output=[str(DimDict[numpy.shape(shape)[0]])]+['DictDim']
+-				except KeyError:
+-					index=len(DimDict)+1
+-					NewDim=NCData.createDimension('Dimension'+str(index),numpy.shape(shape)[0])
+-					DimDict[len(NewDim)]='Dimension'+str(index)
+-					output=[str(DimDict[numpy.shape(dict.keys(var))[0]])]+['Dimension5']
+-					print 'Defining dimension ' +str(numpy.shape(shape)[0]) +' for '+str(field)
+-				break
+-		if istime:
+-			output=output+['Dimension4']
+-		return tuple(output)
+-	#============================================================================
+-
+-  #Define the variables
+-	def CreateVar(var,Group,istime,*step_args):
+-		#grab type
+-		try:
+-			val_type=str(var.dtype)
+-		except AttributeError:
+-			val_type=type(var)
+-		#grab dimension
+-		try:
+-			val_shape=dict.keys(var)
+-		except TypeError:
+-			val_shape=numpy.shape(var)
+-
+-		val_dim=numpy.shape(val_shape)[0]
+-		#Now define and fill up variable
+-
+-		#treating scalar string or bool as atribute
+-		if val_type==str or val_type==bool:
+-			Group.__setattr__(str(field), str(var))
+-
+-		#treating list as string table
+-		elif val_type==list:
+-			ncvar = Group.createVariable(str(field),str,GetDim(var,val_shape,val_dim,istime),zlib=True)
+-			for elt in range(0,val_dim):
+-				try:
+-					ncvar[elt] = var[elt]
+-				except IndexError:
+-					ncvar[0]= " "
+-		#treating bool tables as string tables
+-		elif val_type=='bool':
+-			ncvar = Group.createVariable(str(field),str,GetDim(var,val_shape,val_dim,istime),zlib=True)
+-			for elt in range(0,val_shape[0]):
+-				ncvar[elt] = str(var[elt])
+-		#treating dictionaries as string tables of dim 2
+-		elif val_type==collections.OrderedDict:
+-			ncvar = Group.createVariable(str(field),str,GetDim(var,val_shape,val_dim,istime),zlib=True)
+-			for elt in range(0,val_dim):
+-				ncvar[elt,0]=dict.keys(var)[elt]
+-				ncvar[elt,1]=str(dict.values(var)[elt]) #converting to str to avoid potential problems
+-		#Now dealing with numeric variables
+-		else:
+-			ncvar = Group.createVariable(str(field),TypeDict[val_type],GetDim(var,val_shape,val_dim,istime),zlib=True)
+-			
+-			if istime:
+-				last=step_args[0]
+-				freq=step_args[1]
+-				vartab=var
+-				for time in range(freq-1,last,freq):
+-					if time!=0:
+-						timevar=md.results.__dict__[supfield].__getitem__(time).__dict__[field]
+-						print 'Treating '+str(group)+'.'+str(supfield)+'.'+str(field)+' for time '+str(time)
+-						vartab=numpy.column_stack((vartab,timevar))
+-				print numpy.shape(vartab)
+-				try:
+-					ncvar[:,:]=vartab[:,:]
+-				except ValueError:
+-					ncvar[:]=vartab.T[:]
+-			else:
+-				try:
+-					nan_val=numpy.isnan(var)
+-					if nan_val.all():
+-						ncvar [:] = 'NaN'
+-					else:
+-						ncvar[:] = var
+-				except TypeError: #type does not accept nan, get vallue of the variable
+-					ncvar[:] = var
+-	#============================================================================
+-	
++def export_netCDF(md,filename):
+ 	#Now going on Real treatment
+ 	if path.exists(filename):
+ 		print ('File {} allready exist'.format(filename))
+@@ -140,11 +41,6 @@
+ 						 len(Dimension4):'Dimension4',
+ 						 len(Dimension5):'Dimension5'}
+ 
+-	TypeDict = {float:'f8',
+-							'float64':'f8',
+-							int:'i8',
+-							'int64':'i8'}
+-	
+ 	#get all model classes and create respective groups
+ 	groups=dict.keys(md.__dict__)
+ 	for group in groups:
+@@ -167,24 +63,132 @@
+ 					for field in subfields:
+ 						if str(field)!='errlog' and str(field)!='outlog' and str(field)!='SolutionType':
+ 							Var=md.results.__dict__[supfield].__getitem__(0).__dict__[field]
+-							CreateVar(Var,Subgroup,True,last_step,step_freq)
++							DimDict=CreateVar(NCData,Var,field,Subgroup,DimDict,True,last_step,step_freq,md,supfield)
+ 					
+ 				elif type(md.results.__dict__[supfield])==results:#only one timestep
+ 					subfields=dict.keys(md.results.__dict__[supfield].__dict__)
+ 					for field in subfields:
+ 						if str(field)!='errlog' and str(field)!='outlog' and str(field)!='SolutionType':
+-#							print 'Treating '+str(group)+'.'+str(supfield)+'.'+str(field)
++							print 'Treating '+str(group)+'.'+str(supfield)+'.'+str(field)
+ 							Var=md.results.__dict__[supfield].__dict__[field]
+-							CreateVar(Var,Subgroup,False)
++							DimDict=CreateVar(NCData,Var,field,NCgroup,DimDict,False)
+ 				else:
+ 					print 'Result format not suported'
+ 		else:
+ 			
+ 			for field in fields:
+-#				print 'Treating ' +str(group)+'.'+str(field)
++				print 'Treating ' +str(group)+'.'+str(field)
+ 				NCgroup.__setattr__('classtype', md.__dict__[group].__class__.__name__)
+ 				Var=md.__dict__[group].__dict__[field]
+-				CreateVar(Var,NCgroup,False)
++				DimDict=CreateVar(NCData,Var,field,NCgroup,DimDict,False)
+ 	NCData.close()
+ 
++#============================================================================
++#Define the variables
++def CreateVar(NCData,var,field,Group,DimDict,istime,*step_args):
++	#grab type
++	try:
++		val_type=str(var.dtype)
++	except AttributeError:
++		val_type=type(var)
++		#grab dimension
++	try:
++		val_shape=dict.keys(var)
++	except TypeError:
++		val_shape=numpy.shape(var)
+ 
++
++	TypeDict = {float:'f8',
++							'float64':'f8',
++							int:'i8',
++							'int64':'i8'}
++		
++	val_dim=numpy.shape(val_shape)[0]
++	#Now define and fill up variable
++	#treating scalar string or bool as atribute
++	if val_type==str or val_type==bool:
++		Group.__setattr__(str(field), str(var))
++
++	#treating list as string table
++	#matlab does not recognise strings so we have to settle down with char arrays
++	elif val_type==list:
++		dimensions,DimDict=GetDim(NCData,var,val_shape,DimDict,val_dim,istime)
++		ncvar = Group.createVariable(str(field),str,dimensions,zlib=True)
++		for elt in range(0,val_dim):
++			try:
++				ncvar[elt] = var[elt]
++			except IndexError:
++				ncvar[0]= " "
++				#treating bool tables as string tables
++	elif val_type=='bool':
++		dimensions,DimDict=GetDim(NCData,var,val_shape,DimDict,val_dim,istime)
++		ncvar = Group.createVariable(str(field),str,dimensions,zlib=True)
++		for elt in range(0,val_shape[0]):
++			ncvar[elt] = str(var[elt])
++			#treating dictionaries as string tables of dim 2
++	elif val_type==collections.OrderedDict:
++		dimensions,DimDict=GetDim(NCData,var,val_shape,DimDict,val_dim,istime)
++		ncvar = Group.createVariable(str(field),str,dimensions,zlib=True)
++		for elt in range(0,val_dim):
++			ncvar[elt,0]=dict.keys(var)[elt]
++			ncvar[elt,1]=str(dict.values(var)[elt]) #converting to str to avoid potential problems
++			#Now dealing with numeric variables
++	else:
++		dimensions,DimDict=GetDim(NCData,var,val_shape,DimDict,val_dim,istime)
++		ncvar = Group.createVariable(str(field),TypeDict[val_type],dimensions,zlib=True)
++		
++		if istime:
++			last=step_args[0]
++			freq=step_args[1]
++			md=step_args[2]
++			supfield=step_args[3]
++			vartab=var
++			for time in range(freq-1,last,freq):
++				if time!=0:
++					timevar=md.results.__dict__[supfield].__getitem__(time).__dict__[field]
++					print 'Treating results.'+str(supfield)+'.'+str(field)+' for time '+str(time)
++					vartab=numpy.column_stack((vartab,timevar))
++			print numpy.shape(vartab)
++			try:
++				ncvar[:,:]=vartab[:,:]
++			except ValueError:
++				ncvar[:]=vartab.T[:]
++		else:
++			try:
++				nan_val=numpy.isnan(var)
++				if nan_val.all():
++					ncvar [:] = 'NaN'
++				else:
++					ncvar[:] = var
++			except TypeError: #type does not accept nan, get vallue of the variable
++				ncvar[:] = var
++	return DimDict
++
++#============================================================================
++#retriev the dimension tuple from a dictionnary
++def GetDim(NCData,var,shape,DimDict,i,istime):
++	output=[]
++	for dim in range(0,i): #loop on the dimensions
++		if type(shape[0])==int: 
++			try:
++				output=output+[str(DimDict[shape[dim]])] #test if the dimension allready exist
++			except KeyError: #if not create it
++				if (shape[dim])>1:
++					index=len(DimDict)+1
++					NewDim=NCData.createDimension('Dimension'+str(index),(shape[dim]))
++					DimDict[len(NewDim)]='Dimension'+str(index)
++					output=output+[str(DimDict[shape[dim]])]
++					print 'Defining dimension ' +'Dimension'+str(index)
++		elif type(shape[0])==str:#dealling with a dictionnary
++			try:
++				output=[str(DimDict[numpy.shape(shape)[0]])]+['DictDim']
++			except KeyError:
++				index=len(DimDict)+1
++				NewDim=NCData.createDimension('Dimension'+str(index),numpy.shape(shape)[0])
++				DimDict[len(NewDim)]='Dimension'+str(index)
++				output=[str(DimDict[numpy.shape(dict.keys(var))[0]])]+['Dimension5']
++				print 'Defining dimension ' +'Dimension'+str(index)
++			break
++	if istime:
++		output=output+['Dimension4']
++	return tuple(output), DimDict
Index: /issm/oecreview/Archive/18296-19100/ISSM-19097-19098.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19097-19098.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19097-19098.diff	(revision 19102)
@@ -0,0 +1,17 @@
+Index: ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp
+===================================================================
+--- ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 19097)
++++ ../trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 19098)
+@@ -109,10 +109,12 @@
+ 				}
+ 				xDelete<char*>(misfit_name_s);
+ 				xDelete<int>(misfit_model_enum_s);
++				xDelete<int>(misfit_definitionenums_s);
+ 				xDelete<IssmDouble*>(misfit_observation_s);
+ 				xDelete<int>(misfit_observation_enum_s);
+ 				xDelete<int>(misfit_observation_M_s);
+ 				xDelete<int>(misfit_observation_N_s);
++				xDelete<int>(misfit_local_s);
+ 				xDelete<char*>(misfit_timeinterpolation_s);
+ 				xDelete<IssmDouble*>(misfit_weights_s);
+ 				xDelete<int>(misfit_weights_M_s);
Index: /issm/oecreview/Archive/18296-19100/ISSM-19098-19099.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19098-19099.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19098-19099.diff	(revision 19102)
@@ -0,0 +1,12 @@
+Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
+===================================================================
+--- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 19098)
++++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 19099)
+@@ -391,6 +391,7 @@
+ 	xDelete<IssmDouble>(v);
+ 	xDelete<IssmDouble>(w);
+ 	xDelete<IssmDouble>(c);
++	xDelete<IssmDouble>(m);
+ 	xDelete<IssmDouble>(dlsf);
+ 	delete gauss;
+ 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
Index: /issm/oecreview/Archive/18296-19100/ISSM-19099-19100.diff
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-19099-19100.diff	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-19099-19100.diff	(revision 19102)
@@ -0,0 +1,13 @@
+Index: ../trunk-jpl/configure.ac
+===================================================================
+--- ../trunk-jpl/configure.ac	(revision 19099)
++++ ../trunk-jpl/configure.ac	(revision 19100)
+@@ -1,7 +1,7 @@
+ # Process this file with autoconf to produce a configure script.
+ 
+ #AUTOCONF
+-AC_INIT([Ice Sheet System Model (ISSM)],[4.8],[issm@jpl.nasa.gov],[issm],[http://issm.jpl.nasa.gov]) #Initializing configure
++AC_INIT([Ice Sheet System Model (ISSM)],[4.9],[issm@jpl.nasa.gov],[issm],[http://issm.jpl.nasa.gov]) #Initializing configure
+ AC_CONFIG_AUX_DIR([./aux-config])         #Put config files in aux-config
+ AC_CONFIG_MACRO_DIR([m4])                 #m4 macros are located in m4
+ m4_include([m4/issm_options.m4])
Index: /issm/oecreview/Archive/18296-19100/ISSM-DocReview-18296-19100.tex
===================================================================
--- /issm/oecreview/Archive/18296-19100/ISSM-DocReview-18296-19100.tex	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/ISSM-DocReview-18296-19100.tex	(revision 19102)
@@ -0,0 +1,67 @@
+\documentclass[]{report}   % list options between brackets
+\usepackage{graphicx}              % list packages between braces
+
+% type user-defined commands here
+
+\begin{document}
+
+\title{JPL EXPORT ADMINISTRATION \\ DOCUMENT REVIEW RECORD}   % type title between braces
+\author{Tom Scavo}         % type author(s) between braces
+\date{October 27, 1995}    % type date between braces
+%\maketitle
+
+
+\begin{center}
+\begin{tabular}{ |c|c| }
+\hline
+JPL EXPORT ADMINISTRATION \\
+\textit{ DOCUMENT REVIEW RECORD} \\
+\hline
+\end{tabular}
+\end{center}
+
+\hfill Log \#: \underline{\input{LogNumber}}
+
+\vspace{1cm}
+\noindent (Note: This form and process do not replace the procedures described in JPL Policy relating to review and approval of proposals and contractual 
+documents. This process is intended to document the review and coordination of requests to ascertain the export control ramifications relating to specific 
+documents. Export Administration signature does not convey authority to export or release the "Exporter of Record" from any export laws or regulations.)\\
+
+\noindent \textbf{Program:} \underline{ISSM: Ice Sheet System Model} \\ \\
+\noindent \textbf{Person Requesting or Initiating Export}: \underline{Dr. Eric Larour}\\ \\
+\noindent \textbf{Date Received}: \underline{\input{Date}}\\ \\
+\noindent \textbf{Document Title/Description}: ISSM changes from revision \input{r1} to revision \input{r2} \\ \\
+\noindent \textbf{Release to:} \underline{http://issm.ess.uci.edu/svn/issm/issm/trunk on ISSM svn repository}\\ \\
+\noindent \textbf{JPL Intranet:} \underline{murdo.jpl.nasa.gov/proj/ice/larour/issm-uci/trunk-jpl}\\ \\
+
+\noindent \textbf{Disposition: 6 } 
+Does not contain export-controlled information. May be released/disclosed as requested subject to 
+Company guidelines on protection of proprietary information (if applicable). \\
+
+\noindent \textbf{Comments:}  see table of changes below. \\ \\
+\noindent \textbf{Reviewed by ISSM Export Transfer Liaison:} Dr. Eric Larour \hfill \textbf{Date:} \input{Date} \\ 
+\includegraphics[scale=1]{signature}
+
+\noindent JPL Export Administration Form TBS – June 29, 2011
+
+\begin{center}
+\line(1,0){250}
+\end{center}
+
+\noindent \textbf{Disposition:} \\
+1:	  Public Domain Information (Ref ITAR Section 120.11) \\
+2:	  Qualifies for ITAR Exemption				 \\
+3:	  Covered by Department of State License/Agreement Number					  \\
+4:	  Covered by Department of Commerce validated license or exception				 \\
+5:	  New License Required \\
+6:	  Does not contain export-controlled information.  May be released/disclosed as requested subject
+   to Company guidelines on protection of proprietary information (if applicable). \\
+7:	 Other (specify)   
+\begin{center}
+\line(1,0){250}
+\end{center}
+
+
+\input{log}
+
+\end{document}
Index: /issm/oecreview/Archive/18296-19100/LogNumber.tex
===================================================================
--- /issm/oecreview/Archive/18296-19100/LogNumber.tex	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/LogNumber.tex	(revision 19102)
@@ -0,0 +1,1 @@
+18296-19100
Index: /issm/oecreview/Archive/18296-19100/Makefile
===================================================================
--- /issm/oecreview/Archive/18296-19100/Makefile	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/Makefile	(revision 19102)
@@ -0,0 +1,8 @@
+TARGET=ISSM-DocReview-18296-19100
+
+all: 
+	pdflatex -interaction=errorstopmode -file-line-error -halt-on-error $(TARGET).tex
+	rm -rf *.log *.aux 
+
+clean:
+	rm -rf *.log *.aux
Index: /issm/oecreview/Archive/18296-19100/log.tex
===================================================================
--- /issm/oecreview/Archive/18296-19100/log.tex	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/log.tex	(revision 19102)
@@ -0,0 +1,5544 @@
+\noindent \textbf{Change \#1} with diff file ISSM-18297-18298.diff: \\
+Function name: \\
+M /issm/trunk-jpl/configure.ac\\
+Export determination: 6. \\
+Rationale: CHG: updating version number\\
+\vspace{3em}
+
+\noindent \textbf{Change \#2} with diff file ISSM-18298-18299.diff: \\
+Function name: \\
+D /issm/trunk-jpl/src/java\\
+Export determination: 6. \\
+Rationale: CHG: removing java temporarily for merge\\
+\vspace{3em}
+
+\noindent \textbf{Change \#3} with diff file ISSM-18300-18301.diff: \\
+Function name: \\
+M /issm/trunk-jpl M /issm/trunk-jpl/etc/environment.csh\\
+Export determination: 6. \\
+Rationale: merged trunk and trunk-jpl\\
+\vspace{3em}
+
+\noindent \textbf{Change \#4} with diff file ISSM-18302-18303.diff: \\
+Function name: \\
+M /issm/trunk-jpl M /issm/trunk-jpl/src M /issm/trunk-jpl/test\\
+Export determination: 6. \\
+Rationale: Block revision 18301 from being merged into trunk-jpl\\
+\vspace{3em}
+
+\noindent \textbf{Change \#5} with diff file ISSM-18303-18304.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/groundingline.m M /issm/trunk-jpl/src/m/classes/groundingline.py\\
+Export determination: 6. \\
+Rationale: CHG: updated checkconsistency message\\
+\vspace{3em}
+
+\noindent \textbf{Change \#6} with diff file ISSM-18304-18305.diff: \\
+Function name: \\
+A /issm/trunk-jpl/externalpackages/dakota/configs/5.3.1/BuildDakotaCustom.cmake.mac.patch A /issm/trunk-jpl/externalpackages/dakota/configs/5.3.1/CMakeLists.txt.patch M /issm/trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64.sh\\
+Export determination: 6. \\
+Rationale: CHG: update dakota to build statically\\
+\vspace{3em}
+
+\noindent \textbf{Change \#7} with diff file ISSM-18305-18306.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/clusters/greenplanet.m M /issm/trunk-jpl/src/m/classes/clusters/pfe.m M /issm/trunk-jpl/src/m/classes/groundingline.m\\
+Export determination: 6. \\
+Rationale: CHG: typo\\
+\vspace{3em}
+
+\noindent \textbf{Change \#8} with diff file ISSM-18306-18307.diff: \\
+Function name: \\
+A /issm/trunk-jpl/externalpackages/boost/configs/1.55/darwin.jam.patch A /issm/trunk-jpl/externalpackages/boost/configs/1.55/darwin.py.patch A /issm/trunk-jpl/externalpackages/boost/configs/1.55/user-config.jam.patch M /issm/trunk-jpl/externalpackages/boost/install-1.55-macosx-mavericks.sh\\
+Export determination: 6. \\
+Rationale: CHG: update mavericks build\\
+\vspace{3em}
+
+\noindent \textbf{Change \#9} with diff file ISSM-18308-18309.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added assertion for FlowequationElementEquationEnum\\
+\vspace{3em}
+
+\noindent \textbf{Change \#10} with diff file ISSM-18309-18310.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/flowequation.m M /issm/trunk-jpl/src/m/classes/flowequation.py\\
+Export determination: 6. \\
+Rationale: CHG: check flow equations only if isstressbalance = 1\\
+\vspace{3em}
+
+\noindent \textbf{Change \#11} with diff file ISSM-18310-18311.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/taoinversion.m\\
+Export determination: 6. \\
+Rationale: NEW: added new algorithms for tao\\
+\vspace{3em}
+
+\noindent \textbf{Change \#12} with diff file ISSM-18311-18312.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/MeltingAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: no need to get flowequations\\
+\vspace{3em}
+
+\noindent \textbf{Change \#13} with diff file ISSM-18313-18314.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/issm\_options.m4 M /issm/trunk-jpl/src/c/Makefile.am M /issm/trunk-jpl/src/wrappers/matlab/Makefile.am M /issm/trunk-jpl/src/wrappers/python/Makefile.am\\
+Export determination: 6. \\
+Rationale: CHG: Major change to build system. Moved last non libtool libraries to libtool. Added m4 macros to enable standalone functionality.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#14} with diff file ISSM-18314-18315.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/Makefile.am\\
+Export determination: 6. \\
+Rationale: CHG: Minor change to libISSMModules\_LIBADD to link against triangle.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#15} with diff file ISSM-18315-18316.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/Makefile.am\\
+Export determination: 6. \\
+Rationale: BUG: fixing Kriging compilation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#16} with diff file ISSM-18316-18317.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/wrappers/matlab/Makefile.am\\
+Export determination: 6. \\
+Rationale: BUG: need to add FORTRAN\\
+\vspace{3em}
+
+\noindent \textbf{Change \#17} with diff file ISSM-18317-18318.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test513.m M /issm/trunk-jpl/test/NightlyRun/test513.py\\
+Export determination: 6. \\
+Rationale: CHG: relaxed tolerances\\
+\vspace{3em}
+
+\noindent \textbf{Change \#18} with diff file ISSM-18318-18319.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/issm\_options.m4 M /issm/trunk-jpl/src/c/Makefile.am\\
+Export determination: 6. \\
+Rationale: CHG: added bamg optionnaly and fixed kriging dependensies to modules\\
+\vspace{3em}
+
+\noindent \textbf{Change \#19} with diff file ISSM-18319-18320.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/Makefile.am M /issm/trunk-jpl/src/wrappers/matlab/Makefile.am M /issm/trunk-jpl/src/wrappers/python/Makefile.am\\
+Export determination: 6. \\
+Rationale: CHG: removing old flags that do not always exist\\
+\vspace{3em}
+
+\noindent \textbf{Change \#20} with diff file ISSM-18320-18321.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/plot\_section.m\\
+Export determination: 6. \\
+Rationale: CHG: fixing section plot in 2d\\
+\vspace{3em}
+
+\noindent \textbf{Change \#21} with diff file ISSM-18321-18322.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/imac-012301-gil M /issm/trunk-jpl/jenkins/linux64\_larsen M /issm/trunk-jpl/jenkins/linux64\_murdo M /issm/trunk-jpl/jenkins/linux64\_murdo\_ad M /issm/trunk-jpl/jenkins/linux64\_murdo\_ampi M /issm/trunk-jpl/jenkins/windows\\
+Export determination: 6. \\
+Rationale: CHG: no need to have ISSM\_ARCH\\
+\vspace{3em}
+
+\noindent \textbf{Change \#22} with diff file ISSM-18322-18323.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/issm\_options.m4\\
+Export determination: 6. \\
+Rationale: CHG: do not add -dy flag that is not supported by many compilers\\
+\vspace{3em}
+
+\noindent \textbf{Change \#23} with diff file ISSM-18326-18327.diff: \\
+Function name: \\
+M /issm/trunk-jpl/configs/config-discover.sh M /issm/trunk-jpl/configs/config-greenplanet.sh M /issm/trunk-jpl/configs/config-hoffman2.sh M /issm/trunk-jpl/configs/config-linux64-cloud.sh M /issm/trunk-jpl/configs/config-linux64-larsen-gia.sh M /issm/trunk-jpl/configs/config-linux64-larsen.sh M /issm/trunk-jpl/configs/config-linux64-murdo.sh M /issm/trunk-jpl/configs/config-linux64-pleiades-gcc-4.4.4.sh M /issm/trunk-jpl/configs/config-linux64-pleiades-gcc-4.7.0.sh M /issm/trunk-jpl/configs/config-linux64-pleiades-intel2012.0.032-mpt.2.06rp16.sh M /issm/trunk-jpl/configs/config-linux64-skylla.sh M /issm/trunk-jpl/configs/config-linux64-ubuntu64.sh M /issm/trunk-jpl/configs/config-macosx64.sh M /issm/trunk-jpl/configs/config-pleiades-petscdev.sh M /issm/trunk-jpl/configs/config-win7-32.sh M /issm/trunk-jpl/configs/config-win7-64-parallel.sh M /issm/trunk-jpl/configs/config-win7-64.sh M /issm/trunk-jpl/configs/configure.sh\\
+Export determination: 6. \\
+Rationale: CHG: not more ISSM\_ARCH, no more blacs\\
+\vspace{3em}
+
+\noindent \textbf{Change \#24} with diff file ISSM-18327-18328.diff: \\
+Function name: \\
+D /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/.dirstamp\\
+Export determination: 6. \\
+Rationale: DEL: should not be under svn\\
+\vspace{3em}
+
+\noindent \textbf{Change \#25} with diff file ISSM-18328-18329.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/m1qn3/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: m1qn3 should be compiled with fPIC on\\
+\vspace{3em}
+
+\noindent \textbf{Change \#26} with diff file ISSM-18329-18330.diff: \\
+Function name: \\
+A /issm/trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh\\
+Export determination: 6. \\
+Rationale: NEW: added install-3.5-greenplanet.sh\\
+\vspace{3em}
+
+\noindent \textbf{Change \#27} with diff file ISSM-18330-18331.diff: \\
+Function name: \\
+M /issm/trunk-jpl/etc/environment.csh\\
+Export determination: 6. \\
+Rationale: CHG: prepend csh paths\\
+\vspace{3em}
+
+\noindent \textbf{Change \#28} with diff file ISSM-18331-18332.diff: \\
+Function name: \\
+A /issm/trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64-snowleopard.sh\\
+Export determination: 6. \\
+Rationale: NEW: add script for snowleopard\\
+\vspace{3em}
+
+\noindent \textbf{Change \#29} with diff file ISSM-18332-18333.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/Makefile.am\\
+Export determination: 6. \\
+Rationale: CHG: cosmetics\\
+\vspace{3em}
+
+\noindent \textbf{Change \#30} with diff file ISSM-18333-18334.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/Makefile.am\\
+Export determination: 6. \\
+Rationale: BUG: libISSMModules should not be added to LDADD if with-wrappers=no\\
+\vspace{3em}
+
+\noindent \textbf{Change \#31} with diff file ISSM-18334-18335.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/issm\_options.m4\\
+Export determination: 6. \\
+Rationale: CHG: new flags for greenplanet's mkl library\\
+\vspace{3em}
+
+\noindent \textbf{Change \#32} with diff file ISSM-18335-18336.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/linux64\_murdo\_ampi\\
+Export determination: 6. \\
+Rationale: CHG: testing only one cpu to compile\\
+\vspace{3em}
+
+\noindent \textbf{Change \#33} with diff file ISSM-18336-18337.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/processdata.m\\
+Export determination: 6. \\
+Rationale: BUG: fixed issue when struct is of size >1\\
+\vspace{3em}
+
+\noindent \textbf{Change \#34} with diff file ISSM-18337-18338.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added check on supported stabilization flags\\
+\vspace{3em}
+
+\noindent \textbf{Change \#35} with diff file ISSM-18339-18340.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/matrix/ElementMatrix.cpp M /issm/trunk-jpl/src/c/classes/matrix/ElementMatrix.h\\
+Export determination: 6. \\
+Rationale: CHG: added lumping of element matrix\\
+\vspace{3em}
+
+\noindent \textbf{Change \#36} with diff file ISSM-18340-18341.diff: \\
+Function name: \\
+A /issm/trunk-jpl/externalpackages/boost/install-1.55-pleiades.sh A /issm/trunk-jpl/externalpackages/dakota/configs/5.3.1/CMakeLists.txt.pfe.patch A /issm/trunk-jpl/externalpackages/dakota/install-5.3.1-pleiades.sh D /issm/trunk-jpl/externalpackages/petsc/install-3.4-pleiades-intel2012.0.032-mpt.2.06rp16 A /issm/trunk-jpl/externalpackages/petsc/install-3.4-pleiades-intel2012.0.032-mpt.2.06rp16.sh (from /issm/trunk-jpl/externalpackages/petsc/install-3.4-pleiades-intel2012.0.032-mpt.2.06rp16:18339) A /issm/trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh\\
+Export determination: 6. \\
+Rationale: NEW: add dakota 5.3.1 to pfe\\
+\vspace{3em}
+
+\noindent \textbf{Change \#37} with diff file ISSM-18341-18342.diff: \\
+Function name: \\
+A /issm/trunk-jpl/externalpackages/triangle/configs/triangle-libtool.tar.gz A /issm/trunk-jpl/externalpackages/triangle/install.sh\\
+Export determination: 6. \\
+Rationale: ADD: Created a libtool version of the Triangle install. The goal is to create shared libraries.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#38} with diff file ISSM-18342-18343.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/triangle/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: Modified install.sh to fix small installation issue.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#39} with diff file ISSM-18343-18344.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/triangle/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: Added patching line to install script for triangle header.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#40} with diff file ISSM-18344-18345.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c M /issm/trunk-jpl/src/c/Makefile.am M /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.h M /issm/trunk-jpl/src/c/classes/Constraints/Constraint.h M /issm/trunk-jpl/src/c/classes/Constraints/SpcDynamic.h M /issm/trunk-jpl/src/c/classes/Constraints/SpcStatic.h M /issm/trunk-jpl/src/c/classes/Constraints/SpcTransient.cpp M /issm/trunk-jpl/src/c/classes/Constraints/SpcTransient.h M /issm/trunk-jpl/src/c/classes/matrix/ElementMatrix.cpp M /issm/trunk-jpl/src/c/classes/matrix/ElementMatrix.h M /issm/trunk-jpl/src/c/cores/masstransport\_core.cpp A /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_fct.cpp M /issm/trunk-jpl/src/c/solutionsequences/solutionsequences.h\\
+Export determination: 6. \\
+Rationale: NEW: added Low order scheme of Flux Transport Correction ALgorithm\\
+\vspace{3em}
+
+\noindent \textbf{Change \#41} with diff file ISSM-18345-18346.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.h M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_fct.cpp\\
+Export determination: 6. \\
+Rationale: NEW: added Higher Order Flux correction\\
+\vspace{3em}
+
+\noindent \textbf{Change \#42} with diff file ISSM-18346-18347.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/masstransport.m M /issm/trunk-jpl/src/m/classes/masstransport.py\\
+Export determination: 6. \\
+Rationale: NEW: added FCT correction\\
+\vspace{3em}
+
+\noindent \textbf{Change \#43} with diff file ISSM-18347-18348.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_fct.cpp\\
+Export determination: 6. \\
+Rationale: CHG: finished Zalesak, still one pb with umin and umax\\
+\vspace{3em}
+
+\noindent \textbf{Change \#44} with diff file ISSM-18348-18349.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.h M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/classes/FemModel.h M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_fct.cpp\\
+Export determination: 6. \\
+Rationale: CHG: trying to push to subfunction\\
+\vspace{3em}
+
+\noindent \textbf{Change \#45} with diff file ISSM-18349-18350.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_fct.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added CreateLHS\\
+\vspace{3em}
+
+\noindent \textbf{Change \#46} with diff file ISSM-18350-18351.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_fct.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added CreateRHS\\
+\vspace{3em}
+
+\noindent \textbf{Change \#47} with diff file ISSM-18351-18352.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_fct.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added Richardson subroutine\\
+\vspace{3em}
+
+\noindent \textbf{Change \#48} with diff file ISSM-18353-18354.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_fct.cpp\\
+Export determination: 6. \\
+Rationale: CHG: one more subfunction\\
+\vspace{3em}
+
+\noindent \textbf{Change \#49} with diff file ISSM-18354-18355.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/triangle/configs/triangle-libtool.tar.gz M /issm/trunk-jpl/externalpackages/triangle/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: Modified the install script to handle OSX patching issue and added disable executable option.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#50} with diff file ISSM-18355-18356.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_fct.cpp\\
+Export determination: 6. \\
+Rationale: CHG: trying to reintroduce ulmin ulmax wihtout success\\
+\vspace{3em}
+
+\noindent \textbf{Change \#51} with diff file ISSM-18357-18358.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_fct.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added check on Qminus and Qplus\\
+\vspace{3em}
+
+\noindent \textbf{Change \#52} with diff file ISSM-18358-18359.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp\\
+Export determination: 6. \\
+Rationale: BUG: put min and max on Gset and not on Sidss\\
+\vspace{3em}
+
+\noindent \textbf{Change \#53} with diff file ISSM-18359-18360.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64-snowleopard.sh\\
+Export determination: 6. \\
+Rationale: CHG: add fortran to mac build\\
+\vspace{3em}
+
+\noindent \textbf{Change \#54} with diff file ISSM-18360-18361.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp\\
+Export determination: 6. \\
+Rationale: CHG: fixed wrong enum\\
+\vspace{3em}
+
+\noindent \textbf{Change \#55} with diff file ISSM-18361-18362.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_fct.cpp\\
+Export determination: 6. \\
+Rationale: CHG: fixed Ulmin Ulmax, still diffusing\\
+\vspace{3em}
+
+\noindent \textbf{Change \#56} with diff file ISSM-18362-18363.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_fct.cpp\\
+Export determination: 6. \\
+Rationale: CHG: moved \_HAVE\_PETSC\_ upper\\
+\vspace{3em}
+
+\noindent \textbf{Change \#57} with diff file ISSM-18363-18364.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.h M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/classes/FemModel.h M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_fct.cpp\\
+Export determination: 6. \\
+Rationale: CHG: do not update results, use ug to get local min and max instead of inputs\\
+\vspace{3em}
+
+\noindent \textbf{Change \#58} with diff file ISSM-18364-18365.diff: \\
+Function name: \\
+A /issm/trunk-jpl/test/Exp/SquareOne.exp\\
+Export determination: 6. \\
+Rationale: NEW: added SquareOne.exp square 1x1\\
+\vspace{3em}
+
+\noindent \textbf{Change \#59} with diff file ISSM-18365-18366.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_fct.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed parallelization issue with dmax\\
+\vspace{3em}
+
+\noindent \textbf{Change \#60} with diff file ISSM-18366-18367.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/classes/clusters/generic\_static.m\\
+Export determination: 6. \\
+Rationale: NEW: added generic\_static.m for static builds\\
+\vspace{3em}
+
+\noindent \textbf{Change \#61} with diff file ISSM-18367-18368.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_fct.cpp\\
+Export determination: 6. \\
+Rationale: CHG: reactivating local extrema\\
+\vspace{3em}
+
+\noindent \textbf{Change \#62} with diff file ISSM-18368-18369.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/clusters/generic\_static.m M /issm/trunk-jpl/src/m/solve/waitonlock.m\\
+Export determination: 6. \\
+Rationale: BUG: fixed some stuff\\
+\vspace{3em}
+
+\noindent \textbf{Change \#63} with diff file ISSM-18369-18370.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/classes/FemModel.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed H-Hobs cost function for balancethickness2\\
+\vspace{3em}
+
+\noindent \textbf{Change \#64} with diff file ISSM-18370-18371.diff: \\
+Function name: \\
+M /issm/trunk-jpl/configure.ac M /issm/trunk-jpl/src/c/Makefile.am\\
+Export determination: 6. \\
+Rationale: CHG: Removed old Fortran and CC flags in configure.ac. Also changed conditional link of libraries relating to standalone build and triangle.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#65} with diff file ISSM-18371-18372.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex\\
+Export determination: 6. \\
+Rationale: CHG:testing new cost function\\
+\vspace{3em}
+
+\noindent \textbf{Change \#66} with diff file ISSM-18372-18373.diff: \\
+Function name: \\
+M /issm/trunk-jpl/configure.ac\\
+Export determination: 6. \\
+Rationale: CHG: jenkins fails without AC\_F77\_LIBRARY\_LDFLAGS\\
+\vspace{3em}
+
+\noindent \textbf{Change \#67} with diff file ISSM-18373-18374.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/issm\_options.m4\\
+Export determination: 6. \\
+Rationale: CHG: added some info about the OS\\
+\vspace{3em}
+
+\noindent \textbf{Change \#68} with diff file ISSM-18374-18375.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/wrappers/IssmConfig/IssmConfig.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added some info about the OS\\
+\vspace{3em}
+
+\noindent \textbf{Change \#69} with diff file ISSM-18375-18376.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/dev/issmversion.m\\
+Export determination: 6. \\
+Rationale: CHG: added some info about the OS\\
+\vspace{3em}
+
+\noindent \textbf{Change \#70} with diff file ISSM-18376-18377.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-linux64.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh\\
+Export determination: 6. \\
+Rationale: CHG: no need for X support\\
+\vspace{3em}
+
+\noindent \textbf{Change \#71} with diff file ISSM-18377-18378.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/vim/addons/vim/syntax/c.vim M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py D /issm/trunk-jpl/src/m/enum/QmuBaseEnum.m D /issm/trunk-jpl/src/m/enum/QmuDamageDEnum.m D /issm/trunk-jpl/src/m/enum/QmuMaskGroundediceLevelsetEnum.m D /issm/trunk-jpl/src/m/enum/QmuMaskIceLevelsetEnum.m D /issm/trunk-jpl/src/m/enum/QmuMaterialsRheologyBEnum.m D /issm/trunk-jpl/src/m/enum/QmuMeltingEnum.m D /issm/trunk-jpl/src/m/enum/QmuPressureEnum.m D /issm/trunk-jpl/src/m/enum/QmuSurfaceEnum.m D /issm/trunk-jpl/src/m/enum/QmuTemperatureEnum.m D /issm/trunk-jpl/src/m/enum/QmuThicknessEnum.m D /issm/trunk-jpl/src/m/enum/QmuVxEnum.m D /issm/trunk-jpl/src/m/enum/QmuVxMeshEnum.m D /issm/trunk-jpl/src/m/enum/QmuVyEnum.m D /issm/trunk-jpl/src/m/enum/QmuVyMeshEnum.m D /issm/trunk-jpl/src/m/enum/QmuVzEnum.m D /issm/trunk-jpl/src/m/enum/QmuVzMeshEnum.m A /issm/trunk-jpl/src/m/enum/StressEnum.m A /issm/trunk-jpl/src/m/enum/StressxxEnum.m A /issm/trunk-jpl/src/m/enum/StressxyEnum.m A /issm/trunk-jpl/src/m/enum/StressxzEnum.m A /issm/trunk-jpl/src/m/enum/StressyyEnum.m A /issm/trunk-jpl/src/m/enum/StressyzEnum.m A /issm/trunk-jpl/src/m/enum/StresszzEnum.m\\
+Export determination: 6. \\
+Rationale: CHG: added some Enums for Sylvestre (Stress related)\\
+\vspace{3em}
+
+\noindent \textbf{Change \#72} with diff file ISSM-18378-18379.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/model.m\\
+Export determination: 6. \\
+Rationale: CHG: fixed some issues related to melting\_rates with old models\\
+\vspace{3em}
+
+\noindent \textbf{Change \#73} with diff file ISSM-18379-18380.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/bamg/gmsh3d.m\\
+Export determination: 6. \\
+Rationale: CHG: silent gmsh\\
+\vspace{3em}
+
+\noindent \textbf{Change \#74} with diff file ISSM-18380-18381.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/exp/masktoexp.m\\
+Export determination: 6. \\
+Rationale: CHG: added check that there is at least one contour\\
+\vspace{3em}
+
+\noindent \textbf{Change \#75} with diff file ISSM-18381-18382.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/miscellaneous/colinearity.m M /issm/trunk-jpl/src/m/miscellaneous/vorticity.m\\
+Export determination: 6. \\
+Rationale: NEW: some functions for Jerome\\
+\vspace{3em}
+
+\noindent \textbf{Change \#76} with diff file ISSM-18382-18383.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/gslib/gslib.m\\
+Export determination: 6. \\
+Rationale: CHG: more flexible call to gslib\\
+\vspace{3em}
+
+\noindent \textbf{Change \#77} with diff file ISSM-18383-18384.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py D /issm/trunk-jpl/src/m/enum/StressEnum.m D /issm/trunk-jpl/src/m/enum/StressxxEnum.m D /issm/trunk-jpl/src/m/enum/StressxyEnum.m D /issm/trunk-jpl/src/m/enum/StressxzEnum.m D /issm/trunk-jpl/src/m/enum/StressyyEnum.m D /issm/trunk-jpl/src/m/enum/StressyzEnum.m D /issm/trunk-jpl/src/m/enum/StresszzEnum.m\\
+Export determination: 6. \\
+Rationale: DEL: duplicate enums\\
+\vspace{3em}
+
+\noindent \textbf{Change \#78} with diff file ISSM-18384-18385.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/vim/addons/vim/syntax/c.vim\\
+Export determination: 6. \\
+Rationale: NEW: Syncing Enums\\
+\vspace{3em}
+
+\noindent \textbf{Change \#79} with diff file ISSM-18385-18386.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.h M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/StressMaxPrincipalEnum.m\\
+Export determination: 6. \\
+Rationale: NEW: added maximum stress eigen value\\
+\vspace{3em}
+
+\noindent \textbf{Change \#80} with diff file ISSM-18386-18387.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/shared/Numerics/numerics.h\\
+Export determination: 6. \\
+Rationale: BUG: fixing automatic differenciation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#81} with diff file ISSM-18387-18388.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/imac-012301-gil\\
+Export determination: 6. \\
+Rationale: CHG: reverting back to 3.5 because of gfortran linking error\\
+\vspace{3em}
+
+\noindent \textbf{Change \#82} with diff file ISSM-18388-18389.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Constraints/Constraint.h M /issm/trunk-jpl/src/c/classes/Constraints/Constraints.cpp M /issm/trunk-jpl/src/c/classes/Constraints/Constraints.h M /issm/trunk-jpl/src/c/classes/Constraints/SpcDynamic.cpp M /issm/trunk-jpl/src/c/classes/Constraints/SpcDynamic.h M /issm/trunk-jpl/src/c/classes/Constraints/SpcStatic.cpp M /issm/trunk-jpl/src/c/classes/Constraints/SpcStatic.h M /issm/trunk-jpl/src/c/classes/Constraints/SpcTransient.cpp M /issm/trunk-jpl/src/c/classes/Constraints/SpcTransient.h\\
+Export determination: 6. \\
+Rationale: NEW: extended penlaty method to all Spc classes\\
+\vspace{3em}
+
+\noindent \textbf{Change \#83} with diff file ISSM-18389-18390.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: force penlatis if stabilization = 4 FCT\\
+\vspace{3em}
+
+\noindent \textbf{Change \#84} with diff file ISSM-18390-18391.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h M /issm/trunk-jpl/src/c/classes/FemModel.cpp\\
+Export determination: 6. \\
+Rationale: CHG: implementing new cost functions and gradient for balancethickness2\\
+\vspace{3em}
+
+\noindent \textbf{Change \#85} with diff file ISSM-18391-18392.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp\\
+Export determination: 6. \\
+Rationale: BUG: forgot IsInput\\
+\vspace{3em}
+
+\noindent \textbf{Change \#86} with diff file ISSM-18392-18393.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64.sh M /issm/trunk-jpl/externalpackages/mpich/install-3.0-macosx64.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh M /issm/trunk-jpl/packagers/macosx/package.sh\\
+Export determination: 6. \\
+Rationale: CHG: Updated OSX packager script.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#87} with diff file ISSM-18393-18394.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/classes/FemModel.cpp\\
+Export determination: 6. \\
+Rationale: NEW: added dJ/dnux for the velocities\\
+\vspace{3em}
+
+\noindent \textbf{Change \#88} with diff file ISSM-18394-18395.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: no need to add printarray:\\
+\vspace{3em}
+
+\noindent \textbf{Change \#89} with diff file ISSM-18395-18396.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/dakota/install-5.3.1-macosx64.sh M /issm/trunk-jpl/externalpackages/mpich/install-3.0-macosx64.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh\\
+Export determination: 6. \\
+Rationale: CHG: Undid accidental modifcations to install scripts Dakota, Petsc and MPICH.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#90} with diff file ISSM-18396-18397.diff: \\
+Function name: \\
+D /issm/trunk-jpl/packagers/macosx/ISSM.app D /issm/trunk-jpl/packagers/macosx/ISSM.appscript D /issm/trunk-jpl/packagers/macosx/ISSM.pmdoc D /issm/trunk-jpl/packagers/macosx/README D /issm/trunk-jpl/packagers/macosx/issm.icns D /issm/trunk-jpl/packagers/macosx/matlabissm D /issm/trunk-jpl/packagers/macosx/package\_incomplete.sh D /issm/trunk-jpl/packagers/macosx/startup.m\\
+Export determination: 6. \\
+Rationale: DEL: removed useless files\\
+\vspace{3em}
+
+\noindent \textbf{Change \#91} with diff file ISSM-18397-18398.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/runme.m\\
+Export determination: 6. \\
+Rationale: CHG: do not call issmdir so that it works for ISSM's binaries, which do not have issmdir\\
+\vspace{3em}
+
+\noindent \textbf{Change \#92} with diff file ISSM-18398-18399.diff: \\
+Function name: \\
+M /issm/trunk-jpl/configure.ac M /issm/trunk-jpl/jenkins/imac-012301-gil M /issm/trunk-jpl/jenkins/jenkins.sh\\
+Export determination: 6. \\
+Rationale: CHG: simplifying jenkins script and removed some AC macros to see if it works\\
+\vspace{3em}
+
+\noindent \textbf{Change \#93} with diff file ISSM-18399-18400.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/execute\_shell D /issm/trunk-jpl/jenkins/linux64\_larsen M /issm/trunk-jpl/jenkins/linux64\_murdo M /issm/trunk-jpl/jenkins/linux64\_murdo\_ad M /issm/trunk-jpl/jenkins/linux64\_murdo\_ampi M /issm/trunk-jpl/jenkins/windows\\
+Export determination: 6. \\
+Rationale: CHG: simplifying jenkins config\\
+\vspace{3em}
+
+\noindent \textbf{Change \#94} with diff file ISSM-18400-18401.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed issue with deviatoric stress output in 3d\\
+\vspace{3em}
+
+\noindent \textbf{Change \#95} with diff file ISSM-18401-18402.diff: \\
+Function name: \\
+M /issm/trunk-jpl/configure.ac M /issm/trunk-jpl/jenkins/linux64\_murdo\_ampi\\
+Export determination: 6. \\
+Rationale: CHG: final adjustements\\
+\vspace{3em}
+
+\noindent \textbf{Change \#96} with diff file ISSM-18402-18403.diff: \\
+Function name: \\
+A /issm/trunk-jpl/externalpackages/mpich/install-3.0-macosx64-static.sh A /issm/trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh\\
+Export determination: 6. \\
+Rationale: ADD: Install scripts for MPICH and PETSc for static OSX64 build.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#97} with diff file ISSM-18403-18404.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h M /issm/trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/classes/FemModel.h M /issm/trunk-jpl/src/c/cores/controlvalidation\_core.cpp M /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/classes/balancethickness2.m M /issm/trunk-jpl/src/m/classes/inversion.m M /issm/trunk-jpl/src/m/classes/inversionvalidation.m A /issm/trunk-jpl/src/m/enum/BalancethicknessNuEnum.m D /issm/trunk-jpl/src/m/enum/BalancethicknessNuxEnum.m D /issm/trunk-jpl/src/m/enum/BalancethicknessNuyEnum.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/IrrotationalAcrossGradientNuEnum.m A /issm/trunk-jpl/src/m/enum/IrrotationalAlongGradientNuEnum.m A /issm/trunk-jpl/src/m/enum/IrrotationalDirectionMisfitEnum.m A /issm/trunk-jpl/src/m/enum/IrrotationalH2MisfitEnum.m A /issm/trunk-jpl/src/m/enum/IrrotationalVelMisfitEnum.m\\
+Export determination: 6. \\
+Rationale: CHG: simplified balancethickness2 to nu (got rid of nux,nuy) and separating cost functions\\
+\vspace{3em}
+
+\noindent \textbf{Change \#98} with diff file ISSM-18404-18405.diff: \\
+Function name: \\
+A /issm/trunk-jpl/configs/config-macosx64-static.sh A /issm/trunk-jpl/packagers/macosx/install.sh\\
+Export determination: 6. \\
+Rationale: ADD: install script for OSX and static macosx64 configure script.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#99} with diff file ISSM-18405-18406.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/inversion.m M /issm/trunk-jpl/src/m/classes/m1qn3inversion.m\\
+Export determination: 6. \\
+Rationale: CHG: added new cost fonctions to other inversion classes\\
+\vspace{3em}
+
+\noindent \textbf{Change \#100} with diff file ISSM-18406-18407.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/mpich/install-3.0-macosx64-static.sh M /issm/trunk-jpl/packagers/macosx/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: Fixed issue with new MPICH static install script and modified OSX64 install script.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#101} with diff file ISSM-18407-18408.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: Removed \$1 from petsc install.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#102} with diff file ISSM-18408-18409.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: Added logic to catch build errors.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#103} with diff file ISSM-18409-18410.diff: \\
+Function name: \\
+M /issm/trunk-jpl/configs/config-macosx64-static.sh M /issm/trunk-jpl/packagers/macosx/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: Fixed a bug in install script regarding Matlab install directory. Removed some comments from OSX64 static config script.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#104} with diff file ISSM-18410-18411.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: minor\\
+\vspace{3em}
+
+\noindent \textbf{Change \#105} with diff file ISSM-18411-18412.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: better installation script\\
+\vspace{3em}
+
+\noindent \textbf{Change \#106} with diff file ISSM-18412-18413.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: minor\\
+\vspace{3em}
+
+\noindent \textbf{Change \#107} with diff file ISSM-18413-18414.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: fixed matlab\_dir\\
+\vspace{3em}
+
+\noindent \textbf{Change \#108} with diff file ISSM-18414-18415.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: added blas lapack\\
+\vspace{3em}
+
+\noindent \textbf{Change \#109} with diff file ISSM-18415-18416.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh M /issm/trunk-jpl/packagers/macosx/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: removed blas lapack\\
+\vspace{3em}
+
+\noindent \textbf{Change \#110} with diff file ISSM-18416-18417.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: testing\\
+\vspace{3em}
+
+\noindent \textbf{Change \#111} with diff file ISSM-18417-18418.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh\\
+Export determination: 6. \\
+Rationale: CHG: reverting back\\
+\vspace{3em}
+
+\noindent \textbf{Change \#112} with diff file ISSM-18418-18419.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: testing\\
+\vspace{3em}
+
+\noindent \textbf{Change \#113} with diff file ISSM-18419-18420.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh\\
+Export determination: 6. \\
+Rationale: CHG: retesting:\\
+\vspace{3em}
+
+\noindent \textbf{Change \#114} with diff file ISSM-18420-18421.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: source environment first\\
+\vspace{3em}
+
+\noindent \textbf{Change \#115} with diff file ISSM-18421-18422.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: minor bug: missing /\\
+\vspace{3em}
+
+\noindent \textbf{Change \#116} with diff file ISSM-18422-18423.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: last chance\\
+\vspace{3em}
+
+\noindent \textbf{Change \#117} with diff file ISSM-18423-18424.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh M /issm/trunk-jpl/packagers/macosx/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: do not know why we need lapack...\\
+\vspace{3em}
+
+\noindent \textbf{Change \#118} with diff file ISSM-18424-18425.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/package.sh\\
+Export determination: 6. \\
+Rationale: CHG: trying new package script\\
+\vspace{3em}
+
+\noindent \textbf{Change \#119} with diff file ISSM-18425-18426.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/install.sh M /issm/trunk-jpl/packagers/macosx/package.sh\\
+Export determination: 6. \\
+Rationale: CHG: testing\\
+\vspace{3em}
+
+\noindent \textbf{Change \#120} with diff file ISSM-18426-18427.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/package.sh\\
+Export determination: 6. \\
+Rationale: CHG: testing\\
+\vspace{3em}
+
+\noindent \textbf{Change \#121} with diff file ISSM-18427-18428.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/package.sh\\
+Export determination: 6. \\
+Rationale: CHG: testing\\
+\vspace{3em}
+
+\noindent \textbf{Change \#122} with diff file ISSM-18428-18429.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: minor\\
+\vspace{3em}
+
+\noindent \textbf{Change \#123} with diff file ISSM-18429-18430.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/install.sh M /issm/trunk-jpl/packagers/macosx/package.sh\\
+Export determination: 6. \\
+Rationale: CHG: test101 should test actual package\\
+\vspace{3em}
+
+\noindent \textbf{Change \#124} with diff file ISSM-18430-18431.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: co compile\\
+\vspace{3em}
+
+\noindent \textbf{Change \#125} with diff file ISSM-18431-18432.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/package.sh\\
+Export determination: 6. \\
+Rationale: CHG: minor, done with mac package :)\\
+\vspace{3em}
+
+\noindent \textbf{Change \#126} with diff file ISSM-18432-18433.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/package.sh\\
+Export determination: 6. \\
+Rationale: NEW: added shipping of tarbal\\
+\vspace{3em}
+
+\noindent \textbf{Change \#127} with diff file ISSM-18433-18434.diff: \\
+Function name: \\
+A /issm/trunk-jpl/examples/README.txt\\
+Export determination: 6. \\
+Rationale: NEW: add readme file for data download\\
+\vspace{3em}
+
+\noindent \textbf{Change \#128} with diff file ISSM-18434-18435.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/contrib/gravity A /issm/trunk-jpl/src/m/contrib/gravity/Makefile A /issm/trunk-jpl/src/m/contrib/gravity/vfsa.cpp\\
+Export determination: 6. \\
+Rationale: NEW: added vfsa code from atsu\\
+\vspace{3em}
+
+\noindent \textbf{Change \#129} with diff file ISSM-18435-18436.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/gravity/vfsa.cpp\\
+Export determination: 6. \\
+Rationale: MODIF: generation of the new matrix\\
+\vspace{3em}
+
+\noindent \textbf{Change \#130} with diff file ISSM-18436-18437.diff: \\
+Function name: \\
+D /issm/trunk-jpl/packagers/ubuntu/README A /issm/trunk-jpl/packagers/ubuntu/install.sh D /issm/trunk-jpl/packagers/ubuntu/issmpkg M /issm/trunk-jpl/packagers/ubuntu/package.sh D /issm/trunk-jpl/packagers/ubuntu/startup.m\\
+Export determination: 6. \\
+Rationale: NEW: trying static compile on ubuntu\\
+\vspace{3em}
+
+\noindent \textbf{Change \#131} with diff file ISSM-18437-18438.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh A /issm/trunk-jpl/externalpackages/petsc/install-3.5-linux64-static.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-linux64.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh\\
+Export determination: 6. \\
+Rationale: NEW: trying static compile on ubuntu\\
+\vspace{3em}
+
+\noindent \textbf{Change \#132} with diff file ISSM-18438-18439.diff: \\
+Function name: \\
+A /issm/trunk-jpl/externalpackages/mpich/install-3.0-linux64-static.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-linux64-static.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh M /issm/trunk-jpl/packagers/ubuntu/install.sh\\
+Export determination: 6. \\
+Rationale: NEW: adde static compilation for mpich linux64\\
+\vspace{3em}
+
+\noindent \textbf{Change \#133} with diff file ISSM-18439-18440.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/gravity/vfsa.cpp\\
+Export determination: 6. \\
+Rationale: MODIF: version OK\\
+\vspace{3em}
+
+\noindent \textbf{Change \#134} with diff file ISSM-18440-18441.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/ubuntu/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: wrong matlab dir\\
+\vspace{3em}
+
+\noindent \textbf{Change \#135} with diff file ISSM-18441-18442.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/mpich/install-3.0-linux64-static.sh\\
+Export determination: 6. \\
+Rationale: CHG: minor\\
+\vspace{3em}
+
+\noindent \textbf{Change \#136} with diff file ISSM-18442-18443.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/ubuntu/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: mpich now installed independently\\
+\vspace{3em}
+
+\noindent \textbf{Change \#137} with diff file ISSM-18443-18444.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/mpich/install-3.0-linux64-static.sh\\
+Export determination: 6. \\
+Rationale: CHG: testing with enable-shared to avoid fPIC error while copmiling ISSM\\
+\vspace{3em}
+
+\noindent \textbf{Change \#138} with diff file ISSM-18444-18445.diff: \\
+Function name: \\
+D /issm/trunk-jpl/externalpackages/mpich/install-3.0-linux64-static.sh M /issm/trunk-jpl/packagers/ubuntu/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: no need for static script\\
+\vspace{3em}
+
+\noindent \textbf{Change \#139} with diff file ISSM-18445-18446.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/package.sh M /issm/trunk-jpl/packagers/ubuntu/package.sh\\
+Export determination: 6. \\
+Rationale: CHG: added shipping\\
+\vspace{3em}
+
+\noindent \textbf{Change \#140} with diff file ISSM-18446-18447.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/gravity/vfsa.cpp\\
+Export determination: 6. \\
+Rationale: MODIF: final version not tested\\
+\vspace{3em}
+
+\noindent \textbf{Change \#141} with diff file ISSM-18447-18448.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/parsing\_rules\\
+Export determination: 6. \\
+Rationale: CHG: added parsing rule\\
+\vspace{3em}
+
+\noindent \textbf{Change \#142} with diff file ISSM-18448-18449.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/package.sh\\
+Export determination: 6. \\
+Rationale: CHG: added shiping in script\\
+\vspace{3em}
+
+\noindent \textbf{Change \#143} with diff file ISSM-18449-18450.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/package.sh\\
+Export determination: 6. \\
+Rationale: CHG: typo\\
+\vspace{3em}
+
+\noindent \textbf{Change \#144} with diff file ISSM-18450-18451.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.h M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/Penta.h M /issm/trunk-jpl/src/c/classes/Elements/Seg.h M /issm/trunk-jpl/src/c/classes/Elements/Tetra.h M /issm/trunk-jpl/src/c/classes/Elements/Tria.h M /issm/trunk-jpl/src/c/classes/Inputs/BoolInput.cpp M /issm/trunk-jpl/src/c/classes/Inputs/BoolInput.h M /issm/trunk-jpl/src/c/classes/Inputs/ControlInput.cpp M /issm/trunk-jpl/src/c/classes/Inputs/ControlInput.h M /issm/trunk-jpl/src/c/classes/Inputs/DatasetInput.h M /issm/trunk-jpl/src/c/classes/Inputs/DoubleInput.h M /issm/trunk-jpl/src/c/classes/Inputs/Input.h M /issm/trunk-jpl/src/c/classes/Inputs/IntInput.h M /issm/trunk-jpl/src/c/classes/Inputs/PentaInput.cpp M /issm/trunk-jpl/src/c/classes/Inputs/PentaInput.h M /issm/trunk-jpl/src/c/classes/Inputs/SegInput.h M /issm/trunk-jpl/src/c/classes/Inputs/TetraInput.h M /issm/trunk-jpl/src/c/classes/Inputs/TransientInput.cpp M /issm/trunk-jpl/src/c/classes/Inputs/TransientInput.h M /issm/trunk-jpl/src/c/classes/Inputs/TriaInput.h M /issm/trunk-jpl/src/c/cores/extrudefrombase\_core.cpp M /issm/trunk-jpl/src/c/modules/InputExtrudex/InputExtrudex.cpp M /issm/trunk-jpl/src/c/modules/InputExtrudex/InputExtrudex.h\\
+Export determination: 6. \\
+Rationale: NEW: can now extrude from base or from top\\
+\vspace{3em}
+
+\noindent \textbf{Change \#145} with diff file ISSM-18451-18452.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/linux64\_murdo\\
+Export determination: 6. \\
+Rationale: CHG: minor\\
+\vspace{3em}
+
+\noindent \textbf{Change \#146} with diff file ISSM-18452-18453.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added missing blank space\\
+\vspace{3em}
+
+\noindent \textbf{Change \#147} with diff file ISSM-18453-18454.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/bamg/Mesh.cpp M /issm/trunk-jpl/src/c/modules/InterpFromMeshToMesh2dx/InterpFromMeshToMesh2dx.cpp M /issm/trunk-jpl/src/wrappers/InterpFromMeshToMesh2d/InterpFromMeshToMesh2d.cpp M /issm/trunk-jpl/src/wrappers/python/io/WritePythonData.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed memory leak in bamg and in InterpFromMeshToMesh2d, python needs to make a COPY of the data in WriteData just like matlab otherwise we cannot delete the data after the WriteData call and matlab leaks\\
+\vspace{3em}
+
+\noindent \textbf{Change \#148} with diff file ISSM-18454-18455.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/gravity/vfsa.cpp\\
+Export determination: 6. \\
+Rationale: MODIF: final version of the code, untested.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#149} with diff file ISSM-18455-18456.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/bamg/BamgMesh.cpp M /issm/trunk-jpl/src/c/bamg/BamgMesh.h M /issm/trunk-jpl/src/c/bamg/BamgVertex.cpp M /issm/trunk-jpl/src/c/bamg/BamgVertex.h M /issm/trunk-jpl/src/c/bamg/Mesh.cpp M /issm/trunk-jpl/src/m/classes/bamgmesh.m\\
+Export determination: 6. \\
+Rationale: CHG: added previous numbering when remeshing\\
+\vspace{3em}
+
+\noindent \textbf{Change \#150} with diff file ISSM-18456-18457.diff: \\
+Function name: \\
+D /issm/trunk-jpl/AUTHORS M /issm/trunk-jpl/README\\
+Export determination: 6. \\
+Rationale: CHG: not needed anymore, only keep list of Authors in website\\
+\vspace{3em}
+
+\noindent \textbf{Change \#151} with diff file ISSM-18457-18458.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/gravity/vfsa.cpp\\
+Export determination: 6. \\
+Rationale: MODIF:final version of atsu cpy multithread\\
+\vspace{3em}
+
+\noindent \textbf{Change \#152} with diff file ISSM-18458-18459.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/package.sh\\
+Export determination: 6. \\
+Rationale: CHG: no need to ship the package twice\\
+\vspace{3em}
+
+\noindent \textbf{Change \#153} with diff file ISSM-18459-18460.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test211.m M /issm/trunk-jpl/test/NightlyRun/test211.py\\
+Export determination: 6. \\
+Rationale: CHG: relaxed tolerances\\
+\vspace{3em}
+
+\noindent \textbf{Change \#154} with diff file ISSM-18460-18461.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/coordsystems/ll2utm.m M /issm/trunk-jpl/src/m/coordsystems/utm2ll.m\\
+Export determination: 6. \\
+Rationale: CHG: new utm to lat long routines\\
+\vspace{3em}
+
+\noindent \textbf{Change \#155} with diff file ISSM-18461-18462.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/gravity/vfsa.cpp\\
+Export determination: 6. \\
+Rationale: MODIF: details\\
+\vspace{3em}
+
+\noindent \textbf{Change \#156} with diff file ISSM-18462-18463.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/contrib/gravity/vfsa\_mpi.cpp\\
+Export determination: 6. \\
+Rationale: NEW: vfsa parallelized\\
+\vspace{3em}
+
+\noindent \textbf{Change \#157} with diff file ISSM-18463-18464.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/wrappers/matlab/Makefile.am\\
+Export determination: 6. \\
+Rationale: BUG: on mac OS X matlab error messages tend to crash because of a library pb related to FORTRAN. removing FORTRAN from Makefile.am seems to fix this bug... to be continued\\
+\vspace{3em}
+
+\noindent \textbf{Change \#158} with diff file ISSM-18464-18465.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/gravity/Makefile\\
+Export determination: 6. \\
+Rationale: CHG: new makefile\\
+\vspace{3em}
+
+\noindent \textbf{Change \#159} with diff file ISSM-18465-18466.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/gravity/vfsa.cpp M /issm/trunk-jpl/src/m/contrib/gravity/vfsa\_mpi.cpp\\
+Export determination: 6. \\
+Rationale: MODIF: correction\\
+\vspace{3em}
+
+\noindent \textbf{Change \#160} with diff file ISSM-18466-18467.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/gravity/vfsa\_mpi.cpp\\
+Export determination: 6. \\
+Rationale: MODIF: correction\\
+\vspace{3em}
+
+\noindent \textbf{Change \#161} with diff file ISSM-18467-18468.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/wrappers/matlab/Makefile.am\\
+Export determination: 6. \\
+Rationale: BUG: added \$(FORTRANLIB) back for linux. The fix for macs is to NOT provide --with-fortran-lib\\
+\vspace{3em}
+
+\noindent \textbf{Change \#162} with diff file ISSM-18468-18469.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/gravity/vfsa\_mpi.cpp\\
+Export determination: 6. \\
+Rationale: MODIF: amelioration\\
+\vspace{3em}
+
+\noindent \textbf{Change \#163} with diff file ISSM-18469-18470.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/gravity/vfsa\_mpi.cpp\\
+Export determination: 6. \\
+Rationale: MODIF: leak bug fixed\\
+\vspace{3em}
+
+\noindent \textbf{Change \#164} with diff file ISSM-18470-18471.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/Node.cpp M /issm/trunk-jpl/src/c/cores/damage\_core.cpp\\
+Export determination: 6. \\
+Rationale: NEW: Added damage evolution in 3d\\
+\vspace{3em}
+
+\noindent \textbf{Change \#165} with diff file ISSM-18471-18472.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/organizer.py\\
+Export determination: 6. \\
+Rationale: MINOR: enable to save models in python using a specific name\\
+\vspace{3em}
+
+\noindent \textbf{Change \#166} with diff file ISSM-18472-18473.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Inputs/PentaInput.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed wrong indexing in input Extrusion\\
+\vspace{3em}
+
+\noindent \textbf{Change \#167} with diff file ISSM-18473-18474.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/gravity/vfsa.cpp M /issm/trunk-jpl/src/m/contrib/gravity/vfsa\_mpi.cpp\\
+Export determination: 6. \\
+Rationale: MODIF: vfsa that works\\
+\vspace{3em}
+
+\noindent \textbf{Change \#168} with diff file ISSM-18474-18475.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h M /issm/trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/PentaRef.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/Elements/TriaRef.cpp M /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp\\
+Export determination: 6. \\
+Rationale: NEW: starting to implement LACR\\
+\vspace{3em}
+
+\noindent \textbf{Change \#169} with diff file ISSM-18475-18476.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/flowequation.m M /issm/trunk-jpl/test/Archives/Archive701.nc M /issm/trunk-jpl/test/NightlyRun/test701.m\\
+Export determination: 6. \\
+Rationale: NEW: archive for LACR\\
+\vspace{3em}
+
+\noindent \textbf{Change \#170} with diff file ISSM-18476-18477.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h M /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.h M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/classes/FemModel.h M /issm/trunk-jpl/src/c/cores/balancethickness2\_core.cpp M /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/dox/issm.dox D /issm/trunk-jpl/src/m/classes/balancethickness2.m M /issm/trunk-jpl/src/m/classes/inversion.m M /issm/trunk-jpl/src/m/classes/inversionvalidation.m M /issm/trunk-jpl/src/m/classes/m1qn3inversion.m A /issm/trunk-jpl/src/m/enum/BalancethicknessDiffusionCoefficientEnum.m D /issm/trunk-jpl/src/m/enum/BalancethicknessNuEnum.m D /issm/trunk-jpl/src/m/enum/BalancethicknessThicknessObsEnum.m D /issm/trunk-jpl/src/m/enum/BalancethicknessVxObsEnum.m D /issm/trunk-jpl/src/m/enum/BalancethicknessVyObsEnum.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py D /issm/trunk-jpl/src/m/enum/IrrotationalAcrossGradientNuEnum.m D /issm/trunk-jpl/src/m/enum/IrrotationalAlongGradientNuEnum.m D /issm/trunk-jpl/src/m/enum/IrrotationalDirectionMisfitEnum.m D /issm/trunk-jpl/src/m/enum/IrrotationalH2MisfitEnum.m D /issm/trunk-jpl/src/m/enum/IrrotationalVelMisfitEnum.m A /issm/trunk-jpl/src/m/enum/LACrouzeixRaviartEnum.m\\
+Export determination: 6. \\
+Rationale: CHG: removed irrotational balancethickness2, working on SIA model\\
+\vspace{3em}
+
+\noindent \textbf{Change \#171} with diff file ISSM-18477-18478.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/issm\_options.m4\\
+Export determination: 6. \\
+Rationale: CHG: fixed problem for matlab v2014+\\
+\vspace{3em}
+
+\noindent \textbf{Change \#172} with diff file ISSM-18478-18479.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/coordsystems/ll2utm.m M /issm/trunk-jpl/src/m/coordsystems/utm2ll.m\\
+Export determination: 6. \\
+Rationale: CHG: new version after my suggestion to the author\\
+\vspace{3em}
+
+\noindent \textbf{Change \#173} with diff file ISSM-18479-18480.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/gravity/vfsa\_mpi.cpp\\
+Export determination: 6. \\
+Rationale: CHG: final version parallelized code\\
+\vspace{3em}
+
+\noindent \textbf{Change \#174} with diff file ISSM-18480-18481.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/model.m\\
+Export determination: 6. \\
+Rationale: CHG: cover case bed=NaN\\
+\vspace{3em}
+
+\noindent \textbf{Change \#175} with diff file ISSM-18481-18482.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/qmu/plot/plot\_hist\_norm.m\\
+Export determination: 6. \\
+Rationale: NEW: add stairs option\\
+\vspace{3em}
+
+\noindent \textbf{Change \#176} with diff file ISSM-18482-18483.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/frictionweertman.m\\
+Export determination: 6. \\
+Rationale: BUG: friction weertman in matlab\\
+\vspace{3em}
+
+\noindent \textbf{Change \#177} with diff file ISSM-18483-18484.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed some == instead of simple = in if statements\\
+\vspace{3em}
+
+\noindent \textbf{Change \#178} with diff file ISSM-18484-18485.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp M /issm/trunk-jpl/test/Archives/Archive120.nc M /issm/trunk-jpl/test/Archives/Archive121.nc M /issm/trunk-jpl/test/Archives/Archive122.nc M /issm/trunk-jpl/test/Archives/Archive325.nc M /issm/trunk-jpl/test/Archives/Archive326.nc M /issm/trunk-jpl/test/Archives/Archive327.nc M /issm/trunk-jpl/test/Archives/Archive431.nc M /issm/trunk-jpl/test/Archives/Archive432.nc M /issm/trunk-jpl/test/Archives/Archive803.nc M /issm/trunk-jpl/test/Archives/Archive805.nc\\
+Export determination: 6. \\
+Rationale: CHG: Use absolute values for artificial diffusion, as negative entries in diffusion matrix might lead to destabilizing contraction effect. Constrain watercolumn to nonnegative values only.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#179} with diff file ISSM-18485-18486.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/AnalysisConfiguration.cpp\\
+Export determination: 6. \\
+Rationale: BUG: do not add uzawa by default\\
+\vspace{3em}
+
+\noindent \textbf{Change \#180} with diff file ISSM-18486-18487.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/bamg/Mesh.cpp\\
+Export determination: 6. \\
+Rationale: NEW: make sure to add background vertices only if they are not outside of the geometric boundary\\
+\vspace{3em}
+
+\noindent \textbf{Change \#181} with diff file ISSM-18487-18488.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Options/Options.cpp\\
+Export determination: 6. \\
+Rationale: NEW: added comment as to how to temporarily fix the cast\\
+\vspace{3em}
+
+\noindent \textbf{Change \#182} with diff file ISSM-18488-18489.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/bamg/Mesh.cpp\\
+Export determination: 6. \\
+Rationale: CHG: do not include any vertex of the background mesh that may lie outside of the domain\\
+\vspace{3em}
+
+\noindent \textbf{Change \#183} with diff file ISSM-18489-18490.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/Archives/Archive803.nc M /issm/trunk-jpl/test/Archives/Archive805.nc\\
+Export determination: 6. \\
+Rationale: MINOR: update faulty archives\\
+\vspace{3em}
+
+\noindent \textbf{Change \#184} with diff file ISSM-18490-18491.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/bamg/R2.h\\
+Export determination: 6. \\
+Rationale: CHG: better Echo for R2\\
+\vspace{3em}
+
+\noindent \textbf{Change \#185} with diff file ISSM-18491-18492.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/gravity/vfsa\_mpi.cpp\\
+Export determination: 6. \\
+Rationale: CNG: code more constrained\\
+\vspace{3em}
+
+\noindent \textbf{Change \#186} with diff file ISSM-18492-18493.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/analyses.m4 M /issm/trunk-jpl/src/c/Makefile.am M /issm/trunk-jpl/src/c/analyses/EnumToAnalysis.cpp A /issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp A /issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.h M /issm/trunk-jpl/src/c/analyses/analyses.h M /issm/trunk-jpl/src/c/bamg/Mesh.cpp M /issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp M /issm/trunk-jpl/src/c/classes/Materials/Matpar.h A /issm/trunk-jpl/src/c/classes/Materials/Matseaice.cpp A /issm/trunk-jpl/src/c/classes/Materials/Matseaice.h M /issm/trunk-jpl/src/c/classes/Vertex.cpp M /issm/trunk-jpl/src/c/classes/classes.h M /issm/trunk-jpl/src/c/cores/AnalysisConfiguration.cpp M /issm/trunk-jpl/src/c/cores/CorePointerFromSolutionEnum.cpp M /issm/trunk-jpl/src/c/cores/cores.h A /issm/trunk-jpl/src/c/cores/seaice\_core.cpp M /issm/trunk-jpl/src/c/modules/Bamgx/Bamgx.cpp M /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp M /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/classes/geometry.m M /issm/trunk-jpl/src/m/classes/mask.m A /issm/trunk-jpl/src/m/classes/matseaice.m M /issm/trunk-jpl/src/m/classes/model.m A /issm/trunk-jpl/src/m/classes/seaice.m A /issm/trunk-jpl/src/m/classes/seaiceatm.m A /issm/trunk-jpl/src/m/classes/seaiceinitialization.m A /issm/trunk-jpl/src/m/classes/seaiceocean.m M /issm/trunk-jpl/src/m/classes/stressbalance.m M /issm/trunk-jpl/src/m/consistency/ismodelselfconsistent.m A /issm/trunk-jpl/src/m/enum/BasalforcingsOceanCoefEnum.m A /issm/trunk-jpl/src/m/enum/BasalforcingsOceanLinDragCoefEnum.m A /issm/trunk-jpl/src/m/enum/BasalforcingsOceanQuadDragCoefEnum.m A /issm/trunk-jpl/src/m/enum/BasalforcingsOceanSshEnum.m A /issm/trunk-jpl/src/m/enum/BasalforcingsOceanTurningAngleEnum.m A /issm/trunk-jpl/src/m/enum/BasalforcingsOceanVxEnum.m A /issm/trunk-jpl/src/m/enum/BasalforcingsOceanVyEnum.m A /issm/trunk-jpl/src/m/enum/BasalforcingsRhoOceanEnum.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/MaterialsCohesionEnum.m A /issm/trunk-jpl/src/m/enum/MaterialsCompressionCoefEnum.m A /issm/trunk-jpl/src/m/enum/MaterialsDamageEnum.m A /issm/trunk-jpl/src/m/enum/MaterialsInternalFrictionCoefEnum.m A /issm/trunk-jpl/src/m/enum/MaterialsPoissonEnum.m A /issm/trunk-jpl/src/m/enum/MaterialsRidgingExponentEnum.m A /issm/trunk-jpl/src/m/enum/MaterialsTractionCoefEnum.m A /issm/trunk-jpl/src/m/enum/MaterialsYoungModulusEnum.m A /issm/trunk-jpl/src/m/enum/MatseaiceEnum.m A /issm/trunk-jpl/src/m/enum/SeaiceAnalysisEnum.m A /issm/trunk-jpl/src/m/enum/SeaiceConcentrationEnum.m A /issm/trunk-jpl/src/m/enum/SeaiceSolutionEnum.m A /issm/trunk-jpl/src/m/enum/SeaiceSpcvxEnum.m A /issm/trunk-jpl/src/m/enum/SeaiceSpcvyEnum.m A /issm/trunk-jpl/src/m/enum/SeaiceThicknessEnum.m A /issm/trunk-jpl/src/m/enum/SeaiceatmEnum.m A /issm/trunk-jpl/src/m/enum/SeaiceoceanEnum.m A /issm/trunk-jpl/src/m/enum/SurfaceforcingsAirCoefEnum.m A /issm/trunk-jpl/src/m/enum/SurfaceforcingsAirLinDragCoefEnum.m A /issm/trunk-jpl/src/m/enum/SurfaceforcingsAirQuadDragCoefEnum.m A /issm/trunk-jpl/src/m/enum/SurfaceforcingsRhoAirEnum.m A /issm/trunk-jpl/src/m/enum/SurfaceforcingsWindVxEnum.m A /issm/trunk-jpl/src/m/enum/SurfaceforcingsWindVyEnum.m A /issm/trunk-jpl/src/m/enum/VxStarEnum.m A /issm/trunk-jpl/src/m/enum/VyStarEnum.m\\
+Export determination: 6. \\
+Rationale: NEW: added Sea ice model (not working yet) into ISSM\\
+\vspace{3em}
+
+\noindent \textbf{Change \#187} with diff file ISSM-18493-18494.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/bamg/Mesh.cpp\\
+Export determination: 6. \\
+Rationale: BUG: reverting back\\
+\vspace{3em}
+
+\noindent \textbf{Change \#188} with diff file ISSM-18494-18495.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/matseaice.m M /issm/trunk-jpl/src/m/classes/seaice.m\\
+Export determination: 6. \\
+Rationale: CHG: do not check seaice if this is not the solution\\
+\vspace{3em}
+
+\noindent \textbf{Change \#189} with diff file ISSM-18495-18496.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/vim/addons/vim/syntax/c.vim\\
+Export determination: 6. \\
+Rationale: CHG: syncing enums\\
+\vspace{3em}
+
+\noindent \textbf{Change \#190} with diff file ISSM-18496-18497.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added some forcings\\
+\vspace{3em}
+
+\noindent \textbf{Change \#191} with diff file ISSM-18497-18498.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp M /issm/trunk-jpl/src/c/classes/Materials/Matseaice.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/classes/seaice.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/SeaiceCoriolisFactorEnum.m\\
+Export determination: 6. \\
+Rationale: CHG: added some forcings\\
+\vspace{3em}
+
+\noindent \textbf{Change \#192} with diff file ISSM-18498-18499.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed ssh indexing\\
+\vspace{3em}
+
+\noindent \textbf{Change \#193} with diff file ISSM-18499-18500.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/Archives/Archive514.nc\\
+Export determination: 6. \\
+Rationale: CHG: updated bamg archive\\
+\vspace{3em}
+
+\noindent \textbf{Change \#194} with diff file ISSM-18500-18501.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/Bamgx/Bamgx.cpp\\
+Export determination: 6. \\
+Rationale: CHG: no need to print lines in bamg\\
+\vspace{3em}
+
+\noindent \textbf{Change \#195} with diff file ISSM-18501-18502.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added ocean forcing to stiffness matrix\\
+\vspace{3em}
+
+\noindent \textbf{Change \#196} with diff file ISSM-18502-18503.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.h M /issm/trunk-jpl/src/c/cores/seaice\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added UpdateConstraints\\
+\vspace{3em}
+
+\noindent \textbf{Change \#197} with diff file ISSM-18503-18504.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/constants.m M /issm/trunk-jpl/src/m/classes/matseaice.m M /issm/trunk-jpl/src/m/classes/model.m M /issm/trunk-jpl/src/m/classes/seaice.m M /issm/trunk-jpl/src/m/classes/seaiceinitialization.m M /issm/trunk-jpl/src/m/classes/seaiceocean.m M /issm/trunk-jpl/src/m/classes/timestepping.m A /issm/trunk-jpl/src/m/enum/ConstantsOmegaEnum.m A /issm/trunk-jpl/src/m/enum/DamageEnum.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py D /issm/trunk-jpl/src/m/enum/MaterialsDamageEnum.m A /issm/trunk-jpl/src/m/enum/MaterialsTimeRelaxationDamageEnum.m A /issm/trunk-jpl/src/m/enum/MaterialsTimeRelaxationStressEnum.m A /issm/trunk-jpl/src/m/enum/SeaiceMaxThicknessEnum.m A /issm/trunk-jpl/src/m/enum/SeaiceMinConcentrationEnum.m A /issm/trunk-jpl/src/m/enum/SeaiceMinThicknessEnum.m A /issm/trunk-jpl/src/m/enum/StressTensorPredictorxxEnum.m A /issm/trunk-jpl/src/m/enum/StressTensorPredictorxyEnum.m A /issm/trunk-jpl/src/m/enum/StressTensorPredictoryyEnum.m\\
+Export determination: 6. \\
+Rationale: CHG: working on sea ice model\\
+\vspace{3em}
+
+\noindent \textbf{Change \#198} with diff file ISSM-18504-18505.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp M /issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp M /issm/trunk-jpl/src/c/classes/Materials/Matpar.h M /issm/trunk-jpl/src/c/cores/seaice\_core.cpp M /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp\\
+Export determination: 6. \\
+Rationale: CHG: working on sea ice model\\
+\vspace{3em}
+
+\noindent \textbf{Change \#199} with diff file ISSM-18505-18506.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.h M /issm/trunk-jpl/src/c/cores/seaice\_core.cpp\\
+Export determination: 6. \\
+Rationale: NEW: finished implementing post processing... debuging to come\\
+\vspace{3em}
+
+\noindent \textbf{Change \#200} with diff file ISSM-18506-18507.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/model.m\\
+Export determination: 6. \\
+Rationale: BUG: adding seaice field if nonexistent, collapsing Hydrology\\
+\vspace{3em}
+
+\noindent \textbf{Change \#201} with diff file ISSM-18507-18508.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/model.m\\
+Export determination: 6. \\
+Rationale: BUG:Fixing seaice field creation in old models\\
+\vspace{3em}
+
+\noindent \textbf{Change \#202} with diff file ISSM-18508-18509.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/hydrologydc.m\\
+Export determination: 6. \\
+Rationale: CHG: cosmetic change\\
+\vspace{3em}
+
+\noindent \textbf{Change \#203} with diff file ISSM-18509-18510.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixing NR\\
+\vspace{3em}
+
+\noindent \textbf{Change \#204} with diff file ISSM-18510-18511.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/valgrind/install-altix64.sh M /issm/trunk-jpl/externalpackages/valgrind/install-linux64.sh M /issm/trunk-jpl/externalpackages/valgrind/install-macosx32.sh M /issm/trunk-jpl/externalpackages/valgrind/install-macosx64.sh M /issm/trunk-jpl/externalpackages/valgrind/install-win32.sh\\
+Export determination: 6. \\
+Rationale: CHG: upgradint to 3.10 that supports mavericks\\
+\vspace{3em}
+
+\noindent \textbf{Change \#205} with diff file ISSM-18511-18512.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp M /issm/trunk-jpl/src/c/classes/Loads/Friction.h M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp\\
+Export determination: 6. \\
+Rationale: NEW:Adding Hydrology driven friction law\\
+\vspace{3em}
+
+\noindent \textbf{Change \#206} with diff file ISSM-18512-18513.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/classes/frictionhydro.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/FrictionAsEnum.m\\
+Export determination: 6. \\
+Rationale: NEW:Adding Hydrology driven friction law\\
+\vspace{3em}
+
+\noindent \textbf{Change \#207} with diff file ISSM-18513-18514.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/contrib/paraview/enveloppeVTK.m M /issm/trunk-jpl/src/m/contrib/paraview/exportVTK.m A /issm/trunk-jpl/src/m/contrib/paraview/exportVTK.py\\
+Export determination: 6. \\
+Rationale: NEW:adding vtk output for python\\
+\vspace{3em}
+
+\noindent \textbf{Change \#208} with diff file ISSM-18515-18516.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/paraview/exportVTK.py\\
+Export determination: 6. \\
+Rationale: BUG:debugging python in VTK export\\
+\vspace{3em}
+
+\noindent \textbf{Change \#209} with diff file ISSM-18516-18517.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/paraview/exportVTK.py\\
+Export determination: 6. \\
+Rationale: CHG: some updates, still not working\\
+\vspace{3em}
+
+\noindent \textbf{Change \#210} with diff file ISSM-18517-18518.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp M /issm/trunk-jpl/test/Archives/Archive325.nc M /issm/trunk-jpl/test/Archives/Archive431.nc M /issm/trunk-jpl/test/Archives/Archive432.nc\\
+Export determination: 6. \\
+Rationale: BUG: From the series: 'bugs are small and hard to find', lesson 113: 'Do apply basal heating throughout steadystate solver runs, otherwise the solver starts to oscillate'.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#211} with diff file ISSM-18518-18519.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/jenkins.sh\\
+Export determination: 6. \\
+Rationale: CHG: launch matlab from MATLAB\_PATH instead of ISSM\_DIR/ext.../matlab\\
+\vspace{3em}
+
+\noindent \textbf{Change \#212} with diff file ISSM-18519-18520.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/model.m\\
+Export determination: 6. \\
+Rationale: CHG: fixing error message while loading models\\
+\vspace{3em}
+
+\noindent \textbf{Change \#213} with diff file ISSM-18520-18521.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: temporary change for comparison with neXTSIM\\
+\vspace{3em}
+
+\noindent \textbf{Change \#214} with diff file ISSM-18521-18522.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp M /issm/trunk-jpl/src/c/classes/Elements/Elements.cpp M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/PentaRef.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tetra.cpp M /issm/trunk-jpl/src/c/classes/Elements/TetraRef.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/Elements/TriaRef.cpp M /issm/trunk-jpl/src/c/classes/ExternalResults/Results.cpp M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/classes/Hook.cpp M /issm/trunk-jpl/src/c/classes/Inputs/ControlInput.cpp M /issm/trunk-jpl/src/c/classes/Inputs/DatasetInput.cpp M /issm/trunk-jpl/src/c/classes/Inputs/Inputs.cpp M /issm/trunk-jpl/src/c/classes/IoModel.cpp M /issm/trunk-jpl/src/c/classes/Loads/Loads.cpp M /issm/trunk-jpl/src/c/classes/Materials/Materials.cpp M /issm/trunk-jpl/src/c/classes/Nodes.cpp M /issm/trunk-jpl/src/c/classes/Options/Options.cpp M /issm/trunk-jpl/src/c/classes/Options/Options.h M /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp M /issm/trunk-jpl/src/c/classes/Vertices.cpp M /issm/trunk-jpl/src/c/classes/gauss/GaussPenta.cpp M /issm/trunk-jpl/src/c/classes/kriging/Observations.cpp M /issm/trunk-jpl/src/c/cores/ad\_core.cpp M /issm/trunk-jpl/src/c/main/kriging.cpp M /issm/trunk-jpl/src/c/modules/AllocateSystemMatricesx/AllocateSystemMatricesx.cpp M /issm/trunk-jpl/src/c/modules/AverageOntoPartitionx/AverageOntoPartitionx.cpp M /issm/trunk-jpl/src/c/modules/ConfigureObjectsx/ConfigureObjectsx.cpp M /issm/trunk-jpl/src/c/modules/CreateJacobianMatrixx/CreateJacobianMatrixx.cpp M /issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp M /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp M /issm/trunk-jpl/src/c/modules/GetSolutionFromInputsx/GetSolutionFromInputsx.cpp M /issm/trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp M /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp M /issm/trunk-jpl/src/c/modules/InputControlUpdatex/InputControlUpdatex.cpp M /issm/trunk-jpl/src/c/modules/InputDepthAverageAtBasex/InputDepthAverageAtBasex.cpp M /issm/trunk-jpl/src/c/modules/InputDuplicatex/InputDuplicatex.cpp M /issm/trunk-jpl/src/c/modules/InputExtrudex/InputExtrudex.cpp M /issm/trunk-jpl/src/c/modules/InputScalex/InputScalex.cpp M /issm/trunk-jpl/src/c/modules/InputUpdateFromConstantx/InputUpdateFromConstantx.cpp M /issm/trunk-jpl/src/c/modules/InputUpdateFromMatrixDakotax/InputUpdateFromMatrixDakotax.cpp M /issm/trunk-jpl/src/c/modules/InputUpdateFromSolutionx/InputUpdateFromSolutionx.cpp M /issm/trunk-jpl/src/c/modules/InputUpdateFromVectorDakotax/InputUpdateFromVectorDakotax.cpp M /issm/trunk-jpl/src/c/modules/InputUpdateFromVectorx/InputUpdateFromVectorx.cpp M /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp M /issm/trunk-jpl/src/c/modules/NodalValuex/NodalValuex.cpp M /issm/trunk-jpl/src/c/modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.cpp M /issm/trunk-jpl/src/c/modules/ResetFSBasalBoundaryConditionx/ResetFSBasalBoundaryConditionx.cpp M /issm/trunk-jpl/src/c/modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.cpp M /issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp M /issm/trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp M /issm/trunk-jpl/src/c/modules/SurfaceAreax/SurfaceAreax.cpp M /issm/trunk-jpl/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp M /issm/trunk-jpl/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp M /issm/trunk-jpl/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp M /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp M /issm/trunk-jpl/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp M /issm/trunk-jpl/src/c/modules/SystemMatricesx/SystemMatricesx.cpp M /issm/trunk-jpl/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp M /issm/trunk-jpl/src/c/modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.cpp M /issm/trunk-jpl/src/c/modules/ThicknessAlongGradientx/ThicknessAlongGradientx.cpp M /issm/trunk-jpl/src/c/shared/Numerics/recast.h M /issm/trunk-jpl/src/c/toolkits/gsl/DenseGslSolve.cpp M /issm/trunk-jpl/src/c/toolkits/mumps/MpiDenseMumpsSolve.cpp M /issm/trunk-jpl/src/c/toolkits/mumps/MumpsSolve.cpp\\
+Export determination: 6. \\
+Rationale: CHG: removed ALL dynamic casts, now change the template shared/Numerics/recast.h to change back to dynamic\_casts\\
+\vspace{3em}
+
+\noindent \textbf{Change \#215} with diff file ISSM-18522-18523.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.cpp\\
+Export determination: 6. \\
+Rationale: CHG: this one seems to require dynamic\_cast\\
+\vspace{3em}
+
+\noindent \textbf{Change \#216} with diff file ISSM-18523-18524.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/PentaRef.cpp M /issm/trunk-jpl/src/c/classes/Elements/SegRef.cpp M /issm/trunk-jpl/src/c/classes/Elements/TetraRef.cpp M /issm/trunk-jpl/src/c/classes/Elements/TriaRef.cpp\\
+Export determination: 6. \\
+Rationale: CHG: significant gain in performance by using static allocation for GetInputValue and GetInputDerivativeValue\\
+\vspace{3em}
+
+\noindent \textbf{Change \#217} with diff file ISSM-18524-18525.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/jenkins.sh\\
+Export determination: 6. \\
+Rationale: CHG: create nightlylog directory\\
+\vspace{3em}
+
+\noindent \textbf{Change \#218} with diff file ISSM-18525-18526.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/ubuntu/package.sh\\
+Export determination: 6. \\
+Rationale: CHG: typo\\
+\vspace{3em}
+
+\noindent \textbf{Change \#219} with diff file ISSM-18526-18527.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/package.sh M /issm/trunk-jpl/packagers/ubuntu/package.sh\\
+Export determination: 6. \\
+Rationale: CHG: added full path of websites server\\
+\vspace{3em}
+
+\noindent \textbf{Change \#220} with diff file ISSM-18527-18528.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/macosx/package.sh\\
+Export determination: 6. \\
+Rationale: CHG: renaming directory trunk\\
+\vspace{3em}
+
+\noindent \textbf{Change \#221} with diff file ISSM-18528-18529.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/classes/FemModel.h M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/MaxDivergenceEnum.m\\
+Export determination: 6. \\
+Rationale: NEW: added output for maximum local divergence\\
+\vspace{3em}
+
+\noindent \textbf{Change \#222} with diff file ISSM-18529-18530.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/Makefile.am M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/classes/FemModel.h D /issm/trunk-jpl/src/c/cores/AnalysisConfiguration.cpp M /issm/trunk-jpl/src/c/cores/cores.h M /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp M /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h\\
+Export determination: 6. \\
+Rationale: NEW: do not create all the analyses for a given solution, use iomodel to know whether some analyses can be skipped\\
+\vspace{3em}
+
+\noindent \textbf{Change \#223} with diff file ISSM-18530-18531.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed NR, problem in analysis configuration\\
+\vspace{3em}
+
+\noindent \textbf{Change \#224} with diff file ISSM-18531-18532.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp\\
+Export determination: 6. \\
+Rationale: NEW: return SigmaNN as P1Enums instead of P0\\
+\vspace{3em}
+
+\noindent \textbf{Change \#225} with diff file ISSM-18532-18533.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/ModelProcessorx/NodesPartitioning.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixing NR for test701\\
+\vspace{3em}
+
+\noindent \textbf{Change \#226} with diff file ISSM-18533-18534.diff: \\
+Function name: \\
+A /issm/trunk-jpl/test/NightlyRun/test4001.m\\
+Export determination: 6. \\
+Rationale: NEW: adding coupled ice-ocean nightly run\\
+\vspace{3em}
+
+\noindent \textbf{Change \#227} with diff file ISSM-18534-18535.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp\\
+Export determination: 6. \\
+Rationale: FIX: minor useless line\\
+\vspace{3em}
+
+\noindent \textbf{Change \#228} with diff file ISSM-18535-18536.diff: \\
+Function name: \\
+A /issm/trunk-jpl/test/MITgcm A /issm/trunk-jpl/test/MITgcm/build A /issm/trunk-jpl/test/MITgcm/build/mitgcmuv A /issm/trunk-jpl/test/MITgcm/code A /issm/trunk-jpl/test/MITgcm/code/SIZE.h A /issm/trunk-jpl/test/MITgcm/code/SIZE.h.bak A /issm/trunk-jpl/test/MITgcm/get\_mitgcm.sh A /issm/trunk-jpl/test/MITgcm/input A /issm/trunk-jpl/test/MITgcm/input/data A /issm/trunk-jpl/test/MITgcm/input/data.obcs A /issm/trunk-jpl/test/MITgcm/input/data.pkg A /issm/trunk-jpl/test/MITgcm/input/data.shelfice A /issm/trunk-jpl/test/MITgcm/input/eedata A /issm/trunk-jpl/test/MITgcm/install.sh A /issm/trunk-jpl/test/MITgcm/tools A /issm/trunk-jpl/test/MITgcm/tools/myint2str.m A /issm/trunk-jpl/test/MITgcm/tools/readbin.m\\
+Export determination: 6. \\
+Rationale: NEW: added parameters and code for ice-ocean NR test\\
+\vspace{3em}
+
+\noindent \textbf{Change \#229} with diff file ISSM-18536-18537.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test4001.m\\
+Export determination: 6. \\
+Rationale: BUG: fixed melting\_rate size\\
+\vspace{3em}
+
+\noindent \textbf{Change \#230} with diff file ISSM-18537-18538.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/timestepping.m\\
+Export determination: 6. \\
+Rationale: CHG: force old models to be in years\\
+\vspace{3em}
+
+\noindent \textbf{Change \#231} with diff file ISSM-18538-18539.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/model.m\\
+Export determination: 6. \\
+Rationale: CHG: minor, forgot semi-column\\
+\vspace{3em}
+
+\noindent \textbf{Change \#232} with diff file ISSM-18539-18540.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/Archives/Archive701.nc\\
+Export determination: 6. \\
+Rationale: FIX: minor archive NR 701\\
+\vspace{3em}
+
+\noindent \textbf{Change \#233} with diff file ISSM-18540-18541.diff: \\
+Function name: \\
+A /issm/trunk-jpl/jenkins/linux64\_murdo\_iceocean\\
+Export determination: 6. \\
+Rationale: NEW: adding iceocean NR on jenkins\\
+\vspace{3em}
+
+\noindent \textbf{Change \#234} with diff file ISSM-18541-18542.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/linux64\_murdo\_iceocean\\
+Export determination: 6. \\
+Rationale: CHG: reduced number of required packages\\
+\vspace{3em}
+
+\noindent \textbf{Change \#235} with diff file ISSM-18542-18543.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/linux64\_murdo\_iceocean\\
+Export determination: 6. \\
+Rationale: BUG: fixing jenkins iceocean\\
+\vspace{3em}
+
+\noindent \textbf{Change \#236} with diff file ISSM-18543-18544.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/IdToName.m\\
+Export determination: 6. \\
+Rationale: NEW: adding ice/ocean test in Nighlty runs list\\
+\vspace{3em}
+
+\noindent \textbf{Change \#237} with diff file ISSM-18544-18545.diff: \\
+Function name: \\
+A /issm/trunk-jpl/test/MITgcm/build.sh M /issm/trunk-jpl/test/NightlyRun/test4001.m\\
+Export determination: 6. \\
+Rationale: BUG: trying to fix NR ice ocean\\
+\vspace{3em}
+
+\noindent \textbf{Change \#238} with diff file ISSM-18545-18546.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: last change before testing\\
+\vspace{3em}
+
+\noindent \textbf{Change \#239} with diff file ISSM-18546-18547.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test4001.m\\
+Export determination: 6. \\
+Rationale: BUG: fixing ice ocean run\\
+\vspace{3em}
+
+\noindent \textbf{Change \#240} with diff file ISSM-18547-18548.diff: \\
+Function name: \\
+A /issm/trunk-jpl/test/Archives/Archive4001.nc\\
+Export determination: 6. \\
+Rationale: NEW: added archive ice ocean\\
+\vspace{3em}
+
+\noindent \textbf{Change \#241} with diff file ISSM-18548-18549.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test4001.m\\
+Export determination: 6. \\
+Rationale: FIX: minor test ocean\\
+\vspace{3em}
+
+\noindent \textbf{Change \#242} with diff file ISSM-18549-18550.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test4001.m\\
+Export determination: 6. \\
+Rationale: FIX: minor names\\
+\vspace{3em}
+
+\noindent \textbf{Change \#243} with diff file ISSM-18550-18551.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/gravity/vfsa\_mpi.cpp\\
+Export determination: 6. \\
+Rationale: CNG: adds landmask\\
+\vspace{3em}
+
+\noindent \textbf{Change \#244} with diff file ISSM-18551-18552.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/cores/balancethickness2\_core.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/classes/balancethickness.m A /issm/trunk-jpl/src/m/enum/BalancethicknessCmuEnum.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py M /issm/trunk-jpl/src/m/plot/googlemaps.m M /issm/trunk-jpl/src/m/plot/plot\_googlemaps.m\\
+Export determination: 6. \\
+Rationale: CHG: working on balancethickness2 (added new field), and some minor changes to googlemaps to make it work for other regions than GIS or AIS\\
+\vspace{3em}
+
+\noindent \textbf{Change \#245} with diff file ISSM-18552-18553.diff: \\
+Function name: \\
+A /issm/trunk-jpl/test/Archives/Archive436.nc A /issm/trunk-jpl/test/Archives/Archive437.nc M /issm/trunk-jpl/test/NightlyRun/IdToName.m A /issm/trunk-jpl/test/NightlyRun/test436.m A /issm/trunk-jpl/test/NightlyRun/test437.m M /issm/trunk-jpl/test/Par/SquareThermal.par\\
+Export determination: 6. \\
+Rationale: ADD: NRs for enthalpy: LliboutryDuval rheology and changing basal boundary conditions. ToDo: add python tests (soon).\\
+\vspace{3em}
+
+\noindent \textbf{Change \#246} with diff file ISSM-18553-18554.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/classes/thermal.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/ThermalReltolEnum.m\\
+Export determination: 6. \\
+Rationale: ADD: thermal.reltol for enthalpy convergence check\\
+\vspace{3em}
+
+\noindent \textbf{Change \#247} with diff file ISSM-18554-18555.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/thermal.m M /issm/trunk-jpl/src/m/classes/thermal.py\\
+Export determination: 6. \\
+Rationale: ADD: thermal.reltol for python\\
+\vspace{3em}
+
+\noindent \textbf{Change \#248} with diff file ISSM-18555-18556.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/balancethickness.m\\
+Export determination: 6. \\
+Rationale: CHG: do not check cmu for now\\
+\vspace{3em}
+
+\noindent \textbf{Change \#249} with diff file ISSM-18556-18557.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/issm\_options.m4\\
+Export determination: 6. \\
+Rationale: BUG: fixes remaining quote of MEXLINK with matlab > 2014a\\
+\vspace{3em}
+
+\noindent \textbf{Change \#250} with diff file ISSM-18557-18558.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/shared/FSanalyticals/fsanalyticals.cpp\\
+Export determination: 6. \\
+Rationale: CHG: minor fs analytical solutions\\
+\vspace{3em}
+
+\noindent \textbf{Change \#251} with diff file ISSM-18558-18559.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/mesh2d.m M /issm/trunk-jpl/src/m/classes/mesh2d.py M /issm/trunk-jpl/src/m/classes/mesh2dvertical.m M /issm/trunk-jpl/src/m/classes/mesh3dprisms.m M /issm/trunk-jpl/src/m/classes/mesh3dprisms.py M /issm/trunk-jpl/src/m/classes/mesh3dtetras.m M /issm/trunk-jpl/src/m/classes/model.m M /issm/trunk-jpl/src/m/classes/model.py M /issm/trunk-jpl/src/m/plot/applyoptions.m M /issm/trunk-jpl/src/m/plot/applyoptions.py M /issm/trunk-jpl/src/m/plot/googlemaps.m M /issm/trunk-jpl/src/m/plot/latlonoverlay.m M /issm/trunk-jpl/src/m/plot/plot\_googlemaps.m M /issm/trunk-jpl/src/m/plot/plotdoc.m M /issm/trunk-jpl/src/m/plot/radarpower.m M /issm/trunk-jpl/src/m/plot/showregion.m\\
+Export determination: 6. \\
+Rationale: NEW: removed md.mesh.hemisphere and replaced by md.mesh.epsg which gives the EPSG code for the projection that is being used\\
+\vspace{3em}
+
+\noindent \textbf{Change \#252} with diff file ISSM-18559-18560.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/mesh2d.m M /issm/trunk-jpl/src/m/classes/mesh2dvertical.m M /issm/trunk-jpl/src/m/classes/mesh3dprisms.m M /issm/trunk-jpl/src/m/classes/mesh3dtetras.m\\
+Export determination: 6. \\
+Rationale: BUG: replaced self by obj for some functions\\
+\vspace{3em}
+
+\noindent \textbf{Change \#253} with diff file ISSM-18560-18561.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h\\
+Export determination: 6. \\
+Rationale: CHG: merged augmentation of TH and CR\\
+\vspace{3em}
+
+\noindent \textbf{Change \#254} with diff file ISSM-18561-18562.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: updated code to include pressure augmentation only by default\\
+\vspace{3em}
+
+\noindent \textbf{Change \#255} with diff file ISSM-18562-18563.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test436.m M /issm/trunk-jpl/test/NightlyRun/test437.m\\
+Export determination: 6. \\
+Rationale: CHG: relaxed some tolerances\\
+\vspace{3em}
+
+\noindent \textbf{Change \#256} with diff file ISSM-18563-18564.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/mesh2d.m M /issm/trunk-jpl/src/m/classes/mesh2dvertical.m M /issm/trunk-jpl/src/m/classes/mesh3dprisms.m M /issm/trunk-jpl/src/m/classes/mesh3dtetras.m\\
+Export determination: 6. \\
+Rationale: CHG: added ; at the end of structtoobj call\\
+\vspace{3em}
+
+\noindent \textbf{Change \#257} with diff file ISSM-18564-18565.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/qmu/dakota\_out\_parse.m\\
+Export determination: 6. \\
+Rationale: NEW: add 95 percent value output\\
+\vspace{3em}
+
+\noindent \textbf{Change \#258} with diff file ISSM-18565-18566.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h M /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.h M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/classes/FemModel.h M /issm/trunk-jpl/src/c/cores/balancethickness2\_core.cpp M /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/classes/balancethickness.m M /issm/trunk-jpl/src/m/classes/m1qn3inversion.m A /issm/trunk-jpl/src/m/enum/BalancethicknessD0Enum.m A /issm/trunk-jpl/src/m/enum/BalancethicknessOmegaEnum.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/InversionSurfaceObsEnum.m A /issm/trunk-jpl/src/m/enum/SurfaceAbsMisfitEnum.m\\
+Export determination: 6. \\
+Rationale: CHG: working on new implementation of balancethickness2\\
+\vspace{3em}
+
+\noindent \textbf{Change \#259} with diff file ISSM-18566-18567.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp\\
+Export determination: 6. \\
+Rationale: BUG: forgot to add to IsInput\\
+\vspace{3em}
+
+\noindent \textbf{Change \#260} with diff file ISSM-18567-18568.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: wrong sign on adjoint and fixed D0\\
+\vspace{3em}
+
+\noindent \textbf{Change \#261} with diff file ISSM-18568-18569.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp\\
+Export determination: 6. \\
+Rationale: CHG: fix NR temporarily\\
+\vspace{3em}
+
+\noindent \textbf{Change \#262} with diff file ISSM-18569-18570.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h\\
+Export determination: 6. \\
+Rationale: CHG: added gradient on adot\\
+\vspace{3em}
+
+\noindent \textbf{Change \#263} with diff file ISSM-18570-18571.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: simplifying the augmentation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#264} with diff file ISSM-18571-18572.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/controlm1qn3\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added gradient norm\\
+\vspace{3em}
+
+\noindent \textbf{Change \#265} with diff file ISSM-18572-18573.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/Archives/Archive702.nc M /issm/trunk-jpl/test/NightlyRun/test702.m\\
+Export determination: 6. \\
+Rationale: CHG: added more tests for augmentation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#266} with diff file ISSM-18573-18574.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/cores/controlvalidation\_core.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed some memory leaks\\
+\vspace{3em}
+
+\noindent \textbf{Change \#267} with diff file ISSM-18574-18575.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed some memory leaks\\
+\vspace{3em}
+
+\noindent \textbf{Change \#268} with diff file ISSM-18575-18576.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/Archives/Archive702.nc\\
+Export determination: 6. \\
+Rationale: CHG: updated archive\\
+\vspace{3em}
+
+\noindent \textbf{Change \#269} with diff file ISSM-18576-18577.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: change in the way the leakage factor is described\\
+\vspace{3em}
+
+\noindent \textbf{Change \#270} with diff file ISSM-18577-18578.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/clusters/pfe.m\\
+Export determination: 6. \\
+Rationale: CHG:minor change to PBS path\\
+\vspace{3em}
+
+\noindent \textbf{Change \#271} with diff file ISSM-18578-18579.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/model.m M /issm/trunk-jpl/src/m/classes/model.py\\
+Export determination: 6. \\
+Rationale: BUG:fixing colapsing of hydro\\
+\vspace{3em}
+
+\noindent \textbf{Change \#272} with diff file ISSM-18579-18580.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/stressbalance.m\\
+Export determination: 6. \\
+Rationale: CHG:changing test to avoid spc necessity on non all floating domain\\
+\vspace{3em}
+
+\noindent \textbf{Change \#273} with diff file ISSM-18580-18581.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/hydrologydc.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/HydrologydcEplColapseThicknessEnum.m\\
+Export determination: 6. \\
+Rationale: NEW: adding a colapsing thickness to the EPL\\
+\vspace{3em}
+
+\noindent \textbf{Change \#274} with diff file ISSM-18581-18582.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp M /issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp M /issm/trunk-jpl/src/c/classes/Materials/Matpar.h M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp\\
+Export determination: 6. \\
+Rationale: NEW: adding a colapsing thickness to the EPL\\
+\vspace{3em}
+
+\noindent \textbf{Change \#275} with diff file ISSM-18582-18583.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test3300.m M /issm/trunk-jpl/test/NightlyRun/test333.m M /issm/trunk-jpl/test/NightlyRun/test335.m\\
+Export determination: 6. \\
+Rationale: CHG:adding EPL colapse\\
+\vspace{3em}
+
+\noindent \textbf{Change \#276} with diff file ISSM-18583-18584.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test1501.m M /issm/trunk-jpl/test/NightlyRun/test1501.py M /issm/trunk-jpl/test/NightlyRun/test1502.m M /issm/trunk-jpl/test/NightlyRun/test1502.py\\
+Export determination: 6. \\
+Rationale: CHG: minor new name for melting\_rate\\
+\vspace{3em}
+
+\noindent \textbf{Change \#277} with diff file ISSM-18584-18585.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed m/yr m/sec conversion on SMB\\
+\vspace{3em}
+
+\noindent \textbf{Change \#278} with diff file ISSM-18585-18586.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/hydrologydc.py\\
+Export determination: 6. \\
+Rationale: BUG : indentation issue\\
+\vspace{3em}
+
+\noindent \textbf{Change \#279} with diff file ISSM-18586-18587.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/hydrologydc.py\\
+Export determination: 6. \\
+Rationale: BUG: fixed python version of hydrologydc\\
+\vspace{3em}
+
+\noindent \textbf{Change \#280} with diff file ISSM-18587-18588.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/gravity/vfsa\_mpi.cpp\\
+Export determination: 6. \\
+Rationale: CNG: slightly modified for better performance\\
+\vspace{3em}
+
+\noindent \textbf{Change \#281} with diff file ISSM-18588-18589.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/shared/FSanalyticals/fsanalyticals.cpp\\
+Export determination: 6. \\
+Rationale: CHG: minor new analytical function\\
+\vspace{3em}
+
+\noindent \textbf{Change \#282} with diff file ISSM-18589-18590.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp M /issm/trunk-jpl/src/c/cores/thermal\_core.cpp M /issm/trunk-jpl/src/c/solutionsequences/convergence.cpp M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_thermal\_nonlinear.cpp\\
+Export determination: 6. \\
+Rationale: CHG: use solutionsequence\_thermal\_nonlinear for enthalpy\\
+\vspace{3em}
+
+\noindent \textbf{Change \#283} with diff file ISSM-18590-18591.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_thermal\_nonlinear.cpp\\
+Export determination: 6. \\
+Rationale: minor: fix memory leak for thermal\\
+\vspace{3em}
+
+\noindent \textbf{Change \#284} with diff file ISSM-18591-18592.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp M /issm/trunk-jpl/src/c/cores/thermal\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: move enthalpy core to Enthalpy::Core\\
+\vspace{3em}
+
+\noindent \textbf{Change \#285} with diff file ISSM-18592-18593.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/hydrologydc.py M /issm/trunk-jpl/src/m/classes/initialization.m M /issm/trunk-jpl/src/m/classes/initialization.py M /issm/trunk-jpl/src/m/classes/model.py M /issm/trunk-jpl/src/m/exp/expdisp.m\\
+Export determination: 6. \\
+Rationale: BUG: fixing of python hydrology\\
+\vspace{3em}
+
+\noindent \textbf{Change \#286} with diff file ISSM-18593-18594.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/Makefile.am M /issm/trunk-jpl/src/c/analyses/BalancevelocityAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/EnumToAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp A /issm/trunk-jpl/src/c/analyses/SmoothAnalysis.cpp A /issm/trunk-jpl/src/c/analyses/SmoothAnalysis.h D /issm/trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeXAnalysis.cpp D /issm/trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeXAnalysis.h D /issm/trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeYAnalysis.cpp D /issm/trunk-jpl/src/c/analyses/SmoothedSurfaceSlopeYAnalysis.h M /issm/trunk-jpl/src/c/analyses/analyses.h M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/cores/balancevelocity\_core.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/classes/inversionvalidation.m A /issm/trunk-jpl/src/m/enum/DrivingStressXEnum.m A /issm/trunk-jpl/src/m/enum/DrivingStressYEnum.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/InputToSmoothEnum.m A /issm/trunk-jpl/src/m/enum/SmoothAnalysisEnum.m M /issm/trunk-jpl/test/NightlyRun/test530.m M /issm/trunk-jpl/test/NightlyRun/test530.py M /issm/trunk-jpl/test/NightlyRun/test531.m M /issm/trunk-jpl/test/NightlyRun/test531.py\\
+Export determination: 6. \\
+Rationale: NEW: added SmoothAnalysis, which replaces SmoothedSurfaceXAnalysis and can be applied to any field\\
+\vspace{3em}
+
+\noindent \textbf{Change \#287} with diff file ISSM-18594-18595.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/issm\_options.m4\\
+Export determination: 6. \\
+Rationale: BUG: added path to pthread on OSX\\
+\vspace{3em}
+
+\noindent \textbf{Change \#288} with diff file ISSM-18595-18596.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/analyses.m4\\
+Export determination: 6. \\
+Rationale: CHG: added Smooth analysis\\
+\vspace{3em}
+
+\noindent \textbf{Change \#289} with diff file ISSM-18596-18597.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/initialization.py\\
+Export determination: 6. \\
+Rationale: BUG: fixing of python hydrology\\
+\vspace{3em}
+
+\noindent \textbf{Change \#290} with diff file ISSM-18597-18598.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/imac-012301-gil M /issm/trunk-jpl/jenkins/linux64\_murdo M /issm/trunk-jpl/jenkins/linux64\_murdo\_ad M /issm/trunk-jpl/jenkins/linux64\_murdo\_ampi A /issm/trunk-jpl/jenkins/linux64\_murdo\_gia M /issm/trunk-jpl/jenkins/linux64\_murdo\_iceocean M /issm/trunk-jpl/jenkins/windows\\
+Export determination: 6. \\
+Rationale: CHG: added linux64\_murdo\_gia for gia model\\
+\vspace{3em}
+
+\noindent \textbf{Change \#291} with diff file ISSM-18598-18599.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test702.m\\
+Export determination: 6. \\
+Rationale: CHG: minor tolerances\\
+\vspace{3em}
+
+\noindent \textbf{Change \#292} with diff file ISSM-18599-18600.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/initialization.py\\
+Export determination: 6. \\
+Rationale: BUG: indent fix\\
+\vspace{3em}
+
+\noindent \textbf{Change \#293} with diff file ISSM-18600-18601.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/googlemaps.m\\
+Export determination: 6. \\
+Rationale: BUG: epsg code is a double that needs to be converted to string\\
+\vspace{3em}
+
+\noindent \textbf{Change \#294} with diff file ISSM-18601-18602.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/solutionsequences/convergence.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added default\\
+\vspace{3em}
+
+\noindent \textbf{Change \#295} with diff file ISSM-18602-18603.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.h\\
+Export determination: 6. \\
+Rationale: CHG: added DeleteInput function\\
+\vspace{3em}
+
+\noindent \textbf{Change \#296} with diff file ISSM-18603-18604.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp\\
+Export determination: 6. \\
+Rationale: NEW: added Smooth analysis to Balancethickness2SolutionEnum in order to smooth surface slopes\\
+\vspace{3em}
+
+\noindent \textbf{Change \#297} with diff file ISSM-18604-18605.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/analyses/SmoothAnalysis.cpp M /issm/trunk-jpl/src/c/cores/balancethickness2\_core.cpp M /issm/trunk-jpl/src/c/cores/balancevelocity\_core.cpp M /issm/trunk-jpl/src/c/cores/controlvalidation\_core.cpp M /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/SmoothThicknessMultiplierEnum.m D /issm/trunk-jpl/src/m/enum/SmoothedSurfaceSlopeXAnalysisEnum.m D /issm/trunk-jpl/src/m/enum/SmoothedSurfaceSlopeYAnalysisEnum.m\\
+Export determination: 6. \\
+Rationale: CHG: working on balance thickness2\\
+\vspace{3em}
+
+\noindent \textbf{Change \#298} with diff file ISSM-18605-18606.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/initialization.py M /issm/trunk-jpl/src/m/classes/inversion.m M /issm/trunk-jpl/src/m/classes/inversionvalidation.m M /issm/trunk-jpl/src/m/classes/model.py\\
+Export determination: 6. \\
+Rationale: BUG: fixing python indentation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#299} with diff file ISSM-18606-18607.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/balancethickness2\_core.cpp M /issm/trunk-jpl/src/c/cores/balancevelocity\_core.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixing AD copmilation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#300} with diff file ISSM-18607-18608.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/balancethickness2\_core.cpp M /issm/trunk-jpl/src/c/cores/balancevelocity\_core.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixing AD\\
+\vspace{3em}
+
+\noindent \textbf{Change \#301} with diff file ISSM-18608-18609.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/balancethickness2\_core.cpp M /issm/trunk-jpl/src/c/cores/balancevelocity\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: fixed AD compil\\
+\vspace{3em}
+
+\noindent \textbf{Change \#302} with diff file ISSM-18609-18610.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/inversion.py\\
+Export determination: 6. \\
+Rationale: CHG: added surfaceobs to python file\\
+\vspace{3em}
+
+\noindent \textbf{Change \#303} with diff file ISSM-18610-18611.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/groundingline.m\\
+Export determination: 6. \\
+Rationale: CHG: minor display all the kind of grounding line migration possible\\
+\vspace{3em}
+
+\noindent \textbf{Change \#304} with diff file ISSM-18611-18612.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/plot/colormaps/bluewhitered.m\\
+Export determination: 6. \\
+Rationale: NEW: added new colormap\\
+\vspace{3em}
+
+\noindent \textbf{Change \#305} with diff file ISSM-18612-18613.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.h M /issm/trunk-jpl/test/Archives/Archive325.nc M /issm/trunk-jpl/test/Archives/Archive326.nc M /issm/trunk-jpl/test/Archives/Archive327.nc M /issm/trunk-jpl/test/Archives/Archive431.nc M /issm/trunk-jpl/test/Archives/Archive432.nc M /issm/trunk-jpl/test/Archives/Archive436.nc M /issm/trunk-jpl/test/Archives/Archive437.nc M /issm/trunk-jpl/test/Archives/Archive803.nc M /issm/trunk-jpl/test/Archives/Archive805.nc\\
+Export determination: 6. \\
+Rationale: CHG: new unified decision chart for basal thermal condition\\
+\vspace{3em}
+
+\noindent \textbf{Change \#306} with diff file ISSM-18613-18614.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/Makefile.am M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.h M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/Penta.h M /issm/trunk-jpl/src/c/classes/Elements/Seg.h M /issm/trunk-jpl/src/c/classes/Elements/Tetra.h M /issm/trunk-jpl/src/c/classes/Elements/Tria.h M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/classes/FemModel.h A /issm/trunk-jpl/src/c/shared/Elements/StressIntensityIntegralWeight.cpp M /issm/trunk-jpl/src/c/shared/Elements/elements.h M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/LevelsetStabilizationEnum.m A /issm/trunk-jpl/src/m/enum/StressIntensityFactorEnum.m\\
+Export determination: 6. \\
+Rationale: NEW: added stress intensity factor calculation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#307} with diff file ISSM-18614-18615.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixing AD\\
+\vspace{3em}
+
+\noindent \textbf{Change \#308} with diff file ISSM-18615-18616.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/classes/m1qn3inversion.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/InversionControlScalingFactorsEnum.m\\
+Export determination: 6. \\
+Rationale: NEW: added scaling factor in M1QN3 to normalize gradient\\
+\vspace{3em}
+
+\noindent \textbf{Change \#309} with diff file ISSM-18616-18617.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/controlm1qn3\_core.cpp M /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added scaling for each control\\
+\vspace{3em}
+
+\noindent \textbf{Change \#310} with diff file ISSM-18617-18618.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/controlvalidation\_core.cpp M /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp M /issm/trunk-jpl/src/m/classes/inversionvalidation.m\\
+Export determination: 6. \\
+Rationale: CHG: use scaling factor for inversion validation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#311} with diff file ISSM-18618-18619.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/wrappers/matlab/io/WriteMatlabData.cpp\\
+Export determination: 6. \\
+Rationale: BUG: added PreviousNumbering in output\\
+\vspace{3em}
+
+\noindent \textbf{Change \#312} with diff file ISSM-18619-18620.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/solutionsequences/convergence.cpp M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_newton.cpp M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_nonlinear.cpp M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_stokescoupling\_nonlinear.cpp M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_thermal\_nonlinear.cpp M /issm/trunk-jpl/src/c/solutionsequences/solutionsequences.h M /issm/trunk-jpl/src/m/classes/stressbalance.m M /issm/trunk-jpl/src/m/classes/stressbalance.py\\
+Export determination: 6. \\
+Rationale: CHG: convergence criteria must now be provided to convergence\\
+\vspace{3em}
+
+\noindent \textbf{Change \#313} with diff file ISSM-18620-18621.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.h M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_thermal\_nonlinear.cpp M /issm/trunk-jpl/src/m/classes/thermal.m M /issm/trunk-jpl/src/m/classes/thermal.py M /issm/trunk-jpl/test/Archives/Archive431.nc M /issm/trunk-jpl/test/Archives/Archive432.nc\\
+Export determination: 6. \\
+Rationale: CHG: dynamic basal constraints for enthalpy steadystate\\
+\vspace{3em}
+
+\noindent \textbf{Change \#314} with diff file ISSM-18621-18622.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_thermal\_nonlinear.cpp\\
+Export determination: 6. \\
+Rationale: BUG: do not fetch ThermalReltolEnum if not enthalpy\\
+\vspace{3em}
+
+\noindent \textbf{Change \#315} with diff file ISSM-18622-18623.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp M /issm/trunk-jpl/test/Archives/Archive432.nc M /issm/trunk-jpl/test/Archives/Archive436.nc M /issm/trunk-jpl/test/Archives/Archive437.nc\\
+Export determination: 6. \\
+Rationale: Bug: apply dynamic basal boundary scheme only for isdynamicbasalspc=true\\
+\vspace{3em}
+
+\noindent \textbf{Change \#316} with diff file ISSM-18623-18624.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/initialization.m\\
+Export determination: 6. \\
+Rationale: BUG: H=c*(T-Tref)+?226?128?166 for nodes at pressure melting point\\
+\vspace{3em}
+
+\noindent \textbf{Change \#317} with diff file ISSM-18624-18625.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: rho\_ocean uninitialized\\
+\vspace{3em}
+
+\noindent \textbf{Change \#318} with diff file ISSM-18625-18626.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/triangle/install-win7.sh\\
+Export determination: 6. \\
+Rationale: CHG: testing windows compile\\
+\vspace{3em}
+
+\noindent \textbf{Change \#319} with diff file ISSM-18626-18627.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/metis/install-4.0-win7.sh\\
+Export determination: 6. \\
+Rationale: CHG: trying to install metis\\
+\vspace{3em}
+
+\noindent \textbf{Change \#320} with diff file ISSM-18627-18628.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/metis/install-4.0-win7.sh\\
+Export determination: 6. \\
+Rationale: CHG: reverting back\\
+\vspace{3em}
+
+\noindent \textbf{Change \#321} with diff file ISSM-18628-18629.diff: \\
+Function name: \\
+A /issm/trunk-jpl/externalpackages/petsc/install-3.5-win7.sh M /issm/trunk-jpl/jenkins/windows\\
+Export determination: 6. \\
+Rationale: CHG: trying to use petsc 3.5 in windows\\
+\vspace{3em}
+
+\noindent \textbf{Change \#322} with diff file ISSM-18629-18630.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/petsc/install-3.5-win7.sh\\
+Export determination: 6. \\
+Rationale: BUG: needed to download lite version\\
+\vspace{3em}
+
+\noindent \textbf{Change \#323} with diff file ISSM-18630-18631.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/petsc/install-3.5-win7.sh\\
+Export determination: 6. \\
+Rationale: BUG: updating installation scrip with new PETSc options\\
+\vspace{3em}
+
+\noindent \textbf{Change \#324} with diff file ISSM-18631-18632.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-linux64-static.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-linux64.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-win7.sh\\
+Export determination: 6. \\
+Rationale: CHG: upgrading to PETSc 5.2\\
+\vspace{3em}
+
+\noindent \textbf{Change \#325} with diff file ISSM-18632-18633.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/petsc/install-3.5-win7.sh\\
+Export determination: 6. \\
+Rationale: CHG: include petsc fix\\
+\vspace{3em}
+
+\noindent \textbf{Change \#326} with diff file ISSM-18633-18634.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h\\
+Export determination: 6. \\
+Rationale: CHG: fixing hydrological transfer in DC\\
+\vspace{3em}
+
+\noindent \textbf{Change \#327} with diff file ISSM-18634-18635.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/windows\\
+Export determination: 6. \\
+Rationale: CHG: testing without metis\\
+\vspace{3em}
+
+\noindent \textbf{Change \#328} with diff file ISSM-18635-18636.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/jenkins.sh M /issm/trunk-jpl/jenkins/windows\\
+Export determination: 6. \\
+Rationale: CHG: trying to fix windows\\
+\vspace{3em}
+
+\noindent \textbf{Change \#329} with diff file ISSM-18636-18637.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/jenkins.sh\\
+Export determination: 6. \\
+Rationale: CHG: trying to fix windows\\
+\vspace{3em}
+
+\noindent \textbf{Change \#330} with diff file ISSM-18637-18638.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/jenkins.sh\\
+Export determination: 6. \\
+Rationale: CHG: trying to fix windows\\
+\vspace{3em}
+
+\noindent \textbf{Change \#331} with diff file ISSM-18638-18639.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/jenkins.sh\\
+Export determination: 6. \\
+Rationale: CHG: trying to fix windows\\
+\vspace{3em}
+
+\noindent \textbf{Change \#332} with diff file ISSM-18639-18640.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/windows\\
+Export determination: 6. \\
+Rationale: CHG: trying to fix windows\\
+\vspace{3em}
+
+\noindent \textbf{Change \#333} with diff file ISSM-18640-18641.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/jenkins.sh\\
+Export determination: 6. \\
+Rationale: CHG: fixing wait command\\
+\vspace{3em}
+
+\noindent \textbf{Change \#334} with diff file ISSM-18641-18642.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h\\
+Export determination: 6. \\
+Rationale: CHG: cleaning print\\
+\vspace{3em}
+
+\noindent \textbf{Change \#335} with diff file ISSM-18642-18643.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/issm\_options.m4\\
+Export determination: 6. \\
+Rationale: CHG: trying to force mes extension\\
+\vspace{3em}
+
+\noindent \textbf{Change \#336} with diff file ISSM-18643-18644.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG:syntax\\
+\vspace{3em}
+
+\noindent \textbf{Change \#337} with diff file ISSM-18644-18645.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/windows\\
+Export determination: 6. \\
+Rationale: CHG: trynig static compile\\
+\vspace{3em}
+
+\noindent \textbf{Change \#338} with diff file ISSM-18645-18646.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG:fixing transfer in DC\\
+\vspace{3em}
+
+\noindent \textbf{Change \#339} with diff file ISSM-18646-18647.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test3300.m\\
+Export determination: 6. \\
+Rationale: CHG: Fixed\\
+\vspace{3em}
+
+\noindent \textbf{Change \#340} with diff file ISSM-18647-18648.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/checkplotoptions.py\\
+Export determination: 6. \\
+Rationale: BUG: fixed python indexing for expdisp\\
+\vspace{3em}
+
+\noindent \textbf{Change \#341} with diff file ISSM-18648-18649.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/shared/FSanalyticals/fsanalyticals.cpp\\
+Export determination: 6. \\
+Rationale: CHG: last analytical functions\\
+\vspace{3em}
+
+\noindent \textbf{Change \#342} with diff file ISSM-18649-18650.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/mask.m M /issm/trunk-jpl/src/m/classes/mask.py\\
+Export determination: 6. \\
+Rationale: NEW: added check consistency of front (not all vertices on the front)\\
+\vspace{3em}
+
+\noindent \textbf{Change \#343} with diff file ISSM-18650-18651.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/cores/controlm1qn3\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: trying to fix balancethickness2\\
+\vspace{3em}
+
+\noindent \textbf{Change \#344} with diff file ISSM-18651-18652.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/controlvalidation\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: fixing gradient test for adimensionalization\\
+\vspace{3em}
+
+\noindent \textbf{Change \#345} with diff file ISSM-18652-18653.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/mask.py M /issm/trunk-jpl/src/m/classes/stressbalance.m\\
+Export determination: 6. \\
+Rationale: BUG: fixed mask consistency check\\
+\vspace{3em}
+
+\noindent \textbf{Change \#346} with diff file ISSM-18653-18654.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/SystemMatricesx/SystemMatricesx.cpp\\
+Export determination: 6. \\
+Rationale: CHG: check for penalty only once for small speed up\\
+\vspace{3em}
+
+\noindent \textbf{Change \#347} with diff file ISSM-18654-18655.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_la.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed augmentation for non linear case\\
+\vspace{3em}
+
+\noindent \textbf{Change \#348} with diff file ISSM-18655-18656.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/Archives/Archive701.nc M /issm/trunk-jpl/test/Archives/Archive702.nc\\
+Export determination: 6. \\
+Rationale: CHG: updated archive for augmentation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#349} with diff file ISSM-18656-18657.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: missing break in enthalpy cases\\
+\vspace{3em}
+
+\noindent \textbf{Change \#350} with diff file ISSM-18657-18658.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/exp/expdisp.m\\
+Export determination: 6. \\
+Rationale: CHG: title should be an option\\
+\vspace{3em}
+
+\noindent \textbf{Change \#351} with diff file ISSM-18658-18659.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/exp/expdisp.m\\
+Export determination: 6. \\
+Rationale: CHG: title is an option for point plots also\\
+\vspace{3em}
+
+\noindent \textbf{Change \#352} with diff file ISSM-18659-18660.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.h\\
+Export determination: 6. \\
+Rationale: BUG: fixed spc of basal conditions using a vector\\
+\vspace{3em}
+
+\noindent \textbf{Change \#353} with diff file ISSM-18660-18661.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/exp/expdisp.m M /issm/trunk-jpl/src/m/plot/applyoptions.m\\
+Export determination: 6. \\
+Rationale: CHG: expdisp now has options like every other functions in issm\\
+\vspace{3em}
+
+\noindent \textbf{Change \#354} with diff file ISSM-18661-18662.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/Archives/Archive431.nc M /issm/trunk-jpl/test/NightlyRun/test431.m M /issm/trunk-jpl/test/NightlyRun/test431.py M /issm/trunk-jpl/test/NightlyRun/test432.m M /issm/trunk-jpl/test/NightlyRun/test432.py\\
+Export determination: 6. \\
+Rationale: CHG: updated archives and tolerances\\
+\vspace{3em}
+
+\noindent \textbf{Change \#355} with diff file ISSM-18662-18663.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added new Enums\\
+\vspace{3em}
+
+\noindent \textbf{Change \#356} with diff file ISSM-18663-18664.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py\\
+Export determination: 6. \\
+Rationale: CHG: added new Enums\\
+\vspace{3em}
+
+\noindent \textbf{Change \#357} with diff file ISSM-18664-18665.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/enum/StrainRateparallelEnum.m A /issm/trunk-jpl/src/m/enum/StrainRateperpendicularEnum.m\\
+Export determination: 6. \\
+Rationale: CHG: added new Enums\\
+\vspace{3em}
+
+\noindent \textbf{Change \#358} with diff file ISSM-18665-18666.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed problem with gauss points in enthalpy Pvector ice sheet\\
+\vspace{3em}
+
+\noindent \textbf{Change \#359} with diff file ISSM-18666-18667.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/Archives/Archive325.nc M /issm/trunk-jpl/test/Archives/Archive326.nc M /issm/trunk-jpl/test/Archives/Archive327.nc M /issm/trunk-jpl/test/Archives/Archive431.nc M /issm/trunk-jpl/test/Archives/Archive432.nc M /issm/trunk-jpl/test/Archives/Archive436.nc M /issm/trunk-jpl/test/Archives/Archive437.nc M /issm/trunk-jpl/test/Archives/Archive803.nc M /issm/trunk-jpl/test/Archives/Archive805.nc M /issm/trunk-jpl/test/NightlyRun/test437.m\\
+Export determination: 6. \\
+Rationale: CHG: updated archives for latest enthalpy change\\
+\vspace{3em}
+
+\noindent \textbf{Change \#360} with diff file ISSM-18667-18668.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: For computation of basal melting rate, use enthalpypicard for steady state, if not converged yet. Update Enthalpy and water column only in case of transient runs.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#361} with diff file ISSM-18668-18669.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/taoinversion.m\\
+Export determination: 6. \\
+Rationale: CHG: added surface\_obs to tao\\
+\vspace{3em}
+
+\noindent \textbf{Change \#362} with diff file ISSM-18669-18670.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/taoinversion.m\\
+Export determination: 6. \\
+Rationale: CHG: updated default optimizer\\
+\vspace{3em}
+
+\noindent \textbf{Change \#363} with diff file ISSM-18670-18671.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/wrappers/IssmConfig/IssmConfig.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added PETSC\_MINOR\\
+\vspace{3em}
+
+\noindent \textbf{Change \#364} with diff file ISSM-18671-18672.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/taoinversion.m\\
+Export determination: 6. \\
+Rationale: CHG: check petsc version to check what algorithm should be used\\
+\vspace{3em}
+
+\noindent \textbf{Change \#365} with diff file ISSM-18672-18673.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/taoinversion.m\\
+Export determination: 6. \\
+Rationale: CHG: minor\\
+\vspace{3em}
+
+\noindent \textbf{Change \#366} with diff file ISSM-18673-18674.diff: \\
+Function name: \\
+A /issm/trunk-jpl/externalpackages/mpich/install-3.0-macosx64-nothreads.sh\\
+Export determination: 6. \\
+Rationale: no-threads option needed to compile mpich with Yosemite https://issm.ess.uci.edu/forum/viewtopic.php?f=10\&t=49\\
+\vspace{3em}
+
+\noindent \textbf{Change \#367} with diff file ISSM-18674-18675.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp\\
+Export determination: 6. \\
+Rationale: CHG: moved analysis to be supported in FemModel\\
+\vspace{3em}
+
+\noindent \textbf{Change \#368} with diff file ISSM-18675-18676.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp\\
+Export determination: 6. \\
+Rationale: CHG: finished cleaning of analysis to be moved in FemModel\\
+\vspace{3em}
+
+\noindent \textbf{Change \#369} with diff file ISSM-18676-18677.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp\\
+Export determination: 6. \\
+Rationale: CHG: only take necessary observations in inversions\\
+\vspace{3em}
+
+\noindent \textbf{Change \#370} with diff file ISSM-18677-18678.diff: \\
+Function name: \\
+A /issm/trunk-jpl/test/Archives/Archive340.nc A /issm/trunk-jpl/test/Archives/Archive341.nc M /issm/trunk-jpl/test/NightlyRun/IdToName.m A /issm/trunk-jpl/test/NightlyRun/test340.m A /issm/trunk-jpl/test/NightlyRun/test341.m\\
+Export determination: 6. \\
+Rationale: NEW: added two tests in nightly runs for tao and m1qn3\\
+\vspace{3em}
+
+\noindent \textbf{Change \#371} with diff file ISSM-18678-18679.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp\\
+Export determination: 6. \\
+Rationale: CHG: removed default and added surface obs for one of the cost functions\\
+\vspace{3em}
+
+\noindent \textbf{Change \#372} with diff file ISSM-18679-18680.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/issm\_options.m4\\
+Export determination: 6. \\
+Rationale: CHG: force linker to build dll\\
+\vspace{3em}
+
+\noindent \textbf{Change \#373} with diff file ISSM-18680-18681.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/issm\_options.m4\\
+Export determination: 6. \\
+Rationale: CHG: force linker to build dll\\
+\vspace{3em}
+
+\noindent \textbf{Change \#374} with diff file ISSM-18681-18682.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/issm\_options.m4\\
+Export determination: 6. \\
+Rationale: CHG: tryin -LD\\
+\vspace{3em}
+
+\noindent \textbf{Change \#375} with diff file ISSM-18682-18683.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/imac-012301-gil M /issm/trunk-jpl/jenkins/linux64\_murdo M /issm/trunk-jpl/test/NightlyRun/test340.m\\
+Export determination: 6. \\
+Rationale: CHG: fixing jenkins and NR for tao and m1qn3 tests\\
+\vspace{3em}
+
+\noindent \textbf{Change \#376} with diff file ISSM-18683-18684.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/imac-012301-gil M /issm/trunk-jpl/jenkins/linux64\_murdo\\
+Export determination: 6. \\
+Rationale: BUG: forgot to add m1qn3 in external packages\\
+\vspace{3em}
+
+\noindent \textbf{Change \#377} with diff file ISSM-18684-18685.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/imac-012301-gil M /issm/trunk-jpl/test/NightlyRun/test340.m\\
+Export determination: 6. \\
+Rationale: BUG: tao algorithm name for different petsc versions\\
+\vspace{3em}
+
+\noindent \textbf{Change \#378} with diff file ISSM-18685-18686.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/issm\_options.m4\\
+Export determination: 6. \\
+Rationale: CHG: reverting to /LD\\
+\vspace{3em}
+
+\noindent \textbf{Change \#379} with diff file ISSM-18686-18687.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/imac-012301-gil\\
+Export determination: 6. \\
+Rationale: BUG: minor typo\\
+\vspace{3em}
+
+\noindent \textbf{Change \#380} with diff file ISSM-18687-18688.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/taoinversion.m M /issm/trunk-jpl/test/NightlyRun/test340.m\\
+Export determination: 6. \\
+Rationale: CHG: cleaner to put algorithm verion in default parameters\\
+\vspace{3em}
+
+\noindent \textbf{Change \#381} with diff file ISSM-18688-18689.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/clusters/discover.m\\
+Export determination: 6. \\
+Rationale: CHG: remove general small from discover\\
+\vspace{3em}
+
+\noindent \textbf{Change \#382} with diff file ISSM-18689-18690.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: Modification of the transfer mechanism\\
+\vspace{3em}
+
+\noindent \textbf{Change \#383} with diff file ISSM-18690-18691.diff: \\
+Function name: \\
+A /issm/trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh\\
+Export determination: 6. \\
+Rationale: NEW: added install-3.5-hpc.sh\\
+\vspace{3em}
+
+\noindent \textbf{Change \#384} with diff file ISSM-18691-18692.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/imac-012301-gil\\
+Export determination: 6. \\
+Rationale: CHG: moving jenkins imac configuration to petsc 3.5\\
+\vspace{3em}
+
+\noindent \textbf{Change \#385} with diff file ISSM-18692-18693.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh\\
+Export determination: 6. \\
+Rationale: CHG: fixed\\
+\vspace{3em}
+
+\noindent \textbf{Change \#386} with diff file ISSM-18693-18694.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh\\
+Export determination: 6. \\
+Rationale: CHG: fixed\\
+\vspace{3em}
+
+\noindent \textbf{Change \#387} with diff file ISSM-18694-18695.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh\\
+Export determination: 6. \\
+Rationale: CHG: use openmpi instead\\
+\vspace{3em}
+
+\noindent \textbf{Change \#388} with diff file ISSM-18695-18696.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/classes/clusters/hpc.m\\
+Export determination: 6. \\
+Rationale: CHG: added hpc.m cluster\\
+\vspace{3em}
+
+\noindent \textbf{Change \#389} with diff file ISSM-18696-18697.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: no need to change enthalpy at base to compute basal melting\\
+\vspace{3em}
+
+\noindent \textbf{Change \#390} with diff file ISSM-18697-18698.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/imac-012301-gil\\
+Export determination: 6. \\
+Rationale: CHG: reverted back imac configuration to petsc 3.4\\
+\vspace{3em}
+
+\noindent \textbf{Change \#391} with diff file ISSM-18698-18699.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/imac-012301-gil\\
+Export determination: 6. \\
+Rationale: BUG: wrong tao installation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#392} with diff file ISSM-18699-18700.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.h M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/Penta.h M /issm/trunk-jpl/src/c/classes/Elements/Seg.h M /issm/trunk-jpl/src/c/classes/Elements/Tetra.h M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.h\\
+Export determination: 6. \\
+Rationale: CHG: added StrainRateparallel and StrainRateperpendicular\\
+\vspace{3em}
+
+\noindent \textbf{Change \#393} with diff file ISSM-18700-18701.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/Archives/Archive325.nc M /issm/trunk-jpl/test/Archives/Archive431.nc M /issm/trunk-jpl/test/Archives/Archive432.nc M /issm/trunk-jpl/test/Archives/Archive436.nc\\
+Export determination: 6. \\
+Rationale: CHG: updated archives enthalpy\\
+\vspace{3em}
+
+\noindent \textbf{Change \#394} with diff file ISSM-18701-18702.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test432.m\\
+Export determination: 6. \\
+Rationale: CHG: minor tolerances\\
+\vspace{3em}
+
+\noindent \textbf{Change \#395} with diff file ISSM-18702-18703.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/clusters/hpc.m\\
+Export determination: 6. \\
+Rationale: CHG: added 2 more queues\\
+\vspace{3em}
+
+\noindent \textbf{Change \#396} with diff file ISSM-18703-18704.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/clusters/discover.m\\
+Export determination: 6. \\
+Rationale: CHG: don't specify general queue\\
+\vspace{3em}
+
+\noindent \textbf{Change \#397} with diff file ISSM-18704-18705.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test340.m\\
+Export determination: 6. \\
+Rationale: CHG: minor tolerances for jenkins\\
+\vspace{3em}
+
+\noindent \textbf{Change \#398} with diff file ISSM-18705-18706.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_hydro\_nonlinear.cpp\\
+Export determination: 6. \\
+Rationale: NEW; adding a zigzag lock to the EPL activity\\
+\vspace{3em}
+
+\noindent \textbf{Change \#399} with diff file ISSM-18706-18707.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/enum/ElementActiveCounterEnum.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py\\
+Export determination: 6. \\
+Rationale: NEW; adding a zigzag lock to the EPL activity\\
+\vspace{3em}
+
+\noindent \textbf{Change \#400} with diff file ISSM-18707-18708.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG:fixing bad setParam\\
+\vspace{3em}
+
+\noindent \textbf{Change \#401} with diff file ISSM-18708-18709.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test431.m M /issm/trunk-jpl/test/NightlyRun/test432.m M /issm/trunk-jpl/test/NightlyRun/test701.m\\
+Export determination: 6. \\
+Rationale: CHG: minor tolerances\\
+\vspace{3em}
+
+\noindent \textbf{Change \#402} with diff file ISSM-18709-18710.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG:fixing segmentation faults\\
+\vspace{3em}
+
+\noindent \textbf{Change \#403} with diff file ISSM-18710-18711.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/hydrologydc.py M /issm/trunk-jpl/src/m/classes/initialization.py M /issm/trunk-jpl/src/m/classes/transient.py\\
+Export determination: 6. \\
+Rationale: CHG: cosmetic changes\\
+\vspace{3em}
+
+\noindent \textbf{Change \#404} with diff file ISSM-18711-18712.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/clusters/pfe.m\\
+Export determination: 6. \\
+Rationale: CHG: added valgrind\\
+\vspace{3em}
+
+\noindent \textbf{Change \#405} with diff file ISSM-18712-18713.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/issm\_options.m4\\
+Export determination: 6. \\
+Rationale: CHG: trying -Wl,/LD to compile dll on windows\\
+\vspace{3em}
+
+\noindent \textbf{Change \#406} with diff file ISSM-18713-18714.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixing hydro\\
+\vspace{3em}
+
+\noindent \textbf{Change \#407} with diff file ISSM-18714-18715.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/controlm1qn3\_core.cpp\\
+Export determination: 6. \\
+Rationale: NEW: enable multi-parametric optimization with m1qn3\\
+\vspace{3em}
+
+\noindent \textbf{Change \#408} with diff file ISSM-18715-18716.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/cores/balancethickness2\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: last commit of balancethickness2 as we know it\\
+\vspace{3em}
+
+\noindent \textbf{Change \#409} with diff file ISSM-18716-18717.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/thermal.m\\
+Export determination: 6. \\
+Rationale: CHG: allow spctemperature to be at Tpmp for enthalpy formulation. minor description change.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#410} with diff file ISSM-18717-18718.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp M /issm/trunk-jpl/src/c/classes/Materials/Matpar.h M /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp M /issm/trunk-jpl/src/c/shared/Elements/ComputeDelta18oTemperaturePrecipitation.cpp M /issm/trunk-jpl/src/c/shared/Elements/PddSurfaceMassBalance.cpp M /issm/trunk-jpl/src/c/shared/Elements/elements.h M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/classes/SMBpdd.m M /issm/trunk-jpl/src/m/classes/clusters/acenet.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/SurfaceforcingsPfacEnum.m A /issm/trunk-jpl/src/m/enum/SurfaceforcingsRlapsEnum.m A /issm/trunk-jpl/src/m/enum/SurfaceforcingsRlapslgmEnum.m A /issm/trunk-jpl/src/m/enum/SurfaceforcingsS0tEnum.m A /issm/trunk-jpl/src/m/enum/SurfaceforcingsSealevEnum.m A /issm/trunk-jpl/src/m/enum/SurfaceforcingsTdiffEnum.m\\
+Export determination: 6. \\
+Rationale: NEW: modified lapse rate to PDD scheme\\
+\vspace{3em}
+
+\noindent \textbf{Change \#411} with diff file ISSM-18718-18719.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp\\
+Export determination: 6. \\
+Rationale: CHG: fixed Enums\\
+\vspace{3em}
+
+\noindent \textbf{Change \#412} with diff file ISSM-18719-18720.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_hydro\_nonlinear.cpp\\
+Export determination: 6. \\
+Rationale: NEW:shfting hydrology lock to the nodes\\
+\vspace{3em}
+
+\noindent \textbf{Change \#413} with diff file ISSM-18720-18721.diff: \\
+Function name: \\
+D /issm/trunk-jpl/src/m/enum/ElementActiveCounterEnum.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/EplZigZagCounterEnum.m\\
+Export determination: 6. \\
+Rationale: NEW:shfting hydrology lock to the nodes\\
+\vspace{3em}
+
+\noindent \textbf{Change \#414} with diff file ISSM-18721-18722.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp\\
+Export determination: 6. \\
+Rationale: BUG:cleaning printf\\
+\vspace{3em}
+
+\noindent \textbf{Change \#415} with diff file ISSM-18722-18723.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: minor fix\\
+\vspace{3em}
+
+\noindent \textbf{Change \#416} with diff file ISSM-18723-18724.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: minor fix\\
+\vspace{3em}
+
+\noindent \textbf{Change \#417} with diff file ISSM-18724-18725.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/SMBpdd.m M /issm/trunk-jpl/test/NightlyRun/test236.m M /issm/trunk-jpl/test/NightlyRun/test237.m\\
+Export determination: 6. \\
+Rationale: CHG: added values and additional test consistency for PDD scheme new variables\\
+\vspace{3em}
+
+\noindent \textbf{Change \#418} with diff file ISSM-18725-18726.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_hydro\_nonlinear.cpp\\
+Export determination: 6. \\
+Rationale: BUG:fixing factorisation issues\\
+\vspace{3em}
+
+\noindent \textbf{Change \#419} with diff file ISSM-18726-18727.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_hydro\_nonlinear.cpp\\
+Export determination: 6. \\
+Rationale: BUG: modification in solutionsequence flowpath\\
+\vspace{3em}
+
+\noindent \textbf{Change \#420} with diff file ISSM-18727-18728.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp\\
+Export determination: 6. \\
+Rationale: CHG: modification in mask handling\\
+\vspace{3em}
+
+\noindent \textbf{Change \#421} with diff file ISSM-18728-18729.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/SMBpdd.m M /issm/trunk-jpl/src/m/classes/SMBpdd.py\\
+Export determination: 6. \\
+Rationale: NEW: implemented SMBpdd changes in python\\
+\vspace{3em}
+
+\noindent \textbf{Change \#422} with diff file ISSM-18729-18730.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/MeltingAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: simplifying what Melting Analysis needs\\
+\vspace{3em}
+
+\noindent \textbf{Change \#423} with diff file ISSM-18730-18731.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed if statement\\
+\vspace{3em}
+
+\noindent \textbf{Change \#424} with diff file ISSM-18731-18732.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: removed stabilization hardcoding\\
+\vspace{3em}
+
+\noindent \textbf{Change \#425} with diff file ISSM-18732-18733.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp M /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp M /issm/trunk-jpl/src/c/classes/Loads/Friction.h M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp A /issm/trunk-jpl/src/m/classes/frictiontemp.m M /issm/trunk-jpl/src/m/classes/groundingline.m M /issm/trunk-jpl/src/m/classes/initialization.m M /issm/trunk-jpl/src/m/classes/initialization.py M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/FrictionGammaEnum.m\\
+Export determination: 6. \\
+Rationale: NEW: added new friction law based on Tpmp, request from martin.rueckamp@awi.de\\
+\vspace{3em}
+
+\noindent \textbf{Change \#426} with diff file ISSM-18733-18734.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: do hard code stabilization for now\\
+\vspace{3em}
+
+\noindent \textbf{Change \#427} with diff file ISSM-18734-18735.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test236.py M /issm/trunk-jpl/test/NightlyRun/test237.py\\
+Export determination: 6. \\
+Rationale: CHG: forgot to update tests SMBpdd in python\\
+\vspace{3em}
+
+\noindent \textbf{Change \#428} with diff file ISSM-18735-18736.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/SMBpdd.py\\
+Export determination: 6. \\
+Rationale: BUG: trying to fix python class\\
+\vspace{3em}
+
+\noindent \textbf{Change \#429} with diff file ISSM-18736-18737.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.h M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/Penta.h M /issm/trunk-jpl/src/c/classes/Elements/Seg.h M /issm/trunk-jpl/src/c/classes/Elements/Tetra.h M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.h M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/classes/FemModel.h M /issm/trunk-jpl/src/c/cores/transient\_core.cpp M /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp M /issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added CalvingRate computation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#430} with diff file ISSM-18737-18738.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/enum/CalvingratexAverageEnum.m A /issm/trunk-jpl/src/m/enum/CalvingratexEnum.m A /issm/trunk-jpl/src/m/enum/CalvingrateyAverageEnum.m A /issm/trunk-jpl/src/m/enum/CalvingrateyEnum.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py\\
+Export determination: 6. \\
+Rationale: CHG: added new Enums\\
+\vspace{3em}
+
+\noindent \textbf{Change \#431} with diff file ISSM-18738-18739.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/boundaryconditions/SetMarineIceSheetBC.m M /issm/trunk-jpl/src/m/classes/clusters/hpc.m M /issm/trunk-jpl/src/m/classes/masstransport.m M /issm/trunk-jpl/src/m/classes/model.m M /issm/trunk-jpl/src/m/os/oshostname.m M /issm/trunk-jpl/src/m/solve/waitonlock.m\\
+Export determination: 6. \\
+Rationale: CHG: added parameters for the GUI : iscalvingrate\\
+\vspace{3em}
+
+\noindent \textbf{Change \#432} with diff file ISSM-18739-18740.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/boundaryconditions/SetMarineIceSheetBC.m M /issm/trunk-jpl/src/m/classes/clusters/hpc.m M /issm/trunk-jpl/src/m/os/oshostname.m M /issm/trunk-jpl/src/m/solve/waitonlock.m\\
+Export determination: 6. \\
+Rationale: CHG: reverting Sylvester's commit\\
+\vspace{3em}
+
+\noindent \textbf{Change \#433} with diff file ISSM-18740-18741.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/masstransport.py\\
+Export determination: 6. \\
+Rationale: CHG: added parameters for the GUI : iscalvingrate\\
+\vspace{3em}
+
+\noindent \textbf{Change \#434} with diff file ISSM-18741-18742.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/masstransport.py\\
+Export determination: 6. \\
+Rationale: BUG: fixed bad syntax\\
+\vspace{3em}
+
+\noindent \textbf{Change \#435} with diff file ISSM-18742-18743.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: correct a mistake in case iscalvinrate=0\\
+\vspace{3em}
+
+\noindent \textbf{Change \#436} with diff file ISSM-18743-18744.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/enum/MasstransportIscalvingrateEnum.m A /issm/trunk-jpl/src/m/enum/MasstransportLevermannCalvingCoeffEnum.m\\
+Export determination: 6. \\
+Rationale: CHG: added new Enums\\
+\vspace{3em}
+
+\noindent \textbf{Change \#437} with diff file ISSM-18744-18745.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG : set back to default stabilization\\
+\vspace{3em}
+
+\noindent \textbf{Change \#438} with diff file ISSM-18745-18746.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: Now applying exponential heavyside approximation to the two forks of transfer term computation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#439} with diff file ISSM-18746-18747.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/paraview/enveloppeVTK.m\\
+Export determination: 6. \\
+Rationale: CHG: changing naming of files\\
+\vspace{3em}
+
+\noindent \textbf{Change \#440} with diff file ISSM-18747-18748.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp\\
+Export determination: 6. \\
+Rationale: NEW: Adding eplflip lock specific Enum\\
+\vspace{3em}
+
+\noindent \textbf{Change \#441} with diff file ISSM-18748-18749.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/hydrologydc.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/HydrologydcEplflipLockEnum.m\\
+Export determination: 6. \\
+Rationale: NEW: Adding eplflip lock specific Enum\\
+\vspace{3em}
+
+\noindent \textbf{Change \#442} with diff file ISSM-18749-18750.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/hydrologydc.py\\
+Export determination: 6. \\
+Rationale: NEW: Adding eplflip lock specific Enum\\
+\vspace{3em}
+
+\noindent \textbf{Change \#443} with diff file ISSM-18750-18751.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/contrib/gravity/code\_densite A /issm/trunk-jpl/src/m/contrib/gravity/code\_densite/Makefile A /issm/trunk-jpl/src/m/contrib/gravity/code\_densite/density\_rock.cpp A /issm/trunk-jpl/src/m/contrib/gravity/code\_densite/density\_rock\_uneven.cpp\\
+Export determination: 6. \\
+Rationale: NEW: rock density calculation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#444} with diff file ISSM-18751-18752.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/contrib/gravity/code\_inversion A /issm/trunk-jpl/src/m/contrib/gravity/code\_inversion/vfsa\_mpi.cpp A /issm/trunk-jpl/src/m/contrib/gravity/code\_inversion/vfsa\_mpi\_uneven.cpp\\
+Export determination: 6. \\
+Rationale: NEW: final inversion code\\
+\vspace{3em}
+
+\noindent \textbf{Change \#445} with diff file ISSM-18752-18753.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixing parameter declaration\\
+\vspace{3em}
+
+\noindent \textbf{Change \#446} with diff file ISSM-18753-18754.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG:Fixxing Flip lock input\\
+\vspace{3em}
+
+\noindent \textbf{Change \#447} with diff file ISSM-18754-18755.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/thermal.m\\
+Export determination: 6. \\
+Rationale: CHG: minor\\
+\vspace{3em}
+
+\noindent \textbf{Change \#448} with diff file ISSM-18755-18756.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/clusters/pfe.m\\
+Export determination: 6. \\
+Rationale: CHG: minor no more nehalem nodes on pleiades\\
+\vspace{3em}
+
+\noindent \textbf{Change \#449} with diff file ISSM-18756-18757.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/masstransport.py\\
+Export determination: 6. \\
+Rationale: CHG: added calving class\\
+\vspace{3em}
+
+\noindent \textbf{Change \#450} with diff file ISSM-18757-18758.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/classes/calving.m A /issm/trunk-jpl/src/m/classes/calving.py A /issm/trunk-jpl/src/m/classes/calvinglevermann.m M /issm/trunk-jpl/src/m/classes/masstransport.m M /issm/trunk-jpl/src/m/classes/model.m M /issm/trunk-jpl/src/m/classes/model.py M /issm/trunk-jpl/src/m/classes/transient.m\\
+Export determination: 6. \\
+Rationale: CHG: added calving class\\
+\vspace{3em}
+
+\noindent \textbf{Change \#451} with diff file ISSM-18758-18759.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/cores/transient\_core.cpp M /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added calving class\\
+\vspace{3em}
+
+\noindent \textbf{Change \#452} with diff file ISSM-18759-18760.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/enum/CalvingCalvingrateEnum.m A /issm/trunk-jpl/src/m/enum/CalvingLawEnum.m A /issm/trunk-jpl/src/m/enum/CalvingLevermannEnum.m A /issm/trunk-jpl/src/m/enum/CalvingRequestedOutputsEnum.m A /issm/trunk-jpl/src/m/enum/CalvinglevermannCoeffEnum.m A /issm/trunk-jpl/src/m/enum/DefaultCalvingEnum.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py D /issm/trunk-jpl/src/m/enum/MasstransportCalvingrateEnum.m D /issm/trunk-jpl/src/m/enum/MasstransportIscalvingrateEnum.m D /issm/trunk-jpl/src/m/enum/MasstransportLevermannCalvingCoeffEnum.m A /issm/trunk-jpl/src/m/enum/TransientIscalvingEnum.m\\
+Export determination: 6. \\
+Rationale: CHG: new enums\\
+\vspace{3em}
+
+\noindent \textbf{Change \#453} with diff file ISSM-18760-18761.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test804.m M /issm/trunk-jpl/test/NightlyRun/test805.m M /issm/trunk-jpl/test/Par/ValleyGlacierShelf.par\\
+Export determination: 6. \\
+Rationale: CHG : modified tests due to new class Calving\\
+\vspace{3em}
+
+\noindent \textbf{Change \#454} with diff file ISSM-18761-18762.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/Par/SquareSheetConstrained.par M /issm/trunk-jpl/test/Par/SquareSheetConstrained.py\\
+Export determination: 6. \\
+Rationale: BUG: calving rate now in md.calving\\
+\vspace{3em}
+
+\noindent \textbf{Change \#455} with diff file ISSM-18762-18763.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test804.py M /issm/trunk-jpl/test/NightlyRun/test805.py M /issm/trunk-jpl/test/Par/ValleyGlacierShelf.py\\
+Export determination: 6. \\
+Rationale: CHG : modified python tests due to new class Calving\\
+\vspace{3em}
+
+\noindent \textbf{Change \#456} with diff file ISSM-18763-18764.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/transient.py\\
+Export determination: 6. \\
+Rationale: CHG: updated transient.py with iscalving\\
+\vspace{3em}
+
+\noindent \textbf{Change \#457} with diff file ISSM-18764-18765.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed from delete, should be xDelete\\
+\vspace{3em}
+
+\noindent \textbf{Change \#458} with diff file ISSM-18765-18766.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/Par/SquareSheetConstrained.py\\
+Export determination: 6. \\
+Rationale: BUG: md.claving not md.calvingrate\\
+\vspace{3em}
+
+\noindent \textbf{Change \#459} with diff file ISSM-18766-18767.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/calving.py M /issm/trunk-jpl/src/m/classes/calvinglevermann.m A /issm/trunk-jpl/src/m/classes/calvinglevermann.py M /issm/trunk-jpl/src/m/classes/model.py\\
+Export determination: 6. \\
+Rationale: CHG: fixed extrusion of calving parameters in python\\
+\vspace{3em}
+
+\noindent \textbf{Change \#460} with diff file ISSM-18767-18768.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test431.m M /issm/trunk-jpl/test/NightlyRun/test431.py M /issm/trunk-jpl/test/NightlyRun/test432.m M /issm/trunk-jpl/test/NightlyRun/test432.py M /issm/trunk-jpl/test/NightlyRun/test436.m\\
+Export determination: 6. \\
+Rationale: CHG: relaxed some tolerances\\
+\vspace{3em}
+
+\noindent \textbf{Change \#461} with diff file ISSM-18768-18769.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test340.m\\
+Export determination: 6. \\
+Rationale: CHG: relaxed tolerances\\
+\vspace{3em}
+
+\noindent \textbf{Change \#462} with diff file ISSM-18769-18770.diff: \\
+Function name: \\
+M /issm/trunk-jpl/packagers/ubuntu/package.sh\\
+Export determination: 6. \\
+Rationale: minor\\
+\vspace{3em}
+
+\noindent \textbf{Change \#463} with diff file ISSM-18770-18771.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp M /issm/trunk-jpl/src/c/classes/Loads/Friction.h A /issm/trunk-jpl/src/m/classes/frictionwaterlayer.m\\
+Export determination: 6. \\
+Rationale: NEW: starting to add new friction law with water layer\\
+\vspace{3em}
+
+\noindent \textbf{Change \#464} with diff file ISSM-18771-18772.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h M /issm/trunk-jpl/src/m/classes/inversion.m M /issm/trunk-jpl/src/m/classes/inversion.py\\
+Export determination: 6. \\
+Rationale: NEW: added L1L2 inversions (very similar to SSA)\\
+\vspace{3em}
+
+\noindent \textbf{Change \#465} with diff file ISSM-18772-18773.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp M /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/classes/frictionwaterlayer.m A /issm/trunk-jpl/test/Archives/Archive438.nc A /issm/trunk-jpl/test/Archives/Archive439.nc A /issm/trunk-jpl/test/NightlyRun/test438.m A /issm/trunk-jpl/test/NightlyRun/test439.m\\
+Export determination: 6. \\
+Rationale: NEW: added water layer friction law\\
+\vspace{3em}
+
+\noindent \textbf{Change \#466} with diff file ISSM-18773-18774.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/exp/exp\_to\_levelset.m\\
+Export determination: 6. \\
+Rationale: CHG: new routine to convert exp file to a levelset. Prototype.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#467} with diff file ISSM-18774-18775.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/FrictionWaterLayerEnum.m\\
+Export determination: 6. \\
+Rationale: BUG: forgot to commit new Enums\\
+\vspace{3em}
+
+\noindent \textbf{Change \#468} with diff file ISSM-18775-18776.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/frictionhydro.m M /issm/trunk-jpl/src/m/classes/frictionweertman.m M /issm/trunk-jpl/src/m/classes/hydrologydc.py M /issm/trunk-jpl/src/m/classes/model.m\\
+Export determination: 6. \\
+Rationale: Updating model to take into account new friction law's, adding md.calving creation if needed\\
+\vspace{3em}
+
+\noindent \textbf{Change \#469} with diff file ISSM-18776-18777.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp\\
+Export determination: 6. \\
+Rationale: CHG:correction in frictionhydro aw computation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#470} with diff file ISSM-18777-18778.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fix in friction select case for stressbalance\\
+\vspace{3em}
+
+\noindent \textbf{Change \#471} with diff file ISSM-18778-18779.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp M /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp\\
+Export determination: 6. \\
+Rationale: NEW:Adding FrictionEffectivPressureEnum\\
+\vspace{3em}
+
+\noindent \textbf{Change \#472} with diff file ISSM-18779-18780.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/frictionhydro.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/FrictionEffectivePressureEnum.m\\
+Export determination: 6. \\
+Rationale: NEW:Adding FrictionEffectivPressureEnum\\
+\vspace{3em}
+
+\noindent \textbf{Change \#473} with diff file ISSM-18780-18781.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed wrong weight in ThicknessAbsGradient\\
+\vspace{3em}
+
+\noindent \textbf{Change \#474} with diff file ISSM-18781-18782.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp\\
+Export determination: 6. \\
+Rationale: CHG:dealing with q exponent in friction hydro\\
+\vspace{3em}
+
+\noindent \textbf{Change \#475} with diff file ISSM-18782-18783.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/calvinglevermann.py M /issm/trunk-jpl/test/NightlyRun/IdToName.m M /issm/trunk-jpl/test/NightlyRun/IdToName.py A /issm/trunk-jpl/test/NightlyRun/test806.m A /issm/trunk-jpl/test/NightlyRun/test806.py\\
+Export determination: 6. \\
+Rationale: CHG : added test for calvinglevermann\\
+\vspace{3em}
+
+\noindent \textbf{Change \#476} with diff file ISSM-18783-18784.diff: \\
+Function name: \\
+A /issm/trunk-jpl/test/Archives/Archive806.nc M /issm/trunk-jpl/test/NightlyRun/test806.py\\
+Export determination: 6. \\
+Rationale: CHG : added archive for test 806\\
+\vspace{3em}
+
+\noindent \textbf{Change \#477} with diff file ISSM-18784-18785.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG : correct stabilization for calving\\
+\vspace{3em}
+
+\noindent \textbf{Change \#478} with diff file ISSM-18785-18786.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/issm\_options.m4\\
+Export determination: 6. \\
+Rationale: CHG: remove extra - sign from dakota include\\
+\vspace{3em}
+
+\noindent \textbf{Change \#479} with diff file ISSM-18786-18787.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/Makefile.am M /issm/trunk-jpl/src/c/classes/Elements/Element.h M /issm/trunk-jpl/src/c/classes/Elements/Penta.h M /issm/trunk-jpl/src/c/classes/Elements/Seg.h M /issm/trunk-jpl/src/c/classes/Elements/Tetra.h M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.h A /issm/trunk-jpl/src/c/classes/Masscon.h M /issm/trunk-jpl/src/c/classes/classes.h M /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp A /issm/trunk-jpl/src/m/classes/masscon.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/MassconEnum.m A /issm/trunk-jpl/src/m/enum/MassconLevelsetEnum.m A /issm/trunk-jpl/src/m/enum/MassconNameEnum.m M /issm/trunk-jpl/src/m/exp/exp\_to\_levelset.m M /issm/trunk-jpl/src/m/plot/applyoptions.m\\
+Export determination: 6. \\
+Rationale: NEW: introduced new Masscon output definition, relying on a levelset definition of the masscon shape.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#480} with diff file ISSM-18787-18788.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/clusters/pfe.m\\
+Export determination: 6. \\
+Rationale: NEW: starting to add ocean queuing script\\
+\vspace{3em}
+
+\noindent \textbf{Change \#481} with diff file ISSM-18788-18789.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/MeshProfileIntersectionx/MeshProfileIntersectionx.cpp M /issm/trunk-jpl/src/c/modules/MeshProfileIntersectionx/MeshProfileIntersectionx.h\\
+Export determination: 6. \\
+Rationale: CHG: improvements to this module, this could seriously impact some of the nightly runs dealing with UQ, so to be checked.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#482} with diff file ISSM-18789-18790.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/Archives/Archive804.nc M /issm/trunk-jpl/test/Archives/Archive805.nc\\
+Export determination: 6. \\
+Rationale: CHG : modified archives for corrected stabilization\\
+\vspace{3em}
+
+\noindent \textbf{Change \#483} with diff file ISSM-18790-18791.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/clusters/pfe.m\\
+Export determination: 6. \\
+Rationale: BUG: finished version of ocean script for pleiades\\
+\vspace{3em}
+
+\noindent \textbf{Change \#484} with diff file ISSM-18791-18792.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test806.py\\
+Export determination: 6. \\
+Rationale: CHG : repair test 806\\
+\vspace{3em}
+
+\noindent \textbf{Change \#485} with diff file ISSM-18792-18793.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/calvinglevermann.py M /issm/trunk-jpl/test/NightlyRun/test806.py\\
+Export determination: 6. \\
+Rationale: BUG: fixed test806, still some ERRORs\\
+\vspace{3em}
+
+\noindent \textbf{Change \#486} with diff file ISSM-18793-18794.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test806.py\\
+Export determination: 6. \\
+Rationale: BUG: fixed wrong mask\\
+\vspace{3em}
+
+\noindent \textbf{Change \#487} with diff file ISSM-18794-18795.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/ad\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: only tapestats if verbose ad is on.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#488} with diff file ISSM-18795-18796.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/frictionweertman.m\\
+Export determination: 6. \\
+Rationale: BUG: field name is friction\\
+\vspace{3em}
+
+\noindent \textbf{Change \#489} with diff file ISSM-18796-18797.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/paraview/exportVTK.py\\
+Export determination: 6. \\
+Rationale: BUG:ReWriting export paraview in python\\
+\vspace{3em}
+
+\noindent \textbf{Change \#490} with diff file ISSM-18797-18798.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp\\
+Export determination: 6. \\
+Rationale: CHG: Adding friction law and clean up\\
+\vspace{3em}
+
+\noindent \textbf{Change \#491} with diff file ISSM-18798-18799.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/model.m\\
+Export determination: 6. \\
+Rationale: CHG: Adding friction law and clean up\\
+\vspace{3em}
+
+\noindent \textbf{Change \#492} with diff file ISSM-18799-18800.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/frictionweertman.m\\
+Export determination: 6. \\
+Rationale: CHG: fixed display\\
+\vspace{3em}
+
+\noindent \textbf{Change \#493} with diff file ISSM-18800-18801.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/frictionweertman.m M /issm/trunk-jpl/src/m/classes/frictionweertman.py\\
+Export determination: 6. \\
+Rationale: CHG: bad diaplay\\
+\vspace{3em}
+
+\noindent \textbf{Change \#494} with diff file ISSM-18801-18802.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/issm\_options.m4 M /issm/trunk-jpl/src/c/Makefile.am A /issm/trunk-jpl/src/c/modules/CoordinateSystemTransformx A /issm/trunk-jpl/src/c/modules/CoordinateSystemTransformx/CoordinateSystemTransformx.cpp A /issm/trunk-jpl/src/c/modules/CoordinateSystemTransformx/CoordinateSystemTransformx.h M /issm/trunk-jpl/src/wrappers/matlab/Makefile.am M /issm/trunk-jpl/src/wrappers/python/Makefile.am\\
+Export determination: 6. \\
+Rationale: NEW: added CoordinateSystemTransformx module that converts coordinates using proj.4\\
+\vspace{3em}
+
+\noindent \textbf{Change \#495} with diff file ISSM-18802-18803.diff: \\
+Function name: \\
+D /issm/trunk-jpl/scripts/ol M /issm/trunk-jpl/scripts/ol.m\\
+Export determination: 6. \\
+Rationale: CHG: matlabified the ol script\\
+\vspace{3em}
+
+\noindent \textbf{Change \#496} with diff file ISSM-18803-18804.diff: \\
+Function name: \\
+A /issm/trunk-jpl/scripts/ol\\
+Export determination: 6. \\
+Rationale: CHG: adding ok back to the family\\
+\vspace{3em}
+
+\noindent \textbf{Change \#497} with diff file ISSM-18804-18805.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp M /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp M /issm/trunk-jpl/src/c/classes/Loads/Friction.h A /issm/trunk-jpl/src/m/classes/frictionweertmantemp.m\\
+Export determination: 6. \\
+Rationale: CHG: adding new sliding law for Kevin, Temperature dependent\\
+\vspace{3em}
+
+\noindent \textbf{Change \#498} with diff file ISSM-18805-18806.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp M /issm/trunk-jpl/test/Archives/Archive438.nc M /issm/trunk-jpl/test/Archives/Archive439.nc\\
+Export determination: 6. \\
+Rationale: CHG: improved water\_layer friction law\\
+\vspace{3em}
+
+\noindent \textbf{Change \#499} with diff file ISSM-18806-18807.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/IoModel.cpp\\
+Export determination: 6. \\
+Rationale: CHG: adding fetch multiple data for double vectors.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#500} with diff file ISSM-18807-18808.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/IoModel.h\\
+Export determination: 6. \\
+Rationale: BUG: forgot to declare function is header file\\
+\vspace{3em}
+
+\noindent \textbf{Change \#501} with diff file ISSM-18808-18809.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: do not load calving fields if iscalving=0\\
+\vspace{3em}
+
+\noindent \textbf{Change \#502} with diff file ISSM-18809-18810.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/netcdf/install.sh\\
+Export determination: 6. \\
+Rationale: NEW: use python 4.3.2 for Yosemite support\\
+\vspace{3em}
+
+\noindent \textbf{Change \#503} with diff file ISSM-18810-18811.diff: \\
+Function name: \\
+M /issm/trunk-jpl/etc/environment.sh\\
+Export determination: 6. \\
+Rationale: NEW: CURL package.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#504} with diff file ISSM-18811-18812.diff: \\
+Function name: \\
+A /issm/trunk-jpl/externalpackages/curl A /issm/trunk-jpl/externalpackages/curl/install-macosx64.sh\\
+Export determination: 6. \\
+Rationale: CHG: new external package curl.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#505} with diff file ISSM-18812-18813.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/IoModel.h A /issm/trunk-jpl/src/c/classes/Massconaxpby.h M /issm/trunk-jpl/src/c/classes/classes.h M /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp A /issm/trunk-jpl/src/m/classes/massconaxpby.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/MassconaxpbyAlphaEnum.m A /issm/trunk-jpl/src/m/enum/MassconaxpbyBetaEnum.m A /issm/trunk-jpl/src/m/enum/MassconaxpbyEnum.m A /issm/trunk-jpl/src/m/enum/MassconaxpbyNameEnum.m A /issm/trunk-jpl/src/m/enum/MassconaxpbyNamexEnum.m A /issm/trunk-jpl/src/m/enum/MassconaxpbyNameyEnum.m\\
+Export determination: 6. \\
+Rationale: CHG: added output definition for masconaxpby object, which combines masscons together. Added corresponding enums and corresponding Massconaxpby.h object in the classes.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#506} with diff file ISSM-18813-18814.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/IoModel.h\\
+Export determination: 6. \\
+Rationale: CHG: double definition\\
+\vspace{3em}
+
+\noindent \textbf{Change \#507} with diff file ISSM-18814-18815.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test322.m M /issm/trunk-jpl/test/NightlyRun/test322.py\\
+Export determination: 6. \\
+Rationale: CHG: relaxed tolerances\\
+\vspace{3em}
+
+\noindent \textbf{Change \#508} with diff file ISSM-18815-18816.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/wrappers/ExpSimplify/ExpSimplify.cpp\\
+Export determination: 6. \\
+Rationale: CHG: removing weird info message.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#509} with diff file ISSM-18816-18817.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/classes/calving.m M /issm/trunk-jpl/src/m/classes/calving.py M /issm/trunk-jpl/src/m/classes/calvinglevermann.m M /issm/trunk-jpl/src/m/classes/calvinglevermann.py M /issm/trunk-jpl/test/NightlyRun/IdToName.m M /issm/trunk-jpl/test/NightlyRun/IdToName.py M /issm/trunk-jpl/test/NightlyRun/test804.m M /issm/trunk-jpl/test/NightlyRun/test804.py M /issm/trunk-jpl/test/NightlyRun/test805.m M /issm/trunk-jpl/test/NightlyRun/test805.py M /issm/trunk-jpl/test/NightlyRun/test806.m M /issm/trunk-jpl/test/NightlyRun/test806.py\\
+Export determination: 6. \\
+Rationale: NEW : added melting rate\\
+\vspace{3em}
+
+\noindent \textbf{Change \#510} with diff file ISSM-18817-18818.diff: \\
+Function name: \\
+M /issm/trunk-jpl/examples/ISMIP/CheatyRunme.m M /issm/trunk-jpl/examples/SquareIceShelf/Square.par M /issm/trunk-jpl/examples/SquareIceShelf/runme.m D /issm/trunk-jpl/src/m/enum/CalvingCalvingrateEnum.m D /issm/trunk-jpl/src/m/enum/CalvingLawEnum.m D /issm/trunk-jpl/src/m/enum/CalvingLevermannEnum.m A /issm/trunk-jpl/src/m/enum/CalvingMeltingrateEnum.m D /issm/trunk-jpl/src/m/enum/CalvingRequestedOutputsEnum.m D /issm/trunk-jpl/src/m/enum/CalvinglevermannCoeffEnum.m A /issm/trunk-jpl/src/m/enum/CalvinglevermannMeltingrateEnum.m D /issm/trunk-jpl/src/m/enum/DefaultCalvingEnum.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py D /issm/trunk-jpl/src/m/enum/FrictionWaterLayerEnum.m D /issm/trunk-jpl/src/m/enum/HydrologydcEplflipLockEnum.m D /issm/trunk-jpl/src/m/enum/TransientIscalvingEnum.m A /issm/trunk-jpl/test/Archives/Archive807.nc M /issm/trunk-jpl/test/NightlyRun/test275.m A /issm/trunk-jpl/test/NightlyRun/test807.m A /issm/trunk-jpl/test/NightlyRun/test807.py\\
+Export determination: 6. \\
+Rationale: NEW : added tests for melting rate\\
+\vspace{3em}
+
+\noindent \textbf{Change \#511} with diff file ISSM-18818-18819.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/enum/CalvingCalvingrateEnum.m A /issm/trunk-jpl/src/m/enum/CalvingLawEnum.m A /issm/trunk-jpl/src/m/enum/CalvingLevermannEnum.m A /issm/trunk-jpl/src/m/enum/CalvingRequestedOutputsEnum.m A /issm/trunk-jpl/src/m/enum/CalvinglevermannCoeffEnum.m A /issm/trunk-jpl/src/m/enum/DefaultCalvingEnum.m A /issm/trunk-jpl/src/m/enum/FrictionWaterLayerEnum.m A /issm/trunk-jpl/src/m/enum/HydrologydcEplflipLockEnum.m A /issm/trunk-jpl/src/m/enum/TransientIscalvingEnum.m\\
+Export determination: 6. \\
+Rationale: BUG : accidentaly deleted certain Enum.m files\\
+\vspace{3em}
+
+\noindent \textbf{Change \#512} with diff file ISSM-18819-18820.diff: \\
+Function name: \\
+M /issm/trunk-jpl/scripts/ol.m\\
+Export determination: 6. \\
+Rationale: CHG: slight change.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#513} with diff file ISSM-18820-18821.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/curl\\
+Export determination: 6. \\
+Rationale: CHG: get svn to ignore some files\\
+\vspace{3em}
+
+\noindent \textbf{Change \#514} with diff file ISSM-18821-18822.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/m1qn3\\
+Export determination: 6. \\
+Rationale: CHG: get svn to ignore some files.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#515} with diff file ISSM-18822-18823.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/bamg/Mesh.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed Previous numbering issue\\
+\vspace{3em}
+
+\noindent \textbf{Change \#516} with diff file ISSM-18823-18824.diff: \\
+Function name: \\
+M /issm/trunk-jpl/examples/ISMIP/CheatyRunme.m M /issm/trunk-jpl/examples/SquareIceShelf/Square.par M /issm/trunk-jpl/examples/SquareIceShelf/runme.m M /issm/trunk-jpl/test/NightlyRun/test275.m\\
+Export determination: 6. \\
+Rationale: CHG: reverting some old commit\\
+\vspace{3em}
+
+\noindent \textbf{Change \#517} with diff file ISSM-18824-18825.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/clusters/greenplanet.m M /issm/trunk-jpl/src/m/classes/inversion.m M /issm/trunk-jpl/src/m/classes/inversionvalidation.m M /issm/trunk-jpl/src/m/classes/m1qn3inversion.m\\
+Export determination: 6. \\
+Rationale: NEW: (1) added one new cost function (507) for rheology B regularization (2) added one control parameter (RheologyB not depth averaged) (3) cosmetics\\
+\vspace{3em}
+
+\noindent \textbf{Change \#518} with diff file ISSM-18825-18826.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/Makefile.am A /issm/trunk-jpl/src/c/modules/RheologyBAbsGradientx A /issm/trunk-jpl/src/c/modules/RheologyBAbsGradientx/RheologyBAbsGradientx.cpp A /issm/trunk-jpl/src/c/modules/RheologyBAbsGradientx/RheologyBAbsGradientx.h M /issm/trunk-jpl/src/c/modules/modules.h\\
+Export determination: 6. \\
+Rationale: NEW: added new module that calculates |grad B|$^2$ for regularization\\
+\vspace{3em}
+
+\noindent \textbf{Change \#519} with diff file ISSM-18826-18827.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/extrudefromtop\_core.cpp\\
+Export determination: 6. \\
+Rationale: BUG: extrude from base should actually start from base (use -1) for Pentas\\
+\vspace{3em}
+
+\noindent \textbf{Change \#520} with diff file ISSM-18827-18828.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/adjointstressbalance\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added support for LA FS in adjoint\\
+\vspace{3em}
+
+\noindent \textbf{Change \#521} with diff file ISSM-18828-18829.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/RheologyBAbsGradientEnum.m\\
+Export determination: 6. \\
+Rationale: CHG: Adding RheologyBAbsGradientEnum.m\\
+\vspace{3em}
+
+\noindent \textbf{Change \#522} with diff file ISSM-18829-18830.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp\\
+Export determination: 6. \\
+Rationale: NEW: added new requested output (regularization) and support for Uzawa in transient\\
+\vspace{3em}
+
+\noindent \textbf{Change \#523} with diff file ISSM-18830-18831.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp\\
+Export determination: 6. \\
+Rationale: CHG: no vy in flowline models, and new control parameter\\
+\vspace{3em}
+
+\noindent \textbf{Change \#524} with diff file ISSM-18831-18832.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: removed debugging error messages\\
+\vspace{3em}
+
+\noindent \textbf{Change \#525} with diff file ISSM-18832-18833.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp\\
+Export determination: 6. \\
+Rationale: CHG: do not add multiple analyses\\
+\vspace{3em}
+
+\noindent \textbf{Change \#526} with diff file ISSM-18833-18834.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.h\\
+Export determination: 6. \\
+Rationale: CHG: adding function dViscositydB for HO and FS\\
+\vspace{3em}
+
+\noindent \textbf{Change \#527} with diff file ISSM-18834-18835.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: (1) adding support of inversion for 2D flowline model (2) adding support for inversion of RheologyB\\
+\vspace{3em}
+
+\noindent \textbf{Change \#528} with diff file ISSM-18835-18836.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h\\
+Export determination: 6. \\
+Rationale: CHG: adding funcitons in AdjointHorizAnalysis.h\\
+\vspace{3em}
+
+\noindent \textbf{Change \#529} with diff file ISSM-18836-18837.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp\\
+Export determination: 6. \\
+Rationale: adding support for inversion of RheologyB\\
+\vspace{3em}
+
+\noindent \textbf{Change \#530} with diff file ISSM-18837-18838.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: do not declare vy\_input twice\\
+\vspace{3em}
+
+\noindent \textbf{Change \#531} with diff file ISSM-18838-18839.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: do not declare vz\_input twice\\
+\vspace{3em}
+
+\noindent \textbf{Change \#532} with diff file ISSM-18839-18840.diff: \\
+Function name: \\
+M /issm/trunk-jpl/jenkins/windows\\
+Export determination: 6. \\
+Rationale: CHG: switching to 3.5\\
+\vspace{3em}
+
+\noindent \textbf{Change \#533} with diff file ISSM-18840-18841.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/paraview/exportVTK.py\\
+Export determination: 6. \\
+Rationale: CHG: updating exportVTK\\
+\vspace{3em}
+
+\noindent \textbf{Change \#534} with diff file ISSM-18841-18842.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/paraview/exportVTK.m\\
+Export determination: 6. \\
+Rationale: CHG: Updating filenaming in exportVTK\\
+\vspace{3em}
+
+\noindent \textbf{Change \#535} with diff file ISSM-18842-18843.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/Penta.h\\
+Export determination: 6. \\
+Rationale: ADD: GetIcefrontCoordinates for Penta.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#536} with diff file ISSM-18843-18844.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: Use element boundaries as ice front instead of ZeroLevelset. Change this back when consistent stress balance treatment of front elements is given.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#537} with diff file ISSM-18844-18845.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/Archives/Archive803.nc M /issm/trunk-jpl/test/Archives/Archive805.nc\\
+Export determination: 6. \\
+Rationale: CHG: updated archive now that ice front is on element edge rather than within element for HO and FS\\
+\vspace{3em}
+
+\noindent \textbf{Change \#538} with diff file ISSM-18845-18846.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/Makefile.am A /issm/trunk-jpl/src/c/classes/kriging/Covertree.cpp A /issm/trunk-jpl/src/c/classes/kriging/Covertree.h M /issm/trunk-jpl/src/c/classes/kriging/Observations.cpp M /issm/trunk-jpl/src/c/classes/kriging/Observations.h M /issm/trunk-jpl/src/c/classes/kriging/krigingobjects.h\\
+Export determination: 6. \\
+Rationale: NEW: preparing files for covertree\\
+\vspace{3em}
+
+\noindent \textbf{Change \#539} with diff file ISSM-18846-18847.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/valgrind/issm.supp\\
+Export determination: 6. \\
+Rationale: CHG: added new MUMPS leak to ignore\\
+\vspace{3em}
+
+\noindent \textbf{Change \#540} with diff file ISSM-18847-18848.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_thermal\_nonlinear.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed memory leak\\
+\vspace{3em}
+
+\noindent \textbf{Change \#541} with diff file ISSM-18848-18849.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed memory leak\\
+\vspace{3em}
+
+\noindent \textbf{Change \#542} with diff file ISSM-18849-18850.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp\\
+Export determination: 6. \\
+Rationale: CHG: for contact criterion, make sure that grounded elements may have min(levelset)==0\\
+\vspace{3em}
+
+\noindent \textbf{Change \#543} with diff file ISSM-18850-18851.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/transient\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: need also to extrude surface, and not just for contact solution\\
+\vspace{3em}
+
+\noindent \textbf{Change \#544} with diff file ISSM-18851-18852.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp\\
+Export determination: 6. \\
+Rationale: CHG: removed grounding line input extrusion from Penta (taken care of by transient\_core)\\
+\vspace{3em}
+
+\noindent \textbf{Change \#545} with diff file ISSM-18852-18853.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed memory leak\\
+\vspace{3em}
+
+\noindent \textbf{Change \#546} with diff file ISSM-18853-18854.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/controltao\_core.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed memory leak\\
+\vspace{3em}
+
+\noindent \textbf{Change \#547} with diff file ISSM-18854-18855.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed memory leak\\
+\vspace{3em}
+
+\noindent \textbf{Change \#548} with diff file ISSM-18855-18856.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.h M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/Penta.h M /issm/trunk-jpl/src/c/classes/Elements/Seg.h M /issm/trunk-jpl/src/c/classes/Elements/Tetra.h M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.h\\
+Export determination: 6. \\
+Rationale: CHG: moved Migrate Grounding line in Element.cpp\\
+\vspace{3em}
+
+\noindent \textbf{Change \#549} with diff file ISSM-18856-18857.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/controlm1qn3\_core.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed memory leak\\
+\vspace{3em}
+
+\noindent \textbf{Change \#550} with diff file ISSM-18857-18858.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp\\
+Export determination: 6. \\
+Rationale: CHG: cleaner code for MigrateGroundingLine for Contact\\
+\vspace{3em}
+
+\noindent \textbf{Change \#551} with diff file ISSM-18858-18859.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test437.m\\
+Export determination: 6. \\
+Rationale: CHG: only request 1 cpu since there are 4 elements horizontally\\
+\vspace{3em}
+
+\noindent \textbf{Change \#552} with diff file ISSM-18859-18860.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/Archives/Archive437.nc\\
+Export determination: 6. \\
+Rationale: CHG: added more elements to test\\
+\vspace{3em}
+
+\noindent \textbf{Change \#553} with diff file ISSM-18860-18861.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp\\
+Export determination: 6. \\
+Rationale: CHG: add support of FSContactMigration for coupling\\
+\vspace{3em}
+
+\noindent \textbf{Change \#554} with diff file ISSM-18861-18862.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/m/classes/groundingline.m M /issm/trunk-jpl/src/m/classes/groundingline.py\\
+Export determination: 6. \\
+Rationale: Adding GroundingOnlyEnum for groundingline migration\\
+\vspace{3em}
+
+\noindent \textbf{Change \#555} with diff file ISSM-18862-18863.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed memory leak\\
+\vspace{3em}
+
+\noindent \textbf{Change \#556} with diff file ISSM-18863-18864.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test437.m\\
+Export determination: 6. \\
+Rationale: CHG: minor tolerance\\
+\vspace{3em}
+
+\noindent \textbf{Change \#557} with diff file ISSM-18864-18865.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/contrib/netCDF A /issm/trunk-jpl/src/m/contrib/netCDF/export\_netCDF.py\\
+Export determination: 6. \\
+Rationale: NEW: adding netcdf export for python\\
+\vspace{3em}
+
+\noindent \textbf{Change \#558} with diff file ISSM-18865-18866.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/netCDF/export\_netCDF.py\\
+Export determination: 6. \\
+Rationale: CHG: fixing time dependant result output\\
+\vspace{3em}
+
+\noindent \textbf{Change \#559} with diff file ISSM-18866-18867.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/GroundingOnlyEnum.m\\
+Export determination: 6. \\
+Rationale: CHG: Syncing Enums\\
+\vspace{3em}
+
+\noindent \textbf{Change \#560} with diff file ISSM-18867-18868.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/netCDF/export\_netCDF.py\\
+Export determination: 6. \\
+Rationale: CHG: adding compression\\
+\vspace{3em}
+
+\noindent \textbf{Change \#561} with diff file ISSM-18868-18869.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/controlm1qn3\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: fixed cores/controlm1qn3\_core.cpp, simul is a pointer and m1qn3 needs an initial gradient\\
+\vspace{3em}
+
+\noindent \textbf{Change \#562} with diff file ISSM-18869-18870.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/netCDF/export\_netCDF.py\\
+Export determination: 6. \\
+Rationale: CHG: adding classtype attribute\\
+\vspace{3em}
+
+\noindent \textbf{Change \#563} with diff file ISSM-18870-18871.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp M /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.h\\
+Export determination: 6. \\
+Rationale: CHG: need this module to allow getting the vectors from control inputs on sid vertices, not pid vertices. Usefull for updating the tape on ad control runs.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#564} with diff file ISSM-18871-18872.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/IndependentObject.cpp\\
+Export determination: 6. \\
+Rationale: CHG: new logic here. If supplied with an X vector of independent variables, use them instead of what is being read from disk. Useful for updating from control inputs during an ad control run.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#565} with diff file ISSM-18872-18873.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/classes/FemModel.h\\
+Export determination: 6. \\
+Rationale: CHG: new constructor for the ad control core solution, which allows to feed in an X independent vector and a choice on where to start tracing or not. This is useful to allow updates on the control update through feeding this update during the I/O phase of the FeMmodel constructor. This way, we make sure that for each ad run of the control core, the tape initializes with the updated X vector instead of the value from disk.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#566} with diff file ISSM-18873-18874.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Definition.h M /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp\\
+Export determination: 6. \\
+Rationale: CHG: output definitions now carry an enum to facilitate the response computation (see FemModel new Responsex routine one commit ago).\\
+\vspace{3em}
+
+\noindent \textbf{Change \#567} with diff file ISSM-18874-18875.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/InputFileNameEnum.m A /issm/trunk-jpl/src/m/enum/MassconDefinitionenumEnum.m A /issm/trunk-jpl/src/m/enum/MassconaxpbyDefinitionenumEnum.m A /issm/trunk-jpl/src/m/enum/MassfluxatgateDefinitionenumEnum.m A /issm/trunk-jpl/src/m/enum/MisfitDefinitionenumEnum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition10Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition1Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition2Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition3Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition4Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition5Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition6Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition7Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition8Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition9Enum.m A /issm/trunk-jpl/src/m/enum/RootPathEnum.m A /issm/trunk-jpl/src/m/enum/ToolkitsFileNameEnum.m\\
+Export determination: 6. \\
+Rationale: NEW: new enums for: -files whose names we now want to record (new FemModel constructor two commits ago). - output definitions which now need an associated enum (from Outputdefinition1Enum to Outputdefinition10Enum).\\
+\vspace{3em}
+
+\noindent \textbf{Change \#568} with diff file ISSM-18875-18876.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/classes/adinversion.m\\
+Export determination: 6. \\
+Rationale: NEW: new ad style inversion class, much needed as it's quite different from the other inversion classes. Takes a lot after m1qn3 though.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#569} with diff file ISSM-18876-18877.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp\\
+Export determination: 6. \\
+Rationale: CHG: hook up for the ad inversion class (m1qn3 style control). Also made sure the incomplete adjoint option is control class dependent, not generic for all control classes.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#570} with diff file ISSM-18877-18878.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.cpp\\
+Export determination: 6. \\
+Rationale: CHG: new overloaded response function, as now output definitions can be computed either according to their name, or their associated enum.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#571} with diff file ISSM-18878-18879.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.h\\
+Export determination: 6. \\
+Rationale: CHG: CHG: new overloaded response function, as now output definitions can be computed either according to their name, or their associated enum. See prior commit.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#572} with diff file ISSM-18879-18880.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/IoModel.cpp M /issm/trunk-jpl/src/c/classes/IoModel.h\\
+Export determination: 6. \\
+Rationale: CHG: new overloading to feed in trace (boolean which determines whether we should trace using AD or not) and corresponding X (state parameters, or number of indepenets) down into the FetchIndependent routines, where we bypass the disk I/O and instead use X to initialize the independents. This is useful for ad control core, which does not update the control inputs the same way as the standard m1qn3controlcore.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#573} with diff file ISSM-18880-18881.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp\\
+Export determination: 6. \\
+Rationale: CHG: some enum updates.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#574} with diff file ISSM-18881-18882.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/masscon.m M /issm/trunk-jpl/src/m/classes/massconaxpby.m M /issm/trunk-jpl/src/m/classes/massfluxatgate.m M /issm/trunk-jpl/src/m/classes/misfit.m\\
+Export determination: 6. \\
+Rationale: CHG: output definitions should now include an identifying enum between OutputDefinition1Enum and OutputDefinition10Enum\\
+\vspace{3em}
+
+\noindent \textbf{Change \#575} with diff file ISSM-18882-18883.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/cores.h\\
+Export determination: 6. \\
+Rationale: CHG: added prototype for ad control core.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#576} with diff file ISSM-18883-18884.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/Makefile.am\\
+Export determination: 6. \\
+Rationale: CHG: new entry for ad control core.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#577} with diff file ISSM-18884-18885.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.h M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/Penta.h M /issm/trunk-jpl/src/c/classes/Elements/Seg.h M /issm/trunk-jpl/src/c/classes/Elements/Tetra.h M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.h\\
+Export determination: 6. \\
+Rationale: CHG: new capability to return control input on sid indexed vector instead of pid indexed vector. Default is still pid indexing of course.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#578} with diff file ISSM-18885-18886.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Masscon.h M /issm/trunk-jpl/src/c/classes/Massconaxpby.h M /issm/trunk-jpl/src/c/classes/Massfluxatgate.h M /issm/trunk-jpl/src/c/classes/Misfit.h\\
+Export determination: 6. \\
+Rationale: CHG: each output definition should now include a unique identifer enum chosen between OutputDefinition1Enum and OutputDefinition10Enum\\
+\vspace{3em}
+
+\noindent \textbf{Change \#579} with diff file ISSM-18886-18887.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/ExternalResults/ExternalResult.h M /issm/trunk-jpl/src/c/classes/ExternalResults/GenericExternalResult.h M /issm/trunk-jpl/src/c/classes/ExternalResults/Results.cpp M /issm/trunk-jpl/src/c/classes/ExternalResults/Results.h\\
+Export determination: 6. \\
+Rationale: CHG: allow chasing through a dataset of external results according now to their enum but to their corresponding name.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#580} with diff file ISSM-18887-18888.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/ad\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added fold for verbose part of the code.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#581} with diff file ISSM-18888-18889.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/WrapperCorePointerFromSolutionEnum.cpp A /issm/trunk-jpl/src/c/cores/controlad\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: new control core that relies on m1qn3, but computes the gradients using the AD technology. The update of the control inputs is also interesting in that we do not rely on a pid indexed ordering, but an sid indexed ordering. Using this ordering, for each run of simulad, we feed the updated X vector of independents to a new FemModel (yes, we create a new FemModel) initialized from the disk input file, except for the X vector itself. The reason we have to do this is to ensure that the active AD variables are the same for each run, and because we don't know yet how to stop and restart a tape with only a subset of the active variables updated -> we are not sure whether this would actually work!\\
+\vspace{3em}
+
+\noindent \textbf{Change \#582} with diff file ISSM-18889-18890.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/IndependentObject.h\\
+Export determination: 6. \\
+Rationale: CHG: FetchIndependents now relies on the X vector if supplied, instead of what is read from file I/O. This allows for updating of the tape directly from the ad control core!\\
+\vspace{3em}
+
+\noindent \textbf{Change \#583} with diff file ISSM-18890-18891.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp\\
+Export determination: 6. \\
+Rationale: CHG: avoid leaks when using new constructor in control ad core.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#584} with diff file ISSM-18891-18892.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/controlad\_core.cpp M /issm/trunk-jpl/src/c/cores/controlm1qn3\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: fix leaks. Also in m1qn3 core, do not compile if in AD mode, not good.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#585} with diff file ISSM-18892-18893.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/controlad\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: typo.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#586} with diff file ISSM-18893-18894.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/controlad\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: fixed leak\\
+\vspace{3em}
+
+\noindent \textbf{Change \#587} with diff file ISSM-18894-18895.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/massfluxatgate.m\\
+Export determination: 6. \\
+Rationale: CHG: missing marshall of definition enum. This should fix all our forward tests.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#588} with diff file ISSM-18895-18896.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test101.m\\
+Export determination: 6. \\
+Rationale: CHG: fixing output definitions given the new format of the massfluxatgate.m constructor.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#589} with diff file ISSM-18896-18897.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/Makefile.am A /issm/trunk-jpl/src/c/cores/adgradient\_core.cpp M /issm/trunk-jpl/src/c/cores/controlad\_core.cpp M /issm/trunk-jpl/src/c/cores/cores.h\\
+Export determination: 6. \\
+Rationale: CHG: created new driver called adgradient\_core, to carry out only fos\_reverse computations in AD mode. Only way to make multi-cost functions inversions.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#590} with diff file ISSM-18897-18898.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test123.m\\
+Export determination: 6. \\
+Rationale: CHG: issue with output definition. Quick fix.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#591} with diff file ISSM-18898-18899.diff: \\
+Function name: \\
+A /issm/trunk-jpl/externalpackages/gmt A /issm/trunk-jpl/externalpackages/gmt/configs A /issm/trunk-jpl/externalpackages/gmt/configs/ConfigUser.cmake A /issm/trunk-jpl/externalpackages/gmt/install.sh\\
+Export determination: 6. \\
+Rationale: NEW: gmt package.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#592} with diff file ISSM-18899-18900.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/gmt\\
+Export determination: 6. \\
+Rationale: CHG: get svn to ignore some files.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#593} with diff file ISSM-18900-18901.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/gmt/configs/ConfigUser.cmake\\
+Export determination: 6. \\
+Rationale: CHG: added high res coastline.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#594} with diff file ISSM-18901-18902.diff: \\
+Function name: \\
+A /issm/trunk-jpl/externalpackages/gshhg A /issm/trunk-jpl/externalpackages/gshhg/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: high resolution coastline from NOAA.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#595} with diff file ISSM-18902-18903.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/gshhg M /issm/trunk-jpl/externalpackages/gshhg/install.sh\\
+Export determination: 6. \\
+Rationale: CHG: either download from our archive or from the website directly.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#596} with diff file ISSM-18903-18904.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG:Correction on the pseudo-step function used for the transfer\\
+\vspace{3em}
+
+\noindent \textbf{Change \#597} with diff file ISSM-18904-18905.diff: \\
+Function name: \\
+A /issm/trunk-jpl/externalpackages/export\_fig/LICENSE A /issm/trunk-jpl/externalpackages/export\_fig/README.md A /issm/trunk-jpl/externalpackages/export\_fig/append\_pdfs.m M /issm/trunk-jpl/externalpackages/export\_fig/copyfig.m A /issm/trunk-jpl/externalpackages/export\_fig/crop\_borders.m M /issm/trunk-jpl/externalpackages/export\_fig/eps2pdf.m M /issm/trunk-jpl/externalpackages/export\_fig/export\_fig.m M /issm/trunk-jpl/externalpackages/export\_fig/fix\_lines.m M /issm/trunk-jpl/externalpackages/export\_fig/ghostscript.m A /issm/trunk-jpl/externalpackages/export\_fig/im2gif.m M /issm/trunk-jpl/externalpackages/export\_fig/isolate\_axes.m M /issm/trunk-jpl/externalpackages/export\_fig/pdf2eps.m M /issm/trunk-jpl/externalpackages/export\_fig/pdftops.m M /issm/trunk-jpl/externalpackages/export\_fig/print2array.m M /issm/trunk-jpl/externalpackages/export\_fig/print2eps.m A /issm/trunk-jpl/externalpackages/export\_fig/read\_write\_entire\_textfile.m M /issm/trunk-jpl/externalpackages/export\_fig/user\_string.m A /issm/trunk-jpl/externalpackages/export\_fig/using\_hg2.m\\
+Export determination: 6. \\
+Rationale: CHG: upgrading export\_fig for hg2 support and matlab R2014b\\
+\vspace{3em}
+
+\noindent \textbf{Change \#598} with diff file ISSM-18905-18906.diff: \\
+Function name: \\
+M /issm/trunk-jpl/etc/environment.sh\\
+Export determination: 6. \\
+Rationale: source the environment for gmt\\
+\vspace{3em}
+
+\noindent \textbf{Change \#599} with diff file ISSM-18906-18907.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp\\
+Export determination: 6. \\
+Rationale: CHG: don't need to recalculate phi for contact\\
+\vspace{3em}
+
+\noindent \textbf{Change \#600} with diff file ISSM-18907-18908.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/gshhg/install.sh\\
+Export determination: 6. \\
+Rationale: typo\\
+\vspace{3em}
+
+\noindent \textbf{Change \#601} with diff file ISSM-18908-18909.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp\\
+Export determination: 6. \\
+Rationale: CHG: make sure all grounding line conditions are covered\\
+\vspace{3em}
+
+\noindent \textbf{Change \#602} with diff file ISSM-18909-18910.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp\\
+Export determination: 6. \\
+Rationale: CHG: put the verbose in the right position.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#603} with diff file ISSM-18910-18911.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/mesh/MeshToShp.m\\
+Export determination: 6. \\
+Rationale: CHG: new MeshToShp routine.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#604} with diff file ISSM-18911-18912.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.h\\
+Export determination: 6. \\
+Rationale: CHG: minor alphabetical order\\
+\vspace{3em}
+
+\noindent \textbf{Change \#605} with diff file ISSM-18912-18913.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/kriging/Covertree.cpp M /issm/trunk-jpl/src/c/classes/kriging/Covertree.h M /issm/trunk-jpl/src/c/classes/kriging/Observation.cpp M /issm/trunk-jpl/src/c/classes/kriging/Observation.h M /issm/trunk-jpl/src/c/classes/kriging/Observations.cpp M /issm/trunk-jpl/src/c/classes/kriging/Observations.h\\
+Export determination: 6. \\
+Rationale: NEW: added covertree nearest neighbor search (to be debugged)\\
+\vspace{3em}
+
+\noindent \textbf{Change \#606} with diff file ISSM-18913-18914.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.h\\
+Export determination: 6. \\
+Rationale: CHG: alphabetical order in element.h\\
+\vspace{3em}
+
+\noindent \textbf{Change \#607} with diff file ISSM-18914-18915.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/kriging/Covertree.cpp M /issm/trunk-jpl/src/c/classes/kriging/Observation.cpp M /issm/trunk-jpl/src/c/classes/kriging/Observation.h\\
+Export determination: 6. \\
+Rationale: BUG: not compiling on thwaites\\
+\vspace{3em}
+
+\noindent \textbf{Change \#608} with diff file ISSM-18915-18916.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/kriging/Observations.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed covertree\\
+\vspace{3em}
+
+\noindent \textbf{Change \#609} with diff file ISSM-18916-18917.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/kriging/Covertree.cpp\\
+Export determination: 6. \\
+Rationale: CHG: minor\\
+\vspace{3em}
+
+\noindent \textbf{Change \#610} with diff file ISSM-18917-18918.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/plot\_scatter.m\\
+Export determination: 6. \\
+Rationale: CHG: make plot\_scatter work for R2014b\\
+\vspace{3em}
+
+\noindent \textbf{Change \#611} with diff file ISSM-18918-18919.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Options/GenericOption.h\\
+Export determination: 6. \\
+Rationale: BUG: special destructor for char* to avoid leaks\\
+\vspace{3em}
+
+\noindent \textbf{Change \#612} with diff file ISSM-18919-18920.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/kriging/Covertree.cpp M /issm/trunk-jpl/src/c/classes/kriging/Covertree.h M /issm/trunk-jpl/src/c/classes/kriging/Observations.cpp\\
+Export determination: 6. \\
+Rationale: BUG: input argument is now the max depth level and not the max ditance\\
+\vspace{3em}
+
+\noindent \textbf{Change \#613} with diff file ISSM-18920-18921.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp\\
+Export determination: 6. \\
+Rationale: CHG: alphabetical order in Element.cpp\\
+\vspace{3em}
+
+\noindent \textbf{Change \#614} with diff file ISSM-18921-18922.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp\\
+Export determination: 6. \\
+Rationale: CHG: minor reordering Penta.cpp\\
+\vspace{3em}
+
+\noindent \textbf{Change \#615} with diff file ISSM-18922-18923.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Penta.h\\
+Export determination: 6. \\
+Rationale: CHG: minor reordering Penta.h\\
+\vspace{3em}
+
+\noindent \textbf{Change \#616} with diff file ISSM-18923-18924.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Tetra.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tetra.h\\
+Export determination: 6. \\
+Rationale: CHG: reorder Tetra\\
+\vspace{3em}
+
+\noindent \textbf{Change \#617} with diff file ISSM-18924-18925.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Seg.cpp M /issm/trunk-jpl/src/c/classes/Elements/Seg.h\\
+Export determination: 6. \\
+Rationale: CHG: minor ordering segment\\
+\vspace{3em}
+
+\noindent \textbf{Change \#618} with diff file ISSM-18925-18926.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/ElementHook.cpp M /issm/trunk-jpl/src/c/classes/Elements/ElementHook.h M /issm/trunk-jpl/src/c/classes/Elements/PentaRef.cpp M /issm/trunk-jpl/src/c/classes/Elements/PentaRef.h M /issm/trunk-jpl/src/c/classes/Elements/SegRef.cpp M /issm/trunk-jpl/src/c/classes/Elements/SegRef.h M /issm/trunk-jpl/src/c/classes/Elements/TetraRef.cpp M /issm/trunk-jpl/src/c/classes/Elements/TetraRef.h M /issm/trunk-jpl/src/c/classes/Elements/TriaRef.cpp M /issm/trunk-jpl/src/c/classes/Elements/TriaRef.h\\
+Export determination: 6. \\
+Rationale: CHG: finished reordering elements\\
+\vspace{3em}
+
+\noindent \textbf{Change \#619} with diff file ISSM-18926-18927.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp M /issm/trunk-jpl/src/c/classes/Loads/Friction.h M /issm/trunk-jpl/src/c/classes/Loads/Load.h M /issm/trunk-jpl/src/c/classes/Loads/Loads.cpp M /issm/trunk-jpl/src/c/classes/Loads/Loads.h M /issm/trunk-jpl/src/c/classes/Loads/Numericalflux.cpp M /issm/trunk-jpl/src/c/classes/Loads/Numericalflux.h M /issm/trunk-jpl/src/c/classes/Loads/Pengrid.cpp M /issm/trunk-jpl/src/c/classes/Loads/Penpair.cpp M /issm/trunk-jpl/src/c/classes/Loads/Penpair.h M /issm/trunk-jpl/src/c/classes/Loads/Riftfront.cpp M /issm/trunk-jpl/src/c/classes/Loads/Riftfront.h\\
+Export determination: 6. \\
+Rationale: CHG: reordering loads\\
+\vspace{3em}
+
+\noindent \textbf{Change \#620} with diff file ISSM-18927-18928.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/contrib/netCDF/ClassTry.py M /issm/trunk-jpl/src/m/contrib/netCDF/export\_netCDF.py\\
+Export determination: 6. \\
+Rationale: NEW: duplicate of model in a more Pythonistic way, correction in export for the classtype of results\\
+\vspace{3em}
+
+\noindent \textbf{Change \#621} with diff file ISSM-18928-18929.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h\\
+Export determination: 6. \\
+Rationale: CHG: ordering StressbalanceAnalysis\\
+\vspace{3em}
+
+\noindent \textbf{Change \#622} with diff file ISSM-18929-18930.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/Analysis.h M /issm/trunk-jpl/src/c/analyses/DepthAverageAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/DepthAverageAnalysis.h M /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.h M /issm/trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/ExtrudeFromBaseAnalysis.h M /issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.h M /issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.h M /issm/trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.h M /issm/trunk-jpl/src/c/analyses/GiaAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/GiaAnalysis.h\\
+Export determination: 6. \\
+Rationale: CHG: some ordering\\
+\vspace{3em}
+
+\noindent \textbf{Change \#623} with diff file ISSM-18930-18931.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.h M /issm/trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/AdjointBalancethicknessAnalysis.h M /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h M /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp M /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.h M /issm/trunk-jpl/src/c/analyses/BalancethicknessAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/BalancethicknessAnalysis.h M /issm/trunk-jpl/src/c/analyses/BalancevelocityAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/BalancevelocityAnalysis.h M /issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.h M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.h M /issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.h M /issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.h M /issm/trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.h M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.h M /issm/trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.h M /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.h M /issm/trunk-jpl/src/c/analyses/MeltingAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/MeltingAnalysis.h M /issm/trunk-jpl/src/c/analyses/MeshdeformationAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/MeshdeformationAnalysis.h M /issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.h M /issm/trunk-jpl/src/c/analyses/SmoothAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/SmoothAnalysis.h M /issm/trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.h M /issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.h M /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.h M /issm/trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/UzawaPressureAnalysis.h\\
+Export determination: 6. \\
+Rationale: CHG: minor ordering\\
+\vspace{3em}
+
+\noindent \textbf{Change \#624} with diff file ISSM-18931-18932.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Constraints/Constraint.h M /issm/trunk-jpl/src/c/classes/Constraints/Constraints.cpp M /issm/trunk-jpl/src/c/classes/Constraints/Constraints.h M /issm/trunk-jpl/src/c/classes/Constraints/SpcDynamic.cpp M /issm/trunk-jpl/src/c/classes/Constraints/SpcDynamic.h M /issm/trunk-jpl/src/c/classes/Constraints/SpcStatic.cpp M /issm/trunk-jpl/src/c/classes/Constraints/SpcTransient.cpp M /issm/trunk-jpl/src/c/classes/Constraints/SpcTransient.h\\
+Export determination: 6. \\
+Rationale: CHG: minor ordering\\
+\vspace{3em}
+
+\noindent \textbf{Change \#625} with diff file ISSM-18932-18933.diff: \\
+Function name: \\
+A /issm/trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2015.0.090-mpt.2.11r13.sh\\
+Export determination: 6. \\
+Rationale: NEW:updating mpi install on pleiade\\
+\vspace{3em}
+
+\noindent \textbf{Change \#626} with diff file ISSM-18933-18934.diff: \\
+Function name: \\
+A /issm/trunk-jpl/configs/config-linux64-pleiades-intel2015.0.090-mpt.2.11r13.sh\\
+Export determination: 6. \\
+Rationale: NEW:updating mpi install on pleiade\\
+\vspace{3em}
+
+\noindent \textbf{Change \#627} with diff file ISSM-18934-18935.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh\\
+Export determination: 6. \\
+Rationale: CHG: new openmpi on hpc\\
+\vspace{3em}
+
+\noindent \textbf{Change \#628} with diff file ISSM-18935-18936.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/ModelProcessorx/Autodiff/CreateParametersAutodiff.cpp\\
+Export determination: 6. \\
+Rationale: CHG: part where the AD solvers are created was not protected for non-ad runs!\\
+\vspace{3em}
+
+\noindent \textbf{Change \#629} with diff file ISSM-18936-18937.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/IndependentObject.cpp\\
+Export determination: 6. \\
+Rationale: CHG: some minor comments.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#630} with diff file ISSM-18937-18938.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp\\
+Export determination: 6. \\
+Rationale: CHG: protect closing of output file from AD runs.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#631} with diff file ISSM-18938-18939.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp\\
+Export determination: 6. \\
+Rationale: CHG: reverting.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#632} with diff file ISSM-18939-18940.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/ad\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: issue with size of tape stats, hopefully fixed.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#633} with diff file ISSM-18940-18941.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/adgradient\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: issue with size of tape stats.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#634} with diff file ISSM-18941-18942.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp\\
+Export determination: 6. \\
+Rationale: CHG: added check to avoid crash\\
+\vspace{3em}
+
+\noindent \textbf{Change \#635} with diff file ISSM-18942-18943.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/cores/controlad\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: rehooking ad gradient core\\
+\vspace{3em}
+
+\noindent \textbf{Change \#636} with diff file ISSM-18943-18944.diff: \\
+Function name: \\
+M /issm/trunk-jpl\\
+Export determination: 6. \\
+Rationale: CHG: ignoring build-fw and build-ad for multi-target compilation.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#637} with diff file ISSM-18944-18945.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/massfluxatgate.m M /issm/trunk-jpl/src/m/classes/massfluxatgate.py M /issm/trunk-jpl/test/NightlyRun/test101.m M /issm/trunk-jpl/test/NightlyRun/test101.py\\
+Export determination: 6. \\
+Rationale: BUG: fixed test101.py with new massflux class\\
+\vspace{3em}
+
+\noindent \textbf{Change \#638} with diff file ISSM-18945-18946.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/VxObsEnum.m A /issm/trunk-jpl/src/m/enum/VyObsEnum.m A /issm/trunk-jpl/src/m/enum/WeightsVxObsEnum.m A /issm/trunk-jpl/src/m/enum/WeightsVyObsEnum.m\\
+Export determination: 6. \\
+Rationale: CHG: new enums.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#639} with diff file ISSM-18946-18947.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/Loads/Pengrid.cpp M /issm/trunk-jpl/src/c/classes/Loads/Riftfront.cpp M /issm/trunk-jpl/src/c/classes/Materials/Material.h M /issm/trunk-jpl/src/c/classes/Materials/Matice.cpp M /issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp M /issm/trunk-jpl/src/c/classes/Materials/Matpar.h M /issm/trunk-jpl/src/c/modules/ModelProcessorx/NodesPartitioning.cpp M /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp\\
+Export determination: 6. \\
+Rationale: CHG: removed useless functions, call GetMaterialParameter instead\\
+\vspace{3em}
+
+\noindent \textbf{Change \#640} with diff file ISSM-18947-18948.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp\\
+Export determination: 6. \\
+Rationale: BUG: forgot some GetRho functions\\
+\vspace{3em}
+
+\noindent \textbf{Change \#641} with diff file ISSM-18948-18949.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp\\
+Export determination: 6. \\
+Rationale: BUG: forgot GetRho functions for Dakota\\
+\vspace{3em}
+
+\noindent \textbf{Change \#642} with diff file ISSM-18949-18950.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed wrong enums in a couple files\\
+\vspace{3em}
+
+\noindent \textbf{Change \#643} with diff file ISSM-18950-18951.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/analyses.m4 M /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/shared/Elements/ComputeDelta18oTemperaturePrecipitation.cpp M /issm/trunk-jpl/src/c/shared/Elements/PddSurfaceMassBalance.cpp M /issm/trunk-jpl/src/c/shared/Elements/elements.h M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/classes/SMBpdd.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py M /issm/trunk-jpl/src/m/plot/processmesh.m\\
+Export determination: 6. \\
+Rationale: minor changes to PDD method\\
+\vspace{3em}
+
+\noindent \textbf{Change \#644} with diff file ISSM-18951-18952.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp\\
+Export determination: 6. \\
+Rationale: updating GetRhoIce in pdd\\
+\vspace{3em}
+
+\noindent \textbf{Change \#645} with diff file ISSM-18952-18953.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/processmesh.m\\
+Export determination: 6. \\
+Rationale: CHG: added isprop back\\
+\vspace{3em}
+
+\noindent \textbf{Change \#646} with diff file ISSM-18953-18954.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.h M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/Penta.h M /issm/trunk-jpl/src/c/classes/Elements/Seg.h M /issm/trunk-jpl/src/c/classes/Elements/Tetra.h M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.h M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/classes/FemModel.h M /issm/trunk-jpl/src/c/cores/transient\_core.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp A /issm/trunk-jpl/src/m/classes/calvingpi.m M /issm/trunk-jpl/src/m/classes/model.m A /issm/trunk-jpl/src/m/enum/CalvingPiEnum.m A /issm/trunk-jpl/src/m/enum/CalvingpiCoeffEnum.m A /issm/trunk-jpl/src/m/enum/CalvingpiMeltingrateEnum.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py\\
+Export determination: 6. \\
+Rationale: NEW : Calving Pi model\\
+\vspace{3em}
+
+\noindent \textbf{Change \#647} with diff file ISSM-18954-18955.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/Archives/Archive806.nc\\
+Export determination: 6. \\
+Rationale: BUG : repaired archive\\
+\vspace{3em}
+
+\noindent \textbf{Change \#648} with diff file ISSM-18955-18956.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/calving.m M /issm/trunk-jpl/src/m/classes/calving.py\\
+Export determination: 6. \\
+Rationale: CHG: Allow transient forcing of calvingrate and meltingrate in md.calving\\
+\vspace{3em}
+
+\noindent \textbf{Change \#649} with diff file ISSM-18956-18957.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.h\\
+Export determination: 6. \\
+Rationale: ADD: Computation of Tria-area covered by ice. Computation of determination of ice distribution in element.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#650} with diff file ISSM-18957-18958.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp\\
+Export determination: 6. \\
+Rationale: CHG: compute Tria ice volume now also over elements intersected by 0-levelset\\
+\vspace{3em}
+
+\noindent \textbf{Change \#651} with diff file ISSM-18958-18959.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp\\
+Export determination: 6. \\
+Rationale: minor: code cleanup (aka killing a code-monster)\\
+\vspace{3em}
+
+\noindent \textbf{Change \#652} with diff file ISSM-18959-18960.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/cores/transient\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: extrapolate thickness for Levelset-Method, and add computed calvingrate to results\\
+\vspace{3em}
+
+\noindent \textbf{Change \#653} with diff file ISSM-18960-18961.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/solve/parseresultsfromdisk.m M /issm/trunk-jpl/src/m/solve/parseresultsfromdisk.py\\
+Export determination: 6. \\
+Rationale: ADD: convert calvingrate output to m/yr\\
+\vspace{3em}
+
+\noindent \textbf{Change \#654} with diff file ISSM-18961-18962.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/model.m M /issm/trunk-jpl/src/m/classes/model.py\\
+Export determination: 6. \\
+Rationale: ADD: extrude calving.meltingrate\\
+\vspace{3em}
+
+\noindent \textbf{Change \#655} with diff file ISSM-18962-18963.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/Archives/Archive801.nc M /issm/trunk-jpl/test/Archives/Archive802.nc M /issm/trunk-jpl/test/Archives/Archive803.nc M /issm/trunk-jpl/test/Archives/Archive804.nc M /issm/trunk-jpl/test/Archives/Archive805.nc M /issm/trunk-jpl/test/Archives/Archive806.nc M /issm/trunk-jpl/test/Archives/Archive807.nc M /issm/trunk-jpl/test/NightlyRun/test801.m M /issm/trunk-jpl/test/NightlyRun/test801.py M /issm/trunk-jpl/test/NightlyRun/test802.m M /issm/trunk-jpl/test/NightlyRun/test802.py M /issm/trunk-jpl/test/NightlyRun/test803.m M /issm/trunk-jpl/test/NightlyRun/test803.py M /issm/trunk-jpl/test/Par/ValleyGlacierShelf.par M /issm/trunk-jpl/test/Par/ValleyGlacierShelf.py\\
+Export determination: 6. \\
+Rationale: minor: adding required fields, updating archives\\
+\vspace{3em}
+
+\noindent \textbf{Change \#656} with diff file ISSM-18963-18964.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/model.py\\
+Export determination: 6. \\
+Rationale: BUG: calvginpi not defined in Python yet\\
+\vspace{3em}
+
+\noindent \textbf{Change \#657} with diff file ISSM-18964-18965.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test806.m M /issm/trunk-jpl/test/NightlyRun/test806.py M /issm/trunk-jpl/test/NightlyRun/test807.m M /issm/trunk-jpl/test/NightlyRun/test807.py\\
+Export determination: 6. \\
+Rationale: minor: relaxing tolerances\\
+\vspace{3em}
+
+\noindent \textbf{Change \#658} with diff file ISSM-18965-18966.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/calving.py\\
+Export determination: 6. \\
+Rationale: BUG: do not provide sub array to consistency check\\
+\vspace{3em}
+
+\noindent \textbf{Change \#659} with diff file ISSM-18966-18967.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Constraints/SpcTransient.cpp\\
+Export determination: 6. \\
+Rationale: CHG: removing constraint release\\
+\vspace{3em}
+
+\noindent \textbf{Change \#660} with diff file ISSM-18967-18968.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp\\
+Export determination: 6. \\
+Rationale: CHG : power of 0.3 for calving pi model\\
+\vspace{3em}
+
+\noindent \textbf{Change \#661} with diff file ISSM-18968-18969.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/Makefile.am M /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.h M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/Penta.h M /issm/trunk-jpl/src/c/classes/Elements/Seg.h M /issm/trunk-jpl/src/c/classes/Elements/Tetra.h M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.h M /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp M /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp M /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.h M /issm/trunk-jpl/src/c/shared/Elements/PddSurfaceMassBalance.cpp M /issm/trunk-jpl/src/c/shared/Elements/elements.h M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp M /issm/trunk-jpl/src/m/classes/SMBpdd.m M /issm/trunk-jpl/src/m/classes/SMBpdd.py M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py M /issm/trunk-jpl/test/NightlyRun/test236.m M /issm/trunk-jpl/test/NightlyRun/test236.py M /issm/trunk-jpl/test/NightlyRun/test237.m M /issm/trunk-jpl/test/NightlyRun/test237.py\\
+Export determination: 6. \\
+Rationale: updating pdd module and NR 236 and 237. Updated python scripts may not work as I am not familiar with python.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#662} with diff file ISSM-18969-18970.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/c/shared/Elements/ComputeMungsmTemperaturePrecipitation.cpp A /issm/trunk-jpl/src/m/enum/SurfaceforcingsIsmungsmEnum.m A /issm/trunk-jpl/src/m/enum/SurfaceforcingsPrecipitationsLgmEnum.m\\
+Export determination: 6. \\
+Rationale: adding modules for earlier pdd update\\
+\vspace{3em}
+
+\noindent \textbf{Change \#663} with diff file ISSM-18970-18971.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/SMBpdd.py\\
+Export determination: 6. \\
+Rationale: BUG: fixed some indentation in py implemetation of PDD\\
+\vspace{3em}
+
+\noindent \textbf{Change \#664} with diff file ISSM-18971-18972.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test236.py\\
+Export determination: 6. \\
+Rationale: BUG: fixed some matlab to python conversion\\
+\vspace{3em}
+
+\noindent \textbf{Change \#665} with diff file ISSM-18972-18973.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/Archives/Archive236.nc M /issm/trunk-jpl/test/Archives/Archive237.nc\\
+Export determination: 6. \\
+Rationale: CHG: new archives after changes in PDD model\\
+\vspace{3em}
+
+\noindent \textbf{Change \#666} with diff file ISSM-18973-18974.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test3300.m A /issm/trunk-jpl/test/NightlyRun/test332.py A /issm/trunk-jpl/test/NightlyRun/test333.py\\
+Export determination: 6. \\
+Rationale: NEW: adding hydro test in puthon\\
+\vspace{3em}
+
+\noindent \textbf{Change \#667} with diff file ISSM-18974-18975.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test3300.m\\
+Export determination: 6. \\
+Rationale: CHG: reverting nightly 3300\\
+\vspace{3em}
+
+\noindent \textbf{Change \#668} with diff file ISSM-18975-18976.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_hydro\_nonlinear.cpp\\
+Export determination: 6. \\
+Rationale: minor clean-up in Hydro Code\\
+\vspace{3em}
+
+\noindent \textbf{Change \#669} with diff file ISSM-18976-18977.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp\\
+Export determination: 6. \\
+Rationale: BUG: temporary fix for Ice Volume\\
+\vspace{3em}
+
+\noindent \textbf{Change \#670} with diff file ISSM-18977-18978.diff: \\
+Function name: \\
+D /issm/trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2012.0.032-mpt.2.06rp16.sh D /issm/trunk-jpl/externalpackages/petsc/install-3.5-pleiades-intel2015.0.090-mpt.2.11r13.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh\\
+Export determination: 6. \\
+Rationale: CHG: switching to new compiler and new mpi\\
+\vspace{3em}
+
+\noindent \textbf{Change \#671} with diff file ISSM-18978-18979.diff: \\
+Function name: \\
+M /issm/trunk-jpl/configs/config-linux64-pleiades-intel2015.0.090-mpt.2.11r13.sh M /issm/trunk-jpl/externalpackages/gslib/install.sh M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_fct.cpp\\
+Export determination: 6. \\
+Rationale: CHG: switching to new compiler and new mpi\\
+\vspace{3em}
+
+\noindent \textbf{Change \#672} with diff file ISSM-18979-18980.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/clusters/pfe.m\\
+Export determination: 6. \\
+Rationale: CHG: switching to new compiler and new mpi\\
+\vspace{3em}
+
+\noindent \textbf{Change \#673} with diff file ISSM-18980-18981.diff: \\
+Function name: \\
+M /issm/trunk-jpl/m4/issm\_options.m4\\
+Export determination: 6. \\
+Rationale: CHG: update mkl to new compiler comp-intel/2015.0.090\\
+\vspace{3em}
+
+\noindent \textbf{Change \#674} with diff file ISSM-18981-18982.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp\\
+Export determination: 6. \\
+Rationale: NEW: adding a flag to switch off the epl thickness computation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#675} with diff file ISSM-18982-18983.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/hydrologydc.m M /issm/trunk-jpl/src/m/classes/hydrologydc.py M /issm/trunk-jpl/src/m/classes/model.py M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/HydrologydcEplThickCompEnum.m\\
+Export determination: 6. \\
+Rationale: NEW: adding a flag to switch off the epl thickness computation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#676} with diff file ISSM-18983-18984.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test3300.m M /issm/trunk-jpl/test/NightlyRun/test333.m M /issm/trunk-jpl/test/NightlyRun/test333.py M /issm/trunk-jpl/test/NightlyRun/test335.m\\
+Export determination: 6. \\
+Rationale: NEW: adding a flag to switch off the epl thickness computation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#677} with diff file ISSM-18984-18985.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/SMBpdd.m M /issm/trunk-jpl/src/m/classes/SMBpdd.py M /issm/trunk-jpl/test/NightlyRun/test237.py\\
+Export determination: 6. \\
+Rationale: BUG: fixgin PDD in python\\
+\vspace{3em}
+
+\noindent \textbf{Change \#678} with diff file ISSM-18985-18986.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp\\
+Export determination: 6. \\
+Rationale: CHG: Correction to hydro friciton\\
+\vspace{3em}
+
+\noindent \textbf{Change \#679} with diff file ISSM-18986-18987.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/hydrologydc.py\\
+Export determination: 6. \\
+Rationale: BUG: fixing python implementation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#680} with diff file ISSM-18987-18988.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test237.py\\
+Export determination: 6. \\
+Rationale: BUG: final fix\\
+\vspace{3em}
+
+\noindent \textbf{Change \#681} with diff file ISSM-18988-18989.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp\\
+Export determination: 6. \\
+Rationale: CHG: Correction to hydro friction\\
+\vspace{3em}
+
+\noindent \textbf{Change \#682} with diff file ISSM-18989-18990.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/Archives/Archive701.nc M /issm/trunk-jpl/test/NightlyRun/test701.m\\
+Export determination: 6. \\
+Rationale: CHG: reverting test701\\
+\vspace{3em}
+
+\noindent \textbf{Change \#683} with diff file ISSM-18990-18991.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp\\
+Export determination: 6. \\
+Rationale: BUG:adding zero velocity check in friction hydro\\
+\vspace{3em}
+
+\noindent \textbf{Change \#684} with diff file ISSM-18991-18992.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp\\
+Export determination: 6. \\
+Rationale: BUG: adding the case where effective pressure is null\\
+\vspace{3em}
+
+\noindent \textbf{Change \#685} with diff file ISSM-18992-18993.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp M /issm/trunk-jpl/src/c/classes/Loads/Friction.h\\
+Export determination: 6. \\
+Rationale: NEW: adding the complement to invert for the sliding parameter in Hydro friction law\\
+\vspace{3em}
+
+\noindent \textbf{Change \#686} with diff file ISSM-18993-18994.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/inversion.m A /issm/trunk-jpl/src/m/inversions/supportedcontrols.m\\
+Export determination: 6. \\
+Rationale: CHG: merging all controls in one file\\
+\vspace{3em}
+
+\noindent \textbf{Change \#687} with diff file ISSM-18994-18995.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/inversion.m M /issm/trunk-jpl/src/m/classes/inversion.py M /issm/trunk-jpl/src/m/classes/inversionvalidation.m M /issm/trunk-jpl/src/m/classes/m1qn3inversion.m M /issm/trunk-jpl/src/m/classes/m1qn3inversion.py M /issm/trunk-jpl/src/m/classes/taoinversion.m A /issm/trunk-jpl/src/m/inversions/marshallcostfunctions.m A /issm/trunk-jpl/src/m/inversions/marshallcostfunctions.py A /issm/trunk-jpl/src/m/inversions/supportedcontrols.py A /issm/trunk-jpl/src/m/inversions/supportedcostfunctions.m A /issm/trunk-jpl/src/m/inversions/supportedcostfunctions.py\\
+Export determination: 6. \\
+Rationale: NEW: merging cost functions\\
+\vspace{3em}
+
+\noindent \textbf{Change \#688} with diff file ISSM-18995-18996.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test511.py\\
+Export determination: 6. \\
+Rationale: BUG: requesting too many cpus was crashing the test\\
+\vspace{3em}
+
+\noindent \textbf{Change \#689} with diff file ISSM-18996-18997.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed memory leak\\
+\vspace{3em}
+
+\noindent \textbf{Change \#690} with diff file ISSM-18997-18998.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/exp/expdisp.m\\
+Export determination: 6. \\
+Rationale: CHG: added patch option to expdisp\\
+\vspace{3em}
+
+\noindent \textbf{Change \#691} with diff file ISSM-18998-18999.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/Outputdefinition100Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition11Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition12Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition13Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition14Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition15Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition16Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition17Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition18Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition19Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition20Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition21Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition22Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition23Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition24Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition25Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition26Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition27Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition28Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition29Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition30Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition31Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition32Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition33Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition34Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition35Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition36Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition37Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition38Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition39Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition40Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition41Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition42Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition43Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition44Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition45Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition46Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition47Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition48Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition49Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition50Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition51Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition52Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition53Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition54Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition55Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition56Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition57Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition58Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition59Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition60Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition61Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition62Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition63Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition64Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition65Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition66Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition67Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition68Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition69Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition70Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition71Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition72Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition73Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition74Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition75Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition76Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition77Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition78Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition79Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition80Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition81Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition82Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition83Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition84Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition85Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition86Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition87Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition88Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition89Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition90Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition91Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition92Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition93Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition94Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition95Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition96Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition97Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition98Enum.m A /issm/trunk-jpl/src/m/enum/Outputdefinition99Enum.m\\
+Export determination: 6. \\
+Rationale: CHG: add more output defs\\
+\vspace{3em}
+
+\noindent \textbf{Change \#692} with diff file ISSM-18999-19000.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp\\
+Export determination: 6. \\
+Rationale: CHG: new output def enums\\
+\vspace{3em}
+
+\noindent \textbf{Change \#693} with diff file ISSM-19000-19001.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/massfluxatgate.m\\
+Export determination: 6. \\
+Rationale: CHG: add more output def options\\
+\vspace{3em}
+
+\noindent \textbf{Change \#694} with diff file ISSM-19001-19002.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/frictionhydro.m M /issm/trunk-jpl/src/m/inversions/supportedcontrols.m M /issm/trunk-jpl/src/m/inversions/supportedcontrols.py\\
+Export determination: 6. \\
+Rationale: Adding the inversion capability for hydro related friction law\\
+\vspace{3em}
+
+\noindent \textbf{Change \#695} with diff file ISSM-19002-19003.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/Inputs/TriaInput.h M /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp M /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp\\
+Export determination: 6. \\
+Rationale: Adding the inversion capability for hydro related friction law\\
+\vspace{3em}
+
+\noindent \textbf{Change \#696} with diff file ISSM-19003-19004.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG:Corection ine Epl thickness and effective pressure computation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#697} with diff file ISSM-19004-19005.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixing min\\
+\vspace{3em}
+
+\noindent \textbf{Change \#698} with diff file ISSM-19005-19006.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixing effective pressure computation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#699} with diff file ISSM-19006-19007.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG:fixing epl thickness computation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#700} with diff file ISSM-19007-19008.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG:deleting print\\
+\vspace{3em}
+
+\noindent \textbf{Change \#701} with diff file ISSM-19008-19009.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/shared/Elements/ComputeDelta18oTemperaturePrecipitation.cpp\\
+Export determination: 6. \\
+Rationale: update comments on deltaO18 pdd method\\
+\vspace{3em}
+
+\noindent \textbf{Change \#702} with diff file ISSM-19009-19010.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/classes/FemModel.h M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_hydro\_nonlinear.cpp\\
+Export determination: 6. \\
+Rationale: CHG: change in the solution sequecence for a better gestion of the epl colapse\\
+\vspace{3em}
+
+\noindent \textbf{Change \#703} with diff file ISSM-19010-19011.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/Makefile.am A /issm/trunk-jpl/src/c/modules/ExpToLevelSetx A /issm/trunk-jpl/src/c/modules/ExpToLevelSetx/ExpToLevelSetx.cpp A /issm/trunk-jpl/src/c/modules/ExpToLevelSetx/ExpToLevelSetx.h A /issm/trunk-jpl/src/c/modules/ExpToLevelSetx/ExpToLevelSetxt.cpp A /issm/trunk-jpl/src/wrappers/ExpToLevelSet A /issm/trunk-jpl/src/wrappers/ExpToLevelSet/ExpToLevelSet.cpp A /issm/trunk-jpl/src/wrappers/ExpToLevelSet/ExpToLevelSet.h\\
+Export determination: 6. \\
+Rationale: CHG: new module ExpToLevelSet.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#704} with diff file ISSM-19011-19012.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/wrappers/M1qn3 A /issm/trunk-jpl/src/wrappers/M1qn3/M1qn3.cpp A /issm/trunk-jpl/src/wrappers/M1qn3/M1qn3.h M /issm/trunk-jpl/src/wrappers/matlab/Makefile.am\\
+Export determination: 6. \\
+Rationale: CHG: new M1qn3 module, to use it in matlab.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#705} with diff file ISSM-19012-19013.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/contrib/resultstomatrix.m\\
+Export determination: 6. \\
+Rationale: NEW: new function resultstomatrix to extract results from md.results and to resample them in time.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#706} with diff file ISSM-19013-19014.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/plot/export\_gl.m A /issm/trunk-jpl/src/m/plot/writejsfield.m A /issm/trunk-jpl/src/m/plot/writejsfile.m\\
+Export determination: 6. \\
+Rationale: CHG: new export capability towards the visl outreach project.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#707} with diff file ISSM-19014-19015.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/matice.m M /issm/trunk-jpl/src/m/classes/matice.py\\
+Export determination: 6. \\
+Rationale: CHG: making the rheology a forcing.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#708} with diff file ISSM-19015-19016.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/modules.h\\
+Export determination: 6. \\
+Rationale: CHG: adding ExpToLevelSet header file.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#709} with diff file ISSM-19016-19017.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/plotdoc.m\\
+Export determination: 6. \\
+Rationale: CHG: small update on plotdoc regarding 'alloptions' option, which is now gone.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#710} with diff file ISSM-19017-19018.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/ExpToLevelSetx\\
+Export determination: 6. \\
+Rationale: CHG: get svn to ignore some files\\
+\vspace{3em}
+
+\noindent \textbf{Change \#711} with diff file ISSM-19018-19019.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG: minor\\
+\vspace{3em}
+
+\noindent \textbf{Change \#712} with diff file ISSM-19019-19020.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/classes/FemModel.h M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp A /issm/trunk-jpl/src/m/enum/CalvingDevEnum.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/StrainRateeffectiveEnum.m\\
+Export determination: 6. \\
+Rationale: CHG: added some enums\\
+\vspace{3em}
+
+\noindent \textbf{Change \#713} with diff file ISSM-19020-19021.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/wrappers/ExpToLevelSet M /issm/trunk-jpl/src/wrappers/M1qn3 M /issm/trunk-jpl/src/wrappers/matlab/Makefile.am\\
+Export determination: 6. \\
+Rationale: BUG: Eric forgot to add M1QN3 to LDADD\\
+\vspace{3em}
+
+\noindent \textbf{Change \#714} with diff file ISSM-19021-19022.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/wrappers/M1qn3/M1qn3.cpp\\
+Export determination: 6. \\
+Rationale: CHG: minor\\
+\vspace{3em}
+
+\noindent \textbf{Change \#715} with diff file ISSM-19022-19023.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/wrappers/M1qn3/M1qn3.cpp\\
+Export determination: 6. \\
+Rationale: BUG: forgot to add \_HAVE\_M1QN3\_\\
+\vspace{3em}
+
+\noindent \textbf{Change \#716} with diff file ISSM-19023-19024.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/contrib/hack/resultstomatrix.m (from /issm/trunk-jpl/src/m/contrib/resultstomatrix.m:19021) D /issm/trunk-jpl/src/m/contrib/resultstomatrix.m\\
+Export determination: 6. \\
+Rationale: CHG: moving stuff around\\
+\vspace{3em}
+
+\noindent \textbf{Change \#717} with diff file ISSM-19024-19025.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/calving.m M /issm/trunk-jpl/src/m/classes/calving.py M /issm/trunk-jpl/src/m/classes/calvinglevermann.m M /issm/trunk-jpl/src/m/classes/calvinglevermann.py M /issm/trunk-jpl/src/m/classes/calvingpi.m M /issm/trunk-jpl/src/wrappers/M1qn3/M1qn3.cpp\\
+Export determination: 6. \\
+Rationale: NEW: added stabilization to calving\\
+\vspace{3em}
+
+\noindent \textbf{Change \#718} with diff file ISSM-19025-19026.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp M /issm/trunk-jpl/src/c/cores/transient\_core.cpp\\
+Export determination: 6. \\
+Rationale: CHG: allow stabilization to be dynamic\\
+\vspace{3em}
+
+\noindent \textbf{Change \#719} with diff file ISSM-19026-19027.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/plot\_gridded.m\\
+Export determination: 6. \\
+Rationale: CHG: added isinf check on data\_min\\
+\vspace{3em}
+
+\noindent \textbf{Change \#720} with diff file ISSM-19027-19028.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Inputs/TransientInput.h M /issm/trunk-jpl/src/m/classes/SMB.m M /issm/trunk-jpl/src/m/classes/SMB.py M /issm/trunk-jpl/src/m/classes/SMBcomponents.m M /issm/trunk-jpl/src/m/classes/SMBcomponents.py M /issm/trunk-jpl/src/m/classes/SMBgradients.m M /issm/trunk-jpl/src/m/classes/SMBgradients.py M /issm/trunk-jpl/src/m/classes/SMBhenning.m M /issm/trunk-jpl/src/m/classes/SMBmeltcomponents.m M /issm/trunk-jpl/src/m/classes/SMBmeltcomponents.py M /issm/trunk-jpl/src/m/classes/SMBpdd.m M /issm/trunk-jpl/src/m/classes/SMBpdd.py M /issm/trunk-jpl/src/m/classes/basalforcings.m M /issm/trunk-jpl/src/m/classes/basalforcings.py M /issm/trunk-jpl/src/m/classes/calving.m M /issm/trunk-jpl/src/m/classes/calving.py M /issm/trunk-jpl/src/m/classes/calvinglevermann.m M /issm/trunk-jpl/src/m/classes/calvinglevermann.py M /issm/trunk-jpl/src/m/classes/calvingpi.m M /issm/trunk-jpl/src/m/classes/damage.m M /issm/trunk-jpl/src/m/classes/damage.py M /issm/trunk-jpl/src/m/classes/friction.m M /issm/trunk-jpl/src/m/classes/friction.py M /issm/trunk-jpl/src/m/classes/frictionhydro.m M /issm/trunk-jpl/src/m/classes/frictiontemp.m M /issm/trunk-jpl/src/m/classes/frictionwaterlayer.m M /issm/trunk-jpl/src/m/classes/frictionweertman.m M /issm/trunk-jpl/src/m/classes/frictionweertman.py M /issm/trunk-jpl/src/m/classes/frictionweertmantemp.m M /issm/trunk-jpl/src/m/classes/geometry.m M /issm/trunk-jpl/src/m/classes/geometry.py M /issm/trunk-jpl/src/m/classes/hydrologydc.m M /issm/trunk-jpl/src/m/classes/hydrologydc.py M /issm/trunk-jpl/src/m/classes/hydrologyshreve.m M /issm/trunk-jpl/src/m/classes/hydrologyshreve.py M /issm/trunk-jpl/src/m/classes/linearbasalforcings.m M /issm/trunk-jpl/src/m/classes/linearbasalforcings.py M /issm/trunk-jpl/src/m/classes/masscon.m M /issm/trunk-jpl/src/m/classes/masstransport.m M /issm/trunk-jpl/src/m/classes/masstransport.py M /issm/trunk-jpl/src/m/classes/matice.m M /issm/trunk-jpl/src/m/classes/matice.py M /issm/trunk-jpl/src/m/classes/misfit.m M /issm/trunk-jpl/src/m/classes/snowpack.m M /issm/trunk-jpl/src/m/classes/stressbalance.m M /issm/trunk-jpl/src/m/classes/stressbalance.py M /issm/trunk-jpl/src/m/classes/thermal.m M /issm/trunk-jpl/src/m/classes/thermal.py M /issm/trunk-jpl/src/m/consistency/checkfield.m M /issm/trunk-jpl/src/m/consistency/checkfield.py M /issm/trunk-jpl/src/m/solve/WriteData.m M /issm/trunk-jpl/src/m/solve/WriteData.py\\
+Export determination: 6. \\
+Rationale: CHG: renamed 'forcing' -> 'timeseries'\\
+\vspace{3em}
+
+\noindent \textbf{Change \#721} with diff file ISSM-19028-19029.diff: \\
+Function name: \\
+D /issm/trunk-jpl/src/ad\\
+Export determination: 6. \\
+Rationale: DEL: not needed anymore\\
+\vspace{3em}
+
+\noindent \textbf{Change \#722} with diff file ISSM-19029-19030.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp\\
+Export determination: 6. \\
+Rationale: CHG: fix folds from delo18 call\\
+\vspace{3em}
+
+\noindent \textbf{Change \#723} with diff file ISSM-19030-19031.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/shared/Matrix/MatrixUtils.cpp M /issm/trunk-jpl/src/c/shared/Matrix/matrix.h\\
+Export determination: 6. \\
+Rationale: NEW: added eigen values and vector calculations for 2x2 symetric matrices\\
+\vspace{3em}
+
+\noindent \textbf{Change \#724} with diff file ISSM-19031-19032.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test3300.m\\
+Export determination: 6. \\
+Rationale: change in leakage value\\
+\vspace{3em}
+
+\noindent \textbf{Change \#725} with diff file ISSM-19032-19033.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixing time dependance of the transfer\\
+\vspace{3em}
+
+\noindent \textbf{Change \#726} with diff file ISSM-19033-19034.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.h M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.h M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/classes/FemModel.h M /issm/trunk-jpl/src/c/cores/transient\_core.cpp\\
+Export determination: 6. \\
+Rationale: NEW: testing new calving law\\
+\vspace{3em}
+
+\noindent \textbf{Change \#727} with diff file ISSM-19034-19035.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/classes/calvingdev.m\\
+Export determination: 6. \\
+Rationale: NEW: adding new calving law\\
+\vspace{3em}
+
+\noindent \textbf{Change \#728} with diff file ISSM-19035-19036.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/plot/export\_gl.py A /issm/trunk-jpl/src/m/plot/writejsfield.py A /issm/trunk-jpl/src/m/plot/writejsfile.py\\
+Export determination: 6. \\
+Rationale: ADD: Pythonized versions of js database export functions, partially pythonized export\_gl.py\\
+\vspace{3em}
+
+\noindent \textbf{Change \#729} with diff file ISSM-19036-19037.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/export\_gl.py M /issm/trunk-jpl/src/m/plot/writejsfield.py M /issm/trunk-jpl/src/m/plot/writejsfile.py\\
+Export determination: 6. \\
+Rationale: CHG: Export python script modifications\\
+\vspace{3em}
+
+\noindent \textbf{Change \#730} with diff file ISSM-19037-19038.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/writejsfield.py M /issm/trunk-jpl/src/m/plot/writejsfile.py\\
+Export determination: 6. \\
+Rationale: Corrected\\
+\vspace{3em}
+
+\noindent \textbf{Change \#731} with diff file ISSM-19038-19039.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/export\_gl.py\\
+Export determination: 6. \\
+Rationale: export\_gl\\
+\vspace{3em}
+
+\noindent \textbf{Change \#732} with diff file ISSM-19039-19040.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/export\_gl.py\\
+Export determination: 6. \\
+Rationale: All syntax fixed for export scripts\\
+\vspace{3em}
+
+\noindent \textbf{Change \#733} with diff file ISSM-19040-19041.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/SMB.m M /issm/trunk-jpl/src/m/classes/SMBcomponents.m M /issm/trunk-jpl/src/m/classes/SMBgradients.m M /issm/trunk-jpl/src/m/classes/SMBhenning.m M /issm/trunk-jpl/src/m/classes/SMBmeltcomponents.m M /issm/trunk-jpl/src/m/classes/SMBpdd.m M /issm/trunk-jpl/src/m/classes/adinversion.m M /issm/trunk-jpl/src/m/classes/autodiff.m M /issm/trunk-jpl/src/m/classes/balancethickness.m M /issm/trunk-jpl/src/m/classes/basalforcings.m M /issm/trunk-jpl/src/m/classes/calving.m M /issm/trunk-jpl/src/m/classes/calvingdev.m M /issm/trunk-jpl/src/m/classes/calvinglevermann.m M /issm/trunk-jpl/src/m/classes/calvingpi.m M /issm/trunk-jpl/src/m/classes/clusters/generic.m M /issm/trunk-jpl/src/m/classes/constants.m M /issm/trunk-jpl/src/m/classes/damage.m M /issm/trunk-jpl/src/m/classes/debug.m M /issm/trunk-jpl/src/m/classes/dependent.m M /issm/trunk-jpl/src/m/classes/flaim.m M /issm/trunk-jpl/src/m/classes/flowequation.m M /issm/trunk-jpl/src/m/classes/friction.m M /issm/trunk-jpl/src/m/classes/frictionhydro.m M /issm/trunk-jpl/src/m/classes/frictiontemp.m M /issm/trunk-jpl/src/m/classes/frictionwaterlayer.m M /issm/trunk-jpl/src/m/classes/frictionweertman.m M /issm/trunk-jpl/src/m/classes/frictionweertmantemp.m M /issm/trunk-jpl/src/m/classes/geometry.m M /issm/trunk-jpl/src/m/classes/gia.m M /issm/trunk-jpl/src/m/classes/groundingline.m M /issm/trunk-jpl/src/m/classes/hydrologydc.m M /issm/trunk-jpl/src/m/classes/hydrologyshreve.m M /issm/trunk-jpl/src/m/classes/independent.m M /issm/trunk-jpl/src/m/classes/initialization.m M /issm/trunk-jpl/src/m/classes/inversion.m M /issm/trunk-jpl/src/m/classes/inversionvalidation.m M /issm/trunk-jpl/src/m/classes/linearbasalforcings.m M /issm/trunk-jpl/src/m/classes/m1qn3inversion.m M /issm/trunk-jpl/src/m/classes/mask.m M /issm/trunk-jpl/src/m/classes/masscon.m M /issm/trunk-jpl/src/m/classes/massconaxpby.m M /issm/trunk-jpl/src/m/classes/massfluxatgate.m M /issm/trunk-jpl/src/m/classes/masstransport.m M /issm/trunk-jpl/src/m/classes/matdamageice.m M /issm/trunk-jpl/src/m/classes/matice.m M /issm/trunk-jpl/src/m/classes/matseaice.m M /issm/trunk-jpl/src/m/classes/mesh2d.m M /issm/trunk-jpl/src/m/classes/mesh2dvertical.m M /issm/trunk-jpl/src/m/classes/mesh3dprisms.m M /issm/trunk-jpl/src/m/classes/mesh3dtetras.m M /issm/trunk-jpl/src/m/classes/miscellaneous.m M /issm/trunk-jpl/src/m/classes/misfit.m M /issm/trunk-jpl/src/m/classes/model.m M /issm/trunk-jpl/src/m/classes/modellist.m M /issm/trunk-jpl/src/m/classes/outputdefinition.m M /issm/trunk-jpl/src/m/classes/pairoptions.m M /issm/trunk-jpl/src/m/classes/private.m M /issm/trunk-jpl/src/m/classes/qmu.m M /issm/trunk-jpl/src/m/classes/radaroverlay.m M /issm/trunk-jpl/src/m/classes/rifts.m M /issm/trunk-jpl/src/m/classes/seaice.m M /issm/trunk-jpl/src/m/classes/seaiceatm.m M /issm/trunk-jpl/src/m/classes/seaiceinitialization.m M /issm/trunk-jpl/src/m/classes/seaiceocean.m M /issm/trunk-jpl/src/m/classes/settings.m M /issm/trunk-jpl/src/m/classes/snowpack.m M /issm/trunk-jpl/src/m/classes/spheremesh.m M /issm/trunk-jpl/src/m/classes/steadystate.m M /issm/trunk-jpl/src/m/classes/stressbalance.m M /issm/trunk-jpl/src/m/classes/taoinversion.m M /issm/trunk-jpl/src/m/classes/thermal.m M /issm/trunk-jpl/src/m/classes/timestepping.m M /issm/trunk-jpl/src/m/classes/toolkits.m M /issm/trunk-jpl/src/m/classes/toolkits.py M /issm/trunk-jpl/src/m/classes/transient.m M /issm/trunk-jpl/src/m/classes/verbose.m\\
+Export determination: 6. \\
+Rationale: CHG: renmaned obj -> self to look like python\\
+\vspace{3em}
+
+\noindent \textbf{Change \#734} with diff file ISSM-19041-19042.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/m1qn3inversion.py\\
+Export determination: 6. \\
+Rationale: CHG: fixing some issues in constructor.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#735} with diff file ISSM-19042-19043.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/adinversion.m M /issm/trunk-jpl/src/m/classes/frictiontemp.m M /issm/trunk-jpl/src/m/classes/frictionwaterlayer.m M /issm/trunk-jpl/src/m/classes/hydrologyshreve.m M /issm/trunk-jpl/src/m/classes/inversionvalidation.m M /issm/trunk-jpl/src/m/classes/linearbasalforcings.m\\
+Export determination: 6. \\
+Rationale: BUG: minor\\
+\vspace{3em}
+
+\noindent \textbf{Change \#736} with diff file ISSM-19043-19044.diff: \\
+Function name: \\
+M /issm/trunk-jpl/examples/ISMIP/CheatyRunme.m M /issm/trunk-jpl/examples/ISMIP/runme.m M /issm/trunk-jpl/examples/Pig/Pig.par M /issm/trunk-jpl/examples/Pig/PigRegion.m M /issm/trunk-jpl/examples/Pig/runme.m\\
+Export determination: 6. \\
+Rationale: CHG: removed all folds\\
+\vspace{3em}
+
+\noindent \textbf{Change \#737} with diff file ISSM-19044-19045.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/export\_gl.py M /issm/trunk-jpl/src/m/plot/writejsfield.py M /issm/trunk-jpl/src/m/plot/writejsfile.py\\
+Export determination: 6. \\
+Rationale: Updated export\_gl scripts now working\\
+\vspace{3em}
+
+\noindent \textbf{Change \#738} with diff file ISSM-19045-19046.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/export\_gl.py M /issm/trunk-jpl/src/m/plot/writejsfield.py M /issm/trunk-jpl/src/m/plot/writejsfile.py\\
+Export determination: 6. \\
+Rationale: Updated export script formatting\\
+\vspace{3em}
+
+\noindent \textbf{Change \#739} with diff file ISSM-19046-19047.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/export\_gl.py\\
+Export determination: 6. \\
+Rationale: Updated export script formatting again\\
+\vspace{3em}
+
+\noindent \textbf{Change \#740} with diff file ISSM-19047-19048.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c M /issm/trunk-jpl/src/c/Makefile.am M /issm/trunk-jpl/src/c/cores/transient\_core.cpp M /issm/trunk-jpl/src/c/modules A /issm/trunk-jpl/src/c/modules/Calvingx A /issm/trunk-jpl/src/c/modules/Calvingx/Calvingx.cpp A /issm/trunk-jpl/src/c/modules/Calvingx/Calvingx.h M /issm/trunk-jpl/src/c/modules/ExpToLevelSetx M /issm/trunk-jpl/src/c/modules/modules.h M /issm/trunk-jpl/src/wrappers M /issm/trunk-jpl/src/wrappers/ExpToLevelSet M /issm/trunk-jpl/src/wrappers/M1qn3 M /issm/trunk-jpl/src/wrappers/matlab/Makefile.am M /issm/trunk-jpl/src/wrappers/python/Makefile.am\\
+Export determination: 6. \\
+Rationale: NEW: added Calvingx module, and removed all header files from Makefile.am\\
+\vspace{3em}
+
+\noindent \textbf{Change \#741} with diff file ISSM-19048-19049.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/basalforcings.m M /issm/trunk-jpl/src/m/classes/basalforcings.py M /issm/trunk-jpl/src/m/classes/calving.m M /issm/trunk-jpl/src/m/classes/calving.py M /issm/trunk-jpl/src/m/classes/calvinglevermann.m M /issm/trunk-jpl/src/m/classes/calvinglevermann.py M /issm/trunk-jpl/src/m/classes/calvingpi.m M /issm/trunk-jpl/src/m/classes/damage.m M /issm/trunk-jpl/src/m/classes/damage.py M /issm/trunk-jpl/src/m/classes/flowequation.m M /issm/trunk-jpl/src/m/classes/flowequation.py M /issm/trunk-jpl/src/m/classes/friction.m M /issm/trunk-jpl/src/m/classes/friction.py M /issm/trunk-jpl/src/m/classes/frictionhydro.m M /issm/trunk-jpl/src/m/classes/frictionwaterlayer.m M /issm/trunk-jpl/src/m/classes/frictionweertman.m M /issm/trunk-jpl/src/m/classes/frictionweertman.py M /issm/trunk-jpl/src/m/classes/geometry.m M /issm/trunk-jpl/src/m/classes/geometry.py M /issm/trunk-jpl/src/m/classes/gia.m M /issm/trunk-jpl/src/m/classes/gia.py M /issm/trunk-jpl/src/m/classes/hydrologydc.m M /issm/trunk-jpl/src/m/classes/hydrologydc.py M /issm/trunk-jpl/src/m/classes/hydrologyshreve.m M /issm/trunk-jpl/src/m/classes/hydrologyshreve.py M /issm/trunk-jpl/src/m/classes/initialization.m M /issm/trunk-jpl/src/m/classes/initialization.py M /issm/trunk-jpl/src/m/classes/inversion.m M /issm/trunk-jpl/src/m/classes/inversion.py M /issm/trunk-jpl/src/m/classes/inversionvalidation.m M /issm/trunk-jpl/src/m/classes/m1qn3inversion.m M /issm/trunk-jpl/src/m/classes/m1qn3inversion.py M /issm/trunk-jpl/src/m/classes/mask.m M /issm/trunk-jpl/src/m/classes/mask.py M /issm/trunk-jpl/src/m/classes/masstransport.m M /issm/trunk-jpl/src/m/classes/masstransport.py M /issm/trunk-jpl/src/m/classes/matdamageice.m M /issm/trunk-jpl/src/m/classes/matdamageice.py M /issm/trunk-jpl/src/m/classes/matice.m M /issm/trunk-jpl/src/m/classes/matice.py M /issm/trunk-jpl/src/m/classes/model.m M /issm/trunk-jpl/src/m/classes/model.py M /issm/trunk-jpl/src/m/classes/qmu.m M /issm/trunk-jpl/src/m/classes/qmu.py M /issm/trunk-jpl/src/m/classes/stressbalance.m M /issm/trunk-jpl/src/m/classes/stressbalance.py M /issm/trunk-jpl/src/m/classes/taoinversion.m M /issm/trunk-jpl/src/m/classes/thermal.m M /issm/trunk-jpl/src/m/classes/thermal.py M /issm/trunk-jpl/src/m/dev/issmversion.m\\
+Export determination: 6. \\
+Rationale: NEW: extrude is now a method of each class so that model.m does not need to know what class is being used\\
+\vspace{3em}
+
+\noindent \textbf{Change \#742} with diff file ISSM-19049-19050.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/IdToName.m M /issm/trunk-jpl/test/NightlyRun/IdToName.py M /issm/trunk-jpl/test/NightlyRun/test101.m M /issm/trunk-jpl/test/NightlyRun/test101.py M /issm/trunk-jpl/test/NightlyRun/test102.m M /issm/trunk-jpl/test/NightlyRun/test102.py M /issm/trunk-jpl/test/NightlyRun/test103.m M /issm/trunk-jpl/test/NightlyRun/test103.py M /issm/trunk-jpl/test/NightlyRun/test104.m M /issm/trunk-jpl/test/NightlyRun/test104.py M /issm/trunk-jpl/test/NightlyRun/test105.m M /issm/trunk-jpl/test/NightlyRun/test105.py M /issm/trunk-jpl/test/NightlyRun/test106.m M /issm/trunk-jpl/test/NightlyRun/test106.py M /issm/trunk-jpl/test/NightlyRun/test107.m M /issm/trunk-jpl/test/NightlyRun/test107.py M /issm/trunk-jpl/test/NightlyRun/test108.m M /issm/trunk-jpl/test/NightlyRun/test108.py M /issm/trunk-jpl/test/NightlyRun/test109.m M /issm/trunk-jpl/test/NightlyRun/test109.py M /issm/trunk-jpl/test/NightlyRun/test110.m M /issm/trunk-jpl/test/NightlyRun/test110.py M /issm/trunk-jpl/test/NightlyRun/test1101.m M /issm/trunk-jpl/test/NightlyRun/test1101.py M /issm/trunk-jpl/test/NightlyRun/test1102.m M /issm/trunk-jpl/test/NightlyRun/test1102.py M /issm/trunk-jpl/test/NightlyRun/test1103.m M /issm/trunk-jpl/test/NightlyRun/test1103.py M /issm/trunk-jpl/test/NightlyRun/test1104.m M /issm/trunk-jpl/test/NightlyRun/test1104.py M /issm/trunk-jpl/test/NightlyRun/test1105.m M /issm/trunk-jpl/test/NightlyRun/test1105.py M /issm/trunk-jpl/test/NightlyRun/test1106.m M /issm/trunk-jpl/test/NightlyRun/test1106.py M /issm/trunk-jpl/test/NightlyRun/test1107.m M /issm/trunk-jpl/test/NightlyRun/test1107.py M /issm/trunk-jpl/test/NightlyRun/test1108.m M /issm/trunk-jpl/test/NightlyRun/test1108.py M /issm/trunk-jpl/test/NightlyRun/test1109.m M /issm/trunk-jpl/test/NightlyRun/test111.m M /issm/trunk-jpl/test/NightlyRun/test111.py M /issm/trunk-jpl/test/NightlyRun/test1110.m M /issm/trunk-jpl/test/NightlyRun/test112.m M /issm/trunk-jpl/test/NightlyRun/test112.py M /issm/trunk-jpl/test/NightlyRun/test113.m M /issm/trunk-jpl/test/NightlyRun/test113.py M /issm/trunk-jpl/test/NightlyRun/test114.m M /issm/trunk-jpl/test/NightlyRun/test114.py M /issm/trunk-jpl/test/NightlyRun/test115.m M /issm/trunk-jpl/test/NightlyRun/test115.py M /issm/trunk-jpl/test/NightlyRun/test116.m M /issm/trunk-jpl/test/NightlyRun/test116.py D /issm/trunk-jpl/test/NightlyRun/test117.m D /issm/trunk-jpl/test/NightlyRun/test117.py D /issm/trunk-jpl/test/NightlyRun/test118.m D /issm/trunk-jpl/test/NightlyRun/test118.py M /issm/trunk-jpl/test/NightlyRun/test119.m M /issm/trunk-jpl/test/NightlyRun/test119.py M /issm/trunk-jpl/test/NightlyRun/test120.m M /issm/trunk-jpl/test/NightlyRun/test120.py M /issm/trunk-jpl/test/NightlyRun/test1201.m M /issm/trunk-jpl/test/NightlyRun/test1201.py M /issm/trunk-jpl/test/NightlyRun/test1202.m M /issm/trunk-jpl/test/NightlyRun/test1202.py M /issm/trunk-jpl/test/NightlyRun/test1203.m M /issm/trunk-jpl/test/NightlyRun/test1203.py M /issm/trunk-jpl/test/NightlyRun/test1204.m M /issm/trunk-jpl/test/NightlyRun/test1204.py M /issm/trunk-jpl/test/NightlyRun/test1205.m M /issm/trunk-jpl/test/NightlyRun/test1205.py M /issm/trunk-jpl/test/NightlyRun/test1206.m M /issm/trunk-jpl/test/NightlyRun/test1206.py M /issm/trunk-jpl/test/NightlyRun/test1207.m M /issm/trunk-jpl/test/NightlyRun/test1207.py M /issm/trunk-jpl/test/NightlyRun/test1208.m M /issm/trunk-jpl/test/NightlyRun/test1208.py M /issm/trunk-jpl/test/NightlyRun/test121.m M /issm/trunk-jpl/test/NightlyRun/test121.py M /issm/trunk-jpl/test/NightlyRun/test122.m M /issm/trunk-jpl/test/NightlyRun/test122.py M /issm/trunk-jpl/test/NightlyRun/test123.m M /issm/trunk-jpl/test/NightlyRun/test124.m M /issm/trunk-jpl/test/NightlyRun/test1301.m M /issm/trunk-jpl/test/NightlyRun/test1301.py M /issm/trunk-jpl/test/NightlyRun/test1302.m M /issm/trunk-jpl/test/NightlyRun/test1302.py M /issm/trunk-jpl/test/NightlyRun/test1303.m M /issm/trunk-jpl/test/NightlyRun/test1303.py M /issm/trunk-jpl/test/NightlyRun/test1304.m M /issm/trunk-jpl/test/NightlyRun/test1304.py M /issm/trunk-jpl/test/NightlyRun/test1401.m M /issm/trunk-jpl/test/NightlyRun/test1402.m M /issm/trunk-jpl/test/NightlyRun/test1501.m M /issm/trunk-jpl/test/NightlyRun/test1501.py M /issm/trunk-jpl/test/NightlyRun/test1502.m M /issm/trunk-jpl/test/NightlyRun/test1502.py M /issm/trunk-jpl/test/NightlyRun/test1601.m M /issm/trunk-jpl/test/NightlyRun/test1601.py M /issm/trunk-jpl/test/NightlyRun/test1602.m M /issm/trunk-jpl/test/NightlyRun/test1602.py M /issm/trunk-jpl/test/NightlyRun/test2001.m M /issm/trunk-jpl/test/NightlyRun/test2001.py M /issm/trunk-jpl/test/NightlyRun/test201.m M /issm/trunk-jpl/test/NightlyRun/test201.py M /issm/trunk-jpl/test/NightlyRun/test202.m M /issm/trunk-jpl/test/NightlyRun/test202.py M /issm/trunk-jpl/test/NightlyRun/test203.m M /issm/trunk-jpl/test/NightlyRun/test203.py M /issm/trunk-jpl/test/NightlyRun/test204.m M /issm/trunk-jpl/test/NightlyRun/test204.py M /issm/trunk-jpl/test/NightlyRun/test205.m M /issm/trunk-jpl/test/NightlyRun/test205.py M /issm/trunk-jpl/test/NightlyRun/test2051.m M /issm/trunk-jpl/test/NightlyRun/test2052.m M /issm/trunk-jpl/test/NightlyRun/test2053.m M /issm/trunk-jpl/test/NightlyRun/test206.m M /issm/trunk-jpl/test/NightlyRun/test206.py M /issm/trunk-jpl/test/NightlyRun/test207.m M /issm/trunk-jpl/test/NightlyRun/test207.py M /issm/trunk-jpl/test/NightlyRun/test2071.m M /issm/trunk-jpl/test/NightlyRun/test2072.m M /issm/trunk-jpl/test/NightlyRun/test2073.m M /issm/trunk-jpl/test/NightlyRun/test208.m M /issm/trunk-jpl/test/NightlyRun/test208.py M /issm/trunk-jpl/test/NightlyRun/test2081.m M /issm/trunk-jpl/test/NightlyRun/test2082.m M /issm/trunk-jpl/test/NightlyRun/test2083.m M /issm/trunk-jpl/test/NightlyRun/test209.m M /issm/trunk-jpl/test/NightlyRun/test209.py M /issm/trunk-jpl/test/NightlyRun/test210.m M /issm/trunk-jpl/test/NightlyRun/test210.py M /issm/trunk-jpl/test/NightlyRun/test211.m M /issm/trunk-jpl/test/NightlyRun/test211.py M /issm/trunk-jpl/test/NightlyRun/test212.m M /issm/trunk-jpl/test/NightlyRun/test212.py M /issm/trunk-jpl/test/NightlyRun/test213.m M /issm/trunk-jpl/test/NightlyRun/test213.py M /issm/trunk-jpl/test/NightlyRun/test214.m M /issm/trunk-jpl/test/NightlyRun/test214.py M /issm/trunk-jpl/test/NightlyRun/test215.m M /issm/trunk-jpl/test/NightlyRun/test215.py M /issm/trunk-jpl/test/NightlyRun/test216.m M /issm/trunk-jpl/test/NightlyRun/test216.py M /issm/trunk-jpl/test/NightlyRun/test217.m M /issm/trunk-jpl/test/NightlyRun/test217.py M /issm/trunk-jpl/test/NightlyRun/test218.m M /issm/trunk-jpl/test/NightlyRun/test219.m M /issm/trunk-jpl/test/NightlyRun/test219.py M /issm/trunk-jpl/test/NightlyRun/test220.m M /issm/trunk-jpl/test/NightlyRun/test220.py M /issm/trunk-jpl/test/NightlyRun/test221.m M /issm/trunk-jpl/test/NightlyRun/test221.py M /issm/trunk-jpl/test/NightlyRun/test222.m M /issm/trunk-jpl/test/NightlyRun/test222.py M /issm/trunk-jpl/test/NightlyRun/test223.m M /issm/trunk-jpl/test/NightlyRun/test223.py M /issm/trunk-jpl/test/NightlyRun/test224.m M /issm/trunk-jpl/test/NightlyRun/test224.py M /issm/trunk-jpl/test/NightlyRun/test225.m M /issm/trunk-jpl/test/NightlyRun/test225.py M /issm/trunk-jpl/test/NightlyRun/test226.m M /issm/trunk-jpl/test/NightlyRun/test226.py M /issm/trunk-jpl/test/NightlyRun/test227.m M /issm/trunk-jpl/test/NightlyRun/test227.py M /issm/trunk-jpl/test/NightlyRun/test228.m M /issm/trunk-jpl/test/NightlyRun/test228.py M /issm/trunk-jpl/test/NightlyRun/test229.m M /issm/trunk-jpl/test/NightlyRun/test229.py M /issm/trunk-jpl/test/NightlyRun/test230.m M /issm/trunk-jpl/test/NightlyRun/test230.py M /issm/trunk-jpl/test/NightlyRun/test231.m M /issm/trunk-jpl/test/NightlyRun/test231.py M /issm/trunk-jpl/test/NightlyRun/test232.m M /issm/trunk-jpl/test/NightlyRun/test232.py M /issm/trunk-jpl/test/NightlyRun/test233.m M /issm/trunk-jpl/test/NightlyRun/test233.py M /issm/trunk-jpl/test/NightlyRun/test234.m M /issm/trunk-jpl/test/NightlyRun/test235.m M /issm/trunk-jpl/test/NightlyRun/test236.m M /issm/trunk-jpl/test/NightlyRun/test236.py M /issm/trunk-jpl/test/NightlyRun/test237.m M /issm/trunk-jpl/test/NightlyRun/test237.py M /issm/trunk-jpl/test/NightlyRun/test238.m M /issm/trunk-jpl/test/NightlyRun/test238.py M /issm/trunk-jpl/test/NightlyRun/test239.m M /issm/trunk-jpl/test/NightlyRun/test239.py M /issm/trunk-jpl/test/NightlyRun/test270.m M /issm/trunk-jpl/test/NightlyRun/test270.py M /issm/trunk-jpl/test/NightlyRun/test271.m M /issm/trunk-jpl/test/NightlyRun/test271.py M /issm/trunk-jpl/test/NightlyRun/test272.m M /issm/trunk-jpl/test/NightlyRun/test272.py M /issm/trunk-jpl/test/NightlyRun/test274.m M /issm/trunk-jpl/test/NightlyRun/test274.py M /issm/trunk-jpl/test/NightlyRun/test275.m M /issm/trunk-jpl/test/NightlyRun/test275.py M /issm/trunk-jpl/test/NightlyRun/test280.m M /issm/trunk-jpl/test/NightlyRun/test280.py M /issm/trunk-jpl/test/NightlyRun/test285.m M /issm/trunk-jpl/test/NightlyRun/test285.py M /issm/trunk-jpl/test/NightlyRun/test290.m M /issm/trunk-jpl/test/NightlyRun/test290.py M /issm/trunk-jpl/test/NightlyRun/test291.m M /issm/trunk-jpl/test/NightlyRun/test291.py M /issm/trunk-jpl/test/NightlyRun/test292.m M /issm/trunk-jpl/test/NightlyRun/test292.py M /issm/trunk-jpl/test/NightlyRun/test3001.m M /issm/trunk-jpl/test/NightlyRun/test3001.py M /issm/trunk-jpl/test/NightlyRun/test3002.m M /issm/trunk-jpl/test/NightlyRun/test3002.py M /issm/trunk-jpl/test/NightlyRun/test3003.m M /issm/trunk-jpl/test/NightlyRun/test3003.py M /issm/trunk-jpl/test/NightlyRun/test3004.m M /issm/trunk-jpl/test/NightlyRun/test3004.py M /issm/trunk-jpl/test/NightlyRun/test3005.m M /issm/trunk-jpl/test/NightlyRun/test3005.py M /issm/trunk-jpl/test/NightlyRun/test3006.m M /issm/trunk-jpl/test/NightlyRun/test3006.py M /issm/trunk-jpl/test/NightlyRun/test3007.m M /issm/trunk-jpl/test/NightlyRun/test3007.py M /issm/trunk-jpl/test/NightlyRun/test3008.m M /issm/trunk-jpl/test/NightlyRun/test3008.py M /issm/trunk-jpl/test/NightlyRun/test3009.m M /issm/trunk-jpl/test/NightlyRun/test3009.py M /issm/trunk-jpl/test/NightlyRun/test301.m M /issm/trunk-jpl/test/NightlyRun/test301.py M /issm/trunk-jpl/test/NightlyRun/test3010.m M /issm/trunk-jpl/test/NightlyRun/test3010.py M /issm/trunk-jpl/test/NightlyRun/test3015.m M /issm/trunk-jpl/test/NightlyRun/test3015.py M /issm/trunk-jpl/test/NightlyRun/test3019.m M /issm/trunk-jpl/test/NightlyRun/test3019.py M /issm/trunk-jpl/test/NightlyRun/test302.m M /issm/trunk-jpl/test/NightlyRun/test302.py M /issm/trunk-jpl/test/NightlyRun/test3020.m M /issm/trunk-jpl/test/NightlyRun/test3020.py M /issm/trunk-jpl/test/NightlyRun/test303.m M /issm/trunk-jpl/test/NightlyRun/test303.py M /issm/trunk-jpl/test/NightlyRun/test304.m M /issm/trunk-jpl/test/NightlyRun/test304.py M /issm/trunk-jpl/test/NightlyRun/test305.m M /issm/trunk-jpl/test/NightlyRun/test305.py M /issm/trunk-jpl/test/NightlyRun/test306.m M /issm/trunk-jpl/test/NightlyRun/test306.py M /issm/trunk-jpl/test/NightlyRun/test307.m M /issm/trunk-jpl/test/NightlyRun/test307.py M /issm/trunk-jpl/test/NightlyRun/test308.m M /issm/trunk-jpl/test/NightlyRun/test308.py M /issm/trunk-jpl/test/NightlyRun/test309.m M /issm/trunk-jpl/test/NightlyRun/test309.py M /issm/trunk-jpl/test/NightlyRun/test3101.m M /issm/trunk-jpl/test/NightlyRun/test3101.py M /issm/trunk-jpl/test/NightlyRun/test3102.m M /issm/trunk-jpl/test/NightlyRun/test3102.py M /issm/trunk-jpl/test/NightlyRun/test3103.m M /issm/trunk-jpl/test/NightlyRun/test3103.py M /issm/trunk-jpl/test/NightlyRun/test3104.m M /issm/trunk-jpl/test/NightlyRun/test3104.py M /issm/trunk-jpl/test/NightlyRun/test3105.m M /issm/trunk-jpl/test/NightlyRun/test3105.py M /issm/trunk-jpl/test/NightlyRun/test3106.m M /issm/trunk-jpl/test/NightlyRun/test3106.py M /issm/trunk-jpl/test/NightlyRun/test3107.m M /issm/trunk-jpl/test/NightlyRun/test3107.py M /issm/trunk-jpl/test/NightlyRun/test3108.m M /issm/trunk-jpl/test/NightlyRun/test3108.py M /issm/trunk-jpl/test/NightlyRun/test3109.m M /issm/trunk-jpl/test/NightlyRun/test3109.py M /issm/trunk-jpl/test/NightlyRun/test311.m M /issm/trunk-jpl/test/NightlyRun/test311.py M /issm/trunk-jpl/test/NightlyRun/test3110.m M /issm/trunk-jpl/test/NightlyRun/test3110.py M /issm/trunk-jpl/test/NightlyRun/test312.m M /issm/trunk-jpl/test/NightlyRun/test312.py M /issm/trunk-jpl/test/NightlyRun/test313.m M /issm/trunk-jpl/test/NightlyRun/test313.py M /issm/trunk-jpl/test/NightlyRun/test314.m M /issm/trunk-jpl/test/NightlyRun/test314.py M /issm/trunk-jpl/test/NightlyRun/test315.m M /issm/trunk-jpl/test/NightlyRun/test315.py M /issm/trunk-jpl/test/NightlyRun/test316.m M /issm/trunk-jpl/test/NightlyRun/test316.py M /issm/trunk-jpl/test/NightlyRun/test317.m M /issm/trunk-jpl/test/NightlyRun/test317.py M /issm/trunk-jpl/test/NightlyRun/test318.m M /issm/trunk-jpl/test/NightlyRun/test318.py M /issm/trunk-jpl/test/NightlyRun/test319.m M /issm/trunk-jpl/test/NightlyRun/test319.py M /issm/trunk-jpl/test/NightlyRun/test320.m M /issm/trunk-jpl/test/NightlyRun/test320.py M /issm/trunk-jpl/test/NightlyRun/test321.m M /issm/trunk-jpl/test/NightlyRun/test321.py M /issm/trunk-jpl/test/NightlyRun/test322.m M /issm/trunk-jpl/test/NightlyRun/test322.py M /issm/trunk-jpl/test/NightlyRun/test323.m M /issm/trunk-jpl/test/NightlyRun/test323.py M /issm/trunk-jpl/test/NightlyRun/test324.m M /issm/trunk-jpl/test/NightlyRun/test324.py M /issm/trunk-jpl/test/NightlyRun/test325.m M /issm/trunk-jpl/test/NightlyRun/test325.py M /issm/trunk-jpl/test/NightlyRun/test326.m M /issm/trunk-jpl/test/NightlyRun/test326.py M /issm/trunk-jpl/test/NightlyRun/test327.m M /issm/trunk-jpl/test/NightlyRun/test327.py M /issm/trunk-jpl/test/NightlyRun/test328.m M /issm/trunk-jpl/test/NightlyRun/test328.py M /issm/trunk-jpl/test/NightlyRun/test329.m M /issm/trunk-jpl/test/NightlyRun/test329.py M /issm/trunk-jpl/test/NightlyRun/test332.m M /issm/trunk-jpl/test/NightlyRun/test332.py M /issm/trunk-jpl/test/NightlyRun/test333.m M /issm/trunk-jpl/test/NightlyRun/test333.py M /issm/trunk-jpl/test/NightlyRun/test334.m M /issm/trunk-jpl/test/NightlyRun/test335.m M /issm/trunk-jpl/test/NightlyRun/test336.m M /issm/trunk-jpl/test/NightlyRun/test336.py M /issm/trunk-jpl/test/NightlyRun/test337.m M /issm/trunk-jpl/test/NightlyRun/test337.py M /issm/trunk-jpl/test/NightlyRun/test338.m M /issm/trunk-jpl/test/NightlyRun/test338.py M /issm/trunk-jpl/test/NightlyRun/test339.m M /issm/trunk-jpl/test/NightlyRun/test339.py M /issm/trunk-jpl/test/NightlyRun/test340.m M /issm/trunk-jpl/test/NightlyRun/test341.m M /issm/trunk-jpl/test/NightlyRun/test4001.m M /issm/trunk-jpl/test/NightlyRun/test401.m M /issm/trunk-jpl/test/NightlyRun/test401.py M /issm/trunk-jpl/test/NightlyRun/test402.m M /issm/trunk-jpl/test/NightlyRun/test402.py M /issm/trunk-jpl/test/NightlyRun/test403.m M /issm/trunk-jpl/test/NightlyRun/test403.py M /issm/trunk-jpl/test/NightlyRun/test404.m M /issm/trunk-jpl/test/NightlyRun/test404.py M /issm/trunk-jpl/test/NightlyRun/test405.m M /issm/trunk-jpl/test/NightlyRun/test405.py M /issm/trunk-jpl/test/NightlyRun/test406.m M /issm/trunk-jpl/test/NightlyRun/test406.py M /issm/trunk-jpl/test/NightlyRun/test407.m M /issm/trunk-jpl/test/NightlyRun/test407.py M /issm/trunk-jpl/test/NightlyRun/test408.m M /issm/trunk-jpl/test/NightlyRun/test408.py M /issm/trunk-jpl/test/NightlyRun/test409.m M /issm/trunk-jpl/test/NightlyRun/test409.py M /issm/trunk-jpl/test/NightlyRun/test410.m M /issm/trunk-jpl/test/NightlyRun/test410.py M /issm/trunk-jpl/test/NightlyRun/test411.m M /issm/trunk-jpl/test/NightlyRun/test411.py M /issm/trunk-jpl/test/NightlyRun/test412.m M /issm/trunk-jpl/test/NightlyRun/test413.m M /issm/trunk-jpl/test/NightlyRun/test414.m M /issm/trunk-jpl/test/NightlyRun/test415.m M /issm/trunk-jpl/test/NightlyRun/test415.py M /issm/trunk-jpl/test/NightlyRun/test416.m M /issm/trunk-jpl/test/NightlyRun/test416.py M /issm/trunk-jpl/test/NightlyRun/test417.m M /issm/trunk-jpl/test/NightlyRun/test418.m M /issm/trunk-jpl/test/NightlyRun/test419.m M /issm/trunk-jpl/test/NightlyRun/test419.py M /issm/trunk-jpl/test/NightlyRun/test420.m M /issm/trunk-jpl/test/NightlyRun/test421.m M /issm/trunk-jpl/test/NightlyRun/test421.py M /issm/trunk-jpl/test/NightlyRun/test422.m M /issm/trunk-jpl/test/NightlyRun/test422.py M /issm/trunk-jpl/test/NightlyRun/test423.m M /issm/trunk-jpl/test/NightlyRun/test423.py M /issm/trunk-jpl/test/NightlyRun/test424.m M /issm/trunk-jpl/test/NightlyRun/test424.py M /issm/trunk-jpl/test/NightlyRun/test425.m M /issm/trunk-jpl/test/NightlyRun/test425.py M /issm/trunk-jpl/test/NightlyRun/test426.m M /issm/trunk-jpl/test/NightlyRun/test426.py M /issm/trunk-jpl/test/NightlyRun/test427.m M /issm/trunk-jpl/test/NightlyRun/test427.py M /issm/trunk-jpl/test/NightlyRun/test428.m M /issm/trunk-jpl/test/NightlyRun/test428.py M /issm/trunk-jpl/test/NightlyRun/test429.m M /issm/trunk-jpl/test/NightlyRun/test429.py M /issm/trunk-jpl/test/NightlyRun/test431.m M /issm/trunk-jpl/test/NightlyRun/test431.py M /issm/trunk-jpl/test/NightlyRun/test432.m M /issm/trunk-jpl/test/NightlyRun/test432.py M /issm/trunk-jpl/test/NightlyRun/test433.m M /issm/trunk-jpl/test/NightlyRun/test433.py M /issm/trunk-jpl/test/NightlyRun/test434.m M /issm/trunk-jpl/test/NightlyRun/test434.py M /issm/trunk-jpl/test/NightlyRun/test435.m M /issm/trunk-jpl/test/NightlyRun/test436.m M /issm/trunk-jpl/test/NightlyRun/test437.m M /issm/trunk-jpl/test/NightlyRun/test450.m M /issm/trunk-jpl/test/NightlyRun/test450.py M /issm/trunk-jpl/test/NightlyRun/test455.m M /issm/trunk-jpl/test/NightlyRun/test455.py M /issm/trunk-jpl/test/NightlyRun/test501.m M /issm/trunk-jpl/test/NightlyRun/test501.py M /issm/trunk-jpl/test/NightlyRun/test502.m M /issm/trunk-jpl/test/NightlyRun/test502.py M /issm/trunk-jpl/test/NightlyRun/test503.m M /issm/trunk-jpl/test/NightlyRun/test503.py M /issm/trunk-jpl/test/NightlyRun/test504.m M /issm/trunk-jpl/test/NightlyRun/test504.py M /issm/trunk-jpl/test/NightlyRun/test505.m M /issm/trunk-jpl/test/NightlyRun/test505.py M /issm/trunk-jpl/test/NightlyRun/test506.m M /issm/trunk-jpl/test/NightlyRun/test506.py M /issm/trunk-jpl/test/NightlyRun/test507.m M /issm/trunk-jpl/test/NightlyRun/test507.py M /issm/trunk-jpl/test/NightlyRun/test508.m M /issm/trunk-jpl/test/NightlyRun/test508.py M /issm/trunk-jpl/test/NightlyRun/test509.m M /issm/trunk-jpl/test/NightlyRun/test509.py M /issm/trunk-jpl/test/NightlyRun/test510.m M /issm/trunk-jpl/test/NightlyRun/test510.py M /issm/trunk-jpl/test/NightlyRun/test511.m M /issm/trunk-jpl/test/NightlyRun/test511.py M /issm/trunk-jpl/test/NightlyRun/test512.m M /issm/trunk-jpl/test/NightlyRun/test512.py M /issm/trunk-jpl/test/NightlyRun/test513.m M /issm/trunk-jpl/test/NightlyRun/test513.py M /issm/trunk-jpl/test/NightlyRun/test514.m M /issm/trunk-jpl/test/NightlyRun/test514.py M /issm/trunk-jpl/test/NightlyRun/test515.m M /issm/trunk-jpl/test/NightlyRun/test515.py M /issm/trunk-jpl/test/NightlyRun/test516.m M /issm/trunk-jpl/test/NightlyRun/test516.py M /issm/trunk-jpl/test/NightlyRun/test530.m M /issm/trunk-jpl/test/NightlyRun/test530.py M /issm/trunk-jpl/test/NightlyRun/test531.m M /issm/trunk-jpl/test/NightlyRun/test531.py M /issm/trunk-jpl/test/NightlyRun/test601.m M /issm/trunk-jpl/test/NightlyRun/test601.py M /issm/trunk-jpl/test/NightlyRun/test602.m M /issm/trunk-jpl/test/NightlyRun/test602.py M /issm/trunk-jpl/test/NightlyRun/test603.m M /issm/trunk-jpl/test/NightlyRun/test603.py M /issm/trunk-jpl/test/NightlyRun/test604.m M /issm/trunk-jpl/test/NightlyRun/test604.py M /issm/trunk-jpl/test/NightlyRun/test605.m M /issm/trunk-jpl/test/NightlyRun/test605.py M /issm/trunk-jpl/test/NightlyRun/test606.m M /issm/trunk-jpl/test/NightlyRun/test606.py M /issm/trunk-jpl/test/NightlyRun/test607.m M /issm/trunk-jpl/test/NightlyRun/test607.py M /issm/trunk-jpl/test/NightlyRun/test608.m M /issm/trunk-jpl/test/NightlyRun/test608.py D /issm/trunk-jpl/test/NightlyRun/test609.m D /issm/trunk-jpl/test/NightlyRun/test609.py D /issm/trunk-jpl/test/NightlyRun/test610.m D /issm/trunk-jpl/test/NightlyRun/test610.py M /issm/trunk-jpl/test/NightlyRun/test611.m M /issm/trunk-jpl/test/NightlyRun/test611.py M /issm/trunk-jpl/test/NightlyRun/test613.m M /issm/trunk-jpl/test/NightlyRun/test613.py M /issm/trunk-jpl/test/NightlyRun/test701.m M /issm/trunk-jpl/test/NightlyRun/test702.m M /issm/trunk-jpl/test/NightlyRun/test703.m M /issm/trunk-jpl/test/NightlyRun/test801.m M /issm/trunk-jpl/test/NightlyRun/test801.py M /issm/trunk-jpl/test/NightlyRun/test802.m M /issm/trunk-jpl/test/NightlyRun/test802.py M /issm/trunk-jpl/test/NightlyRun/test803.m M /issm/trunk-jpl/test/NightlyRun/test803.py M /issm/trunk-jpl/test/NightlyRun/test804.m M /issm/trunk-jpl/test/NightlyRun/test804.py M /issm/trunk-jpl/test/NightlyRun/test805.m M /issm/trunk-jpl/test/NightlyRun/test805.py M /issm/trunk-jpl/test/NightlyRun/test806.m M /issm/trunk-jpl/test/NightlyRun/test806.py M /issm/trunk-jpl/test/NightlyRun/test807.m M /issm/trunk-jpl/test/NightlyRun/test807.py\\
+Export determination: 6. \\
+Rationale: NEW: test name is now included in the file itself so that people don't forget to include it\\
+\vspace{3em}
+
+\noindent \textbf{Change \#743} with diff file ISSM-19050-19051.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/model.m\\
+Export determination: 6. \\
+Rationale: CHG: fixed extrusion of some fields\\
+\vspace{3em}
+
+\noindent \textbf{Change \#744} with diff file ISSM-19051-19052.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test310.m M /issm/trunk-jpl/test/NightlyRun/test310.py M /issm/trunk-jpl/test/NightlyRun/test320.m M /issm/trunk-jpl/test/NightlyRun/test320.py M /issm/trunk-jpl/test/NightlyRun/test438.m M /issm/trunk-jpl/test/NightlyRun/test439.m\\
+Export determination: 6. \\
+Rationale: BUG: fixed test names\\
+\vspace{3em}
+
+\noindent \textbf{Change \#745} with diff file ISSM-19052-19053.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/runme.m M /issm/trunk-jpl/test/NightlyRun/runme.py\\
+Export determination: 6. \\
+Rationale: CHG: changed position of 'starting' and 'finished' so that it does not fail on IdToName error\\
+\vspace{3em}
+
+\noindent \textbf{Change \#746} with diff file ISSM-19053-19054.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/test320.m\\
+Export determination: 6. \\
+Rationale: CHG: minor\\
+\vspace{3em}
+
+\noindent \textbf{Change \#747} with diff file ISSM-19054-19055.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/wrappers/python/Makefile.am M /issm/trunk-jpl/src/wrappers/python/include/wrapper\_macros.h\\
+Export determination: 6. \\
+Rationale: BUG: need to comment out AUTOMAKE\_OPTIONS = subdir-objects otherwise there is a mix up with the mex modules on murdo\\
+\vspace{3em}
+
+\noindent \textbf{Change \#748} with diff file ISSM-19055-19056.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/contrib/netCDF/export\_netCDF.m M /issm/trunk-jpl/src/m/contrib/netCDF/export\_netCDF.py\\
+Export determination: 6. \\
+Rationale: NEW: adding netcdf export for matlab and minor change in python\\
+\vspace{3em}
+
+\noindent \textbf{Change \#749} with diff file ISSM-19056-19057.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/export\_gl.py M /issm/trunk-jpl/src/m/plot/writejsfield.py M /issm/trunk-jpl/src/m/plot/writejsfile.py\\
+Export determination: 6. \\
+Rationale: CHG: Finalizing server display database creation scripts\\
+\vspace{3em}
+
+\noindent \textbf{Change \#750} with diff file ISSM-19057-19058.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixing things in colapse routines\\
+\vspace{3em}
+
+\noindent \textbf{Change \#751} with diff file ISSM-19058-19059.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/petsc/install-3.5-greenplanet.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-hpc.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-linux64-static.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-linux64.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-macosx64-static.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-macosx64.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-pleiades.sh M /issm/trunk-jpl/externalpackages/petsc/install-3.5-win7.sh\\
+Export determination: 6. \\
+Rationale: CHG: switching to PETSc 3.5.3\\
+\vspace{3em}
+
+\noindent \textbf{Change \#752} with diff file ISSM-19059-19060.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/shared/Enum/Synchronize.sh\\
+Export determination: 6. \\
+Rationale: CHG: missing space before capability\\
+\vspace{3em}
+
+\noindent \textbf{Change \#753} with diff file ISSM-19060-19061.diff: \\
+Function name: \\
+A /issm/trunk-jpl/externalpackages/distribute/README\\
+Export determination: 6. \\
+Rationale: CHG: new distribute policy.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#754} with diff file ISSM-19061-19062.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Element.h M /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp M /issm/trunk-jpl/src/c/classes/Elements/Penta.h M /issm/trunk-jpl/src/c/classes/Elements/Seg.h M /issm/trunk-jpl/src/c/classes/Elements/Tetra.h M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/Elements/Tria.h\\
+Export determination: 6. \\
+Rationale: CHG: added IceMass computation.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#755} with diff file ISSM-19062-19063.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/classes/FemModel.h\\
+Export determination: 6. \\
+Rationale: CHG: added IceMass computation.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#756} with diff file ISSM-19063-19064.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Misfit.h\\
+Export determination: 6. \\
+Rationale: CHG: added new capability to compute misfit when we are dealing with a global observation, such as Ice Volume or Mass.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#757} with diff file ISSM-19064-19065.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/plot\_rifts.m\\
+Export determination: 6. \\
+Rationale: CHG: added planet option (reinstated)\\
+\vspace{3em}
+
+\noindent \textbf{Change \#758} with diff file ISSM-19065-19066.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py A /issm/trunk-jpl/src/m/enum/IceMassEnum.m A /issm/trunk-jpl/src/m/enum/MisfitLocalEnum.m\\
+Export determination: 6. \\
+Rationale: CHG: new enums for the misfit class and for the computation of ice mass.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#759} with diff file ISSM-19066-19067.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp\\
+Export determination: 6. \\
+Rationale: CHG: new enums for ice mass computation and misfit object.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#760} with diff file ISSM-19067-19068.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/misfit.m\\
+Export determination: 6. \\
+Rationale: CHG: added local field, to control computation of global or local (i.e. element wise) metrics.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#761} with diff file ISSM-19068-19069.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/independent.m\\
+Export determination: 6. \\
+Rationale: CHG: missing nods field in display method.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#762} with diff file ISSM-19069-19070.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/flowequation.m\\
+Export determination: 6. \\
+Rationale: CHG: adding mesh3dsurface embryo of capability\\
+\vspace{3em}
+
+\noindent \textbf{Change \#763} with diff file ISSM-19070-19071.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/m1qn3inversion.m\\
+Export determination: 6. \\
+Rationale: CHG: switching order of methods\\
+\vspace{3em}
+
+\noindent \textbf{Change \#764} with diff file ISSM-19071-19072.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/masscon.m M /issm/trunk-jpl/src/m/classes/massconaxpby.m\\
+Export determination: 6. \\
+Rationale: CHG: better way of consistency checking for range of definition enum\\
+\vspace{3em}
+
+\noindent \textbf{Change \#765} with diff file ISSM-19072-19073.diff: \\
+Function name: \\
+M /issm/trunk-jpl/externalpackages/numpy\\
+Export determination: 6. \\
+Rationale: CHG: get svn to ignore some files.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#766} with diff file ISSM-19073-19074.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp\\
+Export determination: 6. \\
+Rationale: CHG: adding local to Misfit object.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#767} with diff file ISSM-19074-19075.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/processmesh.m\\
+Export determination: 6. \\
+Rationale: CHG: added case of 3Dsurface\\
+\vspace{3em}
+
+\noindent \textbf{Change \#768} with diff file ISSM-19075-19076.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/applyoptions.m\\
+Export determination: 6. \\
+Rationale: CHG: added case of 3Dsurface\\
+\vspace{3em}
+
+\noindent \textbf{Change \#769} with diff file ISSM-19076-19077.diff: \\
+Function name: \\
+A /issm/trunk-jpl/src/m/classes/mesh3dsurface.m\\
+Export determination: 6. \\
+Rationale: CHG: new class for planet meshes\\
+\vspace{3em}
+
+\noindent \textbf{Change \#770} with diff file ISSM-19077-19078.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/mesh/bamg.m\\
+Export determination: 6. \\
+Rationale: CHG: added case for 3D surface mesh.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#771} with diff file ISSM-19078-19079.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/hack/resultstomatrix.m\\
+Export determination: 6. \\
+Rationale: CHG: minor simplification.\\
+\vspace{3em}
+
+\noindent \textbf{Change \#772} with diff file ISSM-19079-19080.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/hack/resultstomatrix.m\\
+Export determination: 6. \\
+Rationale: CHG: fixed bug\\
+\vspace{3em}
+
+\noindent \textbf{Change \#773} with diff file ISSM-19080-19081.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/netCDF/export\_netCDF.m M /issm/trunk-jpl/src/m/contrib/netCDF/export\_netCDF.py\\
+Export determination: 6. \\
+Rationale: NEW: finishing export\_netCDF in m\\
+\vspace{3em}
+
+\noindent \textbf{Change \#774} with diff file ISSM-19081-19082.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/clusters/generic.m\\
+Export determination: 6. \\
+Rationale: CHG: change / to if ispc\\
+\vspace{3em}
+
+\noindent \textbf{Change \#775} with diff file ISSM-19082-19083.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: CHG:change to flip lock and colapsing relation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#776} with diff file ISSM-19083-19084.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/plot\_tensor\_principalaxis.m\\
+Export determination: 6. \\
+Rationale: CHG: no more md.mesh.z in 2d\\
+\vspace{3em}
+
+\noindent \textbf{Change \#777} with diff file ISSM-19084-19085.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/processdata.m\\
+Export determination: 6. \\
+Rationale: NEW: added mask for quiver\\
+\vspace{3em}
+
+\noindent \textbf{Change \#778} with diff file ISSM-19085-19086.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp\\
+Export determination: 6. \\
+Rationale: CHG: better calving law\\
+\vspace{3em}
+
+\noindent \textbf{Change \#779} with diff file ISSM-19086-19087.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/plot/manualcb.m\\
+Export determination: 6. \\
+Rationale: CHG: added titlefontsize for colorbar\\
+\vspace{3em}
+
+\noindent \textbf{Change \#780} with diff file ISSM-19087-19088.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/Makefile.am M /issm/trunk-jpl/src/c/analyses/EnumToAnalysis.cpp D /issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp D /issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.h M /issm/trunk-jpl/src/c/analyses/analyses.h M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp D /issm/trunk-jpl/src/c/classes/Materials/Matseaice.cpp D /issm/trunk-jpl/src/c/classes/Materials/Matseaice.h M /issm/trunk-jpl/src/c/classes/classes.h M /issm/trunk-jpl/src/c/cores/CorePointerFromSolutionEnum.cpp M /issm/trunk-jpl/src/c/cores/cores.h D /issm/trunk-jpl/src/c/cores/seaice\_core.cpp M /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp M /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp M /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h M /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp M /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp D /issm/trunk-jpl/src/m/classes/matseaice.m M /issm/trunk-jpl/src/m/classes/model.m D /issm/trunk-jpl/src/m/classes/seaice.m D /issm/trunk-jpl/src/m/classes/seaiceatm.m D /issm/trunk-jpl/src/m/classes/seaiceinitialization.m D /issm/trunk-jpl/src/m/classes/seaiceocean.m D /issm/trunk-jpl/src/m/enum/BasalforcingsOceanCoefEnum.m D /issm/trunk-jpl/src/m/enum/BasalforcingsOceanLinDragCoefEnum.m D /issm/trunk-jpl/src/m/enum/BasalforcingsOceanQuadDragCoefEnum.m D /issm/trunk-jpl/src/m/enum/BasalforcingsOceanSshEnum.m D /issm/trunk-jpl/src/m/enum/BasalforcingsOceanTurningAngleEnum.m D /issm/trunk-jpl/src/m/enum/BasalforcingsOceanVxEnum.m D /issm/trunk-jpl/src/m/enum/BasalforcingsOceanVyEnum.m D /issm/trunk-jpl/src/m/enum/BasalforcingsRhoOceanEnum.m M /issm/trunk-jpl/src/m/enum/EnumDefinitions.py D /issm/trunk-jpl/src/m/enum/MaterialsCohesionEnum.m D /issm/trunk-jpl/src/m/enum/MaterialsCompressionCoefEnum.m D /issm/trunk-jpl/src/m/enum/MaterialsInternalFrictionCoefEnum.m D /issm/trunk-jpl/src/m/enum/MaterialsPoissonEnum.m D /issm/trunk-jpl/src/m/enum/MaterialsRidgingExponentEnum.m D /issm/trunk-jpl/src/m/enum/MaterialsTimeRelaxationDamageEnum.m D /issm/trunk-jpl/src/m/enum/MaterialsTimeRelaxationStressEnum.m D /issm/trunk-jpl/src/m/enum/MaterialsTractionCoefEnum.m D /issm/trunk-jpl/src/m/enum/MaterialsYoungModulusEnum.m D /issm/trunk-jpl/src/m/enum/MatseaiceEnum.m D /issm/trunk-jpl/src/m/enum/SeaiceAnalysisEnum.m D /issm/trunk-jpl/src/m/enum/SeaiceConcentrationEnum.m D /issm/trunk-jpl/src/m/enum/SeaiceCoriolisFactorEnum.m D /issm/trunk-jpl/src/m/enum/SeaiceMaxThicknessEnum.m D /issm/trunk-jpl/src/m/enum/SeaiceMinConcentrationEnum.m D /issm/trunk-jpl/src/m/enum/SeaiceMinThicknessEnum.m D /issm/trunk-jpl/src/m/enum/SeaiceSolutionEnum.m D /issm/trunk-jpl/src/m/enum/SeaiceSpcvxEnum.m D /issm/trunk-jpl/src/m/enum/SeaiceSpcvyEnum.m D /issm/trunk-jpl/src/m/enum/SeaiceThicknessEnum.m D /issm/trunk-jpl/src/m/enum/SeaiceatmEnum.m D /issm/trunk-jpl/src/m/enum/SeaiceoceanEnum.m D /issm/trunk-jpl/src/m/enum/StressTensorPredictorxxEnum.m D /issm/trunk-jpl/src/m/enum/StressTensorPredictorxyEnum.m D /issm/trunk-jpl/src/m/enum/StressTensorPredictoryyEnum.m D /issm/trunk-jpl/src/m/enum/SurfaceforcingsAirCoefEnum.m D /issm/trunk-jpl/src/m/enum/SurfaceforcingsAirLinDragCoefEnum.m D /issm/trunk-jpl/src/m/enum/SurfaceforcingsAirQuadDragCoefEnum.m D /issm/trunk-jpl/src/m/enum/SurfaceforcingsRhoAirEnum.m D /issm/trunk-jpl/src/m/enum/SurfaceforcingsWindVxEnum.m D /issm/trunk-jpl/src/m/enum/SurfaceforcingsWindVyEnum.m D /issm/trunk-jpl/src/m/enum/VxStarEnum.m D /issm/trunk-jpl/src/m/enum/VyStarEnum.m\\
+Export determination: 6. \\
+Rationale: DEL: removed all seaice components of issm\\
+\vspace{3em}
+
+\noindent \textbf{Change \#781} with diff file ISSM-19088-19089.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/IdToName.m\\
+Export determination: 6. \\
+Rationale: CHG: IdToName(0) returns the list of test names\\
+\vspace{3em}
+
+\noindent \textbf{Change \#782} with diff file ISSM-19089-19090.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/IdToName.m\\
+Export determination: 6. \\
+Rationale: CHG: IdToName() returns the list of test names\\
+\vspace{3em}
+
+\noindent \textbf{Change \#783} with diff file ISSM-19090-19091.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/classes/geometry.m M /issm/trunk-jpl/src/m/classes/mask.m M /issm/trunk-jpl/src/m/classes/stressbalance.m M /issm/trunk-jpl/src/m/consistency/ismodelselfconsistent.m\\
+Export determination: 6. \\
+Rationale: BUG: removed some remaining seaice stuff\\
+\vspace{3em}
+
+\noindent \textbf{Change \#784} with diff file ISSM-19091-19092.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_hydro\_nonlinear.cpp\\
+Export determination: 6. \\
+Rationale: CHG: changes in how we deal with the zigzag counter on the EPL\\
+\vspace{3em}
+
+\noindent \textbf{Change \#785} with diff file ISSM-19092-19093.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG:cleaning a print\\
+\vspace{3em}
+
+\noindent \textbf{Change \#786} with diff file ISSM-19093-19094.diff: \\
+Function name: \\
+M /issm/trunk-jpl/test/NightlyRun/IdFromString.m\\
+Export determination: 6. \\
+Rationale: CHG: testing new IdFromString\\
+\vspace{3em}
+
+\noindent \textbf{Change \#787} with diff file ISSM-19094-19095.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp M /issm/trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.cpp M /issm/trunk-jpl/src/c/classes/Elements/Element.h M /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp M /issm/trunk-jpl/src/c/classes/FemModel.cpp M /issm/trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp M /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_la.cpp M /issm/trunk-jpl/src/c/solutionsequences/solutionsequence\_la\_theta.cpp\\
+Export determination: 6. \\
+Rationale: CHG: Adding node capbility for inputupdatefromvector and changes in the zigzag counter in epl\\
+\vspace{3em}
+
+\noindent \textbf{Change \#788} with diff file ISSM-19095-19096.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp M /issm/trunk-jpl/src/c/classes/FemModel.cpp\\
+Export determination: 6. \\
+Rationale: BUG:fixing memory leaks\\
+\vspace{3em}
+
+\noindent \textbf{Change \#789} with diff file ISSM-19096-19097.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/netCDF/export\_netCDF.m M /issm/trunk-jpl/src/m/contrib/netCDF/export\_netCDF.py A /issm/trunk-jpl/src/m/contrib/netCDF/read\_netCDF.m\\
+Export determination: 6. \\
+Rationale: NEW; matlab->netcdf->matlab ability is OK\\
+\vspace{3em}
+
+\noindent \textbf{Change \#790} with diff file ISSM-19097-19098.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/m/contrib/netCDF/export\_netCDF.py\\
+Export determination: 6. \\
+Rationale: CHG: changing function organisation\\
+\vspace{3em}
+
+\noindent \textbf{Change \#791} with diff file ISSM-19098-19099.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed memory leak\\
+\vspace{3em}
+
+\noindent \textbf{Change \#792} with diff file ISSM-19099-19100.diff: \\
+Function name: \\
+M /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp\\
+Export determination: 6. \\
+Rationale: BUG: fixed memory leak\\
+\vspace{3em}
+
Index: /issm/oecreview/Archive/18296-19100/r1.tex
===================================================================
--- /issm/oecreview/Archive/18296-19100/r1.tex	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/r1.tex	(revision 19102)
@@ -0,0 +1,1 @@
+18296
Index: /issm/oecreview/Archive/18296-19100/r2.tex
===================================================================
--- /issm/oecreview/Archive/18296-19100/r2.tex	(revision 19102)
+++ /issm/oecreview/Archive/18296-19100/r2.tex	(revision 19102)
@@ -0,0 +1,1 @@
+19100
